Merhaba,Bu yazımda kaldığımız yerden devam edeceğiz.Şimdi “SyTrainingLookupTable1″ tablosunun altına aşağıdaki methodu yazalım.Bu method standart’da kullanılan lookup methodudur.”SyTrainingLookupTable1” tablosunun alanlarını form içerisinde gösterelim.
“SyTrainingLookupTable1” tablosunun altına aşağıdaki methodu yazalım.
static public void lookupVehicleId(FormControl _formControl) { Query query = new Query(); QueryBuildDataSource queryBuildDataSource; SysTableLookup sysTableLookup; ; query.addDataSource(tablenum(SyTrainingLookupTable1)); sysTableLookup = SysTableLookup::newParameters(tablenum(SyTrainingLookupTable1), _formControl); sysTableLookup.addLookupfield(fieldnum(SyTrainingLookupTable1, VehicleId)); sysTableLookup.addLookupfield(fieldnum(SyTrainingLookupTable1, Description),true); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); }
SyTrainingMainTable form’u içerisinde DataSource içindeki VehicleId alanının lookup methodunu overwrite edelim ve “SyTrainingLookupTable1” tablosunun altına yazdığımız methodu çağıralım.
Aşağıdaki kodları yazalım ve formumuzu açıp kontrol edelim.
public void lookup(FormControl _formControl, str _filterStr) { ; //super(_formControl, _filterStr); SyTrainingLookupTable1::lookupVehicleId(_formControl); }
Görüldüğü gibi tablo içerisindeki alanlar otomatik olarak seçimli bir şekilde gelmiştir.
Şimdi aynı işlemi önceki yazılarımızda belirtiğimiz SysMultiTableLookup class’ını kullanarak yapalım.
static public void lookupVehicleId(FormControl _formControl) { Query query = new Query(); QueryBuildDataSource qbdsItem; SysMultiTableLookup sysTableLookup; ; qbdsItem = query.addDataSource(tableNum(SyTrainingLookupTable1)); sysTableLookup = SysMultiTableLookup::newParameters(_formControl, query); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable1, VehicleId),true); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable1, Description)); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); }
Formumuzu açalım ve kayıtlarımıza bir göz atalım.Yapılan işlem tamamiyle aynıdır.
Şuana kadar tüm lookup methodlarında tek bir tablodan alanları seçip hangi alanın seçileceğini belirttik ve filtreleme özelliklerini gösterdik.Şimdi ise 2 farklı tablodan eşleşmiş kayıtlar getirelim.
static public void lookupVehicleId(FormControl _formControl) { Query query = new Query(); QueryBuildDataSource qbdsDataSource1; QueryBuildDataSource qbdsDataSource2; SysMultiTableLookup sysTableLookup; ; qbdsDataSource1 = query.addDataSource(tableNum(SyTrainingLookupTable1)); qbdsDataSource2 = qbdsDataSource1.addDataSource(tableNum(SyTrainingLookupTable2)); qbdsDataSource2.relations(true); sysTableLookup = SysMultiTableLookup::newParameters(_formControl, query); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable1, VehicleId),1); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable1, Description),1); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable2, VehicleId),2); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable2, VehicleType),2); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); }
Formumuzu açalım ve kayıtlarımıza bir göz atalım.Burada 2 farklı dataSource birleştirildikten sonra tüm alanlar seçilmektedir.
Eğer “qbdsDataSource2.relations(true);” kodunu kullanmamış olsaydık tablolar arasında ilişkiyi dikkate almaz ve crossjoin (Kartezyen) ifadesi yapardı tüm alanları birbirleriyle eşleştirerek getirirdi.Örnek olarak aşağıdaki kodu yazalım ve tekrar deneyelim.
static public void lookupVehicleId(FormControl _formControl) { Query query = new Query(); QueryBuildDataSource qbdsDataSource1; QueryBuildDataSource qbdsDataSource2; SysMultiTableLookup sysTableLookup; ; qbdsDataSource1 = query.addDataSource(tableNum(SyTrainingLookupTable1)); qbdsDataSource2 = qbdsDataSource1.addDataSource(tableNum(SyTrainingLookupTable2)); sysTableLookup = SysMultiTableLookup::newParameters(_formControl, query); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable1, VehicleId),1); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable1, Description),1); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable2, VehicleId),2); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable2, VehicleType),2); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); }
Formumuzu açalım ve kayıtlarımıza bir göz atalım.
Aşağıdaki kodu yazalım ve tekrar deneyelim.Burada ise ilişki türünü 1-1 ya da 1-n olarak belirleyebilirsiniz.
static public void lookupVehicleId(FormControl _formControl) { Query query = new Query(); QueryBuildDataSource qbdsDataSource1; QueryBuildDataSource qbdsDataSource2; SysMultiTableLookup sysTableLookup; ; qbdsDataSource1 = query.addDataSource(tableNum(SyTrainingLookupTable1)); qbdsDataSource2 = qbdsDataSource1.addDataSource(tableNum(SyTrainingLookupTable2)); qbdsDataSource2.relations(true); qbdsDataSource2.fetchMode(QueryFetchMode::One2One); //or use One2Many sysTableLookup = SysMultiTableLookup::newParameters(_formControl, query); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable1, VehicleId),1); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable1, Description),1); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable2, VehicleId),2); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable2, VehicleType),2); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); }
Formumuzu açalım ve kayıtlarımıza bir göz atalım.
Şimdi ise farklı bir yapı olan Display method’ları nasıl lookup methodlarına ekleyeceğimizi göreceğiz.SysTrainingLookupDisplayTable tablosunda ilişki kurularak buradaki Price alanını kod ile getirelim ve method şeklinde lookup methoduna ekleyelim.Display methodların yapılabilmesi için find methodları hangi tablodan veri çekicek ise o tablonun altına yazılır.SysTrainingLookupDisplayTable tablosunun altına aşağıdaki find methodunu yazalım.Find methodları bir kayıt’a karşılık sadece tek bir kayıt geriye döndermek zorundadır.Bunun için find methodu genelde PrimaryKey yada tekrar etmeyen alanlar için kullanılır.
Aşağıdaki kodları yazalım.
static SysTrainingLookupDisplayTable find(Integer _vehicleId, boolean _forUpdate = false) { SysTrainingLookupDisplayTable trainingTable1; ; if (_vehicleId) { if (_forUpdate) trainingTable1.selectForUpdate(_forUpdate); select firstonly trainingTable1 where trainingTable1.VehicleId == _vehicleId; } return trainingTable1; }
Şimdi SyTrainingLookupTable1 tablosunun altına dispPrice adında bir method yazalım.
Aşağıdaki kodları yazalım.
display real dispPrice() { return SysTrainingLookupDisplayTable::find(this.VehicleId).Price; }
Bu kod ile SysTrainingLookupDisplayTable tablosuna gidip SyTrainingLookupTable1 tablosunun VehicleId alanıyla eşleşen Price bilgilerini buradaki tabloya getirir.Şimdi bu methodu lookup methodumuza ekleyelim.Lookup methodunu açalım ve aşağıdaki değişiklikleri yapalım.
static public void lookupVehicleId(FormControl _formControl) { Query query = new Query(); QueryBuildDataSource qbdsDataSource1; QueryBuildDataSource qbdsDataSource2; SysMultiTableLookup sysTableLookup; ; qbdsDataSource1 = query.addDataSource(tableNum(SyTrainingLookupTable1)); qbdsDataSource2 = qbdsDataSource1.addDataSource(tableNum(SyTrainingLookupTable2)); qbdsDataSource2.relations(true); qbdsDataSource2.fetchMode(QueryFetchMode::One2One); sysTableLookup = SysMultiTableLookup::newParameters(_formControl, query); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable1, VehicleId),1); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable1, Description),1); sysTableLookup.addLookupMethod(tableMethodStr(SyTrainingLookupTable1, dispPrice), 1, "Ücret Alanı"); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable2, VehicleId),2); sysTableLookup.addLookupField(fieldNum(SyTrainingLookupTable2, VehicleType),2); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); }
Buradaki addLookupMethod ile bir methodu ekleyebilirsiniz.”Ücret Alanı” ile display method’un etiketini belirleyebilirsiniz.
Formumuzu açalım ve kayıtlarımıza bir göz atalım.
Açıklamak için aşağıdaki şekli inceleyelim.
Yardımcı olması dileklerimle..