实现Table Maintain

通过类CL_GUI_ALV_GRID,实现Table Maintain功能。

实现效果:

1.创建Program;

2.创建空Screen 100;

3.创建GUI Status;

Program:实例代码

  1. "cl_gui_alv_grid事件
  2. CLASS zcl_tabm_event_handler DEFINITION.
  3. PUBLIC SECTION.
  4. "user command
  5. CLASS-METHODS:m_user_command FOR EVENT user_command OF cl_gui_alv_grid
  6. IMPORTING e_ucomm.
  7. "data changed
  8. CLASS-METHODS:m_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
  9. IMPORTING er_data_changed
  10. e_onf4
  11. e_onf4_before
  12. e_onf4_after
  13. e_ucomm.
  14. ENDCLASS.
  15. CLASS zcl_tabm_event_handler IMPLEMENTATION.
  16. METHOD m_user_command.
  17. DATA:lv_mes TYPE string.
  18. lv_mes = 'function:' && e_ucomm.
  19. MESSAGE lv_mes TYPE 'I'.
  20. ENDMETHOD.
  21. METHOD m_data_changed.
  22. DATA:lt_mod_data TYPE lvc_t_modi.
  23. DATA:ls_mod_data TYPE lvc_s_modi.
  24.  
  25. lt_mod_data = er_data_changed->mt_mod_cells.
  26.  
  27. "循環更改數據
  28. LOOP AT lt_mod_data INTO ls_mod_data.
  29. * "設置錯誤信息
  30. * er_data_changed->add_protocol_entry(
  31. * EXPORTING
  32. * i_msgid = '00'
  33. * i_msgty = 'E'
  34. * i_msgno = '001'
  35. * i_msgv1 = '錯誤信息!'
  36. * i_fieldname = ls_mod_data-fieldname
  37. * ).
  38. "更新數據表
  39. er_data_changed->modify_cell(
  40. EXPORTING
  41. i_row_id = ls_mod_data-row_id
  42. i_fieldname = ls_mod_data-fieldname
  43. i_value = ls_mod_data-value
  44. ).
  45. ENDLOOP.
  46. ENDMETHOD.
  47.  
  48. ENDCLASS.
  49.  
  50. CLASS zcl_tab_maintain DEFINITION.
  51. PUBLIC SECTION.
  52. "table name
  53. DATA:lv_tabname TYPE ddobjname.
  54. DATA:lo_container TYPE REF TO cl_gui_docking_container.
  55. DATA:lo_alv TYPE REF TO cl_gui_alv_grid.
  56. "table data
  57. DATA:lo_table TYPE REF TO DATA.
  58. "alv field字段
  59. DATA:lt_fcat TYPE lvc_t_fcat.
  60. DATA:ls_fcat TYPE lvc_s_fcat.
  61. "alv layout
  62. DATA:ls_layout TYPE lvc_s_layo.
  63. "table status
  64. DATA:lv_tab_status TYPE C LENGTH 1. "C為修改,空為顯示,A為添加
  65. "保存table結構類型,line結構體類型
  66. DATA:lo_tabledescr TYPE REF TO cl_abap_tabledescr.
  67. DATA:lo_structdescr TYPE REF TO cl_abap_structdescr.
  68.  
  69. METHODS:constructor IMPORTING iv_tabname TYPE ddobjname.
  70. METHODS:m_init_alv.
  71. METHODS:m_show_alv.
  72. METHODS:m_get_fcat RETURNING VALUE(et_fcat) TYPE lvc_t_fcat.
  73. METHODS:m_set_fcat IMPORTING it_fcat TYPE lvc_t_fcat.
  74. METHODS:m_get_layout RETURNING VALUE(es_layout) TYPE lvc_s_layo.
  75. METHODS:m_set_layout IMPORTING is_layout TYPE lvc_s_layo.
  76. METHODS:m_set_status IMPORTING iv_status TYPE char1.
  77. METHODS:m_get_status RETURNING VALUE(ev_status) TYPE char1.
  78. METHODS:m_refresh_alv.
  79. "some action
  80. METHODS:m_edit_action.
  81. METHODS:m_add_action.
  82. METHODS:m_del_action.
  83. METHODS:m_save_action.
  84. PRIVATE SECTION.
  85. METHODS:m_get_data IMPORTING iv_tab_name TYPE ddobjname.
  86. METHODS:m_build_filedcat IMPORTING iv_structure_name TYPE ddobjname.
  87. METHODS:m_build_layout.
  88. METHODS:m_set_events.
  89. ENDCLASS.
  90.  
  91. CLASS zcl_tab_maintain IMPLEMENTATION.
  92. METHOD:constructor.
  93. DATA:lv_msg TYPE string.
  94. DATA:lo_struct_type TYPE REF TO cl_abap_structdescr.
  95. DATA:lo_table_type TYPE REF TO cl_abap_tabledescr.
  96. "自定義字段component
  97. DATA:lt_comp_tab TYPE cl_abap_structdescr=>component_table.
  98. DATA:ls_comp_tab LIKE LINE OF lt_comp_tab.
  99. DATA:lo_exception TYPE REF TO cx_root.
  100. DATA:lv_gotstate TYPE ddgotstate.
  101. TRY.
  102. "創建表名
  103. lv_tabname = iv_tabname.
  104. "檢查table是否存在
  105. CALL FUNCTION 'DDIF_TABL_GET'
  106. EXPORTING
  107. NAME = lv_tabname
  108. IMPORTING
  109. GOTSTATE = lv_gotstate.
  110. IF SY-SUBRC <> 0 OR lv_gotstate IS INITIAL.
  111. lv_msg = 'Table:' && lv_tabname && ` do not exist!`.
  112. MESSAGE lv_msg TYPE 'E'.
  113. ENDIF.
  114.  
  115. "創建table
  116. lo_struct_type ?= cl_abap_typedescr=>describe_by_name( lv_tabname ).
  117. lt_comp_tab = lo_struct_type->get_components( ).
  118.  
  119. "最終結構創建table
  120. lo_structdescr = cl_abap_structdescr=>create( lt_comp_tab ).
  121. lo_tabledescr = cl_abap_tabledescr=>create( lo_structdescr ).
  122.  
  123. "創建table
  124. CREATE DATA lo_table TYPE HANDLE lo_tabledescr.
  125.  
  126. CATCH cx_root INTO lo_exception.
  127. lv_msg = lo_exception->get_text( ).
  128. MESSAGE lv_msg TYPE 'E'.
  129. ENDTRY.
  130. ENDMETHOD.
  131. METHOD:m_init_alv.
  132. "創建容器
  133. CREATE OBJECT lo_container
  134. EXPORTING
  135. dynnr = '100'
  136. repid = sy-repid
  137. extension = 1000.
  138. "創建alv
  139. IF lo_alv IS INITIAL.
  140. CREATE OBJECT lo_alv
  141. EXPORTING i_parent = lo_container.
  142. ENDIF.
  143. "獲取數據
  144. me->m_get_data( lv_tabname ).
  145. "fieldcat設置
  146. me->m_build_filedcat( lv_tabname ).
  147. "layout設置
  148. me->m_build_layout( ).
  149. "設置event
  150. me->m_set_events( ).
  151. ENDMETHOD.
  152. METHOD:m_show_alv.
  153. FIELD-SYMBOLS:<f_table> TYPE STANDARD TABLE.
  154. ASSIGN lo_table->* TO <f_table>.
  155. "顯示alv
  156. lo_alv->set_table_for_first_display(
  157. EXPORTING
  158. "layout
  159. is_layout = ls_layout
  160. CHANGING
  161. it_fieldcatalog = lt_fcat
  162. it_outtab = <f_table> ).
  163. ENDMETHOD.
  164. "獲取,設置fieldcat
  165. METHOD:m_get_fcat.
  166. et_fcat = lt_fcat.
  167. ENDMETHOD.
  168. METHOD:m_set_fcat.
  169. lt_fcat = it_fcat.
  170. ENDMETHOD.
  171. "獲取,設置layout
  172. METHOD:m_get_layout.
  173. es_layout = ls_layout.
  174. ENDMETHOD.
  175. METHOD:m_set_layout.
  176. ls_layout = is_layout.
  177. ENDMETHOD.
  178. "獲取table status
  179. METHOD:m_set_status.
  180. lv_tab_status = iv_status.
  181. ENDMETHOD.
  182. METHOD:m_get_status.
  183. ev_status = lv_tab_status.
  184. ENDMETHOD.
  185.  
  186. "獲取table數據
  187. METHOD:m_get_data.
  188. FIELD-SYMBOLS:<f_table> TYPE STANDARD TABLE.
  189. ASSIGN lo_table->* TO <f_table>.
  190. "查詢數據
  191. SELECT * INTO CORRESPONDING FIELDS OF TABLE <f_table> FROM (iv_tab_name).
  192. ENDMETHOD.
  193. "自動生成fieldcat
  194. METHOD:m_build_filedcat.
  195. DATA:lv_index TYPE I.
  196. FIELD-SYMBOLS:<f_fcat> TYPE lvc_s_fcat.
  197. "fieldcat使用用戶設置
  198. IF lt_fcat IS NOT INITIAL.
  199. RETURN.
  200. ENDIF.
  201.  
  202. "獲取fieldcatalog
  203. CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
  204. EXPORTING
  205. i_structure_name = iv_structure_name
  206. CHANGING
  207. ct_fieldcat = lt_fcat
  208. EXCEPTIONS
  209. inconsistent_interface = 1
  210. program_error = 2
  211. OTHERS = 3.
  212. IF sy-subrc <> 0.
  213. MESSAGE 'Get fieldcatlog failed!' TYPE 'E'.
  214. RETURN.
  215. ENDIF.
  216. LOOP AT lt_fcat ASSIGNING <f_fcat>.
  217. lv_index = sy-tabix.
  218. <f_fcat>-col_pos = lv_index.
  219. <f_fcat>-tabname = iv_structure_name.
  220. ENDLOOP.
  221.  
  222. ENDMETHOD.
  223. "自動生成layout
  224. METHOD:m_build_layout.
  225. "編輯設置
  226. ls_layout-edit = ''. "是否可編輯,整體控制
  227. "顯示設置
  228. ls_layout-cwidth_opt = 'X'. "是否自動列寬
  229. ls_layout-no_toolbar = ''. "是否隱藏toolbar.
  230. "選擇模式,默認單選,A:行,列選擇;B:單行選擇;C:多行選擇;D:單元格選擇
  231. ls_layout-sel_mode = 'A'.
  232. ENDMETHOD.
  233. METHOD:m_set_events.
  234. "設置function相應事件
  235. SET HANDLER zcl_tabm_event_handler=>m_user_command FOR lo_alv.
  236. SET HANDLER zcl_tabm_event_handler=>m_data_changed FOR lo_alv.
  237.  
  238. "註冊enter事件
  239. lo_alv->register_edit_event(
  240. EXPORTING
  241. i_event_id = cl_gui_alv_grid=>mc_evt_enter
  242. ).
  243. "註冊修改單元格事件
  244. lo_alv->register_edit_event(
  245. EXPORTING
  246. i_event_id = cl_gui_alv_grid=>mc_evt_modified
  247. ).
  248. ENDMETHOD.
  249. METHOD:m_refresh_alv.
  250. lo_alv->refresh_table_display( ).
  251. ENDMETHOD.
  252. "edit action
  253. METHOD:m_edit_action.
  254. "alv field字段
  255. FIELD-SYMBOLS:<f_fcat> TYPE lvc_s_fcat.
  256. "修改edit狀態
  257. LOOP AT lt_fcat ASSIGNING <f_fcat>.
  258. "特定欄位控制
  259. * IF <f_fcat>-fieldname = ''.
  260. * <f_fcat>-edit = 'X'.
  261. * ENDIF.
  262. IF lv_tab_status = ''.
  263. <f_fcat>-edit = 'X'.
  264. ELSEIF lv_tab_status = 'C'.
  265. <f_fcat>-edit = ''.
  266. ENDIF.
  267. ENDLOOP.
  268. "設置status
  269. IF lv_tab_status = ''.
  270. lv_tab_status = 'C'.
  271. ELSEIF lv_tab_status = 'C'.
  272. lv_tab_status = ''.
  273. ENDIF.
  274.  
  275. "刷新
  276. me->m_show_alv( ).
  277. ENDMETHOD.
  278. "添加空行
  279. METHOD:m_add_action.
  280. DATA:lo_line TYPE REF TO DATA.
  281. FIELD-SYMBOLS:<f_table> TYPE STANDARD TABLE.
  282. FIELD-SYMBOLS:<f_line> TYPE ANY.
  283. "alv field字段
  284. FIELD-SYMBOLS:<f_fcat> TYPE lvc_s_fcat.
  285.  
  286. ASSIGN lo_table->* TO <f_table>.
  287. CREATE DATA lo_line LIKE LINE OF <f_table>.
  288. ASSIGN lo_line->* TO <f_line>.
  289. INSERT <f_line> INTO <f_table> INDEX 1.
  290.  
  291. "設置編輯狀態
  292. lv_tab_status = 'A'.
  293. "修改edit狀態
  294. LOOP AT lt_fcat ASSIGNING <f_fcat>.
  295. "特定欄位控制
  296. * IF <f_fcat>-fieldname = ''.
  297. * <f_fcat>-edit = 'X'.
  298. * ENDIF.
  299.  
  300. IF <f_fcat>-edit = 'X'.
  301. EXIT.
  302. ENDIF.
  303. <f_fcat>-edit = 'X'.
  304. ENDLOOP.
  305. "刷新
  306. me->m_show_alv( ).
  307. ENDMETHOD.
  308. "刪除操作
  309. METHOD:m_del_action.
  310. FIELD-SYMBOLS:<f_table> TYPE STANDARD TABLE.
  311. FIELD-SYMBOLS:<f_del_table> TYPE STANDARD TABLE.
  312. FIELD-SYMBOLS:<f_line> TYPE ANY.
  313. DATA:lt_rows TYPE lvc_t_row.
  314. DATA:ls_rows TYPE lvc_s_row.
  315. DATA:lo_del_table TYPE REF TO DATA.
  316. "創建table
  317. CREATE DATA lo_del_table TYPE HANDLE lo_tabledescr.
  318.  
  319. "獲取選擇行
  320. lo_alv->get_selected_rows(
  321. IMPORTING
  322. et_index_rows = lt_rows
  323. ).
  324. "獲取table,刪除選擇行
  325. ASSIGN lo_table->* TO <f_table>.
  326. ASSIGN lo_del_table->* TO <f_del_table>.
  327. "獲取刪除內表
  328. LOOP AT lt_rows INTO ls_rows.
  329. READ TABLE <f_table> INDEX ls_rows-index ASSIGNING <f_line>.
  330. APPEND <f_line> TO <f_del_table>.
  331. ENDLOOP.
  332. "刪除當前內表
  333. LOOP AT lt_rows INTO ls_rows.
  334. DELETE <f_table> INDEX ls_rows-index.
  335. ENDLOOP.
  336. DELETE (lv_tabname) FROM TABLE <f_del_table>.
  337. "刷新
  338. me->m_show_alv( ).
  339. ENDMETHOD.
  340. "保存操作
  341. METHOD:m_save_action.
  342. FIELD-SYMBOLS:<f_table> TYPE STANDARD TABLE.
  343. "alv field字段
  344. FIELD-SYMBOLS:<f_fcat> TYPE lvc_s_fcat.
  345.  
  346. "檢查邏輯
  347. "會調用data changed事件
  348. "會彈出檢查相關錯誤信息
  349. "lo_alv->check_changed_data( ).
  350.  
  351. "獲取table
  352. ASSIGN lo_table->* TO <f_table>.
  353.  
  354. "更新數據表
  355. MODIFY (lv_tabname) FROM TABLE <f_table>.
  356. IF sy-subrc = 0.
  357. MESSAGE 'Save success!' TYPE 'S'.
  358. ENDIF.
  359.  
  360. "設置編輯狀態
  361. lv_tab_status = ''.
  362. "修改edit狀態
  363. LOOP AT lt_fcat ASSIGNING <f_fcat>.
  364. "特定欄位控制
  365. * IF <f_fcat>-fieldname = ''.
  366. * <f_fcat>-edit = 'X'.
  367. * ENDIF.
  368. <f_fcat>-edit = ''.
  369. ENDLOOP.
  370. "刷新
  371. me->m_show_alv( ).
  372. ENDMETHOD.
  373. ENDCLASS.
  374.  
  375. "table maintain類對象
  376. DATA:lo_tab_maintain TYPE REF TO zcl_tab_maintain.
  377.  
  378. SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
  379. PARAMETERS:p_tab TYPE ddobjname. "maintain table name
  380. SELECTION-SCREEN END OF BLOCK blk1.
  381.  
  382. START-OF-SELECTION.
  383. PERFORM f_show_alv.
  384.  
  385. FORM f_show_alv.
  386. CREATE OBJECT lo_tab_maintain
  387. EXPORTING
  388. iv_tabname = p_tab.
  389. lo_tab_maintain->m_init_alv( ).
  390. lo_tab_maintain->m_show_alv( ).
  391. CALL SCREEN 100.
  392. ENDFORM.
  393.  
  394. *&---------------------------------------------------------------------*
  395. *& Module STATUS_0100 OUTPUT
  396. *&---------------------------------------------------------------------*
  397. * text
  398. *----------------------------------------------------------------------*
  399. MODULE STATUS_0100 OUTPUT.
  400. SET PF-STATUS 'STATUS_100'.
  401. * SET TITLEBAR 'xxx'.
  402. ENDMODULE. " STATUS_0100 OUTPUT
  403. *&---------------------------------------------------------------------*
  404. *& Module USER_COMMAND_0100 INPUT
  405. *&---------------------------------------------------------------------*
  406. * text
  407. *----------------------------------------------------------------------*
  408. MODULE USER_COMMAND_0100 INPUT.
  409. DATA:g_ok_code TYPE sy-ucomm.
  410. CASE g_ok_code.
  411. WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
  412. LEAVE PROGRAM.
  413. WHEN 'EDIT'.
  414. PERFORM f_edit_action.
  415. WHEN 'ADD'.
  416. PERFORM f_add_action.
  417. WHEN 'DELETE'.
  418. PERFORM f_delete_action.
  419. WHEN 'SAVE'.
  420. PERFORM f_save_action.
  421. WHEN OTHERS.
  422. ENDCASE.
  423. ENDMODULE. " USER_COMMAND_0100 INPUT
  424.  
  425. "edit action
  426. FORM f_edit_action.
  427. lo_tab_maintain->m_edit_action( ).
  428. ENDFORM.
  429.  
  430. "add action
  431. FORM f_add_action.
  432. lo_tab_maintain->m_add_action( ).
  433. ENDFORM.
  434.  
  435. "delete action
  436. FORM f_delete_action.
  437. lo_tab_maintain->m_del_action( ).
  438. ENDFORM.
  439.  
  440. "save action
  441. FORM f_save_action.
  442. lo_tab_maintain->m_save_action( ).
  443. ENDFORM.

ABAP学习(34):cl_gui_alv_grid实现Table Maintain的更多相关文章

  1. SAP ABAP学习路线图--标准教程

    SAP ABAP学习路线图--标准教程 摘自:http://www.cnblogs.com/clsoho/archive/2010/07/05/1771400.html

  2. golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题

    golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...

  3. OpenFlow Switch学习笔记(五)——Group Table、Meter Table及Counters

    本文主要详述OpenFlow Switch的另外两个主要组件——Group Table和Meter Table,它们在整个OpenFlow Swtich Processing中也起到了重要作用. 1. ...

  4. Unity插件之NGUI学习(8)—— Table和NGUI尺寸转换为世界坐标系尺寸

    依据 Unity插件之NGUI学习(2),创建一个UI Root,在UI Root下创建一个Texture作为背景图,并设置图片,在Wiget下调整大小:然后在UI Root下再创建一个Panel. ...

  5. HTML学习笔记——列表和table

    1>有序列表.无序列表和自定义列表 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...

  6. bootstrap学习笔记<四>(table表格)

    表格 bootstrap为table表格定制多个常用样式:基本样式,隔行变色样式,带边框样式,荧光棒样式,紧凑样式,响应样式. ☑  .table:基础表格 ☑  .table-striped:斑马线 ...

  7. jquery学习笔记(4)--实现table隔行变色以及单选框选中

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  8. SAP ABAP规划 使用LOOP READ TABLE该方法取代双LOOP内部表的方法

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWlueXVlemhhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  9. Lua学习(1)——table

    table类型实现了“关联数组”.“关联数组”是一种具有特殊索引方式的数组.不仅可以通过证书来索引它,还可以使用字符串或其他类型(除了nil)来索引它.table是Lua中主要的数据结构机制(事实也是 ...

  10. AngularJS学习之旅—AngularJS Table(十一)

    1.AngularJS 表格 1. ng-repeat 指令可以完美的显示表格 AngularJS 实例 <!DOCTYPE html> <html> <head> ...

随机推荐

  1. 创建一个spring项目

  2. git提交命令

    链接:https://www.waimaiguai.com/technology/article/5425017来源:外卖怪 外卖怪技术学习git更新代码命令2022-08-17 02:56:11gi ...

  3. git commit提交代码时跳过 eslint校验

    在使用命令 git commit -m '提交信息' 将本地代码提交到远程仓库时候, 如果项目安装了 per-commit,则会在Git键入提交信息前进行代码风格检查,如果代码不符合相应规则,则报错. ...

  4. nacos服务端和客户端版本不一致的时候,客户端无限刷日志

    解决方法: logging: level: com: alibaba: nacos: client: error

  5. 在Excel中创建随机数据集

    1.随机小数0-1之间 =RAND() 2.随机整数1-100之间 =RANDBETWEEN(1,100) 3.生成一定比例的随机数0或1 =IF(RAND()>=0.8,1,0) 4.生成一定 ...

  6. 最后的 SPRING

    其核心JAR包spring-web-5.2.0.RELEASE.jar和spring-core-5.2.0.RELEASE.jar的大小均为1.4MB左右 基于工厂模式实现对象的创建 添加了国际化.事 ...

  7. .NET Core读写InfluxDB时序数据库的方法教程

    前言 在我们很多应用中会遇到有一种基于一系列时间的数据需要处理,通过时间的顺序可以将这些数据点连成线,再通过数据统计后可以做成多纬度的报表,也可通过机器学习来实现数据的预测告警.而时序数据库就是用于存 ...

  8. HTTP与HTTPS的区别,详细介绍

    HTTP与HTTPS介绍 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间 ...

  9. 手机、ESP32单片机、MQTT服务器连接实验

    实验目的:通过自己制作的手机APP,连接MQTT服务器,获取ESP32单片机的温湿度信息,控制ESP32单片机上的LED开关. 实验准备: 1.硬件:ESP32开发板(型号不限,esp01s也可以). ...

  10. 在QAS里面,建立副本请求