Wednesday, May 9, 2012

Filtered lookups on SysQueryForm

I was asked to filter the lookup on the JournalNum field in the Select Query form. Nornally the lookup on this field would display all JournalNums, but the client only wanted to see Vendor Payment journals.

To achieve this I modified the SysQueryForm, specifically the lookup method on the RangeValue field of the Range dataset.

What my code does is use a custom lookup filtered by JournalType.

 public void lookup(FormControl _formControl, str _filterStr)  
 {  
   SysTableLookup   sysTableLookup;  
   SysDictField    sysDictField;  
   QueryBuildRange   rangeJournalType;  
   Query        query;  
   TmpSysQuery     tmpSysQuery;  
   ;  
   sysDictField = new SysDictField(Range.Table_Id, Range.Field_Id);  
   if (sysDictField.typeId() == extendedTypeNum(ledgerJournalId))  
   {  
     //Search range records for LedgerJournalTable.JournalType so that we can use this to filter the lookup for JournalNum  
     for (tmpSysQuery = Range_DS.getFirst(); tmpSysQuery; tmpSysQuery = Range_DS.getNext())  
     {  
       if (tmpSysQuery.Table_Id == tableNum(LedgerJournalTable) &&  
         tmpSysQuery.Field_Id == fieldId2Ext(fieldNum(LedgerJournalTable, JournalType), 1))  
       {  
         break;  
       }  
     }  
     // If a range value exists for JournalType then perform a filtered lookup of JournalNum  
     if (tmpSysQuery.RangeValue)  
     {  
       sysTableLookup = SysTableLookup::newParameters(tableNum(LedgerJournalTable), _formControl);  
       sysTableLookup.addLookupfield(fieldNum(LedgerJournalTable, JournalNum));  
       sysTableLookup.addLookupfield(fieldNum(LedgerJournalTable, JournalName));  
       sysTableLookup.addLookupfield(fieldNum(LedgerJournalTable, Name));  
       sysTableLookup.addLookupfield(fieldNum(LedgerJournalTable, JournalType));  
       query = new Query();  
       SysQuery::findOrCreateDataSource(query, tableNum(LedgerJournalTable)).addRange(fieldnum(LedgerJournalTable, JournalType)).value(tmpSysQuery.RangeValue);  
       sysTableLookup.parmQuery(query);  
       sysTableLookup.performFormLookup();  
     }  
     else  
     {  
       SysLookup::lookupRange(_formControl, range, sysQueryForm.query());  
     }  
   }  
   else  
   {  
     SysLookup::lookupRange(_formControl, range, sysQueryForm.query());  
   }  
 }