30 Kasım 2018 Cuma

Enum | Microsoft Dynamics Ax

Aşağıdaki kod Enum'un içerisindeki seçenekleri info'da görmemizi sağlar.

static void Enum2Table(Args _args)
{
    DictEnum enum = new DictEnum(enumName2Id("DRTCompany"));
    int i;
    DRTEnum2Table   Enum2Table;
    ;
    delete_from Enum2Table;
    for (i=0; i < enum.values(); i++)
    {
        info(enum.index2Label(i));
        Enum2Table.value = i;
        Enum2Table.label = enum.index2Label(i);
        Enum2Table.insert();
    }
}

19 Kasım 2018 Pazartesi

Dynamics Ax İş Avansları

Personel iş avansı formu | Dyamics Ax

Personel hesabı üzerinden satınalma siparişinden bağımsız iş avansı girişi yapıp günlük oluşturabilecekleri formu paylaşacağım. Uzun olduğu için ara ara eklemeler yapacağım.
Form'un yapılışı ve kodlarını da paylaşacağım, günlük oluştumak için class'ı incelemek isterseniz aşağıdan ulaşabilirsiniz.

İncelemek için class'a buradan ulaşabilirsiniz > Personel iş avansları Class'ı

Diğer Form Tablo Workflow için hazırlanan dökümana buradan ulaşabilirsiniz. > İş avansları projesi

19 Eylül 2018 Çarşamba

Dynamics Ax displayOption Kulanımı

displayOption


displayOption formdaki satırları istenilen sarta göre renklendirir. kodu datasource'unda bulunan tablonun displayOption methodsuna yazarak bu işlemi yapıyorsunuz. Aşağıdaki örnekte tarihle ilgili bir şart yazıldı ve buna göre bir renkendirme tercih edildi.
public void displayOption(Common _common, FormRowDisplayOption _options)
{
    PurchLine              purchLineLocal;

    int backColor = WinAPI::RGB2int(161,161,255); // buradaki renkleri kendinize göre ayarlayabilirsiniz.
    int textColor = WinAPI::RGB2int(255, 255, 255);
    int backColorRed = WinAPI::RGB2int(255, 50, 50);
    int textColorWhite = WinAPI::RGB2int(255, 255, 255);
    ;

    purchLineLocal = _common;

         if(EtgExImpPurchLineTrans::findLastETA(purchLineLocal.InventTransId) > purchLineLocal.DeliveryDate)
        {
            _options.backColor(backColorRed);
            _options.textColor(textColorWhite);
        }

        else
        {
            _options.clearBackColor();
            _options.clearTextColor();
        }

    super(_common,_options);
}
Renk çeşitlerini aşağıdaki siteden inceleyebilirsiniz.
Renk çeşitleri
 
 
Farklı bir kullanım örneği;
 
public void displayOption(Common _common, FormRowDisplayOption _options)
{
    ETGCollateralTable   collateralTableLocal;
    ;
    collateralTableLocal = _common;
 if(collateralTableLocal.DueDate && (collateralTableLocal.DueDate - systemDateGet()) <= 7)
    {
        _options.backColor(backColor);
        _options.textColor(textColor);
    }
    else
    {
        _options.clearBackColor();
        _options.clearTextColor();
    }

    super(_common,_options);
}
 

SQL case when kullanımı

Aslında yapmak istediğimiz aşağıdaki tarihlere göre excelde bir sutun açıp karşısına uygun yazıyı yazdırmak.






CASE WHEN DATEPHYSICAL BETWEEN '1900 - 01 - 01 00:00:00' AND '1900 - 01 - 01  00:00:00' THEN 'BO' WHEN DATEPHYSICAL BETWEEN '1900 - 01 - 01 00:00:00' AND '2018 - 05 - 01  00:00:00' THEN 'DO' WHEN DATEPHYSICAL BETWEEN '2018 - 05 - 01 00:00:00' AND '2054 - 01 - 01  00:00:00' THEN 'OD' END

Lookup'ta tarih filtresi vermek

Lookup QueryBuildRange


TransDate startDate, EndDate; 

startDate = mkDate(1,9,2017);

endtDate = mkDate(1,10,2017);

queryBuildRange.value(queryRange(StartDate, EndDate));

(ya da)

queryBuildRange.value(queryRange(mkDate(1,9,2017), mkDate(1,10,2017)));

Başka bir örnek;
public void lookup()
{
    Query query = new Query();
    QueryBuildDataSource queryBuildDataSource;
    QueryBuildRange queryBuildRange;
     QueryBuildRange queryBuildRange2;
     QueryBuildRange queryBuildRange3;

    SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(SalesTable), this);

    if(DateFrom.dateValue() && DateTo.dateValue())
    {
        sysTableLookup.addLookupfield(fieldNum(SalesTable, CustAccount));

        queryBuildDataSource = query.addDataSource(tableNum(SalesTable));

        queryBuildDataSource.addGroupByField(fieldNum(SalesTable, CustAccount));

        queryBuildRange = queryBuildDataSource.addRange(fieldNum(SalesTable, createdDateTime));
        queryBuildRange.value(SysQuery::range(this.dboConvertDateToDateTime(DateFrom.DateValue()), dateNull()));

        queryBuildRange = queryBuildDataSource.addRange(fieldNum(SalesTable, createdDateTime));
        queryBuildRange.value(SysQuery::range(dateNull(), this.dboConvertDateToDateTime(DateTo.dateValue())));

        queryBuildRange = queryBuildDataSource.addRange(fieldNum(SalesTable, InventSiteId));
        queryBuildRange.value(editInventSiteId.text());

        sysTableLookup.parmQuery(query);

        sysTableLookup.performFormLookup();

    }

28 Ağustos 2018 Salı

Validate | Dynamics Ax

Belirlediğimiz tarihi ilişkili farklı tablodan kontrol edilerek kontrol ekleyebilirsiniz.

Örnek olarak ilişkisinin müşteri hesabı olduğu iki farklı tablodan birinin formunda datasource'daki ilgili alanın validate'ine aşağıdaki kodu yazarak işlem yaptırabilirsiniz.

public boolean validate() // MAA 27.08.2018
{
    boolean ret;

    ETGCustRiskLimitUpdate  CustRiskLimitUpdate;
    utcDateTime             dateTime;
    dateTime         = DateTimeUtil::addDays(DateTimeUtil::getSystemDateTime(), -90);// bugünden itibaren geçtiğimiz 90 günün tarihini alır.
  //   DRT_CustExplainTable    CustExplainTable = DRT_CustExplainTable::find(CustRiskLimitUpdate.AccountNum);

    ret = super();

      if(DRT_CustExplainTable::find(ETGCustRiskLimitUpdate.AccountNum).modifiedDateTime < dateTime // maa 27.08.2018
        &&  ETGCustomerRisk::find(ETGCustRiskLimitUpdate.AccountNum).CreditLimit < ETGCustRiskLimitUpdate.NewCreditMax
        &&  CustClassificationGroup::findGroup(CustTable::find(ETGCustRiskLimitUpdate.AccountNum).CustClassificationId).CustRiskLimit == NoYes::No) // müşteri sınıflandırma grubu
            {
                return checkfailed(strfmt("%1 carisinin müşteri detay açıklamaları alanını güncellemeniz gerekmektedir!", ETGCustRiskLimitUpdate.AccountNum));
            }

    return ret;
}
DRT_CustExplainTable tablosuyla ilişkisini kurabilmek için iki tablodaki tekil olan CustAccount'u kullanarak find yazıyoruz.
static DRT_CustExplainTable find(CustAccount   _custAccount,
                      boolean       _forUpdate = false) // MAA 13.08.2018
{
    DRT_CustExplainTable DRT_CustExplainTable;
    ;

    if (_custAccount)
    {
        if (_forUpdate)
            DRT_CustExplainTable.selectForUpdate(_forUpdate);

        select firstonly DRT_CustExplainTable
            where DRT_CustExplainTable.CustAccount == _custAccount;
    }
    return DRT_CustExplainTable;
}

10 Ağustos 2018 Cuma

Satış siparişleri | Dynamics Ax

Satış siparişinde cariye ait borca uyarı verdirme


Örnek: Bir müşteriye ait vadesi geçmiş borcu olduğunda
(Müşteri ayrıntıları > İşlevler > Açık hareket düzenleme);  ilgili cariye  satış siparişi oluştururken aşağıdaki gibi bir bilgi verilmesi isteniyorsa;

SalesTable'ın methods'una aşağıdaki kodu yazdığınızda satış siparişi girerken bu bilgiyi size verecektir.

boolean  checkAccount()
{
    CustTransOpen                    CustTransOpen;
    CustTrans                        CustTrans;
    ;

   while select   CustTransOpen // MAA 10.08.2018
        where CustTransOpen.AccountNum == this.CustAccount
           && CustTransOpen.AmountCur > 0

     while select CustTrans
           where CustTrans.RecId == CustTransOpen.RefRecId

            if (CustTransOpen.DueDate < systemdateget())
                  {
                    info(strfmt("%1 carisinin vadesi geçmiş bakiyesi var!", CustTransOpen.AccountNum));
                  }


    return true;
}


8 Ağustos 2018 Çarşamba

Varsayılan sipariş ayarları tesis düzenlemesi

Varsayılan sipariş ayarları

 Maddenin üzerindeki Kurulum > varsayılan sipariş ayarları alanında aşağıdaki formda Satınalma, Stok ve Satış tesisi düzenlemesine izin vermiyorsa sistem bunun sebebi;


Formun datasource'unda bulnan InventItemPurchSetup, InventItemInventSetup, InventItemSalesSetup'taki tablolarda ilgili kaydın olmamasıdır (AllBlank'li olacak),


Aşağıdaki gibi kayıt oluşturduğunuzda problem gidecektir.( InventDimId, InventDimIdDefault'ları AllBlank seçin)


3 Ağustos 2018 Cuma

Ücretsiz toplu mail gönderme

Ücretsiz toplu mail

Toplu mail gönderiminde belirli bir sınırı aşınca toplu olarak mail gönderilemiyor.
Mailchimp bunun için ideal çözümlerden bir tanesi. Sizin adınızla toplu şekilde mail gönderebiliyorsunuz. 

https://mailchimp.com/ adresine girip hesap oluşturun sonrasında kullanmaya başlayabilirsiniz.
Youtube'ta kullanımı sade bir şekilde anlatılmış izleyip işlemlerinizi yapabilirsiniz.


30 Temmuz 2018 Pazartesi

Stok Yönetimi > Hareketler'e referansına göre oluşturma tarihi getirme

Stok yönetimindeki Hareketler'e referansına göre ilgili tablolardan oluşturma tarihi ve saatini almak için aşağıdaki şekilde bir display method yazabilirsiniz.

//MAA 30.07.2018
display utcDatetime dispCreateDate()
{
     InventTrans InventTrans;

  if (InventTrans::findTransId(this.InventTransId).TransType == InventTransType::Sales)
    {
     return  salestable::find(SalesLine::findInventTransId(this.InventTransId).SalesId).createdDateTime;
    }

   else if (InventTrans::findTransId(this.InventTransId).TransType == InventTransType::ProdLine)
    {
     return  ProdTable::find(this.TransRefId).createdDateTime;
    }

   else if (InventTrans::findTransId(this.InventTransId).TransType == InventTransType::Production)
    {
     return  ProdTable::find(this.TransRefId).createdDateTime;
    }

   else if (InventTrans::findTransId(this.InventTransId).TransType == InventTransType::Purch)
    {
     return  PurchTable::find(PurchLine::findInventTransId(this.InventTransId).PurchId).createdDateTime;
    }

   else
    {
     return InventTrans.createdDateTime;
    }
}

Deftere nakil problemi | Dynamics Ax

Deftere nakil problemi

Satınalma siparişlerinde, bir cariye ait birden fazla siparişi faturalarken, aşağıdaki alanda kaç sipariş birleşecekse o kadar satır oluşuyor. Eğer siz düzenle demeden tamam butonuna basarsanız Ax siparişini bekleyeni de aşıyor direk faturalıyor ve bu çok riskli bir durum.
Muhasebenin fatura kontrolü olmuyor bu durumda. Düzenle denildiğinde ise burada bulunan satırları birleştirip tek fatura olarak işlemlerinizi yapabiliyorsunuz.


Bunun önüne geçmek için şöyle bir çözüm düşündüm, birden fazla satır varsa, kullanıcı Tamam butonuna dalgınlıkla da olsa basamasın, ancak düzenle deyip tek satırda birleştirince Tamam diyebilsin şeklinde düzenlersek bunu engellemiş oluruz.

Bu kayıtlar Ax'ta PurchParmTable'da tutuluyor, burada ilgili siparişin satır sayısını elime alırsam buna göre bir kural yazıp istediğimi yapmış olurum.

PurchParmTable'ın methods'una aşağıdaki kodu yazıyoruz. Bu kod deftere nakil dediğimizde ilgili siparişlerin sayısını buluyor.  ParmId alanı birleştirmeye çalıştığımız siparişlerin tamamına aynı numarayı veriyor. ParmId ve OrderAccount'u where'e koyduğumda ilgili siparişi elime almış olurum ve buradan da satır sayısına ulaşırım.




int numberOfLinesPurchParm() // MAA 26.07.2018
{
    return any2int((select count(RecId) from PurchParmTable where PurchParmTable.OrderAccount == this.OrderAccount && PurchParmTable.ParmId  == this.ParmId).RecId);
} 

Daha sonra formun datasource'unda bulunan PurchParmTable'ın active'ıne aşağıdaki şekilde şartları yazdığımda istediğimizi yapmış oluruz.

    if (PurchParmTable.numberOfLinesPurchParm() == 1) //MAA 26.07.2018
         {
            OkButton.enabled(true);
         }

    else if (PurchParmTable.numberOfLinesPurchParm() > 1)
         {
            OkButton.enabled(false);
         }

Daha önce yazdığım yazıyı da inceleyebilirsiniz.

24 Temmuz 2018 Salı

Forma field'ı getirme

Tablodaki alanlardan hangi satır üzerindeyseniz ilgili field'ın değerini aşağıdaki şekilde getirebilirsiniz. Sadece TittleField1'i seçebilirsiniz. Ya da her ikisi de (TittleField1, TittleField2) seçip formun üst tarafınfa görebilirsiniz.


Aşağıdaki gibi karşınıza çıkacaktır.


23 Temmuz 2018 Pazartesi

View'e kodsuz range verme

View Range

Oluşturduğunuz bir view'e kod eklemeden range verebilirsiniz. 
Örneğin satış siparişlerinde durumu iptal edil olanları listelemek için aşağıdaki yöntem sizin işinizi çözecektir.

 

Start Position | Dynamics Ax

StartPosition : First


StartPosition : Last


Formun DataSource'undan bu ayarlamayı yapabilirsiniz.

16 Temmuz 2018 Pazartesi

Satış siparişlerinde örnek rapor | Dynamics Ax

Sizden ekrandaki gibi satış siparişiyle, müşteri hesabıyla vs. filtreleme yapabilecekleri bir rapor istenirse şu adımları izleyerek yapabilirsiniz;


Raporda kullacağımız tabloları oluşturacağımız formun datasource'una ekliyoruz.


Sonrasında form oluşturuyoruz, formun classDecleration'una kullanacağımız fieldların tanımlamalarını yapıyoruz, filtrelemeleri de eklediğimiz formun methodsuna aşağıdaki şekilde kodlarımızı ekliyoruz;

public class FormRun extends ObjectRun
{
    SalesId     Salesid;
    ItemId      itemid;
    CustAccount custAccount;
}

satış siparişi için:

edit CustAccount custAccount(boolean set, CustAccount _custAccount = custAccount)
{
    if (set)
    {
        custAccount = _custAccount;
        SalesTable_ds.executeQuery();
    }
    return salesid;
}

müşteri hesabı için:


edit SalesId Salesid(boolean set, SalesId _salesid = salesid)
{
    if (set)
    {
        salesid = _salesid;
        SalesTable_ds.executeQuery();
    }
    return salesid;
}

Filtreleri sıfırlamak için :

void clearRange()
{
    QueryBuildDataSource    qbds;
    ;

    if(SalesCustTxt.text() != '' || SalesIdtxt.text() != '' )
    {
        qbds = SalesLine_ds.query().dataSourceTable(tablenum(SalesLine));
        qbds.clearRanges();

        this.Salesid(true, '');
        this.custAccount(true, '');
        SalesLine_ds.executeQuery();
    }
}

Filtrelerde ilgili işlemleri bu şekilde yapıyoruz. Siparişin toplam miktarı için SalesTable'ın methods'una şu kodu ekliyoruz :

display real TotalSales()//MAA 19.03.2018
{
    return (select sum(SalesQty) from SalesLine where SalesLine.SalesId == this.SalesId).SalesQty;
}

Satış siparişlerinde filtreleme yaparken eklediğimiz field'e bütün siparişler geliyor olacaktır. Bütün siparişlerin raporda gelmesi istenmeyebilir. Örneğin iptal edilenler ya da ihracat siparişlerinin görünmesini engellemek için eklediğimiz fieldlerin lookup'ını eziyoruz.



public void lookup()
{
    Query                   query = new Query();
    QueryBuildDataSource    queryBuildDataSource;
    QueryBuildRange         queryBuildRange;
    SysTableLookup          sysTableLookup;
    ;

    sysTableLookup = SysTableLookup::newParameters(tablenum(SalesTable), this);
    sysTableLookup.addLookupfield(fieldnum(SalesTable, SalesId));
    sysTableLookup.addLookupfield(fieldnum(SalesTable, SalesName));
    sysTableLookup.addLookupfield(fieldnum(SalesTable, CustAccount));

    queryBuildDataSource = query.addDataSource(tablenum(SalesTable));

    if(SalesIdtxt.text())
        queryBuildDataSource.addRange(fieldnum(SalesTable, SalesId)).value(SalesIdtxt.text());

        queryBuildRange = queryBuildDataSource.addRange(fieldnum(SalesTable, SalesPoolId));
        queryBuildRange.value('!IHRACAT');

        queryBuildRange = queryBuildDataSource.addRange(fieldnum(SalesTable, TaxGroup));
        queryBuildRange.value('!YURTDISI');

        queryBuildRange = queryBuildDataSource.addRange(fieldnum(SalesTable, SalesStatus));
        queryBuildRange.value('!İptal edildi');

    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
}

Raporumuz bu şekilde tamamlanmış oluyor. Yararlı olması dileğiyle :)

28 Haziran 2018 Perşembe

İlişkili tablodan verileri otomatik çekme | Dynamics Ax

Sizden tablonuzda sicil numarasını seçip persoenelin adı ve departmanı otomatik olarak gelmesi istenirse, aşağıdaki şekilde tablonuzun methodsunda modifiedField'ına yazabilirsiniz.

public void modifiedField(fieldId _fieldId)
{
     super(_fieldId);
     switch (_fieldId)
    {
        case (fieldnum(DRT_EnvanterTransTable,EmplID)) :
            this.EmplName     = EmplTable::find(this.EmplID).Name;
            this.Dimension[1] = EmplTable::find(this.EmplID).Dimension[1];
        break;
    }
}

27 Haziran 2018 Çarşamba

Bir tablodaki alanın adını kodla bulma | Dynamics Ax


static void FieldName(Args _args)
{
    SysDictField dict;
    str label;
    ;

    dict = new SysDictField(tablenum(CustTrans), fieldNum(CustTrans,PostingProfile));
    label = dict.label();
    info(strfmt("%1", label));
}

26 Haziran 2018 Salı

Display bir alana ilişkili bir tablodan alan getirme | Dynamics Ax

Bir tabloya, viewe vs. display olarak bir alan eklediniz ve bu alanla ilişkili bir alanı çekmek istiyorsanız aşağıdaki gibi yapabilirsiniz. 

Eklediğiniz display alan;


display VendAccount ETGExImpVendAccount()
{;
 return PurchTable::find(this.PurchId).OrderAccount;
}


İlişkili tablodan çekmek istediğiniz farklı bir alan;


display VendName ETGExImpVendName()
{;
 return VendTable::find(this.ETGExImpVendAccount()).Name;
}

25 Haziran 2018 Pazartesi

Tümünü seç, kaldır | Dynamics Ax

Formda kayıtların tümünü seçmek ya kaldırmak istiyorsanız, öncelikle iki adet buton ekleyip ve click methoduna aşağıdaki gibi kodları yazarak yapabilirsiniz.


Tümünü seç yapmak için;

 



void clicked()
{
  AtmSalesPickingListJournalTable atmtable;
  AtmSalesPickingListJournalLine  atmDetail;
  ;
  super();
  ttsbegin;

  while select AtmTable where atmtable.PickingListId ==  AtmSalesPickingListJournalTable.PickingListId
  {

    while select  forupdate atmDetail where atmdetail.PickingListDate == atmTable.PickingListDate &&
                                            atmdetail.PickingListId   == atmTable.PickingListId

    {
        atmdetail.DIIB = Noyes::Yes ;
        atmDetail.update();

    }

 }
  ttscommit;

   AtmSalesPickingListJournalLine_ds.executeQuery();


}

Tümünü kaldır için;



void clicked()
{
  AtmSalesPickingListJournalTable atmtable;
  AtmSalesPickingListJournalLine  atmDetail;
  ;
  super();
  ttsbegin;

  while select AtmTable where atmtable.PickingListId ==  AtmSalesPickingListJournalTable.PickingListId
  {

    while select  forupdate atmDetail where atmdetail.PickingListDate == atmTable.PickingListDate &&
                                            atmdetail.PickingListId   == atmTable.PickingListId

    {
        atmdetail.DIIB = Noyes::No ;
        atmDetail.update();

    }

 }
  ttscommit;

   AtmSalesPickingListJournalLine_ds.executeQuery();

} 

Total ciro

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