业务流程 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 事件处理程序,然后 运行 您的过滤器。
我有一个方法可以让我从 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 事件处理程序,然后 运行 您的过滤器。