二. APPEND LINE
举例一. (使用work area)
END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.
DO 2 TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
LOOP AT ITAB INTO LINE.
WRITE: / LINE-COL1, LINE-COL2.
ENDLOOP.
举例二. (不使用work area)
END OF ITAB.
DO 2 TIMES.
ITAB-COL1 = SY-INDEX.
ITAB-COL2 = SY-INDEX ** 2.
APPEND ITAB.
ENDDO.
LOOP AT ITAB.
WRITE: / ITAB-COL1, ITAB-COL2.
ENDLOOP.
执行结果与举例一相同.
举例三. (加入另一个Internal table的元素)
APPEND LINES OF ITAB TO JTAB.
三. COLLECT LINE
COLLECT 指令也是将元素加入Internal table中,与APPEND 的区别是: COLLECT指令在非数值字段相同的情况下,将数值字段汇总.
END OF ITAB.
ITAB-COL1 = ‘ABC’. ITAB-COL2 = 10.
COLLECT ITAB.
ITAB-COL1 = ‘XYZ’. ITAB-COL2 = 20.
COLLECT ITAB.
ITAB-COL1 = ‘ABC’. ITAB-COL2 = 80.
COLLECT ITAB.
四. INSERT LINE
将元素插入在指定的internal table位置之前.
[INITIAL LINE INTO] :插入一笔初始化的记录.
五. 读取internal table
ENDLOOP.
举例. (格式二)
END OF ITAB.
DO 10 TIMES.
ITAB-COL1 = SY-INDEX.
ITAB-COL2 = SY-INDEX * 2.
APPEND ITAB.
ENDDO.
READ TABLE ITAB INDEX 3.
WRITE: / ‘ITAB-COL1 = ‘, ITAB-COL1, ‘ITAB-COL2 = ‘, ITAB-COL2.
ITAB-COL2 = 6.
,..
LINE-COL1 = 29.
MODIFY ITAB FROM LINE TRANSPORTING COL1.
将第三笔记录的COL1字段的值修改为29.
举例二. T_SALARY – salary = 50.
MODIFY T_SALARY TRANSPORTING salary WHERE birthday = ‘1999/12/06’.
六. DELETE internal table中的字段
七. Internal table 排序
八. 加总
九.
SUM.
总和计算存放与work area中,但只能在LOOP 中使用.
例: LOOP AT ITAB INTO LINE.
SUM.
ENDLOOP.
WRITE: / LINE-COL1, LINE-COL2.
十. 初始化internal table
1. PARAMETER: 输入一个变量
2. SELECTION-OPTIONS: 使用条件筛选画面来输入数据
一. PARAMETERS 指令
BIRTH TYPE D.
在日期的输入格式上为 MM/DD/YY , MM/DD/YYYY, MMDDYY或MMDDYYYY , 如输入020165表 1965年02月01日, 与02/01/65的输入是一样的, 日期输入范围为公元1950年至2049年
BIRTH TYPE D DEFAULT ‘19650201’.
2. LOWER CASE
3. OBLIGATORY
强制要求输入, 屏幕上会出现一个 ? , 使用者必须要输入才可.
4. AS CHECKBOX
NTD AS CHECKBOX.
5. RADIOBUTTON GROUP
PARAMETERS: BOY RADIOBUTTON GROUP SEX DEFAULT ‘X’, GIRL RADIOBUTTON GROUP SEX.
二. SELECT-OPTIONS
SELECTION-OPTIONS所输入的值实际上是放在internal table中的,该Internal table 有四个字段,分别是:SIGN,OPTION,LOW,HIGH.. 条件筛选检查条件输入画面指令, 输入条件后可配合SELECT指令自TABLE读取符合条件的数据, 直接执行或放入 Internal Table中, 条件有四个参数:
1. SIGN:
2. OPTION: 比较的条件符号
3. LOW: 最小值
4. HIGH: 最大值
TABLES SPFLI.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
三. 条件输入选择画面
四. 改变条件输入格式
DEFAULT ‘2042’ TO ‘4555’.
五. 配合 SELECT 命令
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI WHERE CONNID IN AIRLINE.
WRITE: / CONNID,FROMCITY,TOCITY.
ENDSELECT.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI.
CHECK AIRLINE.
WRITE: / CONNID,FROMCITY,TOCITY.
ENDSELECT.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI.
IF SPFLI-CONNID IN AIRLINE.
WRITE: / CONNID,FROMCITY,TOCITY.
ENDSELECT.
六. SELECTION-SCREEN
SELECTION-SCREEN SKIP 2.
SELECTION-SCREEN ULINE /10(30).
REMARK = ‘Pls enter your name’.
SELECTION-SCREEN COMMENT /10(30) REMARK.
4. 同一列中输入数个数据项
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 20.
PARAMETERS NAME(10).
SELECTION-SCREEN POSITION 40.
PARAMETERS BIRTH TYPE D.
SELECTION-SCREEN END OF LINE.
5. 绘出BLOCK PANEL
].…….
SELECTION-SCREEN END OF BLOCK .
Example:
SELECTION-SCREEN BEGIN OF BLOCK RADIO WITH FRAME .
PARAMETER R1 RADIOBUTTON GROUP GR1.
PARAMETER R2 RADIOBUTTON GROUP GR1.
PARAMETER R3 RADIOBUTTON GROUP GR1.
SELECTION-SCREEN END OF BLOCK RADIO.
§SQL语法
我们在编写ABAP4程序的时候,经常需要从TABLE中根据某些条件读取数
据,.读取数据最常用的方法就是通过SQL语法实现的.
ABAP/4中可以利用SQL语法创建或读取TABLE,SQL语法分为DDL(DATA DEFINE LANGUAGE)语言和DML(DATA MULTIPULATION LANGUAGE)语言,DDL语言是指数据定义语言,例如CREATE等, DML语言是数据操作语言,例如SELECT, INSERT 等语句. SQL语句有OPEN SQL语句和NATIVE SQL语句. OPEN SQL语句不是标准SQL语句,是ABAP/4语言,利用OPEN SQL语句能在Databases 和 Command 之间产生一个BUFFER,所以它有一个语言转换的过程.
而NATIVE SQL语句则是标准的SQL语句, 它直接针对Databases操作.
一. OPEN SQL
OPEN SQL 语句包含有: SELECT,INSERT,UPDATE,MODIFY,DELETE,OPEN CURSOR, FETCH,CLOSE CURSOR,COMMIT WORK,ROLLBACK WORK等.
1. SELECT语句
语法格式:
SELECT [INTO ] [FROM
其中: 指定要抓取的字段
将读取的记录存放在work area中
抓取资料的条件
指定按那些字段分组
排序的字段及方式
相关的系统变量:
SY-SUBRC = 0 表示读取数据成功
<> 0 表示未找到符合条件的记录
SY-DBLNT: 被处理过的记录的笔数.
相关的命令:
EXIT. 退出循环.
CHECK .如果逻辑表达式成立,则继续执行,否
则,开始下一次循环.
◆.利用循环方式读取所有记录
SELECT ….ENDSELECT.是循环方式读取记录的.
例如:
TABLES MARD.
SELECT [DISTINCT] * FROM MARD WHERE MATNR = ‘3520421700’.
.
ENDSELECT.
(从MARD中抓取所有料号=3520421700的数据)
◆读取一笔数据
SELECT SINGLE * FROM MARD WHERE MATNR = ‘3520421700’.
(从MARA中抓取一笔料号=3520421700的资料)
◆将读取的记录放在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中)
举例二.
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中)。
◆按指定的字段排序
SELECT * FROM SBOOK WHERE CARRID = ‘LH’ AND
CONNID = ‘0400’ AND
FLDATE = ‘19950228’
ORDER BY BOOKID [ASCENDING/DESCENDING].
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’都可以).
2. 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不重复加入.
3.MODIFY 语法
MODIFY [FROM ].
4.DELETE 语法
DELETE [FROM ].
或: DELETE [WHERE ]
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.
6. COMMIT WORK & ROLLBACK WORK
要确定数据成功写入数据库,可使用COMMIT WORK指令,如:
COMMIT WORK.
相反的, 如果反悔要复原, 可使用 ROLLBACK WORK, 可复原在上个COMMIT WORK指令之后的数据, 如:
ROLLBACK WORK.
§使用NATIVE SQL指令
语法格式:
EXEC SQL [PERFORMING