Eki 15, 2014 - Formlar (Forms), Query    Yorum Yok

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.

formfiltreleme

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.

formrange

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.

Erkan OĞUZ

Önceki Konu->

<- Sonraki Konu

Benzer yazılar

Yorum Yazın...