本文介绍了在不遍历单据体分录的情况下,通过界面规则和插件代码实现单据体字段及行的锁定与解锁的方法。通过单据头和单据体中的下拉列表字段作为控制条件,配置界面规则以根据条件锁定或解锁单据体字段或行。同时,提供了插件代码示例来控制下拉列表字段的值,并建议隐藏下拉字段控件。最后,还提到了开发环境版本、参考文档和附件信息。
关键字:分录,单据体,界面规则
一、需求
不经过遍历单据体分录,就能根据条件,将单据体锁定。
如果分录行比较多时,通过遍历分录行,锁定字段的方式,性能非常慢。
因此,需要一种灵活的方式来实现单据体分录的锁定和解锁。
二、思路与方案
1.采用界面规则+插件代码的方式来控制单据体锁定的逻辑,可以减少代码量。
不采用setEnable的方式来锁定单据体。
2.我们可以通过一个下拉字段(或者复选框)作为前置条件,使用界面规则锁定单据体的字段或者一行单据体。
3.用插件代码控制下拉列表的值。
三、实现过程
1.设计单据
创建单据,命名为kdec_building_materials_1。
拖入一些单据头字段和单据体字段。
单据头拖入下拉列表字段,标识为kdec_seten_enbale,名为“控制单据体字段锁定”,控制单据体列,即单据体字段的锁定与解锁;
单据体拖入下拉列表字段,标识为kdec_seten_enbale_line,名为“控制单据体行锁定”,控制单据体行锁定与解锁;
设置2个下拉列表字段的下拉项。
注意:
我会使用kdec_seten_enbale,单据头的下拉列表字段控制
2.配置锁定单据体字段的界面规则
(1)选中单据体节点,打开界面规则配置
(2)配置前置条件,kdec_seten_enbale下拉列表字段为A时。
注意区分,kdec_seten_enbale是单据头的字段,用来控制 单据体字段锁定
(3)成立时,锁定单据体字段;不成立时,解锁字段
3.配置锁定单据体行的界面规则
(1)选中单据体节点,打开界面规则配置
(2)配置前置条件
注意区分,kdec_seten_enbale_line 是单据体上面的字段,用来控制 单据体当前这一行的锁定
(3)成立时,锁定单据体行上面正在显示的字段;不成立时,解锁字段
3.插件代码控制下拉列表字段值
这里仅作为参考案例,在afterBindData事件中设置下拉列表字段值,请开发者根据自身业务在不同的事件中设置下拉列表的值。
@Override public void afterBindData(EventObject e) { super.afterBindData(e); /* 开发者根据自身业务逻辑,在此处判断,控制字段值 */ if (true ) { getModel().setValue("kdec_seten_enbale", "B"); } /* 开发者根据自身业务逻辑,在此处判断,控制单据体下拉字段值 */ EntryGrid entryGrid = getControl("kdec_bu_ma_en_1"); int enCount = entryGrid.getEntryData().getDataEntitys().length; if (enCount > 2) { getModel().setValue("kdec_seten_enbale_line", "A", 0); getModel().setValue("kdec_seten_enbale_line", "B", 1); getModel().setValue("kdec_seten_enbale_line", "A", 2); } }
4.隐藏下拉字段控件
正常情况下,下拉字段控件起到控制锁定性的效果,不需要对用户展示,所以建议将其隐藏。
四、效果图
锁定的字段
锁定的数据行
五、开发环境版本
六、参考文档
七、附件
控插件代码:DemoBuMaPlugin.java
元数据zip包:kdec_wrx_test-kdec_wrx_col_app-20221220164527.zip
元数据说明
业务云编码:kdec_wrx_test;应用编码:kdec_wrx_col_app;页面:kdec_building_materials_1;
EntryEnable.zip(10.87KB)
推荐阅读