该方法OOALV需要将ALV置入屏幕上的自定义控件中
alv较少时具有代码可读性可维护性高的特点,实现起来较为简单,但由于custom control固定了位置所以无法动态拖拽边框
创建报表程序后通过se80对象浏览器新建屏幕9001
点击布局进入屏幕制作器界面
将custom control定制控件丢到屏幕里面,保存激活
报表选择屏幕和取数逻辑和以往一样没什么区别
取数逻辑结束之后,通过CALL SCREEN ‘XXXX’.调用自开发屏幕
执行CALL SCREEN命令之后,就会进入选择屏幕的PBO(process before output)之中,在此处可以定义GUI STATUS、GUI TITLE、初始化容器信息(容器信息也可以在之前初始)等操作
到此时ALV就可以展现了
GUI STATUS如果是从标准的copy来的,所有的功能码只能展示但都不能使用,如果要对alv进行排序筛选等操作只能通过启用oo alv的layout属性中的notool_bar = ''来使用
一般是新建一个gui status,至少要实现退出的几个标准功能码
如果有额外的需求比如打印或者别的什么功能按钮,还是和以前一样在应用程序工具栏中新增
在PAI中监控功能码
关于内表更新,每次触发功能码时可以通过下述代码先获取选中的行目,再根据行目更新内表勾选标识
最后成品如下
成品代码如下
********************************************************************
* 事务代码: *
* 程序名称: *
* 程序目的:采购订单OO ALV *
* 设 计 人: *
* 开 发 人: *
* 设计时间: *
* 程序类型: ABAP/4 程序 ,报表程序 *
* 应用类型: MM *
* 描 述: *
*(修改日志)--------------------------------------------------------*
* *
* 日志号 修改人 修改时间 修改说明 传输号码 *
* ---- ---- ------ -----------
* 001 Seele 2023-02-14 创建打印程序 *
********************************************************************
REPORT zdemo_seele04.
*----------------------------------------------------------------------*
* 数据库表声明/Database table declaration
*----------------------------------------------------------------------*
TABLES:ekko,
ekpo.
*----------------------------------------------------------------------*
* 结构声明类型/Structure type declaration
*----------------------------------------------------------------------*
*&---主表数据/master table data
TYPES:BEGIN OF ty_output,
" 抬头
ebeln TYPE ekko-ebeln, " 采购凭证号
bukrs TYPE ekko-bukrs, " 公司代码
bstyp TYPE ekko-bstyp, " 采购类别
" 行项目
ebelp TYPE ekpo-ebelp, " 采购凭证行项目号
matnr TYPE ekpo-matnr, " 物料号
netpr TYPE ekpo-netpr, " 净价
menge TYPE ekpo-menge, " 数量
meins TYPE ekpo-meins, " 订单单位
box TYPE c , " 单选框
END OF ty_output.
*----------------------------------------------------------------------*
* 全局变量定义/Global variable definition
*----------------------------------------------------------------------*
*&---全局内表定义
DATA:gt_output TYPE TABLE OF ty_output. " 主数据表
*&---全局结构定义
DATA:gs_output TYPE ty_output. " 主数据结构
*&---全局对象定义
DATA: gr_container TYPE REF TO cl_gui_custom_container." 功能A: 基本显示
DATA: gr_grid TYPE REF TO cl_gui_alv_grid." 功能A: 基本显示
*&---------------------------------------------------------------------*
*& 字段串定义/Field-symbols *
*&---------------------------------------------------------------------*
FIELD-SYMBOLS:<fs_output> TYPE ty_output.
*&---------------------------------------------------------------------*
*& ALV TYPE/ALV 类型定义
*&---------------------------------------------------------------------*
*&---ALV数据组,类型池
TYPE-POOLS:slis,
vrm.
*&---定义ALV显示的字段列及其描述等属性
DATA:gt_fieldcat TYPE TABLE OF lvc_s_fcat, " ALV 控制: 字段目录
gs_fieldcat TYPE lvc_s_fcat, " ALV 控制: 字段目录
gs_layout TYPE lvc_s_layo. " ALV 控制: 布局结构
*&---------------------------------------------------------------------*
*& Macro 宏定义
*&---------------------------------------------------------------------*
DEFINE mcr_set_catalog.
gs_fieldcat-fieldname = &1. " 字段技术名称
gs_fieldcat-coltext = &2. " 显示名称
gs_fieldcat-ref_table = &3. " 参照表
gs_fieldcat-ref_field = &4. " 参照表字段
gs_fieldcat-qfieldname = &5. " 参考计量单位的字段名称
gs_fieldcat-key = &6. " key 值
gs_fieldcat-edit = &7. " 可编辑
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR gs_fieldcat.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Selection Screen/选择屏幕
*&---------------------------------------------------------------------*
*&---选择屏幕块
SELECTION-SCREEN BEGIN OF BLOCK blk01 WITH FRAME TITLE TEXT-101.
*&---范围
SELECT-OPTIONS:s_ebeln FOR ekko-ebeln ." 采购订单号
SELECTION-SCREEN END OF BLOCK blk01.
*&---------------------------------------------------------------------*
*& Start-of-selection/开始选择屏幕 *
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*&---内表数据获取
PERFORM frm_get_data.
IF gt_output IS INITIAL.
MESSAGE s008(zmm001) DISPLAY LIKE 'E'.
EXIT.
ENDIF.
*&---------------------------------------------------------------------*
*& end-of-selection/结束选择屏幕(程序结束处理,输出等) *
*&---------------------------------------------------------------------*
END-OF-SELECTION.
*&===ALV 输出
**&---设置ALV输出格式
* PERFORM frm_init_layout.
**&---设置ALV输出字段
* PERFORM frm_init_fieldcat.
**&---ALV 显示
* PERFORM frm_display_alv.
PERFORM frm_call_screen.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_10 text
*----------------------------------------------------------------------*
FORM frm_get_data.
DATA:lv_tabix TYPE i.
FREE:gt_output.
SELECT
ekko~ebeln, " 采购凭证号
ekko~bukrs, " 公司代码
ekko~bstyp, " 采购类别
ekpo~matnr, " 物料号
ekpo~netpr, " 净价
ekpo~menge, " 数量
ekpo~meins " 订单单位
FROM ekko
LEFT JOIN ekpo ON ekko~ebeln = ekpo~ebeln
WHERE
ekko~ebeln IN @s_ebeln
INTO TABLE @DATA(lt_data).
LOOP AT lt_data INTO DATA(ls_data).
MOVE-CORRESPONDING ls_data TO gs_output.
APPEND gs_output TO gt_output.
ENDLOOP.
ENDFORM. " frm_get_data
*&---------------------------------------------------------------------*
*& Form frm_init_layout
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_init_layout .
CLEAR gs_layout.
gs_layout-zebra = 'X' . " 斑马线
gs_layout-cwidth_opt = 'X' . " 自动调整ALVL列宽
gs_layout-no_toolbar = '' . " 隐藏工具栏
gs_layout-sel_mode = 'A'. "A: 多选行列 B: 单选行列 C: 多选行列+单选单元格 D: 多选行列+多选单元格
* gs_layout-box_fname = 'BOX'. "选择字段
ENDFORM. " frm_init_layout
*&---------------------------------------------------------------------*
*& Form frm_fieldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_init_fieldcat .
*&---ALV 输出字段目录,涉及字段必须大写
mcr_set_catalog: 'EBELN' TEXT-a01 'EKKO' 'EBELN' '' '' '', " 采购凭证号
'BUKRS' TEXT-a02 'EKKO' 'BUKRS' '' '' '', " 公司代码
'BSTYP' TEXT-a03 'EKKO' 'BSTYP' '' '' '', " 采购类别
'EBELP' TEXT-a04 'EKPO' 'EBELP' '' '' '', " 采购凭证行项目号
'MATNR' TEXT-a05 'EKPO' 'MATNR' '' '' '', " 物料号
'NETPR' TEXT-a06 'EKPO' 'NETPR' '' '' '', " 净价
'MENGE' TEXT-a07 'EKPO' 'MENGE' '' '' '', " 数量
'MEINS' TEXT-a08 'EKPO' 'MEINS' '' '' ''. " 订单单位
ENDFORM. " frm_fieldcat
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_display_alv .
*&---ALV 显示函数
CALL METHOD gr_grid->set_table_for_first_display " 功能A: 基本显示
EXPORTING
i_save = 'X'
i_default = 'X'
is_layout = gs_layout " 功能B: 设定layout
* IT_TOOLBAR_EXCLUDING = GT_EXCLUDE " 功能G: 设定屏蔽标准ALV 工具栏的按钮
CHANGING
it_outtab = gt_output[]
it_fieldcatalog = gt_fieldcat[] " 功能C: 设定fieldcat
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
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. " frm_display_alv
*&---------------------------------------------------------------------*
*& Form frm_refresh
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_refresh .
* 将更新后的数据传到alv所对应的内表
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CLEAR gt_output.
PERFORM frm_get_data.
"Refresh ALV
"Reset the layout
lr_grid->set_frontend_layout( is_layout = gs_layout ).
"Refresh ALV display
lr_grid->refresh_table_display( is_stable = VALUE lvc_s_stbl( row = 'X'
col = 'X' ) ).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CALL_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_call_screen .
CALL SCREEN '9001'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
" 设置菜单状态栏
SET PF-STATUS 'STATUS_9001'.
" 可以在描述处填占位符&1 &2...实现动态标题栏,在该语句后加上WITH 'XXX'.
SET TITLEBAR 'TITLE_9001'.
" 设置ALV
IF gr_container IS INITIAL.
PERFORM frm_init_object. " 初始化ALV
PERFORM frm_init_layout. " 设置layout
PERFORM frm_init_fieldcat. " 设置fieldcat
PERFORM frm_display_alv. " 显示ALV
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_init_object
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_init_object .
CREATE OBJECT gr_container "创建容器对象
EXPORTING
container_name = 'CC_ALV'.
CREATE OBJECT gr_grid " 创建 ALV_GRID 对象
EXPORTING
i_parent = gr_container
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9001 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9001 INPUT.
DATA : lt_row TYPE lvc_t_roid, "内表
ls_row TYPE lvc_s_roid. "工作区
CALL METHOD gr_grid->get_selected_rows
IMPORTING
et_row_no = lt_row. "将更新后的数据传到alv所对应的内表
LOOP AT lt_row INTO ls_row.
READ TABLE gt_output INTO gs_output INDEX ls_row-row_id .
IF sy-subrc EQ 0 .
gs_output-box = 'X'.
MODIFY gt_output FROM gs_output INDEX sy-tabix TRANSPORTING box.
CLEAR : gs_output.
ENDIF .
ENDLOOP .
CASE sy-ucomm.
WHEN 'EXIT'.
LEAVE TO SCREEN 0.
WHEN 'PRINT'.
MESSAGE '触发打印按钮' TYPE 'S'.
WHEN OTHERS.
ENDCASE.
ENDMODULE.