Classes'da lookup İşlemi

Bildiğiniz gibi Dynamics Ax'da kodlarımızı X++ dilinde yazmaktayız. X++ dilinin içeriği ve biçimi C#, Visual .Net ve java dillerine benzemekte. X++ dili bu dillerin referanslarına ve benzer içeriklerine sahiptir. Tabi Java biçimine daha çok benzediğini söylemeliyiz. X++ dilini daha iyi anlayabilmemiz ve farklılıkları daha iyi tespit edebilmemiz için object oriented programlama yöntemlerini iyi anlamamız gerekecektir.

Axapta içersinde object oriented programlama'ya ait en güçlü örnekleri Classes'larda görmekteyiz. Axapta 'da Classes yazmak ve yönetmek son derece kolaydır. Biz Classes'ları birçok uygulamamızda veya yaptığımız geliştirmelerde kullanmaktayız. Axapta'da Classes'ları bu kadar çok kullanmamızı sağlayan en güçlü özelliklerinden biri Dialog metodudur. Bu metod ile değişkenlerimizi ( parametre, girdi) tanımlamamızı sağlar.

Bu makalede de Classes'larda kullandığımız Dialog metodunda StringEdit tipinde bir değişkende(alanda) Lookup metodunu nasıl oluşturacağımızı bir örnekle anlamaya çalışacağız.

Örneğimizde Fiş Numarası ve Fiş tarihi bilgilerini alan, bu parametrelerle de muhasebe günlüğü işlemlerini bir StringEdit alanında görüntüleyeceğiz.

Bu örnek için LedgerJournalTrans tablosunu kullanacağız. Tabi olaya dialog metodumuzu yazarak başlayacağız yalnız Classes'la ilgili diğer metodların ve gerekli değişkenlerin tanımlandığını var saymaktayım.

Object dialog(DialogRunbase _dialog, boolean _forceOnClient )
{
DialogGroup dimensionGroup;
Dialog dialog = super(_dialog, _forceOnClient);
;

dialogVoucher = dialog.addFieldValue(typeid(voucher),voucher,"Fiş Numarası");
dialogTransDate = dialog.addFieldValue(typeid(TransDate),transDate,"İşlem Tarihi");
dialogJournalRecId = dialog.addFieldValue(typeid(RecId),journalRecId,"Fiş Satırı");
dialogJournalRecId.lookupButton(FormLookupButton::Always);


return dialog;
}

Classes'ımızı dialog'unda görüntülenmek üzere 3 adet dialog alanı oluşturuyoruz. Yukarıda belirtiğim gibi bu alanlardan dialogVoucher ve dialogTransDate alanları görüntüleyeceğimiz fiş ve fişin tarihi. Günlük işlemlerini ise dialogJournalRecId alanında lookup olarak görüntüleyeceğiz. Burada dikkat etmemiz geren nokta bu alanın LookUpButton özelliğini "herzaman" olarak atamak olmalıdır. Bu özellik bize StringEdit alanı için lookup işlemini açacaktır. Şimdi lookup metodumuzu yazalım.

Classes'ların dialog'larına alan eklediğimizde bunlar birer object olduğu için, Axapta bunlara birer isim atayacaktır. "Fld_1_1" gibi. Bizim eklediğimiz alanın ismini ise (info(dialogJournalRecId .name)) ile alabiliriz.

Aslında şimdi yapacağımız işlem .Net den alışık olduğumuz bir object'in metodunu OverWrite (Üzerine Yazmak) etmeden farklı değildir. Bizde Axapta tarafından ismi verilmiş olan dialogJournalRecId isimli alanımızın Lookup metodunu OverWrite edeceğiz.

Şimdi Axapta dialogJournalRecId alanına Fld3_1 ismini verecektir. Classes'ımızın içine aşağadaki metod'u yazarak işlemimizi tamamlayalım.

void Fld3_1_lookup()
{
FormRun fr=this.dialogModify().parmDialog().formRun();
object control = fr.controlCallingMethod();

SysTableLookupsysTableLookup=SysTableLookup::newParameters(tableNum(LedgerJournalTrans), control);
Query query = new Query();
QueryBuildDataSource qbds;
;

sysTableLookup.addLookupfield(fieldNum(LedgerJournalTrans, RecId));
sysTableLookup.addLookupfield(fieldNum(LedgerJournalTrans, JournalNum));
sysTableLookup.addLookupfield(fieldNum(LedgerJournalTrans, AccountType));
sysTableLookup.addLookupfield(fieldNum(LedgerJournalTrans, AccountNum));
sysTableLookup.addLookupfield(fieldNum(LedgerJournalTrans, txt));
sysTableLookup.addLookupfield(fieldNum(LedgerJournalTrans, AmountCurDebit));
sysTableLookup.addLookupfield(fieldNum(LedgerJournalTrans, AmountCurCredit));

qbds = query.addDataSource(tableNum(LedgerJournalTrans));
qbds.addRange(fieldNum(LedgerJournalTrans,Voucher)).value(queryValue(dialogVoucher.value()));
qbds.addRange(fieldNum(LedgerJournalTrans,TransDate)).value(queryValue(dialogTransDate.value()));
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
}

Classes'ı çalıştırdığımıda fiş ve fiş tarihi girdiğimizde dialogJournalRecId alanında yukarıda belirttiğimiz alanları gösteren bir lookup açılacaktır. Benzer yöntemlerle lookup haricindeki diğer özellikleri de kullanabilirsiniz.

Yukarıda yazılan metodların içeriklerine ve detaylarına girmedim. Bunlarla ilgili açıklamaları birçok yerde bulabilirsiniz.

Volkan Acar

volkan.vacar@gmail.com

1 yorum:

Adsız dedi ki...

Volkan eline sağlık.Gayet güzel olmuş ancak override ettiğin Lookup methodunun çalışması için Classın DialogPostRun methodunu aşağıdaki gibi override etmemiz gerekmekte.
public void dialogPostRun(DialogRunbase dialog)
{
super(dialog);
dialog.dialogForm().formRun().controlMethodOverload(true);
dialog.dialogForm().formRun().controlMethodOverloadObject(this);

}