Представляю подробную шпаргалку, как перекрыть метод 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();
}