REUSEALVGRIDDISPLAYLVC超详细讲解.docx

上传人:b****4 文档编号:24571306 上传时间:2023-05-28 格式:DOCX 页数:35 大小:134.94KB
下载 相关 举报
REUSEALVGRIDDISPLAYLVC超详细讲解.docx_第1页
第1页 / 共35页
REUSEALVGRIDDISPLAYLVC超详细讲解.docx_第2页
第2页 / 共35页
REUSEALVGRIDDISPLAYLVC超详细讲解.docx_第3页
第3页 / 共35页
REUSEALVGRIDDISPLAYLVC超详细讲解.docx_第4页
第4页 / 共35页
REUSEALVGRIDDISPLAYLVC超详细讲解.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

REUSEALVGRIDDISPLAYLVC超详细讲解.docx

《REUSEALVGRIDDISPLAYLVC超详细讲解.docx》由会员分享,可在线阅读,更多相关《REUSEALVGRIDDISPLAYLVC超详细讲解.docx(35页珍藏版)》请在冰豆网上搜索。

REUSEALVGRIDDISPLAYLVC超详细讲解.docx

REUSEALVGRIDDISPLAYLVC超详细讲解

ALV开发流程:

 

ALV:

ABAPLISTVIEW,一种比较美观的报表显示工具

REUSE_ALV_LIST_DISPLAY

Grid的是Excel单元格的格式,而list不是

REUSE_ALV_GRID_DISPLAY可以控制某一行某一列,甚至某一格(CELL)的读写

 

ALV用到的函数,目前我们有2个:

REUSE_ALV_GRID_DISPLAY、REUSE_ALV_GRID_DISPLAY_LVC;两个函数都可以将数据用ALV的形式显示出来,只是在一些小的地方有些不同。

其中这两个函数都用到的全局变量为:

1个类型池SLIS和一个指定列数的变量

DATA:

 v_posTYPE i.  " 指定第几列pos表示列

第1个函数用到的全局变量如下:

都是slis类型池中的类型,结尾都是alv(表示他们用于alv)

DATA:

 wa_fieldcat TYPE slis_fieldcat_alv ,    " 相当于工作区

     i_fieldcat  TYPE slis_t_fieldcat_alv ,  " 存放列名的表

     i_layout    TYPE slis_layout_alv .      " 负责整个ALV的全局属性

第2个函数用到的全局变量:

DATA:

 wa_fieldcat TYPE lvc_s_fcat , " 相当于工作区

      i_fieldcat_lvc  TYPE lvc_t_fcat , " 存放列名的表

      i_layout_lvc    TYPE lvc_s_layo . " 负责整个ALV的全局属性

下面以第2个函数(REUSE_ALV_GRID_DISPLAY_LVC)来介绍ALV的用法;

1.将得到并整理好的数据以ALV的形式显示出来

1.1.在子FORM(这里如:

F_FIELDS)指定需要显示的字段wa_fieldcat工作区,可以赋值

  v_pos = v_pos + 1 .初始值是零

  wa_fieldcat-col_pos     = v_pos .       " 指定列数

  wa_fieldcat-fieldname    = 'PSPID' .     " 需要输出的表的字段名

  wa_fieldcat-scrtext_l     = '项目定义 '.  " 字段的描述-长字段标签screentextlong

  wa_fieldcat-scrtext_m     = '项目定义 '.  " 字段描述-中字段标签

  wa_fieldcat-scrtext_s     = '项目定义 '.  " 字段描述-短字段标签

  wa_fieldcat-fix_column    = 'X' .         " 是否是固定列column['kɔləm]列

  APPENDwa_fieldcatTOi_fieldcat_lvc.

  CLEARwa_fieldcat.

这样逐步的将需要显示的字段都添加到表i_fieldcat中;

1.2.在子FORM(这里如:

F_BUILD_LAYOUT)里设置ALV的全局属性

  i_layout_lvc-zebra       = 'X' .       " 使ALV界面呈现颜色交替

  i_layout_lvc-sel_mode     = 'A' .       " 选择模式,“A”在最左端有选择按钮

  i_layout_lvc-cwidth_opt   = 'X' .       " 自动优化列宽

  i_layout_lvc-detailinit   = 'X' .       " 是否出现细节屏幕

  i_layout_lvc-detailtitl   = '详细容' . " 细节屏幕标题

1.3.在子FORM(这里如:

F_DISPLAY)里将表中的数据进行显示

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'

    EXPORTING

      i_callback_program          = sy-repid          " 当前程序

      is_layout_lvc               = i_layout_lvc      " 属性表

      it_fieldcat_lvc             = i_fieldcat_lvc[]  " 列明表

      i_save                      = 'X'               " 是否保存布局

    TABLES

      t_outtab                    = i_tab             " 数据表

    EXCEPTIONS

      program_error               = 1

      OTHERS                  = 2.

通过这一步后,一个基本的ALV程序就完成了;下面是对ALV程序的优化和扩展。

1.4.为ALV程序添加表头标题(这里以添加HTML表头标题为主)

1.4.1.在显示ALV的函数(REUSE_ALV_GRID_DISPLAY_LVC)里添加一个参数

i_callback_html_top_of_page       = 'F_TOP_OF_PAGE'

其中“F_TOP_OF_PAGE”是书写ALV表头标题的子FORM,只是在这里使用,没有明显的“PERFORM”调用,如下:

FORM f_top_of_page USING p_cl_dd TYPE REF TO cl_dd_document.

1.4.2.在子FORM(F_TOP_OF_PAGE)里定义好需要的变量

  " 定义登录用户的描述

  DATA:

 l_name TYPE string ,

        name_first LIKE adrp-name_first ,

        name_last  LIKE adrp-name_last .

  " 定义登录日期

  DATA:

 l_date TYPE string .

  " 定义缓冲区变量

  DATA:

 m_p TYPE i ,

        m_buffer TYPE string .

1.4.3.准备好所需数据,如登录用户的描述、制表日期等

  " 得到登录用户的描述

  SELECT SINGLE adrp~name_first

                adrp~name_last

   INTO (name_first,name_last)

   FROM adrp

         INNER JOIN usr21 ON adrp~persnumber = usr21~persnumber

  WHERE usr21~bname = sy-uname .

  IF sy-subrc = 0 .

    CONCATENATE name_last name_first INTO l_name .

  ELSE .

    l_name = sy-uname .

  ENDIF.

  CLEAR name_first .

  CLEAR name_last .

  " 拼接制表日期

  CONCATENATE sy-datum+0(4) '.'

              sy-datum+4

(2) '.'

              sy-datum+6

(2) '.'

         INTO l_date .

1.4.4.将表头数据输出

  " 开始输出表头标题

  m_buffer = '

ALV测试

' .

  CALL METHOD p_cl_dd->html_insert

    EXPORTING

      contents = m_buffer

    CHANGING

      position = m_p.

  " 输出制表人和制表日期

  CONCATENATE '出表人:

' l_name'出表日期:

' l_date INTO m_buffer .

  CALL METHOD p_cl_dd->html_insert

    EXPORTING

      contents = m_buffer

    CHANGING

      position = m_p.

现将需要显示的表头数据放到变量“M_BUFFER”中,然后调用方法“P_CL_DD->HEML_INSERT”将数据插入到HTML页面中显示,至此显示表头数据完成;

2.函数“REUSE_ALV_GRID_DISPLAY_LVC”中输入参数的应用

2.1.排序

排序之前,如果同一列有相同的数据,则排好序以后,在该列会自动将相同的数据合并为一行显示,不再出现多行重复的情况(但是若该ALV中有字段设置了“可编辑”,合并这一现象会失效),步骤如下:

2.1.1.在显示ALV的子FORM里定义排序用到的变量

 " 定义排序变量

  DATA:

 wa_sort_lvc TYPE lvc_s_sort ,struture

     it_sort_lvc TYPE lvc_t_sort .table

2.1.2.设置好需要排序的字段

 " 设置排序参数

  wa_sort_lvc-spos        = 1 .           " 排序顺序

  wa_sort_lvc-fieldname   = 'CITYFROM' .  " 排序字段

  wa_sort_lvc-up          = 'X' .         " 升序

  APPEND wa_sort_lvc TO it_sort_lvc .

  CLEAR wa_sort_lvc .

  wa_sort_lvc-spos        = 2 .           " 排序顺序

  wa_sort_lvc-fieldname   = 'CITYTO' .  " 排序字段

  wa_sort_lvc-up          = 'X' .         " 升序

  APPEND wa_sort_lvc TO it_sort_lvc .

  CLEAR wa_sort_lvc .

2.1.3.在显示ALV的函数的输入参数里添加排序的属性

it_sort_lvc                       = it_sort_lvc

2.2.隐藏不必要的标准按钮

2.2.1.先在显示ALV的子FORM里定义隐藏按钮用到的变量

  " 定义隐藏标准按钮的变量

  DATA:

 wa_excluding TYPE slis_t_extab ,

        it_excluding TYPE slis_extab .

2.2.2.得到需要隐藏的标准按钮的“FCODE”

首先用事务码“SE24”进入SAP的“类别制作器”,在“Objecttype”后面输入ALV的类“CL_GUI_ALV_GRID”,点击“Display”进入显示界面,点击“Attributes”选项卡,找到自己需要的“属性”和“初始值”,这个初始值就是我们要找的标准按钮的“FCODE”(注意:

每一个标准按钮代表的FCODE是靠经验积累而掌握的);

1>、设将需要隐藏的标准按钮的“FCODE”添加到表IT_EXCLUDING中,代码如下:

  " 设置要隐藏的按钮的“FCODE”

  wa_excluding-fcode = '&ABC' .

  APPEND wa_excluding TO it_excluding .

2>、在显示ALV的函数的输入参数里添加隐藏按钮的属性参数:

it_excluding                      = it_excluding

1、ALV标题,定义标题变量并赋值,然后在显示ALV的函数的输入参数里添加“小标题”的参数,代码如下:

  " 小标题

  DATA:

 i_grid_title TYPE lvc_title .

  i_grid_title = '小标题'.

**********************************

i_grid_title = i_grid_title

2.3.自定义“工具栏”

2.3.1.在显示ALV的函数的输入参数里指定自定义按钮的子FORM

i_callback_pf_status_set          = 'F_SET_STATUS'

当然该子FORM和产生表头的子FORM一样,也不显式的调用,代码如下:

FORM f_set_status USING p_extab TYPE slis_t_extab .

  SET PF-STATUS 'Z_ALV_STATUS' .

ENDFORM.                    " f_set_status

双击其中的“Z_ALV_STATUS”,进入创建工具栏的界面,输入名字后进入最终的界面在界面右侧,

点击“应用工具条”后面的展开符号,在“项目”后面的白色方框输入“自定义按钮”的代码后回车,选择静态文本回车,在“函数文本”后面输入想要显示的按钮的名称,在“图标名称”后面选择相应的图标(可选),回车在这一界面选择一个“快捷键”(必填)后回车,这样一个自定义按钮就做好了,也可以修改,记住刚刚创建的按钮的代码,在下面的捕捉用户的动作的自FORM(F_USER_COMMAND)会根据刚才的代码来进行相应的操作;

1、点开“功能键”后面的展开符号,进入功能键的设置,下图是各个动作对应的代码:

2、没有自定义按钮时候,函数里的“i_callback_pf_status_set  = 'F_SET_STATUS'”这个参数可以不要,这时会显示ALV标准的按钮,当然这些按钮可以部分隐藏(见三、2);

3、当我们使用自定义按钮后,ALV自带的标准按钮,就会失效,这时我们需要将一些用户要求我们必须显示的按钮一一地在“应用工具条”后面补上,如下图:

其中“分隔符”的插入方法为:

在需要插入分隔符的方框选择菜单“Edit”“Insert”“Separatorline”即可插入分隔符;

下面是上图中的标准工具的名称、代码、图标名称、快捷键

名称

代码

图标名称

快捷键

刷新

REFRESH

ICON_REFRESH

F8(可随便更改)

导出为EXCEL表格

EXCEL

Shift-F8(可随便更改)

ABC分析

&ABC

ICON_ABC

Ctrl-F1

按升序排列

&OUP

ICON_SORT_UP

Ctrl-F4

设置过滤器

&ILT

ICON_FILTER

Ctrl-F5

总计

&UMC

ICON_SUM

Ctrl-F6

查收件

%SL

ICON_MAIL

Ctrl-F7

更改布局…

&OL0

ICON_ALV_VARIANTS

Ctrl-F8

选择布局…

&OAD

ICON_ALV_VARIANT_CHOOSE

Ctrl-F9

保存布局…

&AVE

ICON_ALV_VARIANT_SAVE

Ctrl-F10

信息

&INFO

ICON_INFORMATION

Ctrl-F12

明细

&ETA

ICON_SELECT_DETAIL

Ctrl-Shift-F3

按降序排列

&ODN

ICON_SORT_DOWN

Ctrl-Shift-F4

删除过滤器

&ILD

ICON_FILTER_UNDO

Ctrl-Shift-F5

小计…

&SUM

ICON_INTERMEDIATE_SUM

Ctrl-Shift-F6

Microsof

&VEXCEL

ICON_XLS

Ctrl-Shift-F7

字处理

&AQW

ICON_WORD_PROCESSING

Ctrl-Shift-F8

本地文件

%PC

ICON_EXPORT

Ctrl-Shift-F9

打印预览

&RNT_PREV

ICON_LAYOUT_CONTROL

Ctrl-Shift-F10

图形

&GRAPH

ICON_GRAPHICS

Ctrl-Shift-F11

上表中红色的属于自定义按钮,自定义按钮可以使用标准的图标名称,也可以不适用图标;

3.热点、用户动作的捕捉、调用其他程序或标准事务程序

3.1.在显示ALV的函数的输入参数里指定捕捉用户动作的子FORM

FORM f_user_command USING p_ucomm TYPE sy-ucomm

                          p_rs_selfield TYPE slis_selfield .

当然该子FORM和产生表头的子FORM一样,也不显式的调用;

3.2.在“字段和列名”的子FORM(F_FIELDS)里,对需要的列添加“热点”属性

  v_pos = v_pos + 1 .

  wa_fieldcat-col_pos       = v_pos .

  wa_fieldcat-fieldname     = 'CITYFROM' .

  wa_fieldcat-scrtext_l     = '起飞城市' .

  wa_fieldcat-fix_column    = 'X' .

  wa_fieldcat-hotspot       = 'X' .     " 热点,用

  APPEND wa_fieldcat TO i_fieldcat .

  CLEAR wa_fieldcat .

这样在显式界面上“起飞城市”所代表的字段“CITYFROM”的下面就会出现一条下划线,同时当鼠标移动到该列时,就会变成“等待”的手势,当用户单击每一条时,就会触动子FORM(F_USER_COMMAND)中的动作,进而引起某些操作;

3.3.操作代码

对于热点,所对应的动作码为“&IC1”,在子FORM(F_USER_COMMAND)中捕捉用户的动作,并进行相应的操作,代码如下:

  FORM f_user_command USING p_ucomm TYPE sy-ucomm

                          p_rs_selfield TYPE slis_selfield .

  CASE p_ucomm.

    WHEN '&IC1' .   " 判断用户的动作

      " 读取用户点击的当前行的一行容

      READ TABLE i_tab INTO wa_tab INDEX p_rs_selfield-tabindex .

      IF p_rs_selfield-fieldname EQ 'CITYFROM'.   " 判断用户点击的是哪一列

        IF NOT wa_tab-cityfrom IS INITIAL .

          PERFORM f_show_detail USING p_rs_selfield .   " 显示具体细节

        ENDIF.

      ELSEIF p_rs_selfield-fieldname EQ 'TCODE' .

        IF NOT wa_tab-tcode IS INITIAL .

          PERFORM f_call_tran USING p_rs_selfield .     " 调用其他事务

        ENDIF .

      ELSEIF p_rs_selfield-fieldname EQ 'ICON_FOLDER' .

        PERFORM f_open_folder USING p_rs_selfield .     " 打开文件

      ENDIF.

      CLEAR wa_tab .

    WHEN '&SAVE_DATA' .

      PERFORM f_save_data .                             " 保存数据

    WHEN 'PRINT' .

      PERFORM f_print_data.                             " 打印数据

    WHEN 'EXCEL' .

      PERFORM f_export .                                " 导出数据

  ENDCASE.

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

ENDFORM.                    " f_user_command

3.4.显示具体细节

1>、先定义一个存放具体容的表并整理好相关数据;

2>、调用一个指定大小的屏幕来显示具体的容,代码如下:

CALL SCREEN 0100 STARTING AT 12 12 ENDING AT 137 24 .

3>、双击该屏幕“0100”创建该屏幕,在“属性”卡输入该屏幕的描述,在“逻辑流”卡里将系统默认注释掉的PBO、PAI事件的模块取消注释并产生这两个模块(双击并确定);

4>、在“屏幕制作器”界面点击

进入“屏幕制作器”的图形界面,开始绘制我们需要的屏幕元素,这里我们需要一个“表控制”(最左边从下数第四个元素),该表格的属性设置为:

名称:

起始行列和高宽

上图表示“列标题”为“具体容”,可以水平或垂直的调节大小,有水平和垂直的分隔符,只能同时选中一行一列,带选择列(DE_BOX),最左端两列固定不滚动;

5>、接下来给单元格和列标题名称并给单元格指定表的字段,

6>、屏幕的PBO、PAI事件的代码如下:

PROCESS BEFORE OUTPUT.

  MODULE status_0100.

  LOOP AT i_detail INTO wa_detail

        WITH CONTROL vs_detail CURSOR i_detail-current_line .

  ENDLOOP.

*

PROCESS AFTER INPUT.

  LOOP AT i_detail .

  ENDLOOP.

  MODULE user_command_0100.

7>、需要在定义变量的时候声明一下表控制和动作的接受者(OK_CODE)如下:

* 表控制IS_MATNR

CONTROLS vs_detail TYPE TABLEVIEW USING SCREEN 0100 .

" 利用同名传递原理,来接受细节屏幕上的元素“ok_code”的值

DATA:

 ok_code TYPE sy-ucomm .

8>“MODULE status_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1