【套打】关于单据套打数据与界面数据不一致、丢失的问题排查方案
<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.Operation.Equals('PrintPreview',StringComparison.OrdinalIgnoreCase) or e.Operation.FormOperation.Operation.Equals('Print',StringComparison.OrdinalIgnoreCase):
logMsg = 'BeforePrint 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 BeforePrintOperation',logMsg);
C:通过python脚本记录套打获取数据包对应的字段情况
针对单据界面排查完毕后,还是存在问题的话,那么可能为套打逻辑处理的异常问题,先记录下套打对应的数据包情况,确保对应的数据能正常取到(界定套打内的处理异常还是系统本身的取数异常),关于这一点,套打目前有部分字段是在插件干预时无法干预的,所以可能会取不到对应套打数据包的值
from Kingdee.BOS.Log import *
def OnPrepareNotePrintData(e):
if e.DataSourceId == 'FBillHead' and e.DynamicObjectType.Properties.ContainsKey('FMulLangText'):
billId = str(e.DataObjects[0]['Fid']);
strLog = 'fid: '+ billId+ '; Field FMulLangText,Value:'+str(e.DataObjects[0]['FMulLangText']);
Logger.Info('Track NotePrintData',strLog);
以下为单据套打和单据界面数据不一致问题的分析过程,后续此类问题建议客户提供以下的日志供平台排查。
【套打】关于单据套打数据与界面数据不一致、丢失的问题排查方案
本文2024-09-23 04:13:11发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-163893.html