业务流程 OptionSetValue 步骤的筛选选项

Filtering options on Business Process flow OptionSetValue step

我有一个方法可以让我从 OptionSetValue 字段中过滤掉某些选项。

它在表单字段上工作正常,但是当该字段位于 header 中时,对于业务流程,它 "works" 就像在调试中一样,我看到选项被清除并且re-added(只有那些应该在那里的),但是一旦表单被渲染,所有的选项都是可见的...

方法如下:

FilterOptionSetValues: function (fieldName, visibleOptions) {

            var ctrl = Xrm.Page.getControl(fieldName);
            var allOptions = ctrl.getOptions();

            //clear current options
            ctrl.clearOptions();

            //loop through all options of optionset and if one is found in config element, add it.
            for (var x = 0; x <= allOptions.length - 1; x++) {
                if (visibleOptions.availableOptions.indexOf(parseInt(allOptions[x].value)) > -1) {
                    ctrl.addOption(allOptions[x]);
                }
            }
}

我是这样称呼它的:

FilterOptionSetValues('header_process_new_my_optionset_field', { stage: 1, availableOptions: [300000002, 300000003, 300000004] });

此代码在表单加载事件和另一个字段 (salesstage) 的 OnChange 事件中调用。

有什么我想念的吗?似乎 MS 自己的 javascript 正在撤销我在这里的工作...

编辑:当我在 header_process_new_my_optionset_field 上放置一个 OnChange 侦听器时,当我在 header 业务流程中更改该字段的值时没有任何反应,但是 onChange new_my_optionset_field 上的侦听器将由表单或 header 业务流程中该字段的更改触发。

但是 运行 以上仅在字段 new_my_optionset_field 上的逻辑不会对业务流程中的同一字段进行过滤。

通过对所有表单控件的名称进行 console.log (Xrm.Page.ui.getControls().getAll()),我发现在流程的每个阶段都有一个该属性的控件实例,然后按 1、2、3 等。同一个字段存在于业务流程的各个阶段。

所以我将上面的代码更改为:

var control = Xrm.Page.getControl(fieldName);
var allOptions = control.getAttribute().getOptions();

//clear current options
control.clearOptions();

//below, same as above...

并为所有人这样称呼它:

FilterOptionSetValues('header_process_new_my_optionset_field', { stage: 1, availableOptions: [300000002, 300000003, 300000004] });
FilterOptionSetValues('header_process_new_my_optionset_field1', { stage: 1, availableOptions: [300000002, 300000003, 300000004] });
FilterOptionSetValues('header_process_new_my_optionset_field2', { stage: 1, availableOptions: [300000002, 300000003, 300000004] });
//and so on...

一开始是可以的,但是只是在流程的第一阶段过滤了选项,测试的时候不是活跃阶段,所以给人的印象是不工作...

每次更改当前 BPF 阶段(未选中,但实际上进入下一阶段)时,都会强制进行 CRM 保存。这可能会刷新您的选项集。添加一个 Xrm.Page.data.process.addOnStageChange 事件处理程序,然后 运行 您的过滤器。