Archive for Ocak, 2013

Dynamics AX 2012 Caching 1

Merhaba,

AX 2012′deki ön bellek (cach) yapısıyla ilgili bir kaç konuyu ele almayı planlıyorum.  Bir çok yapıda olduğu gibi ön bellek yapısı da AX 2012 ile birlikte geliştirilmiş ve yeni özellikler eklenmiş.

AX iki tip ön bellek yapısı destekliyor. Single-Recod Caching ve Set-Based Caching. AX ile çalışırken biz hangi ön bellek yapısının kullanıldığını önemsemeyiz sistem sizin yazdığınız koda göre en uygunu bulup kullanır. Bizim performanslı bir sistem kurabilmek için bu yapıları iyi kavramamız gerekiyor.

Single-Recod Caching (Kayıt bazlı ön bellekleme)

Üç tip kayıt bazlı ön bellek mevcut. Eski versiyondan da bildiğiniz gibi bunlar NotInTTS, Found, FoundAndEmpty. Tablo üzerindeki CacheLookup özelliğinden tanımlama yapıyoruz.  Ön belleğin  bir select ifadesinde çalışabilmesi için öncelike;

  1. CacheLookup tanımlı olmalı.
  2. Record-Buffer (Tablo değişkeni ) disableCache metodu false olmalı.
  3. Where ifadesinde tekil dizin (unique index) olmalı tekil dizin dışında bir karşılaştırma kullanılırsa ön bellek çalışmaz.
  4. Karşılaştırma “==” kullanılmalı. >=, <=,  >  gibi ifadelerde ön bellek çalışmaz.

Ön bellek hem istemcide (client) hem de sunucuda (server) olabilir. AX çalışma zamanında ön belleği duruma göre yeniler. istemcideki ön bellek sadece kendi tarafından kullanılabilir. İstemcideki  ön bellek  istemcide çalışacak bir select ifadesinde kullanılır. Sistem öncelikle istemciye bakar burada bulamazsa sunucuya orada da bulamazsa veri tabanına bakar. Kaç kaydın ön bellekte tutulacağını server configuration formundan tanımlayabilirsiniz. Eski versiyonlarda bu 100 olarak geliyordu ve değiştirilemiyordu. Forma System administration > Area page > Setup > System > Server configuration yolundan ulaştıktan sonra Performance Optimization > Performance Settings > Client record cache factor kısmından tanım yapabilirsiniz.

Sunucu ön belleği de sunucuda çalışan select ifadelerinde kullanılır. En çok kaç kaydın ön belleğe alınacağının tanımını Server configuration ‘daki  Cache Limits alanından yapabilirsiniz. 2000 tanımlı olarak geliyor.

Ön bellek tanımları tek bir AOS için yapılacağı gibi birden çok AOS olan durumlarda her bir AOS için farklı farklı da yapılabilir.

AX 2012 ile gelen özelliklere bakalım.

  • Select’te ifadesinde kullanılan where ifadesinde tekil dizine && ile ilave kriter eklenebilir. || ile yapılan eklemelerde ön bellek çalışmaz. select * from tabCustTable where tabCustTable.AccountNum == “4000″ &&tabCustTable.CustGroup == “Gold”;
  • Join de öne bellek çalışır. Where ifadesi yine tekil dizine uygun olmalı.  Select from tabCustTable join tabCustGroup
    where tabCustTable.AccountNum == “4000″ && tabCustTable.CustGroup == tabCustGroup.CustGroup;
  • Eğer tek bir şirket işin içindeyse CrossCompany anahatar sözcüğünde de ön bellek desteklenir.
  • Eğer Container bir alanınız tekil dizindeyse ön bellek desteklenir.
  • Tablo kalıtımında (Table inheritance ) ön bellek desteklenir.
  • Tarih kontrollü (Valid time state)  tablolarda ön bellek desteklenir.

Şimdilik bu kadar. Sonraki yazımda CacheLookup özelliğini anlatacağım.

Selamlar.

Kaynaklar :  Inside Microsoft Dynamics Ax 2012 ve MSDN

FirstOnly1, FirstOnly10, FirstOnly100 ve FirstOnly1000 artık çalışıyor.

Merhaba

AX 2012′den önceki versiyonlarda da FirstOnly’nin versiyonları mevcuttu ancak Sql Server kullanıldığında çalışmıyordu Oracle’da çalıştığı söyleniyordu ancak  ben hiç deneyemedim. Artık AX 2012 ile Oracle desteği kalktı fakat bu fonksiyonları kaldırmamışlar. Select ifadelerinde çalışır hale getirmişler. Bu arada Query yapısında bu fonksiyonlar desteklenmiyor sadece FirstOnly kullanabiliyorsunuz.  X++’ ta limit gibi bir fonksiyonun olmaması büyük eksiklik ancak bu fonksiyonlar da yeri geldiğinde işe yarayabilir.  Şöyle bir örnek yazdım:

static void FD_FirstOnly(Args _args)
{
    VendTrans   vendTrans;
    int i = 1;
    ;
    while select firstOnly10 vendTrans
    {
        info(strfmt("%1 = %2 : %3  ",
                    i,
                    vendTrans.AccountNum ,
                    vendTrans.AmountCur     ));
        i++;
    }
}

Selamlar

AX’ta kod ile muhasebe günlüğünü deftere nakletmek

Merhaba

Kod ile muhasebe günlüğü oluşturmayı şu yazımda anlatmıştım. Oluşturulan günlüğü kod ile deftere nakletmek için aşağıdaki kodu kullanabilirsiniz.

static void FD_PostLedgerJournal(Args _args)
{
LedgerJournalCheckPost  ledgerJournalCheckPost;
LedgerJournalTable      ledgerJournalTable;
;
ledgerJournalTable      = LedgerJournalTable::find('000343_040');
ledgerJournalCheckPost  = LedgerJournalCheckPost::newLedgerJournalTable(
ledgerJournalTable,
NoYes::Yes);
ledgerJournalCheckPost.run();

}

Selamlar.

Etiket(Label)’te yeni satır kodu(\n) kullanmak

Merhaba

İnternette dolaşırken strFmrtLB() adında bir metoda rastladım. Ne işe yaradığını bir örnekle açıklamaya çalışacağım.
Şöyle bir metinimiz olsun. “Aşağıdaki parametreler yanlış Lütfen düzeltip tekrar deneyiniz.\nAmbar %1\nTesis %2 “
Bu metini etiket haline getirelim. Etiket kodu da @AIP6 olsun.

box::stop(strfmt(“@AIP6″,”Üretim”,”Depo1″));

Çıktısı:

İstediğimiz çıktıya ulaşamadık. Şimdi  strFmtLB() motodu ile tekrar deneyelim.

box::stop(strfmt(strFmtLB(“@AIP6″),”Üretim”,”Depo1″));

Çıktısı:

İsteğimiz çıktıya ulaştık. Umarım işinize yarar.

Selamlar.

Genel muhasebe yapısındaki değişiklikler

Merhaba

Ax 2012′den önceki versiyonlarda muhasebe iki ana tablodan oluşuyordu. Birincisi hesap planının tutulduğu LedgerTable . İkincisi muhasebe hareketlerinin tutulduğu LedgerTrans. Bu iki tablo muhasebe için en temel tablolardı. Bütün hareketler bu tabloda tutulur ve bir hesabın bakiye toplamı gibi işlemler için LedgerTrans üzerinde işlem yapmak yeterli olurdu. Ayrıca LedgerTrans’ın özeti olan bir toplam tablomuz vardı buda  LedgerBalancesDimTrans tablosuydu. Bunlara ek olarak boyut yapısı vardı. Boyut bir diziydi. Dimensions alanından yönetiliyordu. Firmanın ihtiyacına göre kaç boyut kullanacağı tespit edilir ve tanımlanırdı. Boyut sayısı lisansa bağlıydı.

Bu yapı ax 2012 ile tamamen değişmiş durumda. LedgerTable ve LedgerTrans tabloları yok.  LedgerTable yerine MainAccount tablosu var. Eskiden bir şirket için tek bir hesap planı tanımlanırken şimdi birden çok hesap planı tanımlamak mümkün. LedgerChartOfAccounts tablosu hesap planlarının tanımlandığı ana tablo. Bir hesap için select yazarken hangi ChartofAccount olduğunu da belirtmek gerekiyor.

Gelelim LedgerTrans tablosunun yapısına. Eski versiyonlarda  110110 hesabının 02.03.2012 tarihindeki deki hareketlerini bulmak için şöyle bir sorgu yeterliydi.


while select ledgerTrans

where ledgerTrans.AccountNum == “110110”  &&

ledgerTrans.TransDate       == 02\03\2012 &&

ledgerTrans.OperationsTax == OperationsTax::Current

{

İnfo(“...”)

}

Ax 2012 de ise şöyle bir sorgu yazmak gerekiyor.


static void FD_LedgerTrans1(Args _args)
{
MainAccount                         mainAccount;
GeneralJournalEntry                 generalJournalEntry;
GeneralJournalAccountEntry          generalJournalAccountEntry;
DimensionAttributeValueCombination  dimAttrValueComb;
SubledgerVoucherGeneralJournalEntry subledgerVoucherGeneralJournalEntry;

while select AccountingCurrencyAmount, TransactionCurrencyAmount,
TransactionCurrencyCode

from generalJournalAccountEntry

join dimAttrValueComb
where dimAttrValueComb.RecId == generalJournalAccountEntry.LedgerDimension
join AccountingDate, JournalNumber from generalJournalEntry
where generalJournalAccountEntry.GeneralJournalEntry == generalJournalEntry.RecId
&& generalJournalEntry.AccountingDate == 02\03\2012
&& generalJournalEntry.PostingLayer == OperationsTax::Current
&& generalJournalEntry.Ledger == Ledger::current()
join MainAccountId, Name from mainAccount
where mainAccount.RecId == dimAttrValueComb.MainAccount
&& mainAccount.MainAccountId == '110110'
join subledgerVoucherGeneralJournalEntry
where subledgerVoucherGeneralJournalEntry.GeneralJournalEntry == GeneralJournalEntry.RecId
{
info(strFmt("%1-%2 - %3 - %4 - %5 - %6 - %7 - %8 - %9",
mainAccount.MainAccountId, mainAccount.Name,
generalJournalEntry.AccountingDate,
subledgerVoucherGeneralJournalEntry.Voucher,
generalJournalAccountEntry.TransactionCurrencyCode,
generalJournalAccountEntry.TransactionCurrencyAmount,
generalJournalAccountEntry.AccountingCurrencyAmount,
generalJournalEntry.JournalNumber,
dimAttrValueComb.DisplayValue ));
}

}

Sorguda görüldüğü gibi LedgerTrans tablosu 5 tabloya bölünmüş durumda. Günlükler için  bir kaç tabloya daha ihtiyaç olduğunu ve onlarında bu sorguya duruma göre ilave edilmese gerektiğini unutmadan söyleyeyim.

Aşağıdaki resimde  ax 2012′deki muhasebe veri yapısı mevcut. Bu yapıyı iyi kavramak üzerinde yeni gelen boyut yapısını öğrenmek geliştirme yapabilmek için şart.

Selamlar.

Şirketin standart para birimini bulmak

Merhaba

Ax 2012 den önce şirketin standart para birimi için şu kodu kullanıyorduk.

CompanyInfo::find().CurrencyCode;

Ax 2012 ‘ de ise şu kodu kullanıyoruz.

Ledger::findByLegalEntity(CompanyInfo::find().RecId).AccountingCurrency;

Ax 2012 de şirketler Legal Entity olarak tanımlanıyor. Bu kısımlar tamamen yeni bir yapıda özellikle hesap planı ve muhasebe kayıtlarını tutulduğu yapı tamamen değişmiş. Başka bir yazımda muhasebe satırlarının yeni yapısı hakkında bilgi vereceğim.

Selamlar.