ABAP必备基础语法
Posted 烟埋竹月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABAP必备基础语法相关的知识,希望对你有一定的参考价值。
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 []
[][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 [] []
[]
系統專用變數說明
系統內部專門創建了SYST這個STRUCTURE,里面的欄位存放系統變數,常用的系統變數有:
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] [
/ ] [] [()] 資料項 []
其中: / : 在下一行輸出
: 指定輸出的行號;
():指定輸出位數(長度)
: 指定顯示格式參數,參數有:
LEFT-JUSTIFIED
資料*左對齊
CENTERED 資料*中間對齊
RIGHT-JUSTIFIED
資料*右對齊
UNDER 正對在資料項的下面顯示
NO-GAP 緊接著顯示,不留空格
USING EDIT
MASK : 使用內嵌子元顯示, 如 12:03:20
USING NO EDIT
MASK: 不使用內嵌子元
NO-ZER 數字前面 0 的部分不顯示
NO-SIGN: 不顯示正負號
DECIMALS : 顯示 位小數
EXPOENT : F(浮點數)指數的值
ROUND : 四舍五入至小數點后位
CURRENCY : 幣別顯示
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 TO [].
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
[/][][()]].
它等同于
WRITE [AT
[/][][()]] SY-ULINE.
AT 后的格式规 范,与在 在屏幕上定 位 WRITE 输出 (页 28) 中为 WRITE 语句说明的 格式规范完 全一样。
如果没有格 式规范,系 统则开始新 的一行,并 用水平线填 充该行。否 则,只按指 定输出水平 线。
生成水平线 的另一种方 法,是在 WRITE 语句中键入 恰当数量的 连字符,如 下所示:
WRITE [AT
[/][][()]] ‘-----...‘.
垂直线
用下列语法 ,可以在输 出屏幕上生 成垂直线:
语法
WRITE [AT
[/][]] SY-VLINE.
或
WRITE [AT
[/][]] ‘|‘.
空行
用下列语法 ,可以在输 出屏幕上生 成空行:
语法
SKIP [].
该语句从当 前行开始, 在输出屏幕 上生成 个空行。如 果没有指定 的值,就输 出一个空行 。
要将输出定 位在屏幕的 指定行上, 请使用:
语法
SKIP TO LINE
.
该语句允许 将输出位置 向上或向下 移动。
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
窗体顶端
].
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 的使用:
如果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 .
ELSEIF .
ELSEIF .
…..
ELSE.
ENDIF.
(1).在每個判斷敘述之後要加上 .
(2).在巢狀迥圈之中無法使用 ELSE 敘述, ELSE 敘述屬 IF 敘述
Example:
IF 3 > 8.
WRITE / ‘3 is
less than 8‘.
ENDIF.
2. CASE 敘述
語法:
CASE <變數f>.
WHEN .
WHEN .
….
WHEN OTHERS.
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 FROM TO .
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 .
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
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 .
ENDDO.
無窮迥圈必須配合 EXIT 敘述來執行
*-------------------------------------------------------------------------------------*
搜索字符串
要搜索特定 模式的字符 串,请使用 SEARCH 语句,用法 如下:
语法
SEARCH FOR .
该语句在字 段 中搜索 中的字符串 。如果成功 ,则将 SY-SUBRC 的返回代码 值设置为0并 将 SY-FDPOS 设置为字段 中该字符串 的偏移量。 否则将 SY-SUBRC 设置为4。
搜索串 可为下列格 式之一:
目 的
搜 索 ( 任何字符顺 序)。忽略 尾部空格。
.. 搜 索 ,但是不忽 略尾部空格 。
* 搜 索以 结尾的词。
* 搜 索以 开始的词。
单词之间用 空格、逗号 、句号、分 号、冒号、 问号、叹号 、括号、斜 杠、加号和 等号等分隔 。
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
搜索字符字 段 的各种选项 () 如下
ABBREVIATED
在字段 中搜索包含 中指定字符 串的单词, 其中字符可 能被其它字 符隔开。单 词和字符串 的第一个字 母必须相同 。
STARTING AT
在字段 中搜索从 开始的 。结果 SY-FDPOS 参照相对于 的偏移量而 不是字段的 开始。
ENDING AT
在字段 搜索 直到位置 。
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] =
STRLEN( ).
STRLEN 将操作数 作为字符数 据类型处理 ,而不考虑 其实际类型 。不进行转 换。
关键字 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 : 輸入結束後啟動的區塊, 如按下
*-------------------------------------------------------------------------------------*
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 : 由在報表中按下或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 大 于等于
>= 大 于等于
窗体底端
四. 顯示圖示:
語法: WRITE: AS SYMBOL.
WRITE: AS
ICON.
例如: INCLUDE .
INCLUDE .
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 OCCURS ,
TYPE ,
[ TYPE ,
TYPE ,
… ]
END OF .
語法:
DATA OCCURS
[WITH HEADER LINE]
Example:
DATA VECTOR
TYPE I OCCURS 10 WITH HEADER LINE.
格式二. TYPES: BEGIN OF ,
TYPE ,
[ TYPE ,
TYPE ,
… ]
END OF .
TYPES TYPE
OCCURS .
格式三. DATA: BEGIN OF .
INCLUDE
STRUCTURE .
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
強制要求輸入
*-------------------------------------------------------------------------------------*
以上是关于ABAP必备基础语法的主要内容,如果未能解决你的问题,请参考以下文章