第四章 ABAP基礎
4.1.5 程序運行
1.程序內部調用,如下表:
功能 | 報表調用語句 | 事務調用語句 |
無返回調用 | SUBMIT | LEAVE TO TRANSACTION |
調用並返回 | CALL TRANSACTION |
例:
REPORT z_calling_program.
START-OF-PROGRAM.
WRITE ‘This program calls another program.’.”此內容在輸出界面看不到
SUBMIT z_simple_program.”上面的輸出被此程序覆蓋.
如果改用SUBMIT AND RETURN來調用則可以輸出以上內容.
2.結束程序:LEAVE PROGRAM.可在任意點強制結束當前運行的程序.
4.1.6 內存管理
SAP程序同一個用戶和系統可進行最多6個SAPGUI主會話.
4.2.1 數據定義
TYPES:BEGIN OF t_staff,
S_no(3) type n,
Name(20),
END OF t_staff.
DATA staff TYPE t_staff.
上例中定義了一個結構類型t_staff,並根據其聲明了一個結構體對象staff.
數據類型中的扁平結構與縱深結構:
扁平類型:運行時長度固定的類型.
縱深類型:運行時長度可巒的類型.
4.2.2 ABAP內置基本數據類型:
數據 類型 | 默認大小 | 有效大小 | 初始值 | 說明 | 示例 |
C | 1 | 1-65535 | SPACE | 文本字符(串) | ‘name’ |
N | 1 | 1-65535 | ’00…0’ | 數字文本 | ‘0123’ |
T | 6 | 6 | ‘000000’ | 時間(HHMMSS) | ‘123010’ |
D | 8 | 8 | ‘00000000’ | 日期(YYYYMMDD) | ‘20080101’ |
I | 4 | 4 | 0 | 整型(整數) | 99 |
F | 8 | 8 | 0 | 浮點數 | 5E+04 |
P | 8 | 1-16 | 0 | 壓縮數 | 12.91 |
X | 1 | 1-65535X | ‘0’ | 十六進制數 | ‘3A’ |
String | 1 | 無限定 | SPACE | 字符串(長度可巒) | ‘A String’ |
1 | 無限定 | SPACE | 十六進制字符串 | ‘A3FF’ |
注意:
1.其中C,N,T,D,I,F,P,X為定長類型,即在運行期間長度不能改變.
2.類型T,D,I,F的數據存儲長度是固定的,不能指定參照其生成的數據對象占用的內存字節數.
3.基于類型C,N,P,X生成的數據對象需要在聲明時指定其長度.否則取默認值.
4.如果在聲明一個數據對象時未指明其數據類型,則該數據默認為C類型.
5.類型I的數值範圍:-231到231-1的整數.如果運算時出現非整型結果則進行四舍五入取值.而不是截斷小數.
6.類型P用于聲明小數位固定的壓縮數,其占據內存字節數和數值範圍取決於定義時指定的整個數據的大小和小數點后位數,如果不指定小數位,則將其視為I類型數據.有效大小可以是從1~16字節的任意值,小數點后最多允許14個數字.
7,類型F為浮點數,浮點意思是數字在內存中以字節形式表示,數值範圍:1*10-307到1*10308,因系統將F類型轉換為二進制數,所以可能出現舍入誤差,若用戶要求較高精度且數值較大時,應使用P類型數據.
8.長度可巒的內置類型String, XString是通過引用實際動態的數據對象的固定內存地址來操作.
4.2.3 程序內部數據定義
參照自定義類型或內置類型生成數據的語法格式:
TYPES|DATA …TYPE l_type…
參照程序中已經聲明的數據對象生成新數據語法:
TYPES|DATA …LIKE dobj…
3.結構類型和結構體
參照結構類型生成的數據對象稱為結構體.
TYPES|DATA:BEGIN OF structure.
k1 [TYPE type |LIKE dobj]…,
k2 [TYPE type |LIKE dobj]…,
…
kn [TYPE type |LIKE dobj]…,
END OF structure.
參照生成:
參照結構生成:TYPES|DATA structure TYPE str_type |LIKE str_dobj...
參照數據庫表生成:TYPES|DATA structure TYPE dbtab.
4.表類型和內表
表類型的對象稱為內表.
4.2.4 數據字典中的類型
l 數據元素(Data elements),相當於ABAP中的基本類型和引用類型.
l 結構(Structures),由數據元素字段構成,對應ABAP中的結構類型.
l 表類型(Table types),對應ABAP中的表類型.
數據字典中的數據類型與ABAP中的中數據類型對應關系:
數據字典類型 | ABAP類型 | 運行長度 | 說明 |
ACCP | N(6) | 6 | 會計結算周期 |
CHAR | C(n) | 1~255 | 字符 |
CLNT | C(3) | 3 | 集團,數據區域代碼 |
CUKY | C(5) | 5 | 貨幣代碼 |
CURR(n,m) | P((n+1)/2)DECIMAL m | 1~17 | 貨幣金額 |
DATS | D(8) | 8 | 日期 |
DEC n,m | P((n+1)/2)DECIMAL m | n(1~31)m(1~17) | 數值計算 |
FLTP | F(8) | 18 | 浮點數 |
INT1 | X(1)(類型b) | 3 | 單字節整型數 |
INT2 | X(2)(類型s) | 5 | 雙字節整型數 |
INT4 | X(4)(類型i) | 10 | 四字節整型數 |
LANG | C(1) | 內部1位外部2位 | 語言代碼 |
LCHR | C(n) | 256~最大值 | 長字符 |
LRAW | X(n) | 256~最大值 | 長位字符 |
NUMC n | N(n) | 1~255 | 數值文字 |
PREC | X(2) | 16 | 精確度 |
QUAN n,m | P((n+1)/2)DECIMAL m | 1~17 | 數量 |
RAW n | X(n) | 1~255 | 位字串 |
TIMS | T(6) | 6 | 時間 |
VARC n | C(n) | 255~最大值 | 長字符(僅V3.0前可用) |
STRING | STRING | 1~最大值 | 字符串 |
RAWSTRING | XSTRING | 1~最大值 | 位字符串 |
UNIT | C(n) | 2~3 | 單位 |
4.2.5 程序中的數據對象
1.文字對象
當字符文字長度超過編輯器的一行時,可以使用”&”進行連接,避免因換行而產生的多余空格,如:long = ‘This is ‘&
‘a long sentence’.
如果需要輸出“’”,則需要在前面多加一個“’”轉回願意.
2.有名稱的數據對象
常量聲明:
CONSTANT: const(len) TYPE|LIKE dobj [DECIMALS dec] VALUE val.
結構體常量聲明(每個組件必須指定初始值):
CONSTANT:BEGIN OF structure,
str1 TYPE|LIKE dobj [DECIMALS dec] VALUE val,
str2 TYPE|LIKE dobj [DECIMALS dec] VALUE val,
...,
strn TYPE|LIKE dobj [DECIMALS dec] VALUE val,
END OF structure.
3.系統數據對象(見附表)
4.查明數據對象屬性
DESCRIBE FIELD f LENGTH len.此語句將字段f的長度寫入變量len.
l LENGTH:確定數據對象長度.
l TYPE: 確定數據對象類型.
l OUTPUT-LENGTH:確定實際輸出長度.
l DECIMALS:確定P類型小數位長.
l EDIT MASK:確定在數據字典中定義轉換例程.
l HELP-ID:確定在數據字典中定義的F1幫助信息.
4.3 基本數據操作
4.3.1數據賦值
l MOVE source TO incept.等介於:incept = source.
l CLEAR dobj.將數據對象dobj還原為初始值.
l 結構體間賦值:struct2 = struct1.(組件結構相同).
l MOVE-CORRESPONDING struct1 TO struct2.(部分組件結構相同).
4.3.2類型轉換(見附表).
4.3.3數值運算
1.算術運算
運算 | 數學表達式語句 | 關鍵字語句 |
加法 | n = x + y. | ADD y TO x. |
減法 | n = x – y. | SUBTRACT y FROM x. |
乘法 | n = x * y. | MULTIPLY x BY y. |
除法 | n = x / y. | DIVIDE x BY y. |
整除 | n = x DIV y. | 無 |
取余 | n = x MOD y. | 無 |
冪(乘方) | n = x ** y. | 無 |
兩個結構體的同名字段之間可以整體進行算術運算:
ADD-CORRESPONDING struct1 TO struct2.
SUBTRACT-CORRESPONDING struct1 FROM struct2.
MULTIPLY-CORRESPONDING struct2 BY struct1.
DIVIDE-CORRESPONDING struct2 BY struct1.
以上將對兩個結構體中的同名字段進行相應運算(非數值類型數據會引起錯誤).
2.數學函數
任意類型參數的函數列表:
函數名 | 說明 |
ABS( dobj ) | 返回參數絕對值 |
SIGN( dobj ) | 返回參數符號:正數返回1,0返回0,負數返回-1. |
TRUNC( dobj ) | 返回參數的整數部分 |
FRAC( dobj ) | 返回參數的小數部分 |
CEIL( dobj ) | 返回不小於輸入參數的最小整數值 |
FLOOR( dobj ) | 返回不大於輸入參數的最大整數值 |
注意:函數名與左括號間不能有空格,括號與參數間必須有空格.
F類型參數的函數列表(其它類型參數將首先被轉換為F類型).
函數名 | 說明 |
COS,SIN,TAN | 三角函數 |
ACOS,ASIN,ATAN | 反三角函數 |
COSH,SINH,TANH | 雙曲函數 |
EXP | 底數為e(2.7182818285)的冪函數 |
LOG | 底數為e的自然對數 |
LOG10 | 底數為10的對數 |
SQRT | 平方根 |
4.3.4數據輸出
輸出格式化選項:
選項 | 應用類型 | 說明 |
LEFT-JUSTIFIED | 所有類型 | 左對齊 |
CENTERED | 所有類型 | 居中 |
RIGHT-JUSTIFIED | 所有類型 | 右對齊 |
UNDER g | 所有類型 | 輸出直接開始於字段g |
NO-GAP | 所有類型 | 忽略輸出時字段后的一位空格 |
USING EDIT MASK m | 所有類型 | 指定數據字典中定義的格式模板m |
USING NO EDIT MASK | 所有類型 | 撤消對格式模板的激活 |
NO-ZERO | 所有類型 | 用空格替代所有有前導零 |
NO-SIGN | 數值類型 | 不輸出前導符號 |
DECIMALS d | 數值類型 | 輸出d定義小數點后的數字位數,如需截斷,則四舍五入 |
EXPONENT e | 數值類型 | 對F類型字段在e>定義冪指數 |
ROUND r | 數值類型 | 用10的負r次方乘P類型字段,然后取整 |
CURRENCY c | 數值類型 | 按系統表格TCURX中定義的格式將貨幣c格式化 |
DD/MM/YY|MM/DD/YY | 格式調整,”/”為用戶主記錄中定義的分隔符 | |
DD/MM/YYYY,...(同上) | 時間日期 | 格式調整,”/”為用戶主記錄中定義的分隔符 |
DDMMYY...(同上) | 時間日期 | 格式調整,無分隔符 |
注:用戶主記錄System->User profile->Own data(SU01).
4.3.5邏輯表達式
通用邏輯表達式列表:
運算符 | 意義 |
EQ或= | 等於 |
NE或<>或>< | 不等于 |
LT或< | 小于 |
LE或<= | 小于等于 |
GT或> | 大于 |
GE或>= | 大于等于 |
3.IS操作符
l ...f IS INITIAL...:檢查字段f是否為初始值.
l ...fs IS ASSIGNED...:檢查字段符號是否被分配.
l ...p IS [SUPPLIED|REQUESTED]...:檢查過程中的參數是否被實參填充.
4.BETWEEN操作符
l ...f1 BETWEEN f2 AND f3...:檢查數據對象的值是否屬于特定範圍之間.
5.IN操作符(P110)
l ...f IN seltab...:檢查一個數據對象的內容是否遵從某個選擇表的邏輯條件.
6.組合邏輯表達式
l AND:與.
l OR:或.
l NOT:非.
注:括號與操作數間至少要有一個空格,如:IF ( c > n ) AND ( c < f ).
4.4結構控制
程序代碼分三種結構:
l 順序結構:語句逐行執行.
l 分支結構:根據不同的條件執行不同語句塊.
l 循環結構:反復執行某個語句.
4.4.1分支控制
1.IF/ENDIF結構:
IF <condition1>.
<statement block>
ELSEIF <condition2>.
<statement block>
......
ELSE.
<statement block>
ENDIF.
注:可嵌套.
2.CASE/ENDCASE結構:
CASE f.
WHEN f11 [OR f12 OR ...].
<statement block>
......
[WHEN OTHERS.]
<statement block>
ENDCASE.
其中,f為變量,fij可以是變量或者固定值.
4.4.2循環控制
1.無條件循環
DO [n TIMES].
<statement block>
ENDDO.
說明:n為循環次數,可以是文字或變量,如果沒有限定n值,則必須用EXIT,STOP或REJECT等語句強制結束循環.DO循環可嵌套,SY-INDEX為當前循環次數.
2.條件循環
WHILE <condition>.
<statement block>
ENDWHILE.
注:可嵌套,其它同上.
3.循環中止
l CONTINUE:無條件中止當前本輪循環,開始下一輪循環.
l CHECK:條件中止當前本輪循環(條件為假時), 開始下一輪循環.
l EXIT:無條件完全中止當前循環,繼續循環結束語句(ENDDO,ENDWHILE等)后面的代碼,如果在嵌套循環中,系統僅退出當前循環.
4.5處理字符數據
4.5.1字符數據
1.連接字符串
CONCATENATE s1 s2 ... sn INTO s_dest [SEPARATED BY sep].
注:所有字串操作將忽略s1....sn中的尾部空格(如需保留空格,可使用指定偏移量).
如果出現截斷情況,將SY-SUBRC設為4,否則返回0.
2.拆分字符串
SPLIT s_source AT sep INTO s1 s2 ... sn.
如果所有子串足夠長且不必截斷任何部分,則將SY-SUBRC設為0,否則返回4,
如果源字符串能夠拆分的子串多過指定的數目,則源子串最后的剩余部分包括其后的分隔符都將寫入最后一個子串,要避免這種情況,需要使用內表進行操作:
SPLIT s_source AT sep INTO TABLE itab.在該形式中,根據子串數目生成n行的內表.例如:
DATA:text type string,
itab TYPE TABLE OF string.
text = ‘ABAP is a programming language’.
SPLIT text AT space INTO TABLE itab.
LOOP AT itab INTO text.
WRITE / text.
ENDLOOP.
3.查找子串模式
SEARCH c FOR str.在字段c中查找字符串str.如果找到,則將SY-SUBRC返回0,SY-FDPOS返回字段c中該字符串的位置(從左算起的字節偏移量),否則SY-SUBRC返回4,查找模式有以下幾種:
l str 搜索str並忽略尾部空格.
l .str. 搜索str,但不忽略尾部空格.
l *str 搜索以str結尾的單詞.
l str* 搜索以str開始的單詞.
REPORT z_string_search.
DATA string(30) TYPE c VALUE 'This is a testing sentence.'.
WRITE: / 'searched','sy-subrc','sy-fdpos'.
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 4 0
.e . 4 0
*e 0 18
s* 0 18
4.替換字段內容.
REPLACE str1 WITH str2 INTO s_dest [LENGTH len].搜索s_dest中前len個字符中的子串str1,用str2來替換它,如果成功,SY-SUBRC返回0,否則還回非0值.
REPORT z_replace.
DATA name TYPE string.
name = 'Michael-Cheong'.
WHILE sy-subrc = 0.
REPLACE '-' WITH ' ' INTO name.
ENDWHILE.
WRITE / name.
輸出結果: Michael Cheong
5.確定字段長度
n = STRLEN( str ).函數將str作為字符數據類型處理,不考慮其實際類型,也不進行轉換.計算其首字符到最后一個非空字符的長度,不包括結尾空格.
6.其它操作語句
l SHIT:將字符串整體或子串進行位移.
l CONDENSE:刪除字符串中的多余空格.
l TRANSLATE:字符轉換,如將ABC轉換為abc.
l CONVERT TEXT:創建一個可以排序的格式.
l OVERLAY:用一個字符串覆蓋另一個字符串.
4.5.2字符數據比較(用於判斷兩個字串之間的包含關系):
運算符 | 含義 |
s1 CO s2 | 如果s1僅包含s2中的字符,邏輯表達式為真 |
s1 CN s2 | 如果s1還包含s2之外的字符,邏輯表達式為真 |
s1 CA s2 | 如果s1包含任何一個s2中的字符,邏輯表達式為真 |
s1 NA s2 | 如果s1不包含s2的任何字符,邏輯表達式為真 |
s1 CS s2 | 如果s1包含字符串s2,邏輯表達式為真 |
s1 NS s2 | 如果s1不包含字符串s2,邏輯表達式為真 |
s1 CP s2 | 如果s1包含模式s2,邏輯表達式為真 |
s1 NP s2 | 如果s1不包含模式s2,邏輯表達式為真 |
注:CO,CN,CA,NA比較時區分大小寫,且尾部空格也在比較範圍之內,CS,NS,CP,NP比較時忽略尾部空格且不區分大小寫,比較結束后,如果結果為真,SY-FDPOS將給出s2在s1中的偏移量信息.模式表示可以使用通配符,”*”用于替代任何字符串,”+”用于替代單個字符.
換碼字符使用:
l 指定大小寫(如#A,#b).
l 通配符”*”(輸入#*),將其轉回原義.
l 通配符”+”(輸入#+),將其轉回原義.
l 換碼符本身”#”(輸入##),將其轉回原義.
l 字符串結尾空格(輸入#__),指定比較結尾空格.
4.5.3定位操作子串
str[+position][(len)].從字符串str中的position位開始取出長度為len的子串.
可動態指定偏移量及長度的情況(即position及len可為變量):
l 用MOVE語句或賦值運算符給字段賦值時.
l 用WRITE TO語句向字段寫入值時.
l 用ASSIGN將字段分配給字段符號時.
l 用PERFORM將數據傳送給子程序時.
off = 6.
len = 2.
date+off(len) = ‘01’.
4.6使用內表
types定義的並不是結構體對象,只是結構類型,不能作為工作區,當定義的內表沒有表頭行(工作區)時,必須為其定義一個結構體作為工作區,否則無法使用此內表.如果沒有給內表定義工作區,則在定義內表時必須聲明表頭行(with header line).
DATA:BEGIN OF line, "work area(structure)結構類型且結構體對象
num TYPE i,
sqr TYPE i,
END OF line,
"無表頭行內表,內表定義都使用data關鍵字.
itab TYPE(LIKE) STANDARD TABLE OF line WITH KEY table_line.
DATA DIRTAB LIKE CDIR OCCURS 10 WITH HEADER LINE.定義標準內表
DO 5 TIMES.
line-num = sy-index.
line-sqr = sy-index ** 2.
APPEND line TO itab.
ENDDO.
LOOP AT itab INTO line.
WRITE:/ line-num,line-sqr.
ENDLOOP.
CLEAR itab.
注:
1.TYPES與DATA區別:TYPES是用來定義某種類(型)的,需(用DATA語句)實例化以后才可以使用,而DATA是用來定義數據對象(實例變量)的,對于用DATA直接定義的結構體對象(不參照其它結構類型),其同時也是一個結構類型.
2.TYPE與LIKE區別:TYPE后面跟隨的只能是某種類(型),而LIKE后面可以跟隨類型或實例對象,參照結構體對象生成內表時只能用LIKE,不能用TYPE,因為結構體對象不是類型,只是一種實例對象,參照結構類型生成內表時可以用LIKE也可以用TYPE.其中通過LIKE定義的內表直接擁有參照結構類型的元素結構,而通過TYPE定義的內表只能間接擁有被參照結構類型的元素結構,結構類型不能作為內表的工作區,只有結構體對象才可以.
內表定義語法:
1.標準表:可指定或不指定關鍵字,可重復.邏輯索引,操作數據時數據內存位置不巒,系統只重排數據行的索引值.
DATA itab TYPE|LIKE [STANDARD] TABLE OF structure [WITH KEY comp1 ... compn(DEFAULT KEY) WITH HEADER LINE INITIAL SIZE n].
2.排序表:可指定唯一或不唯一的關鍵字,也可不指定,邏輯索引,按關鍵字升序存儲.
DATA itab TYPE|LIKE SORTED TABLE OF structure [WITH NON-UNIQUE(UNIQUE) KEY comp1 ... compn(DEFAULT KEY) WITH HEADER LINE INITIAL SIZE n].
3.哈希表:必須指定唯一關鍵字.無索引
DATA itab TYPE|LIKE HASHED TABLE OF structure WITH UNIQUE KEY comp1 ... compn(DEFAULT KEY) [WITH HEADER LINE INITIAL SIZE n].
注:如果n值為0或不指定的話,程序會為內表對象分配8KB大小內存,所以,如果內表比較小,不要把該值設為0,以避免內存浪費.
舊版標準表定義語法:
DATA itab TYPE|LIKE [STANDARD] TABLE OF structure OCCURS n.或者
DATA:BEGIN OF itab OCCURS n,
...,
fi...,
END OF itab.
4.6.2操作內表行
| 標準表 | 排序表 | 哈希表 |
索引訪問 | 允許 | 允許 | 不允許 |
關鍵字訪問 | 允許 | 允許 | 允許 |
相同值關鍵字行 | 可重復 | 可重復或不可重復 | 不可重復 |
推薦訪問方式 | 主要通過索引 | 主要通過關鍵字 | 只能通過關鍵字 |
注:CLEAR itab[].表示操作的是內表對象.而CLEAR itab.當itab有表頭行時表示操作表頭行,如無表頭行時表示操作內表對象.
當一個操作語句結束后,SY-TABIX返回該行的索引值,對於所有行操作,如果訪問成功,SY-SUBRC返回0,否則返回非0值.
4.插入行—INSERT
l INSERT structure INTO itab INDEX idx.無表頭行索引表,itab的行數應大於或等于idx-1.否則失敗
l INSERT itab INDEX idx.有表頭行索引表.
l 對于哈希表,系統按關鍵字將新行插入特定位置.
l INSERT structure INTO|INITIAL LINE INTO TABLE itab.此語句對於標準表來說與append效果相同,對於排序表來說,插入的行不可以打亂按照關鍵字排序的順序,否則插入不成功,對於哈希表來說,插入過程中系統按照關鍵字對行進行定位.INITIAL關鍵字是用于向內表中插入結構中各類型的初始值的.
l INSERT LINES OF itab1 [FROM n1] [TO n2] INTO [TABLE] itab2 [INDEX idx].將內表中部分或全部數據行整體插入到另一內表中,指定行數時itab1,itab2必須為索引表,指定TABLE關鍵字時,itab2可以是任意內表.此方式比其它方式快20倍左右.
5.附加行—APPEND(只能操作索引表)
APPEND [structure TO|INITIAL LINE TO] itab.
APPEND LINES OF itab1 [FORM n1] [TO n2] TO itab2.
6.聚集附加—COLLECT
COLLECT line INTO itab.對於需要附加的數據,如果在內表中存在關鍵字內容與其相同的數據行,則此語句將需要附加的數據累加到內表中的這一行上,而不會另外再添加一行,操作成功后,SY-TABIX返回被處理過的行的索引.
注:關鍵字以外的所有字段必須是數字類型
7.讀取行—READ(可用於任何類型內表)
l READ TABLE itab [INTO wa|ASSIGNING <fs>] INDEX idx.通過索引讀取內表中的單行數據. ASSIGNING表表示指派給字段符號.
l READ TABLE itab FROM structure [INTO wa|ASSIGNING <fs>].讀取與結構相同的工作區中的關鍵字內容全部相同的內表數據.
l READ TABLE itab WITH TABLE KEY field1 = v1 ... field2 = v2 [INTO wa|ASSIGNING <fs>].指定所有關鍵字值,並讀取相等時內表行.
l READ TABLE itab WITH KEY field1 = v1 ... field2 = v2 [INTO wa|ASSIGNING <fs>].讀取內表中字段fieldn(不一定是表關鍵字段)與值vn相同時的內表行.
8.修改行—MODIFY
l MODIFY itab [FROM wa] [INDEX idx] [TRANSPORTING f1 f2 ...].如果內表包含的行數少於idx,則不更改任何行.
l MODIFY TABLE itab FROM wa [TRANSPORTING f1 f2 ...].根據工作區wa中關鍵字修改內表行, TRANSPORTING表示修改指定字段值.
l MODIFY itab FROM wa TRANSPORTING f1 f2 ... WHERE condition.修改符合WHERE子句中條件的內表中的指定字段值.
9.刪除行—DELETE
l DELETE itab INDEX idx.根據索引刪除內表行.
l DELETE TABLE itab FROM wa.根據工作區關鍵字刪除行.
l DELETE TABLE itab WITH TABLE KEY field1 = v1 ... field2 = v2.根據指定關鍵字值刪除行.
l DELETE itab [FROM n1] [TO n2] [WHERE <condition>].
10.循環處理--LOOP
LOOP AT itab [INTO wa] [FROM n1] [TO n2] [WHERE condition].
<statement block>.
ENDLOOP.
4.6.3操作整個內表
1.排序
SORT itab [ASCENDING|DESCENDING] [AS TEXT] [STABLE]
[BY f1 [ASCENDING|DESCENDING] [AS TEXT]
......
f1 [ASCENDING|DESCENDING] [AS TEXT]]
說明:
l ASCENDING|DESCENDING:升序或降序.默認升序.
l AS TEXT:根據當前語言按字母順序排序字符字段,否則按字符平台相關內部編碼進行排序.
l STABLE:保持排序前后不需要改變的數據行的相對順序.
2.控制級操作(用于總計,縮進,格式控制等)
AT FIRST|LAST|NEW f|END OF f.
<statement block>
ENDAT.
說明:
l FIRST:當循環為內表的第一行時,執行語句塊中語句.在工作區中,系統用*填充所有關鍵字內容.
l LAST: 當循環為內表的最后一行時,執行語句塊中語句. 在工作區中,系統用*填充所有關鍵字內容.
l NEW f:字段f前面(即左邊)的全部字段內容之一不同於上一行時, 執行語句塊中語句.在工作區中,系統用*填充f后面所有關鍵字內容.
l END OF f:如果下一行行組中的任何字段內容不同於上一行, 執行語句塊中語句.在工作區中,系統用*填充f后面所有關鍵字內容.
注:在控制級操作期間,在工作區中,對於非標準關鍵字段,將全部進行初始化,在執行完控制操作后(即ENDAT語句后)工作區中的數據將全部還原到進入控制級操作語句前(即進入AT前)狀態.
3.初始化內表
l CLEAR itab.:帶表頭行時只清空表頭行,不帶表頭行時清空整個內表.
l CLEAR itab[].:只清空整個內表對象數據.不清空表頭行.
l REFRESH itab或REFRESH itab[].:只清空整個內表對象數據.不清空表頭行.
l FREE itab.或FREE itab[].:只清空整個內表對象數據.不清空表頭行,同時釋放內存.
l ......itab IS INITIAL....:檢查內表是否為空.
4.整體復制內表
l MOVE itab1 TO itab2.:如果兩表都存在表頭行,則此語句只復制了表頭行.
l MOVE itab1[] TO itab2[].:指定表體復制.
l MOVE itab1[] TO itab2.:表itab2無表頭行時才成立.
l itab2 = itab1.同上1
l itab2[] = itab1[].同上2
l itab2 = itab1[].同上3
5.比較內表大小
... itab1 <operator> itab2...:其中<operator>可以為=,<>,><,>=,<=,>,<等.
4.6.4Extract Datasets
l FIELD-GROUP fg.行結構分配.
l INSERT f1 f2 ... INTO fg.生成字段組fg的具體字段結構.
l EXTRACT fg.將字段組填充給EXTRACT.
l SORT.排序.
l LOOP. <statement block> ENDLOOP.循環輸出EXTRACT.
4.7動態數據對象
4.7.1字段符號
l FIELD-SYMBOLS <fs> [TYPE type|LIKE dobj].聲明字段符號.
l ASSIGN f TO <fs>.靜態分配數據對象給字段符號.
l ASSIGN f[+i] [(j)] TO <fs>.指定偏移量和長度.
l ASSIGN (f) TO <fs>.動態分配,先找到字段f的內容,然后將該內容分配給<fs>.
4.7.2數據引用
TYPES t_dref TYPE REF TO DATA.
DATA dref TYPE REF TO DATA.
4.8模塊化技術
4.8.2子程序
1.定義:
FORM subr [[USING [VALUE(p1)]... ] [TYPE t|LIKE f]...] [TYPE ANY]
[CHANGING [VALUE(p1)] ... ] [TYPE t|LIKE f]...] [TYPE ANY].
<subr codes>
ENDFORM.
注:
l VALUE參數表未示值傳遞,此方式在子程序調用后實參的值不會被改變.
l 無VALUE參數時表示引用傳遞,會改變實參的值.
l USING與CHANGING無任何區別.
l 位于兩個子程序間的代碼不屬于任何事件塊.
l 參數傳遞時不存在類型轉換,要求必須兼容.
2.調用:
PERFORM subr [USING p1 ... pn] [CHANGING pi ... pj].
4.8.3功能模塊(p153)
4.8.5源代碼復用
1.包含程序
包含程序是單純的代碼復用,不是可執行程序,不能單獨運行,必須被其它程序調用,包含程序不能調用自身.
INCLUDE incl.包含程序調用,此語句必須獨占一行.
2.宏:(語句塊中最多只能包含9個占位符&1...&9).
例:
DATA:result TYPE i,
int1 TYPE i VALUE 1,
int2 TYPE i VALUE 2.
DEFINE operation.
result = &1 &2 &3.
output &1 &2 &3 result.
END-OF-DEFINITION.
DEFINE output.
write: / 'The result of &1 &2 &3 is',&4.
END-OF-DEFINITION.
operation 1 + 2.
operation int2 - int1.
4.9.1靜態錯誤檢查
1.語法檢查:用Check鍵.
2.擴展語法檢查(SLIN):在ABAP初台界面輸出程序名后,選擇Program->Check->Extended Syntax Check.àStandard.
4.9.2運行時錯誤控制
1.可捕捉的錯誤
CATCH SYSTEM-EXCEPTIONS exc1 = rc1 ... excn = rcn.
...
ENDCATCH.
其中exci表示一個單一可捕捉錯誤或者一個ERROR類,rci則代表一個數字.如果其中錯誤之一在CATCH和ENDCATCH語句之間出現,程序就不會中止,而是直接跳至ENDCATCH后,把系統指定的錯誤代碼rci賦給字段SY-SUBRC.此語句可嵌套.例如:
DATA:result1 TYPE p DECIMALS 3,
number TYPE i VALUE 11.
CATCH SYSTEM-EXCEPTIONS arithmetic_errors = 5.
DO.
number = number - 1.
result1 = 1 / number.
WRITE: / number,result1.
ENDDO.
ENDCATCH.
IF sy-subrc = 5.
WRITE / 'division by zero!'.
ENDIF.
2.不可捕捉的錯誤(通過ST22查看,在SAP系統中保存14天,可通過Keep功能保存更長時間).