Lesson60- Lookup 5 (SysMultiTableLookup)

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.

85

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.

86

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.

87

Ş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.

88

Ş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.

89

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.

90

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.

91

Ş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.

92

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.

93

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.

94

Açıklamak için aşağıdaki şekli inceleyelim.

95

Yardımcı olması dileklerimle..

Yorum bırakın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.