本文讨论了在使用特定软件(如金蝶ERP)时,关于单据体录入过程中快速录入数字时可能出现的数字丢失问题。分析了问题的成因是快速操作时触发服务端事件导致的响应延迟和焦点丢失。提出了基于本地脱机原理的快速录入模式解决方案,即在快速录入模式下,行切换不发送请求至服务端,待完成后批量提交。给出了Python插件实例及操作说明,特别强调了该功能的适用场景、限制和注意事项。
最低版本要求:
已经在2019年1月24日之后的补丁中已包含此方案功能,建议打最新补丁
应用场景:
1、日常操作单据体录入中,习惯先批量录入物料编码,然后再补充录入数量信息(键盘向下键进行快速录入数量等)。
2、在操作数量依次向下录入的过程中,录入过快时,常会出现数字丢失现象。
原因分析:
向下键会触发行切换EntryRowClick事件至服务端,由于该事件在大多业务单据中,平台以及二开的一些列业务逻辑比较复杂,又加上某些网络延时的原因造成该次事件发送的请求响应时间稍长,以此同时,用户已经开始快速的敲键盘进行开始录入数字内容,由于事件请求时间过长后返回表格数据时,表格会进行刷新数据,这时会出现正在编辑的单元格失去焦点,偶发键盘录入数字丢失,或者已经快速录完的数字,被服务端后返回的值被覆盖等现象。
解决方案:
基于以上分析,列快速录入模式方案,是采用本地脱机的原理进行,也即当列开启快速录入模式时,向上/向下切换行录入时,不发任何事件至服务端,进行请求操作,当关闭快速录入模式时,会一次性将已经录入完的数字单元格一并批量提交给服务端进行服务端进行数值更新(发送CustomEvent事件,可用http数据监控进行查看数据提交过程)。
二开python插件实例:
import clr; clr.AddReference('System') clr.AddReference('Kingdee.BOS') clr.AddReference('Kingdee.BOS.Core') from Kingdee.BOS.Core import * from Kingdee.BOS.Core.DynamicForm.PlugIn import * from Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel import * from Kingdee.BOS.Core.Metadata.FieldElement import * from System import * def AfterBindData(e): colkeys = ('FQty'.upper(),'FText'.upper());#如果是一个,写法是('FQty'.upper(),); this.View.GetControl("FEntity").SetQuickInputColKeys(colkeys);
操作:
登录客户端,点击单据体或者录入过程,按Ctrl+K快捷键调用此功能,对应的列列头会显示为红色,鼠标移至列头时,会提示“正在快速录入模式”的tooltip提示。效果图如下:
特别说明:
1、此方案功能只适用客户端。
2、此方案功能只能针对设置的数字、文本类型的列有效果,其余列字段类型不支持,支持同时设置多列(如插件方法)。
3、该方案功能原理是将录入数量后的其他时间屏蔽掉,只是数据录入。当录入完成后必须再次按Ctrl+K快键盘结束当前的快速录入模式,以便及时将录入完成的数据进行批量提交到服务端。下次再需要快速录入时,继续按Ctrl+K进行激活。如下图:
附注:
解决打开某单据,自动开启快速录入的案例(python,在上面案例代码结束之后加入,建议针对某具体用户开启,并非所有用户都有快录需求,避开给所有用户):
if (this.View.ClientType == ClientType.WPF && this.View.Context.UserName == "demo")
{
this.View.GetControl("FEntity").InvokeControlMethod("QuikInputColModeChange", None);
}
打开单据时,会根据设置的可快速录入的列自动切换成快速录入模式,Ctrl+K快捷键依然有效
注:请看上面说的快速录入原理的解释,如果单据打开自动开启快速模式带来的弊端:
如将“销售数量”列设置为快速录入列,那么自动开启情况下,用户无需使用快捷键触发快录模式,则在录入某行完销售数量时,则不会立即值更新事件发送到服务端,需要焦点到非快速录入的列或者按Ctrl+K结束快速录入即可(Ctrl+K快捷键依然有效),也或者有其他预测不到的非及时值更新的情况。自动开启请酌情使用,快速录入模式是在用户有感知的情况下,让用户自由选择使用,这样保证数据的正确性。
推荐阅读