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 :)

Total ciro

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