先建立程序,定义内表,屏幕有退出按钮,主程序代码如下
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.
启动屏幕编辑器,选“表控件”按钮,在屏幕上建立该对象后,系统自动导航界面,如图
输入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.
先建立一个有退出按钮的程序,进入屏幕编辑器,选中控制对象,并在屏幕上创建
建立的对象显示粉红色,表示属性未设置正确。输入名称属性后,表头会转为灰色。表格的创建与常规编程软件不同,需要选中一个输入输出字段,然后在表身创建输入名称后整个表格都转为灰色(表示已设置正确)。调整输入字段的其他属性,如图
手工调整字段名称和内表对应的名称一致后,第一个字段建立完成,然后为该字段加上表头,制作方式和输入字段一样,选中一个文本字段,创建在该字段上方的表头
接着创建等信息,并添加垂直水平分格符,完成后如图
逻辑流程序如下
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.执行后结果如图
系统进入数据维护界面
单击右下角的状态条,屏幕显示程序名为“SAPLYTJAYMANA”
生成程序的表头等信息都可以调整,输入TCODE:SE51进入屏幕编辑器,输入程序名“SAPLYTJAYMANA”,找到编号为100的屏幕,进入设计界面后,可以调整屏幕对象
保存激活后,使用界面也相应改变
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.运行后,界面如图
*取得当前屏幕和行号 GET CURSOR LINE LINEA. CHECK SY-SUBRC = 0. *当前行号 = 当前屏首行序号 + 当前屏行号 LINEA = TBLA - LOP_LINE - 1. *用取得当前行号读取内表 READ TABLE YTJAYMANA INDEX LINEA. MESSAGE S005(YMESS) WITH LINEA.
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.
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