Бывают задачи, когда в Dynamics AX 2012 необходимо на диалоге создать лукап со множественным выбором, построенным на BaseEnum.
Нужна возможность выбора больше чем одного значения:

Например, пользователь хочет выбрать одновременно Запланировано и Выплачено.
Как это реализовать?
Одним из решений является использование temp table + query + SysLookupMultiSelect*.
Вот пример реализации класса для решения этой задачи:
class StackOverflowTestDialog extends RunBase
{
DialogRunbase dlg;
FormBuildStringControl formBuildCtrl;
SysLookupMultiSelectCtrl sysLookupMultiSelectCtrl;
}
static void main(Args _args)
{
StackOverflowTestDialog testDialog = new StackOverflowTestDialog();
if (testDialog.prompt())
{
testDialog.run();
}
}
public Object dialog()
{
DialogGroup dlgGrp;
FormBuildControl grpCtrl;
dlg = super();
dlgGrp = dlg.addGroup();
grpCtrl = dlg.formBuildDesign().control(dlgGrp.formBuildGroup().id());
formBuildCtrl = grpCtrl.addControl(FormControlType::String, identifierstr(ctrlTypes));
formBuildCtrl.label("@SYS329959");
return dlg;
}
public void dialogPostRun(DialogRunbase _dialog)
{
CFMEnumLookupTmp lookupTmp;
FormRun formRun;
Query q;
QueryRun qr;
QueryBuildDataSource qbds;
DictEnum dictEnum;
int i;
super(dlg);
formRun = _dialog.dialogForm().formRun();
if (formRun)
{
//Fill in temporary table with enum values
dictEnum = new DictEnum(enumNum(SubledgerJournalEntryType));
for (i = 0; i < dictEnum.values(); i++)
{
lookupTmp.EnumValueLabelText = dictEnum.index2Label(i);
lookupTmp.insert();
}
//Prepare a queryRun to work with the temporary table
q = new Query();
qbds = q.addDataSource(tableNum(CFMEnumLookupTmp));
qbds.addSelectionField(fieldNum(CFMEnumLookupTmp, EnumValueLabelText));
qr = new QueryRun(q);
qr.setCursor(lookupTmp);
//Multi-select control framework class
sysLookupMultiSelectCtrl = SysLookupMultiSelectCtrl::constructWithQueryRun(
formRun,
formRun.design().control(formBuildCtrl.id()),
qr,
true,
[tableNum(CFMEnumLookupTmp), fieldNum(CFMEnumLookupTmp, EnumValueLabelText)]
);
}
}
public boolean getFromDialog()
{
if (sysLookupMultiSelectCtrl)
{
info('Result: ' + con2Str(sysLookupMultiSelectCtrl.getSelectedFieldValues()));
}
return true;
}
В результате диалог будет выглядеть следующим образом:


По нажатию «ОК»:

Ссылка на источник: https://stackoverflow.com/questions/50700247/how-to-create-the-dialog-lookup-multiselect-from-baseenum
Все комментарии
Чтобы оставить комментарий, необходимо войти или зарегистрироваться.
Пока нет комментариев. Будьте первым!