最近有个业务需要,MRP运行过程中需要根据生产计划订单/子件/供应商对应关系来拆解采购申请。
1.具体实例:
a.基础数据
整车物料:NL1G58420151001219
子件:000000008888002653
供应商:0000563007 / 0008000005
配额:
订单BOM:
b.创建计划独立需求T-CODE:MD61
c.MRP运行T-CODE:MD41
d.库存/需求清单T-CODE:MD04
综上:MRP运行后子件8888002653生成的采购申请是根据配额来分配供应商的。
新需求:生产某些车型需要的子件需要特定的供应商专供,针对该子件的其他采购需求还是按照配额来分配供应商。
该需求很无语,通过SPRO配置已无解,只能通过查找增强出口解决该问题了。
2.解决方式:
2.1自定义表
2.2增强点
在程序 LM61YF0J 行70 创建隐式增强点 ZIMP_BADI_MRP_VENDOR ,并插入 include zmmi0001_mrp_vendor.
2.4 INCLUDE ZMMI0001_MRP_VENDOR程序代码
1 *&---------------------------------------------------------------------* 2 *& Include ZMMI0001_MRP_VENDOR 3 *& 4 *&---------------------------------------------------------------------* 5 *& Program Name: MRP运行-根据车型/供应商拆分采购申请 6 *& Date written: 2018-08-13 7 *& Author's name: 陈** 8 *& Business design:陈** 9 *& Last update: 2018-08-13 10 *& Project Name: *****ERP项目 11 *& Version: V1.0 12 *& Modify History: 13 *& Sketch: MRP运行根据车型/供应商拆分采购申请 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.获取采购明细MDPSN 25 *& 3.获取生产计划需求明细,根据车型获取供应商 26 *& 4.根据供应商拆解采购申请MDPSN 27 *&---------------------------------------------------------------------* 28 29 "局部变量定义 30 data: 31 begin of wa_mdps, 32 check type c, 33 poflg type c, 34 vendor type lifnr. 35 include structure mdps. 36 data:end of wa_mdps. 37 data: 38 lv_mng01 type mdps-mng01, 39 lv_bnfpo type eban-bnfpo, 40 lv_mng02 type mdps-mng02, 41 lv_exitdg type c, 42 lv_index type i. 43 data: 44 lt_mrp_mdpsn like table of mdps, 45 lt_mrp_mdpso like table of mdps, 46 lt_cop_mdpsn like table of mdps, 47 lt_col_mdpsn like table of mdps, 48 lt_mrp_mdpsx like table of wa_mdps, 49 lt_mrp_mdnbx like table of mdnb, 50 lt_mrp_vendor like table of ztmm0094_mrp_vnd. 51 field-symbols: 52 <fs_mdpsx> like wa_mdps, 53 <fs_vendor> like ztmm0094_mrp_vnd, 54 <fs_mdps> like mdps, 55 <fs_mdpsn> like mdps, 56 <fs_mdpso> like mdps, 57 <fs_mdnbx> like mdnb. 58 59 select single fg_exitdg 60 into lv_exitdg 61 from ztmm0093_mrp_wrk 62 where werks = cm61x-werks 63 and fg_enable = 'X' 64 and fg_vendor = 'X'. 65 if sy-subrc = 0. 66 "是否断点 67 if lv_exitdg = 'X'. 68 break-point. 69 endif. 70 71 lt_mrp_mdpsn[] = mdpsn[]. 72 lt_mrp_mdnbx[] = mdnbx[]. 73 lt_mrp_mdpso[] = mdpso[]. 74 75 loop at mdpsx assigning <fs_mdps>. 76 append initial line to lt_mrp_mdpsx assigning <fs_mdpsx>. 77 move-corresponding <fs_mdps> to <fs_mdpsx>. 78 unassign <fs_mdpsx>. 79 endloop. 80 81 loop at lt_mrp_mdpsn assigning <fs_mdpsn> 82 where delnr is not initial. 83 "行项目6位转5位 84 clear:lv_bnfpo. 85 lv_bnfpo = <fs_mdpsn>-delps+1(5). 86 87 "获取供应商 88 select single flief 89 into <fs_mdpsn>-lifnr 90 from eban 91 where banfn = <fs_mdpsn>-delnr 92 and bnfpo = lv_bnfpo. 93 endloop. 94 95 "获取组件对应供应商 96 select * 97 into table lt_mrp_vendor 98 from ztmm0094_mrp_vnd 99 where werks = cm61x-werks 100 and idnrk = cm61d-matnr. 101 sort lt_mrp_vendor by werks idnrk matnr lifnr. 102 103 loop at lt_mrp_mdpsx assigning <fs_mdpsx> 104 where delkz <> 'WB' 105 and ( plumi = '+' or plumi = '-'). 106 107 "判断是否计划订单/生产订单 108 if <fs_mdpsx>-stlty = 'M' 109 and <fs_mdpsx>-stlnr is not initial 110 and <fs_mdpsx>-stlkn is not initial 111 and <fs_mdpsx>-stpoz is not initial 112 and <fs_mdpsx>-baugr is not initial. 113 114 read table lt_mrp_vendor 115 assigning <fs_vendor> 116 with key matnr = <fs_mdpsx>-baugr 117 binary search. 118 if sy-subrc = 0. 119 "标识-车型/组件/供应商匹配 120 <fs_mdpsx>-check = 'X'. 121 <fs_mdpsx>-vendor = <fs_vendor>-lifnr. 122 endif. 123 endif. 124 125 "拆分采购申请 126 if <fs_mdpsx>-plumi = '-'. 127 loop at lt_mrp_mdpsn assigning <fs_mdpsn> 128 where mng01 > 0. 129 "非特殊标识check=space供应商 130 if <fs_mdpsx>-check = space. 131 <fs_mdpsx>-vendor = <fs_mdpsn>-lifnr. 132 endif. 133 "逐步递减数量 134 clear:lv_mng01. 135 if <fs_mdpsx>-mng01 >= <fs_mdpsn>-mng01. 136 lv_mng01 = <fs_mdpsn>-mng01. 137 elseif <fs_mdpsx>-mng01 < <fs_mdpsn>-mng01. 138 lv_mng01 = <fs_mdpsx>-mng01. 139 endif. 140 141 if <fs_mdpsn>-delkz <> 'ZZ'. 142 read table lt_cop_mdpsn assigning <fs_mdps> 143 with key plaab = <fs_mdpsn>-plaab 144 planr = <fs_mdpsn>-planr 145 tag00 = <fs_mdpsn>-tag00 146 sort1 = <fs_mdpsn>-sort1 147 sort2 = <fs_mdpsn>-sort2 148 lgort = <fs_mdpsn>-lgort 149 delkz = <fs_mdpsn>-delkz 150 lifnr = <fs_mdpsx>-vendor 151 vrfkz = <fs_mdpsn>-vrfkz 152 plumi = <fs_mdpsn>-plumi 153 dat00 = <fs_mdpsn>-dat00 154 dat01 = <fs_mdpsn>-dat01 155 dat02 = <fs_mdpsn>-dat02. 156 if sy-subrc = 0. 157 <fs_mdps>-mng01 = <fs_mdps>-mng01 + lv_mng01. 158 else. 159 if cm61x-plmod = '1' "1 适应计划数据(普通模式) 160 or cm61x-plmod = '2'. "2 重扩展 BOM 和工艺路线 161 read table mdpso assigning <fs_mdpso> 162 with key plaab = <fs_mdpsn>-plaab 163 planr = <fs_mdpsn>-planr 164 tag00 = <fs_mdpsn>-tag00 165 sort1 = <fs_mdpsn>-sort1 166 sort2 = <fs_mdpsn>-sort2 167 lgort = <fs_mdpsn>-lgort 168 delkz = <fs_mdpsn>-delkz 169 lifnr = <fs_mdpsx>-vendor 170 vrfkz = <fs_mdpsn>-vrfkz 171 plumi = <fs_mdpsn>-plumi 172 dat00 = <fs_mdpsn>-dat00 173 dat01 = <fs_mdpsn>-dat01 174 dat02 = <fs_mdpsn>-dat02. 175 if sy-subrc = 0. 176 lv_index = sy-tabix. 177 if <fs_mdpsx>-check = 'X'. 178 append initial line to lt_cop_mdpsn assigning <fs_mdps>. 179 move-corresponding <fs_mdpso> to <fs_mdps>. 180 <fs_mdps>-mng01 = lv_mng01. 181 <fs_mdps>-lifnr = <fs_mdpsx>-vendor. 182 <fs_mdps>-vstat = <fs_mdpsn>-vstat. 183 unassign <fs_mdps>. 184 else. 185 append initial line to lt_cop_mdpsn assigning <fs_mdps>. 186 move-corresponding <fs_mdpso> to <fs_mdps>. 187 <fs_mdps>-mng01 = lv_mng01. 188 <fs_mdps>-lifnr = <fs_mdpsx>-vendor. 189 <fs_mdps>-vstat = <fs_mdpsn>-vstat. 190 unassign <fs_mdps>. 191 endif. 192 delete mdpso index lv_index. 193 else. 194 if <fs_mdpsx>-check = 'X'. 195 append initial line to lt_cop_mdpsn assigning <fs_mdps>. 196 move-corresponding <fs_mdpsn> to <fs_mdps>. 197 <fs_mdps>-mng01 = lv_mng01. 198 <fs_mdps>-lifnr = <fs_mdpsx>-vendor. 199 unassign <fs_mdps>. 200 else. 201 append initial line to lt_cop_mdpsn assigning <fs_mdps>. 202 move-corresponding <fs_mdpsn> to <fs_mdps>. 203 <fs_mdps>-mng01 = lv_mng01. 204 <fs_mdps>-lifnr = <fs_mdpsx>-vendor. 205 unassign <fs_mdps>. 206 endif. 207 endif. 208 unassign <fs_mdpso>. 209 elseif cm61x-plmod = '3'. "3 删除并重新创建计划数据 210 if <fs_mdpsx>-check = 'X'. 211 append initial line to lt_cop_mdpsn assigning <fs_mdps>. 212 move-corresponding <fs_mdpsn> to <fs_mdps>. 213 <fs_mdps>-mng01 = lv_mng01. 214 <fs_mdps>-lifnr = <fs_mdpsx>-vendor. 215 unassign <fs_mdps>. 216 else. 217 append initial line to lt_cop_mdpsn assigning <fs_mdps>. 218 move-corresponding <fs_mdpsn> to <fs_mdps>. 219 <fs_mdps>-mng01 = lv_mng01. 220 <fs_mdps>-lifnr = <fs_mdpsx>-vendor. 221 unassign <fs_mdps>. 222 endif. 223 endif. 224 endif. 225 endif. 226 227 <fs_mdpsn>-mng01 = <fs_mdpsn>-mng01 - lv_mng01. 228 <fs_mdpsx>-mng01 = <fs_mdpsx>-mng01 - lv_mng01. 229 230 if <fs_mdpsx>-mng01 = 0. 231 exit. 232 endif. 233 endloop. 234 elseif <fs_mdpsx>-plumi = '+'. 235 append initial line to lt_mrp_mdpsn assigning <fs_mdpsn>. 236 move-corresponding <fs_mdpsx> to <fs_mdpsn>. 237 <fs_mdpsn>-delkz = 'ZZ'. "自定义符号,仅逻辑计算 238 unassign <fs_mdpsn>. 239 240 sort lt_mrp_mdpsn. 241 endif. 242 endloop. 243 244 "未清记录 245 loop at lt_mrp_mdpsn assigning <fs_mdpsn> 246 where delkz <> 'ZZ' 247 and vstat <> 'L' 248 and mng01 > 0. 249 250 read table lt_cop_mdpsn assigning <fs_mdps> 251 with key plaab = <fs_mdpsn>-plaab 252 planr = <fs_mdpsn>-planr 253 tag00 = <fs_mdpsn>-tag00 254 sort1 = <fs_mdpsn>-sort1 255 sort2 = <fs_mdpsn>-sort2 256 lgort = <fs_mdpsn>-lgort 257 delkz = <fs_mdpsn>-delkz 258 lifnr = <fs_mdpsn>-lifnr 259 vrfkz = <fs_mdpsn>-vrfkz 260 plumi = <fs_mdpsn>-plumi 261 dat00 = <fs_mdpsn>-dat00 262 dat01 = <fs_mdpsn>-dat01 263 dat02 = <fs_mdpsn>-dat02. 264 if sy-subrc = 0. 265 <fs_mdps>-mng01 = <fs_mdps>-mng01 + <fs_mdpsn>-mng01. 266 else. 267 append initial line to lt_cop_mdpsn assigning <fs_mdps>. 268 move-corresponding <fs_mdpsn> to <fs_mdps>. 269 <fs_mdps>-mng01 = <fs_mdpsn>-mng01. 270 <fs_mdps>-lifnr = <fs_mdpsn>-lifnr. 271 endif. 272 unassign <fs_mdps>. 273 endloop. 274 275 sort lt_cop_mdpsn. 276 277 "数量总和对比 278 clear:lv_mng01,lv_mng02. 279 280 loop at lt_cop_mdpsn assigning <fs_mdps>. 281 lv_mng01 = lv_mng01 + <fs_mdps>-mng01. 282 endloop. 283 284 loop at mdpsn assigning <fs_mdpsn>. 285 lv_mng02 = lv_mng02 + <fs_mdpsn>-mng01. 286 endloop. 287 288 if lv_mng01 <> lv_mng02. 289 290 endif. 291 292 "最终执行记录 293 mdpsn[] = lt_cop_mdpsn[]. 294 295 sort mdpsn. 296 297 endif.
3.测试
3.1维护配置表
ZTMM0093_MRP_WRK
ZTMM0094_MRP_VND
3.2业务测试
子件8888002653重新运行MRP,T-CODE:MD41
查询子件子件8888002653 MRP运行后的库存需求清单,T-CODE:MD04
整车物料NL1G58420151001219对应子件8888002653获取的供应商编号为 8000005 (配置表ZTMM0094_MRP_VND记录)