如何从 BaseEnum 创建 Dialog Lookup MultiSelect?

How to create the Dialog Lookup MultiSelect from BaseEnum?

我需要在 DialogField 中添加一个 MultiSelect 查找。 显示的值不是来自记录 table(如自定义帐户...),而是来自 BaseEnum.

我想 select 查找多个值:

例如,用户可以同时选择PlannedPais。 我当前的代码是这样的:

我的classextends RunBaseBatch,在

public Object dialog()
{
    DialogRunbase dialog = super();
    ;
    dlgMultiSelect= dialog.addFieldValue(enumStr(SubledgerJournalEntryType),"","Select MULTIPLE VALUES","Select MULTIPLE VALUES");
    return dialog;
}

如何允许多 Select 查找?

如果不行,还有其他方法进行多次查找吗?

提前致谢

许多不同的方法涵盖了相当广泛的内容,因此您需要从一些 searching/research.

开始

你可以动态地做一些事情,但你最好的选择可能是使用临时 table + 查询 + SysLookupMultiSelect*.

如果您有更多的代码可以提供或尝试,我们可以回复具体的代码问题。

查看一些链接:

首先,多选值的变量不能是枚举:

  1. 枚举仅保留基枚举的一个值。
  2. 多选 returns 一个或多个来自查找的值

其次,如果你想处理一个枚举的多个元素,你应该决定:

  • 处理标签或枚举值?
  • 标签是什么语言?
  • 另一种方法如何向用户显示枚举多值? (短信、表格、报告、BI/OLAP 和其他)

我相信你稍微考虑一下就会改变主意。我相信你会选择另一种方式。

随时使用此测试 class 获取灵感:

class WhosebugTestDialog extends RunBase
{
    DialogRunbase           dlg;
    FormBuildStringControl  formBuildCtrl;

    SysLookupMultiSelectCtrl sysLookupMultiSelectCtrl;
}

static void main(Args _args)
{
    WhosebugTestDialog testDialog = new WhosebugTestDialog();

    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;
}