PP-零件预测需求报表(开发笔记)

*&---------------------------------------------------------------------*
*& Report ZMMR102
*&---------------------------------------------------------------------*
*& Author              :  NathanSun
*& Create Date         :  2020-01-03
*& Program Type        :  Report
*& Description         :  零件预测需求报表
*&---------------------------------------------------------------------*
REPORT ZPPR010C.
*&---------------------------------------------------------------------*
*& 包含               YN_TEST02_TOP
*&---------------------------------------------------------------------*
TABLES:MARA,STKO,MARC.

TYPE-POOLS:SLIS,T001W.
DATANUM TYPE I .

"定义ALV输出所需变量
DATAS_LAYOUT    TYPE LVC_S_LAYO,
      GT_FIELDCAT TYPE LVC_T_FCAT,
      IS_VARIANT  TYPE DISVARIANT.

DATA:  GV_FIELDNAME   TYPE C LENGTH 20 .
DATA:  GV_DESCRIPTION TYPE C LENGTH 20 .
DATA:  GV_ZQUAN       TYPE ZQUAN .

DATAMRP_ITEMS       LIKE BAPI_MRP_ITEMS     OCCURS WITH HEADER LINE  .
DATAMRP_ITEMS_C     LIKE BAPI_MRP_ITEMS     OCCURS WITH HEADER LINE  .
DATAMRP_IND_LINES   LIKE BAPI_MRP_IND_LINES OCCURS WITH HEADER LINE  .
DATAMRP_IND_LINES_C LIKE BAPI_MRP_IND_LINES OCCURS WITH HEADER LINE  .
DATAGT_MARC TYPE TABLE OF MARC WITH HEADER LINE.
DATAGT_MARC_A TYPE TABLE OF MARC WITH HEADER LINE.
DATAGT_MARA TYPE TABLE OF MARA WITH HEADER LINE.
DATAGT_MAKT TYPE TABLE OF MAKT WITH HEADER LINE.

DATALV_YEAR   TYPE NUMC4.
DATALV_MONTH1 TYPE NUMC2.
DATALV_DATS   TYPE DATS.
DATALV_DATSA  TYPE DATS.

"定义指针
FIELD-SYMBOLS :<FT_VB>      TYPE STANDARD TABLE,  "内表
               <FS_VB>      TYPE ANY,             "结构
               <DYN_FIELD>  TYPE ANY,             "字段
               <DYN_FIELDA> TYPE ANY,             "字段
               <DYN_FIELDB> TYPE ANY,             "字段
               <DYN_FIELDC> TYPE ANY,             "字段
               <DYN_FIELDD> TYPE ANY.             "字段

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
SELECT-OPTIONSS_WERKS  FOR   MARC-WERKS   MODIF ID C1 OBLIGATORY.                        "工厂
SELECT-OPTIONSS_MATNR  FOR   MARC-MATNR   MODIF ID C1 .                                  "物料
SELECT-OPTIONSS_DISPO  FOR   MARC-DISPO   MODIF ID C1 .                                  "MRP控制员
SELECT-OPTIONSS_ERSDA  FOR   MARA-ERSDA   MODIF ID C1 OBLIGATORY.                        "日期(选择日期的当月)
*PARAMETERS:     P_ERSDA  LIKE  MARA-ERSDA   MODIF ID C1 OBLIGATORY.                        "起始日期(选择日期的当月)
*PARAMETERS:     P_NUM    TYPE  CHAR2        MODIF ID C1 OBLIGATORY.                        "查询月数
PARAMETERS:     CH_01 AS CHECKBOX DEFAULT ''.                                              "工厂合并查询
SELECTION-SCREEN END OF BLOCK B1.

AT SELECTION-SCREEN.

  LOOP AT S_ERSDA.
    IF S_ERSDA-HIGH IS INITIAL .
      S_ERSDA-HIGH S_ERSDA-LOW .
    ENDIF.
    S_ERSDA-LOW+6(2) = '01' .
    S_ERSDA-HIGH+6(2) = '27'.
    S_ERSDA-HIGH S_ERSDA-HIGH + 6.
    S_ERSDA-HIGH+6(2) = '01'.
    S_ERSDA-HIGH S_ERSDA-HIGH 1.
    MODIFY S_ERSDA .
  ENDLOOP.

  LV_YEAR   S_ERSDA-HIGH+0(4S_ERSDA-LOW+0(4) .
  LV_MONTH1 S_ERSDA-HIGH+4(2S_ERSDA-LOW+4(2+ LV_YEAR * 12 .

  NUM LV_MONTH1 + 1.
  IF NUM > 12.
    MESSAGE '日期范围不可超过12个月!' TYPE 'E'.
  ENDIF.

FORM FOM_GETDATA .
  DATA:  GV_FIELDNAME   TYPE C LENGTH 20 .
  CLEAR GT_MARC[].
  SELECT WERKS MATNR DISPO INTO CORRESPONDING FIELDS OF TABLE GT_MARC[] FROM MARC
    
WHERE WERKS IN S_WERKS
      
AND MATNR IN S_MATNR
      
AND DISPO IN S_DISPO
      
.

  IF CH_01 IS INITIAL.

    SORT GT_MARC[] BY WERKS MATNR DISPO .
    DELETE ADJACENT DUPLICATES FROM GT_MARC[] COMPARING WERKS MATNR .

    LOOP AT GT_MARC.
      CLEAR GT_MAKT.
      SELECT SINGLE MAKTX INTO GT_MAKT-MAKTX FROM MAKT
        
WHERE MATNR GT_MARC-MATNR
        
.
      CLEAR GT_MARA.
      SELECT SINGLE MEINS INTO GT_MARA-MEINS FROM MARA
        
WHERE MATNR GT_MARC-MATNR
        
.

      ASSIGN COMPONENT 'MATNR' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        <DYN_FIELD> GT_MARC-MATNR .
      ENDIF .

      ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        <DYN_FIELD> GT_MAKT-MAKTX .
      ENDIF .

      ASSIGN COMPONENT 'WERKS' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        <DYN_FIELD> GT_MARC-WERKS .
      ENDIF .

      ASSIGN COMPONENT 'DISPO' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        <DYN_FIELD> GT_MARC-DISPO .
      ENDIF .

      ASSIGN COMPONENT 'MEINS' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        <DYN_FIELD> GT_MARA-MEINS .
      ENDIF .

      ASSIGN COMPONENT 'ERSDA' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        <DYN_FIELD> SY-DATUM .
      ENDIF .

      CLEAR MRP_ITEMS[].
      CLEAR MRP_IND_LINES[].
      CALL FUNCTION 'BAPI_MATERIAL_STOCK_REQ_LIST'
        EXPORTING
          MATERIAL_LONG    GT_MARC-MATNR
          PLANT            
GT_MARC-WERKS
          GET_ITEM_DETAILS 
'X'
        TABLES
          MRP_ITEMS        MRP_ITEMS[]
          MRP_IND_LINES    
MRP_IND_LINES[].

      LOOP AT MRP_IND_LINES WHERE AVAIL_DATE IN S_ERSDA.
*.按物料+工厂+月份 汇总物料数量为负的需求数
        IF MRP_IND_LINES-MRP_ELEMNT 'Stock' OR MRP_IND_LINES-MRP_ELEMNT 'CustSt'.
          ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
          IF SY-SUBRC .
            <DYN_FIELD> <DYN_FIELD> + MRP_IND_LINES-AVAIL_QTY1 .
          ENDIF .

        ELSE.

*按物料+工厂+月份 汇总物料数量>0的供给数 计算为具体月份的:XXMRP供给
          IF MRP_IND_LINES-REC_REQD_QTY > 0.

            CONCATENATE  MRP_IND_LINES-SORT_DATE+(6'_MONTM' INTO GV_FIELDNAME .
            ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
            IF SY-SUBRC .
              <DYN_FIELD> <DYN_FIELD> + MRP_IND_LINES-REC_REQD_QTY .
            ENDIF .

          ELSE.
*XX月份预测 计算逻辑A 已取得当月需求数(正数)
            MRP_IND_LINES-REC_REQD_QTY MRP_IND_LINES-REC_REQD_QTY * -1.
            CONCATENATE  MRP_IND_LINES-SORT_DATE+(6'_MONTX' INTO GV_FIELDNAME .
            ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
            IF SY-SUBRC .
              <DYN_FIELD> <DYN_FIELD> + MRP_IND_LINES-REC_REQD_QTY .
            ENDIF .

          ENDIF.
        ENDIF.

        CLEAR MRP_IND_LINES .

      ENDLOOP.

      月份
      LV_DATS S_ERSDA-LOW.
      CLEAR GV_ZQUAN.
*库存结存数 初始值
      ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        GV_ZQUAN <DYN_FIELD> .
      ENDIF .

      DO 12 TIMES .
        IF LV_DATS <= S_ERSDA-HIGH.

          IF LV_DATS(6) = S_ERSDA-LOW(6) .
*首月:当月需求数(正数)-可用库存数

*当月需求数(正数)
            CONCATENATE  LV_DATS(6'_MONTX' INTO GV_FIELDNAME .
            ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDA> .
            IF SY-SUBRC .

*可用库存数
              ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELDB> .
              IF SY-SUBRC .

*XX月份预测
                CONCATENATE  LV_DATS(6'_MONTH' INTO GV_FIELDNAME .
                ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
                IF SY-SUBRC 0.
                  <DYN_FIELD> <DYN_FIELDA> <DYN_FIELDB> .
                ENDIF.
              ENDIF.

*库存结存数  = 库存结存数-(本月需求数*-1
              GV_ZQUAN GV_ZQUAN <DYN_FIELDA> .
            ENDIF .

          ELSE .
            LV_DATSA LV_DATS.
            LV_DATSA+6(2) = '01'.
            LV_DATSA LV_DATSA 1.
*XX月份预测 计算逻辑: 当月需求数(正数)+查询月份范围内的前月份需求数汇总数-可用库存数-查询月份范围内的前月份XX月份预测数汇总数

*当月需求数(正数)
            CONCATENATE  LV_DATS(6'_MONTX' INTO GV_FIELDNAME .
            ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDA> .
            IF SY-SUBRC .

*可用库存数
*              ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELDB> .
*              IF SY-SUBRC = 0 .

**查询月份范围内的前月份需求数汇总数
*                CONCATENATE  LV_DATSA(6) '_MONTX' INTO GV_FIELDNAME .
*                ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDC> .
*                IF SY-SUBRC = 0.
*
**查询月份范围内的前月份XX月份预测数汇总数
*                  CONCATENATE  LV_DATSA(6) '_MONTH' INTO GV_FIELDNAME .
*                  ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDD> .
*                  IF SY-SUBRC = 0.
*XX月份预测
                CONCATENATE  LV_DATS(6'_MONTH' INTO GV_FIELDNAME .
                ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
                IF SY-SUBRC 0.

*if  库存结存数 -(本月需求数*-1>0
                  IF GV_ZQUAN <DYN_FIELDA> > 0.

*本月预测数=(本月需求数*-1 )- 库存结存数变量
                    <DYN_FIELD> <DYN_FIELDA> GV_ZQUAN.
                  ELSE.
*第二个月预测数 = 第二个月需求数*-1
                    <DYN_FIELD> <DYN_FIELDA> .
                  ENDIF.

                ENDIF.
*                  ENDIF.
*                ENDIF.
*              ENDIF.
*库存结存数  = 库存结存数-(本月需求数*-1
              GV_ZQUAN GV_ZQUAN <DYN_FIELDA> .
            ENDIF .

          ENDIF.
        ENDIF.
        LV_DATS+6(2) = '27'.
        LV_DATS LV_DATS + 6.
        LV_DATS+6(2) = '01'.
      ENDDO.

      APPEND <FS_VB> TO <FT_VB> .
      CLEAR  <FS_VB> .

      CLEAR  GT_MARC .
    ENDLOOP.

  ELSE .

    GT_MARC_A[] GT_MARC[].
    SORT GT_MARC[] BY MATNR .
    DELETE ADJACENT DUPLICATES FROM GT_MARC[] COMPARING MATNR .

    LOOP AT GT_MARC.
      CLEAR GT_MAKT.
      SELECT SINGLE MAKTX INTO GT_MAKT-MAKTX FROM MAKT
        
WHERE MATNR GT_MARC-MATNR
        
.
      CLEAR GT_MARA.
      SELECT SINGLE MEINS INTO GT_MARA-MEINS FROM MARA
        
WHERE MATNR GT_MARC-MATNR
        
.

      ASSIGN COMPONENT 'MATNR' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        <DYN_FIELD> GT_MARC-MATNR .
      ENDIF .

      ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        <DYN_FIELD> GT_MAKT-MAKTX .
      ENDIF .

      ASSIGN COMPONENT 'DISPO' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        <DYN_FIELD> GT_MARC-DISPO .
      ENDIF .

      ASSIGN COMPONENT 'MEINS' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        <DYN_FIELD> GT_MARA-MEINS .
      ENDIF .

      ASSIGN COMPONENT 'ERSDA' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        <DYN_FIELD> SY-DATUM .
      ENDIF .

      CLEAR MRP_ITEMS[].
      CLEAR MRP_IND_LINES[].
      LOOP AT GT_MARC_A WHERE MATNR GT_MARC-MATNR .
        CLEAR MRP_ITEMS_C[].
        CLEAR MRP_IND_LINES_C[].
        CALL FUNCTION 'BAPI_MATERIAL_STOCK_REQ_LIST'
          EXPORTING
            MATERIAL_LONG    GT_MARC-MATNR
            PLANT            
GT_MARC_A-WERKS
            GET_ITEM_DETAILS 
'X'
          TABLES
            MRP_ITEMS        MRP_ITEMS_C[]
            MRP_IND_LINES    
MRP_IND_LINES_C[].

        APPEND LINES OF MRP_ITEMS_C[] TO MRP_ITEMS[] .
        APPEND LINES OF MRP_IND_LINES_C[] TO MRP_IND_LINES[] .
      ENDLOOP.


      LOOP AT MRP_IND_LINES WHERE AVAIL_DATE IN S_ERSDA.
*.按物料+工厂+月份 汇总物料数量为负的需求数
        IF MRP_IND_LINES-MRP_ELEMNT 'Stock' OR MRP_IND_LINES-MRP_ELEMNT 'CustSt'.
          ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
          IF SY-SUBRC .
            <DYN_FIELD> <DYN_FIELD> + MRP_IND_LINES-AVAIL_QTY1 .
          ENDIF .

        ELSE.

*按物料+工厂+月份 汇总物料数量>0的供给数 计算为具体月份的:XXMRP供给
          IF MRP_IND_LINES-REC_REQD_QTY > 0.

            CONCATENATE  MRP_IND_LINES-SORT_DATE+(6'_MONTM' INTO GV_FIELDNAME .
            ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
            IF SY-SUBRC .
              <DYN_FIELD> <DYN_FIELD> + MRP_IND_LINES-REC_REQD_QTY .
            ENDIF .
          ELSE.
*当月需求数(正数)
            MRP_IND_LINES-REC_REQD_QTY MRP_IND_LINES-REC_REQD_QTY * -1.
            CONCATENATE  MRP_IND_LINES-SORT_DATE+(6'_MONTX' INTO GV_FIELDNAME .
            ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
            IF SY-SUBRC .
              <DYN_FIELD> <DYN_FIELD> + MRP_IND_LINES-REC_REQD_QTY .
            ENDIF .

          ENDIF.
        ENDIF.

        CLEAR MRP_IND_LINES .

      ENDLOOP.

      月份
      LV_DATS S_ERSDA-LOW.
      CLEAR GV_ZQUAN.
*库存结存数 初始值
      ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
      IF SY-SUBRC .
        GV_ZQUAN <DYN_FIELD> .
      ENDIF .

      DO 12 TIMES .
        IF LV_DATS <= S_ERSDA-HIGH.

          IF LV_DATS(6) = S_ERSDA-LOW(6) .
*首月:当月需求数(正数)-可用库存数

*当月需求数(正数)
            CONCATENATE  LV_DATS(6'_MONTX' INTO GV_FIELDNAME .
            ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDA> .
            IF SY-SUBRC .

*可用库存数
              ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELDB> .
              IF SY-SUBRC .

*XX月份预测
                CONCATENATE  LV_DATS(6'_MONTH' INTO GV_FIELDNAME .
                ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
                IF SY-SUBRC 0.
                  <DYN_FIELD> <DYN_FIELDA> <DYN_FIELDB> .
                ENDIF.
              ENDIF.

*库存结存数  = 库存结存数-(本月需求数*-1
              GV_ZQUAN GV_ZQUAN <DYN_FIELDA> .
            ENDIF .

          ELSE .
            LV_DATSA LV_DATS.
            LV_DATSA+6(2) = '01'.
            LV_DATSA LV_DATSA 1.
*XX月份预测 计算逻辑: 当月需求数(正数)+查询月份范围内的前月份需求数汇总数-可用库存数-查询月份范围内的前月份XX月份预测数汇总数

*当月需求数(正数)
            CONCATENATE  LV_DATS(6'_MONTX' INTO GV_FIELDNAME .
            ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDA> .
            IF SY-SUBRC .

*可用库存数
*              ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELDB> .
*              IF SY-SUBRC = 0 .

**查询月份范围内的前月份需求数汇总数
*                CONCATENATE  LV_DATSA(6) '_MONTX' INTO GV_FIELDNAME .
*                ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDC> .
*                IF SY-SUBRC = 0.
*
**查询月份范围内的前月份XX月份预测数汇总数
*                  CONCATENATE  LV_DATSA(6) '_MONTH' INTO GV_FIELDNAME .
*                  ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDD> .
*                  IF SY-SUBRC = 0.
*XX月份预测
                CONCATENATE  LV_DATS(6'_MONTH' INTO GV_FIELDNAME .
                ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
                IF SY-SUBRC 0.

*if  库存结存数 -(本月需求数*-1>0
                  IF GV_ZQUAN <DYN_FIELDA> > 0.

*本月预测数=(本月需求数*-1 )- 库存结存数变量
                    <DYN_FIELD> <DYN_FIELDA> GV_ZQUAN.
                  ELSE.
*第二个月预测数 = 第二个月需求数*-1
                    <DYN_FIELD> <DYN_FIELDA> .
                  ENDIF.

                ENDIF.
*                  ENDIF.
*                ENDIF.
*              ENDIF.
*库存结存数  = 库存结存数-(本月需求数*-1
              GV_ZQUAN GV_ZQUAN <DYN_FIELDA> .
            ENDIF .

          ENDIF.
        ENDIF.
        LV_DATS+6(2) = '27'.
        LV_DATS LV_DATS + 6.
        LV_DATS+6(2) = '01'.
      ENDDO.

      APPEND <FS_VB> TO <FT_VB> .
      CLEAR  <FS_VB> .

      CLEAR  GT_MARC .
    ENDLOOP.

  ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_SETFIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FOM_SETFIELDCAT .

  DELETE GT_FIELDCAT[] WHERE FIELDNAME+6(6) = '_MONTX'.

  IF CH_01 IS NOT INITIAL.
    DELETE GT_FIELDCAT[] WHERE FIELDNAME 'WERKS' OR FIELDNAME 'DISPO'.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY .
  CLEAR S_LAYOUT.
  S_LAYOUT-ZEBRA 'X'.
*  S_LAYOUT-CWIDTH_OPT = 'X'.
  S_LAYOUT-CTAB_FNAME 'CELLCOLOR'"单元格颜色内表字段
  S_LAYOUT-STYLEFNAME 'STYLE'.     "内部表字段的字段名称
*  s_layout-box_fieldname    = 'BOX'.

*  W_EVENTS-NAME = 'CALLER_EXIT'.   "slis_ev_caller_exit_at_start事件
*  W_EVENTS-FORM = 'FM_BUTTON'.
*  APPEND W_EVENTS TO I_EVENTS .

  CLEAR IS_VARIANT .
  IS_VARIANT-REPORT SY-REPID.
  IS_VARIANT-HANDLE '1'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_SAVE                   'A'
      IS_VARIANT               IS_VARIANT
      IS_LAYOUT_LVC            
S_LAYOUT
      IT_FIELDCAT_LVC          
GT_FIELDCAT
      I_CALLBACK_PROGRAM       
SY-REPID
*     IT_EVENTS                = I_EVENTS
      I_CALLBACK_PF_STATUS_SET 'PF_STATUS_SET'
*     i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
      I_CALLBACK_USER_COMMAND  'USER_COMMAND'
    TABLES
      T_OUTTAB                 <FT_VB>.
ENDFORM.

FORM FRM_FILL_FIELD .
  DATA:  WA_FIELDCAT    TYPE LVC_T_FCAT WITH HEADER LINE.

  DEFINE FILL_FIELD.
    WA_FIELDCAT-FIELDNAME     &1.
    WA_FIELDCAT-SCRTEXT_L     &2.
    WA_FIELDCAT-REF_TABLE     &3.
    WA_FIELDCAT-REF_FIELD     &4.
    WA_FIELDCAT-OUTPUTLEN     &5.
    IF WA_FIELDCAT-FIELDNAME 'ZKYKC'.
      WA_FIELDCAT-SCRTEXT_S     WA_FIELDCAT-SCRTEXT_L(2).
      WA_FIELDCAT-SCRTEXT_M     WA_FIELDCAT-SCRTEXT_L(6).
    ELSE.
      WA_FIELDCAT-SCRTEXT_S     WA_FIELDCAT-SCRTEXT_L(4).
      WA_FIELDCAT-SCRTEXT_M     WA_FIELDCAT-SCRTEXT_L(7).
    ENDIF.

    APPEND WA_FIELDCAT TO GT_FIELDCAT.
    CLEAR WA_FIELDCAT.
  END-OF-DEFINITION.

  DATA LV_MONTH TYPE N LENGTH .
  FILL_FIELD  'MATNR'   '物料'        'MARC' 'MATNR' '20'.
  FILL_FIELD  'MAKTX'   '物料描述'    'MAKT' 'MAKTX' '20'.
  IF CH_01 IS INITIAL.
    FILL_FIELD  'WERKS'   '工厂'      'MARC'   'WERKS' '10'.
  ENDIF.
  FILL_FIELD  'DISPO'   'MRP控制员'   'MARC'   'DISPO' '10'.
  FILL_FIELD  'ERSDA'   '查询日期'    'MARA'   'ERSDA' '10'.
  FILL_FIELD  'MEINS'   '库存单位'    'MARA'   'MEINS' '10'.
  FILL_FIELD  'ZKYKC'   '可用库存'     'ZTFIELD'   'ZQUAN' '15'.

  月份
  LV_DATS S_ERSDA-LOW.
  DO 12 TIMES .
    IF LV_DATS <= S_ERSDA-HIGH.
      CLEAR GV_FIELDNAME .
      CLEAR GV_DESCRIPTION .
      CONCATENATE  LV_DATS+(6'_MONTH' INTO GV_FIELDNAME .
      CONCATENATE  LV_DATS+(4'LV_DATS+4(2'月预测INTO GV_DESCRIPTION .
      FILL_FIELD  GV_FIELDNAME  GV_DESCRIPTION   'ZTFIELD'   'ZQUAN' '20' .
    ENDIF.
    LV_DATS+6(2) = '27'.
    LV_DATS LV_DATS + 6.
    LV_DATS+6(2) = '01'.
  ENDDO.

  LV_DATS S_ERSDA-LOW.
  DO 12 TIMES .
    IF LV_DATS <= S_ERSDA-HIGH.
      CLEAR GV_FIELDNAME .
      CLEAR GV_DESCRIPTION .
      CONCATENATE  LV_DATS+(6'_MONTX' INTO GV_FIELDNAME .
      CONCATENATE  LV_DATS+(4'LV_DATS+4(2'月需求INTO GV_DESCRIPTION .
      FILL_FIELD  GV_FIELDNAME  GV_DESCRIPTION   'ZTFIELD'   'ZQUAN' '20' .
    ENDIF.
    LV_DATS+6(2) = '27'.
    LV_DATS LV_DATS + 6.
    LV_DATS+6(2) = '01'.
  ENDDO.

  LV_DATS S_ERSDA-LOW.
  DO 12 TIMES .
    IF LV_DATS <= S_ERSDA-HIGH.
      CLEAR GV_FIELDNAME .
      CLEAR GV_DESCRIPTION .
      CONCATENATE  LV_DATS+(6'_MONTM' INTO GV_FIELDNAME .
      CONCATENATE  LV_DATS+(4'LV_DATS+4(2'MRP供给INTO GV_DESCRIPTION .
      FILL_FIELD  GV_FIELDNAME  GV_DESCRIPTION 'ZTFIELD'   'ZQUAN' '20'.
    ENDIF.
    LV_DATS+6(2) = '27'.
    LV_DATS LV_DATS + 6.
    LV_DATS+6(2) = '01'.
  ENDDO.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  BUILD_DYNMIC_TABLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
创建动态内表
FORM BUILD_DYNAMIC_TABLE "调用静态方法 CREATE_DYNAMIC_TABLE

  DATA LT_NEW_TABLE TYPE REF TO DATA .
  DATA LS_NEW_LINE  TYPE REF TO DATA .

  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    
EXPORTING
*     I_STYLE_TABLE             =
      IT_FIELDCATALOG           GT_FIELDCAT   "输入FIELDCATALOG 将返回一个动态内表
*     I_LENGTH_IN_BYTE          =
    IMPORTING
      EP_TABLE                  LT_NEW_TABLE  "获取返回的动态内表 ()
*     E_STYLE_FNAME             =
    EXCEPTIONS
      GENERATE_SUBPOOL_DIR_FULL 1
      OTHERS                    2.

  IF SY-SUBRC <> 0.
    EXIT.
* Implement suitable error handling here
  ENDIF.

  ASSIGN LT_NEW_TABLE->TO <FT_VB> .     "LT_NEW_TABLE 中的所有都被指向<FT_VB>(动态内表)

  CREATE DATA LS_NEW_LINE LIKE LINE OF <FT_VB> .
  ASSIGN LS_NEW_LINE->TO <FS_VB> .      "LS_NEW_LINE 中的所有都被指向<FS_VB> (动态内表结构)

ENDFORM.                    " BUILD_DYNMIC_TABLE

FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.

FORM USER_COMMAND USING I_UCOMM LIKE SY-UCOMM
                    IS_SELFIELD 
TYPE SLIS_SELFIELD.
  DATAREF TYPE REF TO CL_GUI_ALV_GRID.
  DATA LV_STABLE TYPE LVC_S_STBL.   "刷新稳定性
  RANGESL_WERKS FOR T001W-WERKS.
  RANGESL_MATNR FOR MARA-MATNR.
  DATA:L_BUKRS TYPE T001K-BUKRS.

  LV_STABLE-ROW '1'.
  LV_STABLE-COL '1'.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID REF.
  CALL METHOD REF->CHECK_CHANGED_DATA.

  CASE I_UCOMM.
    WHEN '&IC1'."表示双击

    WHEN 'POST_T'.
  ENDCASE.

  CALL METHOD REF->REFRESH_TABLE_DISPLAY
    
EXPORTING
      IS_STABLE LV_STABLE.
ENDFORM.

INITIALIZATION .

START-OF-SELECTION.
  PERFORM FRM_FILL_FIELD .
  PERFORM BUILD_DYNAMIC_TABLE .
  PERFORM FOM_GETDATA .
  PERFORM FOM_SETFIELDCAT .
  PERFORM FRM_DISPLAY.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值