ABAP文法規則
- ABAP程式是由若幹個單獨的語句組成的
- 每一個語句都用句點(英文)結束
- 語句的第一個單詞一般為關鍵字
- 語句中單詞之間至少要用一個空格隔開
- 語句可以縮進
- 一句語句可以由多行組成
- 在一行中可以由多個語句
ABAP 資料聲明
變量定義基本格式
DATA < f > [(< length >)] < type> [< value>] [< decimals>].
< f >指定變量名
< length>指定變量長度
< type>指定變量的類型,還可以使用type來指定
< decimals> 指定變量小數的位數
-
資料類型
不占用記憶體空間。
描述了資料對象的屬性。
是資料對象的屬性并與資料對象聯系緊密。
使用者可以自定義
-
資料對象
是程式在運作時使用的實體單元。
占用記憶體空間。
每個資料對象都有配置設定給它的特定資料類型。
ABAP/4根據資料對象的資料類型處理資料對象。
- 預定義基礎資料類型
ABAP/4入門
簡單的變量定義示範
DATA :
W_CHAR TYPE C, "1位長度的字元變量
W_MULCHAR(20) TYPE C, "20位長度的字元變量
W_INTERGER TYPE I VALUE 10, "整型變量,并賦上了初值10
W_FLOAT TYPE F VALUE 1,2E-10, "浮點數
W_DATE TYPE D VALUE '20030312', "日期
W_TIME TYPE T VALUE '123212', "時間
W_NUMBER TYPE N, "1位數字變量
W_MULNUM(10) TYPE N, "10位數字變量
W_QUAN TYPE P, "預設有3位小數的變量
W_CURR TYPE P DECIMALS 2. "固定2位小數的變量
DATA :
W_CHAR_REF LIKE W_CHAR, "和上面定義的W_CHAR一樣
W_MATNR LIKE MARA-MATNR. "和标準表MARA中字段MATNR一樣
預定義結構化類型
通常情況下,ABAP/4程式中的結構化資料類型是使用者定義的。
在 ABAP/4 中,沒有可用的預定義結構化資料類型,但下列例外:
例如: TABLES: sbooks.
生成了一個與表結構相同﹐命名相同的結構
常量定義
常量是包含值的資料對象,如果在程式中頻繁使用某常量,可以利用常量語句,将其聲明為具有固定值的變量:
文法:CONSTANTS < c>[< length>] < type> < value> [< decimals>].
要将字段串定義為常量,請寫:
CONSTANTS: BEGIN OF < fstring>,
< component declaration>,
…
END OF < fstring>.
對于常量語句必須使用 參數,利用 參數指定的初始值,在程式的執行期間不能更改,否則,系統将報錯誤消息。
ABAP/4中的結構定義
結構聲明同樣有兩種方法:
DATA / TYPES:
BEGIN OF <結構名>, <項目1>, <項目2>, …… <項目n>,
END OF <結構名>.
DATA : <結構名> TYPE|LIKE <結構|表>.
定義示例
1.直接聲明
DATA:
BEGIN OF TYP_STUDENT,
NAME(40) TYPE C,
BIRTH_DATE TYPE D,
BIRTH_TIME TYPE T,
HEIGHT TYPE P,
WEIGHT TYPE I,
END OF TYP_STUDENT.
2.使用like
DATA :
TYP_STUDENT_REF LIKE TYP_STUDENT,
TYP_MARA LIKE MARA.
3.特殊的用法中,在自己的結構中包含别的結構
DATA:
BEGIN OF TYP_STUDENT2.
INCLUDE STRUCTURE TYP_STUDENT.
DATA:CLASS(2)
TYPE N,
DIRECTOR(40) TYPE C,
END OF TYP_STUDENT2.
内表
-
概念
内表是一種臨時的資料表,它并不建立在Database Server上,而是建立在本地記憶體空間中,是以它不占用系統資源,而且存取速度快。正因為這些特性,使得内表在ABAP程式設計中顯得相當的重要。
-
特征
内部表是ABAP/4中最核心的處理對象
内部表是用來處理(增加、查詢、修改、删除)一系列具有相同結構的資料的
内部表涵蓋了在其它程式設計語言中數組的功能
内部表僅在ABAP/4程式運作時在記憶體空間裡存在
内部表是自動化的對象,它自動完成相關的記憶體管理
-
分類
内表可以分為有序表和無序表(hashtable),有序表又分為标準表和排序表。這三種表在使用中各有差別,一般我們未特别指明的情況下都是用的标準表。
标準表是以Index來進行排列的,我們可以使用Index和Key來通路它。排序表是以Key來進行排列的,同樣的,我們也可以使用Index和Key來進行通路。
無序表是(hashtable)不按照任何規則進行排列的,對它的通路隻能按照Key來進行。
ABAP/4入門 -
内表的聲明
内部表的聲明和結構的聲明很相似,差别在于聲明中有表明内部表身份的關鍵字OCCURS
例:
DATA :
BEGIN OF TD_STUDENT OCCURS 0,
NAME(40) TYPE C,
BIRTH_DATE TYPE D,
BIRTH_TIME TYPE T,
HEIGHT TYPE P,
WEIGHT TYPE I,
END OF TD_STUDENT.
DATA : TD_MARA LIKE MARA OCCURS 0.
-
還有另外的聲明方式
文法
DATA: < itab> TYPE < itabkind> OF < linetype>
[WITH {UNIQUE | NON-UNIQUE} KEY < keydef>]
[INITIAL SIZE < n>]
[WITH HEADER LINE].
TYPES:
BEGIN OF TYP_FLIGHT,
CARRID LIKE SPFLI-CARRID,
CONNID LIKE SPFLI-CONNID,
CITYFROM LIKE SPFLI-CITYFROM,
FLDATE LIKE SFLIGHT-FLDATE,
SEATSMAX LIKE SFLIGHT-SEATSMAX,
END OF TYP_FLIGHT.
DATA:
TD_FLIGHT TYPE TABLE OF TYP_FLIGHT WITH HEADER LINE,
TH_FLIGHT TYPE TYP_FLIGHT.
工作區
-
概念及特征
程式對内表的行操作不能直接進行,必須通過一種接口來進行,這個接口就是工作區(work area)。
程式需要從關系資料庫中提取資料到内表行中時,必須先将資料讀入工作區,然後把工作區中的資料賦給内表的行。
工作區必須具有和内表行一緻或者可以互相轉換的資料結構(一般是與内表行類型相同的結構體)。
-
工作區的定義
定義内表的同時,需要首先定義一個與該内表行結構相同的工作區對象供程式使用,将資料寫入内表時,必須首先給工作區指派,再通過APPEND等語句将工作區中的值添加或者插入到内表中
- 示例
TYPES: BEGIN OF TYP_STUDENT, NAME(10) TYPE C, AGE(2) TYPE N, SEX(6) TYPE C, END OF TYP_STUDENT. DATA: TH_STUDENT TYPE TYP_STUDENT, "聲明工作區 TD_STUDENT TYPE TABLE OF TYP_STUDENT "聲明内表 TH_STUDNET-NAME = '張三'. TH_STUDENT-AGE = 22. TH_STUDENT-SEX = '男'. APPEND TH_STUDENT TO TD_STUDENT "工作區指派給内表 TH_STUDNET-NAME = '惜夢'. TH_STUDENT-AGE = 22. TH_STUDENT-SEX = '女'. APPEND TH_STUDENT TO TD_STUDENT "工作區指派給内表 CLEAR TH_STUDENT. "清除工作區(複位指派) LOOP AT TD_STUDENT INTO TH_STUDENT. "循環輸出 " WRITE: / TH_STUDENT-NAMA, TH_STUDENT-AGE, TH_STUDENT-SEX. CLEAR TH_STUDENT. ENDLOOP. 輸出結果: 張三 22 男 惜夢 22 女
變量操作
- 指派
一般可以使用以下幾種方式指派
等号指派: A = B.
MOVE指派: MOVE B TO A.
WRITE指派: WRITE B TO A,
複位指派: CLEAR A.
- 資料計算
一般的加減乘除
A = B + C.
A = B – C.
A = B * C.
A = B / C.
幂,取模,整除
A = B ** C.
A = B MOD C.
A = B DIV C.
數學函數(SIN,COS,TAN,ABS,CEIL,FLOOR)
A = SIN(B).
A = COS(B).
計算的優先順序
括号
函數
**
*/DIV MOD
+和-
- 字元串操作
STRLEN 取長度
測量操作數的長度
< n > = STRLEN < c >.
示例:
DATA :
W_CHAR(20) TYPE C VALUE ‘AT21’.
DATA :
W_LEN TYPE N.
W_LEN = STRLEN( W_CHAR ).
WRITE W_CHAR.
WRITE / W_LEN.
那麼輸出結果就為:
AT21
4
CONCATENATE字元串連接配接
CONCATENATE < c1 > … < cn > INTO < c > [SEPARATED BY < s >].
示例:
DATA :
W_RESULT(50) TYPE C,
W_STR1(10) TYPE C VALUE ‘123’,
W_STR2(15) TYPE C VALUE ‘ABC’,
W_STR3(10) TYPE C VALUE ‘MK1’,
W_DELIMITER TYPE C VALUE ‘/’.
CONCATENATE W_STR1 W_STR2 W_STR3 INTO W_RESULT SEPARATED BY W_DELIMITER.
WRITE : W_STR1,
/ W_STR2,
/ W_STR3,
/ W_RESULT.
輸出為:
123
ABC
MK1
123/ABC/MK1
REPLACE字元串替換
REPLACE < str1> WITH < str2> INTO < c> [LENGTH < l>].
示例:
DATA:
T(10) VALUE ‘abcdefghij’,
STRING LIKE T,
STR1(4) VALUE ‘cdef’,
STR2(4) VALUE ‘klmn’,
STR3(2) VALUE ‘kl’,
STR4(6) VALUE ‘klmnop’,
LEN TYPE I VALUE 2.
STRING = T.
WRITE STRING.
REPLACE STR1 WITH STR2 INTO STRING.
WRITE / STRING.
STRING = T.
REPLACE STR1 WITH STR2 INTO STRING LENGTH LEN.
WRITE / STRING.
STRING = T.
REPLACE STR1 WITH STR3 INTO STRING.
WRITE / STRING.
STRING = T.
REPLACE STR1 WITH STR4 INTO STRING.
WRITE / STRING.
CONDENSE壓縮
CONDENSE < c> [NO-GAPS].
示例:
DATA:
STRING(25) VALUE ‘one two three four’,
LEN TYPE I.LEN = STRLEN( STRING ).
WRITE: STRING, ‘!’.
WRITE: / 'Length: ', LEN.
CONDENSE STRING.
LEN = STRLEN( STRING ).
WRITE: / STRING, ‘!’.
WRITE: / 'Length: ', LEN.
CONDENSE STRING NO-GAPS.
LEN = STRLEN( STRING ).
WRITE: / STRING, ‘!’.
WRITE: / 'Length: ', LEN.
SHIFT移位
SHIFT < c> [ BY < n > PLACES] [< mode >].
SHIFT < c> LEFT DELETING LEADING < str >.
SHIFT < c> RIGHT DELETING TRAILING < str >.
示例:
DATA :
TEMP(20) VALUE ‘A213NALA2’,
STRING LIKE TEMP,
STR(2) VALUE ‘A2’.
STRING = TEMP.
WRITE STRING.
SHIFT STRING BY 3 PLACES LEFT.
WRITE / STRING.
STRING = TEMP.
SHIFT STRING BY 2 PLACES RIGHT.
WRITE / STRING.
STRING = TEMP.
SHIFT STRING LEFT DELETING LEADING STR.
WRITE / STRING.
結果:
A213NALA2
3NALA2
A213NALA2
13NALA2
TRANSLATE切換大小寫
TRANSLATE < c > TO UPPER CASE.
TRANSLATE < c > TO LOWER CASE.
示例:
DATA :
STR1(20) VALUE ‘a21gFDFS123’,
STR2(20) VALUE ‘a21gFDFS123’.
TRANSLATE STR1 TO UPPER CASE.
TRANSLATE STR2 TO LOWER CASE.
WRITE : STR1 , / STR2.
輸出結果為:
A21GFDFS123
a21gfdfs123
SEARCH字元串搜尋
在字元串中查指定的内容
SEARCH < c > FOR < str > < options >.
示例:
DATA :
STRING(30) VALUE ‘This is a simple sentence’.
SEARCH STRING FOR ‘Thisis’.
WRITE: SY-SUBRC, SY-FDPOS.
SEARCH STRING FOR ‘SEN’.
WRITE: / SY-SUBRC, SY-FDPOS.
輸出結果為:
4 0
0 17
注:SY-FDPOS用于顯示查找字元串在母字元串中的位置
在字段c中查找字元串str.如果找到,則将SY-SUBRC傳回0,SY-FDPOS傳回字段c中該字元串的位置(從左算起的位元組偏移量),否則SY-SUBRC傳回4
SPLIT字元串分割
SPLIT < c> AT < del > INTO < c1 > … < cn >.
示例:
DATA :
STR(30) VALUE ‘Part1 * Part2 * Part3 * Part4’,
STR1(30), STR2(30), STR3(30),
DEL(1) VALUE ‘*’.
SPLIT STR AT DEL INTO STR1 STR2 STR3.
WRITE : STR, / STR1, / STR2, / STR3.
輸出結果為:
Part1 * Part2 * Part3 * Part4
Part1
Part2
Part3 * Part4
- 内表操作
1.初始化工作區以及内表
要初始化有或沒有表頭的内表,請使用 REFRESH 語句,用法如下:REFRESH .該語句将内表重置為填充它以前的狀态,這意味着表格将不包含任何行。
如果使用沒有表格工作區域的内表,可以使用 CLEAR 語句代替 REFRESH 語句,用法如下:CLEAR < itab>.
如果使用有表頭行的内表,CLEAR 語句僅清除表格工作區域。要重置整個内表而不清除表格工作區域,使用 REFRESH 語句或 CLEAR 語句,用法如下:CLEAR < itab>[].内表名稱之後的方括号指内表體。
使用 REFRESH 或 CLEAR 初始化内表後,系統保持在記憶體中保留的空間 。可以用 FREE 語句釋放記憶體,用法如下:FREE < itab>.
也可以使用 FREE 語句重置内 表并直接釋 放其記憶體,而不必先使用 REFRESH 或 CLEAR。與 REFRESH 一樣,FREE 在表格體上,而不在表格工作區域上工作。
在 FREE 語句之後,可以再次定位内表。這樣,系統就再次保留記憶體空間。
可以使用如下邏輯表達式檢查内表是否為空:… < itab> IS INITIAL …
APPEND
APPEND [wa |INITIAL LINE] TO itab.
語句用來把表頭或工作區< wa >裡的資料添加到内表< itab >的末尾。 APPEND [wa TO] itab SORTED BY f.
把工作區wa中的資料添加到itab内表中,并按字段f排序。
注:工作區< wa >結構要和内表itab結構要一樣。
如果是wa則把工作區中的資料添加到内表itab的末尾,如果用“INITIAL LINE”則添加一個空行。
INSERT
INSERT [wa |INITIAL LINE] INTO itab [INDEX idx].
INSERT [wa |INITIAL LINE] INTO TABLE itab.
INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO itab2 [INDEX idx3].
INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO TABLE itab2.
INSERT語句用來把表頭或工作區裡的内容添加< itab >的指定位置。
如果INDEX被指定,該語句将會将記錄插入到指定置。
如果INDEX未指定,對标準表記錄會被添加到末尾,對排序表記錄會自動按照Key進行排序。
TYPES:
BEGIN OF TYP_STUDENT,
NAME(10) TYPE C,
AGE(2) TYPE N,
SEX(6) TYPE C,
END OF TYP_STUDENT.
DATA:
TH_STUDENT TYPE TYP_STUDENT, “工作區
TD_STUDENT TYPE TABLE OF TYP_STUDENT. ”内表
TH_STUDENT-NAME = ‘張三’.
TH_STUDENT-AGE = 22.
TH_STUDENT-SEX = ‘男’.
APPEND TH_STUDENT TO TD_STUDENT.”工作區指派給内表
TH_STUDENT-NAME = ‘惜夢’.
TH_STUDENT-AGE = 22.
TH_STUDENT-SEX = ‘女’.
APPEND TH_STUDENT TO TD_STUDENT.
TH_STUDENT-NAME = ‘追風’.
TH_STUDENT-AGE = 22.
TH_STUDENT-SEX = ‘女’.
INSERT TH_STUDENT INTO TD_STUDENT INDEX 1. "指定了index,插入到指定的位置
結果:
追風 22 女
張三 22 男
惜夢 22 女
MODIFY
MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1 … fn]. MODIFY TABLE itab [FROM wa] [TRANSPORTING f1 … fn]. MODIFY itab [FROM wa] TRANSPORTING f1 … fn WHERE cond.
MODIFY語句可以根據指定的Index或Key來把表頭或工作區的内容修改到中的相應記錄。當然,指定Index或Key的記錄首先必須在中存在。
TRANSPORTING限定被修改的列。當我們不需要修改内表中的所有列時,用TRANSPORTING 關鍵字。
COOLECT
COLLECT [wa INTO] itab. Addition: … SORTED BY f
COLLECT根據表關鍵字附加行,如果用APPEND語句附加行,則具有相同表關鍵字的資料行(甚至是完全相同的資料行)可以同時存在于一個内表中,但COLLECT 語句可以在内表中根據表關鍵字唯一的确定資料行(即具有相同關鍵字段的資料行不能重複出現)。
注:使用COLLECT将内表值進行合計時,要先将内表資料進行排序。
COLLECT根據表關鍵字附加行,如果用APPEND語句附加行,則具有相同表關鍵字的資料行(甚至是完全相同的資料行)可以同時存在于一個内表中,但COLLECT 語句可以在内表中根據表關鍵字唯一的确定資料行(即具有相同關鍵字段的資料行不能重複出現)。
COLLECT [wa INTO] itab. Addition: … SORTED BY f
例:
TYPES:
BEGIN OF TYP_COMPANY,
NAME(20) TYPE C,
SALES TYPE I,
END OF TYP_COMPANY.
DATA:
TH_COMPANY TYPE TYP_COMPANY, "工作區
TD_COMPANY TYPE HASHED TABLE OF TYP_COMPANY WITH UNIQUE KEY NAME."無序表
TH_COMPANY-NAME = ‘Duck’.TH_COMPANY-SALES = 10.
COLLECT TH_COMPANY INTO TD_COMPANY.
TH_COMPANY-NAME = ‘Tiger’.TH_COMPANY-SALES = 20.
COLLECT TH_COMPANY INTO TD_COMPANY.
TH_COMPANY-NAME = ‘Duck’.
TH_COMPANY-SALES = 30.
COLLECT TH_COMPANY INTO TD_COMPANY.
結果:
NAME | SALES
---------------
Duck | 40
Tiger | 20
READ
READ TABLE itab FROM wa [additions].
READ TABLE itab WITH TABLE KEY k1 = v1 … kn = vn [additions].
READ TABLE itab WITH KEY k1 = v1 … kn = vn [BINARY SEARCH] [additions].
READ TABLE itab INDEX i [additions].
如果用【BINARY SEARCH】,則首先要對内表進行排序。
示例:
READ TABLE TD_STUDENT INTO TH_STUDENT INDEX 1.
LOOP
LOOP AT itab.
LOOP AT itab INTO wa.
LOOP AT itab ASSIGNING < fs >.
Additions:
1… FROM n1 2. … TO n2 3. … WHERE logexp
AT
AT NEW f.
在關鍵字f發生改變時,才執行相應的操作; AT END OF f. 在以f為關鍵字的資料行處理完畢後,才執行相應的操作;
AT FIRST.在進行内表操作之前,執行的相應操作;
AT LAST.
在内表資料操作完畢之後,執行的相應操作。
DELETE
DELETE itab.
DELETE TABLE itab WITH TABLE KEY k1 = v1 … kn = vn.
DELETE TABLE itab [FROM wa].
DELETE itab INDEX idx.DELETE itab WHERE logexp.
DELETE ADJACENT DUPLICATES FROM itab.
ADJACENT關鍵字用來删除内表中重複的資料行。
DESCRIBE
DESCRIBE TABLE itab.
Additions:
1… LINES n2. … OCCURS n3. … KIND k
1,LINES表示内表的行數
2,OCCURS 内表的初始大小
3,KIND 内表的類型
SORT
SORT itab.
… BY f1 f2 … fn
… ASCENDING
… DESCENDING
… AS TEXT
… STABLE
AS TEXT主要是用于排序表
使用STABLE,當SORT KEY不變時,經過多次排序,内表中的資料順序不變。如果不用STABLE,則每次排序後,内表中的資料順序可能發生改變。
運算符&表達式
- 基礎運算
加減乘除取模整除幂+ - * / ** MOD DIV
也可以用關鍵字 ADD、SUBTRACT、 MULTIPLY和 DIVIDE進 行基本算術運算
操作符兩邊需要有空格
- 日期運算
日期變量的定義。
常用的擷取日期的系統變量
日期的定義
DATA: ULTIMO TYPE D.
時間的定義
DATA: P_TIME TYPE T.
擷取目前日期:
ULTIMO = SY-DATUM.
擷取目前時間。
P_TIME = SY-UZEIT .
在某些情況下(例如按遞減順序對日期進行排序),用關鍵字 CONVERT 将日期從格式D轉換為相反日期非常有用。文法:
CONVERT DATE < d1 > INTO INVERTED-DATE < d2 >.
CONVERT INVERTED-DATE < d1 > INTO DATE < d2 >.
這些語句将 字段 < d1> 從格式 DATE 或 INVERTED-DATE 轉換為格式 INVERTED-DATE 或 DATE 并将其賦給 < d2 >。
對于該轉換,ABAP/4 形成 9 的補數。
備注:
1、在ABAP語言中,在日期計算中,可以直接通過算術運算進行日期的加減,不過對于在平常的應用中我們也可以通過SAP的标準函數來實作。
2、系統變量在SAP中的結構SYST中,在程式中我們可以通過SY-<變量名> 擷取系統目前的相關資訊。
3、除了以上的常用的日期格式,有時候我們還會用到格林威治時間:GET TIME STAMP FIELD TIME_STAMP.
- 邏輯表達式
通用邏輯運算符:
EQ(=):等于;NE(<>、><):不 等于;
LT(<): 小 于;LE(<=):小 于等于
GT(>):大 于;GE(>=):大 于等于
IS操作符:
IS INITIAL 檢查字段是否為初始值;
IS ASSIGNED 檢查字段是否被配置設定。
組合邏輯表達式:
NOT AND OR
字元串比較:
CO 僅包含
CN 不僅包含
CA 包含任何
NA 不包含任何
CS 包含字元串
NS 不包含字元串
CP 包含模式
NP 不包含模式
因為除類型 N 和 C 外,系統不能執行任何其它類型轉換,是以,在進行包含這些運算之一的比較時,操作數應該是類型 N 或 C。
- 标準運算函數
ABAP/4入門
DATA :
N TYPE P DECIMALS 2.
DATA :
M TYPE P DECIMALS 2 VALUE '-5.55'.
N = ABS( M ).
WRITE: 'ABS: ', N.
N = SIGN( M ).
WRITE: / 'SIGN: ', N.
N = CEIL( M ).
WRITE: / 'CEIL: ', N.
N = FLOOR( M ).
WRITE: / 'FLOOR:', N.
N = TRUNC( M ).
WRITE: / 'TRUNC:', N.
N = FRAC( M ).
WRITE: / 'FRAC: ', N.
輸出如下:
ABS: 5.55
SIGN: 1.00-
CEIL: 5.00-
FLOOR: 6.00-
TRUNC: 5.00-
FRAC: 0.55-
這些函數的參數不必為數值資料類型。如果選擇其它類型 ,則被轉換為數值類型。然而,由于性能原因
應盡可能使用正确類型。
DATA: T1(10),
T2(10) VALUE '-100'.
T1 = ABS( T2 ).
WRITE T1.
輸出為:
100
執行了兩種轉換。首先 ,将類型 C 字段的内容 T2 轉換為類型 P 并且系統用轉換結果處理函數 ABS。
然後,在類型 C 字段 T1 的指派期間 ,将函數結果轉換回類型 C。
DATA:
RESULT TYPE F,
PI(10) VALUE '3.141592654'.
RESULT = COS( PI ).
WRITE RESULT.
輸出為 -1.00000000000000E+00。 在進行計算之前,自動将字元字段 PI 轉換為類型 F 字段。