Archive for the ‘ x++ ’ Category

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.

AX 2012 QueryHavingFilter özelliği (Having)

Merhaba

“QueryHavingFilter” bizim SQL de kullandığımız “Having” ifadesinin axtaki karşılığıdır. AX 2012 ile gelen bu özellik malesef şimdilik sadece “Query” yapısında kullanılabiliyor.

Aşağıdaki SQL ifadesini inceleyelim.

SELECT CURRENCY, COUNT(RECID) FROM CUSTTABLE
	GROUP BY CURRENCY 	HAVING COUNT(RECID) < 3

Bu ifade de istediğimiz sonuç müşteriye bağlı adedi 3 ten az olan para birimlerinin listesi.

Bu ifadenin Ax’taki karşılığı yoktu. Döngüde kontrol yapıp bunu tespit ediyorduk. Bu da performans açısından yanlış bir kullanımdı.

AX 2012 ile gelen QueryHavingFilter bu özelliği axa taşımış oldu.

Bir Query örneğiyle AX 2012 ‘de nasıl kullanabileceğimize bakalım.

Read more

AX 2012 addQueryFilter ile addRange arasındaki fark

Merhaba

addQueryFilter ax 2012 ile gelen bir yenilik.

addQueryFilter ile addRange arasındaki farkı anlamak için öncelikle SQL’de bir kaç örnek yapalım.

Sql’de basit bir join .

SELECT * FROM CUSTTABLE
            OUTER JOIN CUSTTRANS ON CUSTTRANS.CUSTACCOUNT = CUSTTABLE.ACCOUNTNUM

Bu join’e hareketlerin para birimi EUR olanlar diye bir kriter vermek istersen 2 seçeneğimiz var.

SELECT * FROM CUSTTABLE
            OUTER JOIN CUSTTRANS ON CUSTTRANS.CUSTACCOUNT = CUSTTABLE.ACCOUNTNUM
                   AND CUSTTRANS.CURRENCYCODE = 'EUR'

veya

SELECT * FROM CUSTTABLE
            OUTER JOIN CUSTTRANS ON CUSTTRANS.CUSTACCOUNT = CUSTTABLE.ACCOUNTNUM
                WHERE  CUSTTRANS.CURRENCYCODE = 'EUR'

Birinci sql ifadesi öncelikle CustTable da bulunan bütün kayıtları getirir. Hareketlerden de sadece EUR olanları alır.

İkinci ifade ise aslında inner joinin yaptığı işi yapar ve sadece EUR tipinde hareketi olan müşterileri ve hareketlerini getirir.

İşte addQueryFilter ile addRange arasındaki fark bu iki sql ifadesi arasındaki farkla birebir aynıdır.

addQueryFilter where ifadesini , addRange ise and ifadesine karşılık gelir.

Ax ta bir örnekle inceleyelim,

static void Query_addQueryFilter (Args _args)
{
    Query                   query;
    QueryBuildDataSource    qbdsCustTable , qbdsCustTrans;
    QueryBuildRange         range;
    QueryFilter             filter;
    QueryRun                qRun;    

    custTable               CustTable;
    custTrans               custTrans;
    ;

    query = new Query();
    qbdsCustTable = query.addDataSource(tableNum(CustTable));
    qbdsCustTrans = qbdsCustTable.addDataSource(tableNum(CustTrans));
    qbdsCustTrans.joinMode(JoinMode::OuterJoin);
    qbdsCustTrans.relations(true);       

    query.addQueryFilter(qbdsCustTrans,  fieldStr(CustTrans, CurrencyCode)).value(SysQuery::value('EUR'));

   // qbdsCustTrans.addRange(fieldNum(CustTrans, CurrencyCode)).value(SysQuery::value('EUR'));  

    qRun = new QueryRun(query);
    while (qRun.next())
    {
        CustTable = qRun.get(TableNum(CustTable));
        custTrans = qRun.get(TableNum(custTrans));        

        info(strfmt("%1 : %2: %3: %4", CustTable.AccountNum ,
                                                CustTable.name(),
                                                custTrans.AmountMST,
                                                custTrans.CurrencyCode
                                                ));
    }

}

addQueryFilter koddan çok formalarda kullanılmak üzere geliştirilmiş bir özellik. Formlardaki veri süzme işleminde artık varsayılan olarak addQueryFilter kullanılıyor.

Selamlar.

AX 2012′de muhasebe günlüğü oluşturmak

Merhaba

Ax 2012′de muhasebe günlüğü oluşturmak için iki tane sınıf var. AxLedgerJournalTable ve AxLedgerJournalTrans.

Bu sınıflar kullanılarak kolayca günlük oluşturulabilir.

Örneğin:

static void createLedgerJournal(Args _args)
{
AxLedgerJournalTable   ledgerJournalTable = new AxLedgerJournalTable();
AxLedgerJournalTrans   ledgerJournalTrans= new AxLedgerJournalTrans();
container                   ledgerDimensions, offsetDimensions;
;
ledgerJournalTable.parmJournalName("GenJrn");
ledgerJournalTable.save(); // LedgerJournalTable oluştu.

ledgerJournalTrans.parmAccountType(LedgerJournalACType::Ledger);
ledgerJournalTrans.parmJournalNum(ledgerJournalTable.ledgerJournalTable().JournalNum);
ledgerDimensions = ["Şirket Hesabı","110.100.10"];
ledgerJournalTrans.parmLedgerDimension(AxdDimensionUtil::getLedgerAccountId(ledgerDimensions));
ledgerJournalTrans.parmAmountCurDebit(1000);
offsetDimensions = ["Şirket Hesabı","632.100.20"];
ledgerJournalTrans.parmOffsetLedgerDimension(AxdDimensionUtil::getLedgerAccountId(offsetDimensions));
ledgerJournalTrans.save(); // LedgerJournalTrans oluştu
}

Genel muhasebe boyut yapısı Ax 2012′ tamamen değişmiş durumda. Burada ana hesapları da boyutla birlikte veriyoruz.
Aslında ana hesaplarda boyut gibi çalışıyor denebilir.
Başka bir makalede boyutlarla ilgili bazı konuları da anlatacağım.
Selamlar.

AX 2012 ‘de lookup’ta çoklu kayıt seçimi nasıl yapılır

Merhaba

Ax 2012 ‘yi  incelerken  SysLookupMultiSelectCtrl isminde bir sınıfla karşılaştım . Bu sınıf sayesinde lookuplarda  çoklu kayıt seçilebiliyor.

Öncelikle lookupta görmek istediğiniz veri için bir query hazırlamalısınız. AOT de ki query düğümünü kullanarak yapabileceğiniz gibi kodla da oluşturabilirsiniz.

Biz CustTable için bir query hazırlayalım. Ayrıca tasarımında sadece stringEdit (adı CustAccount olsun ) bir alan olan form yapalım.

Bu aşamadan sonra forma kod yazmamız gerekiyor. Eklememiz gereken kodlar :

Read more

Dynamics Ax’ ta Jobs

Merhaba

Jobslar tek başına çalışabilen kod parçaçıklarıdır.  Genelde biz axcılar joblarda kod testlerini ve veri güncellemelerini yaparız. Jobları uygulamanın içinde pek kullanmayız. Doğrusuda budur. Eğer uygulamada kullanılacak bir işse sınıf yazmak daha mantıklı olacaktır.

Joblar genelde açıldıktan sonra çalıştır denilerek kullanılır.  AOT den jobın üzerine gelip Aç derseniz  job çalışacaktır. Bu bazen tehlikeli olabilir. Örneğin bir seferlik  veri güncellemesi yapması gerekn  bir job yazdınız. Başka birisi joba sağ tıklayıp Aç dediğinde tekrar çalışacak ve verinizi bozacaktır. Bu durum için yapılması gereken işiniz bittikten sonra job içindeki update yapan kodlarınızı yorum satırı halıne getirmektir. Jobın kodunu görmek için üzerine çıft tıklamak veye sağ tıklayıp düzenle demek gerekir.

Eğer istersek jobları kod içinden de çalıştırabiliriz.

Örneğin  mesaj veren aşağıdaki gibi bir  job olsun ve bunu koddan çağırıp mesajı görelim;

Read more

setRFix() ve setLFix() metodları

Merhaba

setRFix() ve setLFix() metodlarını belli bir formatta string oluşturmak istediğimizde kullanırız. Bu metodlar sayesinde belli sayıdaki karakteri bir tekstin ister sağına  ister soluna ekleyebilirsiniz. Bir job ile nasıl kullanıldığını görelim.


static void strRLFix(Args _args)
{
int     i = 1;
str     padded;
str     finalResult;
;
padded = strRFix(int2str(i), 5, "0");
finalResult = strFmt("NUM-%1", padded);
info(finalResult);
padded = strLFix(int2str(i), 5, "0");
finalResult = strFmt("NUM-%1", padded);
info(finalResult);
}

Çıktısı :

NUM-00001
NUM-10000

Selamlar.

Page 9 of 17« First...7891011...Last »