zoukankan      html  css  js  c++  java
  • ABAP-增强-MRP运行-根据工厂/父件/子件/供应商拆分采购申请

    最近有个业务需要,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记录)

  • 相关阅读:
    【NX二次开发】修改dlx对话框标题的方法
    【NX二次开发】导入x_t,UF_PS_import_data
    设置NX欢迎界面
    [转]10个顶级的CSS UI开源框架
    [转] 多线程 《深入浅出 Java Concurrency》目录
    [转] JAVA多线程和并发基础面试问答
    [转]StuQ 技能图谱(全套13张)
    [转] MongoDB shell 操作 (查询)
    搜集好的java技术帖子,持续更新,java程序员的要求
    [转]JAVA程序员一定知道的优秀第三方库(2016版)
  • 原文地址:https://www.cnblogs.com/ricoo/p/10066068.html
Copyright © 2011-2022 走看看