ABAP基础
數(shù)據(jù)類型
C :字符串
D :日期型 格式為 YYYYMMDD? 例:'1999/12/03'
F : 浮點數(shù)? 長度為8
I :整數(shù)
N :數(shù)值組成的字符串 如:011,'302'
P : PACKED數(shù) 用于小數(shù)點數(shù)值? 如:12.00542
T : 時間 格式為:HHMMSS 如:'14:03:00'
X : 16進制數(shù) 如:'1A03'
*-------------------------------------------------------------------------------------*
變數(shù)宣告
DATA <F> [<Length>] <type> [<value>][decimals]
???? <F> 變數(shù)名稱
???? <length><type> 變數(shù)類型 及 長度
???? <value> 初值
???? <decimals> 小數(shù)位數(shù)
????
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.
?另外,有關(guān)DATA宣告的指令還有: CONSTANTS(宣告常數(shù))STATICS(臨時變數(shù)宣告).
exp:
?CONSTANTS? PI? TYPE? P? DECIMALS? 5? VALUE? '3.14159'.
?STATICS 敘述
?宣告的變數(shù)僅在目前的程式中使用, 結(jié)束后會自動釋放
?語法:?
??????? STATICS <c> [<length>] <type> [<value>] [<decimals>]
?
系統(tǒng)專用變數(shù)說明
?? 系統(tǒng)內(nèi)部專門創(chuàng)建了SYST這個STRUCTURE,里面的欄位存放系統(tǒng)變數(shù),常用的系統(tǒng)變數(shù)有:
?? SY-SUBRC :? 系統(tǒng)執(zhí)行某指令后,表示執(zhí)行成功與否的變數(shù),'0' 表示成功
?? SY-UNAME:? 當前使用者登入SAP的USERNAME;
?? SY-DATUM:? 當前系統(tǒng)日期;
?? SY-UZEIT:??? 當前系統(tǒng)時間;
?? SY-TCODE:?? 當前執(zhí)行程式的Transaction code
?? SY-INDEX :?? 當前LOOP循環(huán)過的次數(shù)
?? SY-TABIX:? 當前處理的是internal table 的第幾筆
?? SY-TMAXL: Internal table的總筆數(shù)
?? SY-SROWS: 屏幕總行數(shù);
?? SY-SCOLS:? 屏幕總列數(shù);
?? SY-MANDT: CLIENT NUMBER
?? SY-VLINE:? 畫豎線
?? SY-ULINE:? 畫橫線
??
TYPE 敘述
? 用來指定資料型態(tài)或宣告自定資料型態(tài)
? 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 用在已有值的資料項, 如系統(tǒng)變數(shù), 而TYPE敘述則是用
?? 在指定資料型態(tài)
??
*-------------------------------------------------------------------------------------*
輸出
一. WRITE 語句
ABAP/4用來在屏幕上輸出資料的指令是WRITE指令,例如:
???? WRITE: 'USER NAME IS:', SY-UNAME.
二. 指定屏幕輸出位置
指定輸出位置的語句格式為:
????? WRITE: [AT] [ / ] [<pos>] [(<len>)] 資料項 [<par>]
其中: / : 在下一行輸出
<pos>: 指定輸出的行號;
(<len>):指定輸出位數(shù)(長度)
<par>: 指定顯示格式參數(shù),參數(shù)有:
????????? LEFT-JUSTIFIED? 資料靠左對齊
????????? CENTERED?????? 資料靠中間對齊
????????? RIGHT-JUSTIFIED 資料靠右對齊
????????? UNDER <g>?????? 正對在資料項<g>的下面顯示
????????? NO-GAP????????? 緊接著顯示,不留空格
????????? USING EDIT MASK <m>: 使用內(nèi)嵌子元顯示, 如 12:03:20
????????? USING NO EDIT MASK: 不使用內(nèi)嵌子元
????????? NO-ZERO:??????? 數(shù)字前面 0 的部分不顯示
????????? NO-SIGN:???????? 不顯示正負號
????????? DECIMALS <d>:??? 顯示 <d> 位小數(shù)
????????? EXPOENT <e>:??? F(浮點數(shù))指數(shù)的值
????????? ROUND <r>:????? 四舍五入至小數(shù)點后<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'.
輸出結(jié)果為:??????? ABCDEF
例如2: DATA: X TYPE I VALUE '112030',
???????????? A(5)? TYPE C VALUE 'AB?? CDE'.
????? WRITE: / X USING EDIT MASK '__:__:__'.
????? WRITE: / X USING EDIT MASK '$___,___'.
????? WRITE: / Y NO-GAP.
輸出結(jié)果為:
??????? 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 語句的基本 形式
要將值(文 字)或源字 段內(nèi)容寫入 目標字段, 可以使用 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.
在此,三條 運算語句進 行相同算術(shù) 運算
輸出屏幕上 的線和空行
用下列語法 ,可以在輸 出屏幕上生 成水平線:
語法
ULINE [AT [/][<pos>][(<len>)]].
它等同于
WRITE [AT [/][<pos>][(<len>)]] SY-ULINE.
AT 后的格式規(guī) 范,與在 在屏幕上定 位 WRITE 輸出 (頁 28) 中為 WRITE 語句說明的 格式規(guī)范完 全一樣
如果沒有格 式規(guī)范,系 統(tǒng)則開始新 的一行,并 用水平線填 充該行否 則,只按指 定輸出水平 線
生成水平線 的另一種方 法,是在 WRITE 語句中鍵入 恰當數(shù)量的 連字符,如 下所示:
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.
要查看系統(tǒng)所提供有那些符號及圖示,可選擇'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.
本示例創(chuàng)建 與上例相同 的內(nèi)表數(shù)據(jù) 類型(VECTOR 和 ITAB) 然后創(chuàng)建 數(shù)據(jù)類型 DEEPLINE 作為字段串 ,包含這些 內(nèi)表作為組 件通過該 字段串,數(shù) 據(jù)類型 DEEPTABLE 被創(chuàng)建為內(nèi) 表因此該 內(nèi)表的元素 本身就是內(nèi) 表
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.
同 創(chuàng)建內(nèi)表數(shù) 據(jù)類型 (頁 99) 中所示,該 示例創(chuàng)建數(shù) 據(jù)類型 ITAB 作為內(nèi)表 通過使用 DATA 語句的 TYPE 參數(shù)引用 ITAB, 使數(shù)據(jù)對象 TAB1 與 ITAB 結(jié)構(gòu)相同 通過使用 DATA 語句的 LIKE 參數(shù)引用 TAB1, 使數(shù)據(jù)對象 TAB2 結(jié)構(gòu)相同 創(chuàng)建的 TAB2 帶表頭行 因此,可以 在程序中使 用 TAB2-COLUMN1 TAB2-COLUMN2 和 TAB2-COLUMN3 等定位表格 工作區(qū)域 TAB2
exp :
DATA FLIGHT_TAB LIKE SFLIGHT OCCURS 10.
本示例創(chuàng)建 數(shù)據(jù)對象 FLIGHT_TAB, 其結(jié)構(gòu)與數(shù) 據(jù)庫表格 SFLIGHT 相同
?
本示例介紹 如何采用兩 種不同的步 驟創(chuàng)建同一 內(nèi)表
TYPES VECTOR_TYPE TYPE I OCCURS 10.
DATA VECTOR TYPE VECTOR_TYPE WITH HEADER LINE.
在此創(chuàng)建一 個內(nèi)表數(shù)據(jù) 類型 VECTOR_TYPE, 其行包含首 先創(chuàng)建的基 本類型 I 字段然后 ,通過引用 VECTOR_TYPE 創(chuàng)建數(shù)據(jù)對 象 VECTOR 通過使用 WITH HEADER LINE 選項還創(chuàng)建 表格工作區(qū) 域 VECTOR 在這種情況 下,表格工 作區(qū)域包含 一種類型 I 字段,可以 通過名稱 VECTOR 定位
DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.
在這種情況 下,通過直 接在 DATA 語句中使用 OCCURS 選項創(chuàng)建完 全一樣的數(shù) 據(jù)類型 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 的區(qū)別是: COLLECT指令在非數(shù)值欄位相同的情況下,將數(shù)值欄位匯總.
格式:? 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筆數(shù)據(jù), 分別為:
?????? 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,工作區(qū)中的元素.
[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-TABIX為Table位置
???????????????? ENDLOOP.
???????????????? 執(zhí)行結(jié)果:
??????????????????????????? 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.
執(zhí)行結(jié)果同樣是:
ITAB-COL1 =????? 3
ITAB-COL2 =????? 6.
???????? Example:
?????????????????? READ? TABLE? ITAB? INTO? LINE? INDEX? 5
?????????????????? 讀取 ITAB的第5個元素資料, 放入 LINE的欄位中
根據(jù)欄位內(nèi)容尋找
?? 語法:
????????? READ? TABLE? <itab>? INTO? <wa>
????????? Example:
????????????????? ITAB-COL1 = 'ABC'.
????????????????? READ? TABLE? ITAB? INTO? LINE.
????????????????? 找出ITAB 中 COL1 欄位內(nèi)容是 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 根據(jù) COL2欄位遞減排序
*-------------------------------------------------------------------------------------*
確定內(nèi)表屬 性
如果在處理 過程中想知 道內(nèi)表一共 包含多少行 ,或者想知 道定義的 OCCURS 參數(shù)的大小 ,請使用 DESCRIBE 語句,用法 如下:
語法
DESCRIBE TABLE <itab> [LINES <lin>] [OCCURS <occ>].
如果使用 LINES 參數(shù),則將 填充行的數(shù) 量寫入變量 <lin> 如果使用 OCCURS 參數(shù),則將 行的初始號 寫入變量 <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
在此創(chuàng)建內(nèi) 表 ITAB 在填充表格 前后執(zhí)行 DESCRIBE 語句更改 當前行號, 但無法更改 初始行號
*-------------------------------------------------------------------------------------*
加總
SUM.
總和計算存放與work area中,但只能在LOOP 中使用.
例: LOOP AT ITAB INTO LINE.
???????? SUM.
?? ENDLOOP.
?? WRITE: / LINE-COL1, LINE-COL2.
?? LINE-COL1 和 LINE-COL2 存數(shù)值總和初始化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 語句重置任 何數(shù)據(jù)對象 值,如下所 示:
語法
CLEAR <f>.
exp:
DATA NUMBER TYPE I VALUE '10'.
WRITE NUMBER.
CLEAR NUMBER.
WRITE / NUMBER.
輸出為:
??????? 10
???????? 0
CLEAR 語句將字段 NUMBER 的內(nèi)容從10 重置為默認 值 0
*-------------------------------------------------------------------------------------*
? ?添加字段 順序并將結(jié) 果賦給另一 個字段
語法
ADD <n1> THEN <n2> UNTIL <nz> GIVING <m>.
如果 <n1> <n2> ... <nz> 是在內(nèi)存中 相同類型和 長度的等距 字段序列, 則進行求和 計算并將結(jié) 果賦給 <m>
? ?添加字段 順序并將結(jié) 果添加到另 一個字段的 內(nèi)容中
語法
ADD <n1> THEN <n2> UNTIL <nz> TO <m>.
該語句除了 將字段總和 添加到 <m> 的舊內(nèi)容中 之外,與上 面語句的工 作方式相同
有關(guān)其它相 似變體的信 息,參見有 關(guān) ADD 語句的關(guān)鍵 字文檔
?
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 組件內(nèi)容求 和并將其值 賦給字段 SUM然 后,將 N2 到 N6組件求 和并將其添 加到 SUM 的值中
*-------------------------------------------------------------------------------------*
?????????
屏幕輸入命令
在ABAP/4中要從螢?zāi)惠斎胱兞? 使用的命令是 PARAMETERS 及SELECTION-OPTIONS:
??? 1. PARAMETER: 輸入一個變量或欄位內(nèi)容
??? 2. SELECTION-OPTIONS: 使用條件篩選畫面來輸入數(shù)據(jù)???
PARAMETERS 指令
基本的輸入命令, 類似如BASIC的INPUT命令, 但無法使用F格式(浮點數(shù))
??? 語法:
??????? PARAMETERS? <p>? [DEFAULT <f>]? [LOWER CASE]
?????????????????????????? [OBLIGATORY]? [AS CHECKBOX]
?????????????????????????? [RADIOBUTTON GROUP <rad>]
?????? Example:
??????????? PARAMETERS:? NAME(8),
?????????????????????????? AGE? TYPE? I,
?????????????????????????? BIRTH? TYPE? D.
??????????? 執(zhí)行結(jié)果:????????????
在日期的輸入格式上為 MM/DD/YY , MM/DD/YYYY, MMDDYY或MMDDYYYY , 如輸入 020165表 1965年02月01日, 與02/01/65的輸入是一樣的, 日期輸入范圍為西元1950年至2049年
1.?DEFAULT
設(shè)定輸入的預(yù)設(shè)值
Example:
?? PARAMETERS:? COMPANY(20)? DEFAULT? 'DELTA',
?????????????????? BIRTH? TYPE? D? DEFAULT? '19650201'.
2.?? LOWER CASE
???? ABAP/4預(yù)設(shè)是將字串輸入值自動轉(zhuǎn)換為大寫, 加上此參數(shù)會將輸入的資料轉(zhuǎn)成小寫,
3.?? OBLIGATORY
強制要求輸入, 螢?zāi)簧蠒霈F(xiàn)一個 ? , 使用者必須要輸入才可.
4.?? AS CHECKBOX
?輸入 CHECKBOX的格式
?Example:
????????? PARAMETERS:? TAX? AS? CHECKBOX? DEFAULT 'X',
???????????????????????? NTD? AS? CHECKBOX.
????????? 執(zhí)行結(jié)果:
???
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讀取符合條件的資料, 直接執(zhí)行或放入 Internal Table中, 條件有四個參數(shù):
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>
設(shè)定開始結(jié)束范圍輸入預(yù)設(shè)值
???? Example:
???? SELECT-OPTIONS? AIRLINE? FOR? SPFLI-CONNID DEFAULT? '2042'? TO? '4555'.
2.?NO-EXTENSION
設(shè)定不要Multi-Option輸入畫面
3.?NO? INTERVALS
設(shè)定不要區(qū)間范圍輸入畫面
4.?LOWER CASE
輸入轉(zhuǎn)換成大寫
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參數(shù)
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.產(chǎn)生空白列
語法:
????? SELECTION-SCREEN? SKIP? [<n>]
????????? Example:
?????????????????? SELECTION-SCREEN? SKIP? 2.
?????????????????? 產(chǎn)生兩列空白列
??? 2.產(chǎn)生底線
語法:
????? SELECTION-SCREEN? ULINE? / <pos>(length)
????????? Example:
?????????????????? SELECTION-SCREEN? ULINE? /10(30).
?????????????????? 自第10格開始產(chǎn)生長度30的底線
?? 3.印出備注說明
???? 語法:
????? SELECTION-SCREEN? COMMENT? / <pos>(length)? <name>
????????? Example:
?????????????????? REMARK = 'Pls enter your name'.
?????????????????? SELECTION-SCREEN? COMMENT? /10(30)? REMARK.
??? 4. 同一列中輸入數(shù)個資料項
語法:
????? 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內(nèi)容, 40格輸入 BIRTH的內(nèi)容
??? 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程式的時候,經(jīng)常需要從TABLE中根據(jù)某些條件讀取數(shù)據(jù),.讀取數(shù)據(jù)最常用的方法就是通過SQL語法實現(xiàn)的.
ABAP/4中可以利用SQL語法創(chuàng)建或讀取TABLE,SQL語法分為DDL(DATA DEFINE LANGUAGE)語言和DML(DATA MULTIPULATION LANGUAGE)語言,DDL語言是指數(shù)據(jù)定義語言,例如CREATE等, DML語言是數(shù)據(jù)操作語言,例如SELECT, INSERT等語句. SQL語句有OPEN SQL語句和NATIVE SQL語句.? OPEN SQL語句不是標準SQL語句,是ABAP/4語言,利用OPEN SQL語句能在Databases 和 Command 之間產(chǎn)生一個BUFFER,所以它有一個語言轉(zhuǎn)換的過程.
而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>排序的欄位及方式
相關(guān)的系統(tǒng)變量:
???? SY-SUBRC = 0? 表示讀取數(shù)據(jù)成功
?????????????? <> 0 表示未找到符合條件的記錄
???? SY-DBLNT: 被處理過的記錄的筆數(shù).
相關(guān)的命令:
???? EXIT. 退出循環(huán).
???? CHECK <logistic statement>.如果邏輯表達式成立,則繼續(xù)執(zhí)行,否則,開
??????????????????????????? 始下一次循環(huán).
??
利用循環(huán)方式讀取所有記錄
SELECT .ENDSELECT.是循環(huán)方式讀取記錄的.
???? 例如:
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.
(將讀取的結(jié)果放在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.
數(shù)據(jù)庫表名 稱 SPFLI 被賦給字符 字段 NAME SELECT 語句將所有 的行從 SPFLI 中讀到目標 區(qū) WA 中在該示 例中,WA 與 SPFLI 的結(jié)構(gòu)并不 相同,每一 行都將自動 地轉(zhuǎn)換成字 符字段.
舉例二.
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 工作區(qū)中
舉例三.
將讀取的資料寫入 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.
輸出如下所 示:
在該示例中 ,系統(tǒng)只將 數(shù)據(jù)庫表 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.
(利用參數(shù)ORDER BY所指定的欄位排序)
*-------------------------------------------------------------------------------------*
?抓取數(shù)據(jù)的條件敘述
(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.
??????? 根據(jù) 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不重復(fù)加入.
?? 加入一筆記錄至資料庫
?? 1.自 Work Area 工作區(qū)
?? 語法:
??????? 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的結(jié)構(gòu)與資料檔 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 指令
?? 異動已存在的記錄內(nèi)容
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>
??????? 根據(jù)條件式異動符合條件式的記錄
??????? Example:
???????????????? UPDATE? SPFLI? SET? NO='34051920'
??????????????????????????????????????? COMPANY = 'DELTA'
????????????????????????????????? WHERE? TEL='4526107'.
*-------------------------------------------------------------------------------------*
3.?? MODIFY 語法
???? MODIFY <internal table> [FROM <work area>].
根據(jù) 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>
??????? 根據(jù)條件式刪除符合條件式的記錄
??????? Example:
???????????????? DELETE? FROM? SPFLI? WHERE? AREA = 'AMERICAN'.
???????????????????????????????????????
*-------------------------------------------------------------------------------------*
5.?DATABASE CURSOR
?? Database Cursor是一個資料庫暫存區(qū), 將經(jīng)SELECT指令讀取的記錄存放至此暫存區(qū), 再由此暫存區(qū)放至Work Area中, 可減少資料庫讀取的次數(shù).
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.
關(guān)閉 Database Cursor
語法:
????? CLOSE? CURSOR? <c>
????? Example:
?????????????? CLOSE? CURSOR? C1.
*-------------------------------------------------------------------------------------*
COMMIT WORK & ROLLBACK WORK
要確定資料成功寫入資料庫,可使用COMMIT WORK指令,如:
?? COMMIT? WORK.
相反的, 如果反悔要復(fù)原, 可使用 ROLLBACK? WORK, 可復(fù)原在上個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命令執(zhí)行結(jié)果是抓到多筆記錄,我們想要逐筆記錄處理時,就用PERFORMING 參數(shù),這個FORM能被逐次調(diào)用.如果想中止調(diào)用,就用EXIT FORM SQL結(jié)束調(diào)用.
例如:
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權(quán)限的功能;
c.?在登入SAP R/3系統(tǒng)時,我們已經(jīng)自動與Database連接,所以在執(zhí)行NATIVE
SQL時并不需要CONNECT語句;
d.?一條NATIVE SQL語句可以以分號;結(jié)束,一般情況下是以句號.結(jié)束.
e.?某些數(shù)據(jù)庫系統(tǒng)對TABLE名字和FIELD名字有大小寫區(qū)別,要正確書寫.
f.?在NATIVE SQL中,雙引號"不表示注釋.
*-------------------------------------------------------------------------------------*
結(jié)果語句
條件述敘
?? 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? <變數(shù)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.
??????????????? 執(zhí)行結(jié)果:
?????????????????????????? X
?????????????????????????? X
??????????????? DO? VARYING? I? FROM1? TO? 10.
?????????????????? S = S + I.
??????????????? ENDDO.
??????????????? WRITE: / ,'1+2+3++10=',S
??????????????? 執(zhí)行結(jié)果:? 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.
???????????? 執(zhí)行結(jié)果為: 1+2+3++10=55
迥圈控制敘述
1.?CONTINUE
跳至迥圈的下一次
Example:
??????? DO? 3? TIMES.
?????????? IF? SY-INDEX = 2.
???????????? CONTINUE.
?????????? WRITE / SY-INDEX.
??????? ENDDO.
??????? 執(zhí)行結(jié)果:
????????????????? 1
????????????????? 3
2.?CHECK <Condition>
CHECK 之后條件成立才繼續(xù)往下執(zhí)行迥圈
? Example:
?????????? DO? 5? TIMES.
????????????? CHECK? SY-INDEX? BETWEEN? 2? AND? 4.
????????????? WRITE? /? SY-INDEX.
?????????? ENDDO.
?????????? 執(zhí)行結(jié)果:
???????????????????? 2
???????????????????? 3
???????????????????? 4
3.?EXIT
跳離迥圈敘述
Example:
???????? DO? 10? TIMES.
??????????? IF? SY-INDEX = 4.
????????????? EXIT.
??????????? ENDIF
??????????? WRITE / SY-INDEX.
???????? ENDDO.
???????? 執(zhí)行結(jié)果:
?????????????????? 1
?????????????????? 2
?????????????????? 3
無窮迥圈
?? DO .
???? <Statement Block>
?? ENDDO.
?? 無窮迥圈必須配合 EXIT 敘述來執(zhí)行
*-------------------------------------------------------------------------------------*
搜索字符串
要搜索特定 模式的字符 串,請使用 SEARCH 語句,用法 如下:
語法
SEARCH <c> FOR <str> <options>.
該語句在字 段 <c> 中搜索<str> 中的字符串 如果成功 ,則將 SY-SUBRC 的返回代碼 值設(shè)置為0并 將 SY-FDPOS 設(shè)置為字段 <c> 中該字符串 的偏移量 否則將 SY-SUBRC 設(shè)置為4
搜索串 <str> 可為下列格 式之一:
<str>?目 的
<pattern>?搜 索 <pattern>( 任何字符順 序)忽略 尾部空格
?.<pattern>.?搜 索 <pattern> ,但是不忽 略尾部空格
*<pattern>?搜 索以 <pattern> 結(jié)尾的詞
?<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> 結(jié)果 SY-FDPOS 參照相對于 <n1> 的偏移量而 不是字段的 開始
? ?ENDING AT <n2>
在字段 <c> 搜索 <str> 直到位置 <n2>
? ?AND MARK
如果找到搜 索串,則將 搜索串中的 所有字符( 和使用 ABBREVIATED 時的所有字 符)轉(zhuǎn)換為 大寫形式
?
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 的長度,請 使用內(nèi)部函 數(shù) STRLEN, 用法如下:
語法
[COMPUTE] <n> = STRLEN( <c> ).
STRLEN 將操作數(shù) <c> 作為字符數(shù) 據(jù)類型處理 ,而不考慮 其實際類型 不進行轉(zhuǎn) 換
關(guān)鍵字 COMPUTE 可選有關(guān) 內(nèi)部函數(shù)的 詳細信息, 參見 使用數(shù)學函 數(shù) (頁 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.
結(jié)果分別是 5,0 和 4
*-------------------------------------------------------------------------------------*
Standard Report
?? 一個典型的報表程式是由許多的程式區(qū)塊(Code Block)所組成,在區(qū)塊間最好能加上一些
?? 說明以利程式可讀性,一個典型的報表程式格式如下:
*? 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 ___?? " 每頁報表列數(shù)
????????? LINE-SIZE? ___.? " 每頁報表寬度
*? TABLE DESCRIPTION : 宣告程式會使用的TABLE
*-------------------------------------------------------------------------------------*
TABLES:
???????????????
* DATA : 宣告程式所使用的變數(shù)及自定型態(tài)
*-------------------------------------------------------------------------------------*
TYPES:
DATA:
?????
*? SELECTION SCREEN / OPTION / PARAMETER : 螢?zāi)惠斎雸蟊砗Y選條件
*-------------------------------------------------------------------------------------*
? SELECTION-SCREEN BEGIN OF BLOCK ____
?????? SELECT-OPTIONS:
? SELECTION-SCREEN END OF BLOCK ___
* INITIALIZATION : 啟動程式開始執(zhí)行, 如SELECT-OPTION及PARAMETER
*-------------------------------------------------------------------------------------*
INITIALIZATION.
INCLUDE ____.
* AT START SELECTION : 輸入結(jié)束后啟動的區(qū)塊, 如按下<F8>
*-------------------------------------------------------------------------------------*
START-OF-SELECTION.
? SET PF-STATUS ____.? " 指定報表執(zhí)行時所用的 GUI-STATUS名稱
? PERFORM READ_DATA.
? PERFORM PROCESS_DATA.
? PERFORM PRINT_DATA.
? PERFORM PRINT_SUMMARY.
* AT USER Commaand : 執(zhí)行在GUI-STATUS中自定的命令
*-------------------------------------------------------------------------------------*
AT USER_COMMAND.
* AT LINE SELECTION : 由在報表中按下<F2>或Double-Click啟動
*-------------------------------------------------------------------------------------*
AT LINE-SELECTION.
* TOP OF PGAE : 每頁開始列印時執(zhí)行, 用於定義報表表頭
*-------------------------------------------------------------------------------------*
* END OF PAGE : 報表列印完最后一頁后啟動
*-------------------------------------------------------------------------------------*
END-OF-PAGE
* END OF SELECTION : 在結(jié)束列印資料后啟動, 如可用來印出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 : 印出數(shù)值資料加總
*-------------------------------------------------------------------------------------*
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
?????? 使用邏輯數(shù)據(jù)庫,自動產(chǎn)生
*
事件塊
INITIALIZATION
AT SELECTION-SCREEN
START-OF-SELECTION
GET
END-OF-SELECTION
TOP-OF-PAGE
END-OF-PAGE
*
事件塊的簡單處理過程:
*
ABAP程序運行的時候,INITIALIZATION首先被調(diào)用;
經(jīng)過初始化的輸入屏幕會顯示在表示服務(wù)器;
用戶離開輸入屏幕的時候,START-OF-SELCTION事件會被自動調(diào)用;
結(jié)果數(shù)據(jù)會以列表的形式顯示在第二個屏幕上;
*
源代碼中的事件塊順序不影響它們的執(zhí)行順序
*
事件塊編碼規(guī)則(1)
INITIALIZATION
??? 通常在此事件塊中設(shè)定輸入屏幕字段的初始值
*
事件塊編碼規(guī)則(2)
AT SELECTION-SCREEN
??? 通常在此事件塊中進行用戶輸入數(shù)據(jù)的合法性檢查,發(fā)現(xiàn)錯誤則以消息的形式給出警示,直到用戶輸入正確的數(shù)值
例如: AT SELECTION-SCREEN .
??????????????????? IF P_DATE = SPACE .
??????????????????????? MESSAGE E001 .
??????????????????? ENDIF.
??? 效果: 如果字段P_DATE為空,則程序會用消息001日期字段不能為空!來提示用戶必須輸入一個日期而且輸入屏幕會等待用戶輸入,知道該字段數(shù)值合法
*
事件塊編碼規(guī)則(3)
START-OF-SELCTION
??? 通常在此事件中針對業(yè)務(wù)需求進行系統(tǒng)數(shù)據(jù)的查詢
例如:
???? start-of-selection .
????????? perform get_data_for_oil .
效果:
???? 在輸入屏幕用戶按下執(zhí)行按鈕后,子程序get_data_for_oil被執(zhí)行,? 在其中獲得業(yè)務(wù)相關(guān)的數(shù)據(jù)存放到內(nèi)表或者其它變量,這些數(shù)據(jù)在END-OF-SELECTION事件塊中被輸出
*
事件塊編碼規(guī)則(4)
END-OF-SELCTION
??? 通常在此事件中進行結(jié)果清單的輸出
例如:
??? end-of-selection .
???????? write : 23(1) sy-vline,
?????????? 24(20) tab-gas_plan right-justified ,
效果:
??? 數(shù)據(jù)以清單的形式輸出
*
事件塊編碼規(guī)則(5)
GET
??? 從邏輯數(shù)據(jù)庫中得到數(shù)據(jù)(較少用)
??? 在此事件塊中設(shè)計輸出清單的頁頭
TOP-OF-PAGE
?????????????????? write : /1(240) '汽柴油日出廠情況表' centered .
?????????????????? write : /20(8) '日期:' ,
?????????????????????????????? 29(10) s_date ,
?????????????????????????????? 180(6) '單位:' ,
?????????????????????????????? 190(10) '噸' .
*
事件塊編碼規(guī)則(6)
END-OF-PAGE
??? 在此事件中設(shè)定輸出清單的頁腳
例如:
??? END-OF-PAGE .
總結(jié)
- 上一篇: ABAP中接收.NET语言byte[]类
- 下一篇: NUMERIC_CHECK函数解析