(1)在屏幕设计中通过向导来制作表控件对象,由系统生成程序;
(2)非向导设计Table Control控件;
(3)通过系统生成数据表维护程序,并在程序中调用;
(4)表格设计技巧;
(5)通过表格维护变更内表数据,并将内表数据提交数据库。
1、使用向导制作Table Control
本节先建立一个内表,通过向导建立一个表格控件使用该内表。1.1、建立程序
先建立程序,定义内表,屏幕有退出按钮,主程序代码如下
REPORT YTEST20160615002.
DATA: OK_CODE TYPE SY-UCOMM,
SAVE_OK LIKE OK_CODE.
*定义内表,注意两种写法一样
*DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE.
DATA SH1 LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE.
*增加内表数据
SELECT * INTO CORRESPONDING FIELDS OF TABLE SH1 FROM YTJAYSCHOOL.
*测试输出数据
LOOP AT SH1.
WRITE:/ SH1-YCT_ID, SH1-YSH_ID, SH1-YSH_NAME, SH1-YSH_ADDR.
ENDLOOP.
*直接调用窗口
CALL SCREEN 100.
*用户交互
MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
*退出按钮时退出程序
CASE SAVE_OK.
WHEN 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS1'.
ENDMODULE.
逻辑流程序
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
1.2、使用向导建立Table Control控件
启动屏幕编辑器,选“表控件”按钮,在屏幕上建立该对象后,系统自动导航界面,如图
输入Table Control的名称,继续
选择从内表建立,输入内表名称SH1(在主程序中已建立该内表)
如果程序没有激活,会提示需要激活,此时再打开一个SESSION激活程序,此前我们已经激活该程序。
选择表字段,继续
选择表格控件能输入(Input control)、有表头(With column headers)、单选纪录(Single)
设定属性无滚动条,继续
维护生成程序的名称,使用默认的名称
单击“完成”按钮,完成设计
完成后,设计界面如图
选择主程序并执行,系统输出如图
向导生成的Table Control对象已经能够正常地浏览数据。
分析生成的代码
主程序代码如下:
REPORT YTEST20160615002.
DATA: OK_CODE TYPE SY-UCOMM,
SAVE_OK LIKE OK_CODE.
*定义内表,注意两种写法一样
*DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE.
DATA SH1 LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE.
*增加内表数据
SELECT * INTO CORRESPONDING FIELDS OF TABLE SH1 FROM YTJAYSCHOOL.
*测试输出数据
LOOP AT SH1.
WRITE:/ SH1-YCT_ID, SH1-YSH_ID, SH1-YSH_NAME, SH1-YSH_ADDR.
ENDLOOP.
*直接调用窗口
CALL SCREEN 100.
*用户交互
MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
*退出按钮时退出程序
CASE SAVE_OK.
WHEN 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE.
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS1'.
ENDMODULE.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'TBL' ITSELF
CONTROLS: TBL TYPE TABLEVIEW USING SCREEN 0100.
*&SPWIZARD: OUTPUT MODULE FOR TC 'TBL'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE TBL_CHANGE_TC_ATTR OUTPUT.
DESCRIBE TABLE SH1 LINES TBL-lines.
ENDMODULE.
*&SPWIZARD: INPUT MODULE FOR TC 'TBL'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: MODIFY TABLE
MODULE TBL_MODIFY INPUT.
MODIFY SH1
INDEX TBL-CURRENT_LINE.
ENDMODULE.
逻辑流代码如下:
PROCESS BEFORE OUTPUT.
*&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TBL'
MODULE TBL_CHANGE_TC_ATTR.
*&SPWIZARD: MODULE TBL_CHANGE_COL_ATTR.
LOOP AT SH1
WITH CONTROL TBL
CURSOR TBL-CURRENT_LINE.
*&SPWIZARD: MODULE TBL_CHANGE_FIELD_ATTR
ENDLOOP.
MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
*&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TBL'
LOOP AT SH1.
CHAIN.
FIELD SH1-YCT_ID.
FIELD SH1-YSH_ID.
FIELD SH1-YSH_NAME.
FIELD SH1-YSH_ADDR.
MODULE TBL_MODIFY ON CHAIN-REQUEST.
endchain.
ENDLOOP.
*&SPWIZARD: MODULE TBL_CHANGE_TC_ATTR.
*&SPWIZARD: MODULE TBL_CHANGE_COL_ATTR.
MODULE USER_COMMAND_0100.
2、手工制作Table Control
先建立一个有退出按钮的程序,进入屏幕编辑器,选中控制对象,并在屏幕上创建
输入名称后整个表格都转为灰色(表示已设置正确)。调整输入字段的其他属性,如图
手工调整字段名称和内表对应的名称一致后,第一个字段建立完成,然后为该字段加上表头,制作方式和输入字段一样,选中一个文本字段,创建在该字段上方的表头
接着创建等信息,并添加垂直水平分格符,完成后如图
逻辑流程序如下
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
*处理LOOP从内表读到表控制
LOOP WITH CONTROL TBL1.
MODULE FILLTBL1.
ENDLOOP.
PROCESS AFTER INPUT.
*处理LOOP从表控制更新内表
LOOP WITH CONTROL TBL1.
MODULE READTBL1.
ENDLOOP.
MODULE USER_COMMAND_0100.
主程序代码如下
REPORT YTEST20160615003.
DATA: OK_CODE TYPE SY-UCOMM,
SAVE_OK TYPE SY-UCOMM.
*定义内表,注意两种写法一样
*DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE.
DATA SH2 LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE.
*定义单结构纪录
DATA SH TYPE YTJAYSCHOOL.
*增加内表数据
SELECT * INTO CORRESPONDING FIELDS OF TABLE SH2 FROM YTJAYSCHOOL.
*直接调用窗口
CALL SCREEN 100.
*定义表控制对象
CONTROLS TBL1 TYPE TABLEVIEW USING SCREEN 100.
*输出数据,看内表有无改变
LOOP AT SH2.
WRITE:/ SH2-YCT_ID, SH2-YSH_ID, SH2-YSH_NAME, SH2-YSH_ADDR.
ENDLOOP.
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS1'.
ENDMODULE.
MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
WHEN 'CANCEL'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
*逐行从内表填写表控制
MODULE FILLTBL1 OUTPUT.
READ TABLE SH2 INTO SH INDEX TBL1-CURRENT_LINE.
ENDMODULE.
*逐行从内表控制更新内表
MODULE READTBL1 INPUT.
MODIFY SH2 FROM SH INDEX TBL1-CURRENT_LINE.
ENDMODULE.
输出结果如图
调整前两行数据,如图
退出编辑屏幕,程序输出内表数据,屏幕显示数据已更改
上述表格控件是没有垂直滚动条的,原因是没有定义表格的记录数,因而在PBO中还需要添加以下代码,添加完代码后如下:
REPORT YTEST20160615003.
DATA: OK_CODE TYPE SY-UCOMM,
SAVE_OK TYPE SY-UCOMM.
DATA: NUMS TYPE I.
*定义内表,注意两种写法一样
*DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE.
DATA SH2 LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE.
*定义单结构纪录
DATA SH TYPE YTJAYSCHOOL.
*增加内表数据
SELECT * INTO CORRESPONDING FIELDS OF TABLE SH2 FROM YTJAYSCHOOL.
*直接调用窗口
CALL SCREEN 100.
*定义表控制对象
CONTROLS TBL1 TYPE TABLEVIEW USING SCREEN 100.
*输出数据,看内表有无改变
LOOP AT SH2.
WRITE:/ SH2-YCT_ID, SH2-YSH_ID, SH2-YSH_NAME, SH2-YSH_ADDR.
ENDLOOP.
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS1'.
IF NUMS = 0.
DESCRIBE TABLE SH2 LINES NUMS.
TBL1-LINES = NUMS.
ENDIF.
ENDMODULE.
MODULE USER_COMMAND_0100 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
WHEN 'CANCEL'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
*逐行从内表填写表控制
MODULE FILLTBL1 OUTPUT.
READ TABLE SH2 INTO SH INDEX TBL1-CURRENT_LINE.
ENDMODULE.
*逐行从内表控制更新内表
MODULE READTBL1 INPUT.
MODIFY SH2 FROM SH INDEX TBL1-CURRENT_LINE.
ENDMODULE.
执行后结果如图
3、通过系统生成数据表维护程序
通过系统生成数据表维护程序TCODE:SE55,通过系统数据维护功能使用生成程序(TCODE:SM30),过程如下:建立一个数据表(SE11),生成维护程序(SE55),数据维护(SM30),设计代码调用生成程序。
3.1、新建数据表
新建一个数据表YTJAYMANA,详细步骤请参阅“ ABAP数据字典和数据表的读取”,表结构如图
3.2、生成维护程序
输入TCODE:SE55,输入函数组名称和屏幕号,选择权限组
单击新建按钮,选择“本地对象”,生成维护程序。
3.3、数据维护
输入TCODE:SM30,输入表名后单击维护按钮
系统进入数据维护界面
单击右下角的状态条,屏幕显示程序名为“SAPLYTJAYMANA”
生成程序的表头等信息都可以调整,输入TCODE:SE51进入屏幕编辑器,输入程序名“SAPLYTJAYMANA”,找到编号为100的屏幕,进入设计界面后,可以调整屏幕对象
保存激活后,使用界面也相应改变
3.4、从程序调用生成的维护窗口
通过函数调用生成程序,程序如下:REPORT YTEST20160616001.
CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
EXPORTING
ACTION = 'U'
VIEW_NAME = 'YTJAYMANA'
EXCEPTIONS
FOREIGN_LOCK = 2
NO_TVDIR_ENTRY = 8.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
运行后,界面如图
4、表格相关技巧
4.1、取得行号
*取得当前屏幕和行号
GET CURSOR LINE LINEA.
CHECK SY-SUBRC = 0.
*当前行号 = 当前屏首行序号 + 当前屏行号
LINEA = TBLA - LOP_LINE - 1.
*用取得当前行号读取内表
READ TABLE YTJAYMANA INDEX LINEA.
MESSAGE S005(YMESS) WITH LINEA.
4.2、定义表格的读写属性
WHEN 'READWR'.
*当单击按钮时,第一列只读,其他列读写切换
LOOP AT TBL1-COLS INTO ACOL WHERE INDEX GT 0.
IF SY-TABIX = 1.
ACOL-SCREEN-INPUT = '0'.
ELSE.
IF ACOL-SCREEN-INPUT = '0'.
ACOL-SCREEN-INPUT = '1'.
ELSEIF ACOL-SCREEN-INPUT = '1'.
ACOL-SCREEN-INPUT = '0'.
ENDIF.
ENDIF.
ENDLOOP.
MODIFY TBL1-COLS FROM ACOL INDEX SY-TABIX.
5、通过表格维护变更内表数据后提交数据库
结合内表,对表格控件数据增加、修改、删除后提交到数据库,最终界面如图步骤:
(1)用向导建立表格
(2)建立按钮“取当前行”,在事件中取表格控件当前行,并在状态条上显示当前行数据
(3)建立按钮“删除行“,在事件中删除表格上当前选择的行
(4)增加系统按钮”保存“,将内表数据提交数据库
PROCESS BEFORE OUTPUT.
*&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TBL'
MODULE TBL_CHANGE_TC_ATTR.
*&SPWIZARD: MODULE TBL_CHANGE_COL_ATTR.
LOOP AT SH1
WITH CONTROL TBL
CURSOR TBL-CURRENT_LINE.
*&SPWIZARD: MODULE TBL_CHANGE_FIELD_ATTR
ENDLOOP.
MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
*&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TBL'
LOOP AT SH1.
CHAIN.
FIELD SH1-YCT_ID.
FIELD SH1-YSH_ID.
FIELD SH1-YSH_NAME.
FIELD SH1-YSH_ADDR.
MODULE TBL_MODIFY ON CHAIN-REQUEST.
endchain.
ENDLOOP.
*&SPWIZARD: MODULE TBL_CHANGE_TC_ATTR.
*&SPWIZARD: MODULE TBL_CHANGE_COL_ATTR.
MODULE USER_COMMAND_0100.
主程序:
REPORT ytest20160615002.
DATA: ok_code TYPE sy-ucomm,
save_ok LIKE ok_code.
*定义内表,注意两种写法一样
*DATA SH1 LIKE YTJAYSCHOOL OCCURS 0 WITH HEADER LINE.
DATA: sh1 LIKE TABLE OF ytjayschool WITH HEADER LINE,
DELA_SCHOOL LIKE TABLE OF YTJAYSCHOOL WITH HEADER LINE.
DATA LINEA TYPE I.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'TBL' ITSELF
CONTROLS: TBL TYPE TABLEVIEW USING SCREEN 0100.
DATA WA1 LIKE YTJAYSCHOOL.
*增加内表数据
SELECT * FROM YTJAYSCHOOL INTO CORRESPONDING FIELDS OF TABLE SH1.
*测试输出数据
*LOOP AT sh1.
* WRITE:/ sh1-yct_id, sh1-ysh_id, sh1-ysh_name, sh1-ysh_addr.
*ENDLOOP.
*直接调用窗口
CALL SCREEN 100.
*&SPWIZARD: OUTPUT MODULE FOR TC 'TBL'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE tbl_change_tc_attr OUTPUT.
DESCRIBE TABLE sh1 LINES tbl-lines.
ENDMODULE. "TBL_CHANGE_TC_ATTR OUTPUT
*&SPWIZARD: INPUT MODULE FOR TC 'TBL'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: MODIFY TABLE
MODULE tbl_modify INPUT.
MODIFY sh1
INDEX tbl-current_line.
ENDMODULE. "TBL_MODIFY INPUT
*----------------------------------------------------------------------*
* MODULE STATUS_0100 OUTPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STATUS1'.
ENDMODULE. "STATUS_0100 OUTPUT
*用户交互
MODULE user_command_0100 INPUT.
save_ok = ok_code.
CLEAR ok_code.
*退出按钮时退出程序
CASE save_ok.
WHEN 'CANCEL'.
LEAVE PROGRAM.
WHEN 'SAVE'.
MODIFY YTJAYSCHOOL FROM TABLE SH1.
IF SY-SUBRC NE 0.
MESSAGE I005(YMESS) WITH '更新数据错误!'.
EXIT.
ELSE.
MESSAGE I005(YMESS) WITH '更新数据OK!'.
ENDIF.
DELETE YTJAYSCHOOL FROM TABLE DELA_SCHOOL.
IF SY-SUBRC NE 0.
MESSAGE I005(YMESS) WITH '更新数据错误!'.
EXIT.
ELSE.
MESSAGE I005(YMESS) WITH '更新数据OK!'.
ENDIF.
WHEN 'DELA'.
GET CURSOR LINE LINEA.
CHECK SY-SUBRC = 0.
LINEA = TBL-TOP_LINE + LINEA - 1.
READ TABLE SH1 INDEX LINEA.
APPEND SH1 TO DELA_SCHOOL.
DELETE SH1 INDEX : LINEA.
WHEN 'GETDATA'.
GET CURSOR LINE LINEA.
CHECK SY-SUBRC = 0.
LINEA = TBL-TOP_LINE - 1.
READ TABLE SH1 INDEX LINEA.
MESSAGE S006(YMESS) WITH SH1-YSH_NAME SH1-YSH_ADDR.
ENDCASE.
ENDMODULE. "USER_COMMAND_0100 INPUT