读书人

ABAP 根本语法

发布时间: 2012-12-23 11:28:15 作者: rapoo

ABAP 基本语法
数据类型
C :字符串
D :日期型 格式为 YYYYMMDD 例:'1999/12/03'
F : 浮点数 长度为8
I :整数
N :数值组成的字符串 如:011,'302'
P : PACKED数 用于小数点数值 如:12.00542
T : 时间 格式为:HHMMSS 如:'14:03:00'
X : 16进制数 如:'1A03'
*-------------------------------------------------*
变数宣告

DATA <F> [<Length>] <type> [<value>][decimals]
<F> 变数名称
<length><type> 变数类型 及 长度
<value> 初值
<decimals> 小数位数

exp:
DATA : COUNTER TYPE P DECIMALS 3.
NAME(10) TYPE C VALUE 'DELTA'.
S_DATE TYPE D VALUE '19991203'.
exp:
DATA : BEGIN OF PERSON,
NAME(10) TYPE C,
AGE TYPE I,
WEIGHT TYPE DECIMALS 2,
END OF PERSON.
另外,有DATA宣告的指令有: CONSTANTS(宣告常)、STATICS(宣告).
exp:
CONSTANTS PI TYPE P DECIMALS 5 VALUE '3.14159'.
STATICS 述
宣告的在目前的程式中使用, 束後自放
法:
STATICS <c> [<length>] <type> [<value>] [<decimals>]

系用明
系部建了SYSTSTRUCTURE,里面的位存放系,常用的系有:
SY-SUBRC : 系行某指令后,表示行成功与否的,'0' 表示成功
SY-UNAME: 前使用者登入SAP的USERNAME;
SY-DATUM: 前系日期;
SY-UZEIT: 前系;
SY-TCODE: 前行程式的Transaction code
SY-INDEX : 前LOOP循的次
SY-TABIX: 前理的是internal table 的第几
SY-TMAXL: Internal table的
SY-SROWS: 屏幕行;
SY-SCOLS: 屏幕列;
SY-MANDT: CLIENT NUMBER
SY-VLINE:
SY-ULINE:

TYPE 述
用指定料型或宣告自定料型
Example:
TYPES: BEGIN OF MYLIST,
NAME(10) TYPE C,
NUMBER TYPE I,
END OF MYLIST.
DATA LIST TYPE MYLIST.

LIKE 述
跟TYPE述使用格式相同, 如
DATA TRANSCODE LIKE SY-TCODE.
不同的是 LIKE 用在已有值的料, 如系, 而TYPE述是用
在指定料型。

*-------------------------------------------------*
输出

一. WRITE 句
ABAP/4用在屏幕上出料的指令是WRITE指令,例如:
WRITE: 'USER NAME IS:', SY-UNAME.
二. 指定屏幕出位置
指定出位置的句格式:
WRITE: [AT] [ / ] [<pos>] [(<len>)] 料 [<par>]
其中: / : 在下一行出
<pos>: 指定出的行;
(<len>):指定出位(度)
<par>: 指定示格式,有:
LEFT-JUSTIFIED 料靠左
CENTERED 料靠中
RIGHT-JUSTIFIED 料靠右
UNDER <g> 正在料<g>的下面示
NO-GAP 接著示,不留空格
USING EDIT MASK <m>: 使用嵌子元示, 如 12:03:20
USING NO EDIT MASK: 不使用嵌子元
NO-ZERO: 字前面 0 的部分不示
NO-SIGN: 不示正
DECIMALS <d>: 示 <d> 位小
EXPOENT <e>: F(浮)指的值
ROUND <r>: 四舍五入至小后<r>位
CURRENCY <c>: 示
DD/MM/YY : 日期示格式
MM/DD/YY:
YY/MM/DD:
YY/DD/MM
MM/DD/YYYY:
DD/MM/YYYY
YYYY/MM/DD:
YYYY/DD/MM:
例如1: WRITE: /10(6) 'ABCDEFGHIJK'.
出果: ABCDEF
例如2: DATA: X TYPE I VALUE '11:20:30',
A(5) TYPE C VALUE 'AB CDE'.
WRITE: / X USING EDIT MASK '__:__:__'.
WRITE: / X USING EDIT MASK '$___,___'.
WRITE: / Y NO-GAP.
出果:
11:20:30
$112,030
ABCDEF

例如3: DATA: LEN TYPE I VALUE 10,
POS TYPE I VALUE 11,
TEXT(10) VALUE '1234567890'
WRITE 'The text ------------ appears in the text.'.
WRITE AT POS(LEN) TEXT.

WRITE TO 语句的基本 形式
要将值(文 字)或源字 段内容写入 目标字段, 可以使用 WRITE TO 语句:
语法
WRITE <F1> TO <F2> [<option>].

DATA: NUMBER TYPE F VALUE '4.3',
TEXT(10),
FLOAT TYPE F,
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.

exp:
DATA: NAME(10) VALUE 'SOURCE',
SOURCE(10) VALUE 'Antony',
TARGET(10).
...
WRITE (NAME) TO TARGET.
WRITE: TARGET.

exp :

DATA: COUNTER TYPE I.
COMPUTE COUNTER = COUNTER + 1.
COUNTER = COUNTER + 1.
ADD 1 TO COUNTER.
在此,三条 运算语句进 行相同算术 运算

输出屏幕上 的线和空行

用下列语法 ,可以在输 出屏幕上生成水平线:
语法
ULINE [AT [/][<pos>][(<len>)]].
它等同于
WRITE [AT [/][<pos>][(<len>)]] SY-ULINE.
AT 后的格式规 范,与在 在屏幕上定 位 WRITE 输出 (页 28) 中为 WRITE 语句说明的 格式规范完全一样。
如果没有格 式规范,系 统则开始新 的一行,并 用水平线填 充该行。否 则,只按指 定输出水平 线。
生成水平线 的另一种方 法,是在 WRITE 语句中键入 恰当数量的 连字符,如 下所示:
WRITE [AT [/][<pos>][(<len>)]] '-----...'.
垂直线
用下列语法 ,可以在输 出屏幕上生 成垂直线:
语法
WRITE [AT [/][<pos>]] SY-VLINE.

WRITE [AT [/][<pos>]] '|'.
空行
用下列语法 ,可以在输 出屏幕上生 成空行:
语法
SKIP [<n>].
该语句从当 前行开始, 在输出屏幕 上生成 <n> 个空行。如 果没有指定 <n> 的值,就输 出一个空行 。
要将输出定 位在屏幕的 指定行上, 请使用:
语法
SKIP TO LINE <n>.
该语句允许 将输出位置 向上或向下 移动。

四. 示示:
法: WRITE: <symbol-name> AS SYMBOL.
WRITE: <icon-name> AS ICON.
例如: INCLUDE <SYMBOL>.
INCLUDE <ICON>.
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)成,用表示具有不同性的某一事物,一料表示某事物,多料表示具有相同性的多事物.

Internal table 的定有以下几种格式:
格式一. DATA: BEGIN OF <internal table> OCCURS <n>,
<field 1> TYPE <type1>,
[<field 2> TYPE <type 2>,
<field 3> TYPE <type 3>,
… ]
END OF <internal table>.
法:
DATA <f> <type> OCCURS <n> [WITH HEADER LINE]
Example:
DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.

格式二. TYPES: BEGIN OF <work area>,
<field 1> TYPE <type1>,
[<field 2> TYPE <type 2>,
<field 3> TYPE <type 3>,
… ]
END OF <work area>.
TYPES <internal table> TYPE <work area> OCCURS <n>.

格式三. DATA: BEGIN OF <work area>.
INCLUDE STRUCTURE <table name>.
DATA: END OF <work area>.
DATA: <internal table> LIKE <work area> OCCURS <n>.

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 <work area> TO <internal table>

举例一:(使用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 <itab1> [FROM <n1> ] [TO <n2>] TO <itab2>.
<itab1>的元素加入至<itab2>中,可取自<n1>至<n2>的范.
APPEND LINES OF ITAB TO JTAB.

COLLECT LINE
COLLECT 指令也是元素加入Internal table中,与APPEND 的是: COLLECT指令在非值位相同的情下,值位.
格式: COLLECT [<work area> INTO ] <itab>
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 [<wa> INTO] [INITIAL LINE INTO ] <itab> [INDEX <idx>]
或者: INSERT LINES OF <itab1> [FROM <n1> TO <n2>] INTO <itab2> INDEX <idx>
其中: <wa>即work area,工作中的元素.
[INITIAL LINE INTO] :插入一初始化的.
<itab>: internal table
[INDEX <idx>]: 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-TABIXTable位置
ENDLOOP.
行果:
1 10 20
2 100 200 "插入的元素
3 20 40
4 30 60

插入另一Internal Table元素
法:
INSERT LINES OF <itab1> [FROM <n1> TO <n2>] TO <itab2> INDEX <idx>
<itab1>的元素插入至<itab2>中, 位置在 <idx>之前, 可取自<n1>至<n2>的
Example:
APPEND LINES OF ITAB TO JTAB INDEX 3.
ITAB所有元素插入JTAB中, 位置在第三元素之前
*-------------------------------------------------*
取internal table
格式一:
LOOP AT <itab> [INTO <wa>][FROM <n1> TO <n2>][WHERE <conditions>]
<statement>
ENDLOOP.

Example:
LOOP AT ITAB INTO LINE WHERE COL1 >100.
WRITE: / SY-TABIX,LINE-COL1.
ENDLOOP.
取 COL1 > 100 的元素

格式二:
READ TABLE <itab> [INTO <wa>] [INDEX <idx> / WITH KEY <conditions>]
例. (格式二)
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 <itab> INTO <wa>
Example:
ITAB-COL1 = 'ABC'.
READ TABLE ITAB INTO LINE.
找出ITAB 中 COL1 位容是 ABC 的元素, 找到的值放入 LINE 中
若找到 SY-SUBRC回0, 找不到回 4, <itab>必宣告有 work area
*-------------------------------------------------*

修改internal table 中的值
格式: MODIFY <itab> [FROM <wa>][INDEX <idx>][TRANSPORTING <f1><f2>…][WHERE <conditions>]
例一. 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 <itab> INDEX <idx>.
或: DELETE <itab>[FROM <n1> TO <n2>] [WHERE <conditions>]

Internal table 排序
SORT <itab> [<order way>][BY <f1><f2>…]
其中:<order way> 有DESCENDING 和ASCENDING, Default ASCENDING.
<f1>: 指定排序的位.
Example:
SORT ITAB DESCENDING BY COL2.
ITAB 根 COL2位排序
*-------------------------------------------------*
确定内表属 性
如果在处理 过程中想知 道内表一共 包含多少行 ,或者想知 道定义的 OCCURS 参数的大小 ,请使用 DESCRIBE 语句,用法如下:
语法
DESCRIBE TABLE <itab> [LINES <lin>] [OCCURS <occ>].
如果使用 LINES 参数,则将 填充行的数 量写入变量 <lin>。如果使用 OCCURS 参数,则将 行的初始号 写入变量 <occ>。

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 <itab>. 清空<itab>中的值.使用在有 HEADER LINE 的 Internal Table中, 清除所有元素
CLEAR <itab>. 清空<itab>的Header Line.使用在有 HEADER LINE 的 Internal Table中, 清除所有元素
FREE <itab>. 放体空.放(Release) Internal Table所的空, 用在 REFRESH和 CLEAR指令之後

将值重置为 默认值

可以用 CLEAR 语句重置任 何数据对象值,如下所 示:
语法
CLEAR <f>.

exp:
DATA NUMBER TYPE I VALUE '10'.
WRITE NUMBER.
CLEAR NUMBER.
WRITE / NUMBER.
输出为:
10
0
CLEAR 语句将字段 NUMBER 的内容从10 重置为默认 值 0。
*-------------------------------------------------*

添加字段 顺序并将结 果赋给另一 个字段
语法
ADD <n1> THEN <n2> UNTIL <nz> GIVING <m>.
如果 <n1>、 <n2>、 ... 、 <nz> 是在内存中 相同类型和 长度的等距 字段序列, 则进行求和计算并将结 果赋给 <m>
添加字段 顺序并将结 果添加到另 一个字段的 内容中
语法
ADD <n1> THEN <n2> UNTIL <nz> TO <m>.
该语句除了 将字段总和 添加到 <m> 的旧内容中 之外,与上 面语句的工作方式相同 。
有关其它相 似变体的信 息,参见有 关 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 <p> [DEFAULT <f>] [LOWER CASE]
[OBLIGATORY] [AS CHECKBOX]
[RADIOBUTTON GROUP <rad>]
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 <rad>
入 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 <check-option> FOR <table-field>
Example:
TABLES SPFLI.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
件的入值存放入 AIRLINE, SPFLI中的CONNID位

改件入格式
1. DEFAULT <begin> TO <end>
定始束入值
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 [<n>]
Example:
SELECTION-SCREEN SKIP 2.
生列空白列
2.生底
法:
SELECTION-SCREEN ULINE / <pos>(length)
Example:
SELECTION-SCREEN ULINE /10(30).
自第10格始生度30的底
3.印出明
法:
SELECTION-SCREEN COMMENT / <pos>(length) <name>
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 <block>
[WITH FRAME [TITLE <title>].
…….
SELECTION-SCREEN END OF BLOCK <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 <result> [INTO <target>] [FROM <source>] [WHERE <condition>]
[GROUP BY <fields>] [ORDER BY <sort order>]
其中: <result>指定要抓取的位
<target>取的存放在work area中
<source>指定那TABLE中取料
<condition>抓取料的件
<fields>指定按那些位分
<sort order>排序的位及方式
相的系量:
SY-SUBRC = 0 表示取据成功
<> 0 表示未找到符合件的
SY-DBLNT: 被理的的.
相的命令:
EXIT. 退出循.
CHECK <logistic statement>.如果表式成立,行,否,
始下一次循.

利用循方式取所有
SELECT ….ENDSELECT.是循方式取的.
例如:
TABLES MARD.
SELECT [DISTINCT] * FROM MARD WHERE MATNR = '3520421700'.
<Statements>.
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 <work area>
... INTO CORRESPONDING FIELDS OF <work area>
... INTO (f1, ..., fn) 量.
... INTO TABLE <internal table>
... INTO CORRESPONDING FIELDS OF TABLE <internal table>
... APPENDING TABLE <internal table>
... APPENDING CORRESPONDING FIELDS OF TABLE <internal 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'.
<Statements>.
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 <itab>
Example:
TABLES SPFLI.
DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE.
SELECT * FROM SPFLI INTO ITAB.
一次10(Initial Table的度)存入 ITAB 中

SELECT .. INTO TABLE <itab> PACKAGE SIZE <n>
一次取 <n> 至 <itab>中
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 <g1> AND <g2>
例如: WHERE YEAR BETWEEN 1995 AND 2000.
(2) LIKE <g>
例如: WHERE NAME LIKE 'MIKE%'.
('%'是通配符)
(3) IN (<g1>…<gn>)
是<g1>…<gn>里面的任意一值即可.
例如: WHERE PLANT IN ('CHUNGLI', 'TAOYUAN','LIUTU').
(表示PLANT 只要是'CHUNGLI'或'TAOYUAN'或'LIUTU'都可以).
(4) ORDER BY 述
指定排序的位或序
(1). ..ORDER BY PRIMARY KEY.
根 PRIMARY KEY 增排序
(2)…ORDER BY <f1> [DESCENDING] <f2> [DESCENDING]
Example:
SELECT * FROM IM ORDER BY PART .
*-------------------------------------------------*

INSERT 句
◆work area 加入到Internal Table中
格式: INSERT INTO <database> VALUES <work area>
例如:
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 <internal table>
例如:
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 <itab1> FROM TABLE <itab2> [ACCEPTING DUPLICATE KEY]
<itab2>中非NULL的料加入<itab1>中,加上[ACCEPTING DUPLICATE KEY]能限制相同PRIMARY KEY不重复加入.

加入一至料

1.自 Work Area 工作
法:
INSERT INTO <database> VALUES <wa>
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 <database> FROM TABLE <itab> [ACCEPTING DUPLICATE KEY]
<itab>中非 NULL的料加入 <database>中, 加上 [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 <database> FROM <wa>
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 <database> SET < f1>=<values>… WHERE <condition>
根件式符合件式的
Example:
UPDATE SPFLI SET NO='34051920'
COMPANY = 'DELTA'
WHERE TEL='4526107'.
*-------------------------------------------------*

3. MODIFY 法
MODIFY <internal table> [FROM <work area>].
根 Primary Key 找料中符合的, 若找到更新, 若找不到新增
法:
MODIFY <database> FROM <wa>
Example:
WA-NO='34051920'.
WA-COMPANY='DELTA'.
MODIFY SPFLI FROM WA.

4. DELETE 法
DELETE <internal table> [FROM <work area>].
或: DELETE <internal table> [WHERE <conditions>]
除料的

1.使用 Primary Key
法:
DELETE <database> FROM <wa>
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 <database> WHERE <condition>
根件式除符合件式的
Example:
DELETE FROM SPFLI WHERE AREA = 'AMERICAN'.

*-------------------------------------------------*

5. DATABASE CURSOR
Database Cursor是一料存, SELECT指令取的存放至此存, 再由此存放至Work Area中, 可少料取的次.
1. Database Cursor
法:
OPEN CURSOR <c> FOR SELECT … WHERE <condition>
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 <c> INTO <wa>
Example:
FETCH NEXT CURSOR C1 INTO WA.
取下一Cursor位置的料存入WA, 如果已料可, SY-SUBRC <>0.
Database Cursor
法:
CLOSE CURSOR <c>
Example:
CLOSE CURSOR C1.

*-------------------------------------------------*

COMMIT WORK & ROLLBACK WORK
要定料成功入料,可使用COMMIT WORK指令,如:
COMMIT WORK.
相反的, 如果反悔要原, 可使用 ROLLBACK WORK, 可原在上COMMIT WORK指令之後的料, 如:
ROLLBACK WORK.
*-------------------------------------------------*
使用NATIVE SQL指令
法格式:
EXEC SQL [PERFORMING <form>].
<statements>
ENDEXEC.
例一.
EXEC SQL.
CREATE TABLE AVERI_CLNT (
CLIENT CHAR(3) NOT NULL,
ARG1 CHAR(3) NOT NULL,
ARG2 CHAR(3) NOT NULL,
FUNCTION CHAR(10) NOT NULL,
PRIMARY KEY (CLIENT, ARG1, ARG2)
)
ENDEXEC.
例二.
DATA: F1(3), F2(3), F3(3).
F3 = ' 1 '
EXEC SQL.
SELECT CLIENT, ARG1 INTO :F1, :F2 FROM AVERI_CLNT
WHERE ARG2 = :F3
ENDEXEC

PERFORMING <form name>的使用:
如果NATIVE SQL的SELECT命令行果是抓到多,我想要逐理,就用PERFORMING ,FORM能被逐次用.如果想中止用,就用EXIT FORM SQL束用.
例如:
DATA: F1(3), F2(3), F3(3).

F3 = '010'
EXEC SQL PERFORMING WRITE_AVERI_CLNT.
SELECT CLIENT, ARG1 INTO :F1, :F2 FROM AVERI_CLNT
WHERE ARG2 = :F3
ENDEXEC.
FORM WRITE_AVERI_CLNT.
WRITE: / F1, F2.
ENDFORM.

DATA: BEGIN OF WA,
NAME(8),
AGE TYPE I,
END OF WA.
DATA F1 TYPE I.
FI = 20.
EXEC SQL PERFORMING OUTPUT.
SELECT NAME,AGE INTO :WA FROM NAME_TABLE
WHERE AGE >= :F1.
ENDEXEC..
FORM OUTPUT.
WRITE: / WA-NAME,WA-AGE.
ENDFORM.

注意:
a. NATIVE SQL把TABLE中的MANDT(client)位作一般位使用,所以在抓取料必指定特定的Client;
b. NATIVE SQL中的SELECT句有CHECK限的功能;
c. 在登入SAP R/3系,我已自与Database接,所以在行NATIVE
SQL并不需要CONNECT句;
d. 一NATIVE SQL句可以以分;束,一般情下是以句.束.
e. 某些据系TABLE名字和FIELD名字有大小,要正确.
f. 在NATIVE SQL中,引"不表示注.
*-------------------------------------------------*

结果语句

件述
1. IF 述
法:
IF <Condition1>.
<Statement 1 >
ELSEIF <Condition2>.
<Statement 2>
ELSEIF <Condition3>.
<Stetement 3>
…..
ELSE.
<else Statement >
ENDIF.
(1).在每判述之後要加上 .
(2).在巢迥圈之中法使用 ELSE 述, ELSE 述 IF 述
Example:
IF 3 > 8.
WRITE / '3 is less than 8'.
ENDIF.

2. CASE 述
法:
CASE <f>.
WHEN <Value1>.
<Statement1>
WHEN <Value2>.
<Statement2>
….
WHEN OTHERS.
<others Statement>
ENDCASE.
Example:
S = 'A'.
CASE S.
WHEN 'X'.
WRITE / 'String is X'.
WHEN OTHERS.
WRITE / 'String is not X'.
ENDCASE.

迥圈述
1.次迥圈
法:
DO [n TIMES] [VARYING <f> FROM <start> TO <end>.
<loop block>
ENDDO.
Example:
DO 2 TIMES.
WRITE / 'X'.
ENDDO.
行果:
X
X
DO VARYING I FROM 1 TO 10.
S = S + I.
ENDDO.
WRITE: / ,'1+2+3+…+10=',S
行果: 1+2+3+…+10=55
2.件迥圈
法:
WHILE <Condition>.
<Statement Block>
ENDWHILE
Example:
I = 1.
S=0.
WHILE I <= 10.
S = S+I.
I=I+1.
ENDWHILE.
WRITE: / ' 1+2+3+…+10=',S.
行果: 1+2+3+…+10=55

迥圈控制述
1. CONTINUE
跳至迥圈的下一次
Example:
DO 3 TIMES.
IF SY-INDEX = 2.
CONTINUE.
WRITE / SY-INDEX.
ENDDO.
行果:
1
3
2. CHECK <Condition>
CHECK 之後件成立才往下行迥圈
Example:
DO 5 TIMES.
CHECK SY-INDEX BETWEEN 2 AND 4.
WRITE / SY-INDEX.
ENDDO.
行果:
2
3
4
3. EXIT
跳迥圈述
Example:
DO 10 TIMES.
IF SY-INDEX = 4.
EXIT.
ENDIF
WRITE / SY-INDEX.
ENDDO.
行果:
1
2
3

迥圈
DO .
<Statement Block>
ENDDO.
迥圈必配合 EXIT 述行
*-------------------------------------------------*

搜索字符串

要搜索特定 模式的字符 串,请使用 SEARCH 语句,用法 如下:
语法
SEARCH <c> FOR <str> <options>.
该语句在字 段 <c> 中搜索<str> 中的字符串 。如果成功 ,则将 SY-SUBRC 的返回代码 值设置为0并 将 SY-FDPOS 设置为字段 <c> 中该字符串 的偏移量。 否则将 SY-SUBRC 设置为4。
搜索串 <str> 可为下列格 式之一:
<str> 目 的
<pattern> 搜 索 <pattern>( 任何字符顺 序)。忽略 尾部空格。
.<pattern>. 搜 索 <pattern> ,但是不忽 略尾部空格 。
*<pattern> 搜 索以 <pattern> 结尾的词。
<pattern>* 搜 索以 <pattern> 开始的词。
单词之间用 空格、逗号 、句号、分 号、冒号、 问号、叹号 、括号、斜 杠、加号和 等号等分隔 。

DATA STRING(30) VALUE 'This is a little sentence.'.
WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.
ULINE /1(26).
SEARCH STRING FOR 'X'.
WRITE: / 'X', SY-SUBRC UNDER 'SY-SUBRC',
SY-FDPOS UNDER 'SY-FDPOS'
SEARCH STRING FOR 'itt '.
WRITE: / 'itt ', SY-SUBRC UNDER 'SY-SUBRC',
SY-FDPOS UNDER 'SY-FDPOS'
SEARCH STRING FOR '.e .'.
WRITE: / '.e .', SY-SUBRC UNDER 'SY-SUBRC',
SY-FDPOS UNDER 'SY-FDPOS'.
SEARCH STRING FOR '*e'.
WRITE: / '*e ', SY-SUBRC UNDER 'SY-SUBRC',
SY-FDPOS UNDER 'SY-FDPOS'.
SEARCH STRING FOR 's*'.
WRITE: / 's* ', SY-SUBRC UNDER 'SY-SUBRC',
SY-FDPOS UNDER 'SY-FDPOS'.
该过程的输 出如下:
SEARCHED SY-SUBRC SY-FDPOS
X 4 0
itt 0 11
.e . 0 15
*e 0 10
s* 0 17

搜索字符字 段 <c> 的各种选项(<options>) 如下
ABBREVIATED
在字段 <c> 中搜索包含 <str> 中指定字符 串的单词, 其中字符可 能被其它字 符隔开。单词和字符串 的第一个字 母必须相同 。
STARTING AT <n1>
在字段 <c> 中搜索从 <n1> 开始的 <str> 。结果 SY-FDPOS 参照相对于 <n1> 的偏移量而 不是字段的 开始。
ENDING AT <n2>
在字段 <c> 搜索 <str> 直到位置 <n2>。
AND MARK
如果找到搜 索串,则将 搜索串中的 所有字符( 和使用 ABBREVIATED 时的所有字 符)转换为 大写形式。

DATA: STRING(30) VALUE 'This is a fast first example.',
POS TYPE I,
OFF TYPE I.
WRITE / STRING.
SEARCH STRING FOR 'ft' ABBREVIATED.
WRITE: / 'SY-FDPOS:', SY-FDPOS.
POS = SY-FDPOS + 2.
SEARCH STRING FOR 'ft' ABBREVIATED STARTING AT POS AND MARK.
WRITE / STRING.
WRITE: / 'SY-FDPOS:', SY-FDPOS.
OFF = POS + SY-FDPOS -1.
WRITE: / 'Off:', OFF.
该过程的输 出如下:
This is a fast first example.
SY-FDPOS: 10
This is a fast FIRST example.
SY-FDPOS: 4
Off: 15
请注意,在 找到单词' fast' 之后,为了 查找包含' ft'的第 二个单词, 必须在偏移 量 SY-FDPOS 上加2,然后从位置 POS 开始查找。 否则,会再 次找到单词 'fast' 。要获得' first' 相对于字段 STRING 开始的偏移量,从 POS 和 SY-FDPOS 计算。
获得字符串 长度

要决定字符 串到最后一 个字符而不 是 SPACE 的长度,请 使用内部函 数 STRLEN, 用法如下:
语法
[COMPUTE] <n> = STRLEN( <c> ).
STRLEN 将操作数 <c> 作为字符数 据类型处理 ,而不考虑其实际类型 。不进行转 换。
关键字 COMPUTE 可选。有关 内部函数的 详细信息, 参见 使用数学函 数 (页 49) 。

DATA: INT TYPE I,
WORD1(20) VALUE '12345'.
WORD2(20).
WORD3(20) VALUE ' 4 '.
INT = STRLEN( WORD1 ). WRITE INT.
INT = STRLEN( WORD2 ). WRITE / INT.
INT = STRLEN( WORD3 ). WRITE / INT.
结果分别是 5,0 和 4。
*-------------------------------------------------*

Standard Report
一典型的表程式是由多的程式(Code Block)所成,在最好能加上一些
明以利程式可性,一典型的表程式格式如下:

* PROGRAM SOURCE HEADER : 明程式名及目的
* Program Name:
* Description:
* Date/Author:
* Table Update:
* Special Logic:
* Include:
*-------------------------------------------------*
* MODIFICATION LOG : 程式修改更新
*-------------------------------------------------*
* ChangeDate Programmer Request Description
*-------------------------------------------------*
* NEW PROGRAM
*-------------------------------------------------*
* REPORT NAME : 宣告程式名及表格式,
*-------------------------------------------------*
REPORT Z_____
NO STANDARD PAGE HEADING
MESSAGE-ID __ " 所使用的MESSAGE
LINE-COUNT ___ " 每表列
LINE-SIZE ___. " 每表度

* TABLE DESCRIPTION : 宣告程式使用的TABLE

*-------------------------------------------------*
TABLES:

* DATA : 宣告程式所使用的及自定型
*-------------------------------------------------*
TYPES:

DATA:

* SELECTION SCREEN / OPTION / PARAMETER : 幕入表件
*-------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK ____
SELECT-OPTIONS:

SELECTION-SCREEN END OF BLOCK ___

* INITIALIZATION : 程式始行, 如SELECT-OPTION及PARAMETER
*-------------------------------------------------*
INITIALIZATION.

INCLUDE ____.

* AT START SELECTION : 入束後的, 如按下<F8>
*-------------------------------------------------*
START-OF-SELECTION.
SET PF-STATUS ____. " 指定表行所用的 GUI-STATUS名

PERFORM READ_DATA.
PERFORM PROCESS_DATA.
PERFORM PRINT_DATA.
PERFORM PRINT_SUMMARY.

* AT USER Commaand : 行在GUI-STATUS中自定的命令
*-------------------------------------------------*
AT USER_COMMAND.

* AT LINE SELECTION : 由在表中按下<F2>或Double-Click
*-------------------------------------------------*
AT LINE-SELECTION.


* TOP OF PGAE : 每始列印行, 用於定表表
*-------------------------------------------------*

* END OF PAGE : 表列印完最後一後
*-------------------------------------------------*
END-OF-PAGE

* END OF SELECTION : 在束列印料後, 如可用印出USER入的件
*-------------------------------------------------*
END-OF-SELECTION.
INCLUDE _____
* FORM : 撰程式中所使用到的副程式
*-------------------------------------------------*
* Read Data : 自TABLE取料放入Internal Table
*-------------------------------------------------*
FORM READ_DATA.
SELECT * FROM ______
INTO _______
WHERE _______.
IF SY-SUBRC = 0.

ENDIF.
APPEND _____. " 增加Internal Table元素
ENDSELECT.

ENDFORM.

* Process Data : 理Internal Table的料, 如排序及
*-------------------------------------------------*
FORM PROCESS_DATA.

ENDFORM.

* Print Data : 依序出 Internal Table的料
*-------------------------------------------------*
FORM PRINT_DATA.

ENDFORM.

* Print Summary : 印出值料加
*-------------------------------------------------*
FORM PRINT_SUMMARY.

ENDFORM.

* Include Program : 列出所含入的其它程式source code, 如副程式
*-------------------------------------------------*
INCLUDE _____
INCLUDE _____

*-------------------------------------------------*
*
REPORT rep.
Additions:
1. ... NO STANDARD PAGE HEADING
2. ... LINE-SIZE col
3. ... LINE-COUNT n(m)
表单输出每页由n行,其中的m行作为页脚;
4. ... MESSAGE-ID mid 消息对象
5. ... DEFINING DATABASE ldb
使用逻辑数据库,自动产生
*
事件块
INITIALIZATION
AT SELECTION-SCREEN
START-OF-SELECTION
GET
END-OF-SELECTION
TOP-OF-PAGE
END-OF-PAGE
*
事件块的简单处理过程:
*
ABAP程序运行的时候,INITIALIZATION首先被调用;
经过初始化的输入屏幕会显示在表示服务器;
用户离开输入屏幕的时候,START-OF-SELCTION事件会被自动调用;
结果数据会以列表的形式显示在第二个屏幕上;
*
源代码中的事件块顺序不影响它们的执行顺序
*
事件块编码规则(1)
INITIALIZATION
通常在此事件块中设定输入屏幕字段的初始值
*
事件块编码规则(2)
AT SELECTION-SCREEN
通常在此事件块中进行用户输入数据的合法性检查,发现错误则以消息的形式给出警示,直到用户输入正确的数值
例如: AT SELECTION-SCREEN .
IF P_DATE = SPACE .
MESSAGE E001 .
ENDIF.
效果:如果字段P_DATE为空,则程序会用消息001“日期字段不能为空!”来提示用户必须输入一个日期。而且输入屏幕会等待用户输入,知道该字段数值合法
*
事件块编码规则(3)
START-OF-SELCTION
通常在此事件中针对业务需求进行系统数据的查询
例如:
start-of-selection .
perform get_data_for_oil .
效果:
在输入屏幕用户按下执行按钮后,子程序get_data_for_oil被执行,在其中获得业务相关的数据存放到内表或者其它变量,这些数据在END-OF-SELECTION事件块中被输出
*
事件块编码规则(4)
END-OF-SELCTION
通常在此事件中进行结果清单的输出
例如:
end-of-selection .
write : 23(1) sy-vline,
24(20) tab-gas_plan right-justified ,
效果:
数据以清单的形式输出
*
事件块编码规则(5)
GET
从逻辑数据库中得到数据(较少用)

TOP-OF-PAGE
在此事件块中设计输出清单的页头
TOP-OF-PAGE
write : /1(240) '汽柴油日出厂情况表' centered .
write : /20(8) '日期:' ,
29(10) s_date ,
180(6) '单位:' ,
190(10) '吨' .
*
事件块编码规则(6)
END-OF-PAGE
在此事件中设定输出清单的页脚
例如:
END-OF-PAGE .
Write : ‘制作人’ , p_name .
*-------------------------------------------------*

*
比较所有的 字段类型

要比较所有 的字段类型 ,可以在逻 辑表达式中使用下列运 算符:

<运算符> 含 义
EQ 等于
= 等于
NE 不 等于
<> 不 等于
>< 不 等于
LT 小 于
< 小于
LE 小 于等于
<= 小 于等于
GT 大 于
> 大于
GE 大 于等于
>= 大 于等于





读书人网 >编程

热点推荐