zoukankan      html  css  js  c++  java
  • 利用CS_BOM_EXPL_MAT_V2 展单BOM,根据排序字符串进行组件分配

     1 用CA02打开主机的工艺路线。

     2 点击组件分配,显示主机装配层物料组件分配的情况。

     3 先筛选项目没有分配物料,再按照排序字符串的工位进行筛选。

     4 根据排序字符串工位信息将物料对应分配至对应工位。如:组件的排序字符串是101,则该物料分配至101工位。

     5 按照排序字符串的信息,将物料新健分配。

    TABLES:MAST,STKO,STPO,MAKT,MARC,MARA,MAPL,PLKO.

    DATA: T_STB LIKE TABLE OF STPOX WITH HEADER LINE.
    DATA: T_STB_TEMP LIKE TABLE OF STPOX WITH HEADER LINE.
    DATA: G_MAT LIKE TABLE OF CSCMAT WITH HEADER LINE.
    DATA: BDCMESS LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
    DATA: BEGIN OF ISHOW OCCURS 0,
          MATNR LIKE MARC-MATNR,
          WERKS LIKE MARC-WERKS,
          MSG(200),
    END OF ISHOW.

    DATA: BEGIN OF LT_SORTF OCCURS 0,
        SORTF LIKE STPO-SORTF,
    END OF LT_SORTF.

    DATA: BEGIN OF GT_MAST OCCURS 0,
        MATNR LIKE MAST-MATNR,
        WERKS LIKE MAST-WERKS,
        STLAN LIKE MAST-STLAN,
        STLNR LIKE MAST-STLNR,
        STLAL LIKE MAST-STLAL,
    END OF GT_MAST.

    DATA: BEGIN OF GT_ROUTING OCCURS 0,
         MATNR LIKE MAPL-MATNR,
         WERKS LIKE MAPL-WERKS,
         PLNTY LIKE MAPL-PLNTY,
         PLNNR LIKE MAPL-PLNNR,
         PLNAL LIKE MAPL-PLNAL,
    END OF GT_ROUTING.

    DATA: BEGIN OF LT_MAST OCCURS 0,
        MATNR LIKE MAST-MATNR,
        WERKS LIKE MAST-WERKS,
        STLAN LIKE MAST-STLAN,
        STLNR LIKE MAST-STLNR,
        STLAL LIKE MAST-STLAL,
    END OF LT_MAST.

    DATA: BEGIN OF BDCDATA OCCURS 0.
        INCLUDE STRUCTURE BDCDATA.
    DATA: END OF BDCDATA.

    DATA: BEGIN OF MSG_WA,
        MSGID LIKE SY-MSGID,
        MSGNR LIKE SY-MSGNO,
        MSGV1 LIKE SY-MSGV1,
        MSGV2 LIKE SY-MSGV2,
        MSGV3 LIKE SY-MSGV3,
        MSGV4 LIKE SY-MSGV4,
    END OF MSG_WA.

    DATA : ERR(1).
    DATA : G_ROUTING TYPE I.
    DATA : G_BOM TYPE I.
    DATA : L_ENTRY_ACT(10) TYPE C.
    DATA : L_FVAL TYPE BDC_FVAL.
    DATA : POS TYPE I,N(2) TYPE N,INDEX TYPE N.
    DATA : L_VORNR TYPE VORNR,
           L_PLNFL TYPE PLNFOLGE.
    DATA : BDC_MODE(1), MSGTEXT(255).
    DATA : T_TABIX LIKE SY-TABIX, BK_MODE(1), MSG(255).

    *&---------------------------------------------------------------------*
    *&       屏幕显示
    *&---------------------------------------------------------------------*
    SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
      SELECT-OPTIONS : P_MATNR FOR MARC-MATNR NO INTERVALS OBLIGATORY.
      PARAMETERS : P_WERKS LIKE MARC-WERKS OBLIGATORY.
      PARAMETERS : P_MASK TYPE CHAR1 OBLIGATORY DEFAULT '-'. "分隔符
      PARAMETERS : P_STLAN LIKE MAST-STLAN OBLIGATORY DEFAULT '1'.
      PARAMETERS : P_STLAL LIKE MAST-STLAL OBLIGATORY DEFAULT '01'.
      PARAMETERS : P_MODE(1) OBLIGATORY DEFAULT 'A'.
    SELECTION-SCREEN END OF BLOCK B1.

    *&---------------------------------------------------------------------*
    *&       程序执行
    *&---------------------------------------------------------------------*
    START-OF-SELECTION.

      PERFORM CHECK_INPUT.
      PERFORM CALL_BDC.
      PERFORM SHOW.

    *&---------------------------------------------------------------------*
    *&      Form  check_input
    *&---------------------------------------------------------------------*
    FORM CHECK_INPUT .
      IF P_MATNR-LOW IS INITIAL OR P_WERKS IS INITIAL.
        MESSAGE '请输入物料和工厂数据!' TYPE 'E'.
        STOP.
      ENDIF.
    ENDFORM.                    " check_input

    *&---------------------------------------------------------------------*
    *&      Form  bom_explode
    *&---------------------------------------------------------------------*
    FORM BOM_EXPLODE USING TEMP_MATNR.
      CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
        EXPORTING
          CAPID                 = 'PP01'
          DATUV                 = SY-DATUM
          EMENG                 = '1'
          MKTLS                 = 'X'
          BREMS                 = 'X' "展开到虚拟件
          MEHRS                 = 'X' "多层展开,'X'表示是,''表示否
          MMORY                 = '1'
          MTNRV                 = TEMP_MATNR
          STLAL                 = P_STLAL
          STLAN                 = P_STLAN
          STPST                 = 0
          SVWVO                 = 'X'
          WERKS                 = P_WERKS
          VRSVO                 = 'X'
        TABLES
          STB                   = T_STB
          MATCAT                = G_MAT
        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
          CONVERSION_ERROR      = 8
          OTHERS                = 9.

    ENDFORM.                    "BOM_explode

    *&---------------------------------------------------------------------*
    *&      Form  call_bdc
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM CALL_BDC .

      LOOP AT P_MATNR.
    *  *检查BOM
        ERR = ''.
        CLEAR GT_MAST.
        REFRESH GT_MAST.
        SELECT MATNR WERKS STLAN STLNR STLAL
          INTO CORRESPONDING FIELDS OF TABLE GT_MAST
          FROM MAST
          WHERE MATNR = P_MATNR-LOW
            AND WERKS = P_WERKS
            AND STLAL = P_STLAL.

        SORT GT_MAST BY STLAL ASCENDING.
        DESCRIBE TABLE GT_MAST LINES G_BOM.
        IF G_BOM = 0.
          ISHOW-MATNR = P_MATNR-LOW.
          ISHOW-WERKS = P_WERKS.
          ISHOW-MSG = '无BOM'.
          APPEND ISHOW.
          CLEAR ISHOW.

          CONTINUE.
        ENDIF.

    *  检查工艺
        CLEAR GT_ROUTING.
        REFRESH GT_ROUTING.
        SELECT MATNR WERKS PLNTY PLNNR PLNAL
          INTO CORRESPONDING FIELDS OF TABLE GT_ROUTING
          FROM MAPL
          WHERE MATNR = P_MATNR-LOW
            AND WERKS = P_WERKS
            AND PLNAL = P_STLAL.
        SORT GT_ROUTING BY PLNAL ASCENDING.
        DESCRIBE TABLE  GT_ROUTING LINES G_ROUTING.
        IF G_ROUTING = 0.
          ISHOW-MATNR = P_MATNR-LOW.
          ISHOW-WERKS = P_WERKS.
          ISHOW-MSG = '无工艺'.
          APPEND ISHOW.
          CLEAR ISHOW.

          CONTINUE.
        ENDIF.

    *得到组件
    * 展开BOM
        CLEAR : T_STB,T_STB[].
        PERFORM BOM_EXPLODE USING P_MATNR-LOW.

    *执行
        READ TABLE GT_MAST INDEX 1.
        READ TABLE GT_ROUTING INDEX 1.

    *得到需要分配的字符串
        CLEAR LT_SORTF.
        REFRESH LT_SORTF.

    *  找父MATNR
       SORT T_STB BY IDNRK.
       T_STB_TEMP[] = T_STB[].
       SORT T_STB_TEMP BY IDNRK.

       LOOP AT T_STB WHERE SORTF <> ''.
          SEARCH T_STB-SORTF FOR P_MASK.
            IF SY-SUBRC = 0.
              LT_SORTF-SORTF = T_STB-SORTF.
              APPEND LT_SORTF.
              CLEAR LT_SORTF.
            ENDIF.
        ENDLOOP.

        SORT LT_SORTF.
        DELETE ADJACENT DUPLICATES FROM LT_SORTF.

        IF LT_SORTF[] IS INITIAL.
          ISHOW-MATNR = P_MATNR-LOW.
          ISHOW-WERKS = P_WERKS.
          ISHOW-MSG = '无更改'.
          APPEND ISHOW.
          CLEAR ISHOW.
        ELSE.
    *    BDC
          CLEAR BDCDATA.
          REFRESH BDCDATA.

          PERFORM BDC_DYNPRO      USING 'SAPLCPDI' '1010'.
          PERFORM BDC_FIELD       USING 'BDC_CURSOR'
                                        'RC27M-MATNR'.
          PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                        '=ALUE'.
          PERFORM BDC_FIELD       USING 'RC27M-MATNR'
                                        P_MATNR-LOW.
          PERFORM BDC_FIELD       USING 'RC27M-WERKS'
                                        P_WERKS.

    *    选择工艺路线1,2
          IF G_ROUTING > 1.
            L_ENTRY_ACT = 1.
          ELSE.
            READ TABLE GT_ROUTING WITH KEY PLNAL = P_STLAL.
            L_ENTRY_ACT = SY-TABIX.
          ENDIF.

          PERFORM BDC_DYNPRO      USING 'SAPLCPDI' '1200'.
          PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                        '/00'.
          PERFORM BDC_FIELD       USING 'RC27X-ENTRY_ACT'
                                        L_ENTRY_ACT.
    *    *点击工艺按钮
          PERFORM BDC_DYNPRO      USING 'SAPLCPDI' '1200'.
          PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                          '=MATA'.
    *    全部删除
          PERFORM BDC_DYNPRO      USING 'SAPLCMDI' '1000'.
          PERFORM BDC_FIELD       USING 'BDC_CURSOR'
                                        'RCM01-MATNR'.
          PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                        '=MARA'.

    *    将原有分配删除
          PERFORM BDC_DYNPRO      USING 'SAPLCMDI' '1000'.
          PERFORM BDC_FIELD       USING 'BDC_CURSOR'
                                        'RCM01-MATNR'.
          PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                        '=DEL'.
    *    确认删除
          PERFORM BDC_DYNPRO      USING 'SAPLSPO1' '0100'.
          PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                        '=YES'.

          PERFORM BDC_DYNPRO      USING 'SAPLCMDI' '1000'.
          PERFORM BDC_FIELD       USING 'BDC_CURSOR'
                                        'RCM01-MATNR'.
          PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                        '=FILT'.
          PERFORM BDC_DYNPRO      USING 'SAPLCM01' '1070'.
          PERFORM BDC_FIELD       USING 'BDC_CURSOR'
                                        'D1070-NOASS'.
          PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                        '=PICK'.
          PERFORM BDC_FIELD       USING 'D1070-NOASS'
                                        'X'.


    *    判断有组件没有分配
          LOOP AT LT_SORTF.
    *    查找
            PERFORM BDC_DYNPRO      USING 'SAPLCMDI' '1000'.
            PERFORM BDC_FIELD       USING 'BDC_CURSOR'
                                          'RCM01-MATNR'.
            PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                          '=FIND'.
            PERFORM BDC_DYNPRO      USING 'SAPLCM01' '1055'.
            PERFORM BDC_FIELD       USING 'BDC_CURSOR'
                                          'SEARCH_BY-SORTF'.
            PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                          '=GOON'.
            PERFORM BDC_FIELD       USING 'SEARCH_BY-SORTF'
                                          LT_SORTF-SORTF.
            PERFORM BDC_FIELD       USING 'FIRST_HIT'
                                          ''.
            PERFORM BDC_FIELD       USING 'SEARCH_BY-MARK_ALL'
                                          'X'.

    *    新建分配
            CLEAR : L_VORNR,L_PLNFL.

            SPLIT LT_SORTF-SORTF AT P_MASK INTO L_PLNFL L_VORNR.

            PERFORM BDC_DYNPRO      USING 'SAPLCMDI' '1000'.
            PERFORM BDC_FIELD       USING 'BDC_CURSOR'
                                          'RCM01-MATNR'.
            PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                          '=NEW'.
            PERFORM BDC_DYNPRO      USING 'SAPLCM01' '1090'.
            PERFORM BDC_FIELD       USING 'BDC_CURSOR'
                                          'RCM01-VORNR'.
            PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                          '=GOON'.
            PERFORM BDC_FIELD       USING 'RCM01-VORNR'
                                          L_VORNR.
            PERFORM BDC_FIELD       USING 'RCM01-PLNFL'
                                          L_PLNFL.
          ENDLOOP.

          PERFORM BDC_DYNPRO      USING 'SAPLCMDI' '1000'.
          PERFORM BDC_FIELD       USING 'BDC_CURSOR'
                                        'RCM01-MATNR'.
          PERFORM BDC_FIELD       USING 'BDC_OKCODE'
                                        '=BU'.

          BDC_MODE = P_MODE.

          CALL TRANSACTION 'CA02' USING BDCDATA
                                  UPDATE 'S' MODE  BDC_MODE
                                  MESSAGES INTO BDCMESS.
    *  bdc结束
          CLEAR: MSG.
          LOOP AT BDCMESS WHERE MSGTYP = 'E'
                             OR MSGTYP = 'A'
                             OR MSGTYP = 'S'.
            IF BDCMESS-MSGID = 'CV' AND BDCMESS-MSGNR = '761'.
              CONTINUE.
            ENDIF.

            CLEAR MSGTEXT.
            MOVE-CORRESPONDING BDCMESS TO MSG_WA.
            CALL FUNCTION 'TB_MESSAGE_BUILD_TEXT'
              EXPORTING
                LANGU = SY-LANGU
                MSGID = MSG_WA-MSGID
                MSGNO = MSG_WA-MSGNR
                MSGV1 = MSG_WA-MSGV1
                MSGV2 = MSG_WA-MSGV2
                MSGV3 = MSG_WA-MSGV3
                MSGV4 = MSG_WA-MSGV4
              IMPORTING
                TEXT  = MSGTEXT.
            CONCATENATE MSGTEXT '|' MSG INTO MSG.
            CLEAR: BDCMESS, MSG_WA.
          ENDLOOP.

          IF MSG <> ''.
            ISHOW-MATNR = P_MATNR-LOW.
            ISHOW-WERKS = P_WERKS.
            ISHOW-MSG = MSG.  "'组件分配存在问题,请使用 A前台模式'.
            APPEND ISHOW.
            CLEAR ISHOW.
          ELSE.
            ISHOW-MATNR = P_MATNR-LOW.
            ISHOW-WERKS = P_WERKS.
            ISHOW-MSG = '组件分配成功!'.
            APPEND ISHOW.
            CLEAR ISHOW.
          ENDIF.
        ENDIF.

      ENDLOOP.
    ENDFORM.                    " call_bdc
    *&---------------------------------------------------------------------*
    *&      Form  bdc_dynpro
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM BDC_DYNPRO USING PROGRAM DYNPRO.
      CLEAR BDCDATA.
      BDCDATA-PROGRAM = PROGRAM.
      BDCDATA-DYNPRO = DYNPRO.
      BDCDATA-DYNBEGIN = 'X'.
      APPEND BDCDATA.
    ENDFORM.                    "bdc_dynpro
    *&---------------------------------------------------------------------*
    *&      Form  bdc_dynpro
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    FORM BDC_FIELD USING FNAM FVAL.
      CLEAR BDCDATA.
      BDCDATA-FNAM = FNAM.
      BDCDATA-FVAL = FVAL.
      APPEND BDCDATA.
    ENDFORM.                    "bdc_field
    *&---------------------------------------------------------------------*
    *&      Form  SHOW
    *&---------------------------------------------------------------------*
    FORM SHOW .
      TYPE-POOLS SLIS.
      DATA: WS_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
            WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
            WS_LAYOUT          TYPE SLIS_LAYOUT_ALV,
            WS_SORTFIELDS_TAB  TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,
            WS_EVENTS          TYPE SLIS_T_EVENT.
      DATA: V_REPID LIKE SY-REPID.
      DATA: NN TYPE I VALUE 0.
      DATA: TITLE TYPE LVC_TITLE.

      SORT ISHOW BY MATNR.

      DEFINE HOUT.
        NN = NN + 1.
        WS_FIELDCAT-TABNAME   = 'ISHOW'.
        WS_FIELDCAT-FIELDNAME = '&1'.
        WS_FIELDCAT-SELTEXT_M =  &2.
        WS_FIELDCAT-COL_POS   =  NN.
        WS_FIELDCAT-OUTPUTLEN =  &3.
        WS_FIELDCAT-DATATYPE  = '&4'.
        WS_FIELDCAT-DO_SUM    = '&5'.
        WS_FIELDCAT-LZERO     = 'X'.
        APPEND WS_FIELDCAT.
        CLEAR WS_FIELDCAT.
      END-OF-DEFINITION.

      HOUT WERKS          '工厂'             6 CHAR ''.
      HOUT MATNR          '组件'            15 CHAR ''.
      HOUT MSG            '订单描述'        50 CHAR ''.

      TITLE = '物料组件分配结果'.
      WS_LAYOUT-ZEBRA             = 'X'.
      WS_LAYOUT-GET_SELINFOS      = ''.
      WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
      WS_LAYOUT-DETAIL_POPUP      = 'X'.
      WS_LAYOUT-NO_KEYFIX         = 'X'.


      V_REPID = SY-REPID.

      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
        EXPORTING
          I_CALLBACK_PROGRAM       = V_REPID
    *      i_callback_pf_status_set = 'MENU_SET'
    *      i_callback_user_command  = 'EXECUTE_COMMAND'
          IS_LAYOUT                = WS_LAYOUT
          IT_FIELDCAT              = WS_FIELDCAT[]
          IT_SPECIAL_GROUPS        = WS_FIELDGROUPS_TAB[]
          IT_SORT                  = WS_SORTFIELDS_TAB[]
          IT_EVENTS                = WS_EVENTS[]
          I_GRID_TITLE             = TITLE
        TABLES
          T_OUTTAB                 = ISHOW
        EXCEPTIONS
          PROGRAM_ERROR            = 1
          OTHERS                   = 2.

    ENDFORM.                    " SHOW

    展开BOM注意事项:

    说明:设置展BOM函数的参数

    CS_BOM_EXPL_MAT_V2  展BOM的参数,其中:

    工厂(WERKS)、BOM有效期(DATUV)、BOM类型(CAPID)、物料号(MTNRV)

    是必须填写的。

      另外: 

         展虚拟件(MDMPS)和 展多层(MEHRS) 是 互相影响的,直接决定BOM是否一展到底、是否继续展开虚拟件至其下一层。

    1)  虚拟件 MDMPS  -

            多层     MEHRS   X

        结果: 全展(显示包含虚拟件)

    2)虚拟件 MDMPS   X

         多层     MEHRS    X

        结果: 展1或2层(下层遇虚拟件则展开至其下一层,显示包含虚拟件)

    3) 虚拟件 MDMPS  -

           多层     MEHRS   -

        结果: 展一层(下层为虚拟件,不再向下展开)

    4) 虚拟件 MDMPS  X

           多层     MEHRS   -

          结果:展一层 (同3,下层为虚拟件,不再向下展开)

         即:MEHRS置空,不论MDMPS如何设置,都只展一层,并且如果下层就是虚拟件,不展开虚拟件至其更下一层,与2)要区别开来。

    转自:http://blog.csdn.net/reacleliu/article/details/6614561

  • 相关阅读:
    template.js简单入门
    Tortoisegit和GitHub使用入门
    自定义Http请求头并且获取
    Dapper基础入门
    StackExchange.Redis在net中使用
    领域驱动设计(DDD)
    Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM) AspectJ
    重构流程
    性能优化方法论举例(***)
    线上紧急问题,如宕机、卡顿、bug等,如何快速反应和解决,具体解决方案
  • 原文地址:https://www.cnblogs.com/cnlmjer/p/4099820.html
Copyright © 2011-2022 走看看