sap之标准ALV

发布时间 2023-05-25 16:41:11作者: 三叶草body

ALV

ALV全称SAP LIST VIEW,是SAP提供的数据报表显示工具。

优点:ALV通过调用标准函数实现,节省了编程时间和代码量。

全局定义:

TYPE-POOLS SLIS.    "类型池SLIS: 

DATA: WA_FIELDCAT TYPE slis_fieldcat_alv ,    "相当于工作区
	  IT_FIELDCAT TYPE slis_t_fieldcat_alv ,  "存放列名的内表
      WA_LAYOUT   TYPE slis_layout_alv .   " 负责整个ALV的全局属性

传统ALV:

* 两个标准函数
* REUSE_ALV_GRID_DISPLAY
* REUSE_ALV_LIST_DISPLAY

* 最新的标准函数
REUSE_ALV_GRID_DISPLAY_LVC

面向对象ALV (OO ALV)

1 设置ALV显示字段的结构

以下两种方式实现。

*----------------------------------------*
* 子程序方式
*----------------------------------------*
FORM ZQM_FIELDCAT USING F_FILEDNAME
                        F_SELTEXT
                        F_KEY
                        F_LEN
                        F_COL.
  CLEAR WA_FIELD.
  
  WA_FIELDCAT-COL_POS = F_COL.           "列的位置
  WA_FIELDCAT-FIELDNAME = F_FILEDNAME.   "字段
  WA_FIELDCAT-SELTEXT_L = F_SELTEXT.     "列名长文本
  WA_FIELDCAT-KEY = F_KEY.
  WA_FIELDCAT-DO_SUM = 'X'.              "求和

  APPEND WA_FIELDCAT TO IT_FIELDCAT.

ENDFORM.                              "ZQM_FIELDCAT


*----------------------------------------*
* 宏方式
*----------------------------------------*
DEFINE EDIT_FIELDCAT.
    WA_FIELDCAT-COL_POS = &1.
    WA_FIELDCAT-FIELDNAME = &2.
*    WA_FIELDCAT-SELTEXT_L = &3.
    WA_FIELDCAT-KEY = &3.
    WA_FIELDCAT-DO_SUM = &4.
    WA_FIELDCAT-REF_TABNAME = &5.
    WA_FIELDCAT-REF_FIELDNAME = &6.
    APPEND WA_FIELDCAT TO IT_FIELDCAT.
END-OF-DEFINITION.

2 设置ALV的布局

WA_LAYOUT-ZEBRA        = 'X'.          " 使ALV界面呈现颜色交替
WA_LAYOUT-COLWIDTH_OPTIMIZE   = 'X'.   " 自动优化列宽

3 为ALV输出内表排序

* 设置排序参数 
WA_SORT-SPOS        = 2.        " 排序顺序
WA_SORT-FIELDNAME   = 'MATNR'.  " 排序字段
WA_SORT-UP          = 'X'.      " 升序
WA_SORT-SUBTOT      = 'X'.      "小计
APPEND WA_SORT TO IT_SORT.  
CLEAR WA_SORT.

4 ALV标准函数-REUSE_ALV_GRID_DISPLAY

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*     I_INTERFACE_CHECK                 = ' '
*     I_BYPASSING_BUFFER                = ' '
*     I_BUFFER_ACTIVE                   = ' '
     I_CALLBACK_PROGRAM                = SY-REPID         "下面两个参数只要有一个使用,该参数就要使用
     I_CALLBACK_PF_STATUS_SET          = 'SET_PF_STATUS'  " 自定义状态栏, 参数是子程序名称
     I_CALLBACK_USER_COMMAND           = 'USER_COMMAND'   " 自定义执行事件,参数是子程序名称
     I_CALLBACK_TOP_OF_PAGE            = 'TOP_OF_PAGE'    "设置表头
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
     I_CALLBACK_HTML_END_OF_LIST       = 'END_OF_LIST'    "设置表尾
*     I_STRUCTURE_NAME                  =
*     I_BACKGROUND_ID                   = ' '
*     I_GRID_TITLE                      =
*     I_GRID_SETTINGS                   =
     IS_LAYOUT   = wa_layout     "报表样式
     it_fieldcat = it_fieldcat   "列字段展示
*     IT_EXCLUDING                      =
*     IT_SPECIAL_GROUPS                 =
     IT_SORT     =  it_sort       "排序
*     IT_FILTER   =
*     IS_SEL_HIDE =
*     I_DEFAULT   = 'X'
*     I_SAVE      = ' '
*     IS_VARIANT  =
*     IT_EVENTS   =
*     IT_EVENT_EXIT                     =
*     IS_PRINT    =
*     IS_REPREP_ID                      =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE                 = 0
*     I_HTML_HEIGHT_TOP                 = 0
*     I_HTML_HEIGHT_END                 = 0
*     IT_ALV_GRAPHICS                   =
*     IT_HYPERLINK                      =
*     IT_ADD_FIELDCAT                   =
*     IT_EXCEPT_QINFO                   =
*     IR_SALV_FULLSCREEN_ADAPTER        =
*     O_PREVIOUS_SRAL_HANDLER           =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab    = it_vbap    " 这个必填参数,输出的内表数据
*   EXCEPTIONS
*     PROGRAM_ERROR                     = 1
*     OTHERS      = 2
    .
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

* 定义 响应执行事件的子程序  包括响应状态栏上的事件码
FORM USER_COMMAND  USING r_ucomm LIKE sy-ucomm
                         rs_selfield TYPE slis_selfield.
  CASE r_ucomm.
    WHEN '&IC1'.
*      MESSAGE I003(Z_FC).
      MESSAGE I002(Z_FC) WITH rs_selfield-tabindex rs_selfield-fieldname.
    WHEN 'MESS'.
      MESSAGE '你点击了消息按钮' TYPE 'I'.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.

* 自定义状态栏
FORM SET_PF_STATUS USING rt_extab TYPE slis_t_extab.
  DATA: WA_EXTAB LIKE LINE OF rt_extab.
  WA_EXTAB-fcode = '&INFO'.
  APPEND WA_EXTAB TO rt_extab.
  SET PF-STATUS 'STATUS' EXCLUDING rt_extab.  " 排除rt_extab中的状态栏按钮
ENDFORM.

* 设置表头子程序
 FORM TOP_OF_PAGE.
   DATA: it_list_commentary type slis_t_listheader WITH HEADER LINE.
   it_list_commentary-typ = 'H'.
   it_list_commentary-info = '销售报表'.
   APPEND it_list_commentary.
   it_list_commentary-typ = 'S'.
   it_list_commentary-info = sy-datum.
   APPEND it_list_commentary.

   CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
     EXPORTING
       it_list_commentary       = it_list_commentary[]
*      I_LOGO                   =
*      I_END_OF_LIST_GRID       =
*      I_ALV_FORM               =
             .

 ENDFORM.
 
* 设置表尾
FORM END_OF_LIST using cl_dd type ref to cl_dd_document.
  CALL METHOD cl_dd->add_text
    EXPORTING
      text          =  '这是表尾'
      .
  CALL METHOD cl_dd->add_icon
    EXPORTING
      sap_icon         = 'ICON_ADDRESS'
      .

ENDFORM.

5 更改ALV字段并同步自建数据表

参考ABAP数据表操作教程。

ALV报表数据怎么可以实现可编辑? 然后可以保存到自建表ZTVBAP_TEST中?

  • 修改ALV字段展示属性值。

    "修改alv显示字段属性 edit
    wa_fieldcat-edit = 'X'.
    "指定显示字段可编辑
    MODIFY it_fieldcat FROM wa_fieldcat TRANSPORTING edit WHERE fieldname = 'KWMENG'.
    CLEAR wa_fieldcat.
    
  • 声明与自建表同名的工作区, 并定义一个内表

    "声明与自建表同名的工作区
    TABLES:ZTVBAP_TEST.
    "定义一个内表
    DATA: IT_ZTVBAP_TEST TYPE STANDARD TABLE OF ZTVBAP_TEST.
    
  • 执行点击保存事件,调子程序:PERFORM SAVE_DATA.

    * 定义 响应执行事件的子程序
    FORM USER_COMMAND  USING r_ucomm LIKE sy-ucomm
                             rs_selfield TYPE slis_selfield.
      CASE r_ucomm.
        WHEN '&IC1'.
    *      MESSAGE I003(Z_FC).
          MESSAGE I002(Z_FC) WITH rs_selfield-tabindex rs_selfield-fieldname.
        WHEN 'MESS'.
          MESSAGE '你点击了消息按钮' TYPE 'I'.
        WHEN 'CLEAR'.
          PERFORM clear_data.         "清空字段数据
          rs_selfield-refresh = 'X'.  "刷新界面
        WHEN '&DATA_SAVE'.
          " 保存数据
          PERFORM SAVE_DATA.
        WHEN OTHERS.
      ENDCASE.
    ENDFORM.
    
  • 子程序

    GET_GLOBALS_FROM_SLVC_FULLSCR函数将传统的alv转变为面向对象的alv,可以保证数据同步。

    FORM save_data .
      DATA: G_GRID TYPE REF TO CL_GUI_ALV_GRID.
    
      " 使用OO 的刷新方式,先使用GET_GLOBALS_FROM_SLVC_FULLSCR接收屏幕ALV,放置容器,再调用刷新方法
      CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    *   EXPORTING
    *     IR_SALV_FULLSCREEN_ADAPTER       =
       IMPORTING
    *     ET_EXCLUDING                     =
    *     E_REPID                          =
    *     E_CALLBACK_PROGRAM               =
    *     E_CALLBACK_ROUTINE               =
         E_GRID                           = G_GRID
    *     ET_FIELDCAT_LVC                  =
    *     ER_TRACE                         =
    *     E_FLG_NO_HTML                    =
    *     ES_LAYOUT_KKBLO                  =
    *     ES_SEL_HIDE                      =
    *     ET_EVENT_EXIT                    =
    *     ER_FORM_TOL                      =
    *     ER_FORM_EOL                      =
                .
      " 同步数据 将alv中的数据同步到内表中
      CALL METHOD g_grid->check_changed_data
    *    IMPORTING
    *      e_valid   =
    *    CHANGING
    *      c_refresh = 'X'
          .
      
      "获取数据
      LOOP AT it_vbap INTO wa_vbap.
        " 只有 wa_vbap 中的字段与 ZTVBAP_TEST 字段一致的才会迁移。
        " MOVE-CORRESPONDING wa_vbap TO ZTVBAP_TEST.
        ZTVBAP_TEST-ZWERKS = wa_vbap-werks.
        ZTVBAP_TEST-ZMATNR = wa_vbap-MATNR.
        ZTVBAP_TEST-ZKWMENG = wa_vbap-KWMENG.
        ZTVBAP_TEST-ZMEINS = wa_vbap-MEINS.
        APPEND ZTVBAP_TEST TO IT_ZTVBAP_TEST.
        CLEAR ZTVBAP_TEST.
      ENDLOOP.
      " 更新或新建数据
      MODIFY ZTVBAP_TEST FROM TABLE IT_ZTVBAP_TEST.
    
    ENDFORM.