Dynamics 365 F&O中如何让Form1的ScaleID lookup仅显示激活记录?
过滤Form1中ScaleID字段Lookup仅显示Form2的激活记录(Status=Yes)
方法1:重写Form1中ScaleID字段的Lookup方法(推荐,仅影响当前字段)
直接在Form1的ScaleID字段上重写lookup方法,通过自定义查询过滤出Form2中Status为Yes的记录:
- 打开Form1设计器,找到ScaleID字段,右键选择Override method -> lookup
- 替换默认方法代码为以下逻辑(注意替换实际表名和字段名):
public void lookup() { Query query; QueryBuildDataSource qbds; QueryBuildRange qbr; FormRun formRun; Args args; TableId form2TableId = tableNum(YourForm2Table); // 替换为Form2绑定的表名 FieldId statusFieldId = fieldNum(YourForm2Table, status); // 替换为实际status字段名 FieldId scaleIdFieldId = fieldNum(YourForm2Table, ScaleID); // 替换为实际ScaleID字段名 // 构建过滤查询 query = new Query(); qbds = query.addDataSource(form2TableId); qbds.addSortField(scaleIdFieldId, SortOrder::Ascending); // 可选:按ScaleID升序排列 // 添加Status=Yes的过滤条件 qbr = qbds.addRange(statusFieldId); // 若status是YesNo枚举类型 qbr.value(queryValue(YesNo::Yes)); // 若status是字符串类型(如"Yes"/"No"),替换为: // qbr.value(strFmt('"%1"', "Yes")); // 调用标准Lookup表单(如果用自定义Form2作为Lookup,替换formStr(SysTableLookup)为formStr(YourForm2)) args = new Args(); args.parmQuery(query); formRun = classFactory.formRunClass(formStr(SysTableLookup)); formRun.init(); formRun.run(); formRun.wait(); // 将选中值赋值给当前字段 if (formRun.closedOk()) { element.value(formRun.record().getFieldValue(scaleIdFieldId)); } }
方法2:修改Form2的数据源过滤(影响所有使用Form2作为Lookup的场景)
如果Form2仅作为Lookup表单使用,且所有场景都需要过滤激活记录,可以直接在Form2的数据源init方法中添加过滤:
- 打开Form2设计器,找到数据源,右键选择Override method -> init
- 在
super()之后添加过滤代码:
public void init() { super(); QueryBuildRange qbr; TableId form2TableId = tableNum(YourForm2Table); qbr = this.query().dataSourceTable(form2TableId).addRange(fieldNum(YourForm2Table, status)); qbr.value(queryValue(YesNo::Yes)); // 字符串类型替换为:qbr.value(strFmt('"%1"', "Yes")); }
注意事项
- 务必将代码中的
YourForm2Table、status、ScaleID替换为项目中的实际表名和字段名 - 根据status字段的类型(枚举/字符串)调整过滤条件的赋值方式
- 优先选择方法1,避免方法2对其他使用Form2的场景造成影响
内容的提问来源于stack exchange,提问作者C4U
相关产品推荐
相关产品推荐

