获取routing 组件分配的报表遇到的问题
1.问题描述:
Routing站点assign情况如下:共有三个料号被分配了站点
但是Report获取的结果为:有6个料号被分配了站点
导致报表结果与实际routing不符。
2.分析原因:
Table:PLMZ(Allocation of bill of material items to operations)内存储material和operation之间的分配关系。Table中根据bom item ID确定料号,根据task list node确定operation。
当BOM:A的下阶虚拟阶料号B被delete后又重新添加上,item ID发生变化。在这个过程中,routing的站点在B被删除后清空,即使B重新添加后料号不变,routing仍然不会恢复。
在PLMZ中,只有在change routing界面里手动清空assign,或者对料号reassign时,PLMZ会有记录,对清空的或者reassign的记录打上删除标识。所以如果像上述操作一样直接change BOM,table中不会有任何更改,会保留原来的虚拟阶assign作为历史记录。
程式通过展开的多阶BOM和获取的routing table进行比对,如果在routing table里可以找到料号,那么这个料号就有站点assign。
但是展开的A料号第一阶的时候B自己的item ID变了,展开虚拟阶B料号的时候,B的下阶俩号item ID却没有变化。通过function:CARO_ROUTING_READ获得的是所有routing的历史记录,如果二者对比,可以发现,总会在 routing table中找到本来已经消失了的routing 站点。所以结果就会出现本来没有分配站点的料号,找到了历史的assign,与实际不符。
3.解决过程:
在测试过程中,每次change BOM的虚拟阶,再重新去routing assign后,发现table PLMZ栏位KANTE的值会变化,考虑KANTE可能是关键字段,但是不清楚变化的逻辑。
首先查找到SAP有自己的标准报表CA51可以获取routing所有数据,通过查看t-code对应report(RCPDRK00)代码发现,SAP本身是在逻辑数据库LDB中获取数据后赋给相应内表的,获取数据的语句是get node或者 get node late,其中node是数据库节点,RCPDRK00源码中对应获取数据的语句为GET PLMZD.和GET PLMZN。
下一步是找到get PLMZ语句对应的逻辑,在report 代码界面点击标题栏中的goto—>attributes,查看属性中的logical database。
双击PNM进入逻辑数据库,画面如下,再点击source code查看源代码report:SAPDBPNM。
需要注意,SAPDBPNM虽然是report,但是并不能debug。
通过查看source code,得知get plmz的语句对应的form为 form put_plmz。其中展BOM的程式用到了一个很重要的function:CS_X4_NODE_DETERMINATION,这个函数用来计算routing组件分配的层次和路径(Path in exploded BOM tree),栏位为stb-nlink对应在PLMZ里面的字段就是kante,在原来程式的基础上增加对kante的比对,如果kante一致,则在routing内有assign。
CALL FUNCTION 'CS_X4_NODE_DETERMINATION'
EXPORTING
i_stlty_w = topmat-stlty
i_stlnr_w = topmat-stlnr
i_stlal_w = topmat-stlal
i_flg_create_nodes = ' '
i_flg_node_for_class = 'X'
i_flg_check_node = ' '
i_flg_special_class = ' '
i_flg_node_for_assem = ' '
i_flg_calc_path2 = 'X'
i_flg_calc_path4 = ' '
TABLES
stb = stb. “需要在展BOM之后用这个function,因为stb里面需要有展开的下阶料的信息才能计算出nlink的值
问题解决。
Tips:原程式中展BOM用了两次CS_BOM_EXPL_MAT_V2,本来是为了考虑到,创建routing时,SAP会优先展P-BOM,如果选择E-BOM新建routing,虚拟阶会优先展P-BOM,过程即E—>P。
但是在SAPDBPNM发现SAP只用了一次CS_BOM_EXPL_MAT_V2就可以解决这个问题。
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
aufsw = 'X'
capid = pn_capid “设置为PP01
mdmps = 'X'
mehrs = pn_mehrs “要设置‘X’才会展开虚拟阶
datuv = pn_datuv
mtnrv = mapl-matnr
werks = mapl-werks
stlal = stlal
stlan = stlan “这个栏位决定了第一次展BOM的类型,如果是2,则先展E-BOM,之后再按照PP01的方式有P展P。
mdnot = 'X'
rndkz = '1'
IMPORTING
topmat = topmat
dstst = dstst
TABLES
stb = stb
EXCEPTIONS
alt_not_found = 1
call_invalid = 2
material_not_found = 3
missing_authorization = 4
no_bom_found = 5
no_plant_data = 6
no_suitable_bom_found = 7
OTHERS = 8.