ABAP基础
數(shù)據(jù)類(lèi)型
C :字符串
D :日期型 格式為 YYYYMMDD? 例:'1999/12/03'
F : 浮點(diǎn)數(shù)? 長(zhǎng)度為8
I :整數(shù)
N :數(shù)值組成的字符串 如:011,'302'
P : PACKED數(shù) 用于小數(shù)點(diǎn)數(shù)值? 如:12.00542
T : 時(shí)間 格式為:HHMMSS 如:'14:03:00'
X : 16進(jìn)制數(shù) 如:'1A03'
*-------------------------------------------------------------------------------------*
變數(shù)宣告
DATA <F> [<Length>] <type> [<value>][decimals]
???? <F> 變數(shù)名稱(chēng)
???? <length><type> 變數(shù)類(lèi)型 及 長(zhǎng)度
???? <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í)變數(shù)宣告).
exp:
?CONSTANTS? PI? TYPE? P? DECIMALS? 5? VALUE? '3.14159'.
?STATICS 敘述
?宣告的變數(shù)僅在目前的程式中使用, 結(jié)束后會(huì)自動(dòng)釋放
?語(yǔ)法:?
??????? STATICS <c> [<length>] <type> [<value>] [<decimals>]
?
系統(tǒng)專(zhuān)用變數(shù)說(shuō)明
?? 系統(tǒng)內(nèi)部專(zhuān)門(mén)創(chuàng)建了SYST這個(gè)STRUCTURE,里面的欄位存放系統(tǒng)變數(shù),常用的系統(tǒng)變數(shù)有:
?? SY-SUBRC :? 系統(tǒng)執(zhí)行某指令后,表示執(zhí)行成功與否的變數(shù),'0' 表示成功
?? SY-UNAME:? 當(dāng)前使用者登入SAP的USERNAME;
?? SY-DATUM:? 當(dāng)前系統(tǒng)日期;
?? SY-UZEIT:??? 當(dāng)前系統(tǒng)時(shí)間;
?? SY-TCODE:?? 當(dāng)前執(zhí)行程式的Transaction code
?? SY-INDEX :?? 當(dāng)前LOOP循環(huán)過(guò)的次數(shù)
?? SY-TABIX:? 當(dāng)前處理的是internal table 的第幾筆
?? SY-TMAXL: Internal table的總筆數(shù)
?? SY-SROWS: 屏幕總行數(shù);
?? SY-SCOLS:? 屏幕總列數(shù);
?? SY-MANDT: CLIENT NUMBER
?? SY-VLINE:? 畫(huà)豎線(xiàn)
?? SY-ULINE:? 畫(huà)橫線(xiàn)
??
TYPE 敘述
? 用來(lái)指定資料型態(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 用在已有值的資料項(xiàng), 如系統(tǒng)變數(shù), 而TYPE敘述則是用
?? 在指定資料型態(tài)
??
*-------------------------------------------------------------------------------------*
輸出
一. WRITE 語(yǔ)句
ABAP/4用來(lái)在屏幕上輸出資料的指令是WRITE指令,例如:
???? WRITE: 'USER NAME IS:', SY-UNAME.
二. 指定屏幕輸出位置
指定輸出位置的語(yǔ)句格式為:
????? WRITE: [AT] [ / ] [<pos>] [(<len>)] 資料項(xiàng) [<par>]
其中: / : 在下一行輸出
<pos>: 指定輸出的行號(hào);
(<len>):指定輸出位數(shù)(長(zhǎng)度)
<par>: 指定顯示格式參數(shù),參數(shù)有:
????????? LEFT-JUSTIFIED? 資料靠左對(duì)齊
????????? CENTERED?????? 資料靠中間對(duì)齊
????????? RIGHT-JUSTIFIED 資料靠右對(duì)齊
????????? UNDER <g>?????? 正對(duì)在資料項(xiàng)<g>的下面顯示
????????? NO-GAP????????? 緊接著顯示,不留空格
????????? USING EDIT MASK <m>: 使用內(nèi)嵌子元顯示, 如 12:03:20
????????? USING NO EDIT MASK: 不使用內(nèi)嵌子元
????????? NO-ZERO:??????? 數(shù)字前面 0 的部分不顯示
????????? NO-SIGN:???????? 不顯示正負(fù)號(hào)
????????? DECIMALS <d>:??? 顯示 <d> 位小數(shù)
????????? EXPOENT <e>:??? F(浮點(diǎn)數(shù))指數(shù)的值
????????? ROUND <r>:????? 四舍五入至小數(shù)點(diǎn)后<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 語(yǔ)句的基本 形式
要將值(文 字)或源字 段內(nèi)容寫(xiě)入 目標(biāo)字段, 可以使用 WRITE TO 語(yǔ)句:
語(yǔ)法
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.
在此,三條 運(yùn)算語(yǔ)句進(jìn) 行相同算術(shù) 運(yùn)算
輸出屏幕上 的線(xiàn)和空行
用下列語(yǔ)法 ,可以在輸 出屏幕上生 成水平線(xiàn):
語(yǔ)法
ULINE [AT [/][<pos>][(<len>)]].
它等同于
WRITE [AT [/][<pos>][(<len>)]] SY-ULINE.
AT 后的格式規(guī) 范,與在 在屏幕上定 位 WRITE 輸出 (頁(yè) 28) 中為 WRITE 語(yǔ)句說(shuō)明的 格式規(guī)范完 全一樣
如果沒(méi)有格 式規(guī)范,系 統(tǒng)則開(kāi)始新 的一行,并 用水平線(xiàn)填 充該行否 則,只按指 定輸出水平 線(xiàn)
生成水平線(xiàn) 的另一種方 法,是在 WRITE 語(yǔ)句中鍵入 恰當(dāng)數(shù)量的 連字符,如 下所示:
WRITE [AT [/][<pos>][(<len>)]] '-----...'.
垂直線(xiàn)
用下列語(yǔ)法 ,可以在輸 出屏幕上生 成垂直線(xiàn):
語(yǔ)法
WRITE [AT [/][<pos>]] SY-VLINE.
或
WRITE [AT [/][<pos>]] '|'.
空行
用下列語(yǔ)法 ,可以在輸 出屏幕上生 成空行:
語(yǔ)法
SKIP [<n>].
該語(yǔ)句從當(dāng) 前行開(kāi)始, 在輸出屏幕 上生成 <n> 個(gè)空行如 果沒(méi)有指定 <n> 的值,就輸 出一個(gè)空行
要將輸出定 位在屏幕的 指定行上, 請(qǐng)使用:
語(yǔ)法
SKIP TO LINE <n>.
該語(yǔ)句允許 將輸出位置 向上或向下 移動(dòng)
???????
四.?顯示圖示:
語(yǔ)法: 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)所提供有那些符號(hào)及圖示,可選擇'EDIT'下的'Insert Statement',選擇'Write',接下來(lái)選擇要查看的群組,如SYMBOL 或ICON, 接下來(lái)按'Display'即可.
*-------------------------------------------------------------------------------------*
一.?Internal Table 的宣告
ABAP/4中的Internal Table是一種Data Structure,類(lèi)似于其他語(yǔ)言中的STRUTURE,它可以由幾個(gè)不同類(lèi)型的欄位(field)組成,用來(lái)表示具有不同屬性的某一事物,單獨(dú)一筆資料表示某個(gè)事物,多筆資料表示具有相同屬性的多個(gè)事物.
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>.
???? 語(yǔ)法:
?????????? 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ù) 類(lèi)型(VECTOR 和 ITAB) 然后創(chuàng)建 數(shù)據(jù)類(lèi)型 DEEPLINE 作為字段串 ,包含這些 內(nèi)表作為組 件通過(guò)該 字段串,數(shù) 據(jù)類(lèi)型 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ù)類(lèi)型 (頁(yè) 99) 中所示,該 示例創(chuàng)建數(shù) 據(jù)類(lèi)型 ITAB 作為內(nèi)表 通過(guò)使用 DATA 語(yǔ)句的 TYPE 參數(shù)引用 ITAB, 使數(shù)據(jù)對(duì)象 TAB1 與 ITAB 結(jié)構(gòu)相同 通過(guò)使用 DATA 語(yǔ)句的 LIKE 參數(shù)引用 TAB1, 使數(shù)據(jù)對(duì)象 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ù)對(duì)象 FLIGHT_TAB, 其結(jié)構(gòu)與數(shù) 據(jù)庫(kù)表格 SFLIGHT 相同
?
本示例介紹 如何采用兩 種不同的步 驟創(chuàng)建同一 內(nèi)表
TYPES VECTOR_TYPE TYPE I OCCURS 10.
DATA VECTOR TYPE VECTOR_TYPE WITH HEADER LINE.
在此創(chuàng)建一 個(gè)內(nèi)表數(shù)據(jù) 類(lèi)型 VECTOR_TYPE, 其行包含首 先創(chuàng)建的基 本類(lèi)型 I 字段然后 ,通過(guò)引用 VECTOR_TYPE 創(chuàng)建數(shù)據(jù)對(duì) 象 VECTOR 通過(guò)使用 WITH HEADER LINE 選項(xiàng)還創(chuàng)建 表格工作區(qū) 域 VECTOR 在這種情況 下,表格工 作區(qū)域包含 一種類(lèi)型 I 字段,可以 通過(guò)名稱(chēng) VECTOR 定位
DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.
在這種情況 下,通過(guò)直 接在 DATA 語(yǔ)句中使用 OCCURS 選項(xiàng)創(chuàng)建完 全一樣的數(shù) 據(jù)類(lèi)型 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.
舉例三. (加入另一個(gè)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.
此時(shí), 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 的記錄號(hào).(新加入的元素放在此記錄前面)
???????? 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為T(mén)able位置
???????????????? ENDLOOP.
???????????????? 執(zhí)行結(jié)果:
??????????????????????????? 1??????? 10?????? 20
??????????????????????????? 2?????? 100????? 200? "插入的元素
??????????????????????????? 3??????? 20?????? 40
??????????????????????????? 4??????? 30?????? 60
?
插入另一Internal Table元素
?? 語(yǔ)法:
???????? 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中, 位置在第三個(gè)元素之前
*-------------------------------------------------------------------------------------*
讀取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個(gè)元素資料, 放入 LINE的欄位中
根據(jù)欄位內(nèi)容尋找
?? 語(yǔ)法:
????????? 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)表屬 性
如果在處理 過(guò)程中想知 道內(nèi)表一共 包含多少行 ,或者想知 道定義的 OCCURS 參數(shù)的大小 ,請(qǐng)使用 DESCRIBE 語(yǔ)句,用法 如下:
語(yǔ)法
DESCRIBE TABLE <itab> [LINES <lin>] [OCCURS <occ>].
如果使用 LINES 參數(shù),則將 填充行的數(shù) 量寫(xiě)入變量 <lin> 如果使用 OCCURS 參數(shù),則將 行的初始號(hào) 寫(xiě)入變量 <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 語(yǔ)句更改 當(dāng)前行號(hào), 但無(wú)法更改 初始行號(hào)
*-------------------------------------------------------------------------------------*
加總
SUM.
總和計(jì)算存放與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>中的值.使用在沒(méi)有 HEADER LINE 的 Internal Table中, 清除所有元素
CLEAR?? <itab>.? 清空<itab>的Header Line.使用在有 HEADER LINE 的 Internal Table中, 清除所有元素
FREE???? <itab>.? 釋放記憶體空間.釋放(Release) Internal Table所占的記憶體空間, 用在 REFRESH和 CLEAR指令之后
將值重置為 默認(rèn)值
可以用 CLEAR 語(yǔ)句重置任 何數(shù)據(jù)對(duì)象 值,如下所 示:
語(yǔ)法
CLEAR <f>.
exp:
DATA NUMBER TYPE I VALUE '10'.
WRITE NUMBER.
CLEAR NUMBER.
WRITE / NUMBER.
輸出為:
??????? 10
???????? 0
CLEAR 語(yǔ)句將字段 NUMBER 的內(nèi)容從10 重置為默認(rèn) 值 0
*-------------------------------------------------------------------------------------*
? ?添加字段 順序并將結(jié) 果賦給另一 個(gè)字段
語(yǔ)法
ADD <n1> THEN <n2> UNTIL <nz> GIVING <m>.
如果 <n1> <n2> ... <nz> 是在內(nèi)存中 相同類(lèi)型和 長(zhǎng)度的等距 字段序列, 則進(jìn)行求和 計(jì)算并將結(jié) 果賦給 <m>
? ?添加字段 順序并將結(jié) 果添加到另 一個(gè)字段的 內(nèi)容中
語(yǔ)法
ADD <n1> THEN <n2> UNTIL <nz> TO <m>.
該語(yǔ)句除了 將字段總和 添加到 <m> 的舊內(nèi)容中 之外,與上 面語(yǔ)句的工 作方式相同
有關(guān)其它相 似變體的信 息,參見(jiàn)有 關(guān) ADD 語(yǔ)句的關(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: 輸入一個(gè)變量或欄位內(nèi)容
??? 2. SELECTION-OPTIONS: 使用條件篩選畫(huà)面來(lái)輸入數(shù)據(jù)???
PARAMETERS 指令
基本的輸入命令, 類(lèi)似如BASIC的INPUT命令, 但無(wú)法使用F格式(浮點(diǎn)數(shù))
??? 語(yǔ)法:
??????? 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è)是將字串輸入值自動(dòng)轉(zhuǎn)換為大寫(xiě), 加上此參數(shù)會(huì)將輸入的資料轉(zhuǎn)成小寫(xiě),
3.?? OBLIGATORY
強(qiáng)制要求輸入, 螢?zāi)簧蠒?huì)出現(xiàn)一個(gè) ? , 使用者必須要輸入才可.
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所輸入的值實(shí)際上是放在internal table中的,該Internal table 有四個(gè)欄位,分別是:SIGN,OPTION,LOW,HIGH.. 條件篩選檢查條件輸入畫(huà)面指令, 輸入條件后可配合SELECT指令自TABLE讀取符合條件的資料, 直接執(zhí)行或放入 Internal Table中, 條件有四個(gè)參數(shù):
1. SIGN:
???? I: 表篩選條件符合的資料
???? E: 表篩選條件不符合的資料
2. OPTION: 比較的條件符號(hào)
????????? EQ(等於),NE(不等於),GT(大於),LE(小於),CP(包含),NP(不包含)
3. LOW: 最小值
4. HIGH: 最大值
?? 語(yǔ)法:
????????? 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è)定開(kāi)始結(jié)束范圍輸入預(yù)設(shè)值
???? Example:
???? SELECT-OPTIONS? AIRLINE? FOR? SPFLI-CONNID DEFAULT? '2042'? TO? '4555'.
2.?NO-EXTENSION
設(shè)定不要Multi-Option輸入畫(huà)面
3.?NO? INTERVALS
設(shè)定不要區(qū)間范圍輸入畫(huà)面
4.?LOWER CASE
輸入轉(zhuǎn)換成大寫(xiě)
5.?OBLIGATORY
強(qiáng)制要求輸入
*-------------------------------------------------------------------------------------*
配合 SELECT 命令
?? 條件輸入完后要將符合條件的資料篩選出來(lái), 可配合使用 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)生空白列
語(yǔ)法:
????? SELECTION-SCREEN? SKIP? [<n>]
????????? Example:
?????????????????? SELECTION-SCREEN? SKIP? 2.
?????????????????? 產(chǎn)生兩列空白列
??? 2.產(chǎn)生底線(xiàn)
語(yǔ)法:
????? SELECTION-SCREEN? ULINE? / <pos>(length)
????????? Example:
?????????????????? SELECTION-SCREEN? ULINE? /10(30).
?????????????????? 自第10格開(kāi)始產(chǎn)生長(zhǎng)度30的底線(xiàn)
?? 3.印出備注說(shuō)明
???? 語(yǔ)法:
????? SELECTION-SCREEN? COMMENT? / <pos>(length)? <name>
????????? Example:
?????????????????? REMARK = 'Pls enter your name'.
?????????????????? SELECTION-SCREEN? COMMENT? /10(30)? REMARK.
??? 4. 同一列中輸入數(shù)個(gè)資料項(xiàng)
語(yǔ)法:
????? 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
語(yǔ)法:
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語(yǔ)法
???? 我們?cè)诰帉?xiě)ABAP4程式的時(shí)候,經(jīng)常需要從TABLE中根據(jù)某些條件讀取數(shù)據(jù),.讀取數(shù)據(jù)最常用的方法就是通過(guò)SQL語(yǔ)法實(shí)現(xiàn)的.
ABAP/4中可以利用SQL語(yǔ)法創(chuàng)建或讀取TABLE,SQL語(yǔ)法分為DDL(DATA DEFINE LANGUAGE)語(yǔ)言和DML(DATA MULTIPULATION LANGUAGE)語(yǔ)言,DDL語(yǔ)言是指數(shù)據(jù)定義語(yǔ)言,例如CREATE等, DML語(yǔ)言是數(shù)據(jù)操作語(yǔ)言,例如SELECT, INSERT等語(yǔ)句. SQL語(yǔ)句有OPEN SQL語(yǔ)句和NATIVE SQL語(yǔ)句.? OPEN SQL語(yǔ)句不是標(biāo)準(zhǔn)SQL語(yǔ)句,是ABAP/4語(yǔ)言,利用OPEN SQL語(yǔ)句能在Databases 和 Command 之間產(chǎn)生一個(gè)BUFFER,所以它有一個(gè)語(yǔ)言轉(zhuǎn)換的過(guò)程.
而NATIVE SQL語(yǔ)句則是標(biāo)準(zhǔn)的SQL語(yǔ)句, 它直接針對(duì)Databases操作.
OPEN SQL
SELECT語(yǔ)句
語(yǔ)法格式:
SELECT <result> [INTO <target>] [FROM <source>] [WHERE <condition>]
?????????????? [GROUP BY <fields>] [ORDER BY <sort order>]
?其中: <result>指定要抓取的欄位
????? <target>將讀取的記錄存放在work area中
????? <source>指定從那個(gè)TABLE中讀取資料
????? <condition>抓取資料的條件
????? <fields>指定按那些欄位分組
????? <sort order>排序的欄位及方式
相關(guān)的系統(tǒng)變量:
???? SY-SUBRC = 0? 表示讀取數(shù)據(jù)成功
?????????????? <> 0 表示未找到符合條件的記錄
???? SY-DBLNT: 被處理過(guò)的記錄的筆數(shù).
相關(guān)的命令:
???? EXIT. 退出循環(huán).
???? CHECK <logistic statement>.如果邏輯表達(dá)式成立,則繼續(xù)執(zhí)行,否則,開(kāi)
??????????????????????????? 始下一次循環(huán).
??
利用循環(huán)方式讀取所有記錄
SELECT .ENDSELECT.是循環(huán)方式讀取記錄的.
???? 例如:
TABLES MARD.
SELECT [DISTINCT] * FROM MARD WHERE MATNR = '3520421700'.
??? <Statements>.
ENDSELECT.
(從MARD中抓取所有料號(hào)=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ù)庫(kù)表名 稱(chēng) SPFLI 被賦給字符 字段 NAME SELECT 語(yǔ)句將所有 的行從 SPFLI 中讀到目標(biāo) 區(qū) WA 中在該示 例中,WA 與 SPFLI 的結(jié)構(gòu)并不 相同,每一 行都將自動(dòng) 地轉(zhuǎn)換成字 符字段.
舉例二.
TABLES MARD.
SELECT MATNR? MTART? MAKTX? INTO (t_matnr, t_mtart, maktx)
?????????????? FROM MARD
?????????????? WHERE MATNR = '3520421700'.
?????? <Statements>.
ENDSELECT.
(從MARD中抓取料號(hào)=3520421700的料號(hào)類(lèi)型和描述,放在變量t_matnr, t_mtart, maktx中)
??????? Example:
???????????????? TABLES? SPFLI.
???????????????? DATA? WA? LIKE? TABLES.
???????????????? SELECT? *? FROM? SPFLI? INTO? WA.
??????????????????? WRITE:? /? WA-COMPANY,WA-PLANT.
???????????????? ENDSELECT.
???????????????? 逐筆寫(xiě)入WA 工作區(qū)中
舉例三.
將讀取的資料寫(xiě)入 Initial Table 中
? 語(yǔ)法:
??????? SELECT? .. INTO? TABLE? <itab>??
??????? Example:
??????? TABLES? SPFLI.
??????? DATA? ITAB? LIKE? SPFLI? OCCURS? 10? WITH? HEADER? LINE.
??????? SELECT? *? FROM? SPFLI? INTO? ITAB.
??????? 一次讀10筆(Initial Table的長(zhǎng)度)記錄存入 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ù)庫(kù)表 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%'.
('%'是通配符號(hào))
(3)?IN (<g1><gn>)
是<g1><gn>里面的任意一個(gè)值即可.
例如: 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 語(yǔ)句
從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的名稱(chēng)就是internal table的名稱(chēng),可以直接寫(xiě)成:
????? 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.
從另外一個(gè)Internal table中INSERT 資料
格式:
INSERT <itab1> FROM TABLE <itab2> [ACCEPTING DUPLICATE KEY]
將<itab2>中非NULL的資料加入<itab1>中,加上[ACCEPTING DUPLICATE KEY]能限制相同PRIMARY KEY不重復(fù)加入.
?? 加入一筆記錄至資料庫(kù)
?? 1.自 Work Area 工作區(qū)
?? 語(yǔ)法:
??????? INSERT? INTO? <database>? VALUES? <wa>
??????? Example:
???????????????? TABLES? SPFLI.
???????????????? DATA? WA?? LIKE? SPFLI.
???????????????? WA-NO = '34051920'.
???????????????? WA-COMPANY='DELTA'.
???????????????? INSERT? SPFLI? VALUES? WA.
???????????????? 將 ITAB 資料加入 SPFLI中, 也可寫(xiě)成 INSERT? SPFLI? FROM? ITAB.
??????????
????????????????? SPFLI-NO='34299876'.
????????????????? SPFLI-COMPANY='HP'.
????????????????? INSERT? SPFLI? FROM? SPFLI.
????????????????? 將Work Area? SPFLI中的資料加入資料庫(kù)檔案 SPFLI中
????????????????? 因Work Area SPFLI的結(jié)構(gòu)與資料檔 SPFLI一樣, 所以也可
????????????????? 寫(xiě)成 INSERT? SPFLI.
?? 2.自 Internal Table
???? 語(yǔ)法:
?????????? INSERT? <database>? FROM? TABLE? <itab>? [ACCEPTING DUPLICATE KEY]
?????????? 將 <itab>中非 NULL的資料加入 <database>中, 加上 [ACCEPTING DUPLICATE
?????????? KEY]能檢查不加入有重覆primary key, 若有重覆則 SY-SUBRC 會(huì)傳回 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 指令
?? 異動(dòng)已存在的記錄內(nèi)容
1.使用 Primary Key
? 語(yǔ)法:
??????????? 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, 則會(huì)找到 NO='34051920'
??????????????????? 的記錄, 將其 COMPANY欄位異動(dòng)為 DELTA
2.使用條件式
? 語(yǔ)法:
??????? UPDATE? <database>? SET? < f1>=<values>? WHERE? <condition>
??????? 根據(jù)條件式異動(dòng)符合條件式的記錄
??????? Example:
???????????????? UPDATE? SPFLI? SET? NO='34051920'
??????????????????????????????????????? COMPANY = 'DELTA'
????????????????????????????????? WHERE? TEL='4526107'.
*-------------------------------------------------------------------------------------*
3.?? MODIFY 語(yǔ)法
???? MODIFY <internal table> [FROM <work area>].
根據(jù) Primary Key 尋找資料檔中符合的記錄, 若找到則更新異動(dòng), 若找不到則新增記錄
語(yǔ)法:
?????? MODIFY? <database>? FROM? <wa>
?????? Example:
??????????????? WA-NO='34051920'.
??????????????? WA-COMPANY='DELTA'.
??????????????? MODIFY? SPFLI? FROM? WA.
????
4.?? DELETE 語(yǔ)法
???? DELETE <internal table> [FROM <work area>].
??? 或: DELETE <internal table> [WHERE <conditions>]
?? 刪除資料檔的記錄
1.使用 Primary Key
? 語(yǔ)法:
??????????? 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, 則會(huì)找到 NO='34051920'
???????????????????? 的記錄, 找到后將此筆刪除
2.使用條件式
? 語(yǔ)法:
??????? DELETE? FROM? <database>? WHERE? <condition>
??????? 根據(jù)條件式刪除符合條件式的記錄
??????? Example:
???????????????? DELETE? FROM? SPFLI? WHERE? AREA = 'AMERICAN'.
???????????????????????????????????????
*-------------------------------------------------------------------------------------*
5.?DATABASE CURSOR
?? Database Cursor是一個(gè)資料庫(kù)暫存區(qū), 將經(jīng)SELECT指令讀取的記錄存放至此暫存區(qū), 再由此暫存區(qū)放至Work Area中, 可減少資料庫(kù)讀取的次數(shù).
1.開(kāi)啟 Database Cursor
? 語(yǔ)法:
??????? 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
語(yǔ)法:
????? FETCH? NEXT? CURSOR? <c>? INTO? <wa>
????????? Example:
?????????????????? FETCH? NEXT? CURSOR? C1? INTO? WA.
? 讀取下一筆Cursor位置的資料存入WA, 如果已無(wú)資料可讀, SY-SUBRC <>0.
關(guān)閉 Database Cursor
語(yǔ)法:
????? CLOSE? CURSOR? <c>
????? Example:
?????????????? CLOSE? CURSOR? C1.
*-------------------------------------------------------------------------------------*
COMMIT WORK & ROLLBACK WORK
要確定資料成功寫(xiě)入資料庫(kù),可使用COMMIT WORK指令,如:
?? COMMIT? WORK.
相反的, 如果反悔要復(fù)原, 可使用 ROLLBACK? WORK, 可復(fù)原在上個(gè)COMMIT WORK指令之后的資料, 如:
?? ROLLBACK? WORK.
*-------------------------------------------------------------------------------------*
使用NATIVE SQL指令
語(yǔ)法格式:
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é)果是抓到多筆記錄,我們想要逐筆記錄處理時(shí),就用PERFORMING 參數(shù),這個(gè)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)欄位當(dāng)作一般欄位使用,所以在抓取資料時(shí)必須指定特定的Client;
b.? NATIVE SQL中的SELECT語(yǔ)句沒(méi)有CHECK權(quán)限的功能;
c.?在登入SAP R/3系統(tǒng)時(shí),我們已經(jīng)自動(dòng)與Database連接,所以在執(zhí)行NATIVE
SQL時(shí)并不需要CONNECT語(yǔ)句;
d.?一條NATIVE SQL語(yǔ)句可以以分號(hào);結(jié)束,一般情況下是以句號(hào).結(jié)束.
e.?某些數(shù)據(jù)庫(kù)系統(tǒng)對(duì)TABLE名字和FIELD名字有大小寫(xiě)區(qū)別,要正確書(shū)寫(xiě).
f.?在NATIVE SQL中,雙引號(hào)"不表示注釋.
*-------------------------------------------------------------------------------------*
結(jié)果語(yǔ)句
條件述敘
?? 1. IF 述敘
? 語(yǔ)法:
??????? IF? <Condition1>.
????????? <Statement 1 >
??????? ELSEIF? <Condition2>.
????????? <Statement 2>
??????? ELSEIF? <Condition3>.
????????? <Stetement 3>
??????? ..
??????? ELSE.
????????? <else Statement >
??????? ENDIF.
??????? (1).在每個(gè)判斷敘述之后要加上 .
??????? (2).在巢狀迥圈之中無(wú)法使用 ELSE 敘述, ELSE 敘述屬 IF 敘述
??????? Example:
???????????????? IF? 3 > 8.
?????????????????? WRITE / '3 is less than 8'.
??????????????? ENDIF.
?????????????????
2. CASE 敘述
? 語(yǔ)法:
?????? 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.計(jì)次迥圈
? 語(yǔ)法:
?????? 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.條件迥圈
語(yǔ)法:
???? 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
無(wú)窮迥圈
?? DO .
???? <Statement Block>
?? ENDDO.
?? 無(wú)窮迥圈必須配合 EXIT 敘述來(lái)執(zhí)行
*-------------------------------------------------------------------------------------*
搜索字符串
要搜索特定 模式的字符 串,請(qǐng)使用 SEARCH 語(yǔ)句,用法 如下:
語(yǔ)法
SEARCH <c> FOR <str> <options>.
該語(yǔ)句在字 段 <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> 開(kāi)始的詞
?單詞之間用 空格逗號(hào) 句號(hào)分 號(hào)冒號(hào) 問(wèn)號(hào)嘆號(hào) 括號(hào)斜 杠加號(hào)和 等號(hào)等分隔
?
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'.
該過(guò)程的輸 出如下:
SEARCHED SY-SUBRC SY-FDPOS
X??????????? 4??????? 0
itt????????? 0?????? 11
.e .???????? 0?????? 15
*e?????????? 0?????? 10
s*?????????? 0?????? 17
搜索字符字 段 <c> 的各種選項(xiàng) (<options>) 如下
? ?ABBREVIATED
在字段 <c> 中搜索包含 <str> 中指定字符 串的單詞, 其中字符可 能被其它字 符隔開(kāi)單 詞和字符串 的第一個(gè)字 母必須相同
? ?STARTING AT <n1>
在字段 <c> 中搜索從 <n1> 開(kāi)始的 <str> 結(jié)果 SY-FDPOS 參照相對(duì)于 <n1> 的偏移量而 不是字段的 開(kāi)始
? ?ENDING AT <n2>
在字段 <c> 搜索 <str> 直到位置 <n2>
? ?AND MARK
如果找到搜 索串,則將 搜索串中的 所有字符( 和使用 ABBREVIATED 時(shí)的所有字 符)轉(zhuǎn)換為 大寫(xiě)形式
?
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.
該過(guò)程的輸 出如下:
This is a fast first example.
SY-FDPOS:??? 10
This is a fast FIRST example.
SY-FDPOS:??? 4
Off:??????? 15
請(qǐng)注意,在 找到單詞' fast' 之后,為了 查找包含' ft'的第 二個(gè)單詞, 必須在偏移 量 SY-FDPOS 上加2,然 后從位置 POS 開(kāi)始查找 否則,會(huì)再 次找到單詞 'fast' 要獲得' first' 相對(duì)于字段 STRING 開(kāi)始的偏移 量,從 POS 和 SY-FDPOS 計(jì)算
獲得字符串 長(zhǎng)度
要決定字符 串到最后一 個(gè)字符而不 是 SPACE 的長(zhǎng)度,請(qǐng) 使用內(nèi)部函 數(shù) STRLEN, 用法如下:
語(yǔ)法
[COMPUTE] <n> = STRLEN( <c> ).
STRLEN 將操作數(shù) <c> 作為字符數(shù) 據(jù)類(lèi)型處理 ,而不考慮 其實(shí)際類(lèi)型 不進(jìn)行轉(zhuǎn) 換
關(guān)鍵字 COMPUTE 可選有關(guān) 內(nèi)部函數(shù)的 詳細(xì)信息, 參見(jiàn) 使用數(shù)學(xué)函 數(shù) (頁(yè) 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
?? 一個(gè)典型的報(bào)表程式是由許多的程式區(qū)塊(Code Block)所組成,在區(qū)塊間最好能加上一些
?? 說(shuō)明以利程式可讀性,一個(gè)典型的報(bào)表程式格式如下:
*? PROGRAM SOURCE HEADER? : 說(shuō)明程式名稱(chēng)及目的
* Program Name:
* Description:
* Date/Author:
* Table Update:
* Special Logic:
* Include:
*-------------------------------------------------------------------------------------*
*? MODIFICATION LOG : 程式修改更新記錄
*-------------------------------------------------------------------------------------*
* ChangeDate Programmer??? Request????? Description
*-------------------------------------------------------------------------------------*
*?????????????????????????????????????? NEW PROGRAM
*-------------------------------------------------------------------------------------*
* REPORT NAME : 宣告程式名稱(chēng)及報(bào)表格式,
*-------------------------------------------------------------------------------------*
REPORT Z_____
?????? NO STANDARD PAGE HEADING
????????? MESSAGE-ID __??? " 所使用的MESSAGE
????????? LINE-COUNT ___?? " 每頁(yè)報(bào)表列數(shù)
????????? LINE-SIZE? ___.? " 每頁(yè)報(bào)表寬度
*? TABLE DESCRIPTION : 宣告程式會(huì)使用的TABLE
*-------------------------------------------------------------------------------------*
TABLES:
???????????????
* DATA : 宣告程式所使用的變數(shù)及自定型態(tài)
*-------------------------------------------------------------------------------------*
TYPES:
DATA:
?????
*? SELECTION SCREEN / OPTION / PARAMETER : 螢?zāi)惠斎雸?bào)表篩選條件
*-------------------------------------------------------------------------------------*
? SELECTION-SCREEN BEGIN OF BLOCK ____
?????? SELECT-OPTIONS:
? SELECTION-SCREEN END OF BLOCK ___
* INITIALIZATION : 啟動(dòng)程式開(kāi)始執(zhí)行, 如SELECT-OPTION及PARAMETER
*-------------------------------------------------------------------------------------*
INITIALIZATION.
INCLUDE ____.
* AT START SELECTION : 輸入結(jié)束后啟動(dòng)的區(qū)塊, 如按下<F8>
*-------------------------------------------------------------------------------------*
START-OF-SELECTION.
? SET PF-STATUS ____.? " 指定報(bào)表執(zhí)行時(shí)所用的 GUI-STATUS名稱(chēng)
? PERFORM READ_DATA.
? PERFORM PROCESS_DATA.
? PERFORM PRINT_DATA.
? PERFORM PRINT_SUMMARY.
* AT USER Commaand : 執(zhí)行在GUI-STATUS中自定的命令
*-------------------------------------------------------------------------------------*
AT USER_COMMAND.
* AT LINE SELECTION : 由在報(bào)表中按下<F2>或Double-Click啟動(dòng)
*-------------------------------------------------------------------------------------*
AT LINE-SELECTION.
* TOP OF PGAE : 每頁(yè)開(kāi)始列印時(shí)執(zhí)行, 用於定義報(bào)表表頭
*-------------------------------------------------------------------------------------*
* END OF PAGE : 報(bào)表列印完最后一頁(yè)后啟動(dòng)
*-------------------------------------------------------------------------------------*
END-OF-PAGE
* END OF SELECTION : 在結(jié)束列印資料后啟動(dòng), 如可用來(lái)印出USER輸入的條件
*-------------------------------------------------------------------------------------*
END-OF-SELECTION.
INCLUDE? _____
* FORM : 撰寫(xiě)程式中所使用到的副程式
*-------------------------------------------------------------------------------------*
* 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)
??????????? 表單輸出每頁(yè)由n行,其中的m行作為頁(yè)腳;
4. ... MESSAGE-ID mid ??????? 消息對(duì)象
5.? ... DEFINING DATABASE ldb
?????? 使用邏輯數(shù)據(jù)庫(kù),自動(dòng)產(chǎn)生
*
事件塊
INITIALIZATION
AT SELECTION-SCREEN
START-OF-SELECTION
GET
END-OF-SELECTION
TOP-OF-PAGE
END-OF-PAGE
*
事件塊的簡(jiǎn)單處理過(guò)程:
*
ABAP程序運(yùn)行的時(shí)候,INITIALIZATION首先被調(diào)用;
經(jīng)過(guò)初始化的輸入屏幕會(huì)顯示在表示服務(wù)器;
用戶(hù)離開(kāi)輸入屏幕的時(shí)候,START-OF-SELCTION事件會(huì)被自動(dòng)調(diào)用;
結(jié)果數(shù)據(jù)會(huì)以列表的形式顯示在第二個(gè)屏幕上;
*
源代碼中的事件塊順序不影響它們的執(zhí)行順序
*
事件塊編碼規(guī)則(1)
INITIALIZATION
??? 通常在此事件塊中設(shè)定輸入屏幕字段的初始值
*
事件塊編碼規(guī)則(2)
AT SELECTION-SCREEN
??? 通常在此事件塊中進(jìn)行用戶(hù)輸入數(shù)據(jù)的合法性檢查,發(fā)現(xiàn)錯(cuò)誤則以消息的形式給出警示,直到用戶(hù)輸入正確的數(shù)值
例如: AT SELECTION-SCREEN .
??????????????????? IF P_DATE = SPACE .
??????????????????????? MESSAGE E001 .
??????????????????? ENDIF.
??? 效果: 如果字段P_DATE為空,則程序會(huì)用消息001日期字段不能為空!來(lái)提示用戶(hù)必須輸入一個(gè)日期而且輸入屏幕會(huì)等待用戶(hù)輸入,知道該字段數(shù)值合法
*
事件塊編碼規(guī)則(3)
START-OF-SELCTION
??? 通常在此事件中針對(duì)業(yè)務(wù)需求進(jìn)行系統(tǒng)數(shù)據(jù)的查詢(xún)
例如:
???? start-of-selection .
????????? perform get_data_for_oil .
效果:
???? 在輸入屏幕用戶(hù)按下執(zhí)行按鈕后,子程序get_data_for_oil被執(zhí)行,? 在其中獲得業(yè)務(wù)相關(guān)的數(shù)據(jù)存放到內(nèi)表或者其它變量,這些數(shù)據(jù)在END-OF-SELECTION事件塊中被輸出
*
事件塊編碼規(guī)則(4)
END-OF-SELCTION
??? 通常在此事件中進(jìn)行結(jié)果清單的輸出
例如:
??? end-of-selection .
???????? write : 23(1) sy-vline,
?????????? 24(20) tab-gas_plan right-justified ,
效果:
??? 數(shù)據(jù)以清單的形式輸出
*
事件塊編碼規(guī)則(5)
GET
??? 從邏輯數(shù)據(jù)庫(kù)中得到數(shù)據(jù)(較少用)
??? 在此事件塊中設(shè)計(jì)輸出清單的頁(yè)頭
TOP-OF-PAGE
?????????????????? write : /1(240) '汽柴油日出廠(chǎng)情況表' centered .
?????????????????? write : /20(8) '日期:' ,
?????????????????????????????? 29(10) s_date ,
?????????????????????????????? 180(6) '單位:' ,
?????????????????????????????? 190(10) '噸' .
*
事件塊編碼規(guī)則(6)
END-OF-PAGE
??? 在此事件中設(shè)定輸出清單的頁(yè)腳
例如:
??? END-OF-PAGE .
總結(jié)
- 上一篇: ABAP中接收.NET语言byte[]类
- 下一篇: NUMERIC_CHECK函数解析