Archive for the ‘ x++ ’ Category

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.

Dynamics AX 2012 Caching 2

Merhaba

Ön bellek yapısından bahsetmeye CacheLookup özelliği ile devam edelim. Tablo özelliği olan CacheLookup bir verinin nasıl ön bellekleneceğini belirler. 5 farklı tip mevcut tek tek inceleyelim.

  1. None : Bu tipteki tablolarda veri ön belleğe alınmaz. Çok nadir durumlar dışında tabloda kullanılmamalıdır.  Eğer tabloda çok sık veri güncellemesi oluyorsa düşünülebilir. CustTrans gibi bir tablonun bile None olmadığını burada belirtmem gerekiyor.
  2. NotInTTS : Bütün anahtarlar için ön bellekleme çalışır. Bir işlem kümesinin dışında (TTSBegin öncesinde) oluşan ön bellek kullanılmaz. İşlem kümesinde bir kere okunan veri öne belleğe alının ve küme içerisinde bellekten kullanılır. Kayıt Select-Locked olarak çekildiği için işlem kümesinde güncellenmesi engellenir. Ax’taki bir çok hareket tablosu bu tiptedir. CustTrans gibi.
  3. Found :  Bütün anahtarlar için ön bellekleme yine çalışır. Kayıt çekildiğinde eğer ön bellekte varsa ön bellekten gelir. Yoksa veri tabanına bakılır. Eğer Forupdate ile select yapılırsa yine veri tabanına bakılır. Genelde ana tablolar bu tiptedir. CustTable gibi.
  4. FoundAndEmpty : Found ile aynı işi yapar ek olarak sorgu  ile gelmeyen veri tabanında olmayan kayıtları da ön bellekte tutar bu sayede olmayan bir kayıt için sürekli veri tabanına sorgu göndermez. CustInterestVersion gibi.
  5. EntireTable : Set-Base Caching te ayrıntılı anlatacağım. Kısaca bütün veriyi sunucuda ön belleğe alır.  Çok nadir güncelleme olan tablolarda kullanılabilir.  InventModelGroup gibi.

Inside Microsoft Dynamics Ax 2012 kitabından bazı örnekleri inceleyelim: Öncelikle NotInTTS

static void NotInTTSCache(Args _args)
{
CustTable custTable;
;
select custTable where custTable.AccountNum == '1101';
// Ön belleğe bakılır yoksa veri tabanından  getirilir.

ttsBegin; // İşlem Kümesi başlatıldı
select custTable where custTable.AccountNum == '1101';
// Ön bellek geçerli değili.  Veri tabanından getirilir ve ön belleğe alınır.

select forupdate custTable where custTable.AccountNum == '1101';
// Yine veri tabanından getirlir. Forupdate kullanıldığı için

select custTable where custTable.AccountNum == '1101';
// Ön bellek kullanılır

select forupdate custTable where custTable.AccountNum == '1101';
// Ön bellek kullanılır çünki önceden  forupdate kullanıldı.

ttsCommit; // işlem kümesi sonu.
select custTable where custTable.AccountNum == '1101';
// Ön bellek kullanılır.
}

Eğer tablo tipi Found veya FoundAndEmpty olsaydı işlem kümesinin hemen altındaki sorgu ön bellekten gelecekti. İlk forupdate içeren sorgu yine veri tabanından gelecekti. Başka bir örnekle devam edelim.

static void UtilizeCache(Args _args)
{
CustTable custTable;
;
select custTable where custTable.AccountNum == '1101';
// Ön bellek kullanılır çünki birincil anahtar kriter olarak verilmiş.

select custTable; // Where ifadesi olmadığı için ön bellek kullanılmaz.

select custTable where custTable.AccountNum > '1101';
// (==) kullanılmadığı için ön bellek kullanılmaz.

select custTable  where custTable.AccountNum == '1101'
                            && custTable.CustGroup == '20';
// Ön bellek kullanılır.
}

Tekil dizine ek olarak verilen kriterlerde Ax 2012 nasıl davranıyor bakalım.

static void whenRecordDoesGetCached(Args _args)
{
CustTable custTable,custTable2;
;
// CustTable found olduğunu hatırlatayım.
// Aşağıdaki sorgu sonucunda veri tabanında böyle bir kayıt olmadığı için
// ön belleğe alınamayacak.
// Eğer CustTable FoundAndEmpty tipinde olsaydı
// bulunamayan kayıtta ön belleğe alınacaktı.

select custTable where custTable.AccountNum == '1101'
                           && custTable.CustGroup == '20';
// Aşağıdaki ifade kayıdı ön belleğe alır.
select custTable  where custTable.AccountNum == '1101';
// Bu ifade kaydı ön belleğe alacaktır.
select custTable2 where custTable2.AccountNum == '1101'
                                && custTable2.CustGroup == '10';
// Eğer kodu tekrar çalıştırırsak bütün kayıtlar ön bellekten gelecek.
}

Şimdilik bu kadar.

Selamlar.

Kaynaklar : Inside Microsoft Dynamics Ax 2012 ve MSDN

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.

Page 5 of 14« First...3456710...Last »