22 Mayıs 2017 Pazartesi

Form Açıldığında Talep Edilen Alanların İstenilen Şekilde Gelmesi

Sizden form açıldığında bazı alanların formda seçili gelmesi istenilirse;

Örneğin aşağıdaki formda Sebep kodunda birçok seçenek var fakat bu alanın DBTS-01 seçeneği form açıldığında gelsin istenildi.(Sebep kodu'nun seçilmesini ilgili yetkisini de kapatırsanız kişinin  diğer seçenekleri seçemeyip, formda gelen seçenekle devam eder)




Bunu yapmak için Formun methods kısmında init'ine aşağıdaki kodu ekliyoruz.
public void init()
{   
    super();

    SalesLine.ETGReasonCode =  "DBTS-01";
   
 }
 
Talep edilen sevk tarihini forma eklediğimde benim karşılaştığım sorun; sabit bir tarih geliyor(31.015.2015) gibi, bu alana yeni tarih girileceği için boş gelmesi gerekiyor.
Bu şekilde bir sorunla karşılaşırsanız tarih alanını boşaltmanız gerekiyor. Bunun için yine formun init'ine
public void init()
{   
    super();

    SalesLine.ETGReasonCode =  "DBTS-01";
    SalesLine.ShippingDateRequested =  datenull(); // init'e yeni eklediğimiz kısım

}

18 Mayıs 2017 Perşembe

Dynamics Ax Dialog ile Formda Güncelleme Yapma (2)


Bir önceki örnekte formun DataSource'u View ise Dialog ile güncellemenin nasıl yapılacağını incelemiştik.

Bu örneğimizde de güncellenecek formun DataSource'u Table olduğunda arasındaki küçük farktan bahsedelim.

Formun Design bölünden buton ekliyoruz ve click methoduna aşağıdaki kodu yazıyoruz;
void clicked()
{
    super();

    element.updateGCBNo();
}

Alttaki kodu da formun methods bölümüne yazıyoruz.
void updateGCBNo()
{
    
  Dialog                  d = new Dialog(strfmt("%1 için GCB No düzenle",           ATMDisTicHead.ATMDisTicID)); // üzerinde bulunan ihracat ref noyu formun başlığında gösterir

    DialogField             dlgETGGCBNo;
    DialogGroup             dlgGroup;
    ATMDisTicHead           DisTicHead;
    ;

    dlgGroup = d.addGroup("Düzenle");
    dlgGroup.widthMode(FormWidth::ColumnWidth);
    dlgETGGCBNo    = d.addField(typeid(ETGGCBNo), DisTicHead.ETGGCBNo, "GCB No");
    dlgETGGCBNo.value(AtmDisTicHead.ETGGCBNo);

    d.run();
    {
        if (d.closedOk())
        {
            {
                ttsbegin;

               if ( AtmDisTicHead )
                {
                    AtmDisTicHead.selectForUpdate(true);
                    AtmDisTicHead.ETGGCBNo = dlgETGGCBNo.value();
                    AtmDisTicHead.doUpdate();
                }
                ttscommit;

                ATMDisTicHead_ds.research(true);
            }
        }
    }
}

12 Mayıs 2017 Cuma

Dynamics Ax Dialog ile Formda Güncelleme Yapma




Dynamics Ax Dialog




Dialog ekranı üzerindeki alanların(DialogField) nasıl ezilebilebileceğini bir örnekle inceleyelim.

İstenilen alanın DataSource'u View ise;

View'in DataSource'undan ilgili Table'ın RecId'sini Fields'lerin içine atıyoruz.
RecId1 olarak gelir ben adını TransRecId olarak değiştirdim.




Sonra Dialog ekleyeceğim forma geliyoruz, bir buton ekleyip clicked metoduna;
 void clicked()
    {
      super();
       element.updateBankNegInstRecipient(); 
    }



updateBankNegInstRecipient metodunu da Formun Methods kısmına yazıyoruz.
 void updateBankNegInstRecipient()
{
    Dialog                  d = new Dialog("Faiz Oranı & Vade Tarihi düzenle");
    DialogField             dlgBankNegInstRecipientName;
    DialogField             dlgDueDate;
    DialogGroup             dlgGroup;
    LedgerJournalTrans   ledgerJournalTrans;
    ;

    dlgGroup = d.addGroup("Düzenle");
    dlgGroup.widthMode(FormWidth::ColumnWidth);
    dlgBankNegInstRecipientName    = d.addField(typeid(BankNegInstRecipientName), "Faiz Oranı");
    dlgBankNegInstRecipientName.value(DRTLedgerJournalTrans.BankNegInstRecipientName);

    dlgDueDate    = d.addField(typeid(DueDate), "Vade Tarihi");
    dlgDueDate.value(DRTLedgerJournalTrans.Due);

    d.run();
    {
        if (d.closedOk())
        {
            {
                ttsbegin;
              ledgerJournalTrans=ledgerJournalTrans::findRecId(DRTLedgerJournalTrans.TransRecId, true);

               if ( ledgerJournalTrans )
                {
                    ledgerJournalTrans.BankNegInstRecipientName = dlgBankNegInstRecipientName.value();
                    ledgerJournalTrans.Due = dlgDueDate.value();
                    ledgerJournalTrans.doUpdate();
                }
                ttscommit;

                DRTLedgerJournalTrans_ds.research(true);
            }
        }
    }
}


16 Aralık 2016 Cuma

Yetkileri, Kullanıcı Grubu ve Kişilerini Bir Formda Toplama

Dynamic Ax 2009'da Kullanıcı Grupları ve Kullanıcıları Bir Forma Çekip Kullanma


Dynamics Axapta 2009'da kullanıcı grupları ve içindeki kullanıcılar aynı tabloda tutulmadığı için, bir kullanıcının hangi grupta olduğunu ancak kullanıcı gruplarından bakıp tek tek görebiliyoruz.

Birçok kullanıcı ve grup olduğunu düşünürsek tek tek bakmak sıkıcı olabiliyor.

Öncelikle verileri bir alanda toplamak için  MAA_UserGroupList adında yeni bir tablo oluşturdum.

Kullanıcı grubu için gerekli bilgileri UserGroupListUserGroupInfo, UserInfo tablolarından çekeceğiz.
UserGroupList'ten  groupId ve userId alanlarını, UserGroupInfo'dan name ve company,  UserInfo'dan name alanlarına ulaşıp kendi oluşturduğumuz MAA_UserGroupList  tablosuna verileri çekeceğiz.
Bu tabloları standart Tables'ın içinden göremiyoruz.


Projemize bir form ve DataSource'una MAA_UserGroupList  tablosunu ekliyoruz.
Verileri çekmemiz için forma buton ekliyoruz.

Butonun click metoduna aşağıdaki kodu;

void clicked()
{
    element.getuser(); // buton tıklandığında getuser metodu çalışacak
    MAA_UserGroupList_ds.research(); // Güncel veriler eklendiğinde otomatik refresh yapar.
}

getuser kısmına da aşağıdaki kodu ekliyoruz;

void getuser()
{
      UserGroupInfo       UserGroupInfo;
      UserGroupList       UserGroupList;
      MAA_UserGroupList   maa_UserGroupList ;
      UserInfo            UserInfo;
      ;
delete_from maa_UserGroupList ;
    while select UserGroupInfo join UserGroupList
        where UserGroupInfo.Id == UserGroupList.groupId
         {
            select  UserInfo
                where  UserInfo.id == UserGroupList.userId;
                    {
                         maa_UserGroupList .clear();
                         maa_UserGroupList .groupId   =  UserGroupList.groupId;
                         maa_UserGroupList .userId    =  UserGroupList.userId;
                         maa_UserGroupList .GroupName =  UserGroupInfo.name;
                         maa_UserGroupList .company   =  UserInfo.company;
                         maa_UserGroupList .UserName  =  UserInfo.name;
                         maa_UserGroupList .insert();
                     }
             info(strfmt("%1 %2 %3 %4", maa_UserGroupList .groupId, maa_UserGroupList .userId, maa_UserGroupList .GroupName, maa_UserGroupList .UserName));
          }
}

Burada istediğimiz verileri tablomuza çektik ve formumuza da eklenmiş oldu. Artık hangi grupta kim var ya da bir kişi hangi grup ya da gruplarda görebiliriz.

Bu forma başka neler ekleyebiliriz?

Formda işimizi daha da kolaylaştıracak, İzinler(kişinin ya da grubun yetkilerini ayarladığımız alan)
ve Kayıt düzeyi güvenliği menülerinin Relation'unu ayarlayıp ekleyebilirsiniz.

Bu sayede yetki kontollerini tek formda birleştirip yapabilirsiniz.





1 Aralık 2016 Perşembe

Ana Tablo Formuna Git | Dynamic Ax 2009

Örneğin sizden Teminat Mektuplarında AccountNum alanından CustTable'daki CustAccount alanına gidilmesi istendi.

Formun Data Source'undaki ilgili alanın methots'unda jumpRef'ini Yöntemi gereçersiz kıl diyerek aşağıdaki kodu eklemeniz yeterli olacaktır.
public void jumpRef()
  {
    CustTable custTableMainTable;
    Args args;
    MenuFunction menuFunction;
    ;
    args = new Args();
    args.caller(element);
    args.lookupfield(FieldNum(CustTable,AccountNum));
    args.lookupValue(ETGCollateralTable.AccountNum);
    menuFunction = new MenuFunction(MenuItemDisplayStr(custTable),MenuItemType::Display);
    menuFunction.run(args);
  }

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/

Total ciro

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