Çağırdığınız bir alt rutin ekrandaki datayı yeniliyor. Formda data yenilenmiyor. Bunu çözmek için önce research, sonra refresh metodlarını çağırmanız en uygun yoldur. Research mevcut query filtrelerinizi bozmaz ve true parametresiyle çağırdığınızda önceki kayda konumlanır:
LedgerJournalTrans_DS.research(true);
LedgerJournalTrans_DS.refresh();
Çağırdığınız rutin bir SysOperation class rutiniyse ve ekran halen yenilenmiyorsa controller classda bunu yapmayı unutmayın:
controller.parmExecutionMode(SysOperationExecutionMode::Asynchronous);
Aksi takdirde classın işi bitmeden research ve refresh çalıştırmış ve dataları yenilememiş olursunuz.
Blog Listem
25 Haziran 2014 Çarşamba
24 Haziran 2014 Salı
AX 2012 - Default dimension
//http://axvuongbao.blogspot.com.tr/2013/08/how-to-create-default-dimension-from-x.html
public static DimensionDefault CreateDefaultDim(Container _a,Container _v)
{
DimensionAttributeValueSetStorage valueSetStorage = new DimensionAttributeValueSetStorage();
DimensionDefault result;
int i;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue dimensionAttributeValue;
//_attr is dimension name in table DimensionAttribute
container conAttr = _a;
container conValue = _v;
boolean _createIfNotFound = true;
str dimValue;
for (i = 1; i <= conLen(conAttr); i++)
{
dimensionAttribute = dimensionAttribute::findByName(conPeek(conAttr,i));
if (dimensionAttribute.RecId == 0)
{
continue;
}
dimValue = conPeek(conValue,i);
if (dimValue != "")
{
// _createIfNotFound is "true". A dimensionAttributeValue record will be created if not found.
dimensionAttributeValue=
dimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,dimValue,false,_createIfNotFound);
// Add the dimensionAttibuteValue to the default dimension
valueSetStorage.addItem(dimensionAttributeValue);
}
}
result = valueSetStorage.save();
return result;
}
Kullanımı:
LedgerJournalTrans.DefaultDimension = MyUtility::CreateDefaultDim("[Contract],[Project]","[0001],[MyBigProject]")
Eğer Unable to return DimensionAttributeValue record for ... gibi bir hata alırsanız sistemde kayıtlı olmayan bir dimension value değerine kombinasyon oluşturmaya çalışıyorsunuz demektir.
public static DimensionDefault CreateDefaultDim(Container _a,Container _v)
{
DimensionAttributeValueSetStorage valueSetStorage = new DimensionAttributeValueSetStorage();
DimensionDefault result;
int i;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue dimensionAttributeValue;
//_attr is dimension name in table DimensionAttribute
container conAttr = _a;
container conValue = _v;
boolean _createIfNotFound = true;
str dimValue;
for (i = 1; i <= conLen(conAttr); i++)
{
dimensionAttribute = dimensionAttribute::findByName(conPeek(conAttr,i));
if (dimensionAttribute.RecId == 0)
{
continue;
}
dimValue = conPeek(conValue,i);
if (dimValue != "")
{
// _createIfNotFound is "true". A dimensionAttributeValue record will be created if not found.
dimensionAttributeValue=
dimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,dimValue,false,_createIfNotFound);
// Add the dimensionAttibuteValue to the default dimension
valueSetStorage.addItem(dimensionAttributeValue);
}
}
result = valueSetStorage.save();
return result;
}
Kullanımı:
LedgerJournalTrans.DefaultDimension = MyUtility::CreateDefaultDim("[Contract],[Project]","[0001],[MyBigProject]")
Eğer Unable to return DimensionAttributeValue record for ... gibi bir hata alırsanız sistemde kayıtlı olmayan bir dimension value değerine kombinasyon oluşturmaya çalışıyorsunuz demektir.
20 Haziran 2014 Cuma
AX 2012 - Query strfmt ile tarih value değeri vermek
Query'de strfmt ile tarih value değeri vermek isterseniz Date2StrXpp fonksiyonunu kullanmalısınız:
...
QBR2.value(strFmt(' ( TransDate >= %1 )' , Date2StrXpp(TransDate) ));
...
...
QBR2.value(strFmt(' ( TransDate >= %1 )' , Date2StrXpp(TransDate) ));
...
17 Haziran 2014 Salı
AX 2012 RDP class parametreleri validate method, gruplama ve etiket ekleme
Class Declaration:
[
DataContractAttribute,
SysOperationGroupAttribute("DateGroup", "Tarih aralığı", "1", FormArrangeMethod::Vertical),
SysOperationGroupAttribute("Other", "Diğer filtreler", "1", FormArrangeMethod::Vertical)
]
class myContract implements SysOperationValidatable
{
...
}
Parm metod:
[DataMemberAttribute('StartDate'),
SysOperationGroupMemberAttribute("DateGroup"),
SysOperationDisplayOrderAttribute("1")]
public StartDate parmStartDate(StartDate _StartDate = startDate)
{
startDate = _StartDate;
return StartDate;
}
Validate metodu:
public boolean validate()
{
boolean isValid = true;
if ( !endDate || !StartDate)
isValid = checkfailed("İlk/Son tarih girmelisiniz!..");
return isValid;
}
[
DataContractAttribute,
SysOperationGroupAttribute("DateGroup", "Tarih aralığı", "1", FormArrangeMethod::Vertical),
SysOperationGroupAttribute("Other", "Diğer filtreler", "1", FormArrangeMethod::Vertical)
]
class myContract implements SysOperationValidatable
{
...
}
Parm metod:
[DataMemberAttribute('StartDate'),
SysOperationGroupMemberAttribute("DateGroup"),
SysOperationDisplayOrderAttribute("1")]
public StartDate parmStartDate(StartDate _StartDate = startDate)
{
startDate = _StartDate;
return StartDate;
}
Validate metodu:
public boolean validate()
{
boolean isValid = true;
if ( !endDate || !StartDate)
isValid = checkfailed("İlk/Son tarih girmelisiniz!..");
return isValid;
}
AX 2012 RDP ile SSRS oluştururken Query ekleme
Data provider class a aşağıdaki query attribute yi ekleyin:
[
SRSReportQueryAttribute (querystr(Cust)),
SRSReportParameterAttribute(classstr(myReportContract))
]
class myReportDP extends SRSReportDataProviderBase
{
...
}
Query'i böyle alın:
[SysEntryPointAttribute(false)]
public void processReport()
{
QueryRun qRun;
Query query;
...
query = this.parmQuery();
...
Eğer select query butonu görmek istiyorsanız SSRS rapor dizayn ekranında Dynamics Filter property değerini true yapmayı unutmayın.
[
SRSReportQueryAttribute (querystr(Cust)),
SRSReportParameterAttribute(classstr(myReportContract))
]
class myReportDP extends SRSReportDataProviderBase
{
...
}
Query'i böyle alın:
[SysEntryPointAttribute(false)]
public void processReport()
{
QueryRun qRun;
Query query;
...
query = this.parmQuery();
...
Eğer select query butonu görmek istiyorsanız SSRS rapor dizayn ekranında Dynamics Filter property değerini true yapmayı unutmayın.
AX - 2012 Sysoperation class örneği
Contract Class:
classDeclaration metodu:
[DataContractAttribute]
class myTestContract
{
TransDate transDate;
str packedQuery;
LedgerJournalId JournalId;
}
Diğer metodlar:
//------ Query almak için -------------
public Query getQuery()
{
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
//---------- bir parm metod örneği --------------
[DataMemberAttribute
, SysOperationControlVisibilityAttribute(false)]
public LedgerJournalId parmJournalId(LedgerJournalId _JournalId = JournalId)
{
JournalId = _JournalId;
return JournalId;
}
//--------------------- parmQuery ile bir query çağır ----------------
[DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', querystr(myQuery))
]
public str parmQuery(str _packedQuery = packedQuery)
{
packedQuery = _packedQuery;
return packedQuery;
}
//-------------- SetQuery ile query ver -----------------------
public void setQuery(Query _query)
{
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
DataService Class:
ClassDeclaration metodu:
class myDataService
{
}
Batch job metodu:
[SysEntryPointAttribute]
public void Go(myContract _contract)
{
QueryRun qRun;
Query query;
QueryBuildDataSource QBDS;
QueryBuildRange QBR,QBR2;
CustTable CustTable;
LedgerJournalId JournalId;
TransDate PaymDate;
LedgerJournalTrans journalTrans;
JournalId = _contract.parmJournalId();
query = _contract.getQuery();
QBDS = query.dataSourceTable(tablenum(CustTable));
QBR = QBDS.findRange(fieldnum(CustTable,CustAccount));
if (!QBR)
QBR = QBDS.addRange(fieldnum(CustTable,CustAccount));
QBR.value(queryValue("000001"));
qRun = new QueryRun(query);
while(qRun.next())
{
CustTable = qRun.get(tableNum(CustTable));
...
}
Controller Class:
class declaration:
class MyController extends SysOperationServiceController
{
}
public static MyController newFromArgs(Args _args)
{
MyController controller;
MyContract contract;
LedgerJournalTable LedgerJournalTable;
if ( !_args || !_args.caller() )
throw error("This class needs parameter!..");
ledgerJournalTable = _args.caller().ledgerJournalTable();
controller = new ETGVendAdvanceReqController();
controller.initializeFromArgs(_args);
contract = Controller.getDataContractObject("_contract");
contract.parmPaymDate(today());
contract.parmJournalId(ledgerJournalTable.JournalNum);
return Controller;
}
public static void main(Args _args)
{
MyController controller;
controller = MyController::newFromArgs(_args);
controller.parmExecutionMode(SysOperationExecutionMode::Asynchronous);
controller.startOperation();
}
Menu item parametreleri:
Object - MyController
ObjectType - class
Parameters - MyDataService.Go
classDeclaration metodu:
[DataContractAttribute]
class myTestContract
{
TransDate transDate;
str packedQuery;
LedgerJournalId JournalId;
}
Diğer metodlar:
//------ Query almak için -------------
public Query getQuery()
{
return new Query(SysOperationHelper::base64Decode(packedQuery));
}
//---------- bir parm metod örneği --------------
[DataMemberAttribute
, SysOperationControlVisibilityAttribute(false)]
public LedgerJournalId parmJournalId(LedgerJournalId _JournalId = JournalId)
{
JournalId = _JournalId;
return JournalId;
}
//--------------------- parmQuery ile bir query çağır ----------------
[DataMemberAttribute,
AifQueryTypeAttribute('_packedQuery', querystr(myQuery))
]
public str parmQuery(str _packedQuery = packedQuery)
{
packedQuery = _packedQuery;
return packedQuery;
}
//-------------- SetQuery ile query ver -----------------------
public void setQuery(Query _query)
{
packedQuery = SysOperationHelper::base64Encode(_query.pack());
}
DataService Class:
ClassDeclaration metodu:
class myDataService
{
}
Batch job metodu:
[SysEntryPointAttribute]
public void Go(myContract _contract)
{
QueryRun qRun;
Query query;
QueryBuildDataSource QBDS;
QueryBuildRange QBR,QBR2;
CustTable CustTable;
LedgerJournalId JournalId;
TransDate PaymDate;
LedgerJournalTrans journalTrans;
JournalId = _contract.parmJournalId();
query = _contract.getQuery();
QBDS = query.dataSourceTable(tablenum(CustTable));
QBR = QBDS.findRange(fieldnum(CustTable,CustAccount));
if (!QBR)
QBR = QBDS.addRange(fieldnum(CustTable,CustAccount));
QBR.value(queryValue("000001"));
qRun = new QueryRun(query);
while(qRun.next())
{
CustTable = qRun.get(tableNum(CustTable));
...
}
Controller Class:
class declaration:
class MyController extends SysOperationServiceController
{
}
public static MyController newFromArgs(Args _args)
{
MyController controller;
MyContract contract;
LedgerJournalTable LedgerJournalTable;
if ( !_args || !_args.caller() )
throw error("This class needs parameter!..");
ledgerJournalTable = _args.caller().ledgerJournalTable();
controller = new ETGVendAdvanceReqController();
controller.initializeFromArgs(_args);
contract = Controller.getDataContractObject("_contract");
contract.parmPaymDate(today());
contract.parmJournalId(ledgerJournalTable.JournalNum);
return Controller;
}
public static void main(Args _args)
{
MyController controller;
controller = MyController::newFromArgs(_args);
controller.parmExecutionMode(SysOperationExecutionMode::Asynchronous);
controller.startOperation();
}
Menu item parametreleri:
Object - MyController
ObjectType - class
Parameters - MyDataService.Go
AX 2012 - LedgerJournalTrans Tablosunda Tedarikçi/Müşteri Hesabı Nasıl Alınır, Yazılır?
Bu bilgi ledgerDimension alanında saklanıyor. Yazarken:
LedgerJournalTrans.LedgerDimension = DimensionStorage::getDynamicAccount(myVendAccount, LedgerJournalACType::Vend);
Okurken tablonun AccountDisplay veya accountNameFind metodlarına bakabilirsiniz veya:
DimensionStorage::ledgerDimension2AccountNum(ledgerJournalTrans.OffsetLedgerDimension)
DimensionStorage::ledgerDimension2AccountNum(ledgerJournalTrans.LedgerDimension)
CustTable::findByLedgerDimension(ledgerJournalTrans.LedgerDimension) VendTable::findByLedgerDimension(ledgerJournalTrans.LedgerDimension)
LedgerJournalTrans.LedgerDimension = DimensionStorage::getDynamicAccount(myVendAccount, LedgerJournalACType::Vend);
Okurken tablonun AccountDisplay veya accountNameFind metodlarına bakabilirsiniz veya:
DimensionStorage::ledgerDimension2AccountNum(ledgerJournalTrans.OffsetLedgerDimension)
DimensionStorage::ledgerDimension2AccountNum(ledgerJournalTrans.LedgerDimension)
CustTable::findByLedgerDimension(ledgerJournalTrans.LedgerDimension) VendTable::findByLedgerDimension(ledgerJournalTrans.LedgerDimension)
Kaydol:
Kayıtlar (Atom)