Hi All,
I've been struggling to create a Chain of Command-based form control lookup override for a while now, and I didn't see anything on it in the forums, so I thought I'd share. First, just a reminder of the event-based approach we all know and hate (okay, maybe just I hate it .. I just don't want to use attributes on my code if I don't have to).
An example of what I'll call the "old way":
class ExampleForm_EventHandler
{
[FormEventHandler(formStr(FormImChanging), FormEventType::Initialized)]
public static void FormImChanging_OnInitializing(xFormRun sender, FormEventArgs e)
{
ExampleForm_EventHandler overrideHandler = new ExampleForm_EventHandler();
FormStringControl targetControl = sender.control(sender.controlId(formControlStr(FormImChanging, targetControl)));
targetControl.registerOverrideMethod(methodStr(FormDataObject, lookup), methodStr(ExampleForm_EventHandler, lookupOverride), overrideHandler);
}
public void lookupOverride(FormStringControl _callingControl)
{
SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(SomePertinentTable), _callingControl);
sysTableLookup.addLookupfield(fieldNum(SomePertinentTable, UsefulField1), true);
sysTableLookup.addLookupfield(fieldNum(SomePertinentTable, UsefulField2));
Query q = new Query();
q.addDataSource(tableNum(SomePertinentTable)).addRange(fieldNum(SomePertinentTable, NoYesFieldIWantToConstrain)).value(queryValue(NoYes::No));
// Run lookup
sysTableLookup.parmQuery(q);
sysTableLookup.performFormLookup();
}
}
Now, the "new way" (Chain of Command) that I finally got working today (using the same bogus names from the above code sample):
[ExtensionOf(formstr(ExampleForm))]
final class ExampleForm_FormIan_Extension
{
void init()
{
next init();
//Assumes TargetControl is auto-declared, but we can get to it even if it's not
TargetControl.registerOverrideMethod(methodStr(FormDataObject, lookup), formMethodStr(ExampleForm, ianCustomLookup));
}
public void ianCustomLookup(FormStringControl _callingControl)
{
SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(SomePertinentTable), _callingControl);
sysTableLookup.addLookupfield(fieldNum(SomePertinentTable, UsefulField1), true);
sysTableLookup.addLookupfield(fieldNum(SomePertinentTable, UsefulField2));
Query q = new Query();
q.addDataSource(tableNum(SomePertinentTable)).addRange(fieldNum(SomePertinentTable, NoYesFieldIWantToConstrain)).value(queryValue(NoYes::No));
// Run lookup
sysTableLookup.parmQuery(q);
sysTableLookup.performFormLookup();
}
}
Hope this helps somebody!