ALV面向对象方法研究:实现方法(一)

      ALV报表在SAP系统里面几乎随处可见,只要跟报表有关的系统都会制作成ALV的形式。像SE11里面查看表格的内容,系统就以ALV的形式体现,在报表里面可以对任何的栏位进行排序,还可以对任何的列进行筛选,也可以导出成Excel文档,也能对数值列进行汇总。可以说ALV的报表在实际报表的开发中占有非常重要的地位。学会它是每个ABAPer必须要经过的一关。

      目前实现ALV的形式报表主要有2种:调用函数REUSE_ALV_GRID_DISPLAY和用面向对象的方法实现。前一种比较普遍,不过性能好像不太高,如果查询语句写得不太精妙,很容易出现卡的情况。后者是采用面向对象的形式,事先在画面上画出一个控制区域,然后用代码的形式填充ALV进去。

      现在着重介绍第二种方法。

      1、首先在SE38里面新建一个程序:

      

      2、保存退出,在SE51里面新建屏幕100:

      

      3、打开格式,准备在上面画出一个控制区域:

            

      4、然后在代码页里将状态,事件添加进去,同时在PBO里面添加一个MODULE,用于载入ALV报表:

      

      5、回到SE38里面打开新建的程序,添加一个INCLUDE ZALV_OO 程序,将与ALV有关的代码放进去封装起来,这样以后所有的程序都可以调用:

       INCLUDE ZALV_OO.

       相关代码如下:

*ALV变量设定

DATA GR_ALVGRID TYPE REF TO CL_GUI_ALV_GRID .
DATA GC_CUSTOM_CONTROL_NAME TYPE SCRFNAME VALUE 'CC_ALV'.   "对应我们画的控制区的名称
DATA GR_CCONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER .
*---栏位
DATA GT_FIELDCAT TYPE LVC_T_FCAT .
*---布局
DATA GS_LAYOUT TYPE LVC_S_LAYO .

*个人定义的变量
DATASET_COLOR       TYPE I,
      DECI_COUNT      TYPE P,
      CHR_COUNT(8)    TYPE C,
      TITLE(50)       TYPE C,
      ALL_FIELD       TYPE I,
      ALL_FIELD1      TYPE I,
      LV_INDEX        TYPE I,
      TABIX           LIKE SY-TABIX,
      TMP_TITLE       TYPE STRING.


*&---------------------------------------------------------------------*
*&      Form  display_alv
*&---------------------------------------------------------------------*
*       显示ALV报表
*----------------------------------------------------------------------*
FORM DISPLAY_ALV USING IT_TABLE TYPE TABLE.
  IF GR_ALVGRID IS INITIAL .
*----新建容器,填充到我们画的控制区域
    CREATE OBJECT GR_CCONTAINER
    EXPORTING
      CONTAINER_NAME              GC_CUSTOM_CONTROL_NAME    "这个地方前面已经赋值了
    EXCEPTIONS
      CNTL_ERROR                  1
      CNTL_SYSTEM_ERROR           2
      CREATE_ERROR                3
      LIFETIME_ERROR              4
      LIFETIME_DYNPRO_DYNPRO_LINK 5
      OTHERS                      6.
    IF SY-SUBRC EQ 0.
*----容器新建成功,然后在此容器里面新建ALV的实例
      CREATE OBJECT GR_ALVGRID
      EXPORTING
        I_PARENT          GR_CCONTAINER
      EXCEPTIONS
        ERROR_CNTL_CREATE 1
        ERROR_CNTL_INIT   2
        ERROR_CNTL_LINK   3
        ERROR_DP_CREATE   4
        OTHERS            5.
      IF SY-SUBRC <> 0.
      ENDIF.
*----准备获取栏位列表
      PERFORM SETFIELDS.
"*-----设置布局
      PERFORM PREPARE_LAYOUT CHANGING GS_LAYOUT .    

*准备完毕,显示ALV
      CALL METHOD GR_ALVGRID->SET_TABLE_FOR_FIRST_DISPLAY
      EXPORTING
*        I_BUFFER_ACTIVE =
*        I_CONSISTENCY_CHECK =
*        I_STRUCTURE_NAME =
*        IS_VARIANT =
*        I_SAVE =
*        I_DEFAULT = 'X'
        IS_LAYOUT GS_LAYOUT
*        IS_PRINT =
*        IT_SPECIAL_GROUPS =
*        IT_TOOLBAR_EXCLUDING =
*        IT_HYPERLINK =
      CHANGING
        IT_OUTTAB IT_TABLE[]     "设置成自己的内表
        IT_FIELDCATALOG GT_FIELDCAT
*       IT_SORT =
*       IT_FILTER =
      EXCEPTIONS
        INVALID_PARAMETER_COMBINATION 1
        PROGRAM_ERROR 2
        TOO_MANY_LINES 3
        OTHERS .
      IF SY-SUBRC <> 0.
      ENDIF.
*刷新ALV
      CALL METHOD GR_ALVGRID->REFRESH_TABLE_DISPLAY
*      EXPORTING
*       IS_STABLE =
*       I_SOFT_REFRESH =
      EXCEPTIONS
        FINISHED 1
        OTHERS .
      IF SY-SUBRC <> 0.
*--Exception handling
      ENDIF.
    ENDIF .
  ENDIF.

*状态栏里面显示本报表名称和记录等信息
  CHR_COUNT DECI_COUNT.
  CONDENSE CHR_COUNT.
  CONCATENATE TMP_TITLE ',共' CHR_COUNT '笔记录'  INTO TITLE.
  MESSAGE TITLE TYPE 'S'.


ENDFORM .                    "display_alv

*&---------------------------------------------------------------------*
*&      Form  prepare_layout
*&---------------------------------------------------------------------*
*       ALV属性,具体属性意义请参考LVC_S_LAYO
*----------------------------------------------------------------------*
*      -->PS_LAYOUT  text
*----------------------------------------------------------------------*
FORM PREPARE_LAYOUT CHANGING PS_LAYOUT TYPE LVC_S_LAYO.
  PS_LAYOUT-ZEBRA      'X' .
  PS_LAYOUT-GRID_TITLE TITLE .
  PS_LAYOUT-SMALLTITLE 'X' .
  PS_LAYOUT-SEL_MODE   'A'.
  PS_LAYOUT-INFO_FNAME 'COLOR'.
  PS_LAYOUT-CWIDTH_OPT 'X'.
  PS_LAYOUT-DETAILINIT 'X'.
ENDFORM" prepare_layout

*设置ALV表栏位的宏
DEFINE DSETFIELDS.
  DATA LS_FCAT TYPE LVC_S_FCAT .
  LS_FCAT-FIELDNAME &1.
  LS_FCAT-INTTYPE   'C' .
  LS_FCAT-OUTPUTLEN &3.
  LS_FCAT-COLTEXT   &2.
  LS_FCAT-SELTEXT   &2.
  APPEND LS_FCAT TO GT_FIELDCAT .
END-OF-DEFINITION.

*&---------------------------------------------------------------------*
*&      FORM  SETFIELDS
*&---------------------------------------------------------------------*
*       调用宏设置栏位
*----------------------------------------------------------------------*
FORM SETFIELD USING TMP_FIELD  TYPE C
      TMP_NAME   TYPE C
      TMP_LENGTH TYPE I.
  DSETFIELDS TMP_FIELD TMP_NAME TMP_LENGTH.
ENDFORM.                    "SETFIELDS


      6、设定完INCLUDE之后,在主程序里面新建一个内表:

         TABLES:SFLIGHT.
  DATA:BEGIN OF IT_SFLIGHT OCCURS 0,
          CARRID LIKE SFLIGHT-CARRID,
          CONNID LIKE SFLIGHT-CONNID,
          FLDATE LIKE SFLIGHT-FLDATE,
          PRICE  LIKE SFLIGHT-PRICE,
          COLOR(4TYPE C,
       END OF IT_SFLIGHT.

  START-OF-SELECTION.
    PERFORM GETDATA.  "读取数据
    CALL SCREEN 100.    "呼叫屏幕

*&---------------------------------------------------------------------*
*&      Form  SETFIELDS
*&---------------------------------------------------------------------*
*       设置栏位
*----------------------------------------------------------------------*
  FORM SETFIELDS.
    PERFORM SETFIELD USING 'CARRID' '航线承运人ID' 3.
    PERFORM SETFIELD USING 'CONNID' '航班连接 Id' 4.
    PERFORM SETFIELD USING 'FLDATE' '航班日期' 8.
    PERFORM SETFIELD USING 'PRICE' '航空运费' 15.
  ENDFORM.                    "SETFIELDS

*&---------------------------------------------------------------------*
*&      Module  DISPLAY_ALV  OUTPUT
*&---------------------------------------------------------------------*
*       在PBO里面传入内表内容以ALV展现
*----------------------------------------------------------------------*
  MODULE DISPLAY_ALV OUTPUT.
    PERFORM DISPLAY_ALV USING IT_SFLIGHT[].
  ENDMODULE.                 " DISPLAY_ALV  OUTPUT

*&---------------------------------------------------------------------*
*&      Form  GETDATA
*&---------------------------------------------------------------------*
*       读取数据
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
  FORM GETDATA .
    DATA:SET_COLOR TYPE I.
    SELECT INTO CORRESPONDING FIELDS OF TABLE IT_SFLIGHT FROM SFLIGHT
     WHERE CARRID IN S_CARRID
       AND CONNID IN S_CONNID
       AND FLDATE IN S_FLDATE
       AND PRICE  IN S_PRICE.
    DESCRIBE TABLE IT_SFLIGHT LINES DECI_COUNT.  "获取记录数
    LOOP AT IT_SFLIGHT.
      SET_COLOR SY-TABIX MOD 2.
      IF SET_COLOR 0.
        IT_SFLIGHT-COLOR 'C500'.  "设置颜色
      ELSE.
        CLEAR IT_SFLIGHT-COLOR.
      ENDIF.
      MODIFY IT_SFLIGHT.
    ENDLOOP.
    TMP_TITLE 'ALV面向对象测试'.    "报表名称
  ENDFORM.                    " GETDATA


    7、OK,一切完毕之后激活,运行:

    

    

    如此,ALV就实现了。接下来我们来分析一下它的性能:

    8、输入SE30:

     

     点击Execute,系统会跑一次报表,退出之后,点击下面的Evaluate:

     

     很直观可以看出该报表之行的情况。如果跟调用function:REUSE_ALV_GRID_DISPLAY 对比起来就会发现用OO的形式来做性能会更好的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ALV实现一行跳转到另一个ALV可以通过以下步骤实现: 1. 在第一个ALV中双击某一行时,获取该行的数据,并将数据传递到第二个ALV中。 2. 在第二个ALV中显示传递过来的数据。 具体实现方式如下: 1. 在第一个ALV中添加双击事件处理程序,获取当前双击行的数据,并将数据传递到第二个ALV中。可以使用函数模块 REUSE_ALV_GRID_DISPLAY 或方法 cl_gui_alv_grid=>factory 创建第二个ALV对象,然后使用 EXPORT TO MEMORY 将数据导出到内存中。 2. 在第二个ALV中添加初始化事件处理程序,从内存中导入数据,并在ALV中显示。可以使用 IMPORT FROM MEMORY 将数据导入到内存中,然后使用 SET_TABLE_FOR_FIRST_DISPLAY 或者 SET_TABLE_FOR_LVC_GRID 方法设置ALV显示的数据和属性。 示例代码如下: 第一个ALV: ``` DATA: gv_data TYPE REF TO data. " 双击事件处理程序 DATA: lr_event TYPE REF TO cl_salv_events_table. CREATE OBJECT lr_event EXPORTING iv_event_id = cl_salv_events_table=>event_id_double_click. SET HANDLER handle_double_click FOR lr_event. " 双击处理程序 METHOD handle_double_click. DATA: lr_table TYPE REF TO cl_salv_table, lr_row TYPE REF TO cl_salv_wd_table_row, lv_data TYPE string. " 获取当前双击的行 lr_table = me->alv->get_model( ). lr_row = lr_table->if_salv_wd_table=>get_current_row( ). " 获取行数据 CALL METHOD lr_row->if_salv_wd_table_column~get_value RECEIVING rv_value = lv_data. " 将数据导出到内存中 CREATE DATA gv_data TYPE string. ASSIGN gv_data->* TO FIELD-SYMBOL(<fs_data>). <fs_data> = lv_data. EXPORT gv_data TO MEMORY ID 'ALV_DATA'. " 创建第二个ALV对象并跳转到第二个ALV CALL METHOD cl_salv_table=>factory EXPORTING list_display = if_salv_c_bool_sap=>true IMPORTING r_salv_table = lr_table CHANGING t_table = gt_data. lr_table->display( ). ENDMETHOD. ``` 第二个ALV: ``` " 初始化事件处理程序 METHOD handle_init. DATA: lv_data TYPE string. " 从内存中导入数据 IMPORT gv_data FROM MEMORY ID 'ALV_DATA'. ASSIGN gv_data->* TO FIELD-SYMBOL(<fs_data>). lv_data = <fs_data>. " 设置ALV的数据和属性 CALL METHOD me->alv->set_table_for_first_display EXPORTING i_structure_name = 'SFLIGHT' is_variant = gs_variant CHANGING it_outtab = gt_data. ENDMETHOD. ``` 其中,`gt_data` 为第二个ALV显示的数据,`gs_variant` 为第二个ALV的属性。在实际开发中,需要根据具体需求进行设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值