*-------------------------------------------------------------------------------------*
DATA : COUNTER TYPE P DECIMALS 3.
NAME(10) TYPE C VALUE 'DELTA'.
S_DATE TYPE D VALUE '19991203'.
END OF PERSON.
另外,有关DATA声明的指令还有: CONSTANTS(声明常数)、STATICS(临时变量声明).
CONSTANTS PI TYPE P DECIMALS 5 VALUE '3.14159'.
END OF MYLIST.
DATA LIST TYPE MYLIST.
DATA TRANSCODE LIKE SY-TCODE.
TABLES: SPFL.
SELECT * FROM SPFL.
WRITE: SPFL-MANDT, SPFL-CARRID,SPFL-CONNECTION.
ENDSELECT.
*-------------------------------------------------------------------------------------*
一. WRITE 语句
WRITE: 'USER NAME IS:', SY-UNAME.
二. 指定屏幕输出位置
例如1: WRITE: /10(6) 'ABCDEFGHIJK'.
A(5) TYPE C VALUE 'AB CDE'.
WRITE: / X USING EDIT MASK '__:__:__'.
WRITE: / X USING EDIT MASK '$___,___'.
WRITE: / Y NO-GAP.
WRITE 'The text ------------ appears in the text.'.
WRITE AT POS(LEN) TEXT.
PACK TYPE P DECIMALS 1.
WRITE NUMBER.
WRITE NUMBER TO TEXT EXPONENT 2.
WRITE / TEXT.
WRITE NUMBER TO FLOAT.
WRITE / FLOAT.
WRITE NUMBER TO PACK.
WRITE / PACK.
MOVE NUMBER TO PACK.
WRITE / PACK.
TARGET(10).
...
WRITE (NAME) TO TARGET.
WRITE: TARGET.
DATA: COUNTER TYPE I.
COMPUTE COUNTER = COUNTER + 1.
COUNTER = COUNTER + 1.
ADD 1 TO COUNTER.
四. 显示图示:
WRITE: / 'Phone symbol:', SYM_PHONE AS SYMBOL.
WRITE: / 'Alarm Icon:', ICON_VOICE_OUTPUT AS ICON.
要查看系统所提供有那些符号及图示,可选择'EDIT'下的'Insert Statement',选择'Write',接下来选择要查看的群组,如SYMBOL 或ICON, 接下来按'Display'即可.
*-------------------------------------------------------------------------------------*
一. Internal Table 的声明
ABAP/4中的Internal Table是一种Data Structure,类似于其他语言中的STRUTURE,它可以由几个不同类型的栏位(field)组成,用来表示具有不同属性的某一事物,单独一笔资料表示某个事物,多笔资料表示具有相同属性的多个事物.
DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.
.
DATA: END OF .
DATA: LIKE OCCURS .
exp:
TYPES VECTOR TYPE I OCCURS 10.
TYPES: BEGIN OF LINE,
COLUMN1 TYPE I,
COLUMN2 TYPE I,
COLUMN3 TYPE I,
END OF LINE.
TYPES ITAB TYPE LINE OCCURS 10.
TYPES: BEGIN OF DEEPLINE,
TABLE1 TYPE VECTOR,
TABLE2 TYPE ITAB,
END OF DEEPLINE.
TYPES DEEPTABLE TYPE DEEPLINE OCCURS 10.
本示例创建与上例相同的内表数据类型(VECTOR 和 ITAB)。然后创建数据类型 DEEPLINE 作为字段串,包含这些内表作为组件。通过该字段串,数据类型 DEEPTABLE 被创建为内表。因此该内表的元素本身就是内表。
exp :
TYPES: BEGIN OF LINE,
COLUMN1 TYPE I,
COLUMN2 TYPE I,
COLUMN3 TYPE I,
END OF LINE.
TYPES ITAB TYPE LINE OCCURS 10.
DATA TAB1 TYPE ITAB.
DATA TAB2 LIKE TAB1 WITH HEADER LINE.
同创建内表数据类型(页 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。
*-------------------------------------------------------------------------------------*
1. TYPES type.
2. TYPES type(len).
3. TYPES: BEGIN OF structype ...
END OF structype.
4. TYPES itabtype {TYPE tabkind OF linetype LIKE tabkind OF lineobj}
[WITH [UNIQUE|NON-UNIQUE] keydef] [INITIAL SIZE n].
5. TYPES itabtype TYPE RANGE OF type.
TYPES itabtype LIKE RANGE OF f.
6. TYPES itabtype {TYPE linetype|LIKE lineobj} OCCURS n.
*-------------------------------------------------------------------------------------*
APPEND LINE
格式:APPEND TO
举例一:(使用WORK AREA)
DATA : BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
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)
DATA : BEGIN OF ITAB OCCURS 10,
COL1 TYPE I,
COL2 TYPE I,
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.
exp:
DATA: BEGIN OF ITAB OCCURS 10,
COL1 TYPE C,
COL2 TYPE I,
END OF ITAB.
DO 3 TIMES.
APPEND INITIAL LINE TO ITAB.
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 [FROM ] [TO ] TO .
将的元素加入至中,可选取自至的范围.
APPEND LINES OF ITAB TO JTAB.
COLLECT LINE
COLLECT 指令也是将元素加入Internal table中,与APPEND 的区别是: COLLECT指令在非数值栏位相同的情况下,将数值栏位汇总.
格式: COLLECT [ INTO ]
DATA: BEGIN OF ITAB OCCURS 3,
COL1(3) TYPE C,
COL2 TYPE I,
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.
此时, internal table中放的是2笔数据, 分别为:
ITAB-COL1 ITAB-COL2
'ABC' 90
'XYZ' 20
*-------------------------------------------------------------------------------------*
INSERT LINE
将元素插入在指定的internal table位置之前.
格式: INSERT [ INTO] [INITIAL LINE INTO ] [INDEX ]
或者: INSERT LINES OF [FROM TO ] INTO INDEX
其中: 即work area,工作区中的元素.
[INITIAL LINE INTO] :插入一笔初始化的记录.
: internal table
[INDEX ]: internal table 的记录号.(新加入的元素放在此记录前面)
Example:
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.
DO 3 TIMES.
LINE-COL1 = SY-INDEX *10.
LINE-COL2 = SY-INDEX *20.
APPEND LINE INTO ITAB.
ENDDO.
LINE-COL1=100.
LINE-COL2=200.
INSERT LINE INTO ITAB INDEX 2. "插入在位置2之前
LOOP AT ITAB INTO LINE.
WRITE: / SY-TABIX,LINE-COL1,LINE-COL2. "SY-TABIX为Table位置
ENDLOOP.
执行结果:
1 10 20
2 100 200 "插入的元素
3 20 40
4 30 60
插入另一Internal Table元素
语法:
INSERT LINES OF [FROM TO ] TO INDEX
将的元素插入至中, 位置在 之前, 可选取自至的范围
Example:
APPEND LINES OF ITAB TO JTAB INDEX 3.
将ITAB所有元素插入JTAB中, 位置在第三个元素之前
*-------------------------------------------------------------------------------------*
读取internal table
格式一:
LOOP AT [INTO ][FROM TO ][WHERE ]
ENDLOOP.
Example:
LOOP AT ITAB INTO LINE WHERE COL1 >100.
WRITE: / SY-TABIX,LINE-COL1.
ENDLOOP.
仅读取 COL1 > 100 的元素
格式二:
READ TABLE [INTO ] [INDEX / WITH KEY ]
举例. (格式二)
DATA: BEGIN OF ITAB OCCURS 10,
COL1 TYPE I,
COL2 TYPE I,
END OF ITAB.
DO 10 TIMES.
ITAB-COL1 = SY-INDEX.
ITAB-COL2 = SY-INDEX * 2.
APPEND ITAB.
ENDDO.
READ TABLE ITAB INDEX 3.
(或者: READ TABLE ITAB WITH KEY COL1 = 3.)
WRITE: / 'ITAB-COL1 = ', ITAB-COL1, 'ITAB-COL2 = ', ITAB-COL2.
执行结果同样是:
ITAB-COL1 = 3
ITAB-COL2 = 6.
Example:
READ TABLE ITAB INTO LINE INDEX 5
读取 ITAB的第5个元素资料, 放入 LINE的栏位中
根据栏位内容寻找
语法:
READ TABLE INTO
Example:
ITAB-COL1 = 'ABC'.
READ TABLE ITAB INTO LINE.
找出ITAB 中 COL1 栏位内容是 ABC 的元素, 找到的值放入 LINE 中
若找到 SY-SUBRC传回0, 找不到则传回 4, 必须声明有 work area
*-------------------------------------------------------------------------------------*
修改internal table 中的值
格式: MODIFY [FROM ][INDEX ][TRANSPORTING …][WHERE ]
举例一. READ TABLE ITAB INDEX 3.
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中的栏位
格式: DELETE INDEX .
或: DELETE [FROM TO ] [WHERE ]
Internal table 排序
SORT [][BY …]
其中: 有DESCENDING 和ASCENDING, Default 为ASCENDING.
: 为指定排序的栏位.
Example:
SORT ITAB DESCENDING BY COL2.
将 ITAB 根据 COL2栏位递减排序
*-------------------------------------------------------------------------------------*
确定内表属性
如果在处理过程中想知道内表一共包含多少行,或者想知道定义的 OCCURS 参数的大小,请使用 DESCRIBE 语句,用法如下:
语法
DESCRIBE TABLE [LINES ] [OCCURS ].
如果使用 LINES 参数,则将填充行的数量写入变量 。如果使用 OCCURS 参数,则将行的初始号写入变量 。
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.
DATA: LIN TYPE I, OCC TYPE I.
DESCRIBE TABLE ITAB LINES LIN OCCURS OCC.
WRITE: / LIN, OCC.
DO 1000 TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
DESCRIBE TABLE ITAB LINES LIN OCCURS OCC.
WRITE: / LIN, OCC.
其输出为:
0 10
1.000 10
在此创建内表 ITAB。在填充表格前后执行 DESCRIBE 语句。更改当前行号,但无法更改初始行号。
*-------------------------------------------------------------------------------------*
加总
SUM.
总和计算存放与work area中,但只能在LOOP 中使用.
例: LOOP AT ITAB INTO LINE.
SUM.
ENDLOOP.
WRITE: / LINE-COL1, LINE-COL2.
LINE-COL1 和 LINE-COL2 存数值总和初始化internal table
REFRESH . 清空中的值.使用在没有 HEADER LINE 的 Internal Table中, 清除所有元素
CLEAR . 清空的Header Line.使用在有 HEADER LINE 的 Internal Table中, 清除所有元素
FREE . 释放内存空间.释放(Release) Internal Table所占的内存空间, 用在 REFRESH和 CLEAR指令之后
将值重置为 默认值
可以用 CLEAR 语句重置任何数据对象值,如下所示:
语法
CLEAR .
exp:
DATA NUMBER TYPE I VALUE '10'.
WRITE NUMBER.
CLEAR NUMBER.
WRITE / NUMBER.
输出为:
10
0
CLEAR 语句将字段 NUMBER 的内容从10 重置为默认值 0。
*-------------------------------------------------------------------------------------*
添加字段顺序并将结果赋给另一个字段
语法
ADD THEN UNTIL GIVING .
如果 、 、 ... 、 是在内存中相同类型和长度的等距字段序列,则进行求和计算并将结果赋给
添加字段顺序并将结果添加到另一个字段的内容中
语法
ADD THEN UNTIL TO .
该语句除了将字段总和添加到 的旧内容中之外,与上面语句的工作方式相同 。
有关其它相似变体的信息,参见有关 ADD 语句的关键字文档。
DATA: BEGIN OF SERIES,
N1 TYPE I VALUE 10,
N2 TYPE I VALUE 20,
N3 TYPE I VALUE 30,
N4 TYPE I VALUE 40,
N5 TYPE I VALUE 50,
N6 TYPE I VALUE 60,
END OF SERIES.
DATA SUM TYPE I.
ADD SERIES-N1 THEN SERIES-N2 UNTIL SERIES-N5 GIVING SUM.
WRITE SUM.
ADD SERIES-N2 THEN SERIES-N3 UNTIL SERIES-N6 TO SUM.
WRITE / SUM.
输出如下:
150
350
在此,将 N1 到 N5 组件内容求和并将其值赋给字段 SUM。然后,将 N2 到 N6 组件求和并将其添加到 SUM 的值中。
*-------------------------------------------------------------------------------------*
屏幕输入命令
在ABAP/4中要从屏幕输入变量, 使用的命令是 PARAMETERS 及SELECTION-OPTIONS:
1. PARAMETER: 输入一个变量或栏位内容
2. SELECTION-OPTIONS: 使用条件筛选画面来输入数据
PARAMETERS 指令
基本的输入命令, 类似如BASIC的INPUT命令, 但无法使用F格式(浮点数)
语法:
PARAMETERS
[DEFAULT ] [LOWER CASE]
[OBLIGATORY] [AS CHECKBOX]
[RADIOBUTTON GROUP ]
Example:
PARAMETERS: NAME(8),
AGE TYPE I,
BIRTH TYPE D.
执行结果:
在日期的输入格式上为 MM/DD/YY , MM/DD/YYYY, MMDDYY或MMDDYYYY , 如输入 020165 表 1965年02月01日, 与02/01/65的输入是一样的, 日期输入范围为西元1950年至2049年
1. DEFAULT
设定输入的预设值
Example:
PARAMETERS: COMPANY(20) DEFAULT 'DELTA',
BIRTH TYPE D DEFAULT '19650201'.
2. LOWER CASE
ABAP/4预设是将字串输入值自动转换为大写, 加上此参数会将输入的资料转成小写,
3. OBLIGATORY
强制要求输入, 屏幕上会出现一个 ? , 使用者必须要输入才可.
4. AS CHECKBOX
输入 CHECKBOX的格式
Example:
PARAMETERS: TAX AS CHECKBOX DEFAULT 'X',
NTD AS CHECKBOX.
执行结果:
5. RADIOBUTTON GROUP
输入 RADIO BUTTON GROUP 的方式
Example:
PARAMETERS: BOY RADIOBUTTON GROUP SEX DEFAULT 'X',
GIRL RADIOBUTTON GROUP SEX.
exp :
TABLES SPLFI.
PARAMETERS: LOW LIKE SPFLI-CARRID,
HIGH LIKE SPFLI-CARRID.
SELECT * FROM SPLFI WHERE CARRID BETWEEN LOW AND HIGH.
........
ENDSELECT.
*-------------------------------------------------------------------------------------*
SELECTION-OPTIONS
SELECTION-OPTIONS所输入的值实际上是放在internal table中的,该Internal table 有四个栏位,分别是:SIGN,OPTION,LOW,HIGH.. 条件筛选检查条件输入画面指令, 输入条件后可配合SELECT指令自TABLE读取符合条件的资料, 直接执行或放入 Internal Table中, 条件有四个参数:
1. SIGN:
I: 表筛选条件符合的资料
E: 表筛选条件不符合的资料
2. OPTION: 比较的条件符号
EQ(等于),NE(不等于),GT(大于),LE(小于),CP(包含),NP(不包含)
3. LOW: 最小值
4. HIGH: 最大值
语法:
SELECTION-OPTIONS FOR
Example:
TABLES SPFLI.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
将条件的输入值存放入 AIRLINE, 筛选选择为SPFLI中的CONNID栏位
改变条件输入格式
1. DEFAULT TO
设定开始结束范围输入预设值
Example:
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID DEFAULT '2042' TO '4555'.
2. NO-EXTENSION
设定不要Multi-Option输入画面
3. NO INTERVALS
设定不要区间范围输入画面
4. LOWER CASE
输入转换成大写
5. OBLIGATORY
强制要求输入
*-------------------------------------------------------------------------------------*
配合 SELECT 命令
条件输入完后要将符合条件的资料筛选出来, 可配合使用 SELECT 指令
1.使用WHERE <条件式>
Example:
TABLES SPFLI.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI WHERE CONNID IN AIRLINE.
WRITE: / SPFLI-CONNID,SPFLI-CITYFROM,SPFLI-CITYTO.
ENDSELECT.
2.使用CHECK参数
Example:
TABLES SPFLI.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI.
CHECK AIRLINE.
WRITE: / SPFLI-CONNID,SPFLI-CITYFROM,SPFLI-CITYTO.
ENDSELECT.
*
exp:
TABLES SPFLI.
SELECT-OPTIONS: S_CARRID FOR SPFLI-CARRID,
S_CITYFR FOR SPFLI-CITYFROM,
S_CITYTO FOR SPFLI-CITYTO,
S_CONNID FOR SPFLI-CONNID.
SELECT * FROM SPFLI.
CHECK: SPFLI-CARRID IN S_CARRID,
SPFLI-CITYFR IN S_CITYFR,
SPFLI-CITYTO IN S_CITYTO,
SPFLI-CONNID IN S_CONNID.
WRITE: / SPFLI-CARRID, SPFLI-CONNID,
SPFLI-CITYFROM, SPFLI-CITYTO.
ENDSELECT.
3.使用 IF … IN 关键字
Example:
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
SELECT * FROM SPFLI.
IF SPFLI-CONNID IN AIRLINE.
WRITE: / SPFLI-CONNID,SPFLI-CITYFROM,SPFLI-CITYTO.
ENDIF.
ENDSELECT.
*-------------------------------------------------------------------------------------*
SELECTION-SCREEN
1.产生空白列
语法:
SELECTION-SCREEN SKIP []
Example:
SELECTION-SCREEN SKIP 2.
产生两列空白列
2.产生底线
语法:
SELECTION-SCREEN ULINE / (length)
Example:
SELECTION-SCREEN ULINE /10(30).
自第10格开始产生长度30的底线
3.印出备注说明
语法:
SELECTION-SCREEN COMMENT / (length)
Example:
REMARK = 'Pls enter your name'.
SELECTION-SCREEN COMMENT /10(30) REMARK.
4. 同一列中输入数个资料项
语法:
SELECTION-SCREEN BEGIN OF LINE.
……
SELECTION-SCREEN END OF LINE.
Example:
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.
在20格输入NAME内容, 40格输入 BIRTH的内容
5. 绘出BLOCK PANEL
语法:
SELECTION-SCREEN BEGIN OF BLOCK
[WITH FRAME [TITLE
].
…….
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
SELECT语句 语法格式: SELECT [INTO ] [FROM ] [WHERE ] [GROUP BY ] [ORDER BY ] 其中: 指定要抓取的栏位 将读取的记录存放在work area中 指定从那个TABLE中读取资料 抓取资料的条件 指定按那些栏位分组 排序的栏位及方式 相关的系统变量: SY-SUBRC = 0 表示读取数据成功 <> 0 表示未找到符合条件的记录 SY-DBLNT: 被处理过的记录的笔数. 相关的命令: EXIT. 退出循环. CHECK .如果逻辑表达式成立,则继续执行,否则,开始下一次循环。 利用循环方式读取所有记录 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.
2.自 Internal Table 语法: INSERT FROM TABLE [ACCEPTING DUPLICATE KEY] 将 中非 NULL的资料加入 中, 加上 [ACCEPTING DUPLICATE KEY]能检查不加入有重覆primary key, 若有重覆则 SY-SUBRC 会传回 4 Example: TABLES SPFLI. DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE. ITAB-NO = '34051920'. ITAB-COMPANY = 'DELTA'. APPEND ITAB. …. INSERT SPFLI FROM TABLE ITAB ACCEPTING DUPLICATE KEY. *-------------------------------------------------------------------------------------*
UPDATE 指令 异动已存在的记录内容
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'. *-------------------------------------------------------------------------------------*
3. MODIFY 语法 MODIFY [FROM ]. 根据 Primary Key 寻找资料档中符合的记录, 若找到则更新异动, 若找不到则新增记录 语法: MODIFY FROM Example: WA-NO='34051920'. WA-COMPANY='DELTA'. MODIFY SPFLI FROM WA. 4. DELETE 语法 DELETE [FROM ]. 或: DELETE [WHERE ] 删除资料档的记录
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.
*-------------------------------------------------------------------------------------*
COMMIT WORK & ROLLBACK WORK 要确定资料成功写入资料库,可使用COMMIT WORK指令,如: COMMIT WORK. 相反的,如果反悔要复原,可使用 ROLLBACK WORK, 可复原在上个COMMIT WORK指令之后的资料, 如: ROLLBACK WORK. *-------------------------------------------------------------------------------------* 使用NATIVE SQL指令 语法格式: EXEC SQL [PERFORMING