【套打】关于单据套打数据与界面数据不一致、丢失的问题排查方案原创
金蝶云社区-_Tmp
_Tmp
5人赞赏了该文章 1,083次浏览 未经作者许可,禁止转载编辑于2020年08月19日 15:21:26

<0>概述

经常会有客户反馈针对个别单据出现套打对应的字段丢失问题,但过段时间打印异常问题。而单据类套打是针对单据上的字段是直接从数据库中取对应的数据,仅针对嵌套的基础资料字段才会有缓存。排除掉套打中不支持的字段取值外,所有字段的取值都应该与数据库中的一致,也就是说不会出现上一次打印和这一次打印不一致的问题(除非数据库对应数据被其他场景修改)。基于以上场景,提供了一个客户自查的排查方案。


<1>排查方案:

A:对应操作的校验器验证字段是否录入

以生产领料单增加的备注字段FMulLangText为例子,在对应套打的前置操作校验字段是否已经录入(如保存操作、审核操作),具体对应的操作时机点为能够将数据写入数据库的时机点,也就是说我们通过对应保存时机的对应字段是有值的,去保证对应数据库有值,从而在套打时能够获取对应的数据。

image.png


image.png

image.png


B:通过python脚本记录关键单据界面的操作详情

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

image.png

image.png

image.png

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

image.png

image.png

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脚本记录套打获取数据包对应的字段情况

针对单据界面排查完毕后,还是存在问题的话,那么可能为套打逻辑处理的异常问题,先记录下套打对应的数据包情况,确保对应的数据能正常取到(界定套打内的处理异常还是系统本身的取数异常),关于这一点,套打目前有部分字段是在插件干预时无法干预的,所以可能会取不到对应套打数据包的值

image.png

image.png

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);


以下为单据套打和单据界面数据不一致问题的分析过程,后续此类问题建议客户提供以下的日志供平台排查。

赞 5