Announcements
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!
Thank you Blue - I went ahead and did that, we'll see what they think!
André Arnaud de Cal...
294,060
Super User 2025 Season 1
Martin Dráb
232,858
Most Valuable Professional
nmaenpaa
101,158
Moderator