Представляю подробную шпаргалку, как перекрыть метод lookup()
на диалоге класса в Microsoft Dynamics AX 2009.
В качестве примера выбрано поле InventLocation
, которое зависит от поля InventSiteId
. Выпадающий список складов на форме диалога должен ограничиваться в зависимости от выбранного значения в поле InventSiteId
.
1. В ClassDeclaration
class Class1 extends RunBaseBatch { InventSiteId mInventSiteId; InventLocationId mInventLocationId; DialogField mDialogInventSiteId; FormBuildStringControl mFBSControlInventLocationId; FormStringControl mFSControlInventLocationId; }
2. Перекрыть метод dialog()
protected Object dialog(DialogRunbase _dialog, boolean forceOnClient) { DialogRunbase dialog; DialogGroup dialogGroup; ; dialog = super(_dialog, forceOnClient); dialogGroup = dialog.addGroup("Складские аналитики"); mDialogInventSiteId = dialog.addFieldValue(TypeId(InventSiteId), mInventSiteId); mFBSControlInventLocationId = dialogGroup.formBuildGroup().addControl(FormControlType::String, "dialogInventLocationId"); mFBSControlInventLocationId.extendedDataType(extendedtypenum(InventLocationId)); mFBSControlInventLocationId.text(mInventLocationId); return dialog; }
3. Перекрыть метод dialogPostRun()
public void dialogPostRun(DialogRunbase _dialog) { FormRun formRun; super(_dialog); //lookup and validation for inventlocationId is overridden formRun = _dialog.dialogForm().formRun(); formRun.controlMethodOverload(true); formRun.controlMethodOverloadObject(this); //do casting from formbuildstringcontrol to formstringcontrol mFSControlInventLocationId = formRun.design().control(mFBSControlInventLocationId.id()); }
4. Создать метод dialogInventLocationId_lookup()
void dialogInventLocationId_lookup() { ; InventLocation::lookupBySiteIdAllTypes(mFSControlInventLocationId, mDialogInventSiteId.value()); }
5. Перекрыть метод getFromDialog()
public boolean getFromDialog() { boolean ret; ; ret = super(); mInventSiteId = mDialogInventSiteId.value(); mInventLocationId = mFSControlInventLocationId.text(); return ret; }
6. Метод содержит lookupBySiteIdAllTypes()
следующий код:
public client static void lookupBySiteIdAllTypes(FormStringControl ctrl, InventSiteId inventSiteId) { SysTableLookup sysTableLookup = SysTableLookup::newParameters(tablenum(InventLocation), ctrl); Query query = new Query(); QueryBuildDataSource queryBuildDataSource; ; sysTableLookup.addLookupfield(fieldnum(InventLocation, InventLocationId)); sysTableLookup.addLookupfield(fieldnum(InventLocation, Name)); sysTableLookup.addLookupfield(fieldnum(InventLocation, InventSiteId)); queryBuildDataSource = query.addDataSource(tablenum(InventLocation)); if (inventSiteId) queryBuildDataSource.addRange(fieldnum(InventLocation, InventSiteId)).value(queryValue(inventSiteId)); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); }