Form Üzerinde Sorgu(Filtre) Oluşturma
Bu konumuzda form üzerinden istenilen alanlara göre filtre nasıl verilir sorguları nasıl oluşturulur inceleyeceğiz.
Formlar üzerinde filtre yapmanın en basit yolu grid üzerindeyken CTRL + G tuşlarını kullanarak alanların üzerinde değer girilcek bölümler açılır ve bu bölümlere değerler girerek grid üzerinde istenilen veriler süzülmüş olur. Ancak bazı durumlarda ekrandaki alanlar yeterli gelmez ve form üzerinde alanlar açılarak bu alanlar üzerinden filtre yapılması gerekmektedir. Bu gibi durumlarda datasource’un query’si üzerinde sorgular yazılarak form üzerinde filtreler oluşturulabilir.
Örnek olarak kendimize bir SalesLine ve InventDim datasourcelu bir form oluşuturalım.
Filtre için kullanacağımız alanların değerlerini kodda kullanabilmemiz için AutoDeclaration özelliğini “Yes” yapmamız gerekmektedir.
Resimdeki gibi bir formumuz oluşmuş oldu.
Şimdi yazmamız gereken kodları bir göz atalım.
//ClassDeclaration public class FormRun extends ObjectRun { boolean isItemType; boolean isAddInvTable; boolean isAddCustTable; QueryBuildDataSource qbds,qbdsInventTable,qbdsDim,qbdsCustTable; }
//FormMethod public void filterMethod() { //filtre kısmındaki değerleri alabilmeniz için ilgili alanların AutoDeclaration özellikleri Yes olmalıdır. qbds = SalesLine_ds.query().dataSourceTable(tableNum(SalesLine)); //salesLine querysi bir QueryBuildDataSource atılarak tekrar tekrar yazılması önlenir. //Her butona tıklandığında daha önceki filtreler silinsin diye kullanılır qbds.clearRanges(); if(isAddInvTable) qbdsInventTable.clearRanges(); if(isAddCustTable) qbdsCustTable.clearRanges(); //Her alanın önce boş olup olmadığı kontrol edilerek filtre(Range) eklenir. if(StartDate.dateValue() && EndDate.dateValue()) //Tarih alanlarındaki değerleri DateValue ile alabilirsiniz. qbds.addRange(fieldNum(SalesLine,ConfirmedDlv)).value(strFmt("%1..%2",StartDate.dateValue(),EndDate.dateValue())); //İki tarih aralığı için birincitarih..ikincitarih yazarsanız aralığı almış olursunuz if(SalesIdRange.valueStr()) //SalesId filtresi qbds.addRange(fieldNum(SalesLine,SalesId)).value("*" + SysQuery::value(SalesIdRange.valueStr())); //yukardaki kodla SalesId nin sadece sonunu girerekte filtre yapmış olursunuz if(SalesStatusRange.valueStr())//Durum filtresi qbds.addRange(fieldNum(SalesLine,SalesStatus)).value(SalesStatusRange.valueStr()); if(isItemType) //ItemTypein default değeri dolu olduğu için alanın doluğununu değil değişip değişmediğini kontrol ederiz. { //ItemType alanı InventTableda olduğu için eklemek gerekiyor. if(!isAddInvTable) //Her seferinde eklemesi için form açık olduğu sürece kontrol edilir. { qbdsInventTable = qbds.addDataSource(tableNum(InventTable)); qbdsInventTable.relations(true); isAddInvTable = true; } qbdsInventTable.clearRanges(); qbdsInventTable.addRange(fieldNum(InventTable,ItemType)).value(ItemTypeRange.valueStr()); } if(InventLocationIdRange.valueStr()) //InventDim datasourceundaki InventLocationId filtreleme { qbdsDim = InventDim_ds.query().dataSourceTable(tableNum(InventDim)); qbdsDim.addRange(fieldNum(InventDim,InventLocationId)).value(InventLocationIdRange.valueStr()); } if(CustAccountRange.valueStr())//Müşteri filtresi qbds.addRange(fieldNum(SalesLine,CustAccount)).value(CustAccountRange.valueStr()); if(VATNumRange.valueStr()) //Vergi numarası filtresi { //Vergi numarası alanı CustTableda olduğu için eklemek gerekiyor. if(!isAddCustTable) //Her seferinde eklemesi için form açık olduğu sürece kontrol edilir. { qbdsCustTable = qbds.addDataSource(tableNum(CustTable)); qbdsCustTable.relations(true); isAddCustTable = true; } qbdsCustTable.clearRanges(); qbdsCustTable.addRange(fieldNum(CustTable,VATNum)).value("*" + SysQuery::value(VATNumRange.valueStr())); //Vergi numarası bir kısmı girilerek filtreleme gerçekleştirilir. } }
//ItemTypeRange modified methodu public boolean modified() { boolean ret; ret = super(); isItemType = true; //ItemTypein default değeri dolu olduğu için değişip değişmediğini kontrol ederiz. return ret; }
//SearchBtn in clikced methodu void clicked() { element.filterMethod(); //Filtreleme için yazılan method çağrılır. SalesLine_ds.executeQuery(); //Verilen Rangelerin çalışması için executeQuery methodu çalıştırılır. }
Formu oluşturup Gerekli kodları yazdıktan sonra ekran çıkışı aşağıdaki gibi olacaktır.
Querylerle range oluştururken value değeri verebilmek için bir çok yöntem vardır. Bir kaçından bahsetmeye çalıştım. Daha detaylı yöntemleri bir sonraki konuda vermeye çalışacağım.
Daha detaylı inceleyebilmek için linkteki projeyi indirebilirsiniz.
Link : Erkn_Form_Uzerinde_Sorgu_Olusturma
Not: Projeyi Axapta üzerinden içeri aldıktan sonra formu Restore yaparsanız hatasız çalışacaktır.