ABAP-增强-层级BOM-AB件业务

目前新需求:整车A下挂有委外总成件B,总成件B和子件E是层级BOM,且采购类型均为F,信息记录类型均为寄售,按照现在标准MRP逻辑,只能计算第一层级子件需求,无法运行出子件E的需求。

1.实现方式

 1.1自定义表

  ZTMM0093_MRP_WRK 

  

  ZTMM0010_MAT_INF:接口-物料主数据明细表

 1.2增强点

  在获取BOM子件中进行增强:函数 GET_STPO 行 311 增加隐式增强点 ZIMP_BADI_MRP_BOM_HIERARCHY

  

  INCLUDE ZMMI0003_MRP_BOM_HIERARCHY程序代码:

  1 *&---------------------------------------------------------------------*
  2 *& Include  ZMMI0003_MRP_BOM_HIERARCHY
  3 *&
  4 *&---------------------------------------------------------------------*
  5 *& Program Name:  MRP运行-BOM层级子件
  6 *& Date written:  2018-10-29
  7 *& Author's name: ***
  8 *& Business design:***
  9 *& Last update:   2018-10-29
 10 *& Project Name:  ***ERP项目
 11 *& Version:       V1.0
 12 *& Modify History:
 13 *& Sketch:        MRP运行-BOM层级子件
 14 *&---------------------------------------------------------------------*
 15 *& Variables:     变量
 16 *& MDPSN          采购申请明细
 17 *& MDPSX          订单需求明细(计划订单/生产订单/销售订单/采购订单)
 18 *& MDNBX          订单需求每日汇总
 19 *& CM61X          WERKS/PLMOD/BANER/DISER/LIFKZ/TRMPL
 20 *& CM61D          MATNR/WERKS
 21 *&---------------------------------------------------------------------*
 22 *& 逻辑:
 23 *& 1.获取工厂,判断配置信息
 24 *& 2.获取BOM第一层级总成件是否含子件信息,
 25 *& 3.判断总成件是否为委外件(查询ZTMM0010_MAT_INF 字段MAKEBUYINDICATOR=CSMT-A)
 26 *& 4.若为委外总成件,则将总成下子件运行MRP
 27 *& 5.子件需求日期 = MRP结果中总成件需求日期 - 总成件收货处理时间 - 子件加工时间(可配置);
 28 *& 6.子件的交货日期 = 子件的需求日期 - 子件收货处理时间
 29 *&---------------------------------------------------------------------*
 30 constants:
 31   lc_check            type c          value 'X',
 32   lc_stlty            type stpo-stlty value 'M',
 33   lc_stlan            type mast-stlan value '1',
 34   lc_stlal            type mast-stlal value '01',
 35   lc_postp            type stpo-postp value 'L',
 36   lc_makebuyindicator type string     value 'CSMT-A',
 37   lc_capid            type tc04-capid value 'PP01',
 38   lc_beskz_f          type string     value 'F',
 39   lc_mtart_zycl       type string     value 'ZYCL'.
 40 data:
 41   lv_werks   like marc-werks,
 42   lv_posnr   type stpob-posnr,
 43   lv_index   type cszalt-index,
 44   lv_i_matnr type csap_mbom-matnr,
 45   lv_i_plant type csap_mbom-werks,
 46   lv_i_usage type csap_mbom-stlan,
 47   lv_i_alter type csap_mbom-stlal,
 48   lv_i_datuv type datuv_bi,
 49   lv_i_datub type datub_bi.
 50 data:
 51   ls_mrp     like ztmm0093_mrp_wrk,
 52   ls_wa      type line of cs01_stpob_tab,
 53   ls_matinf  like ztmm0010_mat_inf,
 54   ls_i_stpo  type stpo_api02.
 55 data:
 56   lt_wa      like table of stpob,
 57   lt_addwa   type table of cszalt,
 58   lt_stb     type table of stpo,
 59   lt_e_stpo  type table of stpo_api02.
 60 field-symbols:
 61   <fs_stpo>  like stpo,
 62   <fs_estpo> like stpo_api02,
 63   <fs_cwa>   like stpob,
 64   <fs_cadd>  like cszalt,
 65   <fs_wa>    like stpob,
 66   <fs_addwa> like cszalt.
 67 
 68 read table wa into ls_wa index 1.
 69 
 70 "获取工厂
 71 select single wrkan
 72   into lv_werks
 73   from stko
 74  where stlnr = ls_wa-stlnr
 75    and stlty = ls_wa-stlty.
 76 
 77 select single *
 78   into ls_mrp
 79   from ztmm0093_mrp_wrk
 80  where werks       = lv_werks
 81    and fg_bomlevel = lc_check.
 82 if sy-subrc = 0 and ls_mrp-vl_tcode cs sy-tcode.
 83   if ls_mrp-fg_exitdg = lc_check.
 84     break-point.
 85   endif.
 86 
 87   loop at wa assigning <fs_wa>.
 88     clear:lt_stb,ls_matinf.
 89     "判断是否委外总成件
 90     select single
 91            max( datum ) as datum
 92            max( uzeit ) as uzeit
 93            makebuyindicator
 94       into corresponding fields of ls_matinf
 95       from ztmm0010_mat_inf
 96      where partbase = <fs_wa>-idnrk
 97      group by makebuyindicator.
 98     if ls_matinf-makebuyindicator = lc_makebuyindicator.
 99 *      "获取总成件BOM子件
100 *      "BOM执行函数涉及嵌套问题,CK11N成本核算报错
101 *      call function 'CS_BOM_EXPL_MAT_V2'
102 *        exporting
103 *          capid                 = lc_capid       "PP01生产用途
104 *          datuv                 = sy-datum
105 *          ehndl                 = '1'
106 *          emeng                 = <fs_wa>-menge
107 *          mktls                 = 'X'
108 *          mehrs                 = ''    "分解多层BOM
109 *          mmory                 = '1'
110 *          mtnrv                 = <fs_wa>-idnrk
111 *          stlan                 = '1'    "BOM用途
112 *          stpst                 = 0
113 *          svwvo                 = 'X'
114 *          werks                 = lv_werks
115 *        tables
116 *          stb                   = lt_stb
117 *        exceptions
118 *          alt_not_found         = 1
119 *          call_invalid          = 2
120 *          material_not_found    = 3
121 *          missing_authorization = 4
122 *          no_bom_found          = 5
123 *          no_plant_data         = 6
124 *          no_suitable_bom_found = 7
125 *          conversion_error      = 8
126 *          others                = 9.
127 
128       clear:ls_i_stpo,lv_i_matnr,lv_i_plant,lv_i_usage,lv_i_alter,lv_i_datuv,lv_i_datub.
129       clear:lt_e_stpo,lt_e_stpo[].
130 
131       lv_i_matnr = <fs_wa>-idnrk.
132       lv_i_plant = lv_werks.
133       lv_i_usage = lc_stlan.
134       "lv_i_alter = alter.
135       lv_i_datuv = datuv.
136       lv_i_datub = datub.
137 
138       "获取总成件BOM清单
139       call function 'CSAP_MAT_BOM_ITEM_SELECT'
140         exporting
141           i_stpo                     = ls_i_stpo
142           material                   = lv_i_matnr
143           plant                      = lv_i_plant
144           bom_usage                  = lv_i_usage
145           alternative                = lv_i_alter
146           fl_material_check          = lc_check
147           fl_foreign_key_check       = lc_check
148           valid_from                 = lv_i_datuv
149           valid_to                   = lv_i_datub
150         tables
151           t_stpo                     = lt_e_stpo
152         exceptions
153           error                      = 1
154           others                     = 2  .
155       if sy-subrc <> 0.
156 * Implement suitable error handling here
157       else.
158         loop at lt_e_stpo assigning <fs_estpo>.
159           call function 'CONVERSION_EXIT_ALPHA_INPUT'
160             exporting
161               input         = <fs_estpo>-component
162             importing
163               output        = <fs_estpo>-component.
164         endloop.
165       endif.
166 
167       select *
168         into corresponding fields of table lt_stb
169         from mast as a inner join stpo as b
170           on a~stlnr = b~stlnr
171        where a~stlan = lc_stlan
172          and a~stlal = lc_stlal
173          and a~werks = lv_werks
174          and a~matnr = <fs_wa>-idnrk
175          and b~stlty = lc_stlty
176          and b~lkenz = space
177          and b~datuv <= sy-datum
178          and b~postp = lc_postp.
179 
180       loop at lt_stb assigning <fs_stpo>.
181         read table lt_e_stpo assigning <fs_estpo>
182         with key item_guid = <fs_stpo>-guidx.
183         if sy-subrc <> 0.
184           continue.
185         endif.
186 
187         select single count(*)
188           from mara inner join marc
189             on mara~matnr = marc~matnr
190          where mara~matnr = <fs_stpo>-idnrk
191            and mara~mtart = lc_mtart_zycl
192            and marc~beskz = lc_beskz_f.
193         if sy-subrc = 0.
194           append initial line to lt_wa assigning <fs_cwa>.
195           move-corresponding <fs_wa> to <fs_cwa>.
196           <fs_cwa>-idnrk = <fs_stpo>-idnrk.
197           <fs_cwa>-menge = <fs_stpo>-menge.
198           <fs_cwa>-meins = <fs_stpo>-meins.
199           <fs_cwa>-posnr = space.
200           unassign <fs_cwa>.
201 
202           read table add_wa assigning <fs_addwa>
203           with key stlkn = <fs_wa>-stlkn
204                    stpoz = <fs_wa>-stpoz.
205           if sy-subrc = 0.
206             append initial line to lt_addwa assigning <fs_cadd>.
207             move-corresponding <fs_addwa> to <fs_cadd>.
208             <fs_cadd>-index = space.
209             unassign:<fs_addwa>,<fs_cadd>.
210           endif.
211         endif.
212       endloop.
213     endif.
214   endloop.
215 
216   if lt_wa[] is not initial.
217     clear:lv_index,lv_posnr.
218 
219     sort wa     by posnr descending.
220     sort add_wa by index descending.
221 
222     read table wa assigning <fs_wa> index 1.
223     if sy-subrc = 0.
224       lv_posnr = <fs_wa>-posnr.
225     endif.
226 
227     read table add_wa assigning <fs_addwa> index 1.
228     if sy-subrc = 0.
229       lv_index = <fs_addwa>-index.
230     endif.
231 
232     loop at lt_wa assigning <fs_cwa>
233     where posnr = space.
234       lv_posnr = lv_posnr + 10.
235 
236       call function 'CONVERSION_EXIT_ALPHA_INPUT'
237         exporting
238           input         = lv_posnr
239         importing
240           output        = lv_posnr .
241 
242       <fs_cwa>-posnr = lv_posnr.
243     endloop.
244 
245     loop at lt_addwa assigning <fs_cadd>
246     where index = space.
247       lv_index = lv_index + 1.
248       <fs_cadd>-index = lv_index.
249     endloop.
250 
251     append lines of lt_wa[] to wa[].
252     append lines of lt_addwa[] to add_wa[].
253   endif.
254 
255 endif.

2.系统测试

 2.1基础数据

  

  整车物料:TWL-ZZCH-003

  总成件:TWL0824(包含子件TWL0825)

  

  总成件TWL0824为委外件(类型CSMT-A)

  

  配置表ZTMM0093_MRP_WRK :工厂3302启用BOM层级子件运算,对应的事务码:MD41/MD42/CK11N

 2.2测试-MRP运行

  创建独立需求MD61:

  

  MRP运行MD41:

  

  查看子件 TWL0825 需求清单MD04:

  

   查看整车TWL-ZZCH-003成本核算CK11N:总成件TWL0824与其子件TWL0825都进行核算

原文地址:https://www.cnblogs.com/ricoo/p/10066165.html