SAP PP BOM主数据查询接口分享

一、接口逻辑

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

二、接口代码

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

FUNCTION z_fmpp_010.
*”———————————————————————-
*”*”本地接口:
*”  IMPORTING
*”     VALUE(I_DATA_GD) TYPE  ZSBC_IF_GD
*”     VALUE(I_INPUT) TYPE  STRING
*”  EXPORTING
*”     VALUE(E_OUTPUT) TYPE  STRING
*”———————————————————————-
  DATA: lt_stb    TYPE TABLE OF stpox WITH HEADER LINE,
        lw_topmat TYPE cstmat.

  DATA:
    ls_input  TYPE zspp_010_in,
    ls_output TYPE zspp_010_out,
    lt_retrun TYPE zstpp_010,
    lw_msg    TYPE zsbc_msg.

  DATA: ls_log TYPE ztbc_log_table.
  DATA: flg_typ    TYPE c,
        return_msg TYPE bapi_msg.

  RANGES:r_matnr FOR mast-matnr,
*         r_stlan FOR mast-stlan,
         r_stlal FOR mast-stlal.
  DATA: lw_bom_head TYPE zspp_010_head,
        lt_bom_item TYPE zstpp_010_bom,
        lw_bom_item LIKE LINE OF lt_bom_item,
        lt_return   TYPE zstpp_010,
        lw_retrun   LIKE LINE OF lt_return.
  DATA: r_stlan TYPE RANGE OF mast-stlan .

  CALL FUNCTION 'ZFM_BREAK_POINT'  .

  MOVE-CORRESPONDING i_data_gd TO ls_log.
  ls_log-btype = 'PP0007'.
  flg_typ = 'S'.
  BREAK guoxiongjie .
  CLEAR:ls_input,ls_output,lt_retrun[] .

  CALL FUNCTION 'Z_FMBC_JSONTOABAP'
    EXPORTING
      i_json = i_input
    IMPORTING
      e_data = ls_input.

  DEFINE marco_check_input.
    IF ls_input-&1 IS INITIAL.
      flg_typ = 'E' .
      return_msg = return_msg && &2 && '为空;'.
   ENDIF.
  END-OF-DEFINITION.

  IF i_data_gd-guid IS INITIAL OR i_data_gd IS INITIAL OR i_input IS INITIAL.
    flg_typ = 'E' .
    return_msg = '入参输入不完整;' .
  ENDIF.

  marco_check_input:  zcxrq '查询日期',
                      werks '工厂代码',
                      matnr '物料' .

  IF flg_typ = 'S'.
    ls_input-matnr = |{ ls_input-matnr ALPHA = IN WIDTH = 18 }|.

    IF ls_input-stlan IS NOT INITIAL.
      r_stlan = VALUE #( ( SIGN = 'I' option = 'EQ' low = ls_input-stlan ) ) .
    ENDIF.

    SELECT
      marc~matnr ,
      mast~werks ,
      CAST( @space AS CHAR( 1 ) ) AS done,
      mast~stlan,
      mast~stlnr,
*    mast~stlal,
*    mara~meins,
*    marc~beskz,
*    marc~sobsl,
*    mara~matkl,
*    mast~andat AS datuv
      stko~bmeng,
      stko~datuv
*    INTO TABLE @DATA(lt_mat)
          FROM mara INNER JOIN marc ON mara~matnr = marc~matnr
                    INNER JOIN mast ON marc~matnr = mast~matnr AND marc~werks = mast~werks
                    INNER JOIN stko ON mast~stlnr = stko~stlnr AND mast~stlal = stko~stlal
          WHERE marc~werks = @ls_input-werks
            AND marc~matnr = @ls_input-matnr
            AND mara~lvorm = ' '
            AND marc~lvorm = ' '
            AND mast~stlan IN @r_stlan
            AND mast~stlal = '01'
      INTO TABLE @DATA(lt_mast).

*    SELECT SINGLE MIN( a~stlan ) FROM @lt_mast AS a  INTO @DATA(lv_stlan) .

    LOOP AT lt_mast INTO DATA(lw_mast) .”WHERE stlan = lv_stlan.

      CALL FUNCTION 'ZCS_BOM_EXPL_MAT_V2'
        EXPORTING
*         aufsw  = ' '
          capid  = 'PP01'
          datuv  = lw_mast-datuv
          ehndl  = '1'
          emeng  = lw_mast-bmeng
          mtnrv  = lw_mast-matnr
          mehrs  = 'X'   “多层
          stlan  = lw_mast-stlan  ” BOM用途
          stlal  = '01'  “备选物料清单
          werks  = lw_mast-werks
        IMPORTING
          topmat = lw_topmat
*         dstst  = lv_dstst
        TABLES
          stb    = lt_stb.

      LOOP AT lt_stb.
        lt_retrun = VALUE #( BASE lt_retrun (
                            werks = lw_topmat-werks
                            matnr = |{ lw_topmat-matnr ALPHA = OUT }|
                            stlan = lw_topmat-stlan
                            bmeng = lw_topmat-bmeng
                            bmein = lw_topmat-bmein
                            stufe = lt_stb-stufe
                            posnr = lt_stb-posnr
                            idnrk = |{ lt_stb-idnrk ALPHA = OUT }|
                            menge = lt_stb-menge
                            meins = lt_stb-meins
                            ausch = lt_stb-ausch
*                            alpgr = lt_stb-aplgr
*                            alprf = lt_stb-aplrf
*                            alpst = lt_stb-alpst
                             ) ) .

      ENDLOOP.

    ENDLOOP.

    ls_output-retrun = lt_retrun .

    CALL FUNCTION 'Z_FMBC_ABAPTOJSON'
      EXPORTING
        i_data = ls_output
      IMPORTING
        e_json = e_output.

  ENDIF.

*  IF flg_typ = 'S'.
*    IF NOT ls_input-matnr IS INITIAL.
*      DATA(lv_matnr) = |{ ls_input-matnr ALPHA = IN WIDTH = 18 }|.
*      INSERT VALUE #( sign = 'I' option = 'EQ' low = lv_matnr ) INTO TABLE r_matnr.
*    ENDIF.
*    IF NOT ls_input-stlan IS INITIAL.
*      INSERT VALUE #( sign = 'I' option = 'EQ' low = ls_input-stlan ) INTO TABLE r_stlan.
*    ENDIF.
*    IF NOT ls_input-stlal IS INITIAL.
*      INSERT VALUE #( sign = 'I' option = 'EQ' low = ls_input-stlal ) INTO TABLE r_stlal.
*    ENDIF.
*
*    SELECT
*        mast~werks,
*        mast~matnr,
*        mast~stlan,
*        mast~stlnr,
*        stko~stlal,
*        stko~bmeng,
*        stko~bmein,
*        stko~datuv,
*        stko~stlst,
*        stpo~posnr,
*        stpo~idnrk,
*        stpo~menge,
*        stpo~meins,
*        stpo~ausch,
*        stpo~alpgr,
*        stpo~alprf,
*        stpo~alpst
*      INTO TABLE @DATA(lt_bom)
*      FROM mast INNER JOIN stko ON mast~stlnr = stko~stlnr AND mast~stlal = stko~stlal
*                INNER JOIN stpo ON stko~stlnr = stpo~stlnr AND stko~stlty = stpo~stlty
*      WHERE ( stko~andat = @ls_input-zcxrq OR stko~aedat = @ls_input-zcxrq
*           OR stpo~andat = @ls_input-zcxrq OR stpo~aedat = @ls_input-zcxrq )
*        AND mast~werks = @ls_input-werks
*        AND mast~matnr IN @r_matnr
*        AND mast~stlan IN @r_stlan AND mast~stlal IN @r_stlal .
*
*    SORT lt_bom .
*    DELETE ADJACENT DUPLICATES FROM lt_bom .
*
*    IF lt_bom[] IS INITIAL.
*      return_msg = '查询无数据!' .
*    ELSE.
*      return_msg = '查询OK' .
*      CLEAR:ls_output,lw_retrun,lt_return .
*
*      SORT lt_bom ASCENDING BY matnr posnr .
*      LOOP AT lt_bom INTO DATA(lw_bom).
*        AT END OF stlst .
*          DATA(flg_end) = 'X' .
*        ENDAT .
*
*        MOVE-CORRESPONDING lw_bom TO lw_bom_item .
*        lw_bom_item-idnrk = |{ lw_bom_item-idnrk ALPHA = OUT }|.
*        APPEND lw_bom_item TO lt_bom_item .
*
*        IF flg_end = 'X'.
*          SORT lt_bom_item ASCENDING BY posnr .
*
*          MOVE-CORRESPONDING lw_bom TO lw_bom_head .
*          lw_bom_head-matnr = |{ lw_bom_head-matnr ALPHA = OUT }|.
*
*          lw_retrun-head = lw_bom_head .
*          lw_retrun-item = lt_bom_item .
*          APPEND lw_retrun TO lt_return .
*
*          CLEAR: flg_end,lw_bom_item,lt_bom_item,lw_bom_head ,lw_retrun.
*        ENDIF.
*
*      ENDLOOP.
*    ENDIF.
*  ENDIF.
*  lw_msg = VALUE #( type = flg_typ id = '00' number = '001' message = return_msg ) .
*
*
*  ls_log-status    = '@0A@'.
*  IF flg_typ = 'S'.
*    ls_log-status    = '@08@'.
*  ENDIF.
*  ls_log-message = return_msg .
*  ls_output-zs_outmsg = lw_msg .
*  ls_output-retrun = lt_return .
*  CALL FUNCTION 'Z_FMBC_ABAPTOJSON'
*    EXPORTING
*      i_data = ls_output
*    IMPORTING
*      e_json = e_output.

*  ls_log-direction = 'INBOUND'.
*  ls_log-reqdat    = i_input.  “传入参数
*  ls_log-resdat    = e_output .      “返回参数
*
*  MODIFY ztbc_log_table FROM ls_log .
*  IF sy-subrc = 0.
*    COMMIT WORK AND WAIT.
*  ELSE.
*    ROLLBACK WORK.
*  ENDIF.

*  “写入查询日志
*  DATA:lt_015    TYPE TABLE OF ztpp015 WITH HEADER LINE,
*       lv_serial TYPE zde_serial.
*
*  LOOP AT lt_return INTO DATA(lw_return).
*    ADD 1 TO lv_serial .
*    lt_015-zcxrq = ls_input-zcxrq .
*    lt_015-datum = sy-datum .
*    lt_015-uzeit = sy-uzeit .
*    lt_015-serial = lv_serial .
*    lt_015-type = flg_typ .
*    lt_015-message = return_msg .
*    DATA(lw_head) = lw_return-head  .
*    MOVE-CORRESPONDING lw_head TO lt_015 .
*    APPEND lt_015 .
*  ENDLOOP.
*  MODIFY ztpp015 FROM TABLE lt_015 .
*  IF sy-subrc = 0.
*    COMMIT WORK AND WAIT.
*  ELSE.
*    ROLLBACK WORK.
*  ENDIF.

ENDFUNCTION.

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

SAP PP BOM主数据查询接口分享

FUNCTION zcs_bom_expl_mat_v2.
*”———————————————————————-
*”*”本地接口:
*”  IMPORTING
*”     REFERENCE(CAPID) TYPE  TC04-CAPID
*”     REFERENCE(DATUV) TYPE  STKO-DATUV
*”     REFERENCE(EHNDL) TYPE  CSDATA-XFELD
*”     REFERENCE(EMENG) TYPE  STKO-BMENG
*”     REFERENCE(MTNRV) TYPE  MARA-MATNR
*”     REFERENCE(MEHRS) TYPE  CSDATA-XFELD
*”     REFERENCE(STLAN) TYPE  STZU-STLAN
*”     REFERENCE(STLAL) TYPE  STKO-STLAL
*”     REFERENCE(WERKS) TYPE  MARC-WERKS
*”     REFERENCE(I_STLAN) TYPE  STLAN OPTIONAL
*”  EXPORTING
*”     REFERENCE(TOPMAT) LIKE  CSTMAT STRUCTURE  CSTMAT
*”  TABLES
*”      STB STRUCTURE  STPOX
*”———————————————————————-
  DATA: lt_stb    TYPE TABLE OF stpox WITH HEADER LINE,
        lw_topmat TYPE cstmat.

  TYPES:BEGIN OF ty_bom ,
    SORT TYPE  char200.
    INCLUDE STRUCTURE stpox  .
  TYPES:END OF ty_bom .

*  DATA:BEGIN OF lt_bom OCCURS 0,
*         sort TYPE  char200.
*         INCLUDE STRUCTURE stpox  .
*  DATA:END OF lt_bom ,
*  lt_bom_tmp LIKE TABLE OF lt_bom WITH HEADER LINE.
  DATA:  lt_bom TYPE TABLE OF ty_bom.
  DATA:  lw_bom TYPE  ty_bom.
  DATA:  lt_bom_tmp TYPE TABLE OF ty_bom .
  DATA:  lw_bom_tmp TYPE ty_bom .

  TYPES:BEGIN OF ty_tab,
    SORT  TYPE  char200,
    idnrk TYPE idnrk,
    stufe TYPE numc2,
    wegxx TYPE numc3,
    stlan TYPE stlan,
    stlal TYPE stlal,
    flag  TYPE C,
  END OF ty_tab .
  DATA:lt_tab TYPE TABLE OF ty_tab .
  DATA:lw_tab TYPE ty_tab .

  DATA:lv_index TYPE I,
        lv_sort  TYPE numc5,
        lv_stufe TYPE numc2,
        lv_wegxx TYPE numc3.

*  BREAK guoxiongjie .

  CLEAR: topmat,lw_topmat,stb[],lt_stb[] .
  DATA:lv_stlan_tmp TYPE stlan .
  DATA(lv_matnr) = |{ mtnrv ALPHA = OUT }|.
  lw_tab = VALUE #( SORT = lv_matnr idnrk = mtnrv stlan = stlan stufe = 0 flag = '' ).
*  BREAK guoxiongjie .

  “最上阶物料的BOM用途为3,字段ZTMM_MARA-ZZBBH 以A0/B0/C0等以0为结尾的值优先取1, ≠ A0/B0/C0 等以0为结尾的值优先取2.
  CLEAR lv_stlan_tmp .
  IF stlan = 3 .
    SELECT stlan INTO TABLE @DATA(lt_tmp) FROM mast WHERE matnr = @mtnrv AND stlan IN ('1', '2').
    SELECT SINGLE zzbbh INTO @DATA(lv_zzbbh) FROM ztmm_mara WHERE matnr = @mtnrv .
    IF sy-subrc EQ 0 AND lv_zzbbh IS NOT INITIAL.
      IF lv_zzbbh+1(1) = '0' .
        READ TABLE lt_tmp INTO DATA(lw_tmp) WITH KEY stlan = '1' .
        IF sy-subrc EQ 0.
          lv_stlan_tmp = '1' .
        ENDIF.
      ELSE.
        READ TABLE lt_tmp INTO lw_tmp WITH KEY stlan = '2' .
        IF sy-subrc EQ 0.
          lv_stlan_tmp = '2' .
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.

  APPEND lw_tab TO lt_tab .

  DATA lv_stlal TYPE stko-stlal  .
  lv_stlal = stlal .
  DATA(lv_bmeng) = emeng .

  DATA lop_num TYPE I .
  lop_num = 0 .

  LOOP AT lt_tab ASSIGNING FIELD-SYMBOL(<sy_tab>) WHERE flag = ''.
    ADD 1 TO lop_num .
    IF lop_num > 1000.
      RETURN .
    ENDIF.

    ADD 1 TO lv_index .
    <sy_tab>-flag = 'X' .
    IF lv_stlal IS INITIAL.
      lv_stlal = <sy_tab>-stlal .
    ENDIF.

    SELECT SINGLE bmeng FROM mast INNER JOIN stko ON mast~stlnr = stko~stlnr AND mast~stlal = stko~stlal
    WHERE matnr = @<sy_tab>-idnrk AND werks = @werks AND stlan = @<sy_tab>-stlan
    AND datuv LE @sy-datum AND valid_to GE @sy-datum
    INTO @lv_bmeng .

    CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
    EXPORTING
*       aufsw                 = ' '
      capid                 = capid
      datuv                 = sy-datum “datuv
      ehndl                 = ehndl
      emeng                 = lv_bmeng “emeng
      mtnrv                 = <sy_tab>-idnrk ” mtnrv
      mehrs                 = '' “mehrs   “多层
      mmory                 = '1'
      stlan                 = <sy_tab>-stlan “stlan  ” BOM用途
      stlal                 = lv_stlal “stlal  “备选物料清单
      werks                 = werks
      aumgb                 = 'X'
    IMPORTING
      topmat                = lw_topmat
*       dstst                 = lv_dstst
    TABLES
      stb                   = lt_stb
*       matcat                = matcat
    EXCEPTIONS
      material_not_found    = 4
      no_plant_data         = 8
      no_bom_found          = 12
      no_suitable_bom_found = 16
      alt_not_found         = 24
      missing_authorization = 28
      conversion_error      = 36.

    CLEAR lv_stlal .
    IF sy-subrc EQ 0.
      IF topmat IS INITIAL.
        topmat = lw_topmat .
      ENDIF.

      CLEAR lv_sort .
      LOOP AT lt_stb .
        lt_stb-stufe = lt_stb-stufe + <sy_tab>-stufe .
        MOVE-CORRESPONDING lt_stb TO lw_bom .
        lv_matnr = |{ lt_stb-idnrk  ALPHA = OUT }|.
        lv_wegxx = lt_stb-wegxx .
        lv_stufe = lt_stb-stufe .
*        ADD 1 TO lv_stufe .
*        CONCATENATE <sy_tab>-sort lv_stufe lv_wegxx  lv_matnr INTO lw_bom-sort .
        ADD 1 TO lv_sort .
        CONCATENATE <sy_tab>-SORT lv_sort INTO lw_bom-SORT .
        lw_bom-CLASS = lv_bmeng .
        APPEND lw_bom TO lt_bom .
        IF mehrs = 'X'.
          MOVE-CORRESPONDING lw_bom TO lw_bom_tmp .
          APPEND lw_bom_tmp TO lt_bom_tmp .
        ENDIF.
      ENDLOOP.

      “查找BOM用途是否存在
      SELECT a~matnr, a~werks, a~stlan,a~stlal
      FROM mast AS a INNER JOIN stko AS s ON s~stlnr = a~stlnr AND s~stlal = a~stlal AND lkenz = ''
      INNER JOIN @lt_bom_tmp AS b ON a~matnr = b~idnrk AND a~werks = b~werks
      WHERE  s~datuv LE @sy-datum AND s~valid_to GE @sy-datum
*        AND  a~stlan in ( @<sy_tab>-stlan , '3' )
*        AND a~stlal = @stlal
      INTO TABLE @DATA(lt_stlan)  .

      LOOP AT lt_bom_tmp INTO lw_bom_tmp  .
        MOVE-CORRESPONDING lw_bom_tmp TO lw_tab .

        READ TABLE lt_stlan WITH KEY matnr = lw_bom_tmp-idnrk werks = lw_bom_tmp-werks TRANSPORTING NO FIELDS.
        IF sy-subrc EQ 0. “存在BOM才继续往下展

          READ TABLE lt_stlan WITH KEY matnr = lw_bom_tmp-idnrk werks = lw_bom_tmp-werks stlan = lv_stlan_tmp TRANSPORTING NO FIELDS.
          IF sy-subrc EQ 0 AND lv_stlan_tmp IS NOT INITIAL. “父阶BOM用途为3, 且考虑版本号的情况
            lw_tab-stlan = lv_stlan_tmp .
            APPEND lw_tab TO lt_tab .
          ELSE. “父阶BOM用途1/2
*            SORT lt_stlan BY stlan ASCENDING .
*            lw_tab-stlan = lt_stlan[ 1 ]-stlan.
            IF i_stlan IS NOT INITIAL.
              READ TABLE lt_stlan INTO DATA(lw_stlan)
                    WITH KEY matnr = lw_bom_tmp-idnrk werks = lw_bom_tmp-werks stlan = i_stlan.
              IF sy-subrc EQ 0.
                lv_stlan_tmp = i_stlan .
              ENDIF.
            ENDIF.
            IF lv_stlan_tmp IS INITIAL.
              READ TABLE lt_stlan WITH KEY matnr = lw_bom_tmp-idnrk werks = lw_bom_tmp-werks stlan = stlan TRANSPORTING NO FIELDS .
              IF sy-subrc EQ 0.
                lv_stlan_tmp = stlan .
              ELSE.
                SELECT MIN( a~stlan ) FROM @lt_stlan AS a WHERE matnr = @lw_bom_tmp-idnrk AND werks = @lw_bom_tmp-werks
                INTO @lv_stlan_tmp .
                IF lv_stlan_tmp NE '3'.
                  CLEAR lv_stlan_tmp .
                  SELECT MIN( a~stlan ) FROM @lt_stlan AS a WHERE matnr = @lw_bom_tmp-idnrk AND werks = @lw_bom_tmp-werks AND stlan = '3'
                  INTO @lv_stlan_tmp .
                  IF sy-subrc <> 0.
                    CONTINUE .
                  ENDIF.
                ENDIF.
              ENDIF.
            ENDIF.
            SELECT SINGLE a~stlal FROM @lt_stlan AS a WHERE matnr = @lw_bom_tmp-idnrk AND werks = @lw_bom_tmp-werks AND stlan = @lv_stlan_tmp
            INTO @lw_tab-stlal .
            lw_tab-stlan = lv_stlan_tmp  .
            APPEND lw_tab TO lt_tab .
*            READ TABLE lt_stlan WITH KEY matnr = lw_bom_tmp-idnrk werks = lw_bom_tmp-werks stlan = stlan TRANSPORTING NO FIELDS.
*            IF sy-subrc NE 0 .”不存在选中BOM用途,则读取用途为3的BOM
*              IF stlan = '3'.
*                lw_tab-stlan = '1' .
*              ELSE.
*                READ TABLE lt_stlan WITH KEY matnr = lw_bom_tmp-idnrk werks = lw_bom_tmp-werks stlan = '3' TRANSPORTING NO FIELDS.
*                IF sy-subrc EQ 0.
*                  lw_tab-stlan = '3' .
*                ENDIF.
*              ENDIF.
*              APPEND lw_tab TO lt_tab .
*            ELSE. “不是父阶物料时, 继续向下面展
*              IF lv_index > 1.
*                lw_tab-stlan = stlan .
*                APPEND lw_tab TO lt_tab .
*              ENDIF.
*            ENDIF.
          ENDIF.
        ENDIF.
        CLEAR:lv_stlan_tmp.
      ENDLOOP.

      CLEAR: lt_bom_tmp[] .

    ENDIF.

  ENDLOOP.
  SORT lt_bom[] ASCENDING BY SORT .”stufe.

  MOVE-CORRESPONDING lt_bom[] TO stb[] .
ENDFUNCTION.

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...