Создание Dialog Lookup MultiSelect from BaseEnum в Dynamics AX 2012

Бывают задачи, когда в 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

 

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar