目录
业务需求
增加显示成本中心短文本;CSKT-KTEXT
增加显示供应商批次号;MCH1-LICHA
增加显示公司批次号;MCH1-ZZBATCH
背景分析:
如下面链接对于MSEG和MKPF表的字段可以通过SIMG的配置完成。
本次增加的字段并不在MSEG和MKPF表中,因此需要重新分析MB51的程序,并进行相关增强。
程序基本逻辑
上篇文章对MB51对应程序RM07ROCS的Debug过程中,MB51通过function ALV的层次显示的方式来实现。
相关详细字段存储在list[]表中,需要显示的字段在fc_flat[]表中。
MB51的显示中本来就存在MSEG/MKPF 之外的字段,充分debug源程序,参照执行就可以的。
任务拆分
1,增加list表中的字段,
2,参照MB51程序的方式填充相关字段内容
3,将相关字段通过fieldcat方式显示出来。
为了调试的方便,先增加FC_flat[]表中的字段,显示出来。
增加显示字段
SAP采用的方法
重新debug上篇文章中的build_fieldcatalg子例程。以list表中的物料描述为线索来分析。
物料描述使用的是Makt表中的MAKTX字段。
如下图,程序在第一个循环后,fc_flat[]表增加两条记录。第二条记录即为我们用来分析的MAKTX字段。
如此,可以参照maktx字段增加的逻辑通过隐式增强的方式增加成本中心描述,和相关批次号的两个字段。
隐式增强
做隐式增强时,在上面的程序出并没有增强点。增强点只在子例程的头部和尾部有效。
尾部恰好有SAP做的后补充fieldcat的程序:
框出来的程序正好可以参考。
增强如下:
激活运行,调整布局,相关字段显示成功。
定义字段
参照MB51源程序的maktx物料描述字段定义方式来进行。采用隐式增强方式。
给字段赋值
分析源程序
还是参照maktx字段的方式进行。原始程序list表在子例程process_list里完成。process_list之前,list为空,之后list表有正确数值。 debug 子例程 process_list.
1,子例程。 2, 调用create_entry_for_list. 3, 调用之后list表头增加相关信息。
4,将表头信息写入表格。 5, 对应list[]表增加一条信息。
maktx增加的程序需要继续分析 create_entry_for_list子例程。该子例程处理单条list数据。
对于list中零件号不为空的记录,检查零件号是否和ls_makt中的零件号相同。
如果不同,从内表imakt中读出相关信息写到ls_makt中。如果imakt中没有相关零件号,则清除ls_imakt中的maktx零件描述信息。
调整ls_imakt相关信息后,将ls_imakt中的零件描述字段maktx内容写入list-maktx。
下一步需要检查imakt表是如何创建的。
根据下图的定义imakt表和imakt_key表时为了增加物料描述而创建的中间表。
在itab的循环中收集imakt_key的表数据
根据imakt_key表信息,select语句生成imakt表。
1, 语句功能描述。 2 select语句生成imakt中间表, 3, 培训为了后续的binarysearch,为了效率。 4, 在2中有关于decon的语句,不明白。但是在读取移动类型文本是并没有相关信息,后续忽略dbcon的事情。
源程序的分析,基本结束。 SAP采用中间工作表的方式,会对效率有帮助。(在loop语句中尽量不使用select语句。)
下一步看如何增强。
增加成本中心名称
需要做的事情:
子例程:Process_list.
1, icskt_key表 2, icskt表 3, 填充icskt_key表, 4, select语句填充icskt表。
子例程: create_entry_for_list
填充 list-ktext字段内容。
隐式增强只在子例程的开始和结束出才有,计划在process_list子例程的结尾完成MB51源程序的所有功能。
增强开始的状态。
itab表已经清除,list表已经增加相关字段,并且按照零件号排序。
需要做的事情:
1, 对list复制出一个中间表lt_list_cskt。按照kostl字段进行排序,并去除重复项。
2,循环中间表对中间表的一条数据添加成本中心名称ktext。在loop语句中使用select语句效率不会太高,由于已经去重,不在构建源程序的另个中间表。应该对效率没有太大的影响。
3,在循环内根据此条数据更新所有list表中的成本中心名称字段。
4,循环结束list表就更新完毕了。
增加供应商批次号
参照相同逻辑。
程序如下
运行结果如下