Blog Listem

25 Haziran 2014 Çarşamba

AX 2012 - Form datasını yenilemek

Ç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.


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.

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) ));
...

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;
}

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.

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 

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)