套打按照单据体序号排序—分组出现顺序排序原创
金蝶云社区-我在终点等你
我在终点等你
10人赞赏了该文章 504次浏览 未经作者许可,禁止转载编辑于2024年01月19日 10:14:12

应用场景:

套打时,默认是按照分组字段做升序或降序排序,如物料编码,但是某些场景需要按照单据上序号排序,而不是要按照物料编码来做升序降序排列,希望保持跟单据上显示的一致。

以我这边环境为例:

检验单套打按照检验项目和组别分组之后,默认排序会跟系统单据上不一致。如下图:

image.png

image.png

到套打上会按照检验项目首字母进行排序,这样就跟单据上检验项目顺序不一致,IQC反馈检验是按照顺序进行检验,所以就产生了这个需求场景。

这个时候需要通过注册python插件来干预,让其按照检验项目序号进行排序。

插件如下:

from System import *

from Kingdee.BOS import *

from Kingdee.BOS.DataEntity import *

def OnPrepareNotePrintData(e):

    if e.NotePrintTplId.Equals("LLJYBGTD1"):

        if e.DataSourceId.Equals("FItemDetail",StringComparison.OrdinalIgnoreCase):

            seqKey = "FItemDetail" + "_" + "FSeq";

            materialKey = "FInspectItemId_FNumber";

            if e.DataObjects == None or e.DataObjects.Length <= 0:

                return;

            if not e.DataObjects[0].DynamicObjectType.Properties.ContainsKey(materialKey):

                return;

            if not e.DataObjects[0].DynamicObjectType.Properties.ContainsKey(seqKey):

                return;

            rowMaterialSeq = {};

            for index in range(len(e.DataObjects)):

                material = e.DataObjects[index][materialKey];

                if not rowMaterialSeq.has_key(material):

                    rowMaterialSeq[material] = e.DataObjects[index][seqKey];

            tempList = sorted(e.DataObjects,key =lambda x:(rowMaterialSeq[x[materialKey]], x[seqKey]));

            for index in range(len(tempList)):

                e.DataObjects[index] = tempList[index];

其中

NotePrintTplId——套打模板ID(LLJYBGTD1
materialKey——对应模板的分组字段(FMaterialId_FNumber)—注意此处要取编码,因为按照检验项目排序,检验项目是个基础资料,所以要取检验项目编码,即为:FInspectItemId_FNumber,取名称无效。
seqKey——对应单据体的序号字段(FQUOTATIONENTRY_FSeq)—此处取检验项目表体标识FItemDetail

注册此python脚本到表单插件和列表插件中去。

image.png

image.png

效果请看下图:

image.png

image.png

如果列表也需要套打,记得在列表插件也注册此脚本,此插件可以干预分组排序,因为按照分组排序之后,会根据分组字段例如物料编码、检验项目、等信息按升序降序重新排序生成,如果要跟单据上保持一致,此插件可以实现这个功能。


图标赞 10
10人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!