BOM扩展及批次FIFO分配

主页 » SAP文库 » PP

作者 yuqinying112 2013-07-19    761
*&---------------------------------------------------------------------*
*& Report  ZMMR003
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZMMR003.
TYPE-POOLS:SLIS.
TABLES:MASTMARASTKOMAKTAFKOAFPOAUFK.

DATA:STB LIKE STPOX OCCURS WITH HEADER LINE.

DATABEGIN OF MATCAT OCCURS 0.
        INCLUDE STRUCTURE CSCMAT.
DATAEND OF MATCAT.

DATABEGIN OF MATS.
        INCLUDE STRUCTURE CSCMAT.
DATAEND OF MATS.

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

DATADSTST_FLG LIKE CSDATA-XFELD.

DATALAYOUT TYPE SLIS_LAYOUT_ALV,
      GS_LAYOUT TYPE SLIS_LAYOUT_ALV,
      G_REPID LIKE SY-REPID.

DATAWA_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.
DATAIT_DATA LIKE WA_DATA OCCURS WITH HEADER LINE.

DATAITAB TYPE TABLE OF ZMMSF003 WITH HEADER LINE.
DATAIT_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.
DATAIT_BATCH LIKE TABLE OF WA_BATCH WITH HEADER LINE.

SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONSS_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.
      DATAS_IDNRK LIKE STPOX-IDNRK.
      S_IDNRK ''.
      IF STB[] IS NOT INITIAL.
        LOOP AT STB.
          DATAS_MMEIN(2TYPE 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.
    DATASUMQTY LIKE MCHB-CLABS.
    SUMQTY 0.
    DATAMESS(20TYPE C.
    SELECT SINGLE SUMCLABS 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.
      DATASYSL LIKE AFKO-GAMNGFPSL LIKE AFKO-GAMNGYFPSL 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

本文原始地址:http://51itbooks.com/sap/theme/514.html

转载请注明出处来自 IT文库

上一篇

AA固定资产|概述

下一篇

SAP中字段前导“0”的处理