Archive for the ‘ AX 2012 ’ Category

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.

Dynamics AX 2012 Segmented Entry Control

Merhaba

Segmented Entry Control ax 2012 ile değişen finansal boyut yapısında hesap ve boyutları birlikte girebilme imkanı sağlayan bir yapıdır. Genel muhasebe günlüklerinde girişler bu şekilde yapılıyor. Bu yazımda yeni bir tablo ve form oluşturup bu kontrolün nasıl eklenebileceğini anlatacağım. Adım adım ilerleyelim.

  1. Öncelikle bir tablo yapalım ve EDT ‘si LedgerDimensionAccount olan  LedgerDimension 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 LedgerDimension 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
    {
        LedgerDimensionAccountController ledgerDimensionAccountController;
    }
    
    public void init()
    {
        super();
        // hangi veri kaynağının hangi alanı için çalışacağını belirtiyoruz
        ledgerDimensionAccountController =  LedgerDimensionAccountController::construct(
                                            FDSegmentSEmple_ds,
                                            fieldStr(FDSegmentSEmple,LedgerDimension));
    }
    
  6. Veri kaynağındaki LedgerDimension alanına şu kodları ekleyelim
  7. public boolean validate()
    {
        boolean ret;
        ret = super();
        ret = ledgerDimensionAccountController.validate() && ret;
        return ret;
    }
    
    public void jumpRef()
    {
        super();
        ledgerDimensionAccountController.jumpRef();
    }
    
    public Common resolveReference(FormReferenceControl _formReferenceControl)
    {
        return ledgerDimensionAccountController.resolveReference();
    }
    
  8. Grid altında oluşan Segmented Entry Control’e de şu kodları ekleyelim.
  9. public void loadAutoCompleteData(LoadAutoCompleteDataEventArgs _e)
    {
        super(_e);
        ledgerDimensionAccountController.loadAutoCompleteData(_e);
    }
    
    public void loadSegments()
    {
        super();
        ledgerDimensionAccountController.parmControl(this);
        ledgerDimensionAccountController.loadSegments();
    }
    
    public void segmentValueChanged(SegmentValueChangedEventArgs _e)
    {
        super(_e);
        ledgerDimensionAccountController.segmentValueChanged(_e);
    }
    
  10. Şu anda kontrol hazır formu açtığınızda aşağıdaki gibi bir görüntü göreceksiniz.

Üsteki oka tıkladığınızda ana hesap ve boyut yapısını görebilirsiniz.

Ana hesabı ve boyutları bir arada girebileceğiniz bir yapı oluştu. Burada girdiğiniz verilerden DimensionAttributeValueCombination tablosunda bir kayıt oluşturulur ve o kaydın RecId si oluşturduğumuz tablodaki LedgerDimension alanına yazılır. Tablodan baktığınızda sadece RecId görürsünüz ancak formdan baktığınızda bu kontrol sayesinde bütün veriyi görebilirsiniz. Bütün bu işlemleri LedgerDimensionAccountConroller sınıfı sizin için yapar.

Eski alışkanlıklara biraz ters ancak yeni boyut yapısında veri girişini kolaylaştırması açısında bence kullanışlı bir yapı olmuş.

Selamlar.

Ax 2012 ile yazdığımız bir sorgunun SQL ifadesini almak

Merhaba

Ax ile yazdığımız bir sorgunun nasıl bir SQL ifadesi oluşturduğunu görmek için ax 2012 ile gelen  getSQLStatement() metodunu kullanabiliriz.  Şöyle bir örnek yapalım.


static void FD_generateonlyAndgetSQLStatement(Args _args)
{
CustTable custTable;
CustTrans custTrans;
;

select generateonly firstOnly10  AccountNum, CustGroup from custTable
join CurrencyCode , AmountMST from custTrans
where custTrans.AccountNum == custTable.AccountNum;

info(custTable.getSQLStatement());
}

Çalıştırdığınızda çıktısı şöyle olacaktır.

SELECT TOP 10 T1.ACCOUNTNUM,T1.CUSTGROUP,T1.RECID,T2.CURRENCYCODE,T2.AMOUNTMST,T2.RECID

FROM CUSTTABLE T1 CROSS JOIN CUSTTRANS T2 WHERE (T1.DATAAREAID=?) AND ((T2.DATAAREAID=?)

AND (T2.ACCOUNTNUM=T1.ACCOUNTNUM))

Burada önemli olan generateonly ifadesi generateonly olmadan bu çıktıyı elde edemezsiniz. Ne işe yarıyor derseniz  bir sorguda kullandığınızda sadece SQL ifadesini oluşturuyor ama çalıştırmıyor. Bu sayede getSQLStatement() metodunu çağırdığımızda SQL ifadesini görebiliyoruz.

SQL ifadesinde dikkatimi çeken diğer bir nokta da TOP 10 kısmı. Gördüğünüz gibi aslında FirstOnly (herhengi bir rakam ) şeklinde bir metod kolayca yapılabilir. Ax’ı geliştiren arkadaşlar artık bunu yapmalı.

Selamlar.

Dynamics Ax 2012 Form templates

Merhaba,

Ax 2012 ile birlikte form yapısında bir çok değişiklik oldu. Fırsat buldukça bunlardan bahsedeceğim. Bu yazımda form şablonlarından (Form Templates) bahsetmek istiyorum. Ax 2012 ile form arayüzü daha zengin bir yapıya kavuştu. Son kullanıcı için iyi olan bu değişiklik geliştiriciler için fazladan mesai anlamına geliyor. Üstelik standart formlardaki görüntüye benzer bir görüntüyü yakalamak oldukça zor. İşte bu zorluktan dolayı en temel form yapıları için şablonlar hazırlanmış. Şablonları kullanarak kolayca standart form yapısına uygun formlar hazırlanabiliyor.  Şablonlar SysBPStyle_<Şablon ismi> ile başlayan formlar. Siz şablondan  bir form oluşturduğunuzda bu formlar çoğaltılıp yeni pencerede açılıyor. Sekiz  farklı şablon mevcut. AOT de Forms düğümüne sağ tıkladığınızda aşağıdaki resimde görünen liste karşınıza çıkıyor.

Bunlar da AOT deki şablon formlar.

Şimdi tek tek bu şablonları inceleyelim.

  • ListPage

Bir modülün giriş formları genelde ListPage lerdir. ListPage lerde sadece ana veriler görüntülenir. Veri güncelleme eklem gibi işlemler için Edit formalara ihtiyaç vardır. ListPage formaları Enterprise Portale (EP) deploy edilebilir. ListPage formlarında direk kod yazılamaz. ListPageInteraction sınıfı yardımıyla bazı kontroller yazılır. Örnek olarak CustTableListPage ve SalesTableListPage verilebilir. ListPage ile alakalı oluşturduğunuz bütün nesnelerin sonun “ListPage” eklemek en iyi yöntem olarak tavsiye ediliyor.

  • DetailsFormMaster

Ana veri girişi ve güncellemesi yapılan formlar genelde bu şablon tipindedir. CustTable ve VendTable gibi.

  • DetailsFormTransaction

Hareket girişi yapılan formlar bu tiptedir. SalesTable ve PurchTable gibi. Eskiden bir ana veri ve satırları tipinde bir formu biz iki grid yapıp gösteriyorduk. Eski SalesTable formunda olduğu gibi. Ax 2012 de ise SalesTableListPage ile SalesTable tablosunun kayıtlarını görebilir bu formdan güncelle , yeni kayıt veye grid üzerinde güncelle diyerek SalesTable formunu geçebilirsiniz.

  • SimpleListDetails

Bu şablonda ise bir ana veri ve ona ait detay verilerin listelenir. Sol tarafta bir grid liste var. Sağ tarafta ise o listede hangi satır üzerinde iseniz onun detay bilgileri var. DimensionDetails ve MainAccount formları gibi.

  • SimpleList

Bir grid içinde verilerin listelendiği ve  Grid dışında bir eklentisi olmayan basit bir şablon. MainAccountCategory gibi.

  • TableOfContents

Ax 2012 deki parametre formları bu tiptedir. Sol tarafta tablar listelenir. Bir taba tıkladığınızda sağ tarafta içeriği görürsünüz. SalesParemeters gibi.

  • Dialog

Belli bir veriyi göstermek veye bazı basit bilgileri kullanıcıdan almak için kullanılan şablondur. Ok ve Cancel butonları vardır. EcoResProductCreate formu gibi.

  • DropDialog

Kullanıcıdan basit verileri almaya yaran bir şablon. Sadece Ok butonu vardır. EcoResCategoryHierarchyCreate gibi.

Bir şablondan form oluşturduğunuzda Design kısmındaki Style özelliğinde şablonun ismi yazılır. Style Auto ise bir şablondan oluşturulmamış demektir. Şablon ile oluşturulmuş bir formun yapısını aşağıdaki resimde görünen Check form style best practices butonu ile kontrol edebilirsiniz.

Açıkça söylemek gerekirse ilk yaptığım formlarda çok vakit kaybettim. Neyin ne olduğunu nereye ne gelmesi gerektiğini anlayana kadar çalışmam gerekti. Özellikle ListPage ve   DetailsFormTransaction tiplerinde form yaparken ciddi uğraşmam gerekti. Yapıyı kavradıktan sonra ise işler basitleşiyor ve hızlanıyor. Şablonlar sizin için tasarımın büyük bir kısmını hallediyor. Siz sadece Datasource’ları belirleyip gerekli alanları forma yerleştiriyorsunuz.

Bence bu yapı standart oluşturması ve tasarım bütünlüğü açısından iyi olmuş. Son kullanıcıların hoşuna gider mi bilmiyorum ama ben beğendim.

Selamlar.

Dynamics AX 2012 Caching 3

Merhaba

Dynamics Ax ile bir kayıt kümesi topluca ön belleğe alınabilir. Buna Set-based Caching deniliyor. İki türü var.

  • EntireTable : Tablonun CacheLookup özelliğini EntireTable yapmak.
  • RecordViewCache: Kodda RecordViewCache sınıfını kullanmak.

EntireTable Cache

Eğer bir tablonun CacheLookup özelliğini EntireTable yaparsanız ilk select ifadesinden sonra bütün veri ön belleğe alınacaktır. Önceki yazılarımda bahsettiğim select ifadesindeki kurallar burada da geçerli.

EntireTable sunucuda ön belleğe alınır ve bütün AOS lara kopyalanır. Bir istemci bir veriye ulaşmak isteyince önce kendi ön belleğine bakılır daha sonra sunucu ön belleğine bakılır. Her bir şirket için ayrı ön bellek oluşturulur.  Ön belleğin boyutu 128 KB’ı geçerse ön bellek diske taşınır. Bu durum performans sıkıntısına sebep olabilir. Bu yüzden büyük verisi olan tablolarda pek tavsiye edilmez.

EntireTable ön belleği tabloya insert, update veya delete işlemi olduğunda bütün AOS lardan silinir. Ön belleğin silinmesinden sonraki ilk select ifadesiyle veri tekrar ön belleğe alınır. Bundan dolayı çok sık hareket gören tabloların bu tipte olması tavsiye edilmez. Bu durumlardan bağımsız olarak AOS her 24 saate bir bütün EntireTable ön belleğini temizler. Eğer siz kod ile bir tablonun ön belleğini silmek isterseniz  flush <Tablo ismi> demeniz yeterli. EntireTable ön belleği join ifadelerinde çalışmaz.

RecordViewCache Cache

Öncelikle nofetch ifadesiyle bir recordBuffer oluşturulur. Bu buffer RecordViewCache clasına yüklenir ve o oturum boyunca yapılan diğer sorgular ön bellekten yapılmış olur. Bu yapıda bir sorun var. Kayıtları Linked liste tuttuğu için kayıt sayısı arttıkça performans sorunu ortaya çıkacaktır.  Şöyle bir örnek yapalım:

static void RecordViewCache(Args _args)
{
    CustTrans       custTrans;
    RecordViewCache recordViewCache;
    ;
    //RecorBuffer doldurulur.
    select nofetch custTrans
       where custTrans.AccountNum == '4000';

    // Kayıtlar ön belleğe alınır.
    recordViewCache = new RecordViewCache(custTrans);

    // Ön bellek kullanılır.
    select firstonly custTrans
        where custTrans.AccountNum == '4000' &&
              custTrans.CurrencyCode == 'USD';
}

Ön bellek ile ilgili benim yazacaklarım bu kadar.

Daha ayrıntılı bilgiye MSDN’den ve Inside Dynamics AX 2012 kitabından ulaşabilirsiniz.

Selamlar.

Page 5 of 7« First...34567