SAP PP BOM查询报表分享
一、报表逻辑














二、报表界面


三、报表代码
*&---------------------------------------------------------------------*
 *& Report ZRPPP_0002
 *&---------------------------------------------------------------------*
 *& 08.06.2021 09:25:14  BOM查询报表
 *&---------------------------------------------------------------------*
 REPORT zrppp_0002.
 TABLES: marc,mara,mast,stko,stxh .
 
 INCLUDE <color>.
 DATA: gr_table   TYPE REF TO cl_salv_table,
       gr_layout  TYPE REF TO cl_salv_layout,
       gs_program TYPE salv_s_layout_key,
       gr_columns TYPE REF TO cl_salv_columns_table,
       gr_column  TYPE REF TO cl_salv_column_table,
       gr_display TYPE REF TO cl_salv_display_settings,
       gt_s_color TYPE lvc_t_scol,
       gs_s_color TYPE lvc_s_scol.
 DATA:directory TYPE string.
 TYPES: BEGIN OF ty_head  ,
          werks  TYPE mast-werks,
 *         stufe TYPE   stpox-stufe,
          matnr  TYPE mast-matnr,
          stlnr  TYPE mast-stlnr,
          matnr1 TYPE mast-matnr,
          maktx1 TYPE makt-maktx,
          ltext1 TYPE char255,
          arbpl  TYPE crhd-arbpl,
          ktext  TYPE crtx-ktext,
 *         stlan1 TYPE mast-stlan,
          andat  TYPE mast-andat,
          datuv  TYPE stko-datuv,
 *         maktx  TYPE makt-maktx,
          bmeng  TYPE stko-bmeng,
          bmein  TYPE stko-bmein,
          stlan  TYPE mast-stlan,
          stlty  TYPE stko-stlty,
          stlal  TYPE stko-stlal,
          stufe  TYPE char15,
          stlst  TYPE stko-stlst,
        END OF ty_head .
 DATA:gw_head TYPE ty_head .
 
 TYPES:BEGIN OF ty_tab ,
         chk         TYPE c.
         INCLUDE TYPE ty_head .
 TYPES:
         posnr       TYPE   stpo-posnr,
         postp       TYPE   stpo-postp,
         idnrk       TYPE   stpo-idnrk,
         idnrk_maktx TYPE   makt-maktx,
         zzbbh       TYPE   ztmm_mara-zzbbh,
         mmsta       TYPE   marc-mmsta,
         ltext2      TYPE char255,
         matkl       TYPE mara-matkl,
 
         labst       TYPE mard-labst,
         lblab       TYPE mslb-lblab,
         meins       TYPE mara-meins,
         wqsl        TYPE ekpo-menge,
         wqsldw      TYPE ekpo-meins,
 
 
         wgbez60     TYPE t023t-wgbez60,
         menge       TYPE   stpo-menge,
         mmein       TYPE   stpo-meins,
         zjdwyl(16)  TYPE   p DECIMALS 9,
         ausch       TYPE   stpo-ausch,
         aennr       TYPE   stko-aennr,
         beskz       TYPE   marc-beskz,
         sobsl       TYPE   marc-sobsl,
         lgpro       TYPE   marc-lgpro,
         alpgr       TYPE   stpo-alpgr,
         sanka       TYPE   stpo-sanka,
         alprf       LIKE stpo-alprf,
         ewahr       LIKE stpo-ewahr,
         alpst       LIKE stpo-alpst,
         zzgylx      TYPE   char1,
         zzscbb      TYPE   char1,
         zzxxjl      TYPE   char1,
         vprsv       TYPE   mbew-vprsv,
         zzstprs     TYPE   mbew-stprs,
         peinh       TYPE   mbew-peinh,
         brgew        TYPE mara-brgew,
         ntgew        TYPE mara-ntgew,
         zzmpq1      TYPE ztmm_mara-zzmpq1,
         zzmpq2      TYPE ztmm_mara-zzmpq2,
         sortf       TYPE   sortp, "排序字段
         dumps       TYPE   dumps, "虚拟项目
 *       sortfield(255) TYPE c,
         t_color     TYPE lvc_t_scol,  "设置单元格颜色用
         zflag       TYPE c,
         stlkn       TYPE stlkn,
         umlme       TYPE mard-umlme, " 不良品
         insme       TYPE mard-insme, " 冻结
         zzp         TYPE resb-enmng , " 在制品
         kausf       TYPE marc-kausf, "组件报废率
 *        IF S_WERKS-LOW = '8010'.
       END OF ty_tab .
 DATA:gt_tab TYPE TABLE OF ty_tab WITH HEADER LINE.
 
 TYPES: BEGIN OF ty_zzp  ,
          matnr1  TYPE  afpo-matnr,
          zenmng2 TYPE resb-enmng,
        END OF ty_zzp .
 DATA   gt_zzp TYPE TABLE OF ty_zzp.
 
 
 DATA:BEGIN OF gw_info.
 DATA: ztype     TYPE bapi_mtype,
       zmsg      TYPE bapi_msg,
       zauth_wrk TYPE char1, "工厂权限
       zauth_prs TYPE char1, "价格权限
       END OF gw_info .
 
 
 DATA: gv_path    TYPE string .
 
 "打印相关参数
 DATA: lv_fname              TYPE rs38l_fnam,
       gv_option             TYPE ssfcompop,
       gv_control_parameters TYPE ssfctrlop,
       gs_output             TYPE ssfcresop.
 
 DATA: r_lgort1 TYPE RANGE OF mard-lgort,
       r_lgort2 TYPE RANGE OF mard-lgort.
 
 SELECTION-SCREEN BEGIN OF BLOCK part1 WITH FRAME TITLE TEXT-001.
   SELECT-OPTIONS:
   s_werks FOR marc-werks NO INTERVALS NO-EXTENSION OBLIGATORY MEMORY ID wrk,
   s_matnr FOR mara-matnr,
   s_mtart FOR mara-mtart ,
   s_stlan FOR mast-stlan  NO INTERVALS NO-EXTENSION.
 
   PARAMETERS: p_stlst TYPE stko-stlst DEFAULT '1'.
 
   SELECT-OPTIONS:s_stlal FOR mast-stlal NO-EXTENSION NO INTERVALS ,"DEFAULT '01',
   s_andat FOR mast-andat .
 
   SELECTION-SCREEN SKIP 1.
   PARAMETERS: c_01 AS CHECKBOX DEFAULT 'X'.
   SELECTION-SCREEN ULINE.
   PARAMETERS: c_11 AS CHECKBOX DEFAULT 'X',
               c_12 AS CHECKBOX DEFAULT ''.
   SELECTION-SCREEN ULINE.
   PARAMETERS: c_02 AS CHECKBOX DEFAULT '' USER-COMMAND cmd,
               c_03 AS CHECKBOX DEFAULT '' USER-COMMAND cmd.
 
 
 SELECTION-SCREEN END OF BLOCK part1.
 
 CLASS l_cl_handle_events DEFINITION.
   PUBLIC SECTION.
     METHODS: on_user_command FOR EVENT added_function OF cl_salv_events_table
       IMPORTING e_salv_function.
     METHODS: on_link_click FOR EVENT link_click OF cl_salv_events_table
       IMPORTING row column.
 ENDCLASS.
 
 CLASS l_cl_handle_events IMPLEMENTATION.
   METHOD on_user_command.
     PERFORM handle_user_command USING e_salv_function.
   ENDMETHOD.
   METHOD on_link_click.
     PERFORM handle_link_click USING row column.
   ENDMETHOD.
 ENDCLASS.
 
 INITIALIZATION.
   s_andat-high = sy-datum .
   APPEND s_andat .
   "1001
   r_lgort1 = VALUE #(  sign = 'I' option = 'EQ'  ( low = 'BRJ1' )
   ( low = 'BRJ2' )
   ( low = 'CMP1' )
   ( low = 'RJS1' )
   ( low = 'CMS1' )
   ( low = 'FGR1' )
   ( low = 'LD01' )
   ( low = 'RJ01' )
   ( low = 'RJ0Z' )
   ( low = 'RJP1' )
   ( low = 'ZY02' )
   ( low = 'ZY03' )
   ( low = 'ZY06' )
   ( low = 'ZYLD' )
   ( low = '9999' )
   ( low = 'XN02' )
   ( low = 'ZY04' )
   ( low = 'ZY05' )
   ( low = 'ZY07' )
   ( low = 'FGR2' ) ) .
 
   "1002
   r_lgort2 = VALUE #(  sign = 'I' option = 'EQ'
   ( low = 'BRJ1' )
   ( low = 'BRJ2' )
   ( low = 'CMS1' )
   ( low = 'RJ01' )
   ( low = 'RJ03' )
   ( low = 'ZY02' )
   ( low = 'ZY03' )
   ( low = 'ZY06' )
   ( low = '9999' )
   ( low = 'XN02' )
   ( low = 'ZY04' )
   ( low = 'ZY05' )
   ( low = 'ZY07' )
   ( low = 'FGR2' ) ) .
 
 AT SELECTION-SCREEN OUTPUT.
   IF ( c_02 = 'X'  OR  c_03 = 'X' ) AND c_11 = ''.
     c_11 = 'X'.
   ENDIF.
 
 START-OF-SELECTION.
   PERFORM frm_check_input .
   CHECK gw_info-ztype NE 'E' .
   PERFORM frm_get_data .
   PERFORM frm_show_alv .
 *&---------------------------------------------------------------------*
 *& Form frm_get_data
 *&---------------------------------------------------------------------*
 *& text
 *&---------------------------------------------------------------------*
 *& -->  p1        text
 *& <--  p2        text
 *&---------------------------------------------------------------------*
 FORM frm_get_data .
   DATA: lt_stb    TYPE TABLE OF stpox WITH HEADER LINE,
         lw_topmat TYPE cstmat,
         lv_dstst  TYPE csdata-xfeld,
         lv_werks  TYPE werks_d,
         lv_stlan  TYPE stlan,
         lv_matnr  TYPE matnr,
         lv_bmeng  TYPE stko-bmeng,
         lv_bmein  TYPE stko-bmein.
 
   DATA:BEGIN OF lt_ekpo OCCURS 0 .
   DATA:matnr TYPE matnr,
        menge TYPE menge_d,
        meins TYPE meins,
        END OF lt_ekpo .
   DATA:flg_end TYPE c .
   DATA gh_mard TYPE mard.
   DATA gd_mard TYPE TABLE OF  mard.
   DATA gh_mard_sun TYPE   mard.
   DATA gd_mard_sun TYPE TABLE OF  mard.
 *  BREAK guoxiongjie .
 
   SELECT
   marc~matnr AS lp_matnr,
   CAST( @space AS CHAR( 1 ) ) AS done,
   mast~stlnr,
   mast~stlan,
   mast~stlal,
   mara~meins,
   marc~beskz,
   marc~sobsl,
   mara~matkl,
   mast~andat AS datuv
 *      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 IN @s_werks
         AND marc~matnr IN @s_matnr
         AND mara~mtart IN @s_mtart
         AND mast~stlan IN @s_stlan
         AND mast~stlal IN @s_stlal
 *      AND stko~datuv IN @s_andat
         AND mara~lvorm = ' '
         AND marc~lvorm = ' '.
 
   SELECT b~stlnr, b~stlal, b~stkoz, b~vgkzl, b~datuv, CAST( @space AS CHAR( 1 ) ) AS chk
   FROM @lt_mat AS a INNER JOIN stko AS b ON a~stlnr = b~stlnr AND a~stlal = b~stlal
   WHERE b~datuv IN @s_andat
   INTO TABLE @DATA(lt_stko) .
 
   LOOP AT lt_stko INTO DATA(lw_stko) WHERE vgkzl IS NOT INITIAL.
     READ TABLE lt_stko ASSIGNING FIELD-SYMBOL(<fs_stko>)
     WITH KEY stlnr = lw_stko-stlnr stlal = lw_stko-stlal stkoz = lw_stko-vgkzl .
     IF sy-subrc EQ 0.
       <fs_stko>-chk = 'E' .
     ENDIF.
   ENDLOOP.
   DELETE lt_stko WHERE chk = 'E' .
 
   LOOP AT lt_mat ASSIGNING FIELD-SYMBOL(<fs_mat>) .
     READ TABLE lt_stko INTO lw_stko WITH KEY stlnr = <fs_mat>-stlnr stlal = <fs_mat>-stlal .
     IF sy-subrc EQ 0.
       <fs_mat>-datuv = lw_stko-datuv .
     ELSE.
       <fs_mat>-done = 'E' .
     ENDIF.
   ENDLOOP.
   DELETE lt_mat WHERE done = 'E' .
 
 *  SELECT a~*
 *    FROM @lt_mat AS a JOIN @lt_stko AS b ON a~stlnr = b~stlnr AND a~stlal = b~stlal
 *    INTO TABLE lt_mat .
 
 
 
   IF lt_mat[] IS INITIAL.
     MESSAGE '未查询到BOM数据' TYPE 'S' DISPLAY LIKE 'E'.
     RETURN .
   ENDIF.
 
   CLEAR:gt_tab,gt_tab[].
   SORT lt_mat ASCENDING BY lp_matnr stlan stlal .
 *  BREAK guoxiongjie .
 
   lv_werks = s_werks-low .
 
   DATA:lv_total TYPE char6,
        lv_row   TYPE char6,
        lv_text  TYPE char50.
 *  BREAK GUOXIONGJIE .
 
   lv_total = lines( lt_mat ) .
   LOOP AT lt_mat INTO DATA(lw_mat) WHERE done = ''.
     DATA(lv_lpmatnr) = |{ lw_mat-lp_matnr ALPHA = OUT }|.
     ADD 1 TO lv_row .
     CONCATENATE lv_row '/' lv_total  ', 查询物料BOM:' lv_lpmatnr INTO lv_text .
     CONDENSE lv_text NO-GAPS .
     CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
       EXPORTING
         percentage = 25 "lv_percentage
         text       = lv_text.
 
     "判断期间~
     SELECT SINGLE bmeng bmein INTO (lv_bmeng ,lv_bmein ) FROM mast INNER JOIN stko ON mast~stlnr = stko~stlnr AND mast~stlal = stko~stlal
     WHERE matnr = lw_mat-lp_matnr AND werks = lv_werks AND stlan = lw_mat-stlan
     AND datuv LE sy-datum AND valid_to GE sy-datum .
 
     CALL FUNCTION 'ZCS_BOM_EXPL_MAT_V2'
       EXPORTING
 *       aufsw   = ' '
         capid   = 'PP01'
         datuv   = lw_mat-datuv
         ehndl   = '1'
         emeng   = lv_bmeng
         mtnrv   = lw_mat-lp_matnr
         mehrs   = c_01   "多层
         stlan   = lw_mat-stlan  " BOM用途
         stlal   = lw_mat-stlal  "备选物料清单
         werks   = lv_werks
         i_stlan = s_stlan-low
       IMPORTING
         topmat  = lw_topmat
 *       dstst   = lv_dstst
       TABLES
         stb     = lt_stb.
 
     lw_mat-done = 'X'.
     MODIFY lt_mat FROM lw_mat TRANSPORTING done.
 
     IF p_stlst IS NOT INITIAL.
 *      CHECK  lw_topmat-stlst EQ p_stlst .
     ENDIF.
 
     READ TABLE gt_tab WITH KEY matnr = lw_topmat-matnr stlan = lw_topmat-stlan stufe = '0' TRANSPORTING NO FIELDS .
     IF sy-subrc NE 0.
       CLEAR gt_tab .
       gt_tab = VALUE #( werks = lw_topmat-werks matnr = lw_topmat-matnr maktx1 = lw_topmat-maktx
       stufe = '0' idnrk = lw_topmat-matnr andat = lw_topmat-andat stlan = lw_topmat-stlan
       menge = lv_bmeng mmein = lv_bmein stlst =  lw_topmat-stlst ) .
 
       SELECT SINGLE matkl INTO gt_tab-matkl FROM mara WHERE matnr = gt_tab-matnr .
       gt_tab-bmeng = lv_bmeng.
       gt_tab-bmein = lv_bmein.
       APPEND gt_tab .
     END
