Tag Archive: Dynamics AX


Dokumen HelpMicrosoft Dynamics AX 2012 for Developer” dalam bentuk file .chm bisa di unduh di tautan berikut:

“Microsoft Dynamics AX 2012 for Developer” help file in compiled format (.chm) can be downloaded below:

Microsoft Dynamics AX 2012 for Developer.chm

Advertisements

Dynamics AX 2012 R2

Dyanmics AX 2012 R2 sudah di-release tanggal 1 Desember 2012. Info dapat di lihat di situs Partner Source. Atau dapat langsung di-dowload di sini.

 

Program di bawah merupakan contoh progress bar deng tipe multi bar. Tipe ini juga bisa digunakan untuk single bar dengan jumlah array 1. Dalam contoh, bar kedua menggunakan nilai dari bar pertama. Bar kedua dapat disesuaikan dengan kebutuhan misalnya detail/transaksi dari suatu tabel utama (CustInvoiceJour – CustInvoiceTrans).

Progress Bar

static void _atusProgressBar(Args _args)
{
    CustInvoiceJour         custInvoiceJour;
    Query                   q;
    QueryBuildDataSource    qbds;
    QueryRun                qr;
    SysOperationProgress    progressBar;
    int                     totalRow, counter;
    #aviFiles
    ;

    q = new Query();
    qbds = q.addDataSource(tablenum(CustInvoiceJour));

    qr = new QueryRun(q);

    totalRow = SysQuery::countTotal(qr);// Mengambil Total/Jumlah record dari query
    progressBar = SysOperationProgress::newMultiBar(2,#aviUpdate,"Progress");
    progressBar.setTotal(totalRow,1);
    progressBar.setTotal(totalRow,2);

    while(qr.next())
    {
        custInvoiceJour = qr.get(tablenum(CustInvoiceJour));
        counter++;

        progressBar.setCount(counter,1);
        progressBar.setText(strfmt("Record Processed 1: %1 - %2", counter, custInvoiceJour.InvoiceId),1);

        progressBar.setCount(counter,2);
        progressBar.setText(strfmt("Record Processed 2: %1 - %2", counter, custInvoiceJour.InvoiceId),2);
    }
    progressBar.kill();
}

Untuk memodifikasi atau membentuk range yang agak spesifik dibutuhkan syntax yang khusus. Di bawah merupakan salah satu contoh untuk memberikan filter antara dua field dalam satu tabel dimana salah satu data dalam field yang berbeda memenuhi syarat maka akan ditampilkan dalam dialog info.
Field apa saja dapat digunakan sebagai field range. Yang terpenting adalah ekspresi dari query range tersebut. Untuk membentuk suatu ekspresi harus memenuhi persyaratan:

  • Expresi harus dibuka dan ditutup dengan menggunakan single-quotes( ‘ ).
  • Semua ekspresi dan sub ekspresi harus dibuka dan ditutup dengan buka dan tutup kurung.
  • Kalau hanya menggunakan satu table, nama tabel tidak perlu di sebutkan, cukup dengan nama field.
  • Untuk tabel harus menggunakan nama datasource, bukan nama table.
  • Nilai String, bisa menggunakan string biasa dan diberi double-quotes (“), atau menggunakan queryValue().
  • Untuk nilai Base Enum, berikan nilai integernya dengan fungsi any2int() atau enum2int().
  • Untuk nilai tanggal harus menggunakan fungsi Date2StrXpp().
  • Gunakan valueEmptyString pada class SysQuery (SysQuery::valueEmptyString())
static void _atusExperiment(Args _args)
{
    CustInvoiceJour         custInvoiceJour;
    Query                   q;
    QueryBuildDataSource    qbds;
    QueryBuildRange         qRange;
    QueryRun                qr;
    TransDate               invDate, dueDate;
    str                     rangeValue;
    ;
    invDate = 011\2011;
    dueDate = 033\2011;

    q = new Query();
    qbds = q.addDataSource(tablenum(CustInvoiceJour));
    qRange = qbds.addRange(fieldnum(CustInvoiceJour, InvoiceId));

    rangeValue = '((%1.%2==%3) || (%1.%4==%5))';
    rangeValue = strfmt(rangeValue,
            qbds.name(),
            fieldstr(CustInvoiceJour, InvoiceDate) , Date2StrXpp(invDate),
            fieldstr(CustInvoiceJour, DueDate), Date2StrXpp(dueDate)
    );

    qRange.value(rangeValue);

    qr = new QueryRun(q);
    while(qr.next())
    {
        custInvoiceJour = qr.get(tablenum(CustInvoiceJour));
        info(strfmt("%1 - %2 - %3", custInvoiceJour.InvoiceId, custInvoiceJour.InvoiceDate, custInvoiceJour.DueDate));
    }
}

Sumber: Axaptapedia, Developing for Dynamics AX: Using Expressions in Query Ranges

Berikut method-method yg sering digunakan pada report.

public class ReportRun extends ObjectRun
{
     TransDate           fromDate;
     TransDate           toDate;
     real                subtotalQty, totalQty, subtotal, total,Qty;

     DialogField         dialogFrom;
     DialogField         dialogTo;

     #DEFINE.CurrentVersion(1)
     #LOCALMACRO.CurrentList
          fromDate,
          toDate
     #ENDMACRO
}

public Object dialog(Object _dialog)
{
     DialogRunBase dialog = _dialog;
     ;

     dialog.addGroup("@SYS40");
     dialogFrom = dialog.addFieldValue(typeid(FromDate),fromDate,"@SYS5209","@SYS5209");
     dialogTo = dialog.addFieldValue(typeid(ToDate), toDate,"@SYS14656","@SYS14656");
     return dialog;
}

public boolean getFromDialog()
{
     ;
     fromDate = dialogFrom.value();
     toDate = dialogTo.value();

     return true;
}
public container pack()
{
     return [#CurrentVersion, #CurrentList];
}
public boolean unpack(container packedClass)
{
     boolean _ret;
     Integer version = conpeek(packedClass,1);
     ;

     switch(version)
     {
          case #CurrentVersion:
               [version, #CurrentList] = packedClass;
               _ret = true;
               break;
          default:
               _ret = false;
               break;
     }
     return _ret;
}
boolean validate(Object calledFrom)
{
     boolean ret = true;
     if(fromdate == datenull())
          ret = checkfailed('From Date Must Be Entered');

     return ret;
}
public Query initQuery(Query _query)
{
     QueryBuildDataSource queryBuildDataSource;
     QueryBuildRange queryBuildRange;
     ;
     //memberikan nilai default pada query selection/range
     queryBuildDataSource = _query.dataSourceTable(tablenum(InventTable));
     queryBuildDataSource.clearRange(fieldnum(InventTable, ItemGroupId));
     queryBuildRange = queryBuildDataSource.findRange(fieldnum(InventTable, ItemGroupId));
     if(!queryBuildRange)
          queryBuildRange = queryBuildDataSource.addRange(fieldnum(InventTable, ItemGroupId));
     queryBuildRange.value('RM_ES,RM_MM,RM_PC');

     return _query;
}

Manfaat yg bisa didapat:

  • Dapat memanfaatkan Object Query yg sudah ada sehingga tidak perlu membuat object Query yg baru yang isinya fungsi agregat.
  • Tidak perlu membuat perintah SQL yang baru yang maksud dan fungsinya sama dengan Object Query yang dimaksud.
  • Akan sangat bermanfaat bila Object Query-nya merupakan join dari beberapa table.

Contoh AOT Job…

static void atus12(Args _args)
{
     Query q;
     QueryRun qr;QueryBuildDataSource qbd;
     QueryBuildFieldList qfl;
     EmplTable ep;
     int i;
     ;

     qr = new QueryRun(queryStr(EmployeeListAtus));
     //'EmployeeListAtus' merupakan contoh Object Query dari AOT
     q = qr.query();
     qbd = q.dataSourceTable(tablenum(EmplTable));
     qfl = qbd.fields();
     /*
     Command berikut untuk menambahkan fungsi agregat pada query.
     Fungsi Agregat : Count, Max, Min, Avg, Sum.
     Fungsi Count sebaiknya di asign pada RecId sebab RecId merupakan Int64, sisanya(fungsi) disesuaikan dengan fieldnya masing2.
     */
     qfl.addField(fieldnum(empltable,RecId),SelectionField::Count);
     qr.next();
     ep = qr.get(tablenum(empltable));
     info(strfmt("%1",ep.RecId)); //Akan menampilkan Jumlah Row...
     qfl.clearFieldList();
     qr.reset();
     i = 0;
     while(qr.next())//Akan menampilkan semua Employee ID sesuai dengan query
     {
          i++;
          ep = qr.get(tablenum(empltable));
          info(strfmt("%1 - %2",i,ep.EmplId));
     }
}