美文网首页
ABAP报表开发:ALV运用

ABAP报表开发:ALV运用

作者: hitammy | 来源:发表于2016-12-19 12:38 被阅读1939次
    一、ALV是什么?

    ALV(SAP LIST VIEW)是一种比较美观的报表显示工具,具有网格显示方式,有排序、筛选、过滤、(分类)汇总等功能,数据以单元格为单位显示。

    二、 ALV实现方法

    ALV的实现方法有三种:

    • 使用类CL_SALV_TABLE

    • 使用类CL_GUI_GRID_DISPLAY

    • 使用Founction来实现的,REUSE_ALV_GRID_DISPLAY_LVCREUSE_ALV_GRID_DISPLAY,两个函数都可以将数据用ALV的形式显示出来,只是在一些小的地方有些不同。这两个Function的底层也是基于类CL_GUI_GRID_DISPLAY。

      其中这两个函数都用到的全局变量为:
      1个类型池SLIS和一个指定列数的变量DATA: v_pos TYPE i ." 指定第几列
      REUSE_ALV_GRID_DISPLAY_LVC函数用到的全局变量:

    DATA: wa_fieldcat TYPE lvc_s_fcat , " 列名表的工作区            
            i_fieldcat  TYPE lvc_t_fcat , " 存放列名的表           
            i_layout    TYPE lvc_s_layo . " 负责整个ALV的布局属性    ```
    
    #####三、 ALV实例
    下面以REUSE_ALV_GRID_DISPLAY来介绍ALV的用法:
    1. 全局变量声明
    

    ----------------------------------ALV 常用变量声明:------------------------
    TYPE-POOLS:slis. "类型池
    DATA: it_fieldcat TYPE slis_t_fieldcat_al WITH HEADER LINE, "列名集
    i_layout TYPE slis_layout_alv, "设置布局
    g_repid LIKE sy-repid . "程序名
    *页头
    DATA: wa_header TYPE slis_listheader,
    it_header TYPE slis_t_listheader.
    *排序、过滤
    DATA: wa_sort_lvc TYPE slis_sortinfo_alv,
    it_sort TYPE slis_t_sortinfo_alv,
    it_filter TYPE slis_t_filter_alv .

    2. 调用ALV Founction 显示
    

    调用alv显示函数:
    FORM display_data .

    PERFORM f_alv_layout_build CHANGING i_layout.
    PERFORM f_alv_fieldcat_build CHANGING it_fieldcat[].
    PERFORM f_filter_build TABLES it_filter.
    PERFORM f_sort_build TABLES it_sort.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
    i_callback_program = g_repid
    i_callback_pf_status_set = 'SET_PF_STATUS' "ALV工具栏Subroutine(子程序名),没有自定义按钮时候,该参数可以不要,这时会显示ALV标准的按钮;
    i_callback_user_command = 'USER_COMMAND' "LV User Command Subroutine(子程序名)实现对应菜单项的操作响应
    i_callback_top_of_page = 'TOP_OF_PAGE '
    is_layout = i_layout
    it_fieldcat = it_fieldcat[]
    it_sort = it_sort[]
    it_filter = it_filter[]
    TABLES
    t_outtab = it_data[]
    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.

    其中部分参数使用子程序名传递,部分参数变量传递,常用参数如下。
    2. 设置显示的字段集,直接将处理后的it_fieldcat[]赋值给1中的it_fieldcat参数。
    一种是手动设置
    

    宏声明,放在数据定义部分:
    DEFINE mar_out.
    clear it_fieldcat.
    it_fieldcat-fieldname = &1. "字段
    it_fieldcat-tabname = &2. "alv使用的内表
    it_fieldcat-seltext_l = &3. "字段展示文本
    append it_fieldcat.
    if it_fieldcat-fieldname = 'SAKNR' . "为字段SAKNR设置热点
    it_fieldcat-hostpot = 'X' .
    endif.
    END-OF-DEFINITION.

    设置列名的子程序
    FORM f_alv_fieldcat_build CHANGING pt_fieldcat TYPE slis_t_fieldcat_alv.

    FIELD-SYMBOLS <fs_fieldcat> LIKE LINE OF pt_fieldcat.
    mar_out 'BUKRS' 'it_data' '公司代码'. "注意这个地方字段名要大写否则报错
    mar_out 'BUTXT' 'it_data' '公司代码描述'.
    mar_out 'SAKNR' 'it_data' '科目编号'.
    mar_out 'TXT20' 'it_data' '科目名称'.
    mar_out 'B_BALANCE' 'it_data' '期初余额'.
    mar_out 'E_BALANCE' 'it_data' '期末余额'.
    mar_out 'C_BALANCE' 'it_data' '当期发生额'.
    LOOP AT it_fieldcat ASSIGNING <fs_fieldcat> WHERE fieldname = 'BUKRS'.
    <fs_fieldcat>-do_sum = 'X'. "设置按bukrs字段汇总
    ENDLOOP.
    ENDFORM. "f_alv_fieldcat_build

    另一种如果内表结构与数据字典的表结构一致,可以调用REUSE_ALV_FIENDCATALOG_MERGE 函数半自动创建列名集。
    3. 设置布局,将处理后的i_layout 赋值给1中的is_layout。
    

    FORM f_alv_layout_build CHANGING p_layout TYPE slis_layout_alv.
    p_layout-colwidth_optimize = 'X'. " 自动调整列
    p_layout-zebra = 'X'. "间隔行颜色变换显示
    " p_layout-detail_titlebar = '详细内容'. "设置弹出窗口的标题栏
    " p_layout-box_fieldname= 'BOX' "设置grid的多行选择列,其中box必须为内表的一列,为一个字符长度
    " p_layout_no_colhead = 'X'. "不显示列名
    " p_layout_no_vline = 'X'. "不显示列间竖线
    " p_layout-totals_before_items= 'X' "设置grid的合计行显示在明细的上面
    " p_layout-detail_popup= 'X' "设置grid不显示弹出明细显示窗口
    " p_layout-box_fieldname = 'SELFLAG'. "表示ALV行项目选中的字段
    ENDFORM. "f_alv_layout_build

    4. 设置页头,将子程序名 top_of_page赋值给 1中i_callback_top_of_page,注意大写。
    

    FORM top_of_page.
    "定义登录用户的描述
    DATA: l_name TYPE string VALUE '张三',
    l_date TYPE string.
    "拼接制表日期
    CONCATENATE sy-datum+0(4) '.' sy-datum+4(2) '.' sy-datum+6(2) INTO l_date.
    CONCATENATE '制表人:' l_name INTO l_name .
    CONCATENATE '制表日期:' l_date INTO l_date .
    "位于标题第一行
    wa_header-typ = 'H'.
    wa_header-info = 'ALV DEMO' .
    APPEND wa_header TO it_header .
    CLEAR wa_header .
    "相关内容信息,这里用于显示登录用户信息描述
    wa_header-typ = 'S'.
    wa_header-key = l_name .
    wa_header-info = l_date .
    APPEND wa_header TO it_header .
    CLEAR wa_header .
    CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
    it_list_commentary = it_header
    i_alv_form = 'X'. "是否用于 ALV 的FORM中,默认为:Space
    ENDFORM. "top_of_page

    
    5. 设置排序、过滤、汇总,变量赋值给1中对应参数。
    (1)排序用到类型slis_t_sortinfo_alv,按条件把过滤的字段和规则设置好,添加到一个参考slis_t_sortinfo_alv类型的内表,在调用Function的时候指导内表赋给it_sort参数。
    (2)过滤用到类型slis_t_filter_alv,按条件把排序的字段和规则设置好,添加到一个参考slis_t_filter_alv类型的内表,在调用Function的时候把内表的值赋给it_fitler参数。
    (3)分类汇总是汇总和排序两。功能来进行分类和汇总的。按照排序的字段的值进行分类,对已经汇总的字段进行分类汇总。在设置排序的时候设置类型。
    (4)汇总是设置要汇总的字段的Fieldcat属性,设置slis_t_fieldcat_alv-do_sum = ‘X’。
    

    &---------------------------------------------------------------------
    *& Form f_filter_build
    &---------------------------------------------------------------------
    FORM f_filter_build TABLES pt_filter TYPE slis_t_filter_alv.
    DATA wa_filter LIKE LINE OF pt_filter.
    wa_filter-fieldname = 'BUKRS'.
    wa_filter-sign0 = 'E'.
    wa_filter-optio = 'EQ'.
    wa_filter-valut = 'MI '.
    APPEND wa_filter TO pt_filter.
    ENDFORM. "f_filter_build
    &---------------------------------------------------------------------
    *& Form f_sort_build
    &---------------------------------------------------------------------
    FORM f_sort_build TABLES pt_sort TYPE slis_t_sortinfo_alv.
    DATA wa_sort LIKE LINE OF pt_sort.
    wa_sort_lvc-spos = 1 . " 排序顺序
    wa_sort-fieldname = 'BUKRS'. "要排序的字段
    wa_sort-up = 'X'.
    wa_sort-subtot = 'X'. "分类汇总
    APPEND wa_sort TO pt_sort.
    ENDFORM. "f_sort_build

    6. 状态栏和user_usercommand
    

    &---------------------------------------------------------------------
    *& Form set_pf_status
    &---------------------------------------------------------------------
    FORM set_pf_status USING rt_extab TYPE slis_t_extab.
    SET PF-STATUS 'ST_FULL' .
    ENDFORM. "set_pf_status

    &---------------------------------------------------------------------
    *& Form user_command
    &---------------------------------------------------------------------
    FORM user_command USING r_ucomm LIKE sy-ucomm
    rs_selfield TYPE slis_selfield.
    CASE r_ucomm.

    WHEN '&IC1' .             " 判断用户的动作
      READ TABLE i_tab INTO wa_tab INDEX rs_selfield-tabindex .  "读取用户点击的当前行的一行内容 
      IF rs_selfield-fieldname EQ 'saknr'.                       "判断用户点击的是哪个字段
        IF NOT wa_tab-saknr IS INITIAL .
          PERFORM frm_show_detail USING rs_selfield .            " 显示明细
        ENDIF.
      ELSEIF it_data-belnr IS NOT INITIAL AND rs_selfield-fieldname = 'BELNR' .
          SET PARAMETER ID 'BLN' FIELD it_data-belnr.            "将字段值传递给FB03的参数
          SET PARAMETER ID 'BUK' FIELD it_data-bukrs.
          SET PARAMETER ID 'GJR' FIELD it_data-gjahr.
          CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN .         "调用事务码FB03并跳转屏幕     
      ELSEIF rs_selfield-fieldname EQ 'ICON_FOLDER' .
        PERFORM frm_open_folder USING rs_selfield .               " 打开文件
      ENDIF.
      CLEAR wa_tab.
    WHEN '&SAVE_DATA' .
      PERFORM frm_save_data .                             " 保存数据
    WHEN 'PRINT' .
      PERFORM frm_print_data.                             " 打印数据
    WHEN 'EXCEL' .
      PERFORM frm_export .                                " 导出数据
    

    ENDCASE.
    rs_selfield-refresh = 'X' . " 当用户在显式界面上对数据进行修改时,同时内表中的数据也随之刷新
    ENDFORM. "USER_COMMAND

    对于r_ucomm的值,WHEN  '&IC1' . " 判断用户的动作
    
    #####四、ALV更多应用
    在SE38环境下的程序名输入栏输入**’DEMO’**后按F4,可以查到SAP所有的DEMO示例程序,会学到很多ABAP功能的实现方法,输入**’BCALV’**后按F4,可以查到很多ALV示例程序。
    1. BALVSD06 : Output flights (simple version + save)这是该系列范例最简单的一个,建议以此入门。使用的Function Modules :REUSE_ALV_LIST_DISPLAY : 此FM非常重要,用来显示simple interactive list。大家要熟练掌握该FM的输入参数名称和作用,对ALV编程很有帮助。
    2. BALVSD01 : Simple list flight model
    3. BALVSD11 : Simple list with interactions and layouts
    4. BALVHD01 : Hierarchical-sequential list flight model
    5. BALVHD01_GROUP : Hierarchical-sequential list flight model
    
    
    更过细节参考:
    http://www.cnblogs.com/VerySky/articles/3388126.html
    http://blog.sina.com.cn/s/blog_55c871720102w86j.html

    相关文章

      网友评论

          本文标题:ABAP报表开发:ALV运用

          本文链接:https://www.haomeiwen.com/subject/xqimmttx.html