8 Aralık 2017 Cuma

ilişkili tablolardan bilgi alma

Örnek; İade sipariş aynrınlarında, İnventTable'dan kontrolünü yapacağımız madde tipi HİZMET olmayanlar için bir kontrol eklemek istiyoruz. DataSource'da bulunan SalesLine'ın methods'unda validateWrite'ına aşağıdaki şekilde kod yazarak İnventTable'ı elimize alıp istediğimiz gibi bilgiyi alabiliriz.

if (InventTable::find(salesLine.ItemId).ItemType != ItemType::Service )
        {
            if(!salesLine.InventTransIdReturn)
               return checkfailed("İade lot kodunu doldurunuz!");
        }

ilişkili tablolardan bilgi alma 2

Örnek üzerinden gidecek olursak; Bir formunuz var ve formda kayıt girerken CustTable'daki bir alanın durumuyla ilgili bilgi vermek istiyorsunuz, Bunun için bilgi vermek istediğiniz formun Data Sources'ında buluan ilgili alanın(CustAccount) validete'ına aşağıdaki gibi bir kontrol eklerseniz CustTable'daki bütün alanlar için bilgiyi forma çekebilirsiniz.
public boolean validate() // maakbulut 18.10.2017
{
    boolean ret;

    CustTable            custTable;
    ETGTradePaymentJour  TradePaymentJour;

    ret = super();

     while select CustTable

      if (ETGTradePaymentJour.CustAccount == CustTable.AccountNum && CustTable.DRT_CzechSignature == DRT_CzechSignature::JointSignature)
        {
            info("Cari Müşterek İmzalı!");
        }

     while select CustTable

      if (ETGTradePaymentJour.CustAccount == CustTable.AccountNum && CustTable.DRTCzechCondition == DRTCzechCondition::Zavala)
        {
            info("Cari Avalim!");
        }


    return ret;
}

9 Kasım 2017 Perşembe

Sayfanın Sığmaması

Çıktı almaya çalışırken aşağıdaki gibi bir çıktı sorunuyla karşılaşırsanız;


FitToPage(Sayfayı sığdır) alanını YES yaptığınızda düzelecektir.


2 Kasım 2017 Perşembe

Kullanıcı verilerini aktarma

SYSPERSONALIZATION sık kullanılanların saklandığı tablo
SYSLASTVALUE kullanıcının özelleştirmelerinin saklandığı tablo (ax rapor filtreleri vs.)

UPDATE [dbo].[SYSLASTVALUE]
   SET [USERID] = 'yeniuserid'    
 WHERE [USERID] = 'eskiuserid'
GO

UPDATE [dbo].[SYSPERSONALIZATION]
   SET [USERID] = 'yeniuserid'
 WHERE [USERID] = 'eskiuserid'
GO

Kaynak : https://daxapta.wordpress.com/2017/11/02/kullanici-verilerini-aktarma/
 

26 Ekim 2017 Perşembe

Range verme | Daynamics Ax

Farklı tiplere range verme örneklerini aşağıdaki koddan görebilirsiniz.
Formun datasource'una ekliyorsunuz.

 this.query().dataSourceTable(tablenum(PurchLineTotals)).addSortField(fieldnum(PurchLineTotals, PurchId), SortOrder::Descending); // Büyükten küçüğe sıralama yapar.
    this.query().dataSourceTable(tablenum(PurchLineTotals)).addRange(fieldnum(PurchLineTotals, Dimension3)).value("IHR*"); // IHR ile başlayan kayıtları getirir.

this.query().dataSourceTable(tablenum(ExImpExpense_View)).addRange(fieldnum(ExImpExpense_View, MarkupCode)).value(queryvalue("D-Navlun"));  // MarkupCode'u D-Navlun olanları getir
this.query().dataSourceTable(tablenum(ETGChequeHistoryByDates)).addRange(fieldnum(ETGChequeHistoryByDates, LastTransACType)).value(enum2str(LedgerJournalACType::Cust));// Enum tipi için range

25 Ekim 2017 Çarşamba

Formdaki alanın genişliği

Ax'ta aşağıdaki gibi formun içinde bir alandaki veri hücreye sığmıyorsa;


Formda sağ tık > kurulum'dan Genişlik(lkarakter olarak) alanını kendinize göre ayarlayabilirsiniz.





Faturalanan Satış Siparişinde Değişiklik İstenirse Bakılacak Tablolar

Dynamics Ax'ta faturalanan sipariş ekstrem durumlarda değiştirilmesi istenir.
Genellikle sıkıntılı durumlardır. Böyle bir talep gelirse güncellenecek tablolar:
  1. CustInvoiceJour
  2. CustInvoiceTrans
  3. CustTrans
  4. LedgerTrans
  5. TaxTrans

Satınalma için;

Faturalanan Satınalma Siparişinde Değişiklik İstenirse Bakılacak Tablolar

Dynamics Ax'ta faturalanan sipariş ekstrem durumlarda değiştirilmesi istenir.
Genellikle sıkıntılı durumlardır. Böyle bir talep gelirse güncellenecek tablolar:
  1. VendInvoiceJour
  2. VendInvoiceTrans
  3. VendTrans
  4. LedgerTrans
  5. TaxTrans
Satış siparişi için;

23 Ekim 2017 Pazartesi

Farklı tabloyla ilişki kurma



if(inventTable::find(CustPackingSlipTrans.ItemId).WayControl == NoYes::Yes)
  {
    info("Var");
  }

19 Ekim 2017 Perşembe

Dynamics Ax iş akışındaki saat sorunu

İş akışındaki saat sorunu 
Ax'ta iş akışlarında saat sistemin saatiyle uyuşmuyorsa, güncellemeniz gereken alanlardan birisi,
İş akışı konfigürasyonlarında bulunan saat dilimi olacaktır. Burayı GMT+03:00 şeklinde güncellerseniz problem kalkacaktır.






Kullanıcıların saat dilimlerini toplu şekilde güncellemek için;

10 Ekim 2017 Salı

Ax'ta Tablodaki verileri diğer tabloya ekleme

Örneğin; DRT_SuggestionTable tablosunda istediğiniz alanların verilerini DRT_FarmerSuggestionTable tablosuna aktarmak istediğinizde aşağıdaki kod işinize yarayacaktır.
static void MAA_FarmerSuggestionTable(Args _args)
{
    DRT_FarmerSuggestionTable  FarmerSuggestionTable;
    DRT_SuggestionTable             SuggestionTable;

    ttsBegin;

      while select forUpdate SuggestionTable

        if(SuggestionTable.RecId)
            {
               FarmerSuggestionTable.FarmerID      =   SuggestionTable.FarmerID;
               FarmerSuggestionTable.VisitId           =   SuggestionTable.VisitId;
               FarmerSuggestionTable.Quantity         =   SuggestionTable.Quantity;
               FarmerSuggestionTable.CustAccount  =   SuggestionTable.CustAccount;
               FarmerSuggestionTable.CustName      =   SuggestionTable.CustName;
               FarmerSuggestionTable.ItemId             =   SuggestionTable.ItemId;
               FarmerSuggestionTable.insert();
            }

    info("bitti");

    ttsCommit;
}

5 Ekim 2017 Perşembe

Formun çalışması

Formun direk açılmasını önlemek için aşağıdaki methodu kullanabilirsiniz.
Formun methodunda initini ezerek çalıştırabilirsiniz.

public void init()
{
    if (!element.args().caller())
    {
        throw error("@SYS22996");
    }
    super();

    if (element.args() && element.args().record())
    {
        DRT_LegalEntity = element.args().record();
    }
}

22 Ağustos 2017 Salı

Tarih metodları (Date methods)


static void date_Functions(Args _args)
{
    Transdate    d;
    ;

    d = today();

    info(strfmt("Date – %1",d));

    //Gets the month for the given date…
    info(strfmt("Month – %1",mthofYr(d)));

    //Gets the month name from the given date…
    info(strfmt("Month Name – %1",mthname(mthofYr(d))));

    //Gets the day for the given date…
    info(strfmt("Day – %1",dayOfMth(d)));

    //Gets the day name from the given date…
    info(strfmt("Day Name – %1",dayname(dayOfMth(d))));

    //Gets the year for the given date…
    info(strfmt("Year – %1",year(d)));

    //Gets the current weekday number from the date…
    info(strfmt("Weekday number – %1",dayOfwk(d)));

    //Gets the day of the year from the given date…
    info(strfmt("Day of year – %1",dayOfyr(d)));

    //Gets the week of the year from the given date…
    info(strfmt("Week of the year – %1",wkofyr(d)));

    //Gets the start of the month from the given date…
    info(strfmt("Start of the month – %1", DateStartMth(d)));

    //Gets the end of the month from the given date…
    info(strfmt("Enf of the month – %1", endMth(dateMthFwd(d, 0))));

    //Gets the previous month from the given date…
    info(strfmt("The previous month – %1",prevMth(d)));

    info(strfmt("The previous month – %1",maxDate()));

    info(strfmt("current system time %1", DateTimeUtil::utcNow()));

    info(strfmt("current system time %1", DateTimeUtil::applyTimeZoneOffset(DateTimeUtil::utcNow(), DateTimeUtil::getUserPreferredTimeZone())));
}

17 Ağustos 2017 Perşembe

Display Bir Alanda Form İçinde Arama Yapma

Bir formun içerisinde display olan bir alanda arama yapılması isteniyorsa;

Forma arama ve sıfırlama yapmak için iki buton ve arama alanı için bir adet string tipinde alan ekleyip butonların click'ına aşağıdaki kodları ekleyerek çözebilirsiniz.



Forma eklediğimiz alanlar aşağıdaki gibi görünecek. Burada madde adını aratarak filtre koymak istiyoruz.



Eklemiş olduğum OK butonunun Click methoduna şu kodu yazıyoruz;

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(); } }
Filtreyi sıfırlamak için de Cancel butonunun Click methoduna aşağıdaki kodu yazıyoruz;
void clicked() { Query q; QueryBuildDataSource qbdTRSShipmentReport; ; super(); q = TRSShipmentReport_ds.query(); qbdTRSShipmentReport = q.dataSourceTable(tablenum(TRSShipmentReport)); qbdTRSShipmentReport.clearRanges(); TRSShipmentReport_ds.query(Q); TRSShipmentReport_ds.executeQuery(); name.text(""); }

11 Ağustos 2017 Cuma

Bizi Unutmayın! | Web

Web sitelerini dolaşırken title'lların farklı sekmeye geçip değiştiğini görünce ilgimi çekti.
Ax'la ilgili değil ama web'le de uğraşanlar için paylaşıyorum.

Bulunduğunuz sekmeden farklı bir sekmedeyken web sitenizin title'ının "Bizi Unutmayın!"
şeklinde değişmesini istiyorsanız, ASP.net ile yaptıyanız web sitenizin master page'ine eklemeniz yeterli olacak.

script> 
var newtitle = ‘ Bizi Unutmayın!’;
var oldtitle = document.title;
window.onblur = function () { document.title =newtitle; }
window.onfocus = function () { document.title = oldtitle; }
 /script>

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


Total ciro

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