ABAP学习(34):cl_gui_alv_grid实现Table Maintain
实现Table Maintain
通过类CL_GUI_ALV_GRID,实现Table Maintain功能。
实现效果:

1.创建Program;
2.创建空Screen 100;

3.创建GUI Status;

Program:实例代码
"cl_gui_alv_grid事件
CLASS zcl_tabm_event_handler DEFINITION.
PUBLIC SECTION.
"user command
CLASS-METHODS:m_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
"data changed
CLASS-METHODS:m_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed
e_onf4
e_onf4_before
e_onf4_after
e_ucomm.
ENDCLASS.
CLASS zcl_tabm_event_handler IMPLEMENTATION.
METHOD m_user_command.
DATA:lv_mes TYPE string.
lv_mes = 'function:' && e_ucomm.
MESSAGE lv_mes TYPE 'I'.
ENDMETHOD.
METHOD m_data_changed.
DATA:lt_mod_data TYPE lvc_t_modi.
DATA:ls_mod_data TYPE lvc_s_modi. lt_mod_data = er_data_changed->mt_mod_cells. "循環更改數據
LOOP AT lt_mod_data INTO ls_mod_data.
* "設置錯誤信息
* er_data_changed->add_protocol_entry(
* EXPORTING
* i_msgid = '00'
* i_msgty = 'E'
* i_msgno = '001'
* i_msgv1 = '錯誤信息!'
* i_fieldname = ls_mod_data-fieldname
* ).
"更新數據表
er_data_changed->modify_cell(
EXPORTING
i_row_id = ls_mod_data-row_id
i_fieldname = ls_mod_data-fieldname
i_value = ls_mod_data-value
).
ENDLOOP.
ENDMETHOD. ENDCLASS. CLASS zcl_tab_maintain DEFINITION.
PUBLIC SECTION.
"table name
DATA:lv_tabname TYPE ddobjname.
DATA:lo_container TYPE REF TO cl_gui_docking_container.
DATA:lo_alv TYPE REF TO cl_gui_alv_grid.
"table data
DATA:lo_table TYPE REF TO DATA.
"alv field字段
DATA:lt_fcat TYPE lvc_t_fcat.
DATA:ls_fcat TYPE lvc_s_fcat.
"alv layout
DATA:ls_layout TYPE lvc_s_layo.
"table status
DATA:lv_tab_status TYPE C LENGTH 1. "C為修改,空為顯示,A為添加
"保存table結構類型,line結構體類型
DATA:lo_tabledescr TYPE REF TO cl_abap_tabledescr.
DATA:lo_structdescr TYPE REF TO cl_abap_structdescr. METHODS:constructor IMPORTING iv_tabname TYPE ddobjname.
METHODS:m_init_alv.
METHODS:m_show_alv.
METHODS:m_get_fcat RETURNING VALUE(et_fcat) TYPE lvc_t_fcat.
METHODS:m_set_fcat IMPORTING it_fcat TYPE lvc_t_fcat.
METHODS:m_get_layout RETURNING VALUE(es_layout) TYPE lvc_s_layo.
METHODS:m_set_layout IMPORTING is_layout TYPE lvc_s_layo.
METHODS:m_set_status IMPORTING iv_status TYPE char1.
METHODS:m_get_status RETURNING VALUE(ev_status) TYPE char1.
METHODS:m_refresh_alv.
"some action
METHODS:m_edit_action.
METHODS:m_add_action.
METHODS:m_del_action.
METHODS:m_save_action.
PRIVATE SECTION.
METHODS:m_get_data IMPORTING iv_tab_name TYPE ddobjname.
METHODS:m_build_filedcat IMPORTING iv_structure_name TYPE ddobjname.
METHODS:m_build_layout.
METHODS:m_set_events.
ENDCLASS. CLASS zcl_tab_maintain IMPLEMENTATION.
METHOD:constructor.
DATA:lv_msg TYPE string.
DATA:lo_struct_type TYPE REF TO cl_abap_structdescr.
DATA:lo_table_type TYPE REF TO cl_abap_tabledescr.
"自定義字段component
DATA:lt_comp_tab TYPE cl_abap_structdescr=>component_table.
DATA:ls_comp_tab LIKE LINE OF lt_comp_tab.
DATA:lo_exception TYPE REF TO cx_root.
DATA:lv_gotstate TYPE ddgotstate.
TRY.
"創建表名
lv_tabname = iv_tabname.
"檢查table是否存在
CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
NAME = lv_tabname
IMPORTING
GOTSTATE = lv_gotstate.
IF SY-SUBRC <> 0 OR lv_gotstate IS INITIAL.
lv_msg = 'Table:' && lv_tabname && ` do not exist!`.
MESSAGE lv_msg TYPE 'E'.
ENDIF. "創建table
lo_struct_type ?= cl_abap_typedescr=>describe_by_name( lv_tabname ).
lt_comp_tab = lo_struct_type->get_components( ). "最終結構創建table
lo_structdescr = cl_abap_structdescr=>create( lt_comp_tab ).
lo_tabledescr = cl_abap_tabledescr=>create( lo_structdescr ). "創建table
CREATE DATA lo_table TYPE HANDLE lo_tabledescr. CATCH cx_root INTO lo_exception.
lv_msg = lo_exception->get_text( ).
MESSAGE lv_msg TYPE 'E'.
ENDTRY.
ENDMETHOD.
METHOD:m_init_alv.
"創建容器
CREATE OBJECT lo_container
EXPORTING
dynnr = '100'
repid = sy-repid
extension = 1000.
"創建alv
IF lo_alv IS INITIAL.
CREATE OBJECT lo_alv
EXPORTING i_parent = lo_container.
ENDIF.
"獲取數據
me->m_get_data( lv_tabname ).
"fieldcat設置
me->m_build_filedcat( lv_tabname ).
"layout設置
me->m_build_layout( ).
"設置event
me->m_set_events( ).
ENDMETHOD.
METHOD:m_show_alv.
FIELD-SYMBOLS:<f_table> TYPE STANDARD TABLE.
ASSIGN lo_table->* TO <f_table>.
"顯示alv
lo_alv->set_table_for_first_display(
EXPORTING
"layout
is_layout = ls_layout
CHANGING
it_fieldcatalog = lt_fcat
it_outtab = <f_table> ).
ENDMETHOD.
"獲取,設置fieldcat
METHOD:m_get_fcat.
et_fcat = lt_fcat.
ENDMETHOD.
METHOD:m_set_fcat.
lt_fcat = it_fcat.
ENDMETHOD.
"獲取,設置layout
METHOD:m_get_layout.
es_layout = ls_layout.
ENDMETHOD.
METHOD:m_set_layout.
ls_layout = is_layout.
ENDMETHOD.
"獲取table status
METHOD:m_set_status.
lv_tab_status = iv_status.
ENDMETHOD.
METHOD:m_get_status.
ev_status = lv_tab_status.
ENDMETHOD. "獲取table數據
METHOD:m_get_data.
FIELD-SYMBOLS:<f_table> TYPE STANDARD TABLE.
ASSIGN lo_table->* TO <f_table>.
"查詢數據
SELECT * INTO CORRESPONDING FIELDS OF TABLE <f_table> FROM (iv_tab_name).
ENDMETHOD.
"自動生成fieldcat
METHOD:m_build_filedcat.
DATA:lv_index TYPE I.
FIELD-SYMBOLS:<f_fcat> TYPE lvc_s_fcat.
"fieldcat使用用戶設置
IF lt_fcat IS NOT INITIAL.
RETURN.
ENDIF. "獲取fieldcatalog
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = iv_structure_name
CHANGING
ct_fieldcat = lt_fcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE 'Get fieldcatlog failed!' TYPE 'E'.
RETURN.
ENDIF.
LOOP AT lt_fcat ASSIGNING <f_fcat>.
lv_index = sy-tabix.
<f_fcat>-col_pos = lv_index.
<f_fcat>-tabname = iv_structure_name.
ENDLOOP. ENDMETHOD.
"自動生成layout
METHOD:m_build_layout.
"編輯設置
ls_layout-edit = ''. "是否可編輯,整體控制
"顯示設置
ls_layout-cwidth_opt = 'X'. "是否自動列寬
ls_layout-no_toolbar = ''. "是否隱藏toolbar.
"選擇模式,默認單選,A:行,列選擇;B:單行選擇;C:多行選擇;D:單元格選擇
ls_layout-sel_mode = 'A'.
ENDMETHOD.
METHOD:m_set_events.
"設置function相應事件
SET HANDLER zcl_tabm_event_handler=>m_user_command FOR lo_alv.
SET HANDLER zcl_tabm_event_handler=>m_data_changed FOR lo_alv. "註冊enter事件
lo_alv->register_edit_event(
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
).
"註冊修改單元格事件
lo_alv->register_edit_event(
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified
).
ENDMETHOD.
METHOD:m_refresh_alv.
lo_alv->refresh_table_display( ).
ENDMETHOD.
"edit action
METHOD:m_edit_action.
"alv field字段
FIELD-SYMBOLS:<f_fcat> TYPE lvc_s_fcat.
"修改edit狀態
LOOP AT lt_fcat ASSIGNING <f_fcat>.
"特定欄位控制
* IF <f_fcat>-fieldname = ''.
* <f_fcat>-edit = 'X'.
* ENDIF.
IF lv_tab_status = ''.
<f_fcat>-edit = 'X'.
ELSEIF lv_tab_status = 'C'.
<f_fcat>-edit = ''.
ENDIF.
ENDLOOP.
"設置status
IF lv_tab_status = ''.
lv_tab_status = 'C'.
ELSEIF lv_tab_status = 'C'.
lv_tab_status = ''.
ENDIF. "刷新
me->m_show_alv( ).
ENDMETHOD.
"添加空行
METHOD:m_add_action.
DATA:lo_line TYPE REF TO DATA.
FIELD-SYMBOLS:<f_table> TYPE STANDARD TABLE.
FIELD-SYMBOLS:<f_line> TYPE ANY.
"alv field字段
FIELD-SYMBOLS:<f_fcat> TYPE lvc_s_fcat. ASSIGN lo_table->* TO <f_table>.
CREATE DATA lo_line LIKE LINE OF <f_table>.
ASSIGN lo_line->* TO <f_line>.
INSERT <f_line> INTO <f_table> INDEX 1. "設置編輯狀態
lv_tab_status = 'A'.
"修改edit狀態
LOOP AT lt_fcat ASSIGNING <f_fcat>.
"特定欄位控制
* IF <f_fcat>-fieldname = ''.
* <f_fcat>-edit = 'X'.
* ENDIF. IF <f_fcat>-edit = 'X'.
EXIT.
ENDIF.
<f_fcat>-edit = 'X'.
ENDLOOP.
"刷新
me->m_show_alv( ).
ENDMETHOD.
"刪除操作
METHOD:m_del_action.
FIELD-SYMBOLS:<f_table> TYPE STANDARD TABLE.
FIELD-SYMBOLS:<f_del_table> TYPE STANDARD TABLE.
FIELD-SYMBOLS:<f_line> TYPE ANY.
DATA:lt_rows TYPE lvc_t_row.
DATA:ls_rows TYPE lvc_s_row.
DATA:lo_del_table TYPE REF TO DATA.
"創建table
CREATE DATA lo_del_table TYPE HANDLE lo_tabledescr. "獲取選擇行
lo_alv->get_selected_rows(
IMPORTING
et_index_rows = lt_rows
).
"獲取table,刪除選擇行
ASSIGN lo_table->* TO <f_table>.
ASSIGN lo_del_table->* TO <f_del_table>.
"獲取刪除內表
LOOP AT lt_rows INTO ls_rows.
READ TABLE <f_table> INDEX ls_rows-index ASSIGNING <f_line>.
APPEND <f_line> TO <f_del_table>.
ENDLOOP.
"刪除當前內表
LOOP AT lt_rows INTO ls_rows.
DELETE <f_table> INDEX ls_rows-index.
ENDLOOP.
DELETE (lv_tabname) FROM TABLE <f_del_table>.
"刷新
me->m_show_alv( ).
ENDMETHOD.
"保存操作
METHOD:m_save_action.
FIELD-SYMBOLS:<f_table> TYPE STANDARD TABLE.
"alv field字段
FIELD-SYMBOLS:<f_fcat> TYPE lvc_s_fcat. "檢查邏輯
"會調用data changed事件
"會彈出檢查相關錯誤信息
"lo_alv->check_changed_data( ). "獲取table
ASSIGN lo_table->* TO <f_table>. "更新數據表
MODIFY (lv_tabname) FROM TABLE <f_table>.
IF sy-subrc = 0.
MESSAGE 'Save success!' TYPE 'S'.
ENDIF. "設置編輯狀態
lv_tab_status = ''.
"修改edit狀態
LOOP AT lt_fcat ASSIGNING <f_fcat>.
"特定欄位控制
* IF <f_fcat>-fieldname = ''.
* <f_fcat>-edit = 'X'.
* ENDIF.
<f_fcat>-edit = ''.
ENDLOOP.
"刷新
me->m_show_alv( ).
ENDMETHOD.
ENDCLASS. "table maintain類對象
DATA:lo_tab_maintain TYPE REF TO zcl_tab_maintain. SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
PARAMETERS:p_tab TYPE ddobjname. "maintain table name
SELECTION-SCREEN END OF BLOCK blk1. START-OF-SELECTION.
PERFORM f_show_alv. FORM f_show_alv.
CREATE OBJECT lo_tab_maintain
EXPORTING
iv_tabname = p_tab.
lo_tab_maintain->m_init_alv( ).
lo_tab_maintain->m_show_alv( ).
CALL SCREEN 100.
ENDFORM. *&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS_100'.
* SET TITLEBAR 'xxx'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
DATA:g_ok_code TYPE sy-ucomm.
CASE g_ok_code.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
WHEN 'EDIT'.
PERFORM f_edit_action.
WHEN 'ADD'.
PERFORM f_add_action.
WHEN 'DELETE'.
PERFORM f_delete_action.
WHEN 'SAVE'.
PERFORM f_save_action.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT "edit action
FORM f_edit_action.
lo_tab_maintain->m_edit_action( ).
ENDFORM. "add action
FORM f_add_action.
lo_tab_maintain->m_add_action( ).
ENDFORM. "delete action
FORM f_delete_action.
lo_tab_maintain->m_del_action( ).
ENDFORM. "save action
FORM f_save_action.
lo_tab_maintain->m_save_action( ).
ENDFORM.
ABAP学习(34):cl_gui_alv_grid实现Table Maintain的更多相关文章
- SAP ABAP学习路线图--标准教程
SAP ABAP学习路线图--标准教程 摘自:http://www.cnblogs.com/clsoho/archive/2010/07/05/1771400.html
- golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题
golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...
- OpenFlow Switch学习笔记(五)——Group Table、Meter Table及Counters
本文主要详述OpenFlow Switch的另外两个主要组件——Group Table和Meter Table,它们在整个OpenFlow Swtich Processing中也起到了重要作用. 1. ...
- Unity插件之NGUI学习(8)—— Table和NGUI尺寸转换为世界坐标系尺寸
依据 Unity插件之NGUI学习(2),创建一个UI Root,在UI Root下创建一个Texture作为背景图,并设置图片,在Wiget下调整大小:然后在UI Root下再创建一个Panel. ...
- HTML学习笔记——列表和table
1>有序列表.无序列表和自定义列表 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...
- bootstrap学习笔记<四>(table表格)
表格 bootstrap为table表格定制多个常用样式:基本样式,隔行变色样式,带边框样式,荧光棒样式,紧凑样式,响应样式. ☑ .table:基础表格 ☑ .table-striped:斑马线 ...
- jquery学习笔记(4)--实现table隔行变色以及单选框选中
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...
- SAP ABAP规划 使用LOOP READ TABLE该方法取代双LOOP内部表的方法
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWlueXVlemhhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- Lua学习(1)——table
table类型实现了“关联数组”.“关联数组”是一种具有特殊索引方式的数组.不仅可以通过证书来索引它,还可以使用字符串或其他类型(除了nil)来索引它.table是Lua中主要的数据结构机制(事实也是 ...
- AngularJS学习之旅—AngularJS Table(十一)
1.AngularJS 表格 1. ng-repeat 指令可以完美的显示表格 AngularJS 实例 <!DOCTYPE html> <html> <head> ...
随机推荐
- MySQL 增加timestamp 列都是000000的时间
问题: 在MySQL 用工具navicat 给表增加 类型为 timestamp 的列的时候 默认值没有具体设置 默认值使用当前时间 CURRENT_TIMESTAMP 函数 导致生成的默认是0000 ...
- Visual Studio Code 使用总结
记录一下个人在使用 VS Code 中的一些插件和设置. 该配置在编写 vue + iview 项目时使用. 文件路径 用户文件路径:%AppData%/Code/User 用户设置:sett ...
- Python全栈学习笔记---正则表达式(二)
匹配(matching):判断一个字符串能否从起始位全部或部分的匹配某个模式 搜索(seaching):在字符串任意部分中搜索 1.1.特殊字符 注:若要匹配这些字符本身,在其前面加 '\' 1.2. ...
- 学习lua-06,异常提示,错误处理
addNum = function(a, b) assert(type(a) == 'string','a必须是一个字符串') assert(type(b) == 'string','b必须是一个字符 ...
- 【解决】Mac无法通过smb连接到windows的共享文件夹
通过Mac访问windows的共享文件夹也有很多博文都写了,这里不再提. 先按照网上教程,在Windows下允许远程,然后设置文件夹共享出来,再在Mac上通过smb登录,输入用户名和密码窗口总是抖动, ...
- Android学习——控件ProgressBar
1.常用属性
- 《在编译两个不同的库时,不想相互include头文件,但又需要用到对方的函数,可以用extern》
以下是个人理解,水平有限,可能不太准确.有问题,麻烦指出. demo: a.so void a_fun(void) { b_fun(); } b.so void b_fun(void) { //略 } ...
- 物理核与逻辑核-转 perf
Linux和Windows 物理CPU.物理核.逻辑核--区别.关系和查看 cat /proc/cpuinfo命令部分输出信息的含义 physical id 物理封装的处理器的idprocessor ...
- 关于github的自动化检测
github 中的 Some checks were not successful什么意思呢? 在 GitHub 上,当您向存储库提交拉取请求时,如果存在自动化的检查(例如CI/CD)或在 pul ...
- 利用pandas+pyecharts制作可视化图表
# 导入pandas包 import pandas as pd # 从pyecharts下的charts 导入Bar和Timeline功能 from pyecharts.charts import B ...