第七章 表控制Table Control设计
表控制(Table Control)是SAP应用中最重要的对象之一,业务单据的输入、基础数据的表格输入等都是使用Table Control控件,本章主要介绍:
(1) 在屏幕设计中通过向导来制作表控制对象,由系统生成程序; (2) 非向导设计Table Control控件;
(3) 通过系统生成数据表维护程序,并在程序中调用; (4) 表格设计技巧;
(5) 通过表格维护变更内表数据,并将内表数据提交数据库。
7.1使用向导制作Table Control
本节先建立一个内表,通过向导建立一个表格控件使用该内表。
7.1.1建立程序
先建立程序,定义内表,屏幕有退出按钮,代码如下。 逻辑流程序:
*PBO显示屏幕前的处理
PROCESS BEFORE OUTPUT. MODULE STATUS_0100.
*PAI用户输入后的处理 PROCESS AFTER INPUT. MODULE USER_COMMAND_0100.
主程序:
REPORT YTEST020. *功能码返回值
DATA:OK_CODE TYPE SY-UCOMM, SAVE_OK LIKE OK_CODE.
*定义内表,注意,两种写法一样
*DATA SP1 LIKE SPFLI OCCURS 0 WITH HEADER LINE. DATA SP1 LIKE TABLE OF SPFLI WITH HEADER LINE. *增加内表数据
SELECT * INTO CORRESPONDING FIELDS OF TABLE SP1 FROM SPFLI.
*测试输出数据
1
版权归原作者所有 仅供学习交流之用,请勿用于他途 *LOOP AT SP1.
* WRITE: / SP1-CARRID,SP1-CITYFROM. *ENDLOOP.
*直接调用窗口
CALL SCREEN 100.
*用户交互
MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE.
CLEAR OK_CODE. *退出按钮时退出程序
CASE SAVE_OK. WHEN ‘EXIT’. LEAVE PROGRAM. ENDCASE. ENDMODULE.
*定义状态条、包括菜单、工具条按钮、系统按钮等 MODULE STATUS_0100 OUTPUT. SET PF-STATUS ‘STATUS1’. ENDMODULE.
7.1.2 使用向导建立Table Control控件
启动屏幕编辑器,选“表控制”按钮(
),在屏幕上建立该对象后,系统启动导航界面,如
图7-1所示.。
2
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-1 输入Table Control的名称,继续,如图7-2所示。
3
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-2
选择从内表建立,输入内表名称SP1(在主程序中已建立该内表),如图7-3所示。
图7-3
如果程序没有激活,会有如图7-4所示提示,再打开一个SESSION激活程序。
图7-4
选择表字段,继续,如图7-5所示。
4
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-5 选择表格控件能输入(Input control)、有表头(With colum headers)、单选纪录(Single),如图7-6所示。
5
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-6 设定属性无滚动条,继续,如图7-7所示。
6
版权归原作者所有 仅供学习交流之用,请勿用于他途 图7-7
维护生成程序的名称,使用默认的名称,如图7-8所示。
图7-8
单击“完全”按钮,完成设计,如图7-9所示。
7
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-9
完成后设计界面如图7-10所示。
选择主程序并执行,系统输出如图7-11所示.
8
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-11
向导生成的Table Control对象已经能够正常地游览数据。 分析生成代码: 逻辑流程序:
*PBO显示屏幕前的处理
PROCESS BEFORE OUTPUT.
*PBO FLOW LOGIC FOR TABLECONTROL “TBL2” *MODULE TBL2_CHANGE_TC_ATTR. *MODULE TBL2_CHANGE_COL_ATTR. *循环取内表逐行写入表控制当前行 LOOP AT SP1 WITH CONTROL TBL2 CURSOR TBL2-CURRENT_LINE. *MOCULE TBL2_CHANGE_FIELD_ATTR ENDLOOP.
MODULE STATUS_0100.
*PAI用户输入后的处理 PROCESS AFTER INPUT.
*PAI FLOW LOGIC FOR TABLECONTROL “TBL2”. *当有数据改变时更新内表 PROCESS AFTER INPUT. LOOP AT SP1. CHAIN.
FIELD SP1-CARRID. FIELD SP1-CONNID. FIELD SP1-COUNTRYFR.
9
版权归原作者所有 仅供学习交流之用,请勿用于他途 FIELD SP1-CITYFROM. FIELD SP1-AIRPFROM. FIELD SP1-COUNTRYTO. FIELD SP1-CITYTO. FIELD SP1-AIRPTO. FIELD SP1-FLTIME. FIELD SP1-DEPTIME. FIELD SP1-ARRTIME. FIELD SP1-DISTANCE. FIELD SP1-DISTID. FIELD SP1-FLTYPE. FIELD SP1-PERIOD.
MODULE TBL2_MODIFY ON CHAIN-REQUEST. ENDCHAIN. ENDLOOP.
*MODULE TBL2_CHANGE_TC_ATTR. *MODULE TBL2_CHANGE_COL_ATTR.
MODULE USER_COMMAND_0100.
主程序:
REPORT YTEST020.
*功能码返回值
DATA:OK_CODE TYPE SY-UCOMM, SAVE_OK LIKE OK_CODE.
*定义内表,注意,两种写法一样
*DATA SP1 LIKE SPFLI OCCURS 0 WITH HEADER LINE. DATA SP1 LIKE TABLE OF SPFLI WITH HEADER LINE.
*增加内表数据
SELECT * INTO CORRESPONDING FIELDS OF TABLE SP1 FROM SPFLI.
*测试输出数据 *LOOP AT SP1.
* WRITE: / SP1-CARRID,SP1-CITYFROM. *ENDLOOP.
*直接调用窗口
CALL SCREEN 100.
*用户交互
MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE.
10
版权归原作者所有 仅供学习交流之用,请勿用于他途 *退出时退出程序 CASE SAVE_OK.
WHEN 'EXIT'. LEAVE PROGRAM. when others. ENDCASE.
ENDMODULE. \"USER_COMMAND_0100 INPUT
*定义状态条,包括菜单、工具条按钮、系统按钮等 MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'.
ENDMODULE. \"STATUS_0100 OUTPUT
*以下是自动产生的程序 *定义表控制对象
CONTROLS: TBL2 TYPE TABLEVIEW USING SCREEN 0100.
MODULE TBL2_CHANGE_TC_ATTR OUTPUT.
DESCRIBE TABLE SP1 LINES TBL2-lines. ENDMODULE.
*当数据改变时更新内表
MODULE TBL2_MODIFY INPUT. MODIFY SP1
INDEX TBL2-CURRENT_LINE. ENDMODULE.
7.2 手工制作Table Control
先建立一个有退出按钮的程序,进入屏幕编辑器,选中控制对象(
),并在屏幕上创
建,如图7-12所示。
11
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-12
建立的对象显示粉红色,表示属性未设置正确。输入名称属性后,表头会转为灰色。表
,然后在表身创建,如图
格的创建与常规编程软件不同,需要选中一个输入输出字段7-13所示。
12
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-13 输入名称后整个表格都转为灰色(表示已设置正确)。调整输入字段的其他属性,如图7-14所示。
图7-14
手工调整字段名称和内表对应的名称一致后,第一个字段建立完成,然后为该字段加上表头,制作方式和输入字段一样,选中一个文本字段,创建在该字段上方的表头,如图7-15所示。
13
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-15
接着创建航班号、起飞城市等信息,并添加垂直水平分格符,完成后如图7-16所示。
图7-16
界面设计完成。 设计逻辑流程序:
*PBO显示屏幕前的处理 PROCESS BEFORE OUTPUT. MODULE STATUS_0100.
*处理LOOP从内表读到表控制 LOOP WITH CONTROL TBL1.
14
版权归原作者所有 仅供学习交流之用,请勿用于他途
MODULE FILLTBL1. ENDLOOP.
PROCESS AFTER INPUT.
*处理LOOP从表控制更新内表 LOOP WITH CONTROL TBL1. MODULE READTBL1. ENDLOOP.
MODULE USER_COMMAND_0100.
主程序:
REPORT YTEST21.
DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM. *定义内表,注意,两种写法一样
*DATA SP2 LIKE SPFLI OCCURS 0 WITH HEADER LINE. DATA SP2 LIKE TABLE OF SPFLI WITH HEADER LINE. *定义单结构记录
DATA SP1 TYPE SPFLI. *增加内表数据
SELECT * INTO CORRESPONDING FIELDS OF TABLE SP2 FROM SPFLI. *直接调用窗口 CALL SCREEN 100. *定义表控制对象
CONTROLS TBL1 TYPE TABLEVIEW USING SCREEN 100. *输出数据,看内表有无改变 LOOP AT SP2.
WRITE: / SP2-CARRID,SP2-CONNID,SP2-COUNTRYFR,SP2-CITYFROM. ENDLOOP.
*&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------* * text
*----------------------------------------------------------------------* MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'.
ENDMODULE. \" STATUS_0100 OUTPUT
*&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------* * text
15
版权归原作者所有 仅供学习交流之用,请勿用于他途
*----------------------------------------------------------------------* MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE. CASE SAVE_OK. WHEN 'EXIT'.
LEAVE TO SCREEN 0. ENDCASE.
ENDMODULE. \" USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------* *& Module FILL OUTPUT
*&---------------------------------------------------------------------* * 逐行从内表填写表控制
*----------------------------------------------------------------------* MODULE FILLTBL1 OUTPUT.
READ TABLE SP2 INTO SP1 INDEX TBL1-CURRENT_LINE. ENDMODULE. \" FILL OUTPUT
*&---------------------------------------------------------------------* *& Module READ INPUT
*&---------------------------------------------------------------------* * 逐行从内表控制更新内表
*----------------------------------------------------------------------* MODULE READTBL1 INPUT.
MODIFY SP2 FROM SP1 INDEX TBL1-CURRENT_LINE. ENDMODULE. \" READ INPUT
程序输出结果如图7-17所示。
16
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-17
调整前2行数据,如图7-18所示。
图7-18
退出编辑屏幕,程序输出内表数据,屏幕显示数据已更改,如图7-19所示。
17
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-19 上述表格控件是没有垂直滚动条的,原因是没有定义表格的记录数,因而在PBO中还需要添加以下代码: DATA NUMS TYPE I. MODULE STATUS_0100 OUTPUT. SET PF-STATUS ‘STATUS1’. IF NUMS = 0.
DESCRIBE TABLE SP2 LINES NUMS. TBL1-LINES = NUMS. ENDIF. ENDMODULE.
7.3 通过系统生成数据表维护程序
通过系统生成数据表维护程序TCODE:SE55,通过系统数据维护功能使用生成程序(TCODE:SM30),过程如下:建立一个数据表(SE11),生成维护程序(SE55),数据维护(SM30),设计代码调用生成程序。
7.3.1 新建数据表
新建一个数据表YMANA,详细步骤请参阅“数据字典”,表结构如图7-20所示。
18
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-20
7.3.2 生成维护程序
输入TCODE:SE55,输入函数组名称和屏幕号,选择权限组,如图7-21所示。
19
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-21
单击新建按钮,选择“本地对象”,生成维护程序。
7.3.3 数据维护
输入TCODE:SM30,输入表名后单击维护按钮,如图7-22所示。
20
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-22
系统进入数据维护界面,如图7-23所示。
图7-22
单击右下角的状态条,屏幕显示程序名为“SAPLYTESTF008B”如图7-24所示。
21
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-24 生成程序的表头等信息都可以调整,输入TCODE:SE51进入屏幕编辑器,输入程序名“SAPLYTESTF008B”,找到编号为100的屏幕,进入设计界面后,可以调整屏幕对象,如图7-25所示。
图7-25
保存激活后,使用界面也相应改变,如图7-26所示。
22
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-26
7.3.4 从程序调用生成的维护窗口
通过函数调用生成程序,程序如下:
REPORT YTEST23 .
CALL FUNCTION 'VIEW_MAINTENANCE_CALL' EXPORTING
ACTION = 'U' VIEW_NAME = 'YMANA' 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.
23
版权归原作者所有 仅供学习交流之用,请勿用于他途
7.4 表格相关技巧 7.4.1 双击启动事件
定义状态条中的F2功能键,在程序中处理返回功能码,如图7-27所示。
图7-27
7.4.2 取得行号
程序:
*取得当前屏幕和行号 GET CURSOR LINE LINEA. CHECK SY-SUBRC = 0.
*当前行号 = 当前屏首行序号 + 当前屏行号 LINEA = TBLA-TOP_LINE - 1. *用取得当前行号读取内表
READ TABLE WA_FPFLI INDEX LINEA. *在状态条显示
MESSAGE S005(YMESS) WITH LINEA.
24
版权归原作者所有 仅供学习交流之用,请勿用于他途
7.4.3 定义表格的读写属性
程序:
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'. ENIF. ENDIF. ENDLOOP.
MODIFY TBL1-COLS FROM ACOL INDEX SY-TABIX.
输出界面如图所示。
图7-28
7.5 通过表格维护变更内表数据后提交数据库
结合内表,对表格控件数据增加、修改、删除后提交到数据库,最终界面如图7-29所示。
25
版权归原作者所有 仅供学习交流之用,请勿用于他途
图7-29
步骤:
(1)用向导建立表格
(2)建立按钮“取当前行”,在事件中取表格控件当前行,并在状态条上显示当前行数据。 (3)建立按钮“删除行”,在事件中删除表格上当前选择的行。 (4)增加系统按钮“保存”,将内表数据提交数据库。 逻辑流程序:
PROCESS BEFORE OUTPUT.
*&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'TBL1' MODULE TBL1_CHANGE_TC_ATTR.
*&SPWIZARD: MODULE TBL1_CHANGE_COL_ATTR. LOOP AT SP1
WITH CONTROL TBL1
CURSOR TBL1-CURRENT_LINE.
*&SPWIZARD: MODULE TBL1_CHANGE_FIELD_ATTR ENDLOOP.
* MODULE STATUS_0100. *
PROCESS AFTER INPUT.
*&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'TBL1' LOOP AT SP1. CHAIN.
26
版权归原作者所有 仅供学习交流之用,请勿用于他途
FIELD SP1-CARRID. FIELD SP1-CONNID. FIELD SP1-COUNTRYFR. FIELD SP1-CITYFROM. FIELD SP1-AIRPFROM. FIELD SP1-COUNTRYTO. FIELD SP1-CITYTO. FIELD SP1-AIRPTO.
MODULE TBL1_MODIFY ON CHAIN-REQUEST. ENDCHAIN. ENDLOOP.
*&SPWIZARD: MODULE TBL1_CHANGE_TC_ATTR. *&SPWIZARD: MODULE TBL1_CHANGE_COL_ATTR. MODULE CANCEL AT EXIT-COMMAND. MODULE USER_COMMAND_0100.
主程序:
REPORT YTEST25 .
DATA: OK_CODE TYPE SY-UCOMM, SAVE_OK TYPE SY-UCOMM.
DATA: SP1 LIKE TABLE OF SPFLI WITH HEADER LINE,
DELA_SPFLI LIKE TABLE OF SPFLI WITH HEADER LINE. DATA LINEA TYPE I.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'TBL1' ITSELF CONTROLS: TBL1 TYPE TABLEVIEW USING SCREEN 0100. DATA WA1 LIKE SPFLI.
SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF TABLE SP1. CALL SCREEN 100.
*&SPWIZARD: OUTPUT MODULE FOR TC 'TBL1'. DO NOT CHANGE THIS LINE! *&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR MODULE TBL1_CHANGE_TC_ATTR OUTPUT. DESCRIBE TABLE SP1 LINES TBL1-LINES.
ENDMODULE. \"TBL1_CHANGE_TC_ATTR OUTPUT
*&SPWIZARD: INPUT MODULE FOR TC 'TBL1'. DO NOT CHANGE THIS LINE! *&SPWIZARD: MODIFY TABLE MODULE TBL1_MODIFY INPUT. MODIFY SP1
INDEX TBL1-CURRENT_LINE.
ENDMODULE. \"TBL1_MODIFY INPUT
*&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------* * text
27
版权归原作者所有 仅供学习交流之用,请勿用于他途
*----------------------------------------------------------------------* MODULE STATUS_0100 OUTPUT. SET PF-STATUS 'STATUS1'.
ENDMODULE. \" STATUS_0100 OUTPUT
*&---------------------------------------------------------------------* *& Module CANCEL INPUT
*&---------------------------------------------------------------------* * text
*----------------------------------------------------------------------* MODULE CANCEL INPUT.
ENDMODULE. \" CANCEL INPUT
*&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------* * text
*----------------------------------------------------------------------* MODULE USER_COMMAND_0100 INPUT. SAVE_OK = OK_CODE. CLEAR OK_CODE. CASE SAVE_OK. WHEN 'EXIT'.
LEAVE TO SCREEN 0. WHEN 'SAVE'.
MODIFY SPFLI FROM TABLE SP1. IF SY-SUBRC NE 0.
MESSAGE I005(YMESS) WITH '更新数据错误!'. EXIT. ELSE.
MESSAGE I005(YESS) WITH '更新数据OK!'. ENDIF.
DELETE SPFLI FROM TABLE DELA_SPFLI. IF SY-SUBRC NE 0.
MESSAGE I005(YMESS) WITH '更新数据错误!'. ELSE.
MESSAGE I005(YESS) WITH '更新数据OK!'. ENDIF. WHEN 'DELA'.
GET CURSOR LINE LINEA. CHECK SY-SUBRC = 0.
LINEA = TBL1-TOP_LINE + LINEA - 1. READ TABLE SP1 INDEX LINEA. APPEND SP1 TO DELA_SPFLI.
28
版权归原作者所有 仅供学习交流之用,请勿用于他途
DELETE SP1 INDEX : LINEA. WHEN 'GETDATA'.
GET CURSOR LINE LINEA. CHECK SY-SUBRC = 0.
LINEA = TBL1-TOP_LINE - 1. READ TABLE SP1 INDEX LINEA.
MESSAGE S006(YMESS) WITH SP1-CARRID SP1-CITYFROM. ENDCASE.
ENDMODULE. \" USER_COMMAND_0100 INPUT
29
因篇幅问题不能全部显示,请点此查看更多更全内容