金蝶云星空BOS设计器实战:利用基础资料字段属性实现动态过滤查询

张开发
2026/4/10 9:42:37 15 分钟阅读

分享文章

金蝶云星空BOS设计器实战:利用基础资料字段属性实现动态过滤查询
1. 动态过滤查询的实战价值做过企业级系统开发的朋友都知道基础资料的选择过滤是个高频需求。就拿售后单来说当用户选择序列号时如果能把表头已填写的客户和组织信息作为过滤条件不仅能提升操作效率还能避免选错数据的尴尬。我在实施金蝶项目时经常遇到这样的场景售后人员打开单据先填写客户和所属组织然后在明细行选择设备序列号。如果序列号列表不做任何过滤用户要在成千上万条记录中翻找既浪费时间又容易出错。这时候基础资料字段的过滤属性就能派上大用场。金蝶云星空的BOS设计器提供了非常灵活的过滤配置方式。通过简单的公式设置就能实现根据界面已有值动态过滤的效果。这个功能看似简单但实际用好了能解决80%的基础资料联动需求。下面我就用售后单序列号选择的例子带大家一步步实现这个功能。2. 理解基础资料字段的过滤属性2.1 过滤属性的本质作用在BOS设计器中每个基础资料字段都有个过滤属性。这个属性本质上是个条件表达式当用户点击字段的下拉按钮时系统会用这个表达式作为查询条件去过滤基础资料数据。比如我们有个序列号基础资料里面存储了所有设备的序列号信息包括所属客户和组织。如果在售后单的序列号字段设置过滤条件F_CustomerIdC001那么下拉列表就只会显示客户ID为C001的序列号。但这样写死条件的做法太僵硬了。实际业务中我们需要的是根据当前表单已填写的内容动态生成过滤条件。这就是GetValue()函数发挥作用的地方。2.2 GetValue函数的使用技巧GetValue()是BOS设计器提供的一个非常实用的函数它可以获取当前界面上其他字段的值。语法很简单GetValue(字段标识)比如表头有个客户字段标识是F_Customer那么我们可以在序列号字段的过滤属性里这样写F_CustomerIdGetValue(F_Customer)这样配置后系统会在用户点击序列号下拉时自动获取当前表单中客户字段的值并作为条件去查询序列号。如果客户字段还没填条件就相当于F_CustomerIdnull这时候可能查不到数据这是需要注意的一个边界情况。3. 实战配置步骤详解3.1 确认基础资料结构在开始配置前我们需要先明确几个关键信息序列号基础资料中包含哪些字段通常会有序列号本身如F_SerialNumber所属客户如F_CustomerId所属组织如F_OrgId其他业务属性售后单表头有哪些字段会用作过滤条件常见的有客户如F_Customer组织如F_Org字段的数据类型是什么特别是ID字段可能是字符串或整型这会影响过滤条件的写法。3.2 编写过滤表达式根据字段类型的不同过滤条件的写法也略有差异。以下是两种常见情况情况一基础资料内码是字符串类型F_CustomerIdGetValue(F_Customer) AND F_OrgIdGetValue(F_Org)情况二基础资料内码是整型F_CustomerIdGetValue(F_Customer) AND F_OrgIdGetValue(F_Org)注意字符串类型的值需要用单引号包裹而整型不需要。如果搞混了类型过滤会失效。3.3 BOS设计器中的配置步骤现在让我们进入实操环节打开BOS设计器找到你的售后单单据类型定位到明细行中的序列号字段在属性面板中找到过滤属性输入我们准备好的过滤表达式保存并发布配置完成后可以这样测试效果打开一张新的售后单先填写表头的客户和组织点击明细行的序列号字段检查下拉列表是否只显示符合客户和组织的序列号尝试不填客户或组织看序列号列表是否为空这是正常现象4. 常见问题与解决方案4.1 过滤条件不生效的排查方法在实际项目中我遇到过不少过滤条件不生效的情况。总结下来主要有这些原因字段标识写错了BOS中的字段标识区分大小写F_Customer和f_customer会被视为不同字段数据类型不匹配比如基础资料中的客户ID是字符串但GetValue获取的值是整型基础资料本身没有相应字段确认序列号基础资料确实有客户和组织字段缓存问题有时候发布后需要清除浏览器缓存才能看到效果我的建议是先用简单的条件测试比如只过滤客户确认没问题后再加其他条件。也可以先在SQL查询分析器中验证你的过滤条件语法是否正确。4.2 处理空值的技巧当表头的过滤字段为空时GetValue()会返回null这可能导致查不到任何数据。如果业务上允许显示部分数据可以使用以下写法(F_CustomerIdGetValue(F_Customer) OR GetValue(F_Customer) IS NULL) AND (F_OrgIdGetValue(F_Org) OR GetValue(F_Org) IS NULL)这样当客户或组织为空时对应条件会被忽略相当于没有过滤。4.3 性能优化建议当基础资料数据量很大时复杂的过滤条件可能导致查询变慢。我有几个优化建议确保基础资料的客户和组织字段建有索引避免在过滤条件中使用复杂的函数计算如果可能尽量使用内码ID过滤而非名称过滤考虑在基础资料中增加专门的查询字段减少实时计算5. 高级应用场景5.1 多条件组合过滤有时候我们需要更复杂的过滤逻辑。比如除了客户和组织外还想根据设备状态过滤。可以这样写F_CustomerIdGetValue(F_Customer) AND F_OrgIdGetValue(F_Org) AND F_Status正常甚至可以使用更复杂的逻辑运算符(F_CustomerIdGetValue(F_Customer) OR F_IsPublic1) AND (F_OrgIdGetValue(F_Org) OR GetValue(F_Org) IS NULL)5.2 跨单据取值过滤在某些场景下我们可能需要根据其他单据的值来过滤。比如在退货单中想根据原始销售单的客户来过滤产品。这时可以使用GetValueByKey函数F_CustomerIdGetValueByKey(F_SourceBill, F_Customer)这个函数需要两个参数当前单据中关联字段的标识以及关联单据中要获取的字段标识。5.3 动态过滤与静态过滤结合我们还可以把动态过滤和静态条件结合起来。比如只想显示特定类型的序列号F_CustomerIdGetValue(F_Customer) AND F_OrgIdGetValue(F_Org) AND F_DeviceType IN (A,B,C)这种组合使用的方式在实际业务中非常常见能够满足更精细化的过滤需求。6. 实际项目中的经验分享在最近的一个制造业项目中我们遇到了一个有趣的场景设备序列号需要根据客户工厂车间三级联动过滤。通过组合使用多个GetValue条件我们实现了非常智能的过滤效果F_CustomerIdGetValue(F_Customer) AND F_FactoryIdGetValue(F_Factory) AND F_WorkshopIdGetValue(F_Workshop)配置时有个小技巧当存在多级联动时建议把过滤条件设置为必填或者处理好空值情况否则可能会出现不符合预期的过滤结果。另一个经验是对于重要的过滤逻辑最好在字段的OnEntry事件中也做一次校验防止用户通过某些特殊操作绕过过滤条件。比如this.View.Model.SetValue(F_SerialNumber, ); // 当客户或组织变更时清空已选的序列号动态过滤查询是金蝶云星空BOS设计中非常实用的功能掌握好这个技巧能解决大部分基础资料联动的需求。我在项目中总结的经验是先理清业务逻辑再设计过滤条件最后考虑异常情况和性能优化。

更多文章