24 Mart 2016 Perşembe

AXAPTA - Sysmailer ile mail gönderirken türkçe harf sorunu

SysMailer class ile mail gönderirken aşağıdaki kırmızı satırı eklemediğinizde türkçe harfler mailde çıkmayacaktır. Bu çözümü bir blog'dan bulmuştum ancak yerini şu an hatırlayamıyorum:


   SysEmailParameters  parameters;
    SysMailer           mailer;
    ;
    new InteropPermission(InteropKind::ComInterop).assert();
        parameters = SysEmailParameters::find();

        mailer = new SysMailer();
        if (parameters.SMTPRelayServerName)
        {
            mailer.SMTPRelayServer(parameters.SMTPRelayServerName,
                               parameters.SMTPPortNumber,
                               parameters.SMTPUserName,
                               SysEmailParameters::password(),
                               parameters.NTLM);
        }
        else
        {
            mailer.SMTPRelayServer(parameters.SMTPServerIPAddress,
                               parameters.SMTPPortNumber,
                               parameters.SMTPUserName,
                               SysEmailParameters::password(),
                               parameters.NTLM);
        }
        mailer.fromAddress(fromAddr);
        mailer.tos().appendAddress(toAddr);
        mailer.subject(subject);
        //türkçe harflerin düzgün gitmesi için:
        mailer.bodyCharSet("Windows-1254");
        if(FileName)
            mailer.attachments().add(FileName);
        mailer.ccs().appendAddress(ccAddr);
        mailer.bccs().appendAddress(bccAddr);
        mailer.htmlBody(body);
        mailer.sendMail();
    }
    CodeAccessPermission::revertAssert();

2 Mart 2016 Çarşamba

AXAPTA - Bir tablo alanının label değerini bulmak

Bir tablonun bir alanının label değerini bulmanın iki yolu var:

Eğer field label değerini direk extended data tipinden alıyorsa:


    if (curext()=="krc" && this.RBOInventItemGroupId == "")
        ret = checkfailed(strfmt("'%1' alanı doldurulmalıdır!..",
            new SysDictType(extendedTypeNum(RBORetailGroupId)).label()));

Eğer tabloda alana bir etiket yazıldıysa:

    if (curext()=="krc" && this.RBOInventItemGroupId == "")
        ret = checkfailed(strfmt("'%1' alanı doldurulmalıdır!..",
            new SysDictField(tablenum(WholeSalesCampaignGroup),
fieldnum(WholeSalesCampaignGroup,RBOInventItemGroupId)).label()));
 

5 Şubat 2016 Cuma

AXAPTA - Kullanıcının grid başlığından filtreyi değiştirmesini engelleme

SysQuery::findOrCreateRange(InventDim_DS.query().dataSourceTable(tablenum(InventDim)),fieldnum(InventDim,InventSiteId)).status(RangeStatus::Locked);

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

23 Aralık 2015 Çarşamba

Axapta - XPO export dialog formunda dosya adının tarih - saat ile gelmesi

Bu sayede XPO'larımız versiyon kontrollü olmuş oluyor. Yedekleme açısından çok faydalı olan aşağıdaki kodu Eren Polat'dan aldım.

SysExportDialog formunun metodlarına aşağıdaki kodları ekleyin:

classDeclaration:

str                     sDate, sTime, sDateTime;
str                     sMilliSeconds;
init:

    sMilliSeconds           = int2str(winApi::getTickCount());
    sDate                   = int2str(year(today())) + strReplace(num2str(mthofyr(today()),2,0,0,0), ' ', '0') + strReplace(num2str(dayofmth(today()),2,0,0,0), ' ', '0');
    sTime                   = strfmt("%1:%2", time2str(timeNow(),1,1), substr(sMilliSeconds, strlen(sMilliSeconds)-2,2));
    sTime                   = strReplace(sTime,":","");
    sDateTime               = strfmt("_%1%2",sDate,sTime);


run:
    //element.updateBox(fileNameNext(strfmt('%1%2_%3%4', filePath, preFix, treeNode.treeNodeName(), #xpo)));
    element.updateBox(fileNameNext(strfmt('%1%2_%3%4%5', filePath, preFix, treeNode.treeNodeName(), sDateTime, #xpo)));