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

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;

Total ciro

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