转载https://blog.csdn.net/f346348157/category_11410181.html
随意查询一个表的内容,此处用的表是:ZLION_TEST(已建27条数据)
1、手工创建-不推荐
1.1 初始屏幕
REPORT zcsdn_lion_custom09. DATA: ok_code LIKE sy-ucomm, my_code LIKE sy-ucomm. START-OF-SELECTION. END-OF-SELECTION. CALL SCREEN '2000'. *------- 工具栏、标题加载到屏幕中 --------* MODULE status_2000 OUTPUT. SET PF-STATUS 'TOOLS'. SET TITLEBAR 'TITLE'. ENDMODULE. " STATUS_2000 OUTPUT *------ 捕获功能码 ----* MODULE user_command_2000 INPUT. my_code = ok_code. CLEAR ok_code. CASE my_code. WHEN '&EXIT' OR '&BACK'. LEAVE TO SCREEN 0. ENDCASE. ENDMODULE.
1.2 声明变量
变量是查询对象,单表参照表,多表抽取每个表字段组合为结构
1 DATA g_it_tab LIKE STANDARD TABLE OF zlion_test. 2 DATA g_wa LIKE zlion_test. 3 4 START-OF-SELECTION. 5 PERFORM sub_getdata."查询语句 6 7 *------ 查询语句----------* 8 FORM sub_getdata . 9 SELECT * INTO CORRESPONDING FIELDS OF TABLE g_it_tab FROM zlion_test. 10 ENDFORM.
1.3 屏幕中绘制表格控件
主程序需要定义table控件相同的变量,并指定table控件在哪个屏幕展示
CONTROLS: tab_main TYPE TABLEVIEW USING SCREEN '2000'.
栏位前后顺序有误的,选中不放拖到对应的位置即可
添加首列标题栏,标题栏id可跟上面的文本栏id一样
标题栏不够宽度的,调整文本栏“可视距离”,是文本框的可视距离,不是标题栏的
如上面保存,会报如下错误
1.4 在PBO、PAI配置代码
*1.4 在PBO添加如下代码:把读取的数据放到工作区g_wa中在页面展示 LOOP AT g_it_tab INTO g_wa WITH CONTROL tab_main CURSOR tab_main-current_line. ENDLOOP.
1 *1.4 在PAI添加如下代码:循环内表,哪行数据有变化的就更新对应的那行. 2 LOOP AT g_it_tab. 3 "检查字段是否有变更. 4 CHAIN. 5 FIELD g_wa-name."当g_wa中的字段有改变的调用下面的module. 6 FIELD g_wa-sex."监控多个字段是否变更的,继续field 字段名 即可 7 8 "以上字段有变化时,执行此更新module 9 MODULE table_modify ON CHAIN-REQUEST." 10 ENDCHAIN. 11 ENDLOOP.
在主程序中,实现module:table_modify
*------ 工作区中,有数据变更的都更新到内表中-------------* MODULE table_modify INPUT. MODIFY g_it_tab FROM g_wa INDEX tab_main-current_line. ENDMODULE.
1.5 测试table_modify更新功能
1.51 此时代码如下
主程序代码
1 REPORT zcsdn_lion_custom09. 2 3 DATA: ok_code LIKE sy-ucomm, 4 my_code LIKE sy-ucomm. 5 DATA g_it_tab LIKE STANDARD TABLE OF zlion_test. 6 DATA g_wa LIKE zlion_test. 7 CONTROLS: tab_main TYPE TABLEVIEW USING SCREEN '2000'. "控件在屏幕2000上 8 9 START-OF-SELECTION. 10 PERFORM sub_getdata."查询语句 11 12 END-OF-SELECTION. 13 CALL SCREEN '2000'. 14 15 *------- 工具栏、标题加载到屏幕中 --------* 16 MODULE status_2000 OUTPUT. 17 SET PF-STATUS 'TOOLS'. 18 SET TITLEBAR 'TITLE'. 19 20 ENDMODULE. " STATUS_2000 OUTPUT 21 22 *------ 捕获功能码 ----* 23 MODULE user_command_2000 INPUT. 24 my_code = ok_code. 25 CLEAR ok_code. 26 27 CASE my_code. 28 WHEN '&EXIT' OR '&BACK'. 29 LEAVE TO SCREEN 0. 30 ENDCASE. 31 ENDMODULE. " USER_COMMAND_2000 INPUT 32 33 *------ 查询语句----------* 34 FORM sub_getdata . 35 SELECT * INTO CORRESPONDING FIELDS OF TABLE g_it_tab FROM zlion_test. 36 ENDFORM. " SUB_GETDATA 37 38 39 *------ 工作区中,有数据变更的都更新到内表中-------------* 40 MODULE table_modify INPUT. 41 MODIFY g_it_tab FROM g_wa INDEX tab_main-current_line. 42 ENDMODULE.
屏幕2000代码
1 PROCESS BEFORE OUTPUT. 2 *在PBO添加如下代码:把读取的数据放到工作区g_wa中在页面展示 3 LOOP AT g_it_tab INTO g_wa WITH CONTROL tab_main 4 CURSOR tab_main-current_line. 5 6 ENDLOOP. 7 8 MODULE status_2000. 9 10 PROCESS AFTER INPUT. 11 *在PAI添加如下代码:循环内表,哪行数据有变化的就更新对应的那行. 12 LOOP AT g_it_tab. 13 "检查字段是否有变更. 14 CHAIN. 15 FIELD g_wa-name."当g_wa中的字段有改变的调用下面的module. 16 FIELD g_wa-sex."监控多个字段是否变更的,继续field 字段名 即可 17 18 "以上字段有变化时,执行此更新module 19 MODULE table_modify ON CHAIN-REQUEST." 20 ENDCHAIN. 21 ENDLOOP. 22 23 MODULE user_command_2000.
1.52 设置断点
1.53 运行
按F8继续执行,此时g_it_tab第一行name改变为=003
此时内表第一行name=003,数据已改
1.6 针对1.5说明
1.7 翻页
1.71 翻页前要知道总行数
在PBO添加代码
PROCESS BEFORE OUTPUT. *1.71 添加代码:在屏幕输出前获取总行数 MODULE tab_main_arr. *1.4 在PBO添加如下代码:把读取的数据放到工作区g_wa中在页面展示 LOOP AT g_it_tab INTO g_wa WITH CONTROL tab_main CURSOR tab_main-current_line. ENDLOOP. *加载工具栏、标题 MODULE status_2000.
1.72 自定义按钮:下一页
1.73 下一页按钮代码
在屏幕PBO添加代码
*1.4 在PBO添加如下代码:把读取的数据放到工作区g_wa中在页面展示 LOOP AT g_it_tab INTO g_wa WITH CONTROL tab_main CURSOR tab_main-current_line. *1.73 设置每页显示多少行 MODULE set_pagelines. ENDLOOP.
在主程序添加代码
1 DATA page_lines LIKE sy-loopc."每页显示的行数,1.73添加 2 3 *------ 1.73添加:设置一页能显示多少行 -----* 4 *------ 并非是那种翻页,应该理解为:滚动一次会跳几行数据 -----* 5 MODULE set_pagelines OUTPUT. 6 page_lines = sy-loopc."sy-loopc=自动获取每页最大能显示几行 7 * page_lines = 5."如需指定翻页是几行,直接指定 8 ENDMODULE. 9 10 11 *------ 捕获功能码 ----* 12 MODULE user_command_2000 INPUT. 13 my_code = ok_code. 14 CLEAR ok_code. 15 16 CASE my_code. 17 WHEN '&EXIT' OR '&BACK'. 18 LEAVE TO SCREEN 0. 19 20 "1.73添加:需要判断到了最后一页,不能继续执行下一页的,此处省略判断 21 WHEN 'P++'. 22 tab_main-top_line = tab_main-top_line + page_lines. 23 24 ENDCASE. 25 ENDMODULE.
运行效果
1.8 总结
1.81 表格控件实现
1.9 完整代码
1.91 主程序全部代码
1 REPORT zcsdn_lion_custom09. 2 3 DATA: ok_code LIKE sy-ucomm, 4 my_code LIKE sy-ucomm. 5 DATA g_it_tab LIKE STANDARD TABLE OF zlion_test. 6 DATA g_wa LIKE zlion_test. 7 DATA page_lines LIKE sy-loopc."每页显示的行数,1.73添加 8 CONTROLS: tab_main TYPE TABLEVIEW USING SCREEN '2000'. "控件在屏幕2000上 9 10 START-OF-SELECTION. 11 PERFORM sub_getdata."查询语句 12 13 END-OF-SELECTION. 14 CALL SCREEN '2000'. 15 16 17 18 19 20 21 *------- 工具栏、标题加载到屏幕中 --------* 22 MODULE status_2000 OUTPUT. 23 SET PF-STATUS 'TOOLS'. 24 SET TITLEBAR 'TITLE'. 25 26 ENDMODULE. " STATUS_2000 OUTPUT 27 28 *------ 捕获功能码 ----* 29 MODULE user_command_2000 INPUT. 30 my_code = ok_code. 31 CLEAR ok_code. 32 33 CASE my_code. 34 WHEN '&EXIT' OR '&BACK'. 35 LEAVE TO SCREEN 0. 36 37 "1.73添加:需要判断到了最后一页,不能继续执行下一页的,此处省略判断 38 WHEN 'P++'. 39 tab_main-top_line = tab_main-top_line + page_lines. 40 41 ENDCASE. 42 ENDMODULE. " USER_COMMAND_2000 INPUT 43 44 *------ 查询语句----------* 45 FORM sub_getdata . 46 SELECT * INTO CORRESPONDING FIELDS OF TABLE g_it_tab FROM zlion_test ORDER BY xh. 47 ENDFORM. " SUB_GETDATA 48 49 50 *------ 1.4 工作区中,有数据变更的都更新到内表中-------------* 51 MODULE table_modify INPUT. 52 MODIFY g_it_tab FROM g_wa INDEX tab_main-current_line. 53 ENDMODULE. " TABLE_MODIFY INPUT 54 55 56 *-- 1.71 添加代码:在屏幕输出前获取总行数 --* 57 MODULE tab_main_arr OUTPUT. 58 * 获取数据总行数,有以下两种方式 59 * 第一种,比较简洁,新语法 60 tab_main-lines = LINES( g_it_tab ). 61 62 * 第二种,比较古老,向导方式创建表格控件也是用此方法 63 * DESCRIBE TABLE g_it_tab LINES tab_main-lines. 64 ENDMODULE. " TAB_MAIN_ARR OUTPUT 65 66 *------ 1.73添加:设置一页能显示多少行 -----* 67 *------ 并非是那种翻页,应该理解为:滚动一次会跳几行数据 -----* 68 MODULE set_pagelines OUTPUT. 69 page_lines = 20."sy-loopc=自动获取每页最大能显示几行 70 * page_lines = 5."如需指定翻页是几行,直接指定 71 ENDMODULE.
1.92 2000屏幕全部代码
1 PROCESS BEFORE OUTPUT. 2 *1.71 添加代码:在屏幕输出前获取总行数 3 MODULE tab_main_arr. 4 5 *1.4 在PBO添加如下代码:把读取的数据放到工作区g_wa中在页面展示 6 LOOP AT g_it_tab INTO g_wa WITH CONTROL tab_main 7 CURSOR tab_main-current_line. 8 9 *1.73 设置每页显示多少行 10 MODULE set_pagelines. 11 12 ENDLOOP. 13 14 *加载工具栏、标题 15 MODULE status_2000. 16 17 18 19 20 PROCESS AFTER INPUT. 21 *1.4 在PAI添加如下代码:循环内表,哪行数据有变化的就更新对应的那行. 22 LOOP AT g_it_tab. 23 "检查字段是否有变更. 24 CHAIN. 25 FIELD g_wa-name."当g_wa中的字段有改变的调用下面的module. 26 FIELD g_wa-sex."监控多个字段是否变更的,继续field 字段名 即可 27 28 "以上字段有变化时,执行此更新module 29 MODULE table_modify ON CHAIN-REQUEST." 30 ENDCHAIN. 31 ENDLOOP. 32 33 MODULE user_command_2000.
本文来自博客园,作者:雨水果冻,转载请注明原文链接:https://www.cnblogs.com/yushuiguodong/p/16529260.html