SAP批量查询组件BOM引用报表

背景

SAP标准查询BOM引用程序是CS15,输入条件麻烦,且一次只能查询一个料,对公司日常操作不太友好,且电子行业替代料特别多,业务部门希望查到BOM引用的同时,带出其替代料,下面的程序为实现源码,主要用到了CS_WHERE_USED_MAT函数抓取BOM引用,这个函数只能抓上阶,如果想抓顶阶的话需要再封装一下,第二个函数为封装好的顶阶抓取方式。

界面

在这里插入图片描述
在这里插入图片描述

主程序

*&---------------------------------------------------------------------*
*& Report ZPPR503 批量BOM反查
*&---------------------------------------------------------------------*
*& add by john 220221.
*&---------------------------------------------------------------------*
REPORT zppr503 NO STANDARD PAGE HEADING..

TYPE-POOLS: slis.
TABLES: marc, makt.
DATA: stb                 LIKE stpox OCCURS 0 WITH HEADER LINE,
      wa_alv_field        TYPE slis_fieldcat_alv, "列描述内表,列清单
      wa_alv_fieldcat     TYPE slis_t_fieldcat_alv, "定义内表
      layout              TYPE slis_layout_alv,
      gs_layout           TYPE slis_layout_alv,
      gt_list_top_of_page TYPE slis_t_listheader,
      counter             TYPE i VALUE 0,
      g_repid             LIKE sy-repid,
      g_user_command      TYPE slis_formname VALUE 'USER_COMMAND'.
DATA: BEGIN OF my_data,
        matnr     LIKE marc-matnr, "子零件编码
        maktx(80) TYPE c, "子零件描述
        werks     LIKE marc-werks,
        idnrk     LIKE mara-matnr, "子零件编码
        maktr(80) TYPE c, "子零件描述

        POSNR   LIKE stpox-POSNR, "BOM行号
        MENGE LIKE stpox-MENGE, "数量
        ALPRF LIKE stpox-ALPRF,  "优先级
        ALPGR LIKE stpox-ALPGR,  "替代组
        ALPST LIKE stpox-ALPST,  "策略
        POTX1 LIKE stpox-POTX1,  "行文本
        STLAN LIKE stpox-STLAN,  "物料清单类别
        STLAL LIKE  stpox-STLAL,  "BOM备选清单
        EWAHR LIKE  stpox-EWAHR,  "BOM备选清单
        labst LIKE mard-labst,    "库存
        sel       TYPE c,
      END OF my_data.
DATA: it_data LIKE my_data OCCURS 0.
DATA: BEGIN OF dllh_data,
        matnr LIKE marc-matnr, "物料编码
        werks LIKE marc-werks, "物料编码
        maktx LIKE makt-maktx,
        bmeng TYPE i, "BOM中的基本数量
      END OF dllh_data.
DATA: tdllh_data LIKE dllh_data OCCURS 0.
DATA: BEGIN OF usedtab OCCURS 100.
        INCLUDE STRUCTURE stpov.
DATA: END OF usedtab.
DATA: BEGIN OF equicat OCCURS 100.
        INCLUDE STRUCTURE cscequi.
DATA: END OF equicat.
DATA: BEGIN OF kndcat OCCURS 100.
        INCLUDE STRUCTURE cscknd.
DATA: END OF kndcat.
DATA: BEGIN OF matcat OCCURS 100.
        INCLUDE STRUCTURE cscmat.
DATA: END OF matcat.
DATA: BEGIN OF stdcat OCCURS 100.
        INCLUDE STRUCTURE cscstd.
DATA: END OF stdcat.
DATA: BEGIN OF tplcat OCCURS 100.
        INCLUDE STRUCTURE csctpl.
DATA: END OF tplcat.

DATA:gt_fieldcat TYPE STANDARD TABLE OF lvc_s_fcat.
DATA:gs_fieldcat LIKE LINE OF gt_fieldcat.

    DATA: BEGIN OF ls_mard,
            matnr LIKE mard-matnr,
            werks LIKE mard-werks,
            labst LIKE mard-labst,
          END OF ls_mard.
    DATA: lt_mard LIKE TABLE OF ls_mard.
    DATA: ls_mard_sum LIKE ls_mard,
          lt_mard_sum LIKE TABLE OF ls_mard.

DATA: gt_ZPPFU503 TYPE STANDARD TABLE OF zppfu503 INITIAL SIZE 10 WITH HEADER LINE.
DATA: BEGIN OF wlxx_data,
        matnr     LIKE mara-matnr, "物料编码
        normt     LIKE mara-normt, "延伸机种,即机型
        maktx(80) TYPE c, "物料描述
        groes     LIKE mara-groes, "描述补充
      END OF wlxx_data.
DATA: twlxx_data LIKE wlxx_data OCCURS 0.
DATA: it_stpox LIKE stpox OCCURS 0 WITH HEADER LINE.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME.
  SELECT-OPTIONS: s_matnr FOR marc-matnr, " OBLIGATORY, "物料编码
                    s_werks FOR marc-werks OBLIGATORY,
                    s_maktx FOR makt-maktx, "物料描述
  bdate FOR sy-datum DEFAULT sy-datum TO sy-datum NO-EXTENSION OBLIGATORY.
  SELECTION-SCREEN SKIP 1.
  PARAMETERS:rb_non RADIOBUTTON GROUP rg1, " 显示没有 BOM用到的物料
             rb_haf RADIOBUTTON GROUP rg1, " 展 开 BOM 的 上一层显示相应的成品(半成品)
             rb_hab RADIOBUTTON GROUP rg1 DEFAULT 'X',
             rb_tt RADIOBUTTON GROUP rg1.
SELECTION-SCREEN END OF BLOCK blk1.

INITIALIZATION.
  g_repid = sy-repid.

START-OF-SELECTION.
  SELECT t1~matnr,t1~werks,t2~maktx
  INTO TABLE @tdllh_data "取得物料编码内表
  FROM marc AS t1
  INNER JOIN makt AS t2 ON t1~matnr = t2~matnr AND t2~spras = @sy-langu
  WHERE t1~matnr IN @s_matnr  AND t1~werks IN @s_werks AND t2~maktx IN @s_maktx  .
  SORT tdllh_data BY matnr werks.
  CLEAR: dllh_data.

  LOOP AT tdllh_data INTO dllh_data. "循环每个物料号
    CLEAR: usedtab.


    IF rb_hab = 'X'. "取顶阶

      FREE gt_zppfu503.
      CALL FUNCTION 'ZPPFU503'
        EXPORTING
          i_matnr    = dllh_data-matnr
          i_werks    = dllh_data-werks
        TABLES
          o_zppfu503 = gt_zppfu503.


      LOOP AT gt_zppfu503.
        my_data-matnr = dllh_data-matnr. "物料编码
        my_data-maktx = dllh_data-maktx. "物料编码
        my_data-werks = dllh_data-werks. "工厂
        my_data-idnrk = gt_zppfu503-matnr. "物料编码
        my_data-maktr = gt_zppfu503-ojtxb. "物料编码
        APPEND my_data TO it_data.
      ENDLOOP.



    ELSE.

      CALL FUNCTION 'CS_WHERE_USED_MAT'
        EXPORTING
          datub                      = bdate-high
          datuv                      = bdate-low
          matnr                      = dllh_data-matnr
          werks                      = dllh_data-werks
        TABLES
          wultb                      = usedtab
          equicat                    = equicat
          kndcat                     = kndcat
          matcat                     = matcat
          stdcat                     = stdcat
          tplcat                     = tplcat
        EXCEPTIONS
          call_invalid               = 1
          material_not_found         = 2
          no_where_used_rec_found    = 3
          no_where_used_rec_selected = 4
          no_where_used_rec_valid    = 5
          OTHERS                     = 6.
      IF rb_non = 'X'. "如果选择了展开BOM的上一层显示相应的成品(半成品)
        IF usedtab IS INITIAL.
          my_data-matnr = dllh_data-matnr. "物料编码
          my_data-maktx = dllh_data-maktx. "物料编码
          my_data-werks = dllh_data-werks. "物料编码
          APPEND my_data TO it_data.
        ENDIF.


      ELSEIF rb_haf = 'X'.   "上阶
        IF usedtab IS NOT INITIAL.
          LOOP AT usedtab. "循环内表USEDTAB把相应的成品号追加到IT_DATA
            my_data-matnr = dllh_data-matnr. "物料编码
            my_data-maktx = dllh_data-maktx. "物料编码
            my_data-werks = dllh_data-werks. "物料编码
            my_data-idnrk = usedtab-matnr. "物料编码
            my_data-maktr = usedtab-ojtxb. "物料编码
             my_data-POSNR = usedtab-POSNR. "BOM行号
              my_data-MENGE = usedtab-MENGE / usedtab-BMENG. "数量
              my_data-ALPRF = usedtab-ALPRF.  "优先级
              my_data-ALPGR = usedtab-ALPGR.  "替代组
              my_data-ALPST = usedtab-ALPST.  "策略
              my_data-POTX1 = usedtab-POTX1.  "行文本
              my_data-STLAN = usedtab-STLAN.  "物料清单类别
              my_data-STLAL = usedtab-STLST.  "BOM备选清单
              my_data-EWAHR = usedtab-EWAHR.  "BOM备选清单
            APPEND my_data TO it_data.

          ENDLOOP.

        ENDIF.


        ELSEIF rb_tt = 'X'.

          LOOP AT usedtab. "循环内表USEDTAB把相应的成品号追加到IT_DATA
            "  APPEND my_data TO it_data.

            "如果是有替代组的,带出替代组
            IF usedtab-alpgr IS NOT INITIAL.
              FREE it_stpox[].
              CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
                EXPORTING
                  capid                 = 'PP01'  "设置为PP01
                  mdmps                 = ''
                  mehrs                 = ''  "要设置‘X’才会展开虚拟阶
                  emeng                 = 100000
                  datuv                 = sy-datum
                  mtnrv                 = usedtab-matnr
                  werks                 = usedtab-werks
                  "stlal                 = ls_data-stlal
                  stlan                 = usedtab-stlan "这个栏位决定了第一次展BOM的类型,如果是2,则先展E-BOM,之后再按照PP01的方式有P展P。
                TABLES
                  stb                   = it_stpox
                  matcat                = matcat
                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.

                IF it_stpox[] IS NOT INITIAL.

                  LOOP AT it_stpox INTO DATA(ls_stpox) WHERE alpgr =  usedtab-alpgr.
                      my_data-matnr = ls_stpox-IDNRK. "物料编码
                      my_data-maktx = ls_stpox-OJTXP. "物料编码
                      my_data-werks = ls_stpox-werks. "物料编码
                      my_data-idnrk = usedtab-matnr. "物料编码
                      my_data-maktr = usedtab-ojtxb. "物料编码
                      my_data-POSNR = ls_stpox-POSNR. "BOM行号
                      my_data-MENGE = ls_stpox-MNGKO / 100000. "数量
                      my_data-ALPRF = ls_stpox-ALPRF.  "优先级
                      my_data-ALPGR = ls_stpox-ALPGR.  "替代组
                      my_data-ALPST = ls_stpox-ALPST.  "策略
                      my_data-POTX1 = ls_stpox-POTX1.  "行文本
                      my_data-STLAN = ls_stpox-STLAN.  "物料清单类别
                      my_data-STLAL = ls_stpox-STLAL.  "BOM备选清单
                      my_data-EWAHR = ls_stpox-EWAHR.  "BOM备选清单

                      APPEND my_data TO it_data.
                  ENDLOOP.
               ENDIF.

            ELSE.
              my_data-matnr = dllh_data-matnr. "物料编码
              my_data-maktx = dllh_data-maktx. "物料编码
              my_data-werks = dllh_data-werks. "物料编码
              my_data-idnrk = usedtab-matnr. "物料编码
              my_data-maktr = usedtab-ojtxb. "物料编码

              my_data-POSNR = usedtab-POSNR. "BOM行号
              my_data-MENGE = usedtab-MENGE / usedtab-BMENG. "数量
              my_data-ALPRF = usedtab-ALPRF.  "优先级
              my_data-ALPGR = usedtab-ALPGR.  "替代组
              my_data-ALPST = usedtab-ALPST.  "策略
              my_data-POTX1 = usedtab-POTX1.  "行文本
              my_data-STLAN = usedtab-STLAN.  "物料清单类别
              my_data-STLAL = usedtab-STLST.  "BOM备选清单
              my_data-EWAHR = usedtab-EWAHR.  "BOM备选清单

              APPEND my_data TO it_data.
            ENDIF.


          ENDLOOP.






      ENDIF.


    ENDIF.

  ENDLOOP.



  SELECT mara~matnr mara~normt makt~maktx mara~groes
  INTO TABLE twlxx_data
  FROM mara
  INNER JOIN makt ON mara~matnr = makt~matnr
  WHERE makt~spras = sy-langu.
  SORT twlxx_data BY matnr.


      SELECT matnr
           werks
           labst
      INTO TABLE lt_mard
      FROM mard
        FOR ALL ENTRIES IN it_data
      WHERE matnr = it_data-matnr
        AND werks = it_data-werks.
    SORT lt_mard BY matnr werks.

    LOOP AT lt_mard INTO ls_mard.
      MOVE-CORRESPONDING ls_mard TO ls_mard_sum.
      COLLECT ls_mard_sum INTO lt_mard_sum.
      CLEAR ls_mard.
    ENDLOOP.




  LOOP AT it_data INTO my_data.
    CLEAR: wlxx_data.
    READ TABLE twlxx_data INTO wlxx_data WITH KEY matnr = my_data-matnr
   BINARY SEARCH.
    CONCATENATE wlxx_data-maktx wlxx_data-groes INTO wlxx_data-maktx.
    my_data-maktx = wlxx_data-maktx.


     CLEAR ls_mard_sum.
      READ TABLE lt_mard_sum INTO ls_mard_sum WITH KEY matnr = my_data-matnr
                                                       werks = my_data-werks.
      IF sy-subrc = 0.
        my_data-labst = ls_mard_sum-labst.
      ENDIF.

    MODIFY it_data FROM my_data.
  ENDLOOP.
  PERFORM comment_build CHANGING gt_list_top_of_page[].
  PERFORM sub_fieldcat.
  PERFORM layout_init CHANGING gs_layout.

  DATA ls_layout   TYPE lvc_s_layo.






   ls_layout-zebra      = abap_on. "斑马线显示,颜色隔行交替显示
   ls_layout-cwidth_opt = abap_on.    "ALV网格(单元格)宽度设置为自动最优化,按输出内容宽度自动调整
   ls_layout-info_fname = 'COLOR'.



   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
     EXPORTING
       i_callback_program       = sy-repid "注意点
       i_callback_pf_status_set = 'FRM_SET_STATUS'
       i_callback_user_command  = g_user_command
       is_layout_lvc            = ls_layout
       it_fieldcat_lvc          = gt_fieldcat
       i_save                   = 'A'
     TABLES
       t_outtab                 = it_data
     EXCEPTIONS
       program_error            = 1
       OTHERS                   = 2.




*  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_data
*    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.


*屏幕定义字段头
 DEFINE fill_field.
   CLEAR gs_fieldcat.
   gs_fieldcat-fieldname = &1. "ALV 控制: 内部表字段的字段名称
   gs_fieldcat-scrtext_l = &2. "长字段标签
   gs_fieldcat-no_zero   = &3. "ALV 控制: 为输出隐藏零
   gs_fieldcat-ref_table = &4. "参考表
   gs_fieldcat-ref_field = &5. "参考字段
   APPEND gs_fieldcat TO gt_fieldcat.
 END-OF-DEFINITION.



*&---------------------------------------------------------------------*
*& Form FRM_SET_STATUS
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
 FORM frm_set_status USING lt_extab TYPE slis_t_extab.

   SET PF-STATUS 'STATUS01'.


 ENDFORM.

FORM sub_fieldcat.


*   ls_layout-zebra      = abap_on. "斑马线显示,颜色隔行交替显示
*   ls_layout-cwidth_opt = abap_on.    "ALV网格(单元格)宽度设置为自动最优化,按输出内容宽度自动调整
*   ls_layout-info_fname = 'COLOR'.


  fill_field 'MATNR' '物料编码' 'X' '' ''.
  fill_field 'MAKTX' '物料描述' 'X' '' ''.
  fill_field 'IDNRK' 'BOM料' 'X' '' ''.
  fill_field 'MAKTR' 'BOM料说明' 'X' '' ''.
  fill_field 'WERKS' '工厂' 'X' '' ''.

  fill_field 'STLAN' '物料清单类别' 'X' '' ''.
  fill_field 'STLAL' 'BOM备选清单' 'X' '' ''.
  fill_field 'POSNR' 'BOM行号' 'X' '' ''.
  "fill_field 'MATNR' '物料编码' 'X' '' ''.
  "fill_field 'MAKTX' '物料描述' 'X' '' ''.

  fill_field 'ALPGR' '替代组' 'X' '' ''.
  fill_field 'ALPRF' '优先级' 'X' '' ''.
  fill_field 'MENGE' '数量' 'X' '' ''.
  fill_field 'ALPST' '策略' 'X' '' ''.
  fill_field 'POTX1' '行文本' 'X' '' ''.

  fill_field 'EWAHR' '使用概率' 'X' '' ''.
  fill_field 'LABST' '库存' 'X' '' ''.



*  PERFORM add_field USING 'MATNR' '物料编码'.
*  PERFORM add_field USING 'MAKTX' '物料描述'.
*  "PERFORM add_field USING 'WERKS' '工厂'.
*  "PERFORM add_field USING 'STLAN' '物料清单类别'.
*  "PERFORM add_field USING 'STLAL' 'BOM备选清单'.
*  "PERFORM add_field USING 'POSNR' 'BOM行号'.
*  PERFORM add_field USING 'IDNRK' 'BOM料'.
*  PERFORM add_field USING 'MAKTR' 'BOM料说明'.
*  "PERFORM add_field USING 'POSNR' 'BOM行号'.
*
*
*  PERFORM add_field USING 'WERKS' '工厂'.
*  PERFORM add_field USING 'STLAN' '物料清单类别'.
*  PERFORM add_field USING 'STLAL' 'BOM备选清单'.
*  PERFORM add_field USING 'POSNR' 'BOM行号'.
*
*  PERFORM add_field USING 'MATNR' '物料编码'.
*  PERFORM add_field USING 'MAKTX' '物料描述'.
*
*  PERFORM add_field USING 'ALPGR' '替代组'.
*  PERFORM add_field USING 'ALPRF' '优先级'.
*    PERFORM add_field USING 'MENGE' '数量'.
*  PERFORM add_field USING 'ALPST' '策略'.
*  PERFORM add_field USING 'POTX1' '行文本'.
* " PERFORM add_field USING 'STLAN' '物料清单类别'.
* " PERFORM add_field USING 'STLAL' 'BOM备选清单'.
*  PERFORM add_field USING 'EWAHR' '使用概率'.
*  PERFORM add_field USING 'LABST' '库存'.
*



ENDFORM.

FORM add_field USING i_fieldname TYPE slis_fieldname i_text TYPE string.
  CLEAR wa_alv_field.
  wa_alv_field-fieldname = i_fieldname.
  wa_alv_field-tabname = 'IT_DATA'.
  wa_alv_field-ddictxt = 'L'.
  wa_alv_field-no_zero = 'X'.
  wa_alv_field-seltext_l = i_text.
  APPEND wa_alv_field TO wa_alv_fieldcat.
ENDFORM. "ADD_FIELD




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
FORM top_of_page.
  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = gt_list_top_of_page.
ENDFORM. "TOP_OF_PAGE
FORM comment_build CHANGING lt_top_of_page TYPE slis_t_listheader.
  DATA ls_line TYPE slis_listheader.
  CLEAR ls_line.
  ls_line-typ = 'H'.
  ls_line-info = '批量BOM反查'.
  APPEND ls_line TO lt_top_of_page.
  CLEAR ls_line.
  ls_line-typ = 'S'.
  ls_line-key = '查询时间:'.
  ls_line-info = sy-datum.
  APPEND ls_line TO lt_top_of_page.
  ls_line-key = '查询人:'.
  ls_line-info = sy-uname.
  APPEND ls_line TO lt_top_of_page.
ENDFORM. "COMMENT_BUILD
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_DATA-MATNR'.
        SET PARAMETER ID 'MAT' FIELD rs_selfield-value.
        CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
      ENDIF.
  ENDCASE.
ENDFORM.

取顶阶函数

DATA LS_ZPPFU503  TYPE  ZPPFU503.
DATA: gt_ZPPFU503 TYPE STANDARD TABLE OF ZPPFU503 INITIAL SIZE 10 WITH HEADER LINE.

FUNCTION zppfu503.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_MATNR) TYPE  RC29L-MATNR
*"     VALUE(I_WERKS) TYPE  RC29L-WERKS
*"  EXPORTING
*"     REFERENCE(O_MATNR) TYPE  Z_MATNR
*"     REFERENCE(O_MATXT) TYPE  Z_MATNR
*"  TABLES
*"      O_ZPPFU503 STRUCTURE  ZPPFU503
*"----------------------------------------------------------------------


  DATA: BEGIN OF usedtab OCCURS 100.
          INCLUDE STRUCTURE stpov.
  DATA: END OF usedtab.
  DATA: BEGIN OF equicat OCCURS 100.
          INCLUDE STRUCTURE cscequi.
  DATA: END OF equicat.
  DATA: BEGIN OF kndcat OCCURS 100.
          INCLUDE STRUCTURE cscknd.
  DATA: END OF kndcat.
  DATA: BEGIN OF matcat OCCURS 100.
          INCLUDE STRUCTURE cscmat.
  DATA: END OF matcat.
  DATA: BEGIN OF stdcat OCCURS 100.
          INCLUDE STRUCTURE cscstd.
  DATA: END OF stdcat.
  DATA: BEGIN OF tplcat OCCURS 100.
          INCLUDE STRUCTURE csctpl.
  DATA: END OF tplcat.

  CALL FUNCTION 'CS_WHERE_USED_MAT'
    EXPORTING
      datub                      = sy-datum
      datuv                      = sy-datum
      matnr                      = i_matnr
      werks                      = i_werks
    TABLES
      wultb                      = usedtab
      equicat                    = equicat
      kndcat                     = kndcat
      matcat                     = matcat
      stdcat                     = stdcat
      tplcat                     = tplcat
    EXCEPTIONS
      call_invalid               = 1
      material_not_found         = 2
      no_where_used_rec_found    = 3
      no_where_used_rec_selected = 4
      no_where_used_rec_valid    = 5
      OTHERS                     = 6.


  FREE gt_ZPPFU503.

  IF usedtab IS NOT INITIAL.
    LOOP AT usedtab INTO data(ls_usedtab).
      PERFORM GET_DATA USING ls_usedtab-matnr ls_usedtab-werks ls_usedtab-OJTXB.
    ENDLOOP.
  ENDIF.

  SORT gt_ZPPFU503 BY matnr werks.

  DELETE ADJACENT DUPLICATES FROM gt_ZPPFU503 COMPARING ALL FIELDS.

  "料号串联
  LOOP AT gt_ZPPFU503.
    IF O_MATNR IS INITIAL.
      O_MATNR = gt_ZPPFU503-MATNR.
    ELSE.
    CONCATENATE O_MATNR gt_ZPPFU503-MATNR INTO O_MATNR SEPARATED BY '&'.
    ENDIF.
  ENDLOOP.

  move gt_ZPPFU503[] to o_ZPPFU503[].


ENDFUNCTION.


FORM GET_DATA USING p_matnr p_werks P_OJTXB.
 " DATA LS_ZPPFU503  TYPE  ZPPFU503.
  DATA: BEGIN OF lt_usedtab OCCURS 100.
          INCLUDE STRUCTURE stpov.
  DATA: END OF lt_usedtab.

  DATA: BEGIN OF lt_equicat OCCURS 100.
          INCLUDE STRUCTURE cscequi.
  DATA: END OF lt_equicat.
  DATA: BEGIN OF lt_kndcat OCCURS 100.
          INCLUDE STRUCTURE cscknd.
  DATA: END OF lt_kndcat.
  DATA: BEGIN OF lt_matcat OCCURS 100.
          INCLUDE STRUCTURE cscmat.
  DATA: END OF lt_matcat.
  DATA: BEGIN OF lt_stdcat OCCURS 100.
          INCLUDE STRUCTURE cscstd.
  DATA: END OF lt_stdcat.
  DATA: BEGIN OF lt_tplcat OCCURS 100.
          INCLUDE STRUCTURE csctpl.
  DATA: END OF lt_tplcat.



    CALL FUNCTION 'CS_WHERE_USED_MAT'
    EXPORTING
      datub                      = sy-datum
      datuv                      = sy-datum
      matnr                      = p_matnr
      werks                      = p_werks
    TABLES
      wultb                      = lt_usedtab
      equicat                    = lt_equicat
      kndcat                     = lt_kndcat
      matcat                     = lt_matcat
      stdcat                     = lt_stdcat
      tplcat                     = lt_tplcat
    EXCEPTIONS
      call_invalid               = 1
      material_not_found         = 2
      no_where_used_rec_found    = 3
      no_where_used_rec_selected = 4
      no_where_used_rec_valid    = 5
      OTHERS                     = 6.

   IF lt_usedtab IS NOT INITIAL.
    LOOP AT lt_usedtab INTO DATA(ls1_usedtab).
      PERFORM GET_DATA USING ls1_usedtab-matnr ls1_usedtab-werks ls1_usedtab-OJTXB.
    ENDLOOP.

   ELSE.  "代表当前料为顶阶
     LS_ZPPFU503-MATNR = p_matnr.
     LS_ZPPFU503-WERKS = p_werks.
     LS_ZPPFU503-OJTXB = P_OJTXB.

    APPEND LS_ZPPFU503 TO gt_ZPPFU503.


   ENDIF.


ENDFORM.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四方木2021

您的鼓励是我前进路上的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值