【套打】关于单据套打数据与界面数据不一致、丢失的问题排查方案

<0>概述
经常会有客户反馈针对个别单据出现套打对应的字段丢失问题,但过段时间打印异常问题。而单据类套打是针对单据上的字段是直接从数据库中取对应的数据,仅针对嵌套的基础资料字段才会有缓存。排除掉套打中不支持的字段取值外,所有字段的取值都应该与数据库中的一致,也就是说不会出现上一次打印和这一次打印不一致的问题(除非数据库对应数据被其他场景修改)。基于以上场景,提供了一个客户自查的排查方案。
<1>排查方案
A:对应操作的校验器验证字段是否录入
以生产领料单增加的备注字段FMulLangText为例子,在对应套打的前置操作校验字段是否已经录入(如保存操作、审核操作),具体对应的操作时机点为能够将数据写入数据库的时机点,也就是说我们通过对应保存时机的对应字段是有值的,去保证对应数据库有值,从而在套打时能够获取对应的数据。



B:通过python脚本记录关键单据界面的操作详情
以单据界面的字段操作为例,我们能够记录的时机比较多,包括对应字段的值更新事件、对应界面操作的时间。比方说有可能存在这样的情况,排查上机操作日志是先进行保存,而后打印,再进行保存,也就是说不排除在第一次保存是对应值漏填而进行打印,最终发现后又进行保存。因此我们在单据界面的日志中应该记录对应的时间戳和对应数据,确保时机点有值。



原则上监控到界面数据变化和操作已经能够排除一部分问题,但是还是强调界面上数据与数据库的数据是有差异的,在没有更新到数据库前一切都是假象,所以如果有条件的同学可以在python中执行对应字段的数据库查询(并不太熟悉python参数化,这里只是提供示例)


clr.AddReference('System')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.ServiceHelper')
clr.AddReference('Kingdee.BOS.App')
from Kingdee.BOS import *
from Kingdee.BOS.Core import *
from Kingdee.BOS.ServiceHelper import *
from System import *
from Kingdee.BOS.Log import *
from Kingdee.BOS.App.Data import *
def DataChanged(e):
if e.Field.Key.Equals('FMulLangText',StringComparison.OrdinalIgnoreCase):
logMsg = 'FMulLangText DataChanged, NewVal:'+str(e.NewValue);
Logger.Info('Track DataChanged',logMsg);
def BeforeDoOperation(e):
if e.Operation.FormOperation.Operation.Equals('Save',StringComparison.OrdinalIgnoreCase):
logMsg = 'BeforeSave ModelVal:'+str(this.Model.GetValue('FMulLangText'));
fid = this.Model.DataObject['Id'];
if fid is not None:
dbSet = DBUtils.ExecuteDataSet(this.View.Context,'select FMulLangText from T_PRD_PICKMTRL_l where fid = '+str(fid)+' and flocaleid = 2052');
if dbSet.Tables.Count>0 and dbSet.Tables[0].Rows.Count>0:
dbVal = dbSet.Tables[0].Rows[0][0];
logMsg += '; SQL Search:'+str(dbVal);
Logger.Info('Track BeforeSaveOperation',logMsg);
else:
if e.Operation.FormOperation.Ope
【套打】关于单据套打数据与界面数据不一致、丢失的问题排查方案
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



