Skip to main content

Notifications

Announcements

No record found.

Community site session details

Community site session details

Session Id :

Generic SysTableLookup Method

Muhammad Afsar Khan Profile Picture Muhammad Afsar Khan 2,676
It is often needed to write a custom lookup method and the SysTableLookup class can be useful to create lookups from code. However the following method uses the SysTableLookup in the background but can be called easier.

When using the SysTableLookup class, for most of the simple lookups (1 datasource table) it is alway the same. You need the following :

TableId, LookupControl, LookupFields, ReturnFields, SortFields and sometimes the use of a tmpTable.

Now following method is a generic method to user the SysTableLookup class :

public static void doLookup(TableId _tableId,
Container _lookupFields,
Container _sortFields,
FormStringControl _control,
FieldId _returnItemFieldNum,
Map _queryRanges = null,
Boolean _useTmpTable = false,
Common _tmpBuffer = null
)
{
SysTableLookup sysTableLookup = SysTableLookup::newParameters(_tableId, _control);
Query query = new Query();
QueryBuildDataSource qbds;
int i;
fieldId lookupFieldId;
;

for(i=1;i <= conlen(_lookupFields);i++)
{
lookupFieldId = conPeek(_lookupFields, i);

if(lookupFieldId == _returnItemFieldNum)
sysTableLookup.addLookupfield(lookupFieldId, true);
else
sysTableLookup.addLookupfield(lookupFieldId);
}

qbds = query.addDataSource(_tableId);

for(i=1;i <= conlen(_sortFields);i++)
{
qbds.addSortField(conPeek(_sortFields, i));
}


if(_queryRanges)
{
rangeEnumerator = _queryRanges.getEnumerator();

while (rangeEnumerator.moveNext())
{
qbds.addRange(rangeEnumerator.currentKey()).value(any2Str(rangeEnumerator.currentValue()));
}
}
if(_useTmpTable)
sysTableLookup.parmTmpBuffer(_tmpBuffer);

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

Now when you want to create a lookup you can do it easier by doing the following :

public void lookup()
{
Container fieldNums = [FieldNum(CustTable, AccountNum), FieldNum(CustTable, Name)];
Container sortFields = [FieldNum(CustTable, AccountNum)];
FieldId returnFieldId = FieldNum(CustTable, AccountNum);
Map queryRanges = new Map(Types::Integer, Types::String);
;
queryRanges.insert(FieldNum(CustTable, AccountNum), '4000');
LIBSysTableLookup::doLookup(TableNum(CustTable), fieldNums, sortFields, this, returnFieldId, queryRanges);
}

So the only thing you need to do is specify the fields, returnfields and sortfields…

Ans let’s look at the following example : We need a lookup with a temporary table. Then we can do it like this :

Container fieldNums = [FieldNum(TmpIdRef, Name), FieldNum(TmpIdRef, HelpTxt)];
Container sortFields = [FieldNum(TmpIdRef, Name)];
FieldId returnFieldId = ConPeek(fieldNums, 1);
TmpIdRef tmpTable;
;
tmpTable = LIBDifferenceAction::BuildActionClassList();

LIBSysTableLookup::doLookup(TableNum(TmpIdRef), fieldNums, sortFields, this, returnFieldId, true, tmpTable);

This was originally posted here.

Comments

*This post is locked for comments