Blog Listem

26 Ocak 2016 Salı

AX 2009 - Raporu PDF çıktı olarak arka planda çalıştırmak

Raporun Interactive property değerini No yapıyoruz. PrintMedium enum değerini değiştirerek html çıktı olarak çalışması da sağlanabilir.

     DocuType                docuType;
    TextIo                  textIo;
    FileIOPermission        fioPermission;
    #File
    ReportRun report;
    ;

    docuType = DocuType::find("Temp");
    fileName = strfmt(@"%1My Test Report.PDF",   docuType.ArchivePath);
   
    fioPermission = new FileIOPermission(fileName ,"RW");
    fioPermission.assert();

    if(Global::isRunningOnServer())
    {
        if(WinAPIServer::fileExists(fileName))
            WINAPIServer::deleteFile(fileName);
    }
    else
    {
        if(WinAPI::fileExists(fileName))
            WINAPI::deleteFile(fileName);
    }

    report = new ReportRun(new  Args(ReportStr(KRC_InventCoverReport)));
    report.printJobSettings().setTarget(PrintMedium::File);
    report.printJobSettings().preferredTarget(PrintMedium::File);
    report.printJobSettings().format(PrintFormat::PDF);
    report.printJobSettings().fileName(fileName);
    report.query().interactive(false);
    report.run();

22 Ocak 2016 Cuma

Axapta - Neden bazen MultiSelectionHelper bazen klasik okuma yöntemi?

Bir formda gridde seçili kayıtları okumak için klasik yöntem aşağıdaki gibidir:

 c = CustTable_DS.getFirst(true);
 while (c.RecId != 0)
 {
      info(c.Name);
      c = CustTable_DS.getNext();
 }


Ancak bu yöntemin bir sakıncası vardır. Bu yöntemle kayıt okuduğunuz zaman eğer ki kullanıcı listeden birkaç kayıt işaretlemeyip sadece üzerinde durduğu kaydı işlemek isterse o kayıt malesef atlanır. Bunu bertaraf etmek için aşağıdaki eklemeyi yapmak gerekir:


c = CustTable_DS.getFirst(true);
noSelected = true;
while (c.RecId != 0)
{
     noSelected = false;
     info(c.Name);
     c = CustTable_DS.getNext();

}
if  (noSelected)
    info(CustTable.Name);

MultiSelectionHelper sınıfı bu sıkıntıyı bertaraf eder:

 MultiSelectionHelper helper = MultiSelectionHelper::construct();
CustTable c;
;

helper.parmDatasource(CustTable_ds);

c = helper.getFirst();
while (c.RecId != 0)
{
      info(c.Name);
      c = helper.getNext();

}

Ancak MultiSelectionHelper sınıfının da bir dezavantajı vardır. Eğer ki kullanıcı gridde kayıtları sıralamak isterse ve o sıraya göre liste almak isterse yine yukarıdaki klasik yöntemi kullanmak gerekir zira MultiSelectionHelper sınıfı kullanıcının yaptığı sıralamayı malesef dikkate almaz.

MultiselectionHelper sınıfının bir sınıf içinde kullanılması:

public static void main(Args _args)
{
    SMAServiceOrderTable    serviceOrder;
    MultiSelectionHelper    helper;
    FormRun                 caller = _args.caller();
    FormDataSource          SMAServiceOrderTable_DS;
  
    SMAServiceOrderTable_DS = caller.dataSource();
    helper = MultiSelectionHelper::createFromCaller(caller);
    helper.createQueryRanges(SMAServiceOrderTable_DS.queryBuildDataSource(),fieldStr(SMAServiceOrderTable,RecId));
    
    serviceOrder = helper.getFirst();
    
    while(serviceOrder)
    {
        info(strFmt("%1",serviceOrder.RecId));
        serviceOrder = helper.getNext();
    }
}

19 Ocak 2016 Salı

Axapta - Query'ye boyut (dimension) bazında filtre eklemek

StrFmt ile boyut bazında filtre eklemek istediğimizde dimension alanın köşeli parantezleri dimension[2] = "0001" tarzı filtre eklemek istediğimizde hata veriyor. Doğru yöntemi bir forum sayfasında buldum:


QueryBuildDataSource    qbds = query.addDataSource(tablenum(EmplTable));
...
 qbds.addRange(fieldid2Ext(fieldnum(EmplTable, Dimension),1)).value("600742");