以一个极好alv的例子来说说alv开发

来源:互联网 发布:广州 荔湾区 骏域网络 编辑:程序博客网 时间:2024/04/29 11:23

ALV开发一般流程

 第一步:定义ALV所要用到的类型池:TYPE-POOLS: SLIS 

 第二步:定义ALV所要显示的数据对应的内表数据类型及内表数据对象

 第三步:定义一些显示ALV时所要使用到的变量

         DATA:i_fieldcat_alv TYPE SLIS_T_FIELDCAT_ALV,        "定义ALV列字段相关类型数据(列标题属性信息)SLIS_T_FIELDCAT_ALV 是一个无表头行的表结构体
              i_fieldcat TYPE SLIS_FIELDCAT_ALV,              "定义对象 SLIS_FIELDCAT_ALV是一个结构体所以i_fieldcat是工作区

              i_layout TYPE SLIS_LAYOUT_ALV,                  "定义布局类型数据对象 SLIS_LAYOUT_ALV是一个结构体 

              i_events TYPE SLIS_T_EVENT,                     "alv事件 SLIS_T_EVENT是一个无表头行的表结构体 i_events 是一个无表头行的内表
              w_events LIKE LINE OF i_events,                 "定义一个与i_events结构相同的工作区

              i_list_comments TYPE SLIS_T_LISTHEADER,         "alv表单标题区域设置 i_list_comments 是一个无表头行的表结构体
              w_list_comments LIKE LINE OF i_list_comments,   "定义一个与i_list_comments内表行结构相同的工作区

              w_repid LIKE SY-REPID.                         "ABAP程序,我们一般取当前程序

 第四步:定义选择屏幕

 第五步:声明各个选择屏幕事件块

        定义start-of-selection部分,在这通常会调用各种子程序.

        *选择屏幕
         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 layout_build:定义布局

FORM layout_build.
  i_layout-ZEBRA = 'X'"ALV表格按斑马线条纹显示
  i_layout-COLWIDTH_OPTIMIZE = 'X'"将ALV字段宽度设置为最优化
  i_layout-INFO_FIELDNAME = 'COLOR'"設置顏色FIELD
  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.

ENDFORM.

FORM events_build:所有事件处理比如alv表头和表尾的设置,以及'USER_COMMAND等等都可以在这里实现。

FORM events_build.
  CALL FUNCTION 'REUSE_ALV_EVENTS_GET' "输出一个内表类型是SLIS_T_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.

*对FUNCTION 'REUSE_ALV_EVENTS_GET' 说明一下,此function 是获取所有事件的名称,对应表里面的name字段

*而另外一个字段是form,执行这个function之后只是获得了事件名称,而form都是空的。需要程序员根据需要自己添加

*下面讲如何写form

首先:根据name来read内表i_events


  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.         "相应的form赋值,这里只是form的名称,form的写法和其他的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.
    MOVE 'ALV_USER_COMMAND' TO w_events-form.   "用户指令的处理事件
    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.

i_events内表字段form 相应的form的创建。

 

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 = '确认:________采购申请人:___________________'.
  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 ALV_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.

 

写到这里我们就可以显示alv了

*&---------------------------------------------------------------------------*
*&    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[]


    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.