文章目录
1.ABAP 编程中的三种ALV 的展示方式
2. FUNCTION ALV的两种实现方式及常用参数分析总结
3. FUNCTION ALV ALV常见功能点实现
3.1 ALV 可编辑功能
3.2 ALV GUI界面实现与分析
3.3 ALV USER COMMAND 自定义按钮实现 / 通过参数 EVENTS 实现
3.4 ALV 字段使用宏或者单独使用函数封装fieldcat,以及选中复选框、选中行的实现
4.OOALV 与 SALV的实现细节
1.ABAP 编程中的三种ALV 的展示方式
ALV 含义是 ABAP LIST VIEWER 的缩写,它属于实际业务中查询数据或者修改数据时经常使用的程序。ALV包含了实现诸如在展示画面中创建按钮、实现EXCEL文件下载 、word文档保存、合计、筛选等功能的程序包。
1.1 ALV 的三种类型
ALV 分为函数式的 FUNCTION ALV 、利用GRIG控件的GRID ALV、以及SALV。其中后两种使用了面向对象的编程方法。对于SALV而言,它既可以像函数式ALV似的不使用自定义画面而进行全屏报表输出,也可以像GRID ALV那样使用容器在自己画的画面上显示ALV。 SALV 不支持编辑模式,个人觉得用它来做一些弹框画面比较方便的。以grid 风格展示的 ALV 本文重点介绍函数式ALV 与SALV。GRID ALV 之后会专门写一期来进行介绍。
2.FUNCTION ALV 的两种实现方式及常用参数分析总结
调用ALV 前引用类型池SLIS,这两种函数式ALV参数的参考类型都存放在这里面。
2.1 REUSE_ALV_GRID_DISPLAY_LVC
Layout 主要用于设定 ALV 的输出格式,为 ALV 输出的可选项;
Fieldcat 主要用于ALV的结构定义,包括具体的栏位及名称、类型、格式等属性,为 ALV 输出的必选项。
在调用ALV之前,需要先定义Layout 和Fieldcat,他们同属于类型池 SLIS。
(1)为fieldcat 和layout 创建内表和工作区
fieldcat参考表类型为slis_t_fieldcat_alv,参考的结构类型 slis_fieldcat_alv ,通过该结构类型创建的工作区来添加多个字段以及字段对应的一些控制信息
layout设置全局属性,它参考的类型是 slis_layout_alv,相当于结构
对该函数中出现的常用参数含义进行总结:
I_CALLBACK_PROGRAM==:调用ALV的程序名称"通常使用SY-REPID
I_CALLBACK_PF_STATUS_SET==:ALV的GUI
I_CALLBACK_USER_COMMAND==:自定义用户命令的FROM
I_CALLBACK_TOP_OF_PAGE:ALV抬头内容信息
I_CALLBACK_HTML_TOP_OF_PAGE:ALV HTML格式抬头内容信息
I_GRID_TITLE:ALV 标题
I_GRID_SETTINGS:GRID信息
IS_LAYOUT_LVC:ALV输出布局样式
T_FIELDCAT_LVC:设定显示的项目名称及输出设定
IT_EXCLUDING:隐藏设置的ALV工具栏
IT_SORT_LVC:ALV自定义排序
I_DEFAULT:用户是否可以定义默认的布局,'X'-可以定义默认布局,Space-不可以定义默认布局 (默认:X)
I_SAVE:保存表格布局,'X'-只能保存全局变式;'U'-只能保存特定变式;'A'-都可以保存;Space-不能保存变式 (默认:space)
IS_VARIANT:表格布局变式
IT_EVENTS:设置事件, 类型为slis_t_event的内表(name:事件名称,form:事件的FORM)
对该函数中出现的不常用参数含义进行总结:
I_INTERFACE_CHECK: 检查接口一致
I_BYPASSING_BUFFER: 是否使用缓存
I_BUFFER_ACTIVE:是否激活缓存,如果每次显示ALV都是相同的字段目录,则该字段目录会被放到一特殊的缓存里,加快显示速度。
I_CALLBACK_HTML_END_OF_LIST:ALV HTML格式页脚内容信息
I_STRUCTURE_NAME:为输出表数据结构的命名,指定了这个参数,域目录将会自动生成
I_BACKGROUND_ID:ALV背景图片Object ID
IT_SPECIAL_GROUPS / IT_SPECIAL_GROUPS_LVC:若内表中一些字段通过SP_GROUP被分组在一起,必须为这些组传递组文本内表
IT_FILTER / IT_FILTER_LVC:ALV过滤设置
IS_SEL_HIDE:替换或修改屏幕中select-option的值
IT_EVENT_EXIT:设置回调的方法的执行行为,表明用户所写的代码是在执行标准执行之前还是之后
IS_PRINT:后台打印的相关参数
I_SCREEN_START_LINE:以对话框形式显示的开始行
I_SCREEN_END_COLUMN:以对话框形式显示的结束列
I_SCREEN_END_LINE:以对话框形式显示的结束行
I_HTML_HEIGHT_TOP:HTML抬头的高度
I_HTML_HEIGHT_END:HTML页脚的高度
IT_ALV_GRAPHICS:是否可以在图表中显示ALV
IT_HYPERLINK:使用超链接
slis_layout_alv 常用字段
slis_fieldcat_alv 常用字段
2.2 REUSE_ALV_GRID_DISPLAY_LVC
fieldcat参考表类型为 vc_t_fcat ,参考的结构类型是 lvc_s_fcat
layout设置全局属性,它参考的类型是 ==lvc_s_layo
lvc_s_fcat参数
3. FUNCTION ALV ALV常见功能点实现
3.1 ALV编辑功能实现
首先要明确,这两种FUNCTION ALV 都可以实现整列的编辑或者是整表可编辑,实现列编辑 只需要各自的fieldcat中选择edit属性打上’X’即可;实现整个ALV可编辑 在layout 中将edit 设置为’X’即可;当需要实现某单元格可以编辑时,这时必须使用REUSE_ALV_GRID_DISPLAY_LVC ,这是前提条件。下面谈下具体的实现思路:
1.首先要让某列或者整个ALV成为可编辑的
2.对于用来展示ALV表中存放一个STYLE 字段,主要是控制某行是否可编辑(见下图)(由于STYLE 是表,所以还要创建一个工作区来给它添加某行的状态)
3.接下来想办法让某列或者多列的行被设计为不可编辑
(1)定义一个工作区参考lvc_s_style,在展示的表里面定义一个字段表参考 lvc_t_styl,提前将这个表中存的某些行对应的字段设置成不可编辑,如果有行满足我们不让它展示这个目的,就将该表不可编辑的状态赋值给ALV展示数据表中定义的这个表STYLE的工作区,相当于让展示表的某行不可编辑
(2)如上所述,将一列所有行编辑状态进行设置(通过LOOP 展示表实现)
(3)遍历所有的行,找出不需要编辑的行,将行状态放在展示数据的表的STYLE中
(4 )这一步不唯一;对行进行筛选, index = index +1确定行,更新状态,然后用modify 语句更新展示用的内表,user command 回调函数进行刷新
(5)不要忘了在layout-stulename中添加’STYLE’
...
TYPES:BEGIN OF gt_itb,
budat TYPE mkpf-budat,
werks TYPE mseg-werks,
lgort TYPE mseg-lgort, "库存地点
matnr TYPE mseg-matnr,
maktx TYPE makt-maktx, "物料说明
shkzg TYPE mseg-shkzg, "借货标识
menge TYPE mseg-menge,
text TYPE char10,
sel,
check TYPE c LENGTH 1, "复选框
style TYPE lvc_t_styl, "设置控制行字段可编辑所需字段,参考的是表
test,
END OF gt_itb.
*TYPES gt_xxx TYPE TABLE OF 结构类型,参照结构,用table of来声明内表
*TYPES gt_xxx TYPE 表类型 参照数据字典,用type
*with hesderline 自带工作区,叫表头行
DATA: gt_itab TYPE TABLE OF gt_itb WITH HEADER LINE, "定义相关内表,参照结构类型来定义表,结构是一行,用tables of 来定义可以让其成为可以插入多行的表
gs_itab TYPE gt_itb. "定义工作区,也就是定义表里的一行,用type声明的只有一行,type tableof才是多行
...
ls_layout-stylefname = 'STYLE'.
...
FORM editcell .
*将某一列的所有行的编辑状态进行设置,这里设置为不可编辑
gs_field_style-fieldname = 'LGORT'.
gs_field_style-style = cl_gui_alv_grid=>mc_style_disabled.
INSERT gs_field_style INTO TABLE gt_field_style.
*遍历所有行,找出不需要进行编辑的行,将行状态表放在展示数据的表的style字段中
LOOP AT gt_itab INTO gs_itab.
* 根据行具体信息筛选
*这一步仅仅在操作工作区,对行条件进行设置
* IF gs_itab-lgort <> 'JP10'.
* gs_itab-style = gt_field_style.
* ENDIF.
*用工作区将展示数据的表进行更新
sy-index = sy-index + 1.
* 根据索引标识,手动进行+1,对行进行筛选
IF sy-index <> 2.
gs_itab-style = gt_field_style.
MODIFY gt_itab FROM gs_itab INDEX SY-INDEX TRANSPORTING style.
ENDIF.
ENDLOOP.
ENDFORM.
这里是实现的将 LGORT 这列的第二行变为可编辑。
3.2 ALV GUI界面实现与分析
报表执行后,报表显示页面需要展示可以点击的按钮,这些按钮可以来自于常用的程序,也可以由自己进行定义
功能键里面一般就是放最上面的按钮
通过执行事务码SE41,填入SAP标准模板的程序名SAPLKKBL,状态STANDARD_FULLSCREEN,便可剽窃成功。当然自定义的按钮会在user_command 回调函数里面被分类,系统存这个按钮功能吗的变量是sy-ucomm.
下面贴一段代码展示下,gii状态的设置,和其中自定义按钮被执行。
1.设置GUI状态名,这个ALV_PF_STATUS 就是传入ALV函数的参数名
一般都是在alv展示函数里面的 i_callback_pf_status_set = ‘xxx_status’,参数指定子例程如下:
FORM alv_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STATUS' EXCLUDING rt_extab.
ENDFORM .
3.3 ALV USER COMMAND 自定义按钮实现 / 通过参数 EVENTS 实现
1.设置上方工具栏按钮点击后的回调函数,记得要刷新下
一般是在ALV函数中的 i_callback_user_command指定子例程名,在子例程中定义用户操作的代码
FORM alv_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield. "使用该结构获取行
DATA g_grid TYPE REF TO cl_gui_alv_grid.
DATA ls_layout TYPE lvc_s_layo.
DATA l_tabix TYPE sy-tabix.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' "自动刷新数据
IMPORTING
e_grid = g_grid.
CALL METHOD g_grid->check_changed_data.
rs_selfield-refresh = 'X'.
rs_selfield-row_stable = 'X'.
rs_selfield-col_stable = 'X'.
CASE r_ucomm.
WHEN 'ZCREATE' .
PERFORM bapi_deal.
WHEN 'ZFIX'.
PERFORM bdc.
ENDCASE.
ENDFORM.
2.当然,也可以打开ALV输出函数里面的IT_EVENTS选项
IT_EVENTS 需要name 和 form,类似这种,就不用打开 i_callback_pf_status_set 和 i_callback_user_command
DATA: gt_events TYPE slis_t_event .
DATA: gs_events TYPE slis_alv_event.
gs_events -name = 'PF_STATUS_SET'.
gs_events-form = 'SET_STATUS.
gs_events -name = 'ALV_USER_COMMAND'.
gs_events -form = 'USER_COMMAND'.
APPEND gs_events to gt_events.'
3.4 ALV 字段使用宏或者单独使用函数封装fieldcat,以及选中复选框、选中行的实现
一般传入ALV函数中的字段控制表fieldcat 有两种设置方法
1.通过定义宏来批量实现
程序的最前面定义了一个宏add_field
DEFINE add_field.
CLEAR wa_field.
wa_field-fieldname = &1.
wa_field-reptext_ddic = &2.
wa_field-outputlen = &3.
wa_field-edit = &4.
* wa_field-checkbox = &4. "复选框字段
*相当于直接指定某个字段为status,而不用对所有字段一个个去进行设置
CASE &1.
WHEN 'STATUS'.
wa_field-icon = 'X'.
ENDCASE.
*CASE &1.
* WHEN 'BOX'.
* wa_field-CHECKBOX = 'X'.
*ENDCASE.
APPEND wa_field TO it_field.
END-OF-DEFINITION.
在传入ALV函数前给宏里面的字段对应赋值
add_field 'STATUS' '状态灯' '12' ' ' .
add_field 'FMTPURCHASENO' '摩尔委外采购单号' '10' ' ' .
add_field 'FBILLTYPE' '单据类型' '4' ' '.
add_field ' FPRODUTYPE' '生产类型' '4' ' '.
add_field ' FMTPURCHASEROWLKNO' '摩尔外协采购单行号' '4' ' '.
add_field 'MATNR' '比亚迪料号' '40' ' '.
add_field 'FMTSUBREQPRODNO' '摩尔成品料号' '40' ' '.
add_field 'FSUBQTY' '委外数量' '10' ' '.
add_field 'REMAIN_AMOUNT' '可开工单量' '13' ' ' .
add_field 'BUILD_AMOUNT' '已开工单量' '13' ' '.
add_field 'WERKS' '工厂' '4' 'X'.
2.定义一个form,逐列对每个字段的属性进行设置
传入ALV函数前执行一个perform xxx,然后在FORM里面实现即可,类似如下的写法:
FORM frm_build_fieldcat .
CLEAR wa_field.
wa_field-fieldname = 'BUKRS'.
wa_field-reptext_ddic = 'WBS元素公司代码'.
wa_field-outputlen = 5.
APPEND wa_field TO it_field.
CLEAR wa_field.
wa_field-fieldname = 'WERKS'.
wa_field-reptext_ddic = '工厂'.
wa_field-outputlen = 5.
APPEND wa_field TO it_field.
CLEAR wa_field.
wa_field-fieldname = 'POSID'.
wa_field-reptext_ddic = 'WBS元素'.
wa_field-outputlen = 26.
APPEND wa_field TO it_field.
CLEAR wa_field.
wa_field-fieldname = 'COUNT1'.
wa_field-reptext_ddic = '未关闭但可用金额'.
wa_field-outputlen = 10.
APPEND wa_field TO it_field.
CLEAR wa_field.
wa_field-fieldname = 'COUNT2'.
wa_field-reptext_ddic = '全部状态记录数'.
wa_field-outputlen = 10.
APPEND wa_field TO it_field.
ENDFORM.
实现对某行的可选,这个只需要在展示表中加上一个标志字段SEL,在layout 中 指定下这个字段的名称
ls_layout-box_fieldname = ‘SEL’.
这样点击就会被赋值为X了,loop展示表就可以取到这行数据
实现复选框得可选,同样展示表里面新增一个字段sel,在fieldcat中其设置为checkbox,其实是同样的效果,点击后也会被赋值为 X
当然,选则界面也有个复选框,PARAMETERS: c2 AS CHECKBOX USER-COMMAND ddd DEFAULT ‘X’.意思是给选择界面加了个复选框,AT SELECTION-SCREEN OUTPUT. 部分下loop at screen 时,讨论下checkbox 是否被选中的情况。
4.OOALV 与 SALV的实现细节
优点:不用创建屏幕就可以进行调用的全屏式ALV, GRID ALV不能注册成为Batch JOB 在后台进行运行,使用SALV却可以。
缺点是不提供编辑功能。
着重研究的是: CL_SALV_TABLE 一般ALV报表类型
SALV支持如下三种ALV展示的模式
全屏模式
全屏模式-Classic 报表模式
利用控制器的模式
==SE24 ==进入确定类的方法
画面上显示ALV使用以下两种方法
(1)FACTORY
-定义展示在画面上的数据
-定义ALV报表样式
FACTORY 方法中定义以下参数,将决定ALV报表样式。
报表样式 LIST_DISPLAY R_CONTAINER CONTAINER_NAME
全屏 ABAP_FALSE 初始值 初始值
Classic List ABAP_TRUE 初始值 初始值
利用控制器的 SALV ABAP_FALSE 参照CL_GUI_CONTAINER 控制器名
(2)display
-调用此方法展示ALV
注意: FACTORY 是静态方法,使用 => 符号;DISPLAY 是Instance 方法,因此使用-> 符号。
(pop_salv 参照cl_salv_table salv中一般ALV类型 )
go_functionlist = pop_salv->get_functions( )."get方法拿到实例对象,相当于CREATE obj
go_functionlist->set_all(‘X’). "调用对象的set方法,激活ALV工具栏里面的按钮
SALV使用控制器模式实现:
Ztest_5305841_17 SAP 开发书籍p495页
核心点:类似于GRID ALV这种方式
1.需要SAP 容器连接画面以及ALV GRID 控件,SAP 容器是包含其他控件的一种特殊的控件,也就是父控件。
2.这种ALV需要我们自己画屏幕向里面加入控件名CONTAINER,然后在PBO部分使用CREATE object c创建容器对象,factory方法来向屏幕中的容器里创建ALV,然后Dispaly调用ALV,也就是将全屏模式实现部分放在pbo中,PAI部仍然做校验逻辑,并完成点击的按钮获得按钮ok_code进行后续处理。
设置SALV的输出样式
调用salv子类修改报表样式
==定义子类引用对象==
DATA gr_dispaly TYPE REF TO cl_salv_displaying_setting.
调用子类类型对应的主类方法
Gr_display = gr_table ->get_display_settings( ).
利用子类方法设置详细事项
Gr_display ->set_striped_patttern(value = ‘X’).
主类和子类之间的连接方法
注意这里子类的方法调用的方法都没有进行标注
实现事件控制方法
CLASS lcl_handel_events IMPLMENTATION.
METHOD XXXX.
YYYYYY.
ENDMETHOD.
ENDCLASS.
*SALV toobar
为SALV GRID 追加按钮,当单击按钮时在use_commmand 事件中执行。
为全屏模式下的SALV追加按钮还需要先创建GUI STATUS,调用方法将其追加到画面上
Gr_table->set_screen_status(
Pfstatus = ‘ GUI状态名’
Report = sy-repid
Set_functions = gr_table->c_functions_all).
ps:后续会补充一些SALV的例子,以及GRID ALV 的实现思想,最近真的特别忙,写个帖子写了好几天了,困告QAQ