SAP ABAP ALV构建动态输出列与构建动态内表

来源:互联网 发布:用c语言写求整数绝对值 编辑:程序博客网 时间:2024/05/21 07:54
首先,简单说明一下要用到的表类型、类、函数:

表类型
LVC_T_FCAT-(存放自定义列属性的表类型,一般用到的属性有:FIELDNAME、OUTPUTLEN、DATATYPE、INTTYPE、INTLEN、DECIMALS)。
       LVC_S_FCAT- (LVC_T_FCAT类型的工作区类型)。
       CL_ABAP_TABLEDESCR-(内表结构属性操作类,比如可以读取内表的列名称、内表值、内表列属性等等)。
CL_ABAP_STRUCTDESCR-(CL_ABAP_TABLEDESCR的工作区类型)。
函数
CONVERSION_EXIT_CUNIT_OUTPUT-(单位输出转换)。
        CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA内表 ):获取CL_ABAP_TABLEDESCR对象。
        CL_ABAP_TABLEDESCR对象->GET_TABLE_LINE_TYPE):获取CL_ABAP_STRUCTDESCR对象(注意函数括号里面的空格)。
        REUSE_ALV_GRID_DISPLAY:ALV显示内表结果。
        REUSE_ALV_COMMENTARY_WRITE:ALV抬头信息。
下面是一个开发实例的SAMPLE,根据给出的BOM循环查找BOM下面的所有最底层物料,根据工厂存在的物料价格动态地输出相应的列:
*&---------------------------------------------------------------------*
*& Report  ZCOR017
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZCOR017.
TABLES:MAST,STPO.
TYPE-POOLSSLIS.

*****************************TYPES*****************************************
TYPES:BEGIN OF TY_STPO,
  STLNR TYPE STPO-STLNR,
  STLTY TYPE STPO-STLTY,
  STLKN TYPE STPO-STLKN,
  STPOZ TYPE STPO-STPOZ,
  IDNRK TYPE STPO-IDNRK,
END OF TY_STPO.

TYPES:BEGIN OF TY_MAST,
  MATNR TYPE MAST-MATNR,
  WERKS TYPE MAST-WERKS,
  STLAN TYPE MAST-STLAN,
  STLNR TYPE MAST-STLNR,
END OF TY_MAST.

TYPES:BEGIN OF TY_MAKT,
  MATNR TYPE MAKT-MATNR,
  MAKTX TYPE MAKT-MAKTX,
END OF TY_MAKT.

TYPES:BEGIN OF TY_MARA,
  MATNR TYPE MARA-MATNR,
  MEINS TYPE MARA-MEINS,
END OF TY_MARA.

TYPES:BEGIN OF TY_T001K,
  BWKEY TYPE T001K-BWKEY,
END OF TY_T001K.

TYPES:BEGIN OF TY_MBEW,
  MATNR TYPE MBEW-MATNR,
  BWKEY TYPE MBEW-BWKEY,
  STPRS TYPE MBEW-STPRS,
  PEINH TYPE MBEW-PEINH,
END OF TY_MBEW.

*****************************DATA*****************************************
DATA:
      GT_STPO TYPE TABLE OF TY_STPO,
      GS_STPO TYPE TY_STPO,
      LT_STPO TYPE TABLE OF TY_STPO,
      LS_STPO TYPE TY_STPO,
      GT_MAST TYPE TABLE OF TY_MAST,
      GS_MAST TYPE TY_MAST,
      LT_MAST TYPE TABLE OF TY_MAST,
      LS_MAST TYPE TY_MAST,
      GT_MAKT TYPE TABLE OF TY_MAKT,
      GS_MAKT TYPE TY_MAKT,
      GT_MARA TYPE TABLE OF TY_MARA,
      GS_MARA TYPE TY_MARA,
      GT_T001K TYPE TABLE OF TY_T001K,
      GS_T001K TYPE TY_T001K,
      GT_MBEW TYPE TABLE OF TY_MBEW,
      GS_MBEW TYPE TY_MBEW,
      DNY_TAB TYPE REF TO DATA,
      DNY_LINE TYPE REF TO DATA,
      IFC     TYPE LVC_T_FCAT,
      XFC     TYPE LVC_S_FCAT,
      GS_LAYOUT TYPE SLIS_LAYOUT_ALV,
      GT_FIELD TYPE SLIS_T_FIELDCAT_ALV,
      GS_FIELD LIKE LINE OF GT_FIELD,
      COUNTER TYPE VALUE 0,
      GV_STC_DESC TYPE REF TO CL_ABAP_STRUCTDESCR,
      GV_TAB_DESC TYPE REF TO CL_ABAP_TABLEDESCR,
      GT_TOP TYPE SLIS_T_LISTHEADER,
      GS_TOP TYPE SLIS_LISTHEADER.
.

******************************DEFINETION****************************************

DEFINE DF_LVC_FCAT.
  XFC-FIELDNAME &1.
  XFC-DATATYPE  &2.
  XFC-INTTYPE   &3.
  XFC-INTLEN    &4.
  XFC-DECIMALS  &5.
  APPEND XFC TO IFC.
  CLEAR XFC.
END-OF-DEFINITION.

DEFINE M_ALV_FIELDCAT.
  GS_FIELD-FIELDNAME     &1.
  GS_FIELD-REPTEXT_DDIC  &2.
  GS_FIELD-OUTPUTLEN     &3.
  GS_FIELD-ICON          &4.
  GS_FIELD-EDIT          ''.
  GS_FIELD-CHECKBOX      ''.
  GS_FIELD-REF_FIELDNAME ''.
  GS_FIELD-REF_TABNAME   ''.
  GS_FIELD-JUST          ''.
  GS_FIELD-NO_ZERO       ''.
  APPEND GS_FIELD TO GT_FIELD.
  CLEAR GS_FIELD.
END-OF-DEFINITION.

******************************FILED-SYMBOLS****************************************
FIELD-SYMBOLS:
               $DNY_TAB>  TYPE STANDARD TABLE,"该死的渣浪不支持小于号大于号组合,只能用$来代替了。
               $DNY_WA> ,
               $DNY_FIELD>,
               $FS_TAB> TYPE ABAP_COMPDESCR.

******************************SCREEN****************************************
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-009.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(51TEXT-010.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(50TEXT-011.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(60TEXT-012.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK B1.

SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
  SMATNR FOR MAST-MATNR OBLIGATORY.
PARAMETERS  SWERKS TYPE MAST-WERKS.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(10TEXT-002 FOR FIELD R1.
PARAMETERS R1 RADIOBUTTON GROUP G1 DEFAULT 'X'.
SELECTION-SCREEN COMMENT 14(10TEXT-003 FOR FIELD R1.
PARAMETERS R2 RADIOBUTTON GROUP G1.
SELECTION-SCREEN COMMENT 27(10TEXT-004 FOR FIELD R1.
SELECTION-SCREEN END OF LINE.
PARAMETERS P1 TYPE T416-STLAN OBLIGATORY.
SELECTION-SCREEN END OF BLOCK B2.

*******************************FLOW***************************************
INITIALIZATION.
  "DO NOTHING.

AT SELECTION-SCREEN.
  PERFORM CHECK_INPUT.

START-OF-SELECTION.
  PERFORM RETRIVE_DATA.
  PERFORM PROCESS_DATA.

END-OF-SELECTION.
  PERFORM PROCESS_OUTPUT.


*******************************FORM***************************************
*&---------------------------------------------------------------------*
*&      Form  CHECK_INPUT
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
 -->  p1        text
 <--  p2        text
*----------------------------------------------------------------------*
FORM CHECK_INPUT .
  "BOM类别为主机BOM,物料输入为6101*或671*,否则提示“主机BOM只允许输入6101*或671*物料”
  IF R1 'X'.
    LOOP AT SMATNR.
      IF SMATNR-LOW IS NOT INITIAL AND SMATNR-HIGH IS INITIAL.
        IF SMATNR-LOW+0(4NE '6101' AND SMATNR-LOW+0(3NE '671'.
          MESSAGE TEXT-005 TYPE 'E'.
          LEAVE LIST-PROCESSING.
        ENDIF.
      ELSEIF SMATNR-LOW IS NOT INITIAL AND SMATNR-HIGH IS NOT INITIAL.
        IF SMATNR-LOW+0(4EQ '6101' AND SMATNR-HIGH+0(4NE '6101'.
          MESSAGE TEXT-005 TYPE 'E'.
          LEAVE LIST-PROCESSING.
        ENDIF.
        IF SMATNR-LOW+0(4NE '6101' AND SMATNR-HIGH+0(4EQ '6101'.
          MESSAGE TEXT-005 TYPE 'E'.
          LEAVE LIST-PROCESSING.
        ENDIF.
        IF SMATNR-LOW+0(3EQ '671' AND SMATNR-HIGH+0(3NE '671'.
          MESSAGE TEXT-005 TYPE 'E'.
          LEAVE LIST-PROCESSING.
        ENDIF.
        IF SMATNR-LOW+0(3NE '671' AND SMATNR-HIGH+0(3EQ '671'.
          MESSAGE TEXT-005 TYPE 'E'.
          LEAVE LIST-PROCESSING.
        ENDIF.
      ELSE.
        MESSAGE TEXT-005 TYPE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    ENDLOOP.
    "BOM类别为项目物资,物料输入为672*数据,否则提示“只允许输入672*物料”
  ELSEIF R2 'X'.
    LOOP AT SMATNR.
      IF SMATNR-LOW IS NOT INITIAL AND SMATNR-HIGH IS INITIAL.
        IF SMATNR-LOW+0(3NE '672'.
          MESSAGE TEXT-006 TYPE 'E'.
          LEAVE LIST-PROCESSING.
        ENDIF.
      ELSEIF SMATNR-LOW IS NOT INITIAL AND SMATNR-HIGH IS NOT INITIAL.
        IF SMATNR-LOW+0(3NE '672' OR SMATNR-HIGH+0(3NE '672'.
          MESSAGE TEXT-006 TYPE 'E'.
          LEAVE LIST-PROCESSING.
        ENDIF.
      ELSE.
        MESSAGE TEXT-006 TYPE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    ENDLOOP.
  ENDIF.
ENDFORM                   CHECK_INPUT



*&---------------------------------------------------------------------*
*&      Form  RETRIVE_DATA
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
 -->  p1        text
 <--  p2        text
*----------------------------------------------------------------------*
FORM RETRIVE_DATA .
  "检查BOM存在性
  IF SWERKS IS NOT INITIAL.
    SELECT MATNR WERKS STLAN STLNR
      FROM MAST
      INTO CORRESPONDING FIELDS OF TABLE GT_MAST
      WHERE MATNR IN SMATNR
        AND WERKS EQ SWERKS
        AND STLAN EQ P1.
  ELSE.
    SELECT MATNR WERKS STLAN STLNR
      FROM MAST
      INTO CORRESPONDING FIELDS OF TABLE GT_MAST
      WHERE MATNR IN SMATNR
        AND STLAN EQ P1.
  ENDIF.

  IF GT_MAST IS INITIAL.
    MESSAGE TEXT-007 TYPE 'I'.
    LEAVE LIST-PROCESSING.
    CALL SELECTION-SCREEN 1000.
  ENDIF.

  "根据BOM获取子层
  SELECT STLNR STLTY STLKN STPOZ IDNRK
    FROM STPO
    INTO CORRESPONDING FIELDS OF TABLE GT_STPO
    FOR ALL ENTRIES IN GT_MAST
    WHERE STLTY EQ 'M'
      AND STLNR GT_MAST-STLNR.

  PERFORM FOO_BOM CHANGING GT_STPO.

  "删除重复行
  SORT GT_STPO BY IDNRK.
  DELETE ADJACENT DUPLICATES FROM GT_STPO COMPARING IDNRK.

  "获取物料描述
  SELECT MATNR MAKTX FROM MAKT
    INTO CORRESPONDING FIELDS OF TABLE GT_MAKT
    FOR ALL ENTRIES IN GT_STPO
    WHERE MATNR GT_STPO-IDNRK.

  "获取单位
  SELECT MATNR MEINS FROM MARA
    INTO CORRESPONDING FIELDS OF TABLE GT_MARA
    FOR ALL ENTRIES IN GT_STPO
    WHERE MATNR GT_STPO-IDNRK.

  "获取价格
  IF R1 'X'.
    IF SWERKS IS NOT INITIAL.
      SELECT MATNR BWKEY STPRS PEINH FROM MBEW
        INTO CORRESPONDING FIELDS OF TABLE GT_MBEW
        FOR ALL ENTRIES IN GT_STPO
        WHERE MATNR GT_STPO-IDNRK
          AND BWKEY SWERKS.
    ELSE.

      SELECT BWKEY FROM T001K
        INTO CORRESPONDING FIELDS OF TABLE GT_T001K
        WHERE BWKEY NOT IN ('6010','6100','6540','6888')
          AND BWMOD 'MY02'.
      LOOP AT GT_T001K INTO GS_T001K.
        IF GS_T001K-BWKEY+3(1EQ '9'.
          DELETE GT_T001K.
        ENDIF.
      ENDLOOP.

      SELECT MATNR BWKEY STPRS PEINH FROM MBEW
        INTO CORRESPONDING FIELDS OF TABLE GT_MBEW
        FOR ALL ENTRIES IN GT_STPO
        WHERE MATNR GT_STPO-IDNRK.

      LOOP AT GT_MBEW INTO GS_MBEW.
        READ TABLE GT_T001K TRANSPORTING NO FIELDS WITH KEY BWKEY GS_MBEW-BWKEY.
        IF SY-SUBRC <> 0.
          DELETE GT_MBEW.
        ENDIF.
      ENDLOOP.
    ENDIF.
  ELSE.
    SELECT MATNR BWKEY STPRS PEINH FROM MBEW
        INTO CORRESPONDING FIELDS OF TABLE GT_MBEW
        FOR ALL ENTRIES IN GT_STPO
        WHERE MATNR GT_STPO-IDNRK
          AND BWKEY '6888'.
  ENDIF.

ENDFORM                   RETRIVE_DATA


*&---------------------------------------------------------------------*
*&      Form  PROCESS_DATA
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
 -->  p1        text
 <--  p2        text
*----------------------------------------------------------------------*
FORM PROCESS_DATA .

  DF_LVC_FCAT:"FIELDNAME DATATYPE INTTYPE INTLEN DECIMALS
    'MATNR' 'C' 'C' 18 0,"物料
    'MAKTX' 'C' 'C' 40 0,"物料描述
    'MEINS' 'C' 'C' 0,"基本单位
    'CHECK' 'C' 'C' 0,"价格检查标识
    'LMEIN' 'C' 'C' 0."本报表价格单位

  IF R1 'X'.
    IF SWERKS IS NOT INITIAL.
      DF_LVC_FCAT:
        SWERKS 'P' 'P' 11 2."工厂价格
    ELSE.
      SORT GT_T001K.
      CLEAR GS_T001K.
      LOOP AT GT_T001K INTO GS_T001K.
        DF_LVC_FCAT:
          GS_T001K-BWKEY 'P' 'P' 11 2."工厂价格
        CLEAR GS_T001K.
      ENDLOOP.
    ENDIF.
  ELSE.
    DF_LVC_FCAT:
       '6888' 'P' 'P' 11 2                                "6888工厂价格
  ENDIF.

  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG IFC
    IMPORTING
      EP_TABLE        DNY_TAB.

  ASSIGN DNY_TAB->TO $DNY_TAB>.
  CREATE DATA DNY_LINE LIKE LINE OF $DNY_TAB>.
  ASSIGN DNY_LINE->TO  $DNY_WA>.

  CLEAR GS_STPO.
  LOOP AT GT_STPO INTO GS_STPO.
    "物料
    ASSIGN COMPONENT 'MATNR' OF STRUCTURE  $DNY_WA> TO  $DNY_FIELD>.
     GS_STPO-IDNRK.
    "物料描述
    CLEAR GS_MAKT.
    READ TABLE GT_MAKT INTO GS_MAKT WITH KEY MATNR GS_STPO-IDNRK.
    IF SY-SUBRC 0.
      ASSIGN COMPONENT 'MAKTX' OF STRUCTURE   $DNY_WA> TO  $DNY_FIELD> .
       GS_MAKT-MAKTX.
    ENDIF.
    "基本单位
    CLEAR GS_MARA.
    READ TABLE GT_MARA INTO GS_MARA WITH KEY MATNR GS_STPO-IDNRK.
    IF SY-SUBRC 0.
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
        EXPORTING
          INPUT                GS_MARA-MEINS
        LANGUAGE             SY-LANGU
        IMPORTING
        LONG_TEXT            =
          OUTPUT               GS_MARA-MEINS
        SHORT_TEXT           =
      EXCEPTIONS
        UNIT_NOT_FOUND       1
        OTHERS               2
                .
      IF SY-SUBRC <> 0.
Implement suitable error handling here
      ENDIF.

      ASSIGN COMPONENT 'MEINS' OF STRUCTURE   $DNY_WA> TO  $DNY_FIELD> .
       GS_MARA-MEINS.
    ENDIF.
    "本报表价格单位
    ASSIGN COMPONENT 'LMEIN' OF STRUCTURE   $DNY_WA> TO  $DNY_FIELD> .
     '1'.
    "各工厂价格
    IF R1 'X'.
      IF SWERKS IS INITIAL.
        CLEARGS_MBEW,GS_T001K,COUNTER.
        SORT GT_T001K.
        LOOP AT GT_T001K INTO GS_T001K.
          ASSIGN COMPONENT GS_T001K-BWKEY OF STRUCTURE   $DNY_WA> TO  $DNY_FIELD> .
          LOOP AT GT_MBEW INTO GS_MBEW WHERE MATNR GS_STPO-IDNRK AND BWKEY GS_T001K-BWKEY.
             GS_MBEW-STPRS GS_MBEW-PEINH.
            IF  NE 0.
              COUNTER COUNTER 1.
            ENDIF.
          ENDLOOP.
          IF SY-SUBRC <> 0.
             0.
          ENDIF.
        ENDLOOP.
        "价格检查标识
        ASSIGN COMPONENT 'CHECK' OF STRUCTURE   $DNY_WA> TO  $DNY_FIELD>.
        IF COUNTER LINESGT_T001K AND COUNTER NE 0.
           '@5B@'."GREEN
        ELSEIF COUNTER 0.
           '@5C@'."RED
        ELSE.
           '@5D@'."YELLOW
        ENDIF.
      ELSE.
        CLEAR:GS_MBEW.
        ASSIGN COMPONENT SWERKS OF STRUCTURE   $DNY_WA> TO  $DNY_FIELD>.
        READ TABLE GT_MBEW INTO GS_MBEW WITH KEY MATNR GS_STPO-IDNRK BWKEY SWERKS.
        IF SY-SUBRC 0.
           GS_MBEW-STPRS GS_MBEW-PEINH.
          "价格检查标识
          IF  NE 0.
            ASSIGN COMPONENT 'CHECK' OF STRUCTURE  $DNY_WA> TO  $DNY_FIELD> .
             '@5B@'."GREEN
          ELSE.
            ASSIGN COMPONENT 'CHECK' OF STRUCTURE   $DNY_WA> TO  $DNY_FIELD> .
             '@5C@'."RED
          ENDIF.
        ELSE.
           0.
          "价格检查标识
          ASSIGN COMPONENT 'CHECK' OF STRUCTURE  $DNY_WA> TO  $DNY_FIELD> .
           '@5C@'."RED
        ENDIF.
      ENDIF.
    ELSE.
      CLEARGS_MBEW.
      ASSIGN COMPONENT '6888' OF STRUCTURE   $DNY_WA> TO  $DNY_FIELD> .
      READ TABLE GT_MBEW INTO GS_MBEW WITH KEY BWKEY '6888' MATNR GS_STPO-IDNRK.
      IF SY-SUBRC 0.
         GS_MBEW-STPRS GS_MBEW-PEINH.
        "价格检查标识
        IF  NE 0.
          ASSIGN COMPONENT 'CHECK' OF STRUCTURE   $DNY_WA> TO  $DNY_FIELD>.
           '@5B@'."GREEN
        ELSE.
          ASSIGN COMPONENT 'CHECK' OF STRUCTURE   $DNY_WA> TO  $DNY_FIELD> .
           '@5C@'."RED
        ENDIF.
      ELSE.
         0.
        "价格检查标识
        ASSIGN COMPONENT 'CHECK' OF STRUCTURE   $DNY_WA> TO  $DNY_FIELD>.
         '@5C@'.
      ENDIF.
    ENDIF.
    APPEND   $DNY_WA> TO $DNY_TAB>.  .
    CLEAR GS_STPO.
  ENDLOOP.
ENDFORM                   PROCESS_DATA


*&---------------------------------------------------------------------*
*&      Form  PROCESS_OUTPUT
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
 -->  p1        text
 <--  p2        text
*----------------------------------------------------------------------*
FORM PROCESS_OUTPUT .

  M_ALV_FIELDCAT:"FIELDNAME HEADING OUTPUTLEN ICON
        'MATNR' '物料' '18' '',
        'MAKTX' '物料描述' '40' '',
        'MEINS' '基本单位' '4' '',
        'CHECK' '价格检查标识' '4' 'X',
        'LMEIN' '本报表价格单位' '4' ''.

  IF R1 'X'.
    GV_TAB_DESC ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( $DNY_TAB> ).
    GV_STC_DESC ?= GV_TAB_DESC->GET_TABLE_LINE_TYPE).
    DATALV_STR TYPE STRING.
    LOOP AT GV_STC_DESC->COMPONENTS ASSIGNING $FS_TAB>.
      IF $FS_TAB>-NAME EQ 'MATNR'
          OR $FS_TAB>-NAME EQ 'MAKTX'
          OR $FS_TAB>-NAME EQ 'MEINS'
          OR $FS_TAB>-NAME EQ 'CHECK'
          OR $FS_TAB>-NAME EQ 'LMEIN'.
        CONTINUE.
      ENDIF.
      CLEAR LV_STR.
      LV_STR $FS_TAB>-NAME && '-工厂价格'.
      M_ALV_FIELDCAT:
           $FS_TAB>-NAME LV_STR '15' ''.
    ENDLOOP.
  ELSE.
    M_ALV_FIELDCAT:
         '6888' '6888-工厂价格' '15' ''.
  ENDIF.

****************************ALV LAYOUT******************************************
  GS_LAYOUT-COLWIDTH_OPTIMIZE 'X'."宽度自动优化
  GS_LAYOUT-ZEBRA             'X'."斑马线

**********************TOP OF PAGR************************************************
  "Type is used to display headers i.e. big font
  CLEAR GS_TOP.
  GS_TOP-TYP 'H'.
  IF R1 'X'.
    GS_TOP-INFO '投标报价主机BOM价格检查'.
  ELSE.
    GS_TOP-INFO '投标报价项目物资相关BOM物料检查'.
  ENDIF.
  APPEND GS_TOP TO GT_TOP.

  "Type is used to display key and value pairs
  IF R1 'X'.
    CLEAR GS_TOP.
    GS_TOP-TYP 'S'.
    GS_TOP-KEY '红灯:'.
    GS_TOP-INFO '所有工厂价格为0'.
    APPEND GS_TOP TO GT_TOP.
    CLEAR GS_TOP.
    GS_TOP-TYP 'S'.
    GS_TOP-KEY '黄灯:'.
    GS_TOP-INFO '一个工厂有价格不为0(排除绿灯条件)'.
    APPEND GS_TOP TO GT_TOP.
    CLEAR GS_TOP.
    GS_TOP-TYP 'S'.
    GS_TOP-KEY '绿灯:'.
    GS_TOP-INFO '所有工厂价格都不为0'.
    APPEND GS_TOP TO GT_TOP.
    CLEAR GS_TOP.
    GS_TOP-TYP 'S'.
    GS_TOP-KEY '备注:'.
    GS_TOP-INFO '只对所有主机工厂检查,且价格单位均为1'.
    APPEND GS_TOP TO GT_TOP.
  ELSE.
    CLEAR GS_TOP.
    GS_TOP-TYP 'S'.
    GS_TOP-KEY '备注:'.
    GS_TOP-INFO '只检查6888工厂物料价格'.
    APPEND GS_TOP TO GT_TOP.
  ENDIF.

  "Type is used to display italic font
 CLEAR GS_TOP.
 GS_TOP-TYP 'A'.
 GS_TOP-INFO SY-DATUM.
 APPEND GS_TOP TO GT_TOP.

*****************************ALV*****************************************
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM     SY-REPID
      I_CALLBACK_TOP_OF_PAGE 'TOP_OF_PAGE'
      IS_LAYOUT              GS_LAYOUT
      IT_FIELDCAT            GT_FIELD
      I_DEFAULT              'X'
      I_SAVE                 'A'
    TABLES
      T_OUTTAB               = $ DNY_TAB> 
    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.


ENDFORM                   PROCESS_OUTPUT

*&---------------------------------------------------------------------*
*&      Form  top_of_page
*&---------------------------------------------------------------------*
FORM TOP_OF_PAGE.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY GT_TOP.

ENDFORM                   "top_of_page

*&---------------------------------------------------------------------*
*&      Form  FOO_BOM
*&---------------------------------------------------------------------*
      text
*----------------------------------------------------------------------*
     <--P_GT_STPO  text
*----------------------------------------------------------------------*
FORM FOO_BOM  CHANGING P_GT_STPO LIKE GT_STPO.

  IF P_GT_STPO IS INITIAL.
    MESSAGE TEXT-008 TYPE 'I'.
    RETURN.
  ENDIF.

  CLEAR:
        LT_MAST,
        LS_MAST,
        LT_STPO,
        LS_STPO.
  IF SWERKS IS NOT INITIAL.
    SELECT MATNR WERKS STLAN STLNR
      FROM MAST
      INTO CORRESPONDING FIELDS OF TABLE LT_MAST
      FOR ALL ENTRIES IN P_GT_STPO
      WHERE MATNR P_GT_STPO-IDNRK
        AND WERKS EQ SWERKS
        AND STLAN EQ P1.
  ELSE.
    SELECT MATNR WERKS STLAN STLNR
      FROM MAST
      INTO CORRESPONDING FIELDS OF TABLE LT_MAST
      FOR ALL ENTRIES IN P_GT_STPO
      WHERE MATNR P_GT_STPO-IDNRK
        AND STLAN EQ P1.
  ENDIF.
  IF LT_MAST IS NOT INITIAL.
    SELECT STLNR STLTY STLKN STPOZ IDNRK
      FROM STPO
      INTO CORRESPONDING FIELDS OF TABLE LT_STPO
      FOR ALL ENTRIES IN LT_MAST
      WHERE STLTY EQ 'M'
        AND STLNR LT_MAST-STLNR.

    LOOP AT LT_MAST INTO LS_MAST.
      DELETE P_GT_STPO WHERE IDNRK LS_MAST-MATNR.
    ENDLOOP.
    APPEND LINES OF LT_STPO TO P_GT_STPO.
    PERFORM FOO_BOM CHANGING P_GT_STPO.
  ENDIF.

ENDFORM                   FOO_BOM
原创粉丝点击