10 Ağustos 2017 Perşembe

Lookup'a Range Verme

Lookup'ta istenilen kayıtların süzülmesi için Range verebilirsiniz.
Aşağıdaki kod size bu konuda yardımcı olabilir.

 void clicked()
{
    TRSShipmentReport       ShipmentReport;
    InventTable             inventTable;
    Query                   q;
    QueryBuildDataSource    qbdShipmentReport;
    ;
    super();

    if(name.valueStr())
    {
        q                    = TRSShipmentReport_ds.query();
        qbdShipmentReport    = q.dataSourceTable(tablenum(TRSShipmentReport));
        qbdShipmentReport.clearRanges();
        
        while select inventTable
            where inventTable.ItemName like "*" + name.valueStr() + "*"
        {
            qbdShipmentReport.addRange(FieldNum(TRSShipmentReport, ItemId)).value(SySQuery::value(InventTable.ItemId));
        }

        TRSShipmentReport_DS.query(Q);
        TRSShipmentReport_DS.executeQuery();
    }
}

9 Ağustos 2017 Çarşamba

7 Ağustos 2017 Pazartesi

Grid'deki dizaynı düzenleme

Bir rapor yaptınız. Alanlardan bir tanesinin metin uzunluğu fazla olduğu için,
aşağıdaki gibi bir ekran karşınıza gelecektir.


Sizden hücrelerin bu şekilde büyük olmaması istenirse;




Grid'deki ilgili alanın özelliklerinden, Displayheight = 1 yaparsak normale dönecektir.





Kullanıcı Kimliği güncelleme / Created by Update

Dynamics ax 2009 change created By

Dynamics Ax'ta kullanıcı içe aktarırken, kullanıcı kimliğini otomatik atar. Burdan siz isterseniz değiştirebilirsiniz. İçe aktarırken değiştirmediniz, ileride de bu adın değiştirilmesi istenirse;


Kullanıcılardan gidip değiştirmek istediğim kullanıcıyı Yeniden adlandır yapıp eski kayıtları da AX'ın veri tabanından  güncelleyince istenilen kullanıcı kimliği güncelleniyor.

Unutmamanız gereken şey önceki kayıtlarla tutarlı olması için, kullanıcının kayıt girdiği bütün tablolardaki created by alanını da güncellemeniz gerekiyor (Satınalma, satış, talep vs.). (SQL tarafında bunu yapabilirsiniz.)


Nette araştırdığımda SQL tarafına girmeden, aşağıdaki bir kod yardımıyla(Satınalma, satış, talep vs.) ilgili tablolardaki Created by güncellenebilir diyor ama;
 static void MAA_CreatedBy(Args _args)
{
    PurchTable  PurchTable;

 while  select forUpdate   PurchTable
        where PurchTable.createdBy == "maakb4545"

        if(PurchTable.RecId)
            {
              ttsBegin;
               New OverwriteSystemfieldsPermission().assert();
               PurchTable.overwriteSystemfields(true);
               PurchTable.(fieldNum(PurchTable, CreatedBy)) = "makbl";
               PurchTable.doUpdate();
            ttsCommit;
            }

        CodeAccessPErmission::revertAssert();
    info("bitti");
}
Bu kod çalıştığında; aşağıdaki hatayı veriyor.





Bazı blog sitelerde kodu AOS'ta çalıştırın diye tavsiye edilmiş. Fakat burada da aynı hatayı aldım.

Bu yöntemler çözüm olmayınca ancak SQL tarafından çözüm bulabildim.

SQL tarafına yazdığım kod aşağıdaki gibi.
UPDATE PURCHTABLE SET CREATEDBY='makbl' where CREATEDBY='maakb'

Bu kod PurchTable'ı günceller. Siz diğer tabloları(SalesTable, SalesLine, PurchLine vs.) güncellerken tablo adını değiştirip çalıştırabilirsiniz.





21 Temmuz 2017 Cuma

Dynamic Ax | Şartlarını belirlediğiniz satırların rengini değiştirme


Şart yazarak, daha kolay ayırt edebilmemiz için grid'teki satırların renklerini düzenleyebilirsiniz.

Benim yaptığım örnekte iki tarihi kıyaslayıp, biri diğerinden büyük olan satırları kırmızı renkte göster dedim.

Bunun için; renklendirmek istediğimiz formun Data Sources kısmından ilgili tablomuzun Methods'unda displayOption method'unu ezerek yapabiliyoruz.



Bu alana şu kodu ekleyeceğiz:
public void displayOption(Common _common, FormRowDisplayOption _options)
{
    PurchLine              purchLineLocal;
    int backColor = WinAPI::RGB2int(255, 50, 50);
    int textColor = WinAPI::RGB2int(255, 255, 255);
    ;

    purchLineLocal = _common;

        if(EtgExImpPurchLineTrans::findLastETA(purchLineLocal.InventTransId) > purchLineLocal.DeliveryDate) // buradaki şart sağlandığında o satırlar kırmızı renkte görünecek.
        {
            _options.backColor(backColor);
            _options.textColor(textColor);
        }
        else
        {
            _options.clearBackColor();
            _options.clearTextColor();
        }

    super(_common,_options);
}
Form aşağıdaki gibi görünür.











15 Haziran 2017 Perşembe

Job ile alan adını bulma

Aşağıdaki job'ı çalıştırdığınızda,
static void MAA_FieldName(Args _args)
{
    SysDictField dict;
    str label;
    ;
    
    dict = new SysDictField(tablenum(SalesTable), fieldNum(SalesTable, InvoiceAccount));
    label = dict.label();
    info(strfmt("%1", label));
}

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

Total ciro

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