ALV开发流程:
1. 将得到并整理好的数据以ALV的形式显示出来 4
1.1. 在子FORM(这里如:F_FIELDS)指定需要显示的字段 4
1.2. 在子FORM(这里如:F_BUILD_LAYOUT)里设置ALV的全局属性 4
1.3. 在子FORM(这里如:F_DISPLAY)里将内表中的数据进行显示 51.4. 为ALV程序添加表头标题(这里以添加HTML表头标题为主) 5
1.4.1. 在显示ALV的函数(REUSE_ALV_GRID_DISPLAY_LVC)里添加一个参数 5
1.4.2. 在子FORM(F_TOP_OF_PAGE)里定义好需要的变量 5
1.4.3. 准备好所需数据,如登录用户的描述、制表日期等 6
1.4.4. 将表头数据输出 6
2. 函数“REUSE_ALV_GRID_DISPLAY_LVC”中输入参数的应用 7
2.1. 排序 7
2.1.1. 在显示ALV的子FORM里定义排序用到的变量 7
2.1.2. 设置好需要排序的字段 8
2.1.3. 在显示ALV的函数的输入参数里添加排序的属性 8
2.2. 隐藏不必要的标准按钮 8
2.2.1. 先在显示ALV的子FORM里定义隐藏按钮用到的变量 8
2.2.2. 得到需要隐藏的标准按钮的“FCODE” 8
2.3. 自定义“工具栏” 9
2.3.1. 在显示ALV的函数的输入参数里指定自定义按钮的子FORM 9
3. 热点链接、用户动作的捕捉、调用其他程序或标准事务程序 11
3.1. 在显示ALV的函数的输入参数里指定捕捉用户动作的子FORM 11
3.2. 在“字段和列名”的子FORM(F_FIELDS)里,对需要链接的列添加“热点”属性 11
3.3. 操作代码 11
3.4. 显示具体细节 12
3.5. 调用其他事务 14
3.6. 打开并选择文件: 14
4. 关于设置字段和列名的子FORM(F_FIELDS)的参数设置: 15
4.1. 单列优化宽度 15
4.2. 单列求和或者取消求和,添加属性 15
4.3. 对其方式 15
4.4. 作为图标输出 16
4.5. 固定列和关键列 16
4.6. 列的字符宽度 16
5. 单元格的F1、F4帮助: 17
5.1. F1帮助: 17
5.2. F4帮助: 17
6. 输入并保存、回调修改内表(输入时的小数位错位的问题、指定数据类型、小说位数) 17
7. 界面颜色的更改 18
7.1. 更改单元格(字体)的前景、背景颜色 19
7.2. 更改行的颜色和列的颜色: 19
7.3. 利用设置字段和列名子的FORM(F_FIELDS)里来设置列的颜色 20
8. ALV自带的最左端复选框按钮和自定义复选框按钮 20
8.1. ALV自带的复选框按钮: 20
8.2. 自定义复选框按钮 20
9. 按照上传的模板格式导出为本地文件 21
9.1. 定义导出为EXCEL用到的数据变量 21
9.2. 上传模板 21
9.3. 代码 22
10. 为ALV标题添加图片 26
10.1. 上传图片 26
10.2. 在子FORM(F_TOP_OF_PAGE2)里的代码
ALV:ABAP LIST VIEW,一种比较美观的报表显示工具
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_pos TYPE 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 = ‘项目定义 ‘. " 字段的描述-长字段标签 screen text long
wa_fieldcat-scrtext_m = ‘项目定义 ‘. " 字段描述-中字段标签
wa_fieldcat-scrtext_s = ‘项目定义 ‘. " 字段描述-短字段标签
wa_fieldcat-fix_column = ‘X‘ . " 是否是固定列 column [‘k?l?m]列
APPEND wa_fieldcat TO i_fieldcat_lvc.
CLEAR wa_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 = ‘<HTML><CENTER><H1>ALV测试</H1></CENTER></HTML>‘ .
CALL METHOD p_cl_dd->html_insert
EXPORTING
contents = m_buffer
CHANGING
position = m_p.
" 输出制表人和制表日期
CONCATENATE ‘<P ALIGN = CENTER >出表人:‘ 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的“类别制作器”,在“Object type”后面输入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”?“Separator line”即可插入分隔符;
下面是上图中的标准工具的名称、代码、图标名称、快捷键
名称 代码 图标名称 快捷键
刷新 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_0100.”的代码如下:
MODULE status_0100 OUTPUT.
SET PF-STATUS ‘0100‘ .
DESCRIBE TABLE i_detail LINES vs_detail-current_line .
ENDMODULE. " status_0100 OUTPUT
在“0100”的工具栏里,只设置 即可满足需求;
“MODULE user_command_0100.”的代码如下:
MODULE user_command_0100 INPUT.
CASE ok_code.
WHEN ‘BACK‘ .
SET SCREEN 0 . " 返回主屏幕
ENDCASE.
ENDMODULE. " user_command_0100 INPUT
完成调用细节屏幕;
注意:在显示细节屏幕的字段的类型上,当内表中有数据为货币类型的时候,要在“格式”里指明该字段是货币类型的数据,如下图:
3.5. 调用其他事务
FORM f_call_tran USING p_rs_selfield TYPE slis_selfield .
SET PARAMETER ID ‘LIB‘ FIELD p_rs_selfield-value .
CALL TRANSACTION ‘SE37‘ ."AND SKIP FIRST SCREEN .
ENDFORM. " f_call_tran
“LIB”是指参数ID,查找方法:用一个事务码进入事务界面,在输入框内按F1,在弹出来的界面中点击 ,新界面中的 就是参数ID;
“SE37”是指我们要调用的事务代码,“AND SKIP FIRST SCREEN”表示跳过第一屏屏幕;
3.6. 打开并选择文件:
1> 、现则内表中定义好存放文件路径的字段(这里是FILE_PATH),当用户点击界面上设置好的打开文件图标时,就会触发子FORM(F_USER_COMMAND)里的打开文件的子FORM
(F_OPEN_FOLDER);
2> 子FORM(F_OPEN_FOLDER)的代码如下:
FORM f_open_folder USING p_rs_selfield TYPE slis_selfield .
DATA: l_file_path LIKE rlgrap-filename .
CALL FUNCTION ‘WS_FILENAME_GET‘
EXPORTING
mode = ‘O‘
title = ‘选择文件‘
IMPORTING
filename = l_file_path
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc = 0.
wa_tab-file_path = l_file_path . " 将得到的文件的路径赋给当前行的路径
MODIFY i_tab INDEX wa_tab-numer FROM wa_tab TRANSPORTING file_path .
CLEAR l_file_path .
ELSE .
MESSAGE s000 WITH ‘没有选择文件‘ .
ENDIF.
ENDFORM. " f_open_folder
4. 关于设置字段和列名的子FORM(F_FIELDS)的参数设置:
4.1. 单列优化宽度
当在子FORM(F_BUILD_LAYOUT)里没有指明全局优化列宽的时候,在需要指定优化的字段的属性里指定下列属性就可以单列优化了,
wa_fieldcat-col_opt = ‘X‘ .
4.2. 单列求和或者取消求和,添加属性
wa_fieldcat-do_sum = ‘X‘ . " 求和
wa_fieldcat-no_sum = ‘X‘ . " 取消求和
如果此时在子FORM(F_BUILD_LAYOUT)里添加下列属性,则求和后的行就会在第一行出现:
i_layout-totals_bef = ‘X‘ .
4.3. 对其方式
wa_fieldcat-just = ‘L‘ . " 左对齐
wa_fieldcat-just = ‘C‘ . " 居中对齐
wa_fieldcat-just = ‘R‘ . " 右对齐
当然,在不指明对其方式的前提下,ABAP的各种数据类型优默认的对其方式,其中字符串是默认为左对齐,而货币、数量默认为右对齐;
4.4. 作为图标输出
1> 、首先在开始包含进一个包括,如下:
" 包含图标等在内的一些信息
INCLUDE <list> .
2> 、然后在内表中定义一个代表图标的字段(这里如ICON_FOLDER),在整理数据的时候,需要将代表图标的代码赋给给字段,如下
" 图标
wa_banfn-icon_folder = icon_object_folder .
3> 、接着在子FORM(F_FIELDS)里给需要图标显示的列添加下列属性:
v_pos = v_pos + 1 .
wa_fieldcat-col_pos = v_pos .
wa_fieldcat-fieldname = ‘ICON_FOLDER‘ .
wa_fieldcat-scrtext_l = ‘ICON‘ .
wa_fieldcat-icon = ‘X‘ . " 图标
wa_fieldcat-hotspot = ‘X‘ .
APPEND wa_fieldcat TO i_fieldcat .
CLEAR wa_fieldcat .
这样图标就可以在ALV界面中显示了,其中添加“热点”的目的是为了当用户点击该图标的时候,可以触发一系列的操作,如文件的选择等等;
注意:图标的名称用事务码“ICON”进入后左边第二列就是图标代码,根据需要进行选择;
4.5. 固定列和关键列
两者都可以使具有该属性的列固定不滚动,但是前者不改变该列的颜色,而后者会将该列的颜色弄成一色,不容易确认,但它具有其他的功能,代码如下:
wa_fieldcat-fix_column = ‘X‘ . " 固定列
wa_fieldcat-key = ‘X‘ . " 关键列
4.6. 列的字符宽度
可以明显地指明该列的输出宽度,属性代码如下:
wa_fieldcat-outputlen = 10 . " 输出宽度
列抬头的工具提示,在列的属性添加下列参数,当用户将鼠标放到列名上时,可以显示“提示”2字,代码如下:
wa_fieldcat-tooltip = ‘提示‘ .
5. 单元格的F1、F4帮助:
5.1. F1帮助:
1> 、在子FORM(F_FIELDS)里列的属性添加“数据元素”这一属性,代码如下:
wa_fieldcat-rollname = ‘PS_PSPID‘ . " 指定数据元素
就可以在ALV的显示界面将鼠标放到该字段的位置后按F1会弹出该字段的说明;
2> 、指定数据元素之后,可以不指明字段的描述(如SCRTEXT_L、SCRTEXT_M、SCRTEXT_S),函数会自动将字段的描述显示,但是没有自己指定的灵活
5.2. F4帮助:
1> 、在子FORM(F_FIELDS)里列的属性添加下列属性,代码如下:
wa_fieldcat-ref_field = ‘PSPID‘ .
wa_fieldcat-ref_table = ‘PROJ‘ .
这样在ALV的显示界面,在该字段处就可以按F4来查看相关的内容了;
6. 输入并保存、回调修改内表(输入时的小数位错位的问题、指定数据类型、小说位数)
1、 首先在显示ALV的子FORM(F_DISPLAY)里定义“回调”的变量,如下:
" 回调变量
DATA: i_grid_settings TYPE lvc_s_glay .
i_grid_settings-edt_cll_cb = ‘X‘ .
2、 在显示ALV的函数(REUSE_ALV_GRID_DISPLAY_LVC)里添加输入参数如,下:
i_grid_settings = i_grid_settings
这时只要在显示界面可编辑字段上修改了数据,回车后就会立即将内表的数据也修改了;
3、 对于货币字段,要在其设置字段和列名的属性中再添加一个“指定数据类型”的属性,如下:
wa_fieldcat-datatype = ‘CURR‘ . " 指定数据类型
这样在修改数据并保存时,才能将数据保持原样,否则输入的数据会自动将小数点提前2位;
4、 对于数量字段,也要添加一个“指定数据类型”的属性,才能保持数据的正确性,如下:
wa_fieldcat-datatype = ‘QUAN‘ . " 指定数据类型
wa_fieldcat-inttype = ‘C‘ .
5、 将界面数据保存到数据库表中,触发事件见子FORM中的F_SAVE_DATA,代码如下:
FORM f_save_date .
DATA: i_spfli LIKE TABLE OF spfli WITH HEADER LINE .
DATA: l_error TYPE REF TO cx_sy_open_sql_db ,
l_error2 TYPE REF TO cx_sy_arithmetic_overflow ,
l_error_text TYPE string .
" 将界面上的数据转接到和被修改的数据库表的结构一样的内表中
LOOP AT i_tab INTO wa_tab .
i_spfli-carrid = ‘ZZ‘ .
i_spfli-connid = sy-tabix .
i_spfli-cityfrom = wa_tab-cityfrom .
i_spfli-airpfrom = wa_tab-airpfrom .
i_spfli-cityto = wa_tab-cityto .
i_spfli-airpto = wa_tab-airpto .
i_spfli-distance = wa_tab-distance .
APPEND i_spfli .
CLEAR i_spfli .
ENDLOOP.
" 保存到数据库
TRY .
DELETE spfli FROM TABLE i_spfli .
INSERT spfli FROM TABLE i_spfli .
CATCH cx_sy_open_sql_db INTO l_error .
l_error_text = l_error->get_text( ) .
sy-subrc = 1 .
ENDTRY .
IF sy-subrc NE 0 .
ROLLBACK WORK .
MESSAGE e000 WITH l_error_text .
CLEAR l_error_text .
ELSE .
MESSAGE s000 WITH ‘数据保存成功!‘ .
ENDIF.
CLEAR i_spfli .
REFRESH i_spfli .
ENDFORM. " f_save_date
7. 界面颜色的更改
ALV中的颜色代码共有4位,其中C是固定的第一位(代表COLOR),第二位代表是颜色编码(1到7),第三位是加强颜色的设置(1表示打开,0表示关闭),第四位是减弱颜色(1表示打
开,0表示关闭),个人理解,在强化关闭的情况下,相反的作用是背景和字体的变化:
7.1. 更改单元格(字体)的前景、背景颜色
1> 、在定义内表的时候定义一个代表单元格颜色的字段,如下:
cell_color TYPE slis_t_specialcol_alv
2> 、在子FORM(F_BUILD_LAYOUT)里,要指明代表单元格颜色的字段的名称,如下:
i_layout-ctab_fname = ‘CELL_COLOR‘. " 单元格颜色设置
3> 、在子FORM(F_CELL_COLOR)里给代表单元格颜色的字段赋值,如下:
FORM f_cell_color .
" 单元格颜色
DATA: l_cellcolor TYPE slis_specialcol_alv .
LOOP AT i_tab INTO wa_tab .
IF wa_tab-price > 500 .
l_cellcolor-fieldname = ‘PRICE‘ . " 要修改颜色的字段名
l_cellcolor-color-col = 6 . " 颜色(1-7)
l_cellcolor-color-inv = 1 . " 前景字体(int代表背景颜色)
APPEND l_cellcolor TO wa_tab-cell_color .
CLEAR l_cellcolor .
ENDIF.
MODIFY i_tab INDEX wa_tab-numer FROM wa_tab TRANSPORTING cell_color .
CLEAR wa_tab .
ENDLOOP.
ENDFORM. " f_cell_color
7.2. 更改行的颜色和列的颜色:
1> 、在定义内表的时候定义一个代表行列颜色的字段,如下:
line_color(4) TYPE c
2> 、在子FORM(F_BUILD_LAYOUT)里,要指明代表行列颜色的字段的名称,如下:
i_layout-info_fname = ‘LINE_COLOR‘ . " 行列颜色
3> 、在子FORM(F_LINE_COLOR)里给代表行列颜色的字段赋值,如下:
FORM f_line_color .
DATA: l_i TYPE i .
LOOP AT i_tab INTO wa_tab .
l_i = sy-tabix MOD 2 .
IF l_i = 0 .
wa_tab-line_color = ‘C311‘ .
MODIFY i_tab INDEX wa_tab-numer FROM wa_tab TRANSPORTING line_color .
CLEAR wa_tab .
ENDIF.
ENDLOOP.
ENDFORM. " f_line_color
7.3. 利用设置字段和列名子的FORM(F_FIELDS)里来设置列的颜色
wa_fieldcat-emphasize = ‘C711‘ .
注意: 颜色设置中有优先级顺序,他们是单元格-->行-->列,即若同时使用了上述3中更改颜色的方法,则列的颜色会被行的颜色覆盖掉,而行的颜色又会背单元格的颜色覆盖掉,
最终只会显示出单元格的颜色.
8. ALV自带的最左端复选框按钮和自定义复选框按钮
8.1. ALV自带的复选框按钮:
在定义内表时,需要指明代表复选框的字段,这里如:BOX_NAME,然后在定义ALV全局属性的子FORM(F_BUILD_LAYOUT)里指明代表复选框的字段,如下:
i_layout-box_fname = box_fname .
8.2. 自定义复选框按钮
需要在子FORM(F_FIELDS)里添加下列如下语句:
wa_fieldcat-col_pos = v_pos .
wa_fieldcat-fieldname = ‘CHECKBOX‘ .
wa_fieldcat-scrtext_m = ‘复选框‘ .
wa_fieldcat-checkbox = ‘X‘ .
wa_fieldcat-edit = ‘X‘ .
wa_fieldcat-just = ‘C‘ .
wa_fieldcat-fix_column = ‘X‘ .
APPEND wa_fieldcat TO i_fieldcat .
CLEAR wa_fieldcat .
该功能必须在在显示ALV的函数的子FORM(F_DISPLAY)里添加“回调”的输入参数,这样当用
户点击复选框后才能将改变写回到内表中,代码如下
DATA: l_grid_settings TYPE lvc_s_glay .
l_grid_settings-edt_cll_cb = ‘X‘ .
i_grid_settings = l_grid_settings
9. 按照上传的模板格式导出为本地文件
9.1. 定义导出为EXCEL用到的数据变量
TYPE-POOLS ole2 .
DATA: v_excel TYPE ole2_object,
v_sheet TYPE ole2_object,
v_book TYPE ole2_object,
v_rows TYPE ole2_object,
v_cell TYPE ole2_object,
v_sheet_number TYPE i .
9.2. 上传模板
需要用事务码“SMW0”先上传一个EXCEL模板,步骤:
1> 、SMW0进入界面,选择“WebRFC应用程序的二进制数据”,点击 进入现已界面;
2> 、在“包”后面输入一个包名后点击 或者按F8进入上传模板的主界面,如下图:
3> 、在上图中点击 或者按F5新建一个模板,弹出下图:
输入“对象名称”(一般用程序名+。xls)和“描述”后,点击 或者按“Shift + F6”找到自己存放模板的路径双击上传即可完成模板的上传(名称为Z_ALV.XLS);
9.3. 代码
当用户触动子FORM(F_USER_COMMAND)里的导出程序时,就会触动下列代码,现将模板现在下来,
进而根据模板将数据导出到EXCEL表格中,代码中的许多部分都是固定的,其中的红色底色部分
为需要自己填写代码如下:
*&---------------------------------------------------------------------*
*& Form f_export
*&---------------------------------------------------------------------*
* 导出数据
*----------------------------------------------------------------------*
FORM f_export .
DATA: l_name LIKE wwwdatatab,
l_mine LIKE w3mime OCCURS 10,
l_title TYPE string,
l_filename TYPE string,
l_path TYPE string,
l_fullpath TYPE string.
l_name-relid = ‘MI‘.
l_name-objid = ‘Z_ALV.XLS‘.
l_name-text = sy-title.
CONCATENATE ‘Z_ALV测试_‘ sy-uname ‘_‘ sy-datum ‘_‘ sy-uzeit INTO l_title .
*模板下载
CALL FUNCTION ‘WWWDATA_IMPORT‘
EXPORTING
key = l_name
TABLES
mime = l_mine
EXCEPTIONS
wrong_object_type = 1
import_error = 2
OTHERS = 3.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = l_title
default_extension = ‘xls‘
default_file_name = l_title
file_filter = ‘(电子表格EXCEL)‘
CHANGING
filename = l_filename
path = l_path
fullpath = l_fullpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
STOP.
ENDIF.
IF l_filename = ‘‘.
MESSAGE e000 WITH ‘已取消导出!‘ .
ENDIF.
CALL FUNCTION ‘GUI_DOWNLOAD‘
EXPORTING
filename = l_fullpath
filetype = ‘BIN‘
TABLES
data_tab = l_mine.
*--打开excel模板
PERFORM f_open_excel USING l_fullpath.
*--向excel写数据
PERFORM f_write_excel_sheet.
*--设置excel可见
CALL METHOD OF v_excel ‘Worksheets‘ = v_sheet
EXPORTING
#1 = 1.
CALL METHOD OF v_sheet ‘Activate‘.
SET PROPERTY OF v_excel ‘Visible‘ = 1.
* 关闭EXCEL并保存
PERFORM f_save_excel USING l_fullpath.
ENDFORM. " f_export
*&---------------------------------------------------------------------*
*& Form f_OPEN_EXCEL
*&---------------------------------------------------------------------*
* 根据本地excel路径,打开excel应用
*----------------------------------------------------------------------*
FORM f_open_excel USING pa_path.
CREATE OBJECT v_excel ‘Excel.Application‘.
CALL METHOD OF v_excel ‘Workbooks‘ = v_book.
CALL METHOD OF v_book ‘Open‘ = v_book
EXPORTING
#1 = pa_path.
CALL METHOD OF v_book ‘Sheets‘ = v_sheet
EXPORTING
#1 = 1.
ENDFORM. " f_OPEN_EXCEL
*&---------------------------------------------------------------------*
*& Form f_WRITE_EXCEL_SHEET1
*&---------------------------------------------------------------------*
* 向excel写入数据
*----------------------------------------------------------------------*
FORM f_write_excel_sheet.
TYPES: BEGIN OF typ_name ,
name_first(40) TYPE c ,
name_last(40) TYPE c ,
END OF typ_name .
DATA: i_name TYPE TABLE OF typ_name WITH HEADER LINE .
DATA: l_name(40) TYPE c .
SELECT adrp~name_first
adrp~name_last
INTO CORRESPONDING FIELDS OF TABLE i_name
FROM adrp
INNER JOIN usr21 ON adrp~persnumber = usr21~persnumber
WHERE usr21~bname = sy-uname .
LOOP AT i_name .
CONCATENATE i_name-name_last i_name-name_first INTO l_name .
ENDLOOP.
DATA: l_chars(50) TYPE c,
l_lines TYPE i ,
l_num TYPE i VALUE 4. "行变化,从第几行开始导入
*写入表头
PERFORM f_write_cell USING 1 1 ‘Z_ALV测试‘.
CONCATENATE ‘制表日期:‘ sy-datum+0(4) ‘年‘ sy-datum+4(2) ‘月‘ sy-datum+6(2) ‘日‘ INTO l_chars.
CONDENSE l_chars NO-GAPS .
PERFORM f_write_cell USING 2 1 l_chars.
CONCATENATE ‘制表人:‘ l_name INTO l_name .
CONDENSE l_name NO-GAPS .
PERFORM f_write_cell USING 2 5 l_name.
"通过行列的方式把数据写入到Excel中
LOOP AT i_tab INTO wa_tab .
PERFORM f_write_cell USING l_num 1 wa_tab-numer .
PERFORM f_write_cell USING l_num 2 wa_tab-cityfrom.
PERFORM f_write_cell USING l_num 3 wa_tab-airpfrom.
PERFORM f_write_cell USING l_num 4 wa_tab-cityto.
PERFORM f_write_cell USING l_num 5 wa_tab-airpto.
PERFORM f_write_cell USING l_num 6 wa_tab-distance.
PERFORM f_write_cell USING l_num 7 wa_tab-price.
PERFORM f_write_cell USING l_num 8 wa_tab-tcode.
PERFORM f_write_cell USING l_num 9 wa_tab-file_path.
l_num = l_num + 1 .
CLEAR wa_tab .
ENDLOOP.
ENDFORM. " f_WRITE_EXCEL_SHEET1
*&---------------------------------------------------------------------*
*& Form f_SAVE_EXCEL
*&---------------------------------------------------------------------*
* 保存excel文档
*----------------------------------------------------------------------*
* -->P_L_FULLPATH text
*----------------------------------------------------------------------*
FORM f_save_excel USING pa_fullpath.
SET PROPERTY OF v_excel ‘DisplayAlerts‘ = 0.
CALL METHOD OF v_book ‘SAVEAS‘
EXPORTING
#1 = pa_fullpath.
CALL METHOD OF v_book ‘Exit‘ = v_book.
FREE OBJECT v_excel.
ENDFORM. " f_SAVE_EXCEL
*&---------------------------------------------------------------------*
*& Form f_WRITE_CELL
*&---------------------------------------------------------------------*
* 向excel指定cell写入数据
*----------------------------------------------------------------------*
FORM f_write_cell USING pa_row
pa_col
pa_val.
CALL METHOD OF v_sheet ‘Cells‘ = v_cell
EXPORTING
#1 = pa_row
#2 = pa_col.
SET PROPERTY OF v_cell ‘Value‘ = pa_val.
ENDFORM. " f_WRITE_CELL
10. 为ALV标题添加图片
要使用图片,显示ALV的函数的输入参数中的HTML表头必须换成一般表头,即:
i_callback_html_top_of_page = ‘F_TOP_OF_PAGE1
必须换成
I_CALLBACK_TOP_OF_PAGE = ‘F_TOP_OF_PAGE2‘
10.1. 上传图片
OAER进入参数界面,在“Class name”后面输入“PICTURES”,在“Class Type”后面输入“OT”,在“Object ID”后面输入一个名字,用来标记上传的图片,点击 或按F8进入
上传图片的主界面,点击下面的鄂“Create”展开“Standard.Doc.Types”双击“屏幕”上传自己的图片,指定好“Description”和“KeyWord”方便以后查找,完成图片的上传
,几下“Object ID”,后面的程序中要用到;
10.2. 在子FORM(F_TOP_OF_PAGE2)里的代码
*&---------------------------------------------------------------------*
*& Form f_top_of_page2
*&---------------------------------------------------------------------*
* ALV表头标题
*----------------------------------------------------------------------*
FORM f_top_of_page2 .
DATA: i_header TYPE slis_t_listheader,
wa_header TYPE slis_listheader.
" 定义登录用户的描述
DATA: l_name TYPE string ,
name_first LIKE adrp-name_first ,
name_last LIKE adrp-name_last .
" 定义登录日期
DATA: l_date TYPE string .
" 得到登录用户的描述
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 .
" Image
wa_header-typ = ‘H‘.
wa_header-info = ‘Z_ALV测试‘ .
APPEND wa_header TO i_header .
CLEAR wa_header .
CONCATENATE ‘制表人:‘ l_name INTO l_name .
CONCATENATE ‘制表日期:‘ l_date INTO l_date .
wa_header-typ = ‘S‘.
wa_header-key = l_name .
wa_header-info = l_date .
APPEND wa_header TO i_header .
CLEAR wa_header .
CALL FUNCTION ‘REUSE_ALV_COMMENTARY_WRITE‘
EXPORTING
i_logo = ‘BEPC‘ " OAER中的Object ID
it_list_commentary = i_header
i_alv_form = ‘X‘.
ENDFORM. " f_top_of_page2
效果如下图:
虽然可以传图片,但是灵活度没有F_TOP_OF_PAGE1高;
注意,全部代码:
原文:http://www.cnblogs.com/springzt/p/4442327.html