3 Kasım 2016 Perşembe

Dynamic Ax'ta kullanıcıların saat dilimlerinin ayarlanması

Ax'ın içindeki "Tercih edilen saat dilimi" alanının her bir kullanıcı için güncellenmesi gerekirse,
bunu aşağıdaki kod yardımıyla, bütün aktif Ax kullanıcıları için yapabilirsiniz.

static void MAAUserInfoPrefTime(Args _args)
{
    UserInfo  UserInfo;

    ttsBegin;

      while select forupdate UserInfo
        where  UserInfo.enable == NoYes::Yes

        if(UserInfo)
            {
                UserInfo.preferredTimeZone = Timezone::GMTPLUS0300BAGHDAD; // istediğiniz saat dilimini burdan ayarlayabilirsiniz.
                UserInfo.doUpdate();
            }

    ttsCommit;

    info("bitti");
}





UserInfo Table hakkında detaylı bilgiyi bu linkten alabilirsiniz. 

                         https://msdn.microsoft.com/en-us/library/aa596081(v=ax.50).aspx

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


Total ciro

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