2011-07-28

Progress Bar - Multi Bar

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 myProgressBar(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();
}

2011-07-27

Ekspresi Dalam Query Range

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 myExperiment(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

[AX2009] Method Dalam Report yg Sering Digunakan

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