SAP PP供需平衡报表分享

一、报表逻辑

二、报表界面

三、报表代码

*&———————————————————————*
*& Report ZRPPP_0019
*&———————————————————————*
*& 
*&———————————————————————*
REPORT zrppp_0019.
TABLES: marc, mara,plaf .

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

TYPES: BEGIN OF ty_tab  ,
  znum     TYPE  char5,
  werks    TYPE  marc-werks,
  matnr    TYPE  marc-matnr,
  maktx    TYPE  makt-maktx,
  berid    TYPE  plaf-berid,
  dispo    TYPE  plaf-dispo,
  mtart    TYPE  mara-mtart,
  plnmg    TYPE  pbed-plnmg,
  zmeng    TYPE  vbap-zmeng,
  bdmng    TYPE resb-bdmng,
  bdmng1   TYPE resb-bdmng,
  zsum     TYPE  menge_d,
  labst    TYPE  mard-labst,
  lblab    TYPE  mslb-lblab,
  gamng    TYPE  afko-gamng,
  gsmng    TYPE  plaf-gsmng,
  zsum2    TYPE  menge_d,
  pr_qty   TYPE  menge_d,
  po_qty   TYPE  menge_d,
  zsum1    TYPE  menge_d,
  labst1   TYPE  mard-labst,
  plnmg_01 TYPE pbed-plnmg, “计划数量

  “wpc新增字段
  zz_xbc   TYPE  menge_d,  “线边仓
  zz_dc    TYPE  menge_d,    “大仓
  zz_wip   TYPE  menge_d,   “WIP
  zz_iqc   TYPE  menge_d,   “IQC
  zz_opo   TYPE  menge_d,   “OPO
  zz_wz    TYPE  menge_d,    “未转
  zz_so    TYPE  menge_d,    “销售未清
END OF ty_tab .

DATA:BEGIN OF gt_tab OCCURS 0 .
  INCLUDE TYPE ty_tab .
  DATA:
        zflag TYPE C,
END OF gt_tab .

DATA:BEGIN OF gw_info.
  DATA: ztype     TYPE bapi_mtype,
        zmsg      TYPE bapi_msg,
        zauth_wrk TYPE char1, “工厂权限
END OF gw_info .
DATA:gv_flag TYPE C .
DATA:del_flag TYPE C .

SELECTION-SCREEN BEGIN OF BLOCK part1 WITH FRAME TITLE TEXT-001.

  SELECT-OPTIONS:
  s_werks FOR marc-werks NO INTERVALS OBLIGATORY MEMORY ID wrk,
  s_matnr FOR marc-matnr ,
  s_mtart FOR mara-mtart ,
  s_dispo FOR marc-dispo ,
  s_berid FOR plaf-berid NO INTERVALS NO-EXTENSION .

  SELECTION-SCREEN SKIP 1 .
  PARAMETERS:chk AS CHECKBOX DEFAULT 'X' .
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.

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 .

  SELECT *
*    marc~werks,
*    marc~matnr,
*    plaf~berid,
*    marc~dispo,
*    mara~mtart
  INTO CORRESPONDING FIELDS OF TABLE @gt_tab
  FROM marc INNER JOIN mara ON marc~matnr = mara~matnr
*              LEFT JOIN plaf ON marc~werks = plaf~pwwrk AND marc~matnr = plaf~matnr
  WHERE werks IN @s_werks AND marc~matnr IN @s_matnr
  AND mara~mtart IN @s_mtart AND marc~dispo IN @s_dispo .
*      AND plaf~berid IN @s_berid .

  CHECK NOT gt_tab[] IS INITIAL.
*  BREAK guoxiongjie .

  SELECT pwwrk, matnr, berid INTO TABLE @DATA(lt_plaf)
        FROM plaf FOR ALL ENTRIES IN @gt_tab
        WHERE pwwrk = @gt_tab-werks AND matnr = @gt_tab-matnr AND berid IN @s_berid.

*  RANGES:r_matnr FOR makt-matnr .
  TYPES:BEGIN OF ty_mat,
    werks TYPE werks_d,
    matnr TYPE matnr,
  END OF ty_mat .
  DATA:lt_mat TYPE TABLE OF ty_mat .
  LOOP AT gt_tab.
    READ TABLE lt_plaf INTO DATA(lw_plaf) WITH KEY pwwrk = gt_tab-werks matnr = gt_tab-matnr .
    IF sy-subrc NE 0 AND NOT s_berid[] IS INITIAL..
      gt_tab-zflag = 'X' .
      MODIFY gt_tab TRANSPORTING zflag .
      CHECK 1 = 2 .
    ENDIF.
    gt_tab-berid = lw_plaf-berid .
    MODIFY gt_tab TRANSPORTING berid .
*    INSERT VALUE #( sign = 'I' option = 'EQ' low = gt_tab-matnr ) INTO TABLE r_matnr.
    INSERT VALUE #( werks = gt_tab-werks matnr = gt_tab-matnr ) INTO TABLE lt_mat.
  ENDLOOP.
  DELETE ADJACENT DUPLICATES FROM lt_mat .

  DELETE gt_tab WHERE zflag = 'X' .

*  SELECT matnr, maktx INTO TABLE @DATA(lt_makt) FROM makt WHERE matnr IN @r_matnr AND spras = @sy-langu .
  SELECT makt~matnr, maktx FROM makt INNER JOIN @lt_mat AS a ON makt~matnr = a~matnr WHERE spras = @sy-langu INTO TABLE @DATA(lt_makt)  .

*    物料= MSLB-MATNR、工厂= MSLB- WERKS,取MSLB-LABST
*  SELECT werks,matnr,SUM( lblab ) AS sum_qty  INTO TABLE @DATA(lt_mslb) FROM mslb WHERE werks = @s_werks-low AND matnr IN @r_matnr
*    GROUP BY werks, matnr.
  SELECT mslb~werks,mslb~matnr,SUM( lblab ) AS sum_qty FROM mslb INNER JOIN @lt_mat AS a ON mslb~matnr = a~matnr WHERE mslb~werks IN @s_werks
  GROUP BY mslb~werks, mslb~matnr INTO TABLE @DATA(lt_mslb) .

  “库存数量
  DATA: wheresql TYPE TABLE OF edpline .
  RANGES: r_lgort FOR mdlg-lgort.

  APPEND 'mard~werks IN @s_werks ' TO wheresql .
  SELECT CAST( 'I' AS CHAR( 1 ) ) AS SIGN,CAST( 'EQ' AS CHAR( 2 ) ) AS option, lgort AS low
  INTO TABLE @r_lgort FROM mdlg WHERE berid LIKE '%ND' AND werks IN @s_werks .
  IF sy-subrc EQ 0.
    APPEND 'AND lgort NOT IN @r_lgort' TO wheresql .
  ENDIF.

  SELECT mard~werks ,mard~matnr, SUM( labst ) AS labst
  FROM mard INNER JOIN @lt_mat AS a ON mard~matnr = a~matnr AND mard~werks = a~werks
  WHERE (wheresql) GROUP BY mard~werks, mard~matnr
  INTO TABLE @DATA(lt_mard) .

  “线别仓
  IF gv_flag = 'X'.
    BREAK guoxiongjie .
    DATA: r_matnr1 TYPE RANGE OF resb-matnr.
    r_matnr1 = VALUE #( FOR wa IN gt_tab ( SIGN = 'I' option = 'EQ' low = wa-matnr ) ).
    SORT r_matnr1 .
    DELETE ADJACENT DUPLICATES FROM r_matnr1[].

    APPEND 'AND LGORT LIKE ''8%'' ' TO wheresql .
    SELECT mard~werks, mard~matnr, SUM( labst ) AS labst
    FROM mard INNER JOIN @lt_mat AS a ON mard~matnr = a~matnr AND mard~werks = a~werks
    WHERE (wheresql) GROUP BY mard~werks, mard~matnr
    INTO TABLE @DATA(lt_mard_xb) .

    “已审批未转PO的PR数据
    SELECT werks ,matnr, SUM( menge ) AS menge
    FROM eban
    WHERE
    frgzu EQ 'X' AND
    bsmng EQ 0   AND
    loekz EQ ' ' AND
*         statu EQ 'N'
    werks IN @s_werks AND
    matnr IN @r_matnr1
    GROUP BY werks, matnr
    INTO TABLE @DATA(lt_eban).

    “在制品数量
    FIELD-SYMBOLS: <lt_data>  TYPE TABLE .
    DATA: ls_data TYPE REF TO DATA .
    TYPES: BEGIN OF ty_tab  ,
      dwerk   TYPE  werks_d,
      werks   TYPE ekpo-werks,
      matnr1  TYPE  afpo-matnr,
      zenmng2 TYPE  resb-enmng,
      matnr   TYPE  afpo-matnr,
      zdjsl   TYPE menge_d,
    END OF ty_tab .
    DATA :lt_tab TYPE TABLE OF ty_tab.
    DATA :lt_tab_dj TYPE TABLE OF ty_tab.
    DATA :lt_tab_tmp TYPE TABLE OF ty_tab.

    CLEAR lt_tab[] .
    SELECT werks FROM t001w WHERE werks IN @s_werks
    INTO TABLE @DATA(lt_wrk) .
    LOOP AT lt_wrk INTO DATA(lw_wrk).
      CALL METHOD cl_salv_bs_runtime_info=>set
      EXPORTING
        display  = abap_false
        metadata = abap_false
      DATA     = abap_true.

      SUBMIT zrppp_0015       ” Tcode ZPP015.
      WITH s_dwerk = lw_wrk-werks “s_werks-low
      WITH s_matnr1 IN r_matnr1
      AND RETURN.

      TRY.
        cl_salv_bs_runtime_info=>get_data_ref(
        IMPORTING r_data = ls_data ).
        ASSIGN ls_data->* TO <lt_data>.
      CATCH cx_salv_bs_sc_runtime_info.
*      MESSAGE 'Unable to retrieve ALV data' TYPE 'E'.
      ENDTRY.
      cl_salv_bs_runtime_info=>clear_all( ).

      IF <lt_data>[] IS NOT INITIAL .
        CLEAR lt_tab_tmp[].
        MOVE-CORRESPONDING <lt_data>[] TO lt_tab_tmp[] .
        APPEND LINES OF lt_tab_tmp TO lt_tab .
      ENDIF.
    ENDLOOP.

    “IQC待检
    CALL METHOD cl_salv_bs_runtime_info=>set
    EXPORTING
      display  = abap_false
      metadata = abap_false
    DATA     = abap_true.
    SUBMIT zrpmm_0009       ” Tcode ZPP015.
    WITH s_werks IN s_werks
    WITH s_matnr IN r_matnr1
    AND RETURN.
    TRY.
      cl_salv_bs_runtime_info=>get_data_ref(
      IMPORTING r_data = ls_data ).
      ASSIGN ls_data->* TO <lt_data>.
    CATCH cx_salv_bs_sc_runtime_info.
*      MESSAGE 'Unable to retrieve ALV data' TYPE 'E'.
    ENDTRY.
    cl_salv_bs_runtime_info=>clear_all( ).

    IF <lt_data>[] IS NOT INITIAL .
      CLEAR lt_tab_tmp[].
      MOVE-CORRESPONDING <lt_data>[] TO lt_tab_tmp[] .
      APPEND LINES OF lt_tab_tmp TO lt_tab_dj .
    ENDIF.
  ENDIF.

  DATA: lt_mrp_items LIKE bapi_mrp_items OCCURS 0 WITH HEADER LINE,
        lt_lines     LIKE bapi_mrp_ind_lines OCCURS 0 WITH HEADER LINE,
        lt_lines_po  LIKE bapi_mrp_ind_lines OCCURS 0 WITH HEADER LINE,
        lv_row       TYPE I,
        lv_matnr     TYPE matnr18.

  DATA: lv_percentage TYPE I VALUE 0,
        lv_lines      TYPE I.

  lv_lines = LINES( gt_tab ) .

  SELECT DISTINCT
  werzg AS werks,
  ortzg AS lgort
  FROM mdlv
  WHERE berty EQ '02' AND werzg IN @s_werks
  INTO TABLE @DATA(t_lgort_nd) .
  APPEND 'IEQ9999' TO t_lgort_nd .

  LOOP AT gt_tab ASSIGNING FIELD-SYMBOL(<sy_tab>).
    lv_matnr = <sy_tab>-matnr .

    ADD 1 TO lv_percentage .
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      percentage = lv_percentage
      TEXT       = '数据处理中…  ' && lv_row && ' / ' && lv_lines.
    IF lv_percentage = 100 .
      lv_percentage = 0 .
    ENDIF.
    IF <sy_tab>-mtart = 'Z011'.”20220505_LYS
      SELECT SINGLE SUM( plnmg ) INTO <sy_tab>-plnmg_01 FROM pbim JOIN pbed ON pbim~bdzei = pbed~bdzei WHERE matnr = <sy_tab>-matnr AND werks = <sy_tab>-werks.
    ENDIF.

    READ TABLE lt_makt INTO DATA(lw_makt) WITH KEY matnr = <sy_tab>-matnr .
    IF sy-subrc EQ 0.
      <sy_tab>-maktx = lw_makt-maktx .
    ENDIF.

    CLEAR:lt_mrp_items,lt_mrp_items[].
    CALL FUNCTION 'BAPI_MATERIAL_STOCK_REQ_LIST'
    EXPORTING
      material         = lv_matnr
      plant            = <sy_tab>-werks
      mrp_area         = <sy_tab>-berid
      get_item_details = 'X'
      get_ind_lines    = 'X'
      get_total_lines  = ''
*     IMPORTING
*       MRP_LIST         =
*       MRP_CONTROL_PARAM       =
*       MRP_STOCK_DETAIL =
*       RETURN           =
    TABLES
*       mrp_items        = lt_mrp_items
      mrp_ind_lines    = lt_lines
*       MRP_TOTAL_LINES  =
*       EXTENSIONOUT     =
      .

    CLEAR del_flag .

    “需求:计划独立需求
    PERFORM frm_qty_total TABLES lt_lines USING '2' '05' 'PP' '-' '' CHANGING <sy_tab>-plnmg .
    <sy_tab>-plnmg = 0 – <sy_tab>-plnmg .

    “需求:标准订单
    PERFORM frm_qty_total TABLES lt_lines USING '2' '03/05' 'VC/PR/RP/VJ/U1' '-' '' CHANGING <sy_tab>-zmeng .
    <sy_tab>-zmeng = 0 – <sy_tab>-zmeng .

    SELECT DISTINCT
    CAST( 'I' AS CHAR( 1 ) ) AS SIGN ,
    CAST( 'EQ' AS CHAR( 2 ) ) AS option ,
    a~lgort AS low,
    CAST( @space AS CHAR( 4 ) ) AS high
    FROM @t_lgort_nd AS a
    WHERE a~werks = @<sy_tab>-werks
    INTO TABLE @DATA(r_lgort_nd) .

    DELETE lt_lines WHERE storage_loc IN r_lgort_nd .
    “需求:预留
    PERFORM frm_qty_total TABLES lt_lines USING '2/0' '07/04/08/02' 'SB/BB/SH' '-/B' '' CHANGING <sy_tab>-bdmng .
    <sy_tab>-bdmng = 0 – <sy_tab>-bdmng .

    “需求:生产工单需求
    PERFORM frm_qty_total TABLES lt_lines USING '2' '04' 'AR' '-' '' CHANGING <sy_tab>-bdmng1 .
    <sy_tab>-bdmng1 = 0 – <sy_tab>-bdmng1 .

    “需求:小计
    <sy_tab>-zsum = <sy_tab>-plnmg + <sy_tab>-zmeng + <sy_tab>-bdmng + <sy_tab>-bdmng1 .

    “供给:O库存(供应商)
    READ TABLE lt_mslb INTO DATA(lw_mslb) WITH KEY werks = <sy_tab>-werks matnr = <sy_tab>-matnr .
    IF sy-subrc EQ 0.
      <sy_tab>-lblab = lw_mslb-sum_qty .
    ENDIF.

    “供给:当前可用库存(SW)
*    PERFORM frm_qty_total TABLES lt_lines USING '0' '01' 'WB' 'B' '' CHANGING <sy_tab>-labst .
*    <sy_tab>-labst = <sy_tab>-labst – <sy_tab>-lblab .
    READ TABLE lt_mard INTO DATA(lw_mard) WITH KEY werks = <sy_tab>-werks matnr = <sy_tab>-matnr .
      IF sy-subrc EQ 0 .
        <sy_tab>-labst = lw_mard-labst .
      ENDIF.

      “供给:生产工单
      PERFORM frm_qty_total TABLES lt_lines USING '1' '03' 'FE' '+' '' CHANGING <sy_tab>-gamng .

      “供给:计划订单
      PERFORM frm_qty_total TABLES lt_lines USING '1' '07' 'PA' '+' '' CHANGING <sy_tab>-gsmng .

      “小计
      <sy_tab>-zsum2 = <sy_tab>-gamng + <sy_tab>-gsmng .

      “供给:采购申请
      PERFORM frm_qty_total TABLES lt_lines USING '1' '06' 'BA' '+' '' CHANGING <sy_tab>-pr_qty .

      “供给:采购订单
      CLEAR lt_lines_po[].
      MOVE-CORRESPONDING lt_lines[] TO lt_lines_po[].
*    DELETE lt_lines_po WHERE sortind_01 NE '1' OR sortind_02 NE '04' OR mrp_element_ind NE 'BE' OR plus_minus NE '+'.
*    LOOP AT lt_lines_po INTO DATA(lw_lines_po).
*      DATA(lv_po) = lw_lines_po-elemnt_data+0(10) .
*      SELECT SINGLE bsart INTO @DATA(lv_bsart) FROM ekko WHERE ebeln = @lv_po.
*      IF lv_bsart = 'Z002'. “制样PO
*        DELETE lt_lines_po WHERE elemnt_data = lw_lines_po-elemnt_data .
*      ENDIF.
*    ENDLOOP.

      PERFORM frm_qty_total TABLES lt_lines_po USING '1' '03/04/05' 'BE/VT/U1' '+' '' CHANGING <sy_tab>-po_qty .
*    PERFORM frm_qty_total TABLES lt_lines_po USING '1' '04' 'BE' '+' '' CHANGING <sy_tab>-po_qty .

      “供给:小计
      <sy_tab>-zsum1 = <sy_tab>-labst + <sy_tab>-gamng  + <sy_tab>-gsmng + <sy_tab>-pr_qty + <sy_tab>-po_qty + <sy_tab>-lblab .

      “预计可用库存
      <sy_tab>-labst1 = <sy_tab>-zsum1 – <sy_tab>-zsum .

      IF gv_flag = 'X' .
        READ TABLE lt_mard_xb INTO lw_mard WITH KEY werks = <sy_tab>-werks matnr = <sy_tab>-matnr .
        IF sy-subrc EQ 0 .
          “线边仓库库存
          <sy_tab>-zz_xbc = lw_mard-labst .
        ENDIF.
        “大仓库存
        <sy_tab>-zz_dc = <sy_tab>-labst – <sy_tab>-zz_xbc .
        “WIP
        SELECT SUM( a~zenmng2 ) AS menge FROM @lt_tab AS a WHERE matnr1 = @<sy_tab>-matnr AND dwerk = @<sy_tab>-werks
        INTO @<sy_tab>-zz_wip .
        “IQC检验数量
        SELECT SUM( a~zdjsl ) AS menge FROM @lt_tab_dj AS a WHERE matnr = @<sy_tab>-matnr AND werks = @<sy_tab>-werks
        INTO @<sy_tab>-zz_iqc .
        “OPO
        <sy_tab>-zz_opo = <sy_tab>-po_qty – <sy_tab>-zz_iqc .
        “未转
        SELECT SUM( a~menge ) AS menge FROM @lt_eban AS a WHERE matnr = @<sy_tab>-matnr AND werks = @<sy_tab>-werks
        INTO @<sy_tab>-zz_wz .
        “销售未清数量
        <sy_tab>-zz_so = <sy_tab>-zmeng – <sy_tab>-labst .
      ENDIF.

      IF <sy_tab>-plnmg = 0  AND <sy_tab>-zmeng = 0  AND <sy_tab>-bdmng = 0  AND
      <sy_tab>-zsum = 0  AND <sy_tab>-labst = 0  AND <sy_tab>-lblab = 0  AND
      <sy_tab>-gamng = 0 AND <sy_tab>-gsmng = 0  AND <sy_tab>-zsum1 = 0  AND
      <sy_tab>-labst1 = 0 AND chk = 'X'.
        <sy_tab>-zflag = 'X' .
        IF chk = 'X'AND <sy_tab>-zz_wip > 0 .
          <sy_tab>-zflag = '' .
        ENDIF.
        IF <sy_tab>-zflag = 'X' .
          CHECK 1 = 2 .
        ENDIF.
      ENDIF.

      ADD 1 TO lv_row .
      <sy_tab>-znum = lv_row .
*    CLEAR <sy_tab> .
    ENDLOOP.

    IF chk = 'X'.
      DELETE gt_tab WHERE zflag = 'X' .
    ENDIF.

    lv_lines = LINES( gt_tab ) .
    MESSAGE '已查询数据行' && lv_lines TYPE 'S' .
  ENDFORM.
*&———————————————————————*
*& 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' ).

    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.
    DATA: lv_datatype TYPE datatype_d,
          s           TYPE scrtext_s,
          l           TYPE scrtext_l,
          M           TYPE scrtext_m.
    DEFINE mcr_setcoltext.
      TRY.
        s = &2 .
        l = &2 .
        M = &2 .
        gr_column ?= gr_columns->get_column( &1 ).
        gr_column->set_short_text( s ).
        gr_column->set_long_text( l ).
        gr_column->set_medium_text( M ).

        lv_datatype = gr_column->get_ddic_datatype( ) .
        IF lv_datatype = 'QUAN' OR lv_datatype = 'CURR'
        OR gr_column->get_ddic_inttype( ) = 'P'.
          gr_column->set_edit_mask( '==ZZERO' ).
        ENDIF.

      CATCH cx_salv_not_found .
      ENDTRY.
    END-OF-DEFINITION.
    DEFINE mcr_zzero.
      TRY.
        gr_column ?= gr_columns->get_column( &1 ).
        gr_column->set_edit_mask( '==ZZERO' ).
      CATCH cx_salv_not_found .
      ENDTRY.
    END-OF-DEFINITION.
    DATA: COLOR TYPE lvc_s_colo,
          c_col TYPE char3,
          c1    TYPE C,
          c2    TYPE C,
          c3    TYPE C.

    DEFINE mcr_color.
      TRY.
        c_col = &2 .
        c1 = c_col+0(1).
        c2 = c_col+1(1).
        c3 = c_col+2(1).
        COLOR-col = c1.
        COLOR-int = c2.
        COLOR-inv = c3.
        gr_column ?= gr_columns->get_column( &1 ).
        gr_column->set_color( COLOR ).
      CATCH cx_salv_not_found .
      ENDTRY.
    END-OF-DEFINITION.
    mcr_undisplay:'ZFLAG'.
    IF gv_flag = '' .
      mcr_undisplay: 'ZZ_XBC','ZZ_DC','ZZ_WIP','ZZ_IQC','ZZ_OPO','ZZ_WZ','ZZ_SO' .
    ELSE.
      mcr_setcoltext:
      'ZZ_XBC' '线边仓库库存',
      'ZZ_DC' '大仓库存',
      'ZZ_WIP' 'WIP',
      'ZZ_IQC' 'IQC检验数量',
      'ZZ_OPO' 'OPO',
      'ZZ_WZ' '未转',
      'ZZ_SO' '销售未清数量'.
      mcr_color:
      'ZZ_XBC' '410',
      'ZZ_DC' '410',
      'ZZ_WIP' '410',
      'ZZ_IQC' '410',
      'ZZ_OPO' '410',
      'ZZ_WZ' '410',
      'ZZ_SO' '410'.
    ENDIF.

    mcr_setcoltext:
    'ZNUM' '序号',
    'WERKS' '工厂',
    'MATNR' '物料编码',
    'MAKTX' '物料描述',
    'BERID' 'MRP范围',
    'DISPO' 'MRP控制者',
    'MTART' '物料类别',
    'PLNMG_01' '预测数量',
    'PLNMG' '需求:计划独立需求',
    'ZMENG' '需求:标准订单',
    'BDMNG' '需求:其它预留',
    'BDMNG1' '需求:生产工单预留',
    'ZSUM'  '需求:小计',
    'LABST' '供给:当前可用库存(SW)',
    'LBLAB' '供给:O库存(供应商)',
    'GAMNG' '供给:生产订单',
    'GSMNG' '供给:计划订单',
    'ZSUM2' '小计(生产工单+计划订单)',
    'PR_QTY' '供给:采购申请',
    'PO_QTY' '供给:采购订单',
    'ZSUM1' '供给:小计',
    'LABST1' '预计可用库存'.

*  mcr_zzero: 'PLNMG', 'ZMENG','BDMNG','ZSUM','LABST' ,'LBLAB' ,'GAMNG' ,'GSMNG' ,'ZSUM1','LABST1'.
    mcr_color: 'PLNMG' '300',
    'ZMENG' '300',
    'BDMNG' '300',
    'BDMNG1' '300',
    'ZSUM'  '300',
    'LABST' '500',
    'LBLAB' '500',
    'GAMNG' '500',
    'GSMNG' '500',
    'PR_QTY' '500',
    'PO_QTY' '500',
    'ZSUM1' '500',
    'PLNMG_01' '500' .

    “热点

    TRY.
      gr_column ?= gr_columns->get_column( 'MATNR' ).
      gr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
    CATCH cx_salv_not_found .
    ENDTRY.

    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.

*  TRY.
*      gr_columns->set_color_column( 'T_COLOR' ).
*    CATCH cx_salv_data_error.
*  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: 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_link_click FOR lr_event.
    SET HANDLER lr_handle_event->on_user_command FOR lr_event.

    gr_table->display( ).
  ENDFORM.
*&———————————————————————*
*& Form frm_check_input
*&———————————————————————*
*& text
*&———————————————————————*
*& –>  p1        text
*& <–  p2        text
*&———————————————————————*
  FORM frm_check_input .

*  “判断权限
*  gw_info-zauth_wrk = 'X'.
*  AUTHORITY-CHECK OBJECT 'ZAOPP_WRK'
*   ID 'ZWERKS' FIELD s_werks-low
*   ID 'ZACTIVE' FIELD 'X'.
*  IF sy-subrc <> 0.
*    gw_info-ztype = 'E'.
*    gw_info-zmsg = '您没有此工厂的BOM查询权限' .
*    gw_info-zauth_wrk = ''.
*  ENDIF.
    CLEAR gv_flag .
    SELECT SINGLE * FROM ztbc_wrk_config WHERE werks IN @s_werks AND cfg_type = 'A6' AND active = 'X'
    INTO @DATA(lw_config).
    IF sy-subrc EQ 0.
      gv_flag = 'X' .
    ENDIF.
  ENDFORM.
*&———————————————————————*
*& Form frm_qty_total
*&———————————————————————*
*& text
*&———————————————————————*
*&      –> LT_LINES
*&      –> P_
*&      –> P_
*&      –> P_
*&      –> P_
*&      –> P_
*&      <– <SY_TAB>_PLNMG
*&———————————————————————*
  FORM frm_qty_total  TABLES   pt_lines
  USING   sortind_01 sortind_02 mrp_element_ind plus_minus elemnt_data
  CHANGING pv_plnmg.
    DATA: lt_tab LIKE bapi_mrp_ind_lines OCCURS 0 WITH HEADER LINE,
          lw_tab TYPE bapi_mrp_ind_lines.

    DATA:BEGIN OF lt_sortind_01 OCCURS 0 ,
      sortind_01 TYPE  sort1,
    END OF lt_sortind_01 .
    RANGES: r_sort1 FOR  bapi_mrp_ind_lines-sortind_01 .
    SPLIT sortind_01 AT '/' INTO TABLE lt_sortind_01 .
    LOOP AT lt_sortind_01.
      INSERT VALUE #( SIGN = 'I' option = 'EQ' low = lt_sortind_01-sortind_01 ) INTO TABLE r_sort1.
    ENDLOOP.

    DATA:BEGIN OF lt_sortind_02 OCCURS 0 ,
      sortind_02 TYPE  sort2,
    END OF lt_sortind_02 .
    RANGES: r_sort2 FOR  bapi_mrp_ind_lines-sortind_02 .
    SPLIT sortind_02 AT '/' INTO TABLE lt_sortind_02 .
    LOOP AT lt_sortind_02.
      INSERT VALUE #( SIGN = 'I' option = 'EQ' low = lt_sortind_02-sortind_02 ) INTO TABLE r_sort2.
    ENDLOOP.

    DATA:BEGIN OF lt_element OCCURS 0 ,
      element_ind TYPE  delkz,
    END OF lt_element .
    RANGES: r_element FOR  bapi_mrp_ind_lines-mrp_element_ind .
    SPLIT mrp_element_ind AT '/' INTO TABLE lt_element .
    LOOP AT lt_element.
      INSERT VALUE #( SIGN = 'I' option = 'EQ' low = lt_element-element_ind ) INTO TABLE r_element.
    ENDLOOP.

    DATA:BEGIN OF lt_plus_minus OCCURS 0 ,
      plus_minus TYPE  plumi,
    END OF lt_plus_minus .
    RANGES: r_plus_minus FOR  bapi_mrp_ind_lines-plus_minus .
    SPLIT plus_minus AT '/' INTO TABLE lt_plus_minus .
    LOOP AT lt_plus_minus.
      INSERT VALUE #( SIGN = 'I' option = 'EQ' low = lt_plus_minus-plus_minus ) INTO TABLE r_plus_minus.
    ENDLOOP.

    DATA: WHERE TYPE TABLE OF edpline .
    APPEND 'sortind_01 IN r_sort1 AND sortind_02 IN r_sort2  ' TO WHERE .
    APPEND 'AND mrp_element_ind IN r_element AND plus_minus IN r_plus_minus ' TO WHERE .
    IF NOT elemnt_data IS INITIAL.
      APPEND 'AND elemnt_data+0(3) = elemnt_data ' TO WHERE .
    ENDIF.

    MOVE-CORRESPONDING pt_lines[] TO lt_tab[] .
    CLEAR:pv_plnmg .
    LOOP AT lt_tab INTO lw_tab WHERE (WHERE) .
*    sortind_01 = sortind_01 AND sortind_02 IN r_sort2  AND mrp_element_ind IN r_element AND
*                                   plus_minus = plus_minus AND elemnt_data = elemnt_data .
      pv_plnmg = pv_plnmg + lw_tab-rec_reqd_qty.
    ENDLOOP.
  ENDFORM.
*&———————————————————————*
*& Form handle_user_command
*&———————————————————————*
*& text
*&———————————————————————*
*&      –> E_SALV_FUNCTION
*&———————————————————————*
  FORM handle_user_command  USING    p_e_salv_function.
    BREAK guoxiongjie .

  ENDFORM.
*&———————————————————————*
*& Form handle_link_click
*&———————————————————————*
*& text
*&———————————————————————*
*&      –> ROW
*&      –> COLUMN
*&———————————————————————*
  FORM handle_link_click  USING    p_row
        p_column.
    IF p_column = 'MATNR'.
      READ TABLE gt_tab INTO DATA(lw_tab) INDEX p_row .
      IF sy-subrc EQ 0.
        SET PARAMETER ID 'MAT'   FIELD lw_tab-matnr.
        SET PARAMETER ID 'WRK'   FIELD lw_tab-werks.
        SET PARAMETER ID 'BERID' FIELD lw_tab-berid.
        CALL TRANSACTION 'MD04' AND SKIP FIRST SCREEN.
      ENDIF.
    ENDIF.
  ENDFORM.

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容