27 Şubat 2018 Salı

Dynamics Ax Kısa yollar(Filtreleme)

Veri Filtreleme
CTRL+F
Geçerli alanı filtrelemek için kullanılır. Ekran açılır. Hangi alan üzerine tıklandı ise o alan için filtreleme kutusu açılır.


ALT + F3

Örneğin fatura hesabının üzerindeyken ALT + F3’e bastığınızda, otomatik olarak aşağıdaki gibi listeleme yapar.


CTRL + F3
Sorgulama ekranı açılır ve kompleks filtreler yapılabilir.


ALT + F9
Bir kaydı siler.

CTRL + F5
Degisiklikleri iptal eder, etkin kaydı geri yükler.

CTRL + Yukarı ok
İmlecin bulunduğu sütunun filtre alanına gider.

CTRL + Shift + F3
Tüm filtreleri temizler.

Arama kutularında yapılabilen sorgular;
- Yalnızca bir kayıt değil de bir kayıt aralığı filtrelenmek isteniyorsa, aynı arama kutusuna sırayla, arama aralığının ilk kaydı, iki nokta ve arama aralığının son kaydı yazılır.
Örneğin 01.01.2018..05.01.2018 bu iki tarih arasındaki kayıtlar listelenir.
Diğer örnek; 01.01.2018..05.01.2018, !02.01.2018..04.01.2018 01.01.2015 ile 05.01.2018 tarihlerinde 02.01.2018, 04.01.2018 tarihleri arasında kalanlar gelmesin şeklinde listelenir.



- Aranacak kaydın sadece birkaç karakteri biliniyorsa, arama kutusuna sırasıyla, bilinen karakterler ve ardından, AX’da joker karakter olarak kullanılan yıldız (*)karakteri yazılır.
Örneğin, müşteriler tablosunda “Müşteri hesabı” 30 ile başlayan kayıtları filtrelemek için ; 30* 30 ile bitenleri filtrelemek için *30 İçerisinde 30 geçenler için *30*
- Verilen değerden farklı olan kayıtları aramak için de “Ünlem”(!) karakteri kullanılır.
Örneğin müşteriler tablosunda “Para Birimi” alanının değeri “EUR” değerinden farklı olanları filtrelemek için !EUR
- Aranacak alanda x karakter uzunluğundaki kayıtların listelenmesini istiyorsanız;
Örneğin, filtre alanına 1?? yazarsanız, 1 ile başlayan 3 haneli kayıtları listeler.


Doküman için tıklayın.
Daha geniş filtrelemeleri görmek için tıklayın.
Doküman 2 için tıklayın.

22 Şubat 2018 Perşembe

Örnek Dynamics Ax Projesi | İki tarih arasındaki kayıtları bulup hesaplama yaptırma

Girilen iki tarih arasındaki(Sevk tarihi seçtim siz başka bir tarih seçebilirsiniz) satış siparişlerini süzüp siparişin içerisindeki istenilen alanda hesapla yaptırarak kontrol edebileceğiniz bir örnek üzerine çalışma yaptım.

DRT Sales adında verilerin hesaplanıp ekleneceği bir tablo oluşturdum. Sonrasında hangi alanları istiyorsam bu formda görmek istiyorsak onu ekleyelim.


Daha sonraformun design'ine gelip filter için kullanacağımız tarih alanları ve buton ekleyelim.


Butonun click'ıne hesaplama yapacağımız methodu çağırıyoruz.

void clicked()
{
     delete_from DRTSales where DRTSales.UserId ==curuserid();

     element.CalcSales();
}
Çağırdığımız bu method oluşturduğumuz formun methods kısmında yer alacak.

Butonun click'ıne hesaplama yapacağımız methodu çağırıyoruz.
void CalcSales()
{
    Query                       q;
    QueryBuildDataSource        qbdsSalesLine;
    QueryBuildDataSource        qbdsSalesTable;
    QueryRun                    queryRun;

    SalesLine       salesLine;
    SalesTable      salesTable;
    DrtSales        DrtSls;
    InventTable     inventTable;
    ;

    q = new Query();

    qbdsSalesLine  = q.addDataSource(tablenum(SalesLine));
    qbdsSalesLine.addRange(fieldNum(SalesLine, ShippingDateRequested)).value(SysQuery::range(StartDate.dateValue(), EndDate.dateValue()));
    qbdsSalesLine.addRange(fieldNum(SalesTable, SalesId)).value('SS*');
    qbdsSalesLine.addRange(fieldNum(SalesTable, SalesStatus)).value(SysQuery::value(SalesStatus::Backorder));
    SalesLine.SalesId = SalesTable.SalesId;

    queryRun  = new QueryRun(q);
    while (queryRun.next())
    {
        salesLine            = queryRun.get(tablenum(SalesLine));
        inventTable          = InventTable::find(SalesLine.ItemId);
        {
            DrtSls.clear();
            DrtSls.SalesId     = salesLine.SalesId;
            DrtSls.SalesStatus = salesLine.SalesStatus;
            DrtSls.SalesPrice  = salesLine.SalesPrice;
            DrtSls.SalesQty    = salesLine.SalesQty;
            DrtSls.ItemId      = salesLine.ItemId;
            DrtSls.TransDate   = salesLine.ShippingDateRequested;
            DrtSls.standardPalletQuantity = (SalesLine.SalesQty) * (inventtable::find(salesline.ItemId).NetWeight) ; // siparişin toplam ağırlığını hesaplar
            DrtSls.Qty         = salesLine.SalesQty *  salesLine.SalesPrice;
            DrtSls.UserId           =  curuserid();

            DrtSls.insert();
        }
    }

    DrtSales_DS.research();
    info("Hesaplandı...");
}
Siz istediğiniz ilişkili bir tablodan alanı elinize alıp hesaplama ya da formda gözükmesini sağlayabilirsiniz. Projeyi indirmek için tıklayın.

14 Şubat 2018 Çarşamba

Satış siparişi içerisine kontrol ekleme | Dynamics Ax

Örnek olarak yurtiçi satış siparişlerinde Nakliye bedeli zorunlu olsun fakat yurt dışı siparişlerinde olmasın diye bir kontrol ekleyecek olursak aşağıdaki kodu DataSource'un içindeki SalesLine'ın write'ına ekleyebilirsiniz.
if((SalesPool::find(SalesTable.SalesPoolId).ihracat == NoYes::No || CustGroup::find(SalesTable.CustGroup).EtgExImpIsExport == NoYes::No) && (!SalesLine.ETGFreightPaymMode)) // MAA 14.02.2018
            {
                throw error ("@ETG448");
            }
}

Kontrolleri satış siparişinin içerisindeki Havuz alanın ve müşterilerin içerisindeki Müşteri gruplarında bulunan ihracat alanın durumuna göre yapıldı. İhracat tikli ise yurtdışı siparişi değilse yurtiçi siparişidir.

13 Şubat 2018 Salı

Formda bir buton yardımıyla istenilen alanlarda güncelleme yapma | Dynamics Ax

void clicked()
{
    switch (Box::okCancel(strfmt("'%1, %2 %3' sevk edilebilir olarak işaretlenecek!\n\nEmin misiniz?", SalesLine.itemName(), SalesLine.SalesQty, SalesLine.SalesUnit), DialogButton::Cancel))
    {
        case DialogButton::Ok:
            ttsbegin;
                SalesLine.DrtCanBeDelivered     =   NoYes::Yes;
                SalesLine.ReceiptDateConfirmed  =   systemdateget();// Sistemden bugünün tarihini alır
                SalesLine.doUpdate();

                if (SalesLine.ReceiptDateConfirmed > SalesLine.ShippingDateRequested) // MAA 13.02.2018 
                {
                  SalesLine.ShippingDateRequested = datenull();
                  warning ("Talep edilen sevk tarihi Teyit edilen giriş tarihinden önce olamaz!");
                  SalesLine.doUpdate();
                }
            ttscommit;
            SalesLine_DS.research();
            break;
    }
    //super();
}
}

12 Şubat 2018 Pazartesi

İki alanın tek alanda gösterilmesi(Display)

display String50 dispStateCounty()
{
    return strfmt("%1 / %2", SalesLine::findInventTransId(this.inventTransId).DeliveryState, SalesLine::findInventTransId(this.inventTransId).DeliveryCounty);
}

25 Ocak 2018 Perşembe

Kodla bir gruba menuye ve tabloya yetki verme

Ax'ta bir kullanıcı grubuna, istediğiniz forma ya da tabloya yetki vermek için aşağıdaki kodu çalıştırabilirsiniz.
// sadece bir gruba yetki verirken kullanılır.
static void MAA_ChangeAccess_OneGroup(Args _args)
{
   SecurityKeySet          swSysSecurity;
   UserGroupList           userGroupList;
   DomainInfo              domainInfo;
   #admin

   ttsbegin;

   while select domainInfo
        //where domainInfo.id == #AdminDomain   //sadece belirli domainler için çalıştırmak istersen
   {
       while select userGroupList
         where userGroupList.groupId     == "10-03"
       {
           swSysSecurity = SysSecurity::constructSecurityKeySet();
           swSysSecurity.loadGroupRights(userGroupList.groupId, domainInfo.id);
             
           swSysSecurity.tableAccess(tablenum(VENDBANKACCOUNT), AccessType::View); // tabloya yetki
           swSysSecurity.menuItemAccess("ETGCustRiskLimitUpdateAppApproval", AccessRecordType::MenuItemAction, AccessType::View); // menuye yetki

           xAccessRightsList::saveSecurityRights(swSysSecurity.packTouched(), userGroupList.groupId, domainInfo.id);
       }
   }

   ttscommit;
   info("tamamlandı");
}

Verileri Excelle Aktarma

Verilerinizi excelle aktarmak için. bir buton ekleyip click'ine aşağıdaki kodu eklededikten sonra;
void clicked()
{
    super();

    element.updateFromExcel();


    DRTCreateProdDemandsTable_ds.query().dataSourceTable(tablenum(DRTCreateProdDemandsTable)).sortClear();
    DRTCreateProdDemandsTable_ds.query().dataSourceTable(tablenum(DRTCreateProdDemandsTable)).addSortField(fieldNum(DRTCreateProdDemandsTable,Qty),SortOrder::Descending);
    DRTCreateProdDemandsTable_ds.executeQuery();
}
Formun methods kısmına kodları eklediyip excelinizdeki verileri aktarabilirsiniz.

void updateFromExcel()
{
    #Excel
    #AviFiles

    Dialog                  dialog = new Dialog("Excel veri aktarma");
    DialogField             dialogPath;
    FilenameFilter          filter = ['Excel files 2010','*.xlsx','Excel files 2003', '*.xls' ];
    FilenameOpen            filePath;
    SysExcelApplication     application;
    SysExcelWorkBooks       workBooks;
    SysExcelWorkBook        workBook;
    SysExcelWorkSheets      workSheets;
    SysExcelWorkSheet       workSheet;
    SysExcelCells           cells;
    SysOperationProgress    progress;
    SysExcelRange           range;
    Int                     NoofSheet,i,lastRow,sn;
    DRTCreateProdDemandsTable     ProdDemandsTable;

    void findLastRow(SysExcelWorkSheet _workSheet)
    {
        #define.Star('*')
        #define.Space(' ')

        ;

        range = _workSheet.cells().range(#ExcelTotalRange);

        try
        {
            // Finds the row where the first contents is found.
            range = range.find(#Star, null, #xlFormulas, #xlWhole, #xlByRows, #xlPrevious);
        }
        catch (Exception::Error)
        {
            error("@SYS59926");
        }

        if (range)
        {
            lastRow = range.row();
        }
        else
        {
            lastRow = 0;
        }
    }
    ;

    dialog.filenameLookupFilter(filter);
    dialogPath  = dialog.addField(typeid(FilenameOpen));

    if (dialog.run())
    {
        if(dialog.closedOk())
        {
            filePath            = dialogPath.value();
            application         = SysExcelApplication::construct();
            application.visible(false);
            workBooks           = application.workbooks();
            workBooks.open(filePath,0,true);

            workSheets          = workBooks.item(1).worksheets();
            noOfSheet           = worksheets.count();
            progress = new SysOperationProgress();
            progress.setCaption("Plan aktarılıyor");
            progress.setTotal(lastRow);
            progress.setAnimation(#AviTransfer);
            setprefix("Plan aktarımı başladı");

            try
            {
                For( i = 1; i <= noOfSheet; i++)
                {
                    workSheet       = workSheets.itemFromNum(i);
                    if(workSheet)
                    {
                        findLastRow(workSheet);
                        for(sn = 2;sn <= lastRow;sn++)
                        {
                            ttsbegin;

                            cells = workSheet.cells();
                            ProdDemandsTable.clear();
                            select forupdate ProdDemandsTable
                                where ProdDemandsTable.itemid == cells.item(sn,1).value().bStr();
                            if ( ProdDemandsTable.RecId )
                            {
                                ProdDemandsTable.Qty           = cells.item(sn,2).value().double();
                                ProdDemandsTable.Notes         = cells.item(sn,3).value().bStr();
                                ProdDemandsTable.ConfigId      = cells.item(sn,4).value().bStr();
                                ProdDemandsTable.InventSizeId  = cells.item(sn,5).value().bStr();
                                ProdDemandsTable.InventColorId = cells.item(sn,6).value().bStr();
                                ProdDemandsTable.InventDimId   = cells.item(sn,7).value().bStr(); // MAA
                                ProdDemandsTable.ETGGroupId2   = cells.item(sn,8).value().bStr();
                                ProdDemandsTable.InventDimCombinationName   = cells.item(sn,9).value().bStr();
                                ProdDemandsTable.InventSizeName             = cells.item(sn,10).value().bStr();

                                ProdDemandsTable.doupdate();
                            }
                            else
                                info(strfmt("%1 bulunamadı.", cells.item(sn,1).value().bStr()));

                            ttscommit;
                        }
                    }
                }
            }
            catch
            {
                ttsabort;
                application.quit();
            }
        }
    }
}
exceli görmek için tıklayın.

Oluşturma tarihini display olarak farklı bir forma ekleme

Örneğin sizden satış siparişinin oluşturma tarihini farklı bir formda isteniyorsa display olarak aşağıdaki şekilde ekleyebilirsiniz.

display utcDatetime dispSalesCreateDate()
{
  return salestable::find(SalesLine::findInventTransId(this.InventTransId).SalesId).createdDateTime;
}

18 Ocak 2018 Perşembe

Dynamics Ax | Deftere nakli kontrollü hale getirebilirsiniz.

Kullanıcılar girdikleri siparişleri Deftere naklederken yetkisi varsa farkında olmadan PurchParmTable'da beklemede tikini kaldırmaya yetkisi varsa; farkında olmadan bu alanı tikleyip faturalaştırabilirler. Bu da muhasebesel açıdan çok büyük bir probleme yol açabilir. Bir tablodaki alanın yetkisini yönetmek daha zor olduğu için tablodan düzenlemeye kapattıktan sonra, beklemede alanın görevini bir butona verip yetkisini de ilgili departmana verirseniz yönetmeniz daha kolay olabilir.

Beklemede butonunun click method'una kodları yazdığınızda tikleme görevini buton yapacaktır.

void clicked()
{
    super();

    element.hold();
}
void hold() //MAA 10.01.2017
{
    PurchTable  purchTbl;

    if ((PurchTable::find(PurchParmTable.PurchId).PurchId == PurchParmTable.PurchId) && PurchParmTable.ETGHold == NoYes::Yes)
     {
        PurchParmTable.ETGHold =NoYes::No;
        PurchParmTable.doUpdate();
     }
}

Butonun yetkilerini de aşağıdaki gibi SecurityKey ve ConfigurationKey'den verebilirsiniz.

Bu konuyla ilgili farklı bir önlemi daha inceleyebilirsiniz.

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

Total ciro

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