SAP PP BOM批量创建功能分享
一、功能逻辑






二、功能界面



三、功能代码
*&---------------------------------------------------------------------*
 *& Report ZRPPP_0003
 *&---------------------------------------------------------------------*
 *& 09.06.2021 10:00:55 By Guoxj  BOM主数据批量维护
 *&---------------------------------------------------------------------*
 REPORT zrppp_0003.
 TABLES: marc,mara,mast,stko,stpo,ztpp003_log,
   sscrfields ,ICON.
 TYPE-POOLS:slis.
 
 
 DATA: gr_table TYPE REF TO cl_salv_table.
 DATA: gr_layout TYPE REF TO cl_salv_layout.
 DATA: gs_program TYPE salv_s_layout_key.
 DATA: gr_columns TYPE REF TO cl_salv_columns_table.
 DATA: gr_column TYPE REF TO cl_salv_column_table.
 DATA: gr_display TYPE REF TO cl_salv_display_settings.
 DATA: gr_functions TYPE REF TO cl_salv_functions.
 
 TYPES: BEGIN OF ty_head  ,
   werks TYPE mast-werks,
   matnr TYPE mast-matnr,
   maktx TYPE makt-maktx,
   ver01 TYPE char2,
   stlan TYPE mast-stlan,
   aennr TYPE stko-aennr,
   stlal TYPE stko-stlal,
   datuv TYPE stko-datuv,
   stktx TYPE stko-stktx,
   bmeng TYPE stko-bmeng,
   bmein TYPE  basme , "父料的单位
   stlst TYPE stko-stlst,
 END OF ty_head .
 
 TYPES: BEGIN OF ty_item  ,
   postp  TYPE stpo-postp,
   posnr  TYPE stpo-posnr,
   idnrk  TYPE stpo-idnrk,
   matkl  TYPE makt-maktx,
   ver02  TYPE char2,
   menge  TYPE stpo-menge,
   zjsljs TYPE char10,
   meins  TYPE stpo-meins,
   sortf  TYPE stpo-sortf,
   ausch  TYPE stpo-ausch,
   sanka  TYPE stpo-sanka,
   alpgr  TYPE stpo-alpgr,
   alprf  TYPE stpo-alprf,
   alpst  TYPE stpo-alpst,
   ewahr  TYPE stpo-ewahr,
   lgort  TYPE stpo-lgort,
 END OF ty_item .
 
 TYPES: BEGIN OF ty_info  ,
   stlnr  TYPE mast-stlnr,
   status TYPE zde_status,
   msg    TYPE bapi_msg,
   ztype  TYPE bapi_mtype,
 END OF ty_info .
 
 DATA:BEGIN OF gt_tab OCCURS 0 .
   INCLUDE TYPE ty_head .
   INCLUDE TYPE ty_item .
   INCLUDE TYPE ty_info .
   DATA:
 END OF gt_tab .
 
 DATA:BEGIN OF alttab OCCURS 0 .
   DATA: stlal TYPE stlal,
 END OF alttab .
 
 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:flg_submit TYPE C .
 
 SELECTION-SCREEN BEGIN OF BLOCK part1 WITH FRAME TITLE TEXT-001.
 
   PARAMETERS:rd1 RADIOBUTTON GROUP gp1 USER-COMMAND cmd DEFAULT 'X',
   rd2 RADIOBUTTON GROUP gp1,
   rd3 RADIOBUTTON GROUP gp1.
 
 
   PARAMETERS: p_file TYPE rlgrap-filename  MODIF ID g1 MEMORY ID p03 .
 
   SELECT-OPTIONS:
   s_uname FOR ztpp003_log-uname MODIF ID g2 ,
   s_datum FOR ztpp003_log-datum MODIF ID g2 ,
   s_ztype FOR ztpp003_log-ztype MODIF ID g2 ,
   s_matnr FOR ztpp003_log-matnr MODIF ID g2 ,
   s_stlnr FOR ztpp003_log-stlnr MODIF ID g2 .
 
 SELECTION-SCREEN END OF BLOCK part1.
 
 *SELECTION-SCREEN PUSHBUTTON /1(20) btntxt1 USER-COMMAND but1 MODIF ID g1  .
 
 SELECTION-SCREEN FUNCTION KEY 1.
 
 AT SELECTION-SCREEN OUTPUT.
 LOOP AT SCREEN.
   IF rd3 = 'X'.
     IF SCREEN-group1 = 'G1'.
       SCREEN-active = 0.
     ENDIF.
   ELSE.
     IF SCREEN-group1 = 'G2'.
       SCREEN-active = 0.
     ENDIF.
   ENDIF.
   MODIFY SCREEN.
 ENDLOOP.
 
 INITIALIZATION.
 *  btntxt1 = '模板下载' .
 sscrfields-functxt_01 = '模板下载'.
 
 AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
 CALL FUNCTION 'F4_FILENAME'
 EXPORTING
   program_name  = syst-cprog
   dynpro_number = syst-dynnr
   field_name    = ' '
 IMPORTING
   file_name     = p_file.
 
 AT SELECTION-SCREEN.
 SEARCH 'FC01' FOR sscrfields-ucomm .
 CHECK sy-subrc = 0 .
 PERFORM frm_down_model USING sscrfields-ucomm .
 
 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.
 ENDCLASS.
 
 CLASS l_cl_handle_events IMPLEMENTATION.
   METHOD on_user_command.
     PERFORM handle_user_command USING e_salv_function.
   ENDMETHOD.
 ENDCLASS.
 
 START-OF-SELECTION.
 IF rd3 = 'X'. "日志查看
   PERFORM frm_show_log .
 ELSE.
   IF p_file IS INITIAL.
     MESSAGE '请选择要上传的模板文件' TYPE 'S' DISPLAY LIKE  'E'.
     RETURN .
   ENDIF.
 
   PERFORM frm_upload_file.
 
 *    CHECK gw_info-ztype NE 'E'.
 
   PERFORM frm_show_alv .
 
 ENDIF.
 *&---------------------------------------------------------------------*
 *& Form frm_show_alv
 *&---------------------------------------------------------------------*
 *& text
 *&---------------------------------------------------------------------*
 *& -->  p1        text
 *& <--  p2        text
 *&---------------------------------------------------------------------*
 FORM frm_show_alv .
   TRY.
     cl_salv_table=>factory(
     IMPORTING
       r_salv_table = gr_table
     CHANGING
       t_table      = gt_tab[]
       ).
   CATCH cx_salv_msg.
   ENDTRY.
 
   gr_columns = gr_table->get_columns( ).
   gr_columns->set_optimize( 'X' ).
 
   gr_functions = gr_table->get_functions( ).
   gr_functions->set_all( 'X' ).
 
   DEFINE mcr_undisplay.
     TRY.
       gr_column ?= gr_columns->get_column( &1 ).
       gr_column->set_visible( cl_salv_column_table=>false ).
       gr_column->set_technical( 'X' ) .
     CATCH cx_salv_not_found .
     ENDTRY.
   END-OF-DEFINITION.
 
 *  mcr_undisplay: ''.
   DEFINE mcr_setcoltext.
     TRY.
       gr_column ?= gr_columns->get_column( &1 ).
       gr_column->set_short_text( &2 ).
       gr_column->set_long_text( &2 ).
       gr_column->set_medium_text( &2 ).
 
     CATCH cx_salv_not_found .
     ENDTRY.
   END-OF-DEFINITION.
   mcr_undisplay: 'ZJSLJS' .
   mcr_setcoltext: 'WERKS' '工厂',
   'MATNR' '父件物料编码',
   'MAKTX' '父件物料描述',
   'STLAN' 'BOM用途',
   'AENNR' '变更编号',
   'STLAL' '可选BOM',
   'DATUV' '有效起始日期',
   'STKTX' 'BOM表头文本描述',
   'BMENG' '基本数量',
   'BMEIN' '基本计量单位',
   'STLST' 'BOM状态',
   'POSTP' '项目类别',
   'POSNR' '组件项目编号',
   'IDNRK' '组件物料编码',
   'MATKL' '组件物料描述',
   'MENGE' '组件数量',
   'MEINS' '组件单位',
   'SORTF' '排序字符串',
   'AUSCH' '损耗率',
   'SANKA' '成本核算标识',
   'ALPGR'  '替代项目:组',
   'ALPRF'  '优先级',
   'ALPST'  '替代项目:策略',
   'EWAHR'  '使用可能性按 %',
   'LGORT' '生产仓库地点',
   'STLNR' '物料清单编码',
   'VER01' '父件料号版本',
   'VER02' '子件料号版本'.
 
 
   TRY.
     DATA lv_status TYPE sypfkey .
     lv_status = 'STANDARD' .
     CALL METHOD gr_table->set_screen_status
     EXPORTING
       REPORT        = sy-repid
       pfstatus      = lv_status
       set_functions = gr_table->c_functions_all.
   CATCH cx_sy_arithmetic_error INTO DATA(exc).
   ENDTRY.
 
   gr_layout = gr_table->get_layout( ).
   gs_program-REPORT = sy-repid.
   gr_layout->set_key( gs_program ).
   gr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).
   gr_layout->set_default( 'X' ).
 *  DATA lv_variant TYPE slis_vari .
 *  lv_variant = '/DEFAULT' .
 *  gr_layout->set_initial_layout( lv_variant ) .
 
 
 
   "=====获取事件对象
   DATA: lr_event TYPE REF TO cl_salv_events_table.
   lr_event = gr_table->get_event( ).
 
   "=====事件注册
   DATA: lr_handle_event TYPE REF TO l_cl_handle_events.
   CREATE OBJECT lr_handle_event.
   SET HANDLER lr_handle_event->on_user_command FOR lr_event.
 
   DATA(lv_title) = ':创建' .
   IF rd2 = 'X'.
     lv_title = ':更改' .
   ENDIF.
   SET TITLEBAR 'TITLE' WITH 'BOM主数据批量维护' lv_title .
   gr_table->display( ).
 ENDFORM.
 *&---------------------------------------------------------------------*
 *& Form frm_check_input
 *&---------------------------------------------------------------------*
 *& text
 *&---------------------------------------------------------------------*
 *& -->  p1        text
 *& <--  p2        text
 *&---------------------------------------------------------------------*
 FORM frm_check_input .
 
 
 
   "检查输入
   CLEAR:gw_info .
 
   SELECT marc~matnr, marc~werks ,marc~lvorm AS wrk_lvorm ,mara~lvorm, mara~meins ,marc~ausme ,mara~bstme INTO TABLE @DATA(lt_mat)
         FROM marc INNER JOIN mara ON marc~matnr = mara~matnr
         FOR ALL ENTRIES IN @gt_tab
         WHERE ( marc~matnr = @gt_tab-matnr OR marc~matnr = @gt_tab-idnrk )
         AND marc~werks = @gt_tab-werks.
   DATA:lw_mat LIKE LINE OF lt_mat .
 
   SELECT DISTINCT matnr, werks ,stlan ,stlnr , stlal INTO TABLE @DATA(lt_mast)
         FROM mast FOR ALL ENTRIES IN @gt_tab
         WHERE matnr = @gt_tab-matnr AND werks = @gt_tab-werks AND stlan = @gt_tab-stlan .
   DATA:lw_mast LIKE LINE OF lt_mast .
 
   "判断权限
   gw_info-zauth_wrk = 'X'.
   LOOP AT gt_tab.
 
     CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
       percentage = 50
       TEXT       = '检查数据...'.
 
 
     AUTHORITY-CHECK OBJECT 'ZAOPP_WRK'
     ID 'ZWERKS' FIELD gt_tab-werks
     ID 'ZACTIVE' FIELD 'X'.
     IF sy-subrc <> 0.
       gw_info-ztype = 'E'.
       gw_info-zmsg = '您没有此工厂' && gt_tab-werks && '的权限' .
       gw_info-zauth_wrk = ''.
     ENDIF.
 
     "父阶物料
     DATA(lv_matnr) =   |{ gt_tab-matnr ALPHA = OUT }| .
     CONDENSE lv_matnr NO-GAPS .
 
     "创建时可选BOM为空,自动生成
     IF gt_tab-stlal IS INITIAL AND rd1 = 'X' .
       CLEAR:alttab[].
       LOOP AT lt_mast INTO lw_mast WHERE matnr = gt_tab-matnr.
         alttab-stlal = lw_mast-stlal .
         APPEND alttab .
       ENDLOOP.
       SORT alttab .
       PERFORM alt_find_next CHANGING gt_tab
