Archive for the ‘ Dynamics AX ’ Category

Dynamics Ax 2012′de ana tablo yapısındaki değişiklikler

Merhaba

Dynamics ax 2012 ile birlikte alışık olduğumuz bir çok teknolojide değişiklikler oldu. Bunlardan en temel olanlarından biride PrimaryKey yapısı. Eski versiyon eğitimlerinde sürekli söylediğim bir cümle vardı. “Ax akıllı kod kullanmak için performanstan ödüne vererek ana tablolarda string keyler kullanır.” bu cümle ax 2012 için geçerli değil. Hem akıllı kod kullanmak hemde key’i int yapmak artık mümkün. Tablolar için yeni bir Integer key oluşturmaya gerek yok. Bildiğiniz gibi her tabloda RecId alanımız mevcut. Bizim ilk eskiden beri öğrendiğimiz “her bir tablonun bir tane integer key alanı olur ve diğer tablolarla ilişkileri bu alan sayesinde kurulur” ifadesi ax içinde artık geçerli. Eski versiyonlarda olan string key hala yapabiliyoruz. Bunu başka bir yazımda anlatacağım. Bu yazımda RecId ile nasıl ana tablo yapılır bir örnekle anlatmaya çalışacağım. Adım adım ilerleyelim.

  1. Bir kitap tablomuz olsun. Birde kitap satış tablosu olsun.  FDBookTable içine BookName adında string bir alan açalım. Bu alan için bir indeks oluşturalım ve aşağıda görünen tanımları yapalım.
  2. FDBookTable genel yapısı için bu tanımları yapalım.
  3. BookNameIdx indeksini oluşturalım ve tanımları yapalım.
  4. FDBookTable özelliklerinde key tanımlarını yapalımPrimaryIndex ve ClusterIndex surrogateKey olmalı. SurrogateKey RecId index demek aslında.
  5. Int64 tipinde bir EDT oluşturalım.
  6. EDT özelliklerinde referans tablo olarak kitap tablomuzu seçiyoruz ve Table References kısmında da RecId ile referans tanımı yapıyoruz.
  7. Bu işlemlerden sonra ana tablo yapabilmek başka tablolarla ilişki kurmak için ihtiyacımız olan tanımları yapmış olduk. Bu aşamada FDBookLine isminde bir tablo oluşturup FDBookTableRecId EDT sini sürükleyip Fields kısmına bıraktığınızda sizden FDBookTable ile ilişki kurmak için bir onay sorusu çıkacaktır. Onay vermelisiniz. Aşağıdaki resimde görünen tanımları otomatik yapmış olacak. Eğer sorun olursa elle de oluşturabilirsiniz.
  8. Bir form yapalım ve veri kaynağına FDBookLine tablosunu ekleyelim. Tasarım kısmına bir Grid oluşturup veri kaynağında FDBookTableRecId alanını sürükletip Grid üzerine bırakalım. Otomatik olarak ReferanceGroup oluşmalı ve sizin BookNameIdx indeksinde eklediğiniz sütunları otomatik oluşmalıdır. Eğer oluşmuyorsa bir bu kısma kadar olan adımlarda bir eksiklik yapmışsınız demektir.
  9. Formu açmadan önce Kitap tablosunu açıp bir kaç kitap tanımı yapalım.
  10. Artık kitap satış formu açıp giriş yapabilirim. Gördüğünüz gibi Lookup ta kitap isimlerini görüyorum ve ona göre süzme işlemleri yapabiliyorum. Seçtikten sonrada Grid ekranında kitap isimlerini görüyorum ve Grid üzerinde de süzme yapabiliyorum isim üzerinden. en güzel tarafı ise FDBookLine tablosuna gidip baktığınızda kitap isimlerin yerinde Kitap tablosunun RecId’sini göreceksiniz. Bunu sağlayan bir kaç yapı var öncelikle Veri kaynağında Referance Data Sources kısmı bide Referance Group kısmı. Bu iki kısımda çok ayrıntı var ilerde bunlara da değineceğim.
  11. Benim fikrim bu teknolojiyle birlikte ana tablo tanımlarını RecId üzerinden yapmak lazım. Eski yapılan geliştirmeleri hemen değiştirmeye gerek yok ancak performans sıkıntısı olan kısımlarda değiştirmek lazım.

    Projeyi indirmek için tıklayın.

    Selamlar.

Dynamics Ax 2012′de aktif finansal boyutları bulmak

Merhaba

Belli bir kurulum için aktif boyutları bulan bir kod örneği paylaşıyorum. Bazı işlemlerde ihtiyaç oluyor.

static void FD_GetActiveFinancialDim(Args _args)
{
    DimensionAttribute          dimAttr;
    DimensionAttributeSetItem   dimAttrSetItem;
    DimensionEnumeration        dimensionSetId;
    ;

    dimensionSetId = DimensionCache::getDimensionAttributeSetForLedger();

    while select dimAttr
        where dimAttr.Type != DimensionAttributeType::MainAccount
        join RecId from dimAttrSetItem
            where dimAttrSetItem.DimensionAttribute    == dimAttr.RecId
               && dimAttrSetItem.DimensionAttributeSet == dimensionSetId
    {
        info(strFmt("%1 , %2" ,dimAttr.RecId , dimAttr.Name));
    }
}

Çıktısı şöyle;

Selamlar.

Dynamics Ax 2012′de bir müşterinin boyutlarını listelemek

Merhaba

Bu örnekte bir müşteri üzerinde tanımlanmış boyutları ve değerlerini listeleyen bir select cümleciği yazdım. Burada değer girilmemiş boyutlar gelmeyecektir. Hangi boyutların aktif olduğunu gösteren bir select ifadesini gelecek yazımda paylaşacağım.

static void FD_AddCustDefaultDim(Args _args)
{
    CustTable                           custTable;
    DimensionAttribute                  dimAttr;
    DimensionAttributeValue             dimAttrValue;
    DimensionAttributeValueSetItem      dimAttrValueSetItem;
    ;

    while select custTable
    where  custTable.AccountNum  == "1101"
    join dimAttrValueSetItem
    where dimAttrValueSetItem.DimensionAttributeValueSet ==custTable.DefaultDimension
    join dimAttrValue
         where dimAttrValue.RecId  == dimAttrValueSetItem.DimensionAttributeValue
         join dimAttr
         where dimAttr.RecId   == dimAttrValue.DimensionAttribute
    {
        info(strFmt("%1 ; %2 ; %3 ; %4", CustTable.AccountNum , CustTable.name(),
                        dimAttr.Name , dimAttrValueSetItem.DisplayValue));
    }
}

Çıktısı benim boyut kurulumuma göre şöyle oluyor.

Selamlar.

Dynamics Ax 2012′de DefaultDimension sorgu örnekleri

Merhaba

Şu yazımda BusinessUnit boyutunun değeri “20″ olan müşterileri listeleyen bir query yazmıştım. Bu query örneğinin select ifadesiyle yazılmış şeklini iki örnekle anlatacağım.

Bu örnekte gerekli bütün tabloları join’leyip istediğimiz sonuca ulaşıyoruz.

static void FD_AddCustDimensionRangeSelectAll(Args _args)
{
CustTable                           custTable;
DimensionAttribute                  dimAttr;
DimensionAttributeValue             dimAttrValue;
DimensionAttributeValueSetItem      dimAttrValueSetItem;
;

while select custTable
join dimAttrValueSetItem
where dimAttrValueSetItem.DimensionAttributeValueSet == custTable.DefaultDimension
&&    dimAttrValueSetItem.DisplayValue               == "20"
join dimAttrValue
where dimAttrValue.RecId == dimAttrValueSetItem.DimensionAttributeValue
join dimAttr
where dimAttr.RecId             == dimAttrValue.DimensionAttribute
&&    dimAttr.BackingEntityType == tableNum(DimAttributeOMBusinessUnit)

{
info(strFmt("%1 ; %2 ; %3 ; %4", CustTable.AccountNum ,
dimAttr.Name , dimAttrValueSetItem.DisplayValue , CustTable.name()));
}
}

Bu örnekte ise DimensionAttributeValue ve DimensionAttributeValueSetItem yerine Bir view kullanıyoruz.

static void FD_AddCustDimensionRangeSelect(Args _args)
{
CustTable                           custTable;
DimensionAttribute                  dimAttr;
DimensionAttributeValueSetItemView  dimAttrValueSetItemView;
;

while select custTable
join dimAttrValueSetItemView
where dimAttrValueSetItemView.DimensionAttributeValueSet == custTable.DefaultDimension
&&    dimAttrValueSetItemView.DisplayValue               == "20"
join dimAttr
where dimAttr.RecId       == dimAttrValueSetItemView.DimensionAttribute
&&    dimAttr.BackingEntityType == tableNum(DimAttributeOMBusinessUnit)

{
info(strFmt("%1 ; %2 ; %3 ; %4", CustTable.AccountNum ,
dimAttr.Name , dimAttrValueSetItemView.DisplayValue , CustTable.name()));
}
}

İki kodu da çalıştırdığınızda aynı çıktıyı alacaksınız.

Selamlar.

Dynamics Ax 2012 DimensionProvider sınıfı

Merhaba

Ax 2012 ile finansal boyut yapısındaki bir çok değişiklikten eski yazılarımda bahsetmiştim. Boyut yapısındaki bu değişiklikler üzerine kodlarımızda boyutla işlem yapmamız gerektiğinde çok zorlanacağımız düşünmüştüm. Microsoft’taki arkadaşlarda aynı düşünceyi paylaşmışlar ki DimensionProvider sınıfını yazmışlar. Bu sınıf Query yapısında boyutla ilgili işlemleri yapmamızı kolaylaştırıyor ve bizi gereksiz bir çok Join ifadesinden kurtarıyor. Aşağıdaki örneği inceleyelim.

static void FD_AddDimensionRangeToCust(Args _args)
{
    Query                       query = new Query();
    QueryRun                    queryRun;
    QueryBuildDataSource        qbds;
    DimensionProvider           dimProvider = new DimensionProvider();
    CustTable                   custTable;
    ;

    qbds = query.addDataSource(tableNum(CustTable));

    dimProvider.addAttributeRangeToQuery(query, qbds.name(),
                        fieldStr(CustTable,DefaultDimension ),
                        DimensionComponent::DimensionAttribute,
                        "20",
                        "BusinessUnit", true );

    queryRun = new QueryRun(query);
    queryRun.prompt();

    while(queryRun.next())
    {
        CustTable = queryRun.get(tableNum(CustTable));
        info(strFmt("%1 ; %2 ; %3", CustTable.AccountNum ,
                    CustTable.name() , CustTable.DefaultDimension));
    }
}

Bu örnekte BusinessUnit boyutu 20 olan müşterileri listeleyen bir Query yazdım. DimensionProvider sınıfının bir çok metodu mevcut. İhtiyaç oldukça incelemek lazım.

Eski versiyonlarda bunu yazmak gayet  kolaydı çünkü boyut müşteri tablosunda dizi tipinde bir alan olarak bulunuyordu. Ax 2012′de ise tamamen farklı tablolarda tutulan bir veri artık. Bu yüzden 3-4 tablolu bir Join ifadesi yazmaktansa bu sınıfı kullanmak çok daha kolay.

Bu Query ifadesinin Select ile nasıl yazılabileceğini bir sonraki yazımda  ele alacağım.

Selamlar.

Dynamics Ax 2012 DimensionStorage sınıfı

Merhaba

Ax 2012 muhasebe yapısında işimizi kolaylaştıracak bir sınıftan bahsetmek istiyorum. DimensionStorage sınıfı. Bu sınıf bir çok işlemi bizim için yapacak statik metotlara sahip. Özellikle genel muhasebe hesabı ve boyutların birbirleriyle olan ilişkilerinde çok işe yarıyor. Bir job ile bazı statik metotlarını anlatmaya çalışacağım.


static void FD_DimensionStorage(Args _args)
{
    DimensionAttributeValueCombination  dimAttrValueCombDefaultAccount;
    DimensionAttributeValueCombination  dimAttrValueComb;
    DimensionAttributeValueCombination  dimAttrValueCombCompare;
    DimensionAttributeValueCombination  dimAttrValueCombCust;
    DimensionAttributeValueSet          dimAttrValueSet;
    MainAccount                         mainAccount;
    CustTable                           custTable;
    LedgerJournalACType                 ledgerJournalACType;
    DimensionHierarchy                  dimHierarchy;
    ;
    // Örneklerde kullanmak için bazı kayıtları buluyorum
    dimAttrValueCombDefaultAccount  = DimensionAttributeValueCombination::find(5637159810);
    dimAttrValueComb                = DimensionAttributeValueCombination::find(5747268059);
    dimAttrValueCombCompare         = DimensionAttributeValueCombination::find(5747267556);
    mainAccount                     = MainAccount::find(5637146572);
    dimAttrValueSet                 = DimensionAttributeValueSet::find(5747251227);
    custTable                       = CustTable::find("1101");

    // Bir hesap ve tip alarak size LedgerDimension'da kayıt varsa getirir yoksa oluşturur.
    dimAttrValueCombCust = DimensionAttributeValueCombination::find(
          DimensionStorage::accountNum2LedgerDimension(custTable.AccountNum , LedgerJournalACType::Cust));
    info(strfmt("LedgerDimension RecId = %1" , dimAttrValueCombCust.RecId));

    // İki LedgerDimension'nın MainAccount'larının eşit olup olmadığını kontrol eder.
    info(strfmt("MainAccount'lar aynı mı?  %1" ,
       DimensionStorage::compareMainAccounts(dimAttrValueComb.RecId , dimAttrValueCombCompare.RecId)));

    // LedgerDimension' a ait hiyerarşi kaydını verir.
    info(strfmt("DimHierarchy Name = %1" ,
        DimensionStorage::getAccountStructureFromLedgerDimension(dimAttrValueComb.RecId).Name));

    // Bir MainAccount ait defaultAccount varsa getirir yoksa oluşturur.
    info(strfmt("DafaultAccount RecId = %1" ,
       DimensionStorage::getDefaultAccount(mainAccount.RecId)));

    // Bir MainAccount ait defaultAccount varsa getirir yoksa oluşturur.
    info(strfmt("DafaultAccount RecId = %1" ,
       DimensionStorage::getDefaultAccountForMainAccountNum(mainAccount.MainAccountId)));

    // Bir LedgerDimension'daki boyutları yanzı DimensionAttributeValueSet recId sini veriri.
    info(strfmt("DafaultDimension RecId = %1" ,
       DimensionStorage::getDefaultDimensionFromLedgerDimension(dimAttrValueComb.RecId)));

    // LedgerDimension' a ait hiyerarşi kaydını verir.
    info(strfmt("DimHierarchy Name = %1" ,
       DimensionStorage::getFirstDimHierarchyFromLedgerDimension(dimAttrValueComb.RecId).Name));

    // LedgerDimension'a ait DefaultAccount'u verir.
    info(strfmt("DefaultAccount  RecId = %1" ,
       DimensionStorage::getLedgerDefaultAccountFromLedgerDim(dimAttrValueComb.RecId)));

    // LedgerDimension'a ait MainAccount'u verir.
    info(strfmt("MainAccount  Name = %1" ,
       DimensionStorage::getMainAccountFromLedgerDimension(dimAttrValueComb.RecId).Name));

    // LedgerDimension'a ait MainAccount'u verir.
    info(strfmt("MainAccount  RecId = %1" ,
       DimensionStorage::getMainAccountIdFromLedgerDimension(dimAttrValueComb.RecId)));

    // LedgerDimension'a ait MainAccount'u verir.
    info(strfmt("MainAccount  Num = %1" ,
       DimensionStorage::getMainAccountNumFromLedgerDimension(dimAttrValueComb.RecId)));

    // LedgerDimension'a ait AccountNum'u verir.
    info(strfmt("CustTable AccountNum = %1" ,
       DimensionStorage::ledgerDimension2AccountNum(dimAttrValueCombCust.RecId)));

}

Job’ı çalıştırdığınızda şöyle bir çıktı alacaksınız.

Selamlar.

Dynamics AX 2012 Default Account

Merhaba

DefaultAccount DimensionAttributeValueCombination tablosunda LedgerDimensionType ‘ı  DefaultAccount olan kayıtlardır. MainAccount ile aslında çok bir farkı yok. Ancak benim anladığım bazı işlerde kolaylık olması açısından DefaultAccount kullanılıyor. AX 2009 ‘da LedgerAccount seçilen tanım formlarında ax 2012 ‘de MainAccount değilde DefaultAccount seçiliyor.

DefaultAccount için Segmented Entry Control kullanılıyor. Ancak sadece birinci kısmı yani MainAccount aktif. Boyut yapısı görünmüyor. Biz yeni bir tablo ve form oluşturup bu kontrolün nasıl eklenebileceğini bakalım. Adım adım ilerleyelim.

  1. Öncelikle bir tablo yapalım ve EDT ‘si LedgerDimensionDefaultAccount olan  DefaultAccount isminde bir alan açalım. Bu işlemde EDT’yi tabloya sürüklediğinizde DimensionAttributeValueCombination tablosuyla ilişki kurmak için soru soracaktır. Bu ilişkinin kurulması şart. Eğer EDT ile ilgili bir sıkıntı çıkarsa elle de ekleyebilirsiniz.
  2. Bir form yapalım ve veri kaynağına oluşturduğumuz tabloyu ekleyelim.
  3. Tasarım kısmına bir Grid ekleyelim ve veri kaynağından DefaultAccount alanını sürükleyip Grid’e bırakalım. Otomatik olarak Segmented Entry Control oluşturulacaktır.
  4. Kontrolün çalışabilmesi için biraz kod yazmamız gerekiyor. Formun ClassDecleration ve init metodlarına aşağıdaki kodları ekleyelim.
  5. public class FormRun extends ObjectRun
    {
       LedgerDimensionDefaultAccountController defaultAccountController;;
    }
    
    public void init()
    {
        super();
        // hangi veri kaynağının hangi alanı için çalışacağını belirtiyoruz
        defaultAccountController =  LedgerDimensionDefaultAccountController::construct(
                       FDSegmentSEmple_DS, fieldstr(FDSegmentSEmple, DefaultAccount));
    }
    
  6. Veri kaynağındaki LedgerDimension alanına şu kodları ekleyelim
  7. public Common resolveReference(FormReferenceControl _formReferenceControl)
    {
        return defaultAccountController.resolveReference();
    }
    
  8. Grid altında oluşan Segmented Entry Control’e de şu kodları ekleyelim.
  9. public void jumpRef()
    {
        defaultAccountController.jumpRef();
    }
    
    public void loadAutoCompleteData(LoadAutoCompleteDataEventArgs _e)
    {
        super(_e);
        defaultAccountController.loadAutoCompleteData(_e);
    }
    
    public void loadSegments()
    {
        super();
        defaultAccountController.parmControl(this);
        defaultAccountController.loadSegments();
    }
    
    public void segmentValueChanged(SegmentValueChangedEventArgs _e)
    {
        super(_e);
        defaultAccountController.segmentValueChanged(_e);
    }
    
    public boolean validate()
    {
        boolean isValid;
        isValid = super();
        isValid = defaultAccountController.validate() && isValid;
        return isValid;
    }
    
  10. Şu anda kontrol hazır formu açtığınızda aşağıdaki gibi bir görüntü göreceksiniz.

Selamlar.

Microsoft Dynamics Salary Survey 2013

Merhaba

Salary Survey 2013 yayınlanmış. Bu yıl hediye de veriyorlar. Duyurusu şöyle.


Take the Microsoft Dynamics Salary Survey 2013 for a Chance to Win a Microsoft Surface Pro (128 GB), the Nokia Lumia 920 or Xbox 360 Kinect Bundle

Nigel Frank International would like to invite you to complete our annual Microsoft Dynamics Salary Survey. Take the survey and you will automatically be entered into our prize draw to win a Microsoft Surface Pro (128 GB), the Nokia Lumia 920 or Xbox 360 Kinect Bundle.You will also receive a FREE copy of the Salary Survey report once it has been compiled.

Start the Survey Now

The industry acclaimed annual “Microsoft Dynamics Salary Survey” is the world’s most comprehensive insight into global salary trends for Dynamics professionals. Use the survey to benchmark your team’s, company’s or your own salary.

Selamlar.

Dynamics Ax 2012′de diyaloğa boyut eklemek

Merhaba

Ax 2012′ de bir diyaloğa boyut ekleyip geri dönüşünü alabilmek için şöyle bir kod yazdım.

static void FD_AddDimToDialog(Args _args)
{
    DialogFieldDimensionDefaultingController    dfDialogFieldDim;
    DimensionDefaultingFieldSet                 dimensions;
    Dialog                                      dialog;
    ;

    dialog = new dialog();

    dialog.caption("Diyaloğa boyut eklemek");
    dfDialogFieldDim = dialog.addDimensionDefaultingController();
    dfDialogFieldDim.initWithValues(false,false,true,0,"Boyutlar");

    if(dialog.run())
    {
        dfDialogFieldDim.save();
        dimensions = dfDialogFieldDim.value();

        info(strfmt("DimensionAttributeValueSet RecId = %1 ",dimensions[1]));
    }
}

DialogFieldDimensionDefaultingController sınıfında farklı metotlar mevcut. Bunlar incelenip ihtiyaca göre kullanılabilir. DimensionDefaultingFieldSet dizi tipinde bir EDT 3 elemanı var. diğer 2 elemanı sizin sınıfta kullandığınız metoda göre doluyor. Birinci elemanında DimensionAttributeValueSet tablosunun RecId ‘si var.

Selamlar.

Dynamics Ax 2012′de formlara boyut eklemek ( Default dimension)

Merhaba

Bu yazımda eksi versiyonda çok kalay yaptığımız bir işlemi Ax 2012 nasıl yapabileceğimizi anlatacağım. Ax 2009′da bir tabloya boyut açmak ve onu formda göstermek gayet basit bir işlemdi. Dimensions EDT dizi olduğu için tabloya bu alanı açtığınızda dizinin boyutu kadar tabloda sütun oluşuyordu. Siz bu sütunları istediğiniz gibi formunuzda kullanıyordunuz.

Ax 2012 bu işlemin nasıl yapılabileceğini adım adım anlatmaya çalışacağım.

  1. Bir tabloya EDT’si DimensionDefault olan, ismide DimensionDefault olacak bir alan açın. Eğer EDT’yi sürükleyip bırakırsanız DimensionAttributeValueSet tablosuyla ilişki kurmak için onay sorusu çıkacaktır. Burayı onaylayıp ilişkiyi kurmalısınız. Eğer otomatik ilişkide bir sorun olursa elle de ekleyebilirsiniz. Kombinasyonlar DimensionAttributeValueSet tablosunda tutulacak.
  2. Bir form yapalım ve Veri kaynağına tablomuzu ekleyelim.
  3. Boyutları TabPage ile göstermek istiyorum. Group’ta kullanabilirsiniz. İki tane TabPage oluşturup, birincisine bir isim verip, veri kaynağından bazı alanları buraya ekleyelim.
  4. İkinci TabPage’e TabFinancialDimensions ismini verelim ve ekteki özellikleri tanımlayalım.
    • AutoDecleration     : Yes
    • NeedPermision        : Manual
    • Width                           : Column width
    • Height                          : Column height
    • HideIfEmpty             :  No
    • Caption                        : Boyutlar
  5. Kontrolün çalışabilmesi için biraz kod yazmamız gerekiyor. Formun ClassDecleration ve init metodlarına aşağıdaki kodları ekleyelim.
  6. public class FormRun extends ObjectRun
    {
        DimensionDefaultingController dimDefaultingController;
    }
    
    public void init()
    {
        super();
    dimDefaultingController = DimensionDefaultingController::constructInTabWithValues(
                                                              true,
                                                              true,
                                                              true,
                                                              0,
                                                              this,
                                                              tabFinancialDimensions,
                                                              "@SYS138487");
    
        dimDefaultingController.parmAttributeValueSetDataSource(FDSEmple_ds,
                                    fieldstr(FDSemple, DimensionDefault));
    }
    
  7. Veri kaynağına şu kodları ekleyelim
  8. 
    public void delete()
    {
        super();
        dimDefaultingController.deleted();
    }
    
    public void write()
    {
        dimDefaultingController.writing();
        super();
    }
    
    public int active()
    {
        int ret;
        ret = super();
        dimDefaultingController.activated();
        return ret;
    }
    
  9. tabFinancialDimensions alanına şu kodu ekleyelim.
  10. 
    public void pageActivated()
    {
        dimDefaultingController.pageActivated();
    
        super();
    }
    

Bu aşamalardan sonra işlem bitmiş oldu. Formu açtığınızda aşağıdaki gibi bir görüntüyü görebileceksiniz.

Selamlar.

Page 5 of 20« First...345671020...Last »