一个极好的ALV例子

  在网上找了个不错的ALV例子,学习并整理了一下贴出具体的程式。

  REPORT  ZZWEI_ALV_EXAMPLE.

  TABLES:LFA1,"供应商主数据 (一般地区)
         EKPO,"采购凭证项目
         EINE,"采购信息记录 - 采购组织数据
         EINA."采购信息记录 - 一般数据

  INCLUDE <LIST>.
  TYPE-POOLS:SLIS.

  DATA:i_fieldcat_alv TYPE SLIS_T_FIELDCAT_ALV,"定义列标题(属性信息)
       i_layout TYPE SLIS_LAYOUT_ALV,
       i_fieldcat TYPE SLIS_FIELDCAT_ALV,"定义对象
       i_events TYPE SLIS_T_EVENT,"alv事件
       w_events LIKE LINE OF i_events,
       i_list_comments TYPE SLIS_T_LISTHEADER,"alv表单标题区域设置
       w_list_comments LIKE LINE OF i_list_comments,
       w_repid LIKE SY-REPID."当前程序


  *定义内表字段
  DATA:BEGIN OF hd_itab OCCURS 0,
        infnr LIKE EINE-INFNR,"采购信息记录
        ekorg LIKE EINE-EKORG,"采购组织
        matnr LIKE EINA-MATNR,"物料编号
        lifnr LIKE EINA-LIFNR,"供应商
        erdat LIKE EINE-ERDAT,"创建日期
        loekz LIKE EINE-LOEKZ,"删除标记
        urznr LIKE EINA-URZNR,"批准号
        color(4) TYPE C, "定义颜色
        aplfz LIKE EINE-APLFZ,"计划交货时间
        netpr LIKE EINE-NETPR,"净价
        peinh LIKE EINE-PEINH,"单位价格
        dwjj LIKE EINE-NETPR,"单位净价
        bprme LIKE EINE-BPRME,"订单价格单位
        maktx LIKE MAKT-MAKTX,"物料名称
        name1 LIKE LFA1-NAME1,"供应商名称
        iicon LIKE ICON-NAME, "ICON 图标
       END OF hd_itab.

  *选择屏幕
  SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE t1.
    SELECT-OPTIONS:s_infnr FOR EINE-INFNR MEMORY ID INF."信息记录号码
    PARAMETERS:PR_LOEKZ TYPE AS CHECKBOX DEFAULT ''."显示有删除标志的信息记录
    SELECT-OPTIONS:s_ekorg FOR EINE-EKORG MEMORY ID EKO."采购组织
    SELECT-OPTIONS:s_matnr FOR EINA-MATNR MEMORY ID MAT."物料编号
    SELECT-OPTIONS:s_lifnr FOR EINA-LIFNR MEMORY ID LIF."供应商编号
    SELECT-OPTIONS:s_erdat FOR EINA-ERDAT MEMORY ID erd."创建日期
    SELECT-OPTIONS:s_urznr FOR EINA-URZNR MEMORY ID urz."批准号
  SELECTION-SCREEN END OF BLOCK block1.

  *初始化事件
  INITIALIZATION.
        t1 = '采购查询'.

  *屏幕开始事件
  START-OF-SELECTION.
     PERFORM getdata.
     PERFORM events_build.
     PERFORM layout_build.
     PERFORM fieldcat_build.
     PERFORM alv_display_data.

  *&--------------------------------------------------------------------*
  *&      Form  getdata
  *&--------------------------------------------------------------------*
  FORM getdata.
    CLEAR hd_itab.
    CLEAR hd_itab[].

    IF PR_LOEKZ = ''.
      SELECT FROM EINE INNER JOIN EINA ON EINE~INFNR = EINA~INFNR INTO CORRESPONDING FIELDS OF hd_itab
    WHERE EINE~INFNR IN s_infnr AND EINE~EKORG IN s_ekorg AND EINA~MATNR IN s_matnr AND EINA~LIFNR IN s_lifnr AND EINA~LOEKZ <> 'X' AND EINE~ERDAT IN s_erdat AND EINA~URZNR IN s_urznr
      ORDER BY EINE~INFNR DESCENDING.
        SELECT SINGLE MAKTX FROM MAKT INTO CORRESPONDING FIELDS OF hd_itab WHERE matnr = hd_itab-matnr.
        SELECT SINGLE NAME1 FROM LFA1 INTO CORRESPONDING FIELDS OF hd_itab WHERE lifnr = hd_itab-lifnr.
        APPEND hd_itab.
        CLEAR hd_itab.
      ENDSELECT.
    ELSE.
      SELECT FROM EINE INNER JOIN EINA ON EINE~INFNR = EINA~INFNR INTO CORRESPONDING FIELDS OF hd_itab
    WHERE EINE~INFNR IN s_infnr AND EINE~EKORG IN s_ekorg AND EINA~MATNR IN s_matnr AND EINA~LIFNR IN s_lifnr AND EINE~ERDAT IN s_erdat AND EINA~URZNR IN s_urznr
      ORDER BY EINE~INFNR DESCENDING.
        SELECT SINGLE MAKTX FROM MAKT INTO CORRESPONDING FIELDS OF hd_itab WHERE matnr = hd_itab-matnr.
        SELECT SINGLE NAME1 FROM LFA1 INTO CORRESPONDING FIELDS OF hd_itab WHERE lifnr = hd_itab-lifnr.
        APPEND hd_itab.
        CLEAR hd_itab.
      ENDSELECT.

   ENDIF.

   LOOP AT hd_itab.
     IF hd_itab-loekz = 'X'.
       hd_itab-color = 'C610'.
       hd_itab-iicon = ICON_INCOMPLETE. "ICON圖標信息
     ELSE.
       hd_itab-iicon = ICON_CHECKED. "ICON圖標信息
     ENDIF.
     hd_itab-dwjj = hd_itab-netpr / hd_itab-peinh.  "净价/价格单位

     MODIFY hd_itab."更新
     CLEAR hd_itab."CLEAR HEADER LINE
   ENDLOOP.
  ENDFORM.

  *&---------------------------------------------------------------------------*
  *&    FORM LAYOUT BUILD
  *&---------------------------------------------------------------------------*
  FORM layout_build.
    i_layout-ZEBRA = 'X'"ALV表格按斑马线条纹显示
    "i_layout-NO_VLINE = 'X'. "ALV表格顯示時無堅向線
    i_layout-COLWIDTH_OPTIMIZE = 'X'"将ALV字段宽度设置为最优化
*    i_layout-detail_initial_lines = 'X'.
*    i_layout-detail_titlebar = '详细内容'.
*    i_layout-box_fieldname  = 'LINE'.
    i_layout-INFO_FIELDNAME = 'COLOR'"設置顏色FIELD
    i_layout-NO_COLHEAD = ''.
    w_repid = SY-REPID.
  ENDFORM.



  *&---------------------------------------------------------------------------*
  *&    FORM FIELDCAT BUILD
  *&---------------------------------------------------------------------------*
  FORM fieldcat_build.
    REFRESH i_fieldcat_alv.
    CLEAR i_fieldcat.
    DATA column TYPE VALUE 1.

    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'INFNR'.
    i_fieldcat-SELTEXT_S = '采购信息记录'.
    i_fieldcat-SELTEXT_M = '采购信息记录'.
    i_fieldcat-SELTEXT_L = '采购信息记录'.
    "i_fieldcat-reptext_ddic = '采购信息记录号'.
    i_fieldcat-LZERO = 'X'"字义字段前导以"0"的形式显示
    i_fieldcat-KEY = 'X'.
    i_fieldcat-HOTSPOT = 'X'."设置字段是否有热点(热点字段显示有下划线)
    i_fieldcat-EMPHASIZE = 'C300'."设置字段颜色
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'LIFNR'.
    i_fieldcat-SELTEXT_S = '供应商号码'.
    i_fieldcat-SELTEXT_M = '供应商号码'.
    i_fieldcat-SELTEXT_L = '供应商号码'.
    "i_fieldcat-reptext_ddic = '供应商号码'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    i_fieldcat-HOTSPOT = 'X'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'NAME1'.
    i_fieldcat-SELTEXT_S = '供应商名称'.
    i_fieldcat-SELTEXT_M = '供应商名称'.
    i_fieldcat-SELTEXT_L = '供应商名称'.
    "i_fieldcat-reptext_ddic = '供应商名称'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'MATNR'.
    i_fieldcat-SELTEXT_S = '物料编号'.
    i_fieldcat-SELTEXT_M = '物料编号'.
    i_fieldcat-SELTEXT_L = '物料编号'.
    "i_fieldcat-reptext_ddic = '物料编号'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'MAKTX'.
    i_fieldcat-SELTEXT_S = '物料名称'.
    i_fieldcat-SELTEXT_M = '物料名称'.
    i_fieldcat-SELTEXT_L = '物料名称'.
    "i_fieldcat-reptext_ddic = '物料名称'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'NETPR'.
    i_fieldcat-SELTEXT_S = '净价'.
    i_fieldcat-SELTEXT_M = '净价'.
    i_fieldcat-SELTEXT_L = '净价'.
    "i_fieldcat-reptext_ddic = '净价'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'PEINH'.
    i_fieldcat-SELTEXT_S = '价格单位'.
    i_fieldcat-SELTEXT_M = '价格单位'.
    i_fieldcat-SELTEXT_L = '价格单位'.
    "i_fieldcat-reptext_ddic = '价格单位'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'DWJJ'.
    i_fieldcat-SELTEXT_S = '单位净价'.
    i_fieldcat-SELTEXT_M = '单位净价'.
    i_fieldcat-SELTEXT_L = '单位净价'.
    "i_fieldcat-reptext_ddic = '单位净价'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'BPRME'.
    i_fieldcat-SELTEXT_S = '计量单位'.
    i_fieldcat-SELTEXT_M = '计量单位'.
    i_fieldcat-SELTEXT_L = '计量单位'.
    "i_fieldcat-reptext_ddic = '计量单位'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'EKORG'.
    i_fieldcat-SELTEXT_S = '采购组织'.
    i_fieldcat-SELTEXT_M = '采购组织'.
    i_fieldcat-SELTEXT_L = '采购组织'.
    "i_fieldcat-reptext_ddic = '采购组织'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'APLFZ'.
    i_fieldcat-SELTEXT_S = '计划交货时间'.
    i_fieldcat-SELTEXT_M = '计划交货时间'.
    i_fieldcat-SELTEXT_L = '计划交货时间'.
    "i_fieldcat-reptext_ddic = '计划交货时间'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    i_fieldcat-Emphasize = 'C211'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'ERDAT'.
    i_fieldcat-SELTEXT_S = '创建日期'.
    i_fieldcat-SELTEXT_M = '创建日期'.
    i_fieldcat-SELTEXT_L = '创建日期'.
    "i_fieldcat-reptext_ddic = '创建日期'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'LOEKZ'.
    i_fieldcat-SELTEXT_S = '删除标志'.
    i_fieldcat-SELTEXT_M = '删除标志'.
    i_fieldcat-SELTEXT_L = '删除标志'.
    "i_fieldcat-reptext_ddic = '删除标志'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'URZNR'.
    i_fieldcat-SELTEXT_S = '批准标记'.
    i_fieldcat-SELTEXT_M = '批准标记'.
    i_fieldcat-SELTEXT_L = '批准标记'.
    "i_fieldcat-reptext_ddic = '批准标记'.
    i_fieldcat-LZERO = 'X'.
    i_fieldcat-KEY = 'X'.
    i_fieldcat-Emphasize = 'C211'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

    column = column + 1.
    i_fieldcat-COL_POS = column.
    i_fieldcat-FIELDNAME = 'IICON'.
*    i_fieldcat-SELTEXT_S = '图标'.
*    i_fieldcat-SELTEXT_M = 'ICON'.
    i_fieldcat-SELTEXT_L = 'ICON'.
    i_fieldcat-HOTSPOT = 'X'.
    i_fieldcat-ICON = 'X'.
    "i_fieldcat-reptext_ddic = '批准标记'.
    "i_fieldcat-LZERO = 'X'.
    "i_fieldcat-KEY = 'X'.
    "i_fieldcat-Emphasize = 'C211'.
    APPEND i_fieldcat TO i_fieldcat_alv.
    CLEAR i_fieldcat.

  ENDFORM.


  *&---------------------------------------------------------------------------*
  *&    FORM ALV DISPLAY DATA
  *&---------------------------------------------------------------------------*
  FORM alv_display_data.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
     EXPORTING
        I_CALLBACK_PROGRAM                = w_repid
        I_GRID_TITLE                      = '采购信息记录汇总查询'
        IS_LAYOUT                         = i_layout
        IT_FIELDCAT                       = i_fieldcat_alv[]
        IT_EVENTS                         = i_events[]
        "I_SAVE  = 'A'
        I_CALLBACK_USER_COMMAND           = 'USER_COMMAND' "USER_COMMAND EVENT
      TABLES
        T_OUTTAB                          = hd_itab[]
     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.

  FORM user_command USING i_ucomm TYPE SY-UCOMM i_selfield TYPE SLIS_SELFIELD.

    CASE i_ucomm.
      WHEN '&IC1'.  "对于热点链接,所对应的动作码为"&IC1"
        IF i_selfield-FIELDNAME EQ 'INFNR'"判断用户当前单击的是哪列
          PERFORM call_tran USING i_selfield. "调用自定义事务
        ENDIF.
    ENDCASE.
  ENDFORM.



  FORM call_tran USING i_selfield TYPE SLIS_SELFIELD.
    "SET SCREEN 0.  "返回主屏幕
    READ TABLE hd_itab INDEX i_selfield-tabindex.  "i_selfield-tabindex 当击行索引,从内表中提取数据

    IF SY-SUBRC = 0.
       SET PARAMETER ID 'MAT' FIELD hd_itab-MATNR. "MAT指参数ID
       SET PARAMETER ID 'LIF' FIELD hd_itab-LIFNR.
       SET PARAMETER ID 'EKO' FIELD hd_itab-EKORG.
       SET PARAMETER ID 'INF' FIELD hd_itab-INFNR.

       CALL TRANSACTION 'ME13'."AND SKIP FIRST SCREEN "调用其它事务 ME13是我们要调用的事务
    ENDIF.
  ENDFORM.


  FORM ALV_TOP_OF_PAGE. "ALV表头信息
    CLEAR:i_list_comments.
    w_list_comments-typ = 'H'.
    w_list_comments-key = ''.
    w_list_comments-info = '采购信息记录查询报表'.
    APPEND w_list_comments TO i_list_comments.
    CLEAR w_list_comments.

    DATA:date_temp(30) TYPE C.
    WRITE: SY-DATUM TO date_temp MM/DD/YYYY.
    CONCATENATE '日期:' date_temp INTO date_temp.
    CONCATENATE date_temp  '.   IT部' INTO date_temp.


    w_list_comments-typ = 'S'.
    w_list_comments-key = ''.
    w_list_comments-info = date_temp.
    APPEND w_list_comments TO i_list_comments.
    CLEAR w_list_comments.

    CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'  "输出注释
      EXPORTING
        IT_LIST_COMMENTARY       = i_list_comments
        I_LOGO                   = 'ENJOYSAP_LOGO'
        I_END_OF_LIST_GRID       = 'X'
*       I_ALV_FORM               =
              .
  ENDFORM.

  FORM ALV_END_OF_LIST.
    CLEAR: i_list_comments.
*    w_list_comments-typ = 'S'.
*    w_list_comments-info = 'Create By IT DEPARTMENT'.
*    APPEND w_list_comments TO i_list_comments.
*    CLEAR w_list_comments.
*
*    CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
*      EXPORTING
*        IT_LIST_COMMENTARY       = i_list_comments
**        I_LOGO                   = 'ENJOYSAP_LOGO'
*        I_END_OF_LIST_GRID       = 'X'
**       I_ALV_FORM               =
*            .

    CLEAR:i_list_comments.
    w_list_comments-typ = 'S'.
    w_list_comments-info = '确认:________采购申请人:___________________'.
    APPEND w_list_comments TO i_list_comments.
    CLEAR w_list_comments.

    w_list_comments-typ = 'S'.
    w_list_comments-info = 'Create By Information Department'.
    APPEND w_list_comments TO i_list_comments.
    CLEAR w_list_comments.
 
    DATA:data_temp(30) TYPE C.
    CONCATENATE '打印者:' SY-UNAME INTO data_temp.
    w_list_comments-typ = 'S'.
    w_list_comments-info = data_temp.
    APPEND w_list_comments TO i_list_comments.
    CLEAR w_list_comments.

    CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
      EXPORTING
        IT_LIST_COMMENTARY       = i_list_comments
        I_LOGO                   = 'ENJOYSAP_LOGO'
        I_END_OF_LIST_GRID       = 'X'
*       I_ALV_FORM               =
            .
  ENDFORM.


  FORM events_build.
    CALL FUNCTION 'REUSE_ALV_EVENTS_GET' "输出一个内表类型是SLIS_T_EVENT,行项为SLIS_ALV_EVENT,包含两个字段,一个是事件名称,另一个是处理事件的FORM名称 
     EXPORTING
       I_LIST_TYPE           = 0
     IMPORTING
       ET_EVENTS             = i_events
     EXCEPTIONS
       LIST_TYPE_WRONG       = 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.

    READ TABLE i_events WITH KEY NAME = 'TOP_OF_PAGE' INTO w_events.
    IF SY-SUBRC = 0.
      MOVE 'ALV_TOP_OF_PAGE' TO w_events-form.
      MODIFY i_events FROM w_events INDEX SY-TABIX.
    ENDIF.

    READ TABLE i_events INTO w_events WITH KEY NAME = 'USER_COMMAND'.
    IF SY-SUBRC EQ 0.
      w_events-name = 'USER_COMMAND'.
      MODIFY i_events FROM w_events INDEX SY-TABIX.
    ENDIF.

    READ TABLE i_events WITH KEY NAME = 'END_OF_LIST' INTO w_events.
    IF SY-SUBRC = 0.
      MOVE 'ALV_END_OF_LIST' TO w_events-form.
      MODIFY i_events FROM w_events INDEX SY-TABIX.
    ENDIF.

  ENDFORM.

*&---------------------------------------------------------------------*
*& Report  ZZWEI_ALV_EXAMPLE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZZWEI_ALV_EXAMPLE.

TABLES:LFA1,"供应商主数据 (一般地区)
       EKPO,"采购凭证项目
       EINE,"采购信息记录 - 采购组织数据
       EINA."采购信息记录 - 一般数据

INCLUDE <LIST>.
TYPE-POOLS:SLIS.

DATA:i_fieldcat_alv TYPE SLIS_T_FIELDCAT_ALV,"定义列标题(属性信息)
     i_layout TYPE SLIS_LAYOUT_ALV,
     i_fieldcat TYPE SLIS_FIELDCAT_ALV,"定义对象
     i_events TYPE SLIS_T_EVENT,"alv事件
     w_events LIKE LINE OF i_events,
     i_list_comments TYPE SLIS_T_LISTHEADER,"alv表单标题区域设置
     w_list_comments LIKE LINE OF i_list_comments,
     w_repid LIKE SY-REPID."当前程序





*定义内表字段
DATA:BEGIN OF hd_itab OCCURS 0,
      infnr LIKE EINE-INFNR,"采购信息记录
      ekorg LIKE EINE-EKORG,"采购组织
      matnr LIKE EINA-MATNR,"物料编号
      lifnr LIKE EINA-LIFNR,"供应商
      erdat LIKE EINE-ERDAT,"创建日期
      loekz LIKE EINE-LOEKZ,"删除标记
      urznr LIKE EINA-URZNR,"批准号
      color(4) TYPE C, "定义颜色
      aplfz LIKE EINE-APLFZ,"计划交货时间
      netpr LIKE EINE-NETPR,"净价
      peinh LIKE EINE-PEINH,"单位价格
      dwjj LIKE EINE-NETPR,"单位净价
      bprme LIKE EINE-BPRME,"订单价格单位
      maktx LIKE MAKT-MAKTX,"物料名称
      name1 LIKE LFA1-NAME1,"供应商名称
      iicon LIKE ICON-NAME, "ICON 图标
     END OF hd_itab.



*选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE t1.
  SELECT-OPTIONS:s_infnr FOR EINE-INFNR MEMORY ID INF."信息记录号码
  PARAMETERS:PR_LOEKZ TYPE AS CHECKBOX DEFAULT ''."显示有删除标志的信息记录
  SELECT-OPTIONS:s_ekorg FOR EINE-EKORG MEMORY ID EKO."采购组织
  SELECT-OPTIONS:s_matnr FOR EINA-MATNR MEMORY ID MAT."物料编号
  SELECT-OPTIONS:s_lifnr FOR EINA-LIFNR MEMORY ID LIF."供应商编号
  SELECT-OPTIONS:s_erdat FOR EINA-ERDAT MEMORY ID erd."创建日期
  SELECT-OPTIONS:s_urznr FOR EINA-URZNR MEMORY ID urz."批准号
SELECTION-SCREEN END OF BLOCK block1.



*初始化事件
INITIALIZATION.
      t1 = '采购查询'.


*屏幕开始事件
START-OF-SELECTION.
   PERFORM getdata.
   PERFORM events_build.
   PERFORM layout_build.
   PERFORM fieldcat_build.
   PERFORM alv_display_data.






*&--------------------------------------------------------------------*
*&      Form  getdata
*&--------------------------------------------------------------------*
FORM getdata.
  CLEAR hd_itab.
  CLEAR hd_itab[].

  IF PR_LOEKZ = ''.
    SELECT FROM EINE INNER JOIN EINA ON EINE~INFNR = EINA~INFNR INTO CORRESPONDING FIELDS OF hd_itab
    WHERE EINE~INFNR IN s_infnr AND EINE~EKORG IN s_ekorg AND EINA~MATNR IN s_matnr AND EINA~LIFNR IN s_lifnr AND EINA~LOEKZ <> 'X' AND EINE~ERDAT IN s_erdat AND EINA~URZNR IN s_urznr
    ORDER BY EINE~INFNR DESCENDING.
      SELECT SINGLE MAKTX FROM MAKT INTO CORRESPONDING FIELDS OF hd_itab WHERE matnr = hd_itab-matnr.
      SELECT SINGLE NAME1 FROM LFA1 INTO CORRESPONDING FIELDS OF hd_itab WHERE lifnr = hd_itab-lifnr.
      APPEND hd_itab.
      CLEAR hd_itab.
    ENDSELECT.
  ELSE.
    SELECT FROM EINE INNER JOIN EINA ON EINE~INFNR = EINA~INFNR INTO CORRESPONDING FIELDS OF hd_itab
    WHERE EINE~INFNR IN s_infnr AND EINE~EKORG IN s_ekorg AND EINA~MATNR IN s_matnr AND EINA~LIFNR IN s_lifnr AND EINE~ERDAT IN s_erdat AND EINA~URZNR IN s_urznr
    ORDER BY EINE~INFNR DESCENDING.
      SELECT SINGLE MAKTX FROM MAKT INTO CORRESPONDING FIELDS OF hd_itab WHERE matnr = hd_itab-matnr.
      SELECT SINGLE NAME1 FROM LFA1 INTO CORRESPONDING FIELDS OF hd_itab WHERE lifnr = hd_itab-lifnr.
      APPEND hd_itab.
      CLEAR hd_itab.
    ENDSELECT.

 ENDIF.

 LOOP AT hd_itab.
   IF hd_itab-loekz = 'X'.
     hd_itab-color = 'C610'.
     hd_itab-iicon = ICON_INCOMPLETE. "ICON圖標信息
   ELSE.
     hd_itab-iicon = ICON_CHECKED. "ICON圖標信息
   ENDIF.
   hd_itab-dwjj = hd_itab-netpr / hd_itab-peinh.  "净价/价格单位

   MODIFY hd_itab."更新
   CLEAR hd_itab."CLEAR HEADER LINE
 ENDLOOP.
ENDFORM.



*&---------------------------------------------------------------------------*
*&    FORM LAYOUT BUILD
*&---------------------------------------------------------------------------*
FORM layout_build.
  i_layout-ZEBRA = 'X'"ALV表格按斑马线条纹显示
  "i_layout-NO_VLINE = 'X'. "ALV表格顯示時無堅向線
  i_layout-COLWIDTH_OPTIMIZE = 'X'"将ALV字段宽度设置为最优化
*  i_layout-detail_initial_lines = 'X'.
*  i_layout-detail_titlebar = '详细内容'.
*  i_layout-box_fieldname  = 'LINE'.
  i_layout-INFO_FIELDNAME = 'COLOR'"設置顏色FIELD
  i_layout-NO_COLHEAD = ''.
  w_repid = SY-REPID.
ENDFORM.



*&---------------------------------------------------------------------------*
*&    FORM FIELDCAT BUILD
*&---------------------------------------------------------------------------*
FORM fieldcat_build.
  REFRESH i_fieldcat_alv.
  CLEAR i_fieldcat.
  DATA column TYPE VALUE 1.

  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'INFNR'.
  i_fieldcat-SELTEXT_S = '采购信息记录'.
  i_fieldcat-SELTEXT_M = '采购信息记录'.
  i_fieldcat-SELTEXT_L = '采购信息记录'.
  "i_fieldcat-reptext_ddic = '采购信息记录号'.
  i_fieldcat-LZERO = 'X'"字义字段前导以"0"的形式显示
  i_fieldcat-KEY = 'X'.
  i_fieldcat-HOTSPOT = 'X'."设置字段是否有热点(热点字段显示有下划线)
  i_fieldcat-EMPHASIZE = 'C300'."设置字段颜色
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'LIFNR'.
  i_fieldcat-SELTEXT_S = '供应商号码'.
  i_fieldcat-SELTEXT_M = '供应商号码'.
  i_fieldcat-SELTEXT_L = '供应商号码'.
  "i_fieldcat-reptext_ddic = '供应商号码'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  i_fieldcat-HOTSPOT = 'X'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'NAME1'.
  i_fieldcat-SELTEXT_S = '供应商名称'.
  i_fieldcat-SELTEXT_M = '供应商名称'.
  i_fieldcat-SELTEXT_L = '供应商名称'.
  "i_fieldcat-reptext_ddic = '供应商名称'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'MATNR'.
  i_fieldcat-SELTEXT_S = '物料编号'.
  i_fieldcat-SELTEXT_M = '物料编号'.
  i_fieldcat-SELTEXT_L = '物料编号'.
  "i_fieldcat-reptext_ddic = '物料编号'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'MAKTX'.
  i_fieldcat-SELTEXT_S = '物料名称'.
  i_fieldcat-SELTEXT_M = '物料名称'.
  i_fieldcat-SELTEXT_L = '物料名称'.
  "i_fieldcat-reptext_ddic = '物料名称'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'NETPR'.
  i_fieldcat-SELTEXT_S = '净价'.
  i_fieldcat-SELTEXT_M = '净价'.
  i_fieldcat-SELTEXT_L = '净价'.
  "i_fieldcat-reptext_ddic = '净价'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'PEINH'.
  i_fieldcat-SELTEXT_S = '价格单位'.
  i_fieldcat-SELTEXT_M = '价格单位'.
  i_fieldcat-SELTEXT_L = '价格单位'.
  "i_fieldcat-reptext_ddic = '价格单位'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'DWJJ'.
  i_fieldcat-SELTEXT_S = '单位净价'.
  i_fieldcat-SELTEXT_M = '单位净价'.
  i_fieldcat-SELTEXT_L = '单位净价'.
  "i_fieldcat-reptext_ddic = '单位净价'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'BPRME'.
  i_fieldcat-SELTEXT_S = '计量单位'.
  i_fieldcat-SELTEXT_M = '计量单位'.
  i_fieldcat-SELTEXT_L = '计量单位'.
  "i_fieldcat-reptext_ddic = '计量单位'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'EKORG'.
  i_fieldcat-SELTEXT_S = '采购组织'.
  i_fieldcat-SELTEXT_M = '采购组织'.
  i_fieldcat-SELTEXT_L = '采购组织'.
  "i_fieldcat-reptext_ddic = '采购组织'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'APLFZ'.
  i_fieldcat-SELTEXT_S = '计划交货时间'.
  i_fieldcat-SELTEXT_M = '计划交货时间'.
  i_fieldcat-SELTEXT_L = '计划交货时间'.
  "i_fieldcat-reptext_ddic = '计划交货时间'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  i_fieldcat-Emphasize = 'C211'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'ERDAT'.
  i_fieldcat-SELTEXT_S = '创建日期'.
  i_fieldcat-SELTEXT_M = '创建日期'.
  i_fieldcat-SELTEXT_L = '创建日期'.
  "i_fieldcat-reptext_ddic = '创建日期'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'LOEKZ'.
  i_fieldcat-SELTEXT_S = '删除标志'.
  i_fieldcat-SELTEXT_M = '删除标志'.
  i_fieldcat-SELTEXT_L = '删除标志'.
  "i_fieldcat-reptext_ddic = '删除标志'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'URZNR'.
  i_fieldcat-SELTEXT_S = '批准标记'.
  i_fieldcat-SELTEXT_M = '批准标记'.
  i_fieldcat-SELTEXT_L = '批准标记'.
  "i_fieldcat-reptext_ddic = '批准标记'.
  i_fieldcat-LZERO = 'X'.
  i_fieldcat-KEY = 'X'.
  i_fieldcat-Emphasize = 'C211'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

  column = column + 1.
  i_fieldcat-COL_POS = column.
  i_fieldcat-FIELDNAME = 'IICON'.
*  i_fieldcat-SELTEXT_S = '图标'.
*  i_fieldcat-SELTEXT_M = 'ICON'.
  i_fieldcat-SELTEXT_L = 'ICON'.
  i_fieldcat-HOTSPOT = 'X'.
  i_fieldcat-ICON = 'X'.
  "i_fieldcat-reptext_ddic = '批准标记'.
  "i_fieldcat-LZERO = 'X'.
  "i_fieldcat-KEY = 'X'.
  "i_fieldcat-Emphasize = 'C211'.
  APPEND i_fieldcat TO i_fieldcat_alv.
  CLEAR i_fieldcat.

ENDFORM.


*&---------------------------------------------------------------------------*
*&    FORM ALV DISPLAY DATA
*&---------------------------------------------------------------------------*
FORM alv_display_data.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   EXPORTING
      I_CALLBACK_PROGRAM                = w_repid
      I_GRID_TITLE                      = '采购信息记录汇总查询'
      IS_LAYOUT                         = i_layout
      IT_FIELDCAT                       = i_fieldcat_alv[]
      IT_EVENTS                         = i_events[]
      "I_SAVE  = 'A'
      I_CALLBACK_USER_COMMAND           = 'USER_COMMAND' "USER_COMMAND EVENT
    TABLES
      T_OUTTAB                          = hd_itab[]
   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.

FORM user_command USING i_ucomm TYPE SY-UCOMM i_selfield TYPE SLIS_SELFIELD.

  CASE i_ucomm.
    WHEN '&IC1'.  "对于热点链接,所对应的动作码为"&IC1"
      IF i_selfield-FIELDNAME EQ 'INFNR'"判断用户当前单击的是哪列
        PERFORM call_tran USING i_selfield. "调用自定义事务
      ENDIF.
  ENDCASE.
ENDFORM.



FORM call_tran USING i_selfield TYPE SLIS_SELFIELD.
  "SET SCREEN 0.  "返回主屏幕
  READ TABLE hd_itab INDEX i_selfield-tabindex.  "i_selfield-tabindex 当击行索引,从内表中提取数据

  IF SY-SUBRC = 0.
     SET PARAMETER ID 'MAT' FIELD hd_itab-MATNR. "MAT指参数ID
     SET PARAMETER ID 'LIF' FIELD hd_itab-LIFNR.
     SET PARAMETER ID 'EKO' FIELD hd_itab-EKORG.
     SET PARAMETER ID 'INF' FIELD hd_itab-INFNR.

     CALL TRANSACTION 'ME13'."AND SKIP FIRST SCREEN "调用其它事务 ME13是我们要调用的事务
  ENDIF.
ENDFORM.


FORM ALV_TOP_OF_PAGE. "ALV表头信息
  CLEAR:i_list_comments.
  w_list_comments-typ = 'H'.
  w_list_comments-key = ''.
  w_list_comments-info = '采购信息记录查询报表'.
  APPEND w_list_comments TO i_list_comments.
  CLEAR w_list_comments.

  DATA:date_temp(30) TYPE C.
  WRITE: SY-DATUM TO date_temp MM/DD/YYYY.
  CONCATENATE '日期:' date_temp INTO date_temp.
  CONCATENATE date_temp  '.   IT部' INTO date_temp.


  w_list_comments-typ = 'S'.
  w_list_comments-key = ''.
  w_list_comments-info = date_temp.
  APPEND w_list_comments TO i_list_comments.
  CLEAR w_list_comments.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'  "输出注释
    EXPORTING
      IT_LIST_COMMENTARY       = i_list_comments
      I_LOGO                   = 'ENJOYSAP_LOGO'
      I_END_OF_LIST_GRID       = 'X'
*     I_ALV_FORM               =
            .

ENDFORM.

FORM ALV_END_OF_LIST.
  CLEAR: i_list_comments.
*  w_list_comments-typ = 'S'.
*  w_list_comments-info = 'Create By IT DEPARTMENT'.
*  APPEND w_list_comments TO i_list_comments.
*  CLEAR w_list_comments.
*
*  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
*    EXPORTING
*      IT_LIST_COMMENTARY       = i_list_comments
**      I_LOGO                   = 'ENJOYSAP_LOGO'
*      I_END_OF_LIST_GRID       = 'X'
**     I_ALV_FORM               =
*            .

  CLEAR:i_list_comments.
  w_list_comments-typ = 'S'.
  w_list_comments-info = '确认:________采购申请人:___________________'.
  APPEND w_list_comments TO i_list_comments.
  CLEAR w_list_comments.

  w_list_comments-typ = 'S'.
  w_list_comments-info = 'Create By Information Department'.
  APPEND w_list_comments TO i_list_comments.
  CLEAR w_list_comments.
 
  DATA:data_temp(30) TYPE C.
  CONCATENATE '打印者:' SY-UNAME INTO data_temp.
  w_list_comments-typ = 'S'.
  w_list_comments-info = data_temp.
  APPEND w_list_comments TO i_list_comments.
  CLEAR w_list_comments.

  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      IT_LIST_COMMENTARY       = i_list_comments
      I_LOGO                   = 'ENJOYSAP_LOGO'
      I_END_OF_LIST_GRID       = 'X'
*     I_ALV_FORM               =
            .

ENDFORM.


FORM events_build.
  CALL FUNCTION 'REUSE_ALV_EVENTS_GET' "输出一个内表类型是SLIS_T_EVENT,行项为SLIS_ALV_EVENT,包含两个字段,一个是事件名称,另一个是处理事件的FORM名称 
   EXPORTING
     I_LIST_TYPE           = 0
   IMPORTING
     ET_EVENTS             = i_events
   EXCEPTIONS
     LIST_TYPE_WRONG       = 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.

  READ TABLE i_events WITH KEY NAME = 'TOP_OF_PAGE' INTO w_events.

  IF SY-SUBRC = 0.
    MOVE 'ALV_TOP_OF_PAGE' TO w_events-form.
    MODIFY i_events FROM w_events INDEX SY-TABIX.
  ENDIF.

  READ TABLE i_events INTO w_events WITH KEY NAME = 'USER_COMMAND'.

  IF SY-SUBRC EQ 0.
    w_events-name = 'USER_COMMAND'.
    MODIFY i_events FROM w_events INDEX SY-TABIX.
  ENDIF.

  READ TABLE i_events WITH KEY NAME = 'END_OF_LIST' INTO w_events.

  IF SY-SUBRC = 0.
    MOVE 'ALV_END_OF_LIST' TO w_events-form.
    MODIFY i_events FROM w_events INDEX SY-TABIX.
  ENDIF.

ENDFORM.

原文地址:https://www.cnblogs.com/foxting/p/2674753.html