ALV详解:Function ALV(二)

Function ALV
单元格数据修改后立即同步(即立即触发DATA_CHANGED事件)输出内表
如果修改了网格中数据,如果没有设置在单元格内容被修改后失去焦点(或回车)时立即同步到输出内表中(即立触发DATA_CHANGED事件),则输出内表中的数据要等到保存、刷新、切换布局等按钮执行后,才会触发DATA_CHANGED事件,将修改过的数据更新到输出内表中,如果要求在数据修改失去焦点时立即同步到输出内表,则有以下两种方法:
方法一:通过REUSE_ALV_GRID_DISPLAY 函数的i_grid_settings-edt_cll_cb进行设置:
FORM inital .
gt_data-key1 = 'a'.
gt_data-key2 = 'aa'.
APPEND gt_data.
ENDFORM.
方法二:在user_command 回调Form处理:
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-cprog
i_callback_user_command = 'USER_COMMAND'
it_fieldcat = fieldcat[]
TABLES
t_outtab = gt_data.
FORM user_command USING ucomm LIKE sy-ucommselfield selfield TYPE slis_selfield.
DATAl_ref1 TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = l_ref1.
CALL METHOD l_ref1->check_changed_data. "调用此方法后会触发DATA_CHANGED事件。当此方法执行完后,被修改的数据就会更新到输出内表中了
"好像没有上面几行代码,只需下面一行也可以自动更新,上面代码究竟有什么作用?
selfield-refresh = 'X'.
CASE ucomm.
WHEN 'UPDATE'.
PERFORM frm_update.
ENDCASE.
ENDFORM.
输出内表数据更新前触发DATA_CHANGE事件进行数据有效性验证
在DATA_CHANGE事件触发时,可进一步检查数据输入的正确性
),ls_cells TYPE lvc_s_modi.
FIELD-SYMBOLS <fs_value>.
LOOP AT pel_data->mt_mod_cells INTO ls_cells.
CLEAR gt_data.
READ TABLE gt_data INDEX ls_cells-row_id.
CONCATENATE 'GT_DATA-' ls_cells-fieldname INTO l_name.
ASSIGN (l_name) TO <fs_value>.
<fs_value> = ls_cells-value.
"实际上不需要此句来修改输出内表中的数据,因为只要在该Form中不
"弹出 E MSG,则该Form执行完后会也会自动更新输出内表
"MODIFY gt_data INDEX ls_cells-row_id.
ENDLOOP.
ENDFORM.
FORM inital .
gt_data-key1 = 'a'.
gt_data-key2 = 'aa'.
APPEND gt_data.
ENDFORM.
在REUSE_ALV_GRID_DISPLAY[_LVC]函数中获取生成的OO ALV对象
有时REUSE_ALV_GRID_DISPLAY、REUSE_ALV_GRID_DISPLAY_LVC函数并不能满足我们的需要,如通过REUSE_ALV_GRID_DISPLAY_LVC函数设置单元格显示为PushButton时,无法针对Button的单元事件进行处理,所以只能借助于OO的ALV。只需在代码中加入如下代码,即可获取到当前所产生的OO ALV对象,当拿到此对象后,就可以通过cl_gui_alv_grid来完成函数所无法完成的功能:
DATA l_ref1 TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = l_ref1.
除此方法后,还可以在程序中动态获取此对象,可以参考这里
货币类、数量(P小数)类型字段修改时小数点问题
对于货币与P类型小数(如数量)类型字段,需要对gt_fieldcat-datatype属性进行设置,才能将输入的数字保持原样大小,否则输入的数据会自动将小数点提前2位;对于数量类型,好像还需要对gt_fieldcat-INTTYPE属性进行设置才好使,并且只能设置为C类型。datatype与INTTYPE实质上就是一种编辑类型与数据库字段类型的映射,即Hibernate中的ORM(对象关系映射)
datatype:ABAP字典中数据库类型,即SE11创建表结构时所参照的数据库字段类型(ABAP词典类型),取值如下:
ACCP Posting period YYYYMM
CHAR Character String
CLNT Client
CUKY Currency key, referenced by CURR fields
CURR Currency field, stored as DEC
D16D Decimal Floating Point, 16 Digits, DEC on Database
D16R Decimal Floating Point, 16 Digits, RAW on Database
D16S Decimal Floating Point. 16 Digits, with Scale Field
D34R Decimal Floating Point, 34 Digits, RAW on Database
D34S Decimal Floating Point, 34 Digits, with Scale Field
DATS Date field (YYYYMMDD) stored as char(8)
DEC Counter or amount field with comma and sign
FLTP Floating point number, accurate to 8 bytes
INT1 1-byte integer, integer number <= 255
INT2 2-byte integer, only for length field before LCHR or LRAW
INT4 4-byte integer, integer number with sign
LANG Language key
LCHR Long character string, requires preceding INT2 field
LRAW Long byte string, requires preceding INT2 field
NUMC Character string with only digits
PREC Obsolete data type, do not use
QUAN Quantity field, points to a unit field with format UNIT
RAW Uninterpreted sequence of bytes
RSTR Byte String of Variable Length
SSTR Short Character String of Variable Length
STRG Character String of Variable Length
TIMS Time field (hhmmss), stored as char(6)
UNIT Unit key for QUAN fields
VARC Long character string, no longer supported from Rel. 3.0
INTTYPE:ABAP程序内部所使用的一种数据类型,即ABAP数据类型,取值如下:
C Character String
N Character String with Digits Only
D Date (Date: YYYYMMDD)
T Time (Time: HHMMSS)
X Byte Seq. (heXadecimal), in DDIC metadata also for INT1/2/4
I Integer number (4-byte integer with sign)
b 1-byte integer, integer number <= 254
s 2-byte integer, only for length field before LCHR or LRAW
P Packed number
F Floating point number to accuracy of 8 bytes
g Character string with variable length (ABAP type STRING)
y Byte sequence with variable length (ABAP type XSTRING)
u Structured type, flat
v Structured type, deep
h Table type
V Character string (old Dictionary type VARC)
r Reference to class/interface
l Reference to data object
a Decimal Floating Point Number, 16 Digits
e Decimal Floating Point Number, 34 Digits
j Static Boxed Components
k Generic Boxed Components

.
APPEND gt_data.
ENDFORM.
排序、汇总
GRIDALV排序、分类汇总
排序之前,如果同一列有相同的数据,则排好序以后,在该列会自动将相同的数据合并为一行显示,不再出现多行重复的情况(但是若该ALV中有字段设置了“可编辑”,合并这一现象会失效)
只要某字段参设置了gt_sort-down/up,则在展示时,排序以后垂直的网格中相邻相同的单元格就会合并起来(即分类合并,如果要避免合并,请在布局中设置"no_merging"为"X"),而不是看是否设置了gt_sort-subtot属性(该设置只会决定是否进行大汇总与分类小计):
gt_sort-spos = '2'."排序的顺序,如果根据多个字段来排时,决定哪个先排
gt_sort-fieldname = 'KEY2'.
gt_sort-down = 'X'."降序
* gt_sort-subtot = 'X'.
APPEND gt_sort.

虽然INT1、INT2设置了gt_fieldcat-do_sum属性,但没有设置gt_sort-subtot,所以没有进行分类小计,只是对整列进行了合计(如需分类小计,则需要设置gt_sort-subtot):
"需要进行统计的字段:INT1、INT2
if &1 = 'INT1' or &1 = 'INT2'.
gt_fieldcat-do_sum = 'X'.
endif.
gt_sort-spos = '2'."排序的顺序,如果根据多个字段来排时,决定哪个先排
gt_sort-fieldname = 'KEY2'.
gt_sort-down = 'X'."降序
APPEND gt_sort.

设置gt_sort-subtot后,才会对该列进行分类小计:
"需要进行统计的字段:INT1、INT2
if &1 = 'INT1' or &1 = 'INT2'.
gt_fieldcat-do_sum = 'X'.
endif.
gt_sort-spos = '2'."排序的顺序,如果根据多个字段来排时,决定哪个先排
gt_sort-fieldname = 'KEY2'.
gt_sort-down = 'X'."降序
* "是否需要以此字段进行分类合并、并进行小计(注:与本列是否参与排序无关系,只要设置此属性
* "就进行分类合并且小计,但如果设置了按其他列排序,则会对此列分类合并有影响——即
* "相同类型的单格不一定会合并成一个单元格,可能会合并出多个),另外,小计的前提条件是要对gt_fieldcat-do_sum进行了设置
gt_sort-subtot = 'X'.
APPEND gt_sort.

根据KEY1、KEY2多列进行排序且小计:

下面是完整代码:
小分类分隔方式(GROUP = */UL),仅适用于LIST输出的ALV
gt_sort-group = '*/UL'只在REUSE_ALV_LIST_DISPLAY列表方式输出时起作用,对 "REUSE_ALV_GRID_DISPLAY网格输出方式不起作用
无分隔时(不设置gt_sort-group)

线分隔(gt_sort-group = 'UL')

分页方式分隔(gt_sort-group = '*')

表头信息说明
可以通过两种回调方式来实现,第一种:直接通过REUSE_ALV_GRID_DISPLAY函数的i_callback_html_top_of_page来回调Form;第二种:通过REUSE_ALV_GRID_DISPLAY函数的it_events参数接口,向事件内表中Append事件top_of_page与对应的Form
i_callback_html_top_of_page参数回调接口
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = fieldcat[]
i_callback_program = sy-repid
i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
TABLES
t_outtab = t_stock[].
FORM html_top_of_pageUSING r_ddoc TYPE REF TO cl_dd_document.
DATA: text TYPE sdydo_text_element.
CALL METHOD r_ddoc->initialize_document.
CALL METHOD r_ddoc->add_text"控制输出字体为粗体
EXPORTING
text = '行状态图标含义'
sap_emphasis = 'STRONG'.
DEFINE write_inf.
call method r_ddoc->new_line."换行
call method r_ddoc->add_icon"输出图标
exporting
sap_icon = &1.
call method r_ddoc->add_text"输出文本
exporting
text = &2.
END-OF-DEFINITION.
write_inf 'ICON_GREEN_LIGHT' ':商品可用库存'."表头输出的图标及类型
write_inf 'ICON_RED_LIGHT' ':商品非可用库存'.
ENDFORM.

top_of_page事件
位,有一定的局限性,但可采用另一种而向对象方式来实现解决

ALV-F4-Layout、布局变式切换捕获(动态访问函数中定义的全局变量)
REUSE_ALV_GRID_DISPLAY函数的i_save参数值决定了ALV的布局相关的变式,是否可修改及是否只用于特定用户:
' ' = Display variants cannot be saved显示变式,但不能修改,此为默认值
'X' = Standard save mode 标准的保存模式,此模式下变式可存储为标准的变式,但不能存储为用户模式
'U' = User-specific save mode 用户保存模式,哪个创建,只能哪个来用
'A' = Standard and user-specific save mode 标准与用户模式,此模式下可以选择存储为标准还是用户变式
这三个按钮分配是布局修改、布局选择、布局保存,如果不输入或输入空时,没有保存布局
按钮,如在 i_save = 'X'情况下创建创建布局变式:

在 i_save = 'U'情况下创建创建布局变式:

在 i_save = 'A'情况下创建创建布局变式:

当创建完上面三个模式的布局变式时,选择布局时,看到的情况如下:

另外,在创建布局变式时,可以选择是否将某个布局变式设设置为默认的布局,这样在REUSE_ALV_GRID_DISPLAY函数调用时,没有传递is_variant 时,会默认采用此处设置的默认布局,另外默认布局还可以被REUSE_ALV_VARIANT_DEFAULT_GET函数读取出来:

该程序实现了屏幕上选择Layout、获取默认的Layout、检查输入的Layout变式是否存在,获取当前使用的Layout中的显示字段与显示的顺序

.
lt_stock-color = 'C300'.
APPEND lt_stock .
ENDFORM.


红绿灯(layout-lights_fieldname)

START-OF-SELECTION.
PERFORM inital.
DEFINE fill_fdcat.
clear gt_fieldcat.
gt_fieldcat-fieldname = &1.
gt_fieldcat-seltext_l = &2.
"请注意:这里一定要设置一下ddictxt,否则light列标题将显示为Exception
gt_fieldcat-ddictxt= &3.
append gt_fieldcat.
END-OF-DEFINITION.
fill_fdcat 'LIGHT' '红绿灯' 'L'.
fill_fdcat 'VAL' '值' 'L'.
gs_layout-lights_fieldname = 'LIGHT'."指定灯列名
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = gt_fieldcat[]
is_layout = gs_layout
TABLES
t_outtab = gt_data.
FORMinital .
gt_data-light = ' '."取值范围为:空、1~3
gt_data-val = '空'.
APPEND gt_data .
gt_data-light = '1'.
gt_data-val = '1'.
APPEND gt_data .
gt_data-light = '2'.
gt_data-val = '2'.
APPEND gt_data .
gt_data-light = '3'.
gt_data-val = '3'.
APPEND gt_data .
ENDFORM.
F4帮助

,
werks LIKE mard-werks,"工厂
matnr LIKE mara-matnr,"物料
END OF t_stock.
INITIALIZATION.
PERFORM inital.
START-OF-SELECTION.
DEFINE fill_fdcat.
clear fieldcat.
fieldcat-fieldname = &1.
fieldcat-seltext_l = &2.
fieldcat-key = &3.
"如果不设为可编辑,则F4帮助只能看,不能选
fieldcat-edit = 'X'.
if &1 = 'WERKS'.
fieldcat-ref_tabname = 'MARD'. "F4帮助,参照的表
fieldcat-ref_fieldname = 'WERKS'."F4帮助,参照的表中哪个字段
endif.
append fieldcat.
END-OF-DEFINITION.
fill_fdcat 'WERKS' 'WERKS' ''.
fill_fdcat 'MATNR' 'MATNR' ''.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = fieldcat[]
TABLES
t_outtab = t_stock.
FORM inital .
t_stock-werks = '1001'.
t_stock-matnr = '1001M1'.
APPEND t_stock .
ENDFORM.
行多选按钮、复选框

注:按住CTRL键可以选择多行
,
sel,"用来做选择按钮列
checkbox,"用作复选框列
werks LIKE mard-werks,"工厂
matnr LIKE mara-matnr,"物料
END OF gt_stock.
INITIALIZATION.
PERFORM inital.
START-OF-SELECTION.
DEFINE fill_fdcat.
clear gt_fieldcat.
gt_fieldcat-fieldname = &1.
gt_fieldcat-seltext_l = &2.
gt_fieldcat-key = &3.
append gt_fieldcat.
END-OF-DEFINITION.
fill_fdcat 'WERKS' '工厂' 'X'.
fill_fdcat 'MATNR' '物料' 'X'.
"==========复选框设置
CLEAR gt_fieldcat.
gt_fieldcat-seltext_l = '复选框'.
gt_fieldcat-fieldname = 'SEL'.
"当用户点击复选框后,如需将数据更新到输出内表中,则需对REUSE_ALV_GRID_DISPLAY函数参数i_grid_settings-edt_cll_cb进行设置
gt_fieldcat-checkbox = 'X'.
APPEND gt_fieldcat.
gs_layout-box_fieldname = 'CHECKBOX'."行多选择按钮设置
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = gt_fieldcat[]
is_layout = gs_layout
TABLES
t_outtab = gt_stock.
FORM inital .
gt_stock-sel = 'X'.
gt_stock-checkbox = 'X'.
gt_stock-werks = '1001'.
gt_stock-matnr = '1001M1'.
APPEND gt_stock .
CLEAR:gt_stock.
gt_stock-sel = 'X'.
gt_stock-werks = '1001'.
gt_stock-matnr = '1001M2'.
APPEND gt_stock .
ENDFORM.
ALV报表标题

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = gt_fieldcat[]
i_grid_title = 'ALV报表标题'
TABLES
t_outtab = gt_data.
热点

) WITH '热点触发事务码:' r_ucomm.
ENDFORM.
FORM inital .
gt_data-key1 = 'a'.
gt_data-key2 = 'aa'.
APPEND gt_data.
ENDFORM.
ALV详解:Function ALV(二)的更多相关文章
- JavaScript学习笔记-实例详解-类(二)
实例详解-类(二) //===给Object.prototype添加只读\不可枚举\不可配置的属性objectId(function(){ Object.defineProperty(Object ...
- Android开发:文本控件详解——TextView(二)文字跑马灯效果实现
一.需要使用的属性: 1.android:ellipsize 作用:若文字过长,控制该控件如何显示. 对于同样的文字“Android开发:文本控件详解——TextView(二)文字跑马灯效果实现”,不 ...
- ALV详解:Function ALV(一)
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- ALV详解:OO ALV
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- ALV详解:OO SALV
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- dom对象详解--document对象(二)
dom对象详解--style对象 style对象 style对象和document对象下的集合对象styleSheets有关系,styleSheets是文档中所有style对象的集合,这里讲解的 ...
- 【Java入门提高篇】Day30 Java容器类详解(十二)TreeMap详解
今天来看看Map家族的另一名大将——TreeMap.前面已经介绍过Map家族的两名大将,分别是HashMap,LinkedHashMap.HashMap可以高效查找和存储元素,LinkedHashMa ...
- CocoaPods详解之(二)----进阶篇
CocoaPods详解之----进阶篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/19178709 转载请注明出处 ...
- Java源码详解系列(十二)--Eureka的使用和源码
eureka 是由 Netflix 团队开发的针对中间层服务的负载均衡器,在微服务项目中被广泛使用.相比 SLB.ALB 等负载均衡器,eureka 的服务注册是无状态的,扩展起来非常方便. 在这个系 ...
随机推荐
- 系统上线后WCF服务最近经常死掉的原因分析总结
前言 最近系统上线完修改完各种bug之后,功能上还算是比较稳定,由于最近用户数的增加,不知为何经常出现无法登录.页面出现错误等异常,后来发现是由于WCF服务时不时的就死掉了.后来就开始分析问题.得到的 ...
- Junit单步调试
单步调试:主要查看变量内容的变化 1.设置断点位置,设置在可能出现问题的代码 2.点击项目右键以Debug as方式运行程序 3.F5 --> step into 进入方法内部进行调试 ...
- 安装qt5.3.2后,qtcreator在ubuntu 11.04无法启动的问题
在官方网站下载.run文件安装后,qtcreator启动失败,然后找到命令行启动,失败原因如下: shr@shr-Sieyuan:~/Qt5.3.2/Tools/QtCreator/bin$ ./qt ...
- 编写更少bug的程序的六条准则
如何编写更少bug的程序? 尽可能避免常见的程序错误. 沟通设计先行 + 编写可复用代码 + 做得更多 + 做的更少 + 创造“编程心流”+ 严格的程序测试 ...
- 各种数据库连接代码的测试类(java)
测试类: public class Mytest { Connection conn=null; Statement stmt=null; String myDriver="com.mysq ...
- bin和sbin的区别
bin和sbin的区别: bin:用户命令(所有用户均可使用) sbin:管理命令(通常只有管理员可以使用)
- Linux批量修改用户密码
对系统定期修改密码是一个很重要的安全常识,通常,我们修改用户密码都使用passwd user这样的命名来修改密码,但是这样会进入交互模式,即使使用脚本也不能很方便的批量修改,除非使用expect这样的 ...
- mysql表导入到oracle
一.创建jack表,并导入一下数据 mysql),flwo )) engine=myisam; Query OK, rows affected (0.08 sec) mysql> load da ...
- Python入门学习笔记
了解 一下Python中的基本语法,发现挺不适应的,例如变量经常想去指定类型或者if加个括号之类的.这是在MOOC中学习到的知识中一点简单的笔记. Python的变量和数据类型: 1.Python这种 ...
- 搭建LAMP
RPM包和源码包存放位置 /usr/local/src 源码包编译安装位置 /usr/local/apache /usr/local/mysql /usr/local/php 默认MySQL 数据库位 ...