BOM扩展及批次FIFO分配

*&---------------------------------------------------------------------*
*& Report  ZMMR003
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZMMR003 .
TYPE-POOLS :SLIS .
TABLES :MAST MARA STKO MAKT AFKO AFPO AUFK .

DATA :STB  LIKE STPOX  OCCURS  WITH  HEADER  LINE .

DATA BEGIN  OF MATCAT  OCCURS  0 .
         INCLUDE  STRUCTURE CSCMAT .
DATA END  OF MATCAT .

DATA BEGIN  OF MATS .
         INCLUDE  STRUCTURE CSCMAT .
DATA END  OF MATS .

DATA BEGIN  OF SELPOOL .
         INCLUDE  STRUCTURE CSTMAT .
DATA : END  OF SELPOOL .

DATA DSTST_FLG  LIKE CSDATA -XFELD .

DATA LAYOUT  TYPE SLIS_LAYOUT_ALV ,
      GS_LAYOUT  TYPE SLIS_LAYOUT_ALV ,
      G_REPID  LIKE SY -REPID .

DATA WA_ALV_FIELD  TYPE SLIS_FIELDCAT_ALV "列描述内表,列清单
WA_ALV_FIELDCAT  TYPE SLIS_T_FIELDCAT_ALV , "定义内表
G_USER_COMMAND  TYPE SLIS_FORMNAME  VALUE  'USER_COMMAND' .

DATA : BEGIN  OF WA_DATA ,
  WERKS  LIKE AUFK -WERKS ,
  AUFNR  LIKE AFKO -AUFNR ,
  OBJNR  LIKE AUFK -OBJNR ,
  PLNBEZ  LIKE AFKO -PLNBEZ ,
  GAMNG  LIKE AFKO -GAMNG ,
   END  OF WA_DATA .
DATA IT_DATA  LIKE WA_DATA  OCCURS  WITH  HEADER  LINE .

DATA ITAB  TYPE  TABLE  OF ZMMSF003  WITH  HEADER  LINE .
DATA IT_OUT  TYPE  TABLE  OF ZMMSF003  WITH  HEADER  LINE .

DATA :IT_OBJNR  TYPE  TABLE  OF JEST  WITH  HEADER  LINE .

DATA : BEGIN  OF WA_BATCH ,
  WERKS  TYPE MCHB -WERKS ,
  MATNR  TYPE MCHB -MATNR ,
  LGORT  TYPE MCHB -LGORT ,
  CHARG  TYPE MCHB -CHARG ,
  CLABS  TYPE MCHB -CLABS ,
   END  OF WA_BATCH .
DATA IT_BATCH  LIKE  TABLE  OF WA_BATCH  WITH  HEADER  LINE .

SELECTION-SCREEN  BEGIN  OF  BLOCK BLOCK1  WITH  FRAME  TITLE  TEXT - 001 .
SELECT-OPTIONS S_WERKS  FOR AUFK -WERKS ,
S_AUFNR  FOR AFKO -AUFNR ,
S_MATNR  FOR AFKO -PLNBEZ .
"PARAMETERS: S_AUART LIKE AUFK-AUART.
SELECTION-SCREEN  END  OF  BLOCK BLOCK1 .

INITIALIZATION .
  G_REPID  SY -REPID .

START-OF-SELECTION .
   PERFORM GETDATA .
   PERFORM DISPLAYDATA .
   PERFORM LAYOUT_INIT  CHANGING GS_LAYOUT .

   CALL  FUNCTION  'REUSE_ALV_GRID_DISPLAY'  "调用ALV 显示表单数据
   EXPORTING
  I_CALLBACK_PROGRAM  SY -REPID
   "i_callback_top_of_page = 'TOP_OF_PAGE'
  IT_FIELDCAT  WA_ALV_FIELDCAT
  IS_LAYOUT  GS_LAYOUT
  I_CALLBACK_USER_COMMAND  G_USER_COMMAND
   TABLES
  T_OUTTAB  IT_OUT
   EXCEPTIONS
  PROGRAM_ERROR  1
   OTHERS  2 .
   IF SY -SUBRC <>  0 .
     MESSAGE  ID SY -MSGID  TYPE SY -MSGTY  NUMBER SY -MSGNO
     WITH SY -MSGV1 SY -MSGV2 SY -MSGV3 SY -MSGV4 .
   ENDIF .

*&---------------------------------------------------------------------*
*&      Form  getdata
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM GETDATA .
   SELECT
    AUFK ~WERKS
    AUFK ~AUFNR
    AUFK ~OBJNR
    AFKO ~PLNBEZ
    AFKO ~GAMNG
     INTO CORRESPONDING  FIELDS  OF  TABLE IT_DATA
     FROM AUFK inner  JOIN AFKO  ON AUFK ~AUFNR  AFKO ~AUFNR   WHERE AUFK ~WERKS  IN S_WERKS  AND AFKO ~AUFNR  IN S_AUFNR  AND AFKO ~PLNBEZ  IN S_MATNR  AND AUFK ~AUART  'PP01'  .

   SORT IT_DATA  BY AUFNR PLNBEZ .
   DELETE IT_DATA  WHERE PLNBEZ  IS  INITIAL .
   LOOP  AT IT_DATA  INTO WA_DATA .
     SELECT INTO CORRESPONDING  FIELDS  OF  TABLE IT_OBJNR  FROM JEST  WHERE OBJNR  WA_DATA -OBJNR  AND STAT  'I0002'  AND INACT  '' .
     IF IT_OBJNR[]  IS  NOT  INITIAL . "工单已下达
       SELECT  SINGLE LGORT  INTO ITAB -LGORT  FROM AFPO  WHERE AUFNR  WA_DATA -AUFNR .
       SELECT  SINGLE MAKTX  INTO ITAB -MAKTX  FROM MAKT  WHERE MATNR  WA_DATA -PLNBEZ .

       CALL  FUNCTION  'CS_BOM_EXPL_MAT_V2'
         EXPORTING
          CAPID                  'PP01'  "BOM 应用程序
          DATUV                  SY -DATUM  "有效起始日
              " emeng                 = p_emeng " 基本数量 Required quantity STKO-BMENG
          MTNRV                  WA_DATA -PLNBEZ  "成品号或半成品号
          STLAN                  '1'  "BOM 用途,1 代表生产
          STLAL                  ''  "可选BOM
          MKTLS                  'X'
          MEHRS                  'X'  "是否多层展开,'X' 代表多层
          RNDKZ                  '1'  "Round off: ' '=always, '1'=never, '2'=only levels > 1 是否取整
          WERKS                  WA_DATA -WERKS  "工厂
         IMPORTING
          TOPMAT                 SELPOOL  "开始BOM 展开的物料显示
          DSTST                  DSTST_FLG  "BOM 帮助字段
         TABLES
          STB                    STB
          MATCAT                 MATCAT  "下面含有组件的物料存放在该内表对应 STB-TTIDX 在类别表内的索引﹐标志直属哪个物料下的 BOM
         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 .


       DELETE STB  WHERE MTART <>  'ROH' .
       SORT STB  BY IDNRK .
       DATA S_IDNRK  LIKE STPOX -IDNRK .
      S_IDNRK  '' .
       IF STB[]  IS  NOT  INITIAL .
         LOOP  AT STB .
           DATA S_MMEIN ( 2 TYPE  C .
           IF S_IDNRK <> STB -IDNRK .
            ITAB -WERKS  STB -WERKS .
            ITAB -IDNRK  STB -IDNRK . "组件
            ITAB -MNGKO  =  STB -MNGKO * WA_DATA -GAMNG "用量
             IF STB -MMEIN  'ST' .      "ST单位变为PC
               CALL  FUNCTION  'CONVERSION_EXIT_CUNIT_OUTPUT'
                 EXPORTING
                   INPUT           STB -MMEIN
                 IMPORTING
                   OUTPUT          S_MMEIN
                 EXCEPTIONS
                  UNIT_NOT_FOUND  1
                   OTHERS          2 .
              ITAB -MMEIN  S_MMEIN .
             ELSE .
              ITAB -MMEIN  STB -MMEIN . "基本计量单位
             ENDIF .
            ITAB -MATNR  WA_DATA -PLNBEZ .
            ITAB -AUFNR  WA_DATA -AUFNR .
             APPEND ITAB .
            S_IDNRK  STB -IDNRK .
           ELSE .
            ITAB -MNGKO  ITAB -MNGKO + STB -MNGKO * WA_DATA -GAMNG .
            SY -TABIX  SY -TABIX  1 .
             MODIFY ITAB  INDEX SY -TABIX .
           ENDIF .
         ENDLOOP .
       ENDIF .
     ENDIF .
   ENDLOOP .


   LOOP  AT ITAB .
     DATA SUMQTY  LIKE MCHB -CLABS .
    SUMQTY  0 .
     DATA MESS ( 20 TYPE  C .
     SELECT  SINGLE  SUM CLABS  INTO SUMQTY  FROM MCHB  WHERE WERKS  ITAB -WERKS  AND MATNR  ITAB -MATNR  GROUP  BY WERKS MATNR .
     " IF sumqty = 0.
     "   CONCATENATE '物料' itab-matnr '没有库存' INTO mess.
     "  MESSAGE:mess TYPE 'I'.
     " ELSE.
     IF SUMQTY >  0 .
       SELECT MATNR WERKS LGORT CHARG CLABS  INTO CORRESPONDING  FIELDS  OF  TABLE IT_BATCH  FROM MCHB  WHERE
  MATNR  ITAB -IDNRK  AND WERKS  ITAB -WERKS  AND CLABS >  0 .
       SORT IT_BATCH  BY WERKS MATNR CHARG  ASCENDING .
       DATA SYSL  LIKE AFKO -GAMNG FPSL  LIKE AFKO -GAMNG YFPSL  LIKE AFKO -GAMNG .
      SYSL  0 .   "剩余数量
      FPSL  0 .    "分配数量
      YFPSL  0 "已分配数量
       LOOP  AT IT_BATCH .
         IF YFPSL  AND ITAB -MNGKO <= IT_BATCH -CLABS . "该条记录第一次分配批次库存,第一个批次库存满足要求
          FPSL  ITAB -MENGE .
          YFPSL  YFPSL + FPSL .
          IT_OUT -WERKS  ITAB -WERKS .
          IT_OUT -AUFNR  ITAB -AUFNR .
          IT_OUT -MATNR  ITAB -MATNR .
          IT_OUT -LGORT  ITAB -LGORT .
          IT_OUT -MAKTX  ITAB -MAKTX .
          IT_OUT -IDNRK  ITAB -IDNRK .
          IT_OUT -MNGKO  ITAB -MNGKO .
          IT_OUT -MMEIN  ITAB -MMEIN .
          IT_OUT -CHARG  IT_BATCH -CHARG .
          IT_OUT -MENGE  FPSL .
          IT_OUT -UMLGO  IT_BATCH -LGORT .
           APPEND  IT_OUT .
           EXIT .
         ELSEIF YFPSL  AND ITAB -MNGKO >= IT_BATCH -CLABS . "该条记录第一次分配库存,并且第一个批次库存不够需求量
          FPSL  IT_BATCH -CLABS .
          YFPSL  YFPSL + FPSL .
          IT_OUT -WERKS  ITAB -WERKS .
          IT_OUT -AUFNR  ITAB -AUFNR .
          IT_OUT -MATNR  ITAB -MATNR .
          IT_OUT -LGORT  ITAB -LGORT .
          IT_OUT -MAKTX  ITAB -MAKTX .
          IT_OUT -IDNRK  ITAB -IDNRK .
          IT_OUT -MNGKO  ITAB -MNGKO .
          IT_OUT -MMEIN  ITAB -MMEIN .
          IT_OUT -CHARG  IT_BATCH -CHARG .
          IT_OUT -MENGE  FPSL .
          IT_OUT -UMLGO  IT_BATCH -LGORT .
           APPEND IT_OUT .
          SYSL  ITAB -MNGKO  YFPSL .
         ELSEIF YFPSL <>  AND SYSL <= IT_BATCH -CLABS . "该条记录已经分配批次库存了,在这次批次库存分配中批次库存满足剩余需要的数量
          FPSL  SYSL .
          YFPSL  YFPSL + SYSL .
          IT_OUT -WERKS  ITAB -WERKS .
          IT_OUT -AUFNR  ITAB -AUFNR .
          IT_OUT -MATNR  ITAB -MATNR .
          IT_OUT -LGORT  ITAB -LGORT .
          IT_OUT -MAKTX  ITAB -MAKTX .
          IT_OUT -IDNRK  ITAB -IDNRK .
          IT_OUT -MNGKO  ITAB -MNGKO .
          IT_OUT -MMEIN  ITAB -MMEIN .
          IT_OUT -CHARG  IT_BATCH -CHARG .
          IT_OUT -MENGE  FPSL .
          IT_OUT -UMLGO  IT_BATCH -LGORT .
           APPEND IT_OUT .
           EXIT .
         ELSE .                             "该条记录已经分配库存了,在这次分配中批次库存不满足需要的剩余数量,需要再次分配
          FPSL  IT_BATCH -CLABS .
          YFPSL  YFPSL + FPSL .
          IT_OUT -WERKS  ITAB -WERKS .
          IT_OUT -AUFNR  ITAB -AUFNR .
          IT_OUT -MATNR  ITAB -MATNR .
          IT_OUT -LGORT  ITAB -LGORT .
          IT_OUT -MAKTX  ITAB -MAKTX .
          IT_OUT -IDNRK  ITAB -IDNRK .
          IT_OUT -MNGKO  ITAB -MNGKO .
          IT_OUT -MMEIN  ITAB -MMEIN .
          IT_OUT -CHARG  IT_BATCH -CHARG .
          IT_OUT -MENGE  FPSL .
          IT_OUT -UMLGO  IT_BATCH -LGORT .
           APPEND IT_OUT .
          SYSL  ITAB -MNGKO  YFPSL .
         ENDIF .
       ENDLOOP .
     ENDIF .
   ENDLOOP .
ENDFORM .                     "getdata

*&---------------------------------------------------------------------*
*&      Form  displaydata
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM DISPLAYDATA .
   PERFORM ADD_FIELD  USING  'WERKS'  ' 工厂'  'C111'  'X' .
   PERFORM ADD_FIELD  USING  'MATNR'  ' 成品物料号'  'C111'  'X' .
   PERFORM ADD_FIELD  USING  'MAKTX'  ' 物料描述'  'C111'  'X' .
   PERFORM ADD_FIELD  USING  'AUFNR'  ' 生产订单号'  'C111'  'X' .
   PERFORM ADD_FIELD  USING  'LGORT'  ' 仓库'  'C111'  'X' .
   PERFORM ADD_FIELD  USING  'IDNRK'  ' 物料组件'  'C111'  'X' .
   PERFORM ADD_FIELD  USING  'MMEIN'  ' 单位'  'C111'  'X' .
   PERFORM ADD_FIELD  USING  'MNGKO'  ' 组件需求数'  'C111'  'X' .
   PERFORM ADD_FIELD  USING  'CHARG'  ' 批次号'  'C111'  'X' .
   PERFORM ADD_FIELD  USING  'MENGE'  ' 分配批次数'  'C111'  'X' .
   PERFORM ADD_FIELD  USING  'UMLGO'  ' 仓位'  'C111'  'X' .
ENDFORM .                     "displaydata

*&---------------------------------------------------------------------*
*&      Form  add_field
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->I_FIELDNAME  text
*      -->I_TEXT       text
*      -->I_NO         text
*      -->I_ZERO       text
*----------------------------------------------------------------------*
FORM ADD_FIELD  USING I_FIELDNAME  TYPE SLIS_FIELDNAME I_TEXT  TYPE STRING I_NO  TYPE  I_ZERO  TYPE  C .
   CLEAR WA_ALV_FIELD .
  WA_ALV_FIELD -FIELDNAME  I_FIELDNAME .
  WA_ALV_FIELD -TABNAME  'IT_OUT' .
  WA_ALV_FIELD -DDICTXT  'L' .
   "wa_alv_field-no_zero = i_zero.
  WA_ALV_FIELD -SELTEXT_L  I_TEXT .
   APPEND WA_ALV_FIELD  TO WA_ALV_FIELDCAT .
ENDFORM .                     "add_field

*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM USER_COMMAND  USING R_UCOMM  LIKE SY -UCOMM
RS_SELFIELD  TYPE SLIS_SELFIELD .
   CASE R_UCOMM .
     WHEN  '&IC1' " SAP STANDARD CODE FOR DOUBLE-CLICKING
       IF RS_SELFIELD -SEL_TAB_FIELD  'IT_OUT-MATNR' .
         SET  PARAMETER  ID  'MAT'  FIELD RS_SELFIELD - VALUE .
         CALL  TRANSACTION  'CS03'  AND  SKIP  FIRST  SCREEN .
       ENDIF .
       IF RS_SELFIELD -SEL_TAB_FIELD  'IT_OUT-IDNRK' .
         SET  PARAMETER  ID  'MAT'  FIELD RS_SELFIELD - VALUE .
         CALL  TRANSACTION  'MM03'  AND  SKIP  FIRST  SCREEN .
       ENDIF .
   ENDCASE .
ENDFORM .                     "user_command

*&---------------------------------------------------------------------*
*&      Form  layout_init
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RS_LAYOUT  text
*----------------------------------------------------------------------*
FORM LAYOUT_INIT  CHANGING RS_LAYOUT  TYPE SLIS_LAYOUT_ALV .   "自动调整列宽
  RS_LAYOUT -COLWIDTH_OPTIMIZE  'X' .
   "rs_layout-box_fieldname = 'SEL'.
   "rs_layout-zebra = 'X'.
   "rs_layout-detail_popup = 'X'.
ENDFORM .                     "layout_init
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值