应用场景:
套打时,默认是按照分组字段做升序或降序排序,如物料编码,但是某些场景需要按照单据上序号排序,而不是要按照物料编码来做升序降序排列,希望保持跟单据上显示的一致。
以我这边环境为例:
检验单套打按照检验项目和组别分组之后,默认排序会跟系统单据上不一致。如下图:
到套打上会按照检验项目首字母进行排序,这样就跟单据上检验项目顺序不一致,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脚本到表单插件和列表插件中去。
效果请看下图:
如果列表也需要套打,记得在列表插件也注册此脚本,此插件可以干预分组排序,因为按照分组排序之后,会根据分组字段例如物料编码、检验项目、等信息按升序降序重新排序生成,如果要跟单据上保持一致,此插件可以实现这个功能。
推荐阅读