Lookup

Lookup
Lookup with group by in a string edit
Lookup on a string edit for filter
Lookup on a real edit
How works the auto Lookup

lookup

//=========
// LOOKUP =
//=========
//Dans le Champ du DataSource on definit une methode Lookup. In the field of the DS we overwrite the lookup method.
//Le bon usage : mettre le code ans la table Table - Best practices : put the code in the table
//
public void lookup(FormControl _formControl, str _filterStr)
{
    ;
    WMSLocation::lookupLocationIdType(_formControl);
}

//Table WMSLocation
-------------------
public client static void lookupLocationIdType(FormStringControl   _ctrl)
{
    SysTableLookup          sysTableLookup;
    QueryBuildDataSource    queryBuildDataSource;
    QueryBuildRange         queryBuildRange;
    Query                   query;

    ;
    sysTableLookup = SysTableLookup::newParameters(tablenum(WMSLocation), _ctrl);
    query = new Query();
    queryBuildDataSource = query.addDataSource(tablenum(WMSLocation));

    sysTableLookup.addLookupfield(fieldnum(WMSLocation, inventLocationId));  X------------------add a column, if not pb


    sysTableLookup.parmQuery(query);    //lie la query au lookup - link the query to the lookup

    sysTableLookup.performFormLookup(); //Execute le lookup
}

//Class sysTableLookup
static SysTableLookup newParameters(tableId tableId, FormControl callingControl, boolean useLookupValue = true)
{
    SysTableLookup  sysTableLookup = SysTableLookup::construct();
    ;
    sysTableLookup.parmTableId(tableId);
    sysTableLookup.parmCallingControl(callingControl);
    sysTableLookup.parmUseLookupValue(useLookupValue); //true -> valeur renvoyee = callingControl - value send = CallingControl ?
    return sysTableLookup;
}


//Ajouter un champ au lookup - To add a field to the lookup
//
sysTableLookup.addLookupfield(fieldnum(InventQuarantineOrder, QuarantineId));

//Ajouter une methode display - To add a display method
//
sysTableLookup.addLookupMethod(tablemethodstr(WMSLocation, inventSiteId));


//=======================================================================================================================================//
//Autre example - Another Example
//Table : WMSJournalTable
//-----------------------
boolean lookupInventTransRefId(FormStringControl _lookupCtrl)
{
    switch(this.InventTransType)
    {
        case InventTransType::Production:
            ProdTable::wmsRegisterProdLookup(_lookupCtrl);
            return true;
        case InventTransType::Purch:
            this.purchIdLookup(_lookupCtrl);
            return true;
        case InventTransType::Sales:
            this.salesIdLookup(_lookupCtrl);
            return true;
        case InventTransType::QuarantineOrder:
            this.lookupQuarantineOrder(_lookupCtrl);
            return true;
        case InventTransType::TransferOrderReceive:
            InventTransferTable::lookupWMSReception(_lookupCtrl);
            return true;
    }
    return false;
}

public void lookupQuarantineOrder(FormStringControl _lookupCtrl)
{
    ;
    InventQuarantineOrder::lookupWMSReception(_lookupCtrl);
}


Table : InventQuarantineOrder
-----------------------------
static void lookupWMSReception(FormStringControl ctrl)
{
    SysTableLookup              sysTableLookup = SysTableLookup::newParameters(tablenum(InventQuarantineOrder), ctrl);
    Query                       query = new Query();
    QueryBuildDataSource        queryBuildDataSource;
    QueryBuildDataSource        queryBuildDataSource1;
    QueryBuildRange             queryBuildRange;
    ;
    sysTableLookup.addLookupfield(fieldnum(InventQuarantineOrder, QuarantineId));
    sysTableLookup.addLookupfield(fieldnum(InventQuarantineOrder, Name));
    sysTableLookup.addLookupfield(fieldnum(InventQuarantineOrder, Status));

    queryBuildDataSource = query.addDataSource(tablenum(InventQuarantineOrder));
    queryBuildDataSource.addSortField(fieldnum(InventQuarantineOrder, Status), SortOrder::Descending); // show reported as finished before created
    queryBuildDataSource.addSortField(fieldnum(InventQuarantineOrder, QuarantineId), SortOrder::Ascending);

    queryBuildRange = queryBuildDataSource.addRange(fieldnum(InventQuarantineOrder, Status));
    queryBuildRange.value(queryRangeConcat(SysQuery::value(InventQuarantineStatus::Created), SysQuery::value(InventQuarantineStatus::ReportedFinished)));

    queryBuildDataSource1 = queryBuildDataSource.addDataSource(tablenum(InventTrans));
    queryBuildDataSource1.joinMode(JoinMode::ExistsJoin);
    queryBuildDataSource1.relations(true);

    queryBuildRange = queryBuildDataSource1.addRange(fieldnum(InventTrans, StatusReceipt));
    queryBuildRange.value(SysQuery::value(StatusReceipt::Ordered));

    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
}
	

Method 
------
the call of the lookup is in the field of the dataSource.
public void lookup(FormControl _formControl, str _filterStr)
{
    ;
    if (!wmsBillOfLading.lookupInventTransRefId(_formControl))
        super(_formControl, _filterStr);
}

Form Lookup Form : Example in SalesTable.
-----------------------------------------
public void lookup(FormControl _formControl, str _filterStr)
{
    Args    args;
    FormRun formRun;

    ;
    // PBa
    if (PBAParameters::find().LookupMethod == PBALookupMethod::Configurable)
    {
        args = new Args(formstr(PBAItemIdLookup));
        args.caller(element);
        args.record(salesLine);
        formRun = classfactory.formRunClass(args);
        formRun.init();
        this.performFormLookup(formRun, _formControl);
    }
    else
        super(_formControl, _filterStr);

}

Lookup with group by in a string edit

public void lookup()
{
    ;
    table1::SPLLookupOprId(this,projId);
}
static void SPLLookupOprId(FormStringControl ctrl,ProjId _projId)
{
    SysTableLookup              sysTableLookup = SysTableLookup::newParameters(tablenum(table1), ctrl);
    Query                       query = new Query();
    QueryBuildDataSource        queryBuildDataSource;
    QueryBuildRange             queryBuildRange;
    ;
    if (!_projId)
        return;

    sysTableLookup.addLookupfield(fieldnum(table1, OprID));  //return this field event if it isn't the key. (Checked!!!, good)

    queryBuildDataSource = query.addDataSource(tablenum(table1));
    queryBuildDataSource.addGroupByField(fieldnum(table1, OprID));
    queryBuildDataSource.addSortField(fieldnum(table1, OprID), SortOrder::Ascending);

    queryBuildRange = queryBuildDataSource.addRange(fieldnum(table1,ProjID));
    queryBuildRange.value(Queryvalue(_projId));
    queryBuildRange = queryBuildDataSource.addRange(fieldnum(table1,ProjID));

    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
}
Lookup

// to avoid the problem that the lookup doesn't work :
public void lookup()
{
    ;
    oprIdFilter.text("");  //We put null in the field before the lookup
    table1::SPLLookupOprId(this,projId);
}

Lookup on a string edit for filter

	On a string Edit

Lookup on a real edit for filter

// the type of control is FormRealControl !!!!!
static void SPLLookupDiraNum(FormRealControl ctrl,ProjId _projId)
{
    SysTableLookup              sysTableLookup = SysTableLookup::newParameters(tablenum(OferKablanConstructionOnAccount), ctrl);
    Query                       query = new Query();
    QueryBuildDataSource        queryBuildDataSource;
    QueryBuildRange             queryBuildRange;
    ;
    if (!_projId)
        return;
    SysTableLookup.addLookupfield(fieldnum(OferKablanConstructionOnAccount, DiraNum));
    queryBuildDataSource = query.addDataSource(tablenum(OferKablanConstructionOnAccount));
    queryBuildDataSource.addGroupByField(fieldnum(OferKablanConstructionOnAccount, DiraNum));
    queryBuildDataSource.addSortField(fieldnum(OferKablanConstructionOnAccount, DiraNum), SortOrder::Ascending);

    queryBuildRange = queryBuildDataSource.addRange(fieldnum(OferKablanConstructionOnAccount,ProjID));
    queryBuildRange.value(Queryvalue(_projId));
    queryBuildRange = queryBuildDataSource.addRange(fieldnum(OferKablanConstructionOnAccount,ProjID));

    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
}
// We need to change the standard method of the class
void performFormLookup()
{
    FormStringControl   callingStringControl;
    FormIntControl      callingIntControl;
    FormInt64Control    callingInt64Control;
    FormDateControl     callingDateControl;
    ;
    if (!callingControl)
        throw(error(Error::wrongUseOfFunction(funcname())));

    switch (callingControl.handle())
    {
        case classnum(FormStringControl):
            callingStringControl = callingControl;
            callingStringControl.performFormLookup(this.formRun());
            break;
        case classnum(FormIntControl):
            callingIntControl = callingControl;
            callingIntControl.performFormLookup(this.formRun());
            break;
        case classnum(FormInt64Control):
            callingInt64Control = callingControl;
            callingInt64Control.performFormLookup(this.formRun());
            break;
        case classnum(FormDateControl):
            callingDateControl = callingControl;
            callingDateControl.performFormLookup(this.formRun());
            break;
        // 04/05/2017-BEGIN
        case classnum(FormRealControl):
            callingDateControl = callingControl;
            callingDateControl.performFormLookup(this.formRun());
            break;
        // 04/05/2017-END
    }
}

How works the auto Lookup

//By default if there is nothing in the group autoLookup, the lookup take
//all the fields of the key.
	On a string Edit