同创建内表数据类型(页 99)中所示,该示例创建数据类型 ITAB 作为内表。通过使用 DATA 语句的 TYPE 参数引用 ITAB,使数据对象 TAB1 与 ITAB 结构相同。通过使用 DATA 语句的 LIKE 参数引用 TAB1,使数据对象 TAB2 结构相同。创建的 TAB2 带表头行。因此,可以在程序中使用 TAB2-COLUMN1、TAB2-COLUMN2 和 TAB2-COLUMN3 等定位表格工作区域 TAB2。
exp :
DATA FLIGHT_TAB LIKE SFLIGHT OCCURS 10.
本示例创建数据对象 FLIGHT_TAB, 其结构与数据库表格 SFLIGHT 相同。
本示例介绍 如何采用两种不同的步骤创建同一内表。
TYPES VECTOR_TYPE TYPE I OCCURS 10.
DATA VECTOR TYPE VECTOR_TYPE WITH HEADER LINE.
在此创建一个内表数据类型 VECTOR_TYPE,其行包含首先创建的基本类型 I 字段。然后,通过引用 VECTOR_TYPE 创建数据对象 VECTOR。通过使用 WITH HEADER LINE 选项还创建表格工作区域 VECTOR。在这种情况下,表格工作区域包含一种类型 I 字段,可以通过名称 VECTOR 定位。
DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.
在这种情况下,通过直接在 DATA 语句中使用 OCCURS 选项创建完全一样的数据类型 VECTOR。
利用循环方式读取所有记录 SELECT ….ENDSELECT.是循环方式读取记录的。 例如: TABLES MARD. SELECT [DISTINCT] * FROM MARD WHERE MATNR = '3520421700'. . ENDSELECT. (从MARD中抓取所有料号=3520421700的资料) ◆读取一笔资料 Example: TABLES SPFLI. SELECT SINGLE * FROM SPFLI WHERE PLANT ='CHUNGLI' AND TEL='4526174'. WRITE: / SPFLI-COMPANY,SPFLI-PLANT,SPFLI-TEL. ◆将读取的记录放在work area中,并且加入Internal table 中. 格式有: ... INTO ... INTO CORRESPONDING FIELDS OF ... INTO (f1, ..., fn) 变量组. ... INTO TABLE ... INTO CORRESPONDING FIELDS OF TABLE ... APPENDING TABLE ... APPENDING CORRESPONDING FIELDS OF TABLE 举例一: TABLES MARD. DATA: BEGIN OF ITAB OCCURS 10, MATNR LIKE MARD-MATNR, WERKS LIKE MARD-WERKS, LGORT LIKE MARD-LGORT, LABST LIKE MARD-LABST, END OF ITAB. SELECT MATNR WERKS LGORT LABST INTO CORRESPONDING FIELDS OF ITAB FROM MARD WHERE MATNR = '3520421700'. APPEND ITAB. CLEAR ITAB. ENDSELECT. (将读取的结果放在Internal table ITAB中)
DATA: BEGIN OF WA, LINE(240), END OF WA. DATA NAME(10). NAME = 'SPFLI'. SELECT * FROM (NAME) INTO WA. WRITE: / WA-LINE. ENDSELECT. 数据库表名称 SPFLI 被赋给字符字段 NAME。SELECT 语句将所有的行从 SPFLI 中读到目标区 WA 中。在该示例中,WA 与 SPFLI 的结构并不相同,每一行都将自动地转换成字符字段.
举例二. TABLES MARD. SELECT MATNR MTART MAKTX INTO (t_matnr, t_mtart, maktx) FROM MARD WHERE MATNR = '3520421700'. . ENDSELECT. (从MARD中抓取料号=3520421700的料号、类型和描述,放在变量t_matnr, t_mtart, maktx中)。
Example: TABLES SPFLI. DATA WA LIKE TABLES. SELECT * FROM SPFLI INTO WA. WRITE: / WA-COMPANY,WA-PLANT. ENDSELECT. 逐笔写入WA 工作区中 举例三. 将读取的资料写入 Initial Table 中 语法: SELECT .. INTO TABLE Example: TABLES SPFLI. DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE. SELECT * FROM SPFLI INTO ITAB. 一次读10笔(Initial Table的长度)记录存入 ITAB 中
SELECT .. INTO TABLE PACKAGE SIZE 一次读取 笔记录至 中 Example: TABLES SPFLI. DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE. SELECT * FROM SPFLI INTO ITAB PACKAGE SIZE 5. 一次读取 5 笔记录
exp :
TABLES SPFLI. DATA: BEGIN OF WA, NUMBER TYPE I VALUE 1, CITYFROM LIKE SPFLI-CITYFROM, CITYTO LIKE SPFLI-CITYTO, END OF WA. SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF WA. WRITE: / WA-NUMBER, WA-CITYFROM, WA-CITYTO. ENDSELECT. 输出如下所 示:
在该示例中,系统只将数据库表 SPFLI 中选定行的列 CITYFROM 和 CITYTO 传送到 WA 中。WA 中的组件 NUMBER 保持不变。 *-------------------------------------------------------------------------------------*
按指定的栏位排序 TABLES SBOOK. SELECT * FROM SBOOK WHERE CARRID = 'LH' AND CONNID = '0400' AND FLDATE = '19950228' ORDER BY BOOKID ASCENDING. WRITE: / SBOOK-BOOKID, SBOOK-CUSTOMID, SBOOK-CUSTTYPE, SBOOK-SMOKER, SBOOK-LUGGWEIGHT, SBOOK-WUNIT, SBOOK-INVOICE. ENDSELECT. (利用参数ORDER BY所指定的栏位排序) *-------------------------------------------------------------------------------------*
◆ 抓取数据的条件关键字 (1) BETWEEN AND 例如: WHERE YEAR BETWEEN 1995 AND 2000. (2) LIKE 例如: WHERE NAME LIKE 'MIKE%'. ('%'是通配符号) (3) IN (…) 是…里面的任意一个值即可. 例如: WHERE PLANT IN ('CHUNGLI', 'TAOYUAN','LIUTU'). (表示PLANT 只要是'CHUNGLI'或'TAOYUAN'或'LIUTU'都可以). (4) ORDER BY 关键字 指定排序的栏位或顺序 (1). ..ORDER BY PRIMARY KEY. 根据 PRIMARY KEY 递增排序 (2)…ORDER BY [DESCENDING] [DESCENDING] Example: SELECT * FROM IM ORDER BY PART . *-------------------------------------------------------------------------------------*
INSERT 语句 ◆从work area 加入到Internal Table中 格式: INSERT INTO VALUES 例如: DATA: BEGIN OF WA, CODE(6) TYPE C, NAME(30) TYPE C, END OF WA. DATA: VEN LIKE WA OCCURS 10. … WA-CODE = '530120'. WA-NAME = 'XINGDA ELECTRONICS CO.,LTD'. INSERT INTO VEN VALUES WA . 如果work area的名称就是internal table的名称,可以直接写成: INSERT 例如: DATA: BEGIN OF WA OCCURS 10, CODE(6) TYPE C, NAME(30) TYPE C, END OF WA. … WA-CODE = '530120'. WA-NAME = 'XINGDA ELECTRONICS CO., LTD'. INSERT WA. ◆从另外一个Internal table中INSERT 资料 格式: INSERT FROM TABLE [ACCEPTING DUPLICATE KEY] 将中非NULL的资料加入中,加上[ACCEPTING DUPLICATE KEY]能限制相同PRIMARY KEY不重复加入.
加入一笔记录至资料库
1.自 Work Area 工作区 语法: INSERT INTO VALUES Example: TABLES SPFLI. DATA WA LIKE SPFLI. WA-NO = '34051920'. WA-COMPANY='DELTA'. INSERT SPFLI VALUES WA. 将 ITAB 资料加入 SPFLI中, 也可写成 INSERT SPFLI FROM ITAB.
SPFLI-NO='34299876'. SPFLI-COMPANY='HP'. INSERT SPFLI FROM SPFLI. 将Work Area SPFLI中的资料加入资料库档案 SPFLI中 因Work Area SPFLI的结构与资料档 SPFLI一样, 所以也可 写成 INSERT SPFLI.
1.使用 Primary Key 语法: UPDATE FROM Example: TABLES SPFLI. DATA WA LIKE SPFLI. WA-NO='34051920'. WA-COMPANY='DELTA'. UPDATE SPFLI FROM WA. 如 SPFLI 的 Primary Key是 NO, 则会找到 NO='34051920'的记录, 将其 COMPANY栏位异动为 DELTA
2.使用条件式 语法: UPDATE SET < f1>=… WHERE 根据条件式异动符合条件式的记录 Example: UPDATE SPFLI SET NO ='34051920' COMPANY = 'DELTA' WHERE TEL = '4526107'. *-------------------------------------------------------------------------------------*
1.使用 Primary Key 语法: DELETE FROM Example: TABLES SPFLI. DATA WA LIKE SPFLI. WA-NO='34051920'. WA-COMPANY='DELTA'. DELETE SPFLI FROM WA. 如 SPFLI 的 Primary Key是 NO, 则会找到 NO='34051920'的记录, 找到后将此笔删除
2.使用条件式 语法: DELETE FROM WHERE 根据条件式删除符合条件式的记录 Example: DELETE FROM SPFLI WHERE AREA = 'AMERICAN'.
5. DATABASE CURSOR Database Cursor是一个资料库暂存区, 将经SELECT指令读取的记录存放至此暂存区, 再由此暂存区放至Work Area中, 可减少资料库读取的次数. 1.开启 Database Cursor 语法: OPEN CURSOR FOR SELECT … WHERE Example: TABLES SPFLI. DATA: WA LIKE SPFLI, C1 TYPE CURSOR. OPEN CURSOR C1 FOR SELECT * FROM SPFLI WHERE AREA ='TAIWAN'. 2.读取 Database Cursor的资料存入 Work Area 语法: FETCH NEXT CURSOR INTO Example: FETCH NEXT CURSOR C1 INTO WA. 读取下一笔Cursor位置的资料存入WA, 如果已无资料可读, SY-SUBRC <>0. 关闭 Database Cursor 语法: CLOSE CURSOR Example: CLOSE CURSOR C1.