31 Ekim 2016 Pazartesi

Dynamic Ax'ta excelle update yapma

Excelle istediğimiz bir alanı updete yapabiliriz. Bunun için aşağıdaki kodu inceleyebilirsiniz.
static void ExcelUpdate_MAA(Args _args)
   {

    FilenameOpen        filePath;
    SysExcelApplication application;
    SysExcelWorkBooks   workBooks;
    SysExcelWorkBook    workBook;
    SysExcelWorkSheets  workSheets;
    SysExcelWorkSheet   workSheet;
    SysExcelCells       cells;

    Int                     NoofSheet,i,sn;
    LedgerJournalACType     LedgerJournalACType;
    CustTrans      custtrans;

    ;
    #Excel

    filePath            = "C:\\Desktop\\maakbulut\\ax_excel\\FiyatFarkıFaturaRaporu.xlsx"; // kendi oluşturduğumuz excelin adresini veriyoruz.
    application         = SysExcelApplication::construct();
    application.visible(false);
    workBooks           = application.workbooks();
    workBooks.open(filePath,0,true);
    workSheets          = workBooks.item(1).worksheets();
    noOfSheet           = worksheets.count();

    try
    {
        ttsbegin;

        for( i = 1; i <= 1 ; i++) // noOfSheet
        {
            workSheet       = workSheets.itemFromNum(i);
            if(workSheet)
            {
                for(sn = 2;sn <= 337;sn++) // 2. satırdan başlayıp 337. satıra kadar olan verileri alacak
                {
                    custtrans.clear();

                    cells = workSheet.cells();

                    select forupdate custtrans where custtrans.Voucher == cells.item(sn,1).value().bStr();
                    if (custtrans)
                    {
                         custtrans.Dimension[5]      = "Hediye"; // Şartımız Dimension[5] alanı Hediye olanlar
                         custtrans.doUpdate();
                    }
                }
            }
        }
        ttscommit;
        info("İşlem tamamlandı.");
    }
    catch
    {
        ttsabort;
        info("Hata oluştu.");
    }
    application.quit();
} 

12 Ekim 2016 Çarşamba

Dynamic Ax'ta Formu Yüklenirken Enum'da sizin belirleyeceğiniz seçeneğe göre gelmesi

Sizden form yüklenirken enum'daki istenilen bir alana göre açılması istenirse;


Örneğin bu formda bizden form açılırken Hareket Tipi "Alım" olanlar gelsin diye talep edildi.

Bunun için;

Önce formun ClassDeclaration bölümüne tanımlama yapıyoruz.
public class FormRun extends ObjectRun
{
     QueryBuildRange             qbrStatus;
}

Daha sonra yine formun init'ine şu kodu yazıyoruz.

 qbrStatus.value(SysQuery::value(ETGCollateralPostingType::Receive));

  //  "ETGCollateralPostingType" bu alan Hareket Tipi enum'unun adı.
Şimdi form açılırken Hareket tipi "Alım" olanlar gelecek.


Aşağıdaki kod da form ile enum'daki Hareket Tipi alanını "Alım" olarak ayarlar.
Yapılmazsa Enum'ın ilk sırasındaki seçenek gelir.

filterStatus.selection(ETGCollateralPostingType::Receive);

Dynamic Ax'ta form açıldığında ilk kaydın gelmesi

Sizden form açıldığında ilk kaydın gelmesi istenirse yapacağınız iş çok basit.





Formun data sources kısmından ilgili data source'u sağ tıklayıp özellilker - StartPosition alanını
First yaparsak ilk kayıttan başlayacaktır.



Last yaparsak da son kayıt seçili gelecek.

30 Eylül 2016 Cuma

Bir alana kontrol ekleme (validateWrite'ını ezerek)

Sizden NoYesId alanının durumuna göre şart konulması istendiğinde, DataSource'unda validateWrite'ına aşağıdaki gibi şart koyarak kontrolünü sağlayabilirsiniz.

Örnek kod:
public boolean validateWrite()
 {
    boolean ret;

    ret = super();


      if ( DRT_ArchiveTrans.NoYesId == NoYes::Yes )
            {
                if (!DRT_ArchiveTrans.Archive_ClosetNumber )
                    return checkfailed ("Dolap no alanını doldurunuz!");

                if (!DRT_ArchiveTrans.ShelfNumber )
                    return checkfailed (" Raf no alanını doldurunuz!");
            }

    return ret;
 }

10 Ağustos 2016 Çarşamba

Hata: Ters işlem yürütülemiyor! (Kapalı hareket düzenleme)

Kapalı hareket düzenlemede "Ters Kaydet"mek istediğimizde,

Ters işlem yürütülemiyor! şeklinde hata alırsanız.
CustInvoiceTable'da PreInvoiceId alanı, satırların bir tanesinde bile boş olursa bu hatayı alırsınız.

Çözüm için tablodaki boş olan PreInvoiceId alanını mutlaka doldurun.

not: Bu alan(PreInvoiceId ) Serbest metin faturası ayrıntılarındaki Matbuu fatura numarası.




Kaynak : https://daxapta.wordpress.com/2016/08/10/

29 Temmuz 2016 Cuma

Tekrar eden kayıtta uyarı verme

                     


Örneğin sizden Tahsilat Belge Numarası alanına, aynı kayıttan girildiğinde ekrana uyarı çıksın
şeklinde bir kontrol konulması istendi.

Bu durumda Formun datasource'unda ilgili alanın validate'ine  aşağıdaki şekilde kod yazabilirsiniz.
public boolean validate()
{
    LedgerJournalTrans  tmpLedgerJournalTrans; // Tablonun adıyla Datasource'u aynı olduğunda tabloyu tanımlamanız gerekiyor. Yoksa Ax bunu algılayamıyor.
 
    boolean ret;

    ret = super();

    select firstonly  tmpLedgerJournalTrans
     where tmpLedgerJournalTrans.DRTDocumentId == LedgerJournalTrans.DRTDocumentId;

   if (tmpLedgerJournalTrans.RecId != 0) // Boş olmayan kayıtlar

            {
                info(strfmt("%1 daha önce kullanıldı!", tmpLedgerJournalTrans.DRTDocumentId));
            }

    return ret;
}
Ax'ı Bilgi Teknolojiler Şef'imiz Murat Bey 'le öğrenmeye çalışıyorum.

https://daxapta.wordpress.com/

16 Haziran 2016 Perşembe

Display alan

Formun içinde olmayan bir alanı farklı bir tablodan display yöntemiyle çekebiliriz.

Örneğin, Açık sipariş satırlarına "İş akışı durumu"'nu getirmemiz istendi.




display WFDummiesWorkflowState dispWFDummiesWorkflowState()
{
    return SalesTable::find(this.SalesId).WFDummiesWorkflowState; // SalesTable’daki SalesId alanı      ile SalesLine’daki SalesId alanıyla süzüyorsun(SalesTable::find(this.SalesId) ).
}

Kodu tablonun Metods  kısmına yazıyoruz.



Daha sonra yazdığımız metodu formda bulunan gride sürükleyip bırakıyoruz.



Gride sürükleyip bıraktığımız alanın DataSource'unu seçiyoruz.



Alan formumuza bu şekide gelmiş oluyor.


15 Haziran 2016 Çarşamba

Dynamic Ax Kodla iş akışı yönlendirmesi

İş akışlarını kod ile yönlendirebilirsiniz.

static void WorkFlowReAssign(Args _args)
{
    WorkflowTrackingStatusTable     trackingStatusTable;
    WorkflowWorkItemTable           workItemTable;
    WorkflowTrackingTable           trackingTable;
    WorkflowTrackingCommentTable    trackingCommentTable;
    WorkflowTrackingArgumentTable   trackingArgumentTable;
    UserId                          newUserId = "akblt"; // Yönlendirilecek olan kişi
    ;

    while select trackingStatusTable where trackingStatusTable.TrackingStatus == WorkflowTrackingStatus::Pending &&
                                           trackingStatusTable.InstanceNumber == "MAA1453" // Örnek kodu
    {
        ttsbegin;
        info(strfmt("%1 - %2", trackingStatusTable.ConfigurationName, trackingStatusTable.InstanceNumber));

        select forupdate workItemTable where workItemTable.RefRecId   == trackingStatusTable.ContextRecId &&
                                   workItemTable.RefTableId    == trackingStatusTable.ContextTableId &&
                                   workItemTable.CompanyId  == trackingStatusTable.ContextCompanyId &&
                                   workItemTable.Status     == WorkflowWorkItemStatus::Pending;

        WorkflowWorkItem::delegateWorkItem(workItemTable.Id, newUserId, "");// birine yetki devretmek için

        select forupdate trackingTable where trackingTable.WorkItemActivityInstanceId == workItemTable.ActivityId;

        select forupdate trackingCommentTable where trackingCommentTable.TrackingId == trackingTable.TrackingId;

        select forupdate trackingArgumentTable where trackingArgumentTable.TrackingId == trackingTable.TrackingId && trackingArgumentTable.DataType == "WorkflowUser";

        info(strfmt("%1 - %2 - %3 - %4", workItemTable.UserId, workItemTable.Subject, workItemTable.Description, workItemTable.SubWorkflowId));
        ttscommit;
    }
}

3 Haziran 2016 Cuma

Satınalma siparişi iptali


Satınalma siparişinin iptal edilmesi istenirse size aşağıdaki kod yardımcı olacak;

static void PurchTableCancel()
{
    PurchTable  PurchTable;
    PurchLine   PurchLine;
    InventTrans InventTrans;
    ;
    ttsbegin;

    select forupdate PurchTable
        where PurchTable.PurchId == "MAA00051615";

    PurchTable.PurchStatus  = PurchStatus::Canceled;
    PurchTable.PurchPoolId = "İptal";
    PurchTable.update();

    while select forupdate PurchLine
        where   PurchLine.PurchId   == PurchTable.PurchId
    {
        InventTrans = InventTrans::findTransId(PurchLine.InventTransId, true);
        InventTrans.StatusReceipt = StatusReceipt::Ordered;//Açık sipariş
        InventTrans.DatePhysical = datenull();
        InventTrans.VoucherPhysical ="";
        InventTrans.CostAmountPhysical = 0;
        InventTrans.CostAmountSecCurPhysical_TR = 0;
        InventTrans.update();

        PurchLine.PurchStatus = PurchStatus::Canceled;//Açık sipariş
        PurchLine.ReturnStatus = ReturnStatusLine::None;
        PurchLine.RemainPurchPhysical = 1;
        PurchLine.RemainInventPhysical = 1;
        PurchLine.RemainPurchFinancial = 0;
        PurchLine.RemainInventFinancial = 0;

        PurchLine.PurchStatus = PurchStatus::Canceled;
        PurchLine.doUpdate();
    }
    ttscommit;
    info("bitti");
}

Insert / Delete metodu

Adres defterine ilçe eklenmesi istenirse aşağıdaki job'la bunu yapabilirsiniz.

static void MAATestTableInsertAdress(Args _args)
{
    AddressCounty  AddressCounty;

    ttsBegin;

    AddressCounty.CountryRegionId= "Türkiye";
    AddressCounty.StateId= "Zonguldak";
    AddressCounty.CountyId  = "Ereğli";
    AddressCounty.insert();
    ttsCommit;
    info("bitti");
}



Bir tabloya kodla kayıt eklemek için insert metodunu kullanabilirsiniz.

static void MAATestTableInsert(Args _args)
{
    NumberSequenceReference  NumberSequenceReference;

    ttsBegin;

    NumberSequenceReference.NumberSequence= "IsTakipNo";
    NumberSequenceReference.WizardHighest= 999999;
    NumberSequenceReference.DataTypeId  = 30308;
    NumberSequenceReference.doInsert();
    ttsCommit;
    info("bitti");
}


Bir tablodan kayıt silmek için de delete metodunu kullanabilirsiniz;

static void MAATestDelete (Args _args)
{
    NumberSequenceTable NumberSequenceTable;

        ttsBegin;
        select firstOnly NumberSequenceTable
        where NumberSequenceTable.NumberSequence == "ETGM_303"; //delete edilecek kayıdı bulmak için şartlar belirtilir.
        if(NumberSequenceTable)
        {
            NumberSequenceTable.doDelete();
        }
        ttsCommit;
        info("bitti");
}


Update Methods

Bir tablodaki alanı başka bir tablodaki aynı alanla güncelleme istenirse aşağıdaki metod size yardımcı olacak.

Örneğin CustTable'daki SalesDistrictId alanlanlarını ForecastSales'daki SalesDistrictId alanıyla güncellenmesi istendiğinde bu jobs yardımıyla çözüme ulaşabilirsiniz.


//CustTable'daki SalesDistrictId alanlarını ForecastSales'daki SalesDistrictId alanlarıyla birbirine eşler.

static void MAA_UpdateForecastSales(Args _args)
{
      ForecastSales        forecastSales;
      CustTable            custTable;
    ;

    ttsBegin;

    while select custTable // Tabloyu elimize alıyoruz. bu tablo SalesDistrictId alanı çekilecek olan tablo.
           where custTable.SalesDistrictId != "" // şart yazıyoruz. "CustTable'daki SalesDistrictId alanı boş olmayanlar"
    {
        while select forupdate forecastSales // güncellenecek olan tablo
           where forecastSales.CustAccountId == custTable.AccountNum // CustTable'daki AccountNum'ı forecastSales'daki CustAccountId'siyle eşit olanlar
       {
            if  (forecastSales.SalesDistrictId  != "")
            {
                 forecastSales.SalesDistrictId = custTable.SalesDistrictId; // custTable'daki SalesDistrictId alanlarının hepsini forecastSales'daki aynı alanla eşitle.
                 forecastSales.update();
                 info(strfmt("%1", forecastSales.SalesDistrictId));
            }
        }
    }

    info("Bitti");

    ttsCommit;

}

Total ciro

static void MAA_SalesTableTotal(Args _args) { SalesTable SalesTable; utcDateTime dateTime; dateTime ...