SAP ABAP / 4

資料類型
C :字串
D :日期型 格式為 YYYYMMDD 例:'1999/12/03'
F : 浮點數 長度為 8
I :整數
N :數值組成的字串 如:011,'302'
P : PACKED 數 用於小數點數值 如:12.00542
T : 時間 格式為:HHMMSS 如:'14:03:00'
X : 16 進制數 如:'1A03'
*-------------------------------------------------------------------------------------*
變數宣告

DATA <F> [<Length>] <type> [<value>][decimals]
<F> 變數名稱
<length><type> 變數類型 及 長度
<value> 初值
<decimals> 小數位數
exp:
DATA : COUNTER TYPE P DECIMALS 3.
NAME(10) TYPE C VALUE 'DELTA'.
S_DATE TYPE D VALUE '19991203'.
exp:
DATA : BEGIN OF PERSON,
NAME(10) TYPE C,
AGE

TYPE I,

WEIGHT TYPE DECIMALS 2,
END OF PERSON.
另外,有關 DATA 宣告的指令還有: CONSTANTS(宣告常數)、STATICS(臨時變數宣告).
exp:
CONSTANTS PI TYPE P DECIMALS 5 VALUE '3.14159'.
STATICS 敘述
宣告的變數僅在目前的程式中使用, 結束後會自動釋放
語法:
STATICS <c> [<length>] <type> [<value>] [<decimals>]
系統專用變數說明

系統內部專門創建了 SYST 這個 STRUCTURE,裡面的欄位存放系統變數,常用的系統變數有:
SY-SUBRC : 系統執行某指令後,表示執行成功與否的變數,'0' 表示成功
SY-UNAME: 當前使用者登入 SAP 的 USERNAME;
SY-DATUM: 當前系統日期;
SY-UZEIT:

當前系統時間;

SY-TCODE: 當前執行程式的 Transaction code
SY-INDEX : 當前 LOOP 循環過的次數
SY-TABIX: 當前處理的是 internal table 的第幾筆
SY-TMAXL: Internal table 的總筆數
SY-SROWS: 螢幕總行數;
SY-SCOLS: 螢幕總列數;
SY-MANDT: CLIENT NUMBER
SY-VLINE: 畫豎線
SY-ULINE: 畫橫線
TYPE 敘述
用來指定資料型態或宣告自定資料型態
Example:
TYPES: BEGIN OF MYLIST,
NAME(10) TYPE C,
NUMBER TYPE I,
END OF MYLIST.
DATA LIST TYPE MYLIST.
LIKE 敘述
跟 TYPE 敘述使用格式相同, 如
DATA TRANSCODE LIKE SY-TCODE.
不同的是 LIKE 用在已有值的資料項, 如系統變數, 而 TYPE 敘述則是用
在指定資料型態。

*-------------------------------------------------------------------------------------*
輸出

一. WRITE 語句
ABAP/4 用來在螢幕上輸出資料的指令是 WRITE 指令,例如:
WRITE: 'USER NAME IS:', SY-UNAME.
二. 指定螢幕輸出位置
指定輸出位置的語句格式為:

WRITE: [AT] [ / ] [<pos>] [(<len>)] 資料項 [<par>]
其中: / : 在下一行輸出
<pos>: 指定輸出的行號;
(<len>):指定輸出位數(長度)
<par>: 指定顯示格式參數,參數有:
LEFT-JUSTIFIED 資料靠左對齊
CENTERED

資料靠中間對齊

RIGHT-JUSTIFIED 資料靠右對齊
UNDER <g>
NO-GAP

正對在資料項<g>的下麵顯示
緊接著顯示,不留空格

USING EDIT MASK <m>: 使用內嵌子元顯示, 如 12:03:20
USING NO EDIT MASK: 不使用內嵌子元
NO-ZERO:

數字前面 0 的部分不顯示

NO-SIGN:

不顯示正負號

DECIMALS <d>:

顯示 <d> 位小數

EXPOENT <e>:

F(浮點數)指數的值

ROUND <r>:

四捨五入至小數點後<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'.
輸出結果為:

ABCDEF

例如 2: DATA: X TYPE I VALUE '11:20:30',
A(5) TYPE C VALUE 'AB CDE'.
WRITE: / X USING EDIT MASK '__:__:__'.
WRITE: / X USING EDIT MASK '$___,___'.
WRITE: / Y NO-GAP.
輸出結果為:
11:20:30
$112,030
ABCDEF

例如 3: DATA: LEN TYPE I VALUE 10,
POS TYPE I VALUE 11,
TEXT(10) VALUE '1234567890'
WRITE 'The text ------------ appears in the text.'.
WRITE AT POS(LEN) TEXT.
WRITE TO 語句的基本 形式
要將值(文 字)或源字 段內容寫入 目標欄位, 可以使用 WRITE TO 語句:
語法
WRITE <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.

AT 後的格式規 範,與在 在螢幕上定 位元 WRITE 輸出 (頁 28) 中為 WRITE 語句說明的 格式規範完 全一樣。 如果沒有格 式規範,系 統則開始新 的一行,並 用水平線填 充該行。否 則,只按指 定輸出水準 線。 生成水平線 的另一種方 法,是在 WRITE 語句中鍵入 恰當數量的 連字號,如 下所示: WRITE [AT [/][<pos>][(<len>)]] '-----. 顯示圖示: 語法: WRITE: <symbol-name> AS SYMBOL. ICON_VOICE_OUTPUT AS ICON. 要查看系統所提供有那些符號及圖示. 垂直線 用下列語法 ,可以在輸 出螢幕上生 成垂直線: 語法 WRITE [AT [/][<pos>]] SY-VLINE. 它等同於 WRITE [AT [/][<pos>][(<len>)]] SY-ULINE. WRITE: / 'Alarm Icon:'.接下來選擇要查看 ..'.可選擇'EDIT'下的'Insert Statement'. 例如: INCLUDE <SYMBOL>.選擇'Write'.. 或 WRITE [AT [/][<pos>]] '|'. 空行 用下列語法 ,可以在輸 出螢幕上生 成空行: 語法 SKIP [<n>]. SYM_PHONE AS SYMBOL. WRITE: <icon-name> AS ICON. WRITE: / 'Phone symbol:'. INCLUDE <ICON>.ADD 1 TO COUNTER. 在此,三條 運算語句進 行相同算術 運算 輸出螢幕上 的線和空行 用下列語法 ,可以在輸 出螢幕上生 成水平線: 語法 ULINE [AT [/][<pos>][(<len>)]]. 該語句從當 前行開始, 在輸出螢幕 上生成 <n> 個空行。如 果沒有指定 <n> 的值,就輸 出一個空行 。 要將輸出定 位元在螢幕的 指定行上, 請使用: 語法 SKIP TO LINE <n>. 該語句允許 將輸出位置 向上或向下 移動。 四.

… ] END OF <work area>.的群組. ABAP/4 中的 Internal Table 是一種 Data Structure. exp: TYPES VECTOR TYPE I OCCURS 10. <field 3> TYPE <type 3>. COLUMN1 TYPE I. [<field 2> TYPE <type 2>. <field 3> TYPE <type 3>. [<field 2> TYPE <type 2>.單獨一筆資料表示某個事物. DATA: <internal table> LIKE <work area> OCCURS <n>. . TYPES: BEGIN OF LINE. <field 1> TYPE <type1>. <field 1> TYPE <type1>. DATA: END OF <work area>. … ] END OF <internal table>. *-------------------------------------------------------------------------------------* Internal Table 的宣告 一. 格式二.用來表示具有不同屬性的某一事物. TYPES: BEGIN OF <work area>.多筆資料表示具有相同屬 性的多個事物.類似於其他語言中的 STRUTURE. DATA: BEGIN OF <internal table> OCCURS <n>. INCLUDE STRUCTURE <table name>. Internal table 的定義有以下幾種格式: 格式一. DATA: BEGIN OF <work area>. 語法: DATA <f> <type> OCCURS <n> [WITH HEADER LINE] Example: DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.它可以由幾個不同類 型的欄位(field)組成.如 SYMBOL 或 ICON. 接下來按'Display'即可. TYPES <internal table> TYPE <work area> OCCURS <n>. 格式三.

DATA TAB2 LIKE TAB1 WITH HEADER LINE. 本示例創建 資料物件 FLIGHT_TAB, 其結構與數 據庫表格 SFLIGHT 相同。 本示例介紹 如何採用兩 種不同的步 驟創建同一 內表。 TYPES VECTOR_TYPE TYPE I OCCURS 10. 同 創建內表數 據類型 (頁 99) 中所示,該 示例創建數 據類型 ITAB 作為內表。通過使用 DATA 語句的 TYPE 參數引用 ITAB, 使資料物件 TAB1 與 ITAB 結構相同。通過使用 DATA 語句的 LIKE 參數引用 TAB1, 使資 料物件 TAB2 結構相同。 創建的 TAB2 帶表頭行。 因此,可以 在程式中使 用 TAB2-COLUMN1、 TAB2COLUMN2 和 TAB2-COLUMN3 等定位表格 工作區域 TAB2。 exp : DATA FLIGHT_TAB LIKE SFLIGHT OCCURS 10. TYPES: BEGIN OF DEEPLINE. END OF LINE. END OF DEEPLINE. TABLE1 TYPE VECTOR. COLUMN3 TYPE I. TYPES ITAB TYPE LINE OCCURS 10. TYPES DEEPTABLE TYPE DEEPLINE OCCURS 10. 在此創建一 個內表資料 類型 VECTOR_TYPE, 其行包含首 先創建的基 本類型 I 欄位。然後 ,通過引用 VECTOR_TYPE 創建資料對 象 VECTOR。 通過使用 WITH HEADER LINE 選項還創建 表格工作區 域 VECTOR。 在這種情況 下,表格工 作區域包含 一種類型 I 欄位,可以 通過名稱 VECTOR 定位。 DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE. TABLE2 TYPE ITAB. END OF LINE. COLUMN2 TYPE I. DATA TAB1 TYPE ITAB. TYPES ITAB TYPE LINE OCCURS 10. 在這種情況 下,通過直 接在 DATA 語句中使用 OCCURS 選項創建完 全一樣的數 據類型 VECTOR。 .COLUMN2 TYPE I. DATA VECTOR TYPE VECTOR_TYPE WITH HEADER LINE. COLUMN1 TYPE I. COLUMN3 TYPE I. 本示例創建 與上例相同 的內表資料 類型(VECTOR 和 ITAB) 。然後創建 資料類型 DEEPLINE 作為欄位串 包含這些 內表作為組 件。通過該 欄位串,數 據類型 DEEPTABLE 被創建為內 表。因此該 內表的元素 本身就 是內 表。 exp : TYPES: BEGIN OF LINE.

6.LINE-COL2. LOOP AT ITAB INTO LINE. ENDLOOP. END OF LINE. 2. ENDDO. 5. TYPES itabtype {TYPE tabkind OF linetype LIKE tabkind OF lineobj} [WITH [UNIQUE|NON-UNIQUE] keydef] [INITIAL SIZE n]. APPEND LINE TO ITAB. TYPES type(len). TYPES type. 舉例二 (不使用 WORK AREA) DATA : BEGIN OF ITAB OCCURS 10.. TYPES itabtype TYPE RANGE OF type. TYPES itabtype LIKE RANGE OF f. COL2 TYPE I. END OF structype. 3. COL2 TYPE I. WRITE : / LINE-COL1. LINE-COL1 = SY-INDEX. TYPES itabtype {TYPE linetype|LIKE lineobj} OCCURS n. DO 2 TIMES. 4. COL1 TYPE I. TYPES: BEGIN OF structype ..*-------------------------------------------------------------------------------------* 1. DATA ITAB LIKE LINE OCCURS 10. *-------------------------------------------------------------------------------------* APPEND LINE 格式:APPEND <work area> TO <internal table> 舉例一:(使用 WORK AREA) DATA : BEGIN OF LINE. ITAB-COL1 = SY-INDEX. END OF ITAB. COL1 TYPE I. LINE-COL2 = SY-INDEX ** 2. DO 2 TIMES. .

APPEND INITIAL LINE TO ITAB. ITAB-COL1 = 'ABC'. ENDLOOP.與 APPEND 的區別是: COLLECT 指令在非數值欄位相同 的情況下. COL1(3) TYPE C. ENDDO. COLLECT LINE COLLECT 指令也是將元素加入 Internal table 中. COL2 TYPE I. COL2 TYPE I. APPEND ITAB. WRITE: / ITAB-COL1. (加入另一個 Internal table 的元素) 格式: APPEND LINES OF <itab1> [FROM <n1> ] [TO <n2>] TO <itab2>.可選取自<n1>至<n2>的範圍. ITAB-COL2 = 20. ENDLOOP. ITAB-COL1 = SY-INDEX. ITAB-COL2 = 10. 格式: COLLECT [<work area> INTO ] <itab> DATA: BEGIN OF ITAB OCCURS 3.ITAB-COL2 = SY-INDEX ** 2. . APPEND LINES OF ITAB TO JTAB.將數值欄位匯總. ITAB-COL1 = 'XYZ'. 舉例三. 將<itab1>的元素加入至<itab2>中. DO 3 TIMES. LOOP AT ITAB. ITAB-COL2 = SY-INDEX ** 2. exp: DATA: BEGIN OF ITAB OCCURS 10. APPEND ITAB. COLLECT ITAB. WRITE : / ITAB-COL1. COL1 TYPE C. END OF ITAB. ENDDO. LOOP AT ITAB. END OF ITAB.ITAB-COL2. ITAB-COL2.

"插入在位置 2 之前 LOOP AT ITAB INTO LINE. APPEND LINE INTO ITAB. INSERT LINE INTO ITAB INDEX 2.LINE-COL1. ITAB-COL1 = 'ABC'. 分別為: ITAB-COL1 ITAB-COL2 'ABC' 90 'XYZ' 20 *-------------------------------------------------------------------------------------* INSERT LINE 將元素插入在指定的 internal table 位置之前.工作區中的元素. COLLECT ITAB. 此時. LINE-COL1 = SY-INDEX *10. END OF LINE. <itab>: internal table [INDEX <idx>]: internal table 的記錄號.(新加入的元素放在此記錄前面) Example: DATA: BEGIN OF LINE. COL2 TYPE I. COL1 TYPE I. DO 3 TIMES. ENDDO. WRITE: / SY-TABIX. "SY-TABIX 為 Table 位置 ENDLOOP. 格式: INSERT [<wa> INTO] [INITIAL LINE INTO ] <itab> [INDEX <idx>] 或者: INSERT LINES OF <itab1> [FROM <n1> TO <n2>] INTO <itab2> INDEX <idx> 其中: <wa>即 work area.LINE-COL2. 執行結果: 1 10 2 100 20 200 "插入的元素 . LINE-COL2 = SY-INDEX *20. [INITIAL LINE INTO] :插入一筆初始化的記錄. DATA ITAB LIKE LINE OCCURS 10. LINE-COL2=200.COLLECT ITAB. LINE-COL1=100. internal table 中放的是 2 筆數據. ITAB-COL2 = 80.

位置在第三個元素之前 *-------------------------------------------------------------------------------------* 讀取 internal table 格式一: LOOP AT <itab> [INTO <wa>][FROM <n1> TO <n2>][WHERE <conditions>] <statement> ENDLOOP. END OF ITAB.LINE-COL1. READ TABLE ITAB INDEX 3. DO 10 TIMES. ITAB-COL2. 可選取自<n1>至<n2>的範圍 Example: APPEND LINES OF ITAB TO JTAB INDEX 3. ITAB-COL1. 'ITAB-COL2 = '. ITAB-COL1 = SY-INDEX. APPEND ITAB. 僅讀取 COL1 > 100 的元素 格式二: READ TABLE <itab> [INTO <wa>] [INDEX <idx> / WITH KEY <conditions>] 舉例. Example: LOOP AT ITAB INTO LINE WHERE COL1 >100.) WRITE: / 'ITAB-COL1 = '. COL2 TYPE I. (或者: READ TABLE ITAB WITH KEY COL1 = 3. WRITE: / SY-TABIX. . ENDDO. 位置在 <idx>之前. 將 ITAB 所有元素插入 JTAB 中.3 20 40 4 30 60 插入另一 Internal Table 元素 語法: INSERT LINES OF <itab1> [FROM <n1> TO <n2>] TO <itab2> INDEX <idx> 將<itab1>的元素插入至<itab2>中. ENDLOOP. COL1 TYPE I. ITAB-COL2 = SY-INDEX * 2. (格式二) DATA: BEGIN OF ITAB OCCURS 10.

READ TABLE ITAB INDEX 3. MODIFY T_SALARY TRANSPORTING salary WHERE birthday = '1999/12/06'. 將第三筆記錄的 COL1 欄位的值修改為 29. Default 為 ASCENDING. 找不到則傳回 4. T_SALARY . 找到的值放入 LINE 中 若找到 SY-SUBRC 傳回 0. 放入 LINE 的欄位中 根據欄位內容尋找 語法: READ TABLE <itab> INTO <wa> Example: ITAB-COL1 = 'ABC'. <itab>必須宣告有 work area *-------------------------------------------------------------------------------------* 修改 internal table 中的值 格式: MODIFY <itab> [FROM <wa>][INDEX <idx>][TRANSPORTING <f1><f2>…][WHERE <conditions>] 舉例一. Example: SORT ITAB DESCENDING BY COL2. MODIFY ITAB FROM LINE TRANSPORTING COL1. . 或: DELETE <itab>[FROM <n1> TO <n2>] [WHERE <conditions>] Internal table 排序 SORT <itab> [<order way>][BY <f1><f2>…] 其中:<order way> 有 DESCENDING 和 ASCENDING. DELETE internal table 中的欄位 格式: DELETE <itab> INDEX <idx>. LINE-COL1 = 29. READ TABLE ITAB INTO LINE.執行結果同樣是: ITAB-COL1 = 3 ITAB-COL2 = 6.salary = 50. 舉例二. <f1>: 為指定排序的欄位. 找出 ITAB 中 COL1 欄位內容是 ABC 的元素. Example: READ TABLE ITAB INTO LINE INDEX 5 讀取 ITAB 的第 5 個元素資料.

LINE-COL2 = SY-INDEX ** 2. END OF LINE. OCC TYPE I.但只能在 LOOP 中使用. DESCRIBE TABLE ITAB LINES LIN OCCURS OCC. DESCRIBE TABLE ITAB LINES LIN OCCURS OCC. LINE-COL2. 例: LOOP AT ITAB INTO LINE. LINE-COL1 和 LINE-COL2 存數值總和初始化 internal table . APPEND LINE TO ITAB. WRITE: / LIN. SUM. DATA ITAB LIKE LINE OCCURS 10. 總和計算存放與 work area 中.將 ITAB 根據 COL2 欄位遞減排序 *-------------------------------------------------------------------------------------* 確定內表屬 性 如果在處理 過程中想知 道內表一共 包含多少行 ,或者想知 道定義的 OCCURS 參數的大小 ,請使用 DESCRIBE 語句,用法 如下: 語法 DESCRIBE TABLE <itab> [LINES <lin>] [OCCURS <occ>]. DO 1000 TIMES. 如果使用 LINES 參數,則將 填充行的數 量寫入變數 <lin>。 如果使用 OCCURS 參數,則將 行的初始號 寫 入變數 <occ>。 DATA: BEGIN OF LINE. DATA: LIN TYPE I. ENDLOOP. WRITE: / LIN. LINE-COL1 = SY-INDEX. OCC. COL1 TYPE I. COL2 TYPE I. 其輸出為: 0 1.000 10 10 在此創建內 表 ITAB。 在填充表格 前後執行 DESCRIBE 語句。更改 當前行號, 但無法更改 初始行號。 *-------------------------------------------------------------------------------------* 加總 SUM. WRITE: / LINE-COL1. ENDDO. OCC.

釋放記憶體空間. WRITE / NUMBER. CLEAR NUMBER.. exp: DATA NUMBER TYPE I VALUE '10'.使用在沒有 HEADER LINE 的 Internal Table 中. 清除所有元素 CLEAR <itab>. N1 TYPE I VALUE 10. 清除所有 元素 FREE <itab>. N2 TYPE I VALUE 20. 輸出為: 10 0 CLEAR 語句將欄位 NUMBER 的內容從 10 重置為默認 值 0。 *-------------------------------------------------------------------------------------* 添加欄位 順序並將結 果賦給另一 個欄位 語法 ADD <n1> THEN <n2> UNTIL <nz> GIVING <m>. 用在 REFRESH 和 CLEAR 指令之後 將值重置為 預設值 可以用 CLEAR 語句重置任 何資料物件 值,如下所 示: 語法 CLEAR <f>.. 清空<itab>的 Header Line.REFRESH <itab>.釋放(Release) Internal Table 所佔的記憶體空間. 、<nz> 是在記憶體中 相同類型和 長度的等距 欄位序列, 則進行求和 計算並將結 果賦給 <m> 添加欄位 順序並將結 果添加到另 一個欄位的 內容中 語法 ADD <n1> THEN <n2> UNTIL <nz> TO <m>. WRITE NUMBER. 清空<itab>中的值. 如果 <n1>、<n2>、. 該語句除了 將欄位總和 添加到 <m> 的舊內容中 之外,與上 面語句的工 作方式相同 。 有關其它相 似變體的信 息,參見有 關 ADD 語句的關鍵 字文檔。 DATA: BEGIN OF SERIES. .使用在有 HEADER LINE 的 Internal Table 中.

N5 TYPE I VALUE 50. N6 TYPE I VALUE 60.N3 TYPE I VALUE 30. N4 TYPE I VALUE 40. 如輸入 020165 表 1965 年 02 月 01 日. END OF SERIES. WRITE SUM. PARAMETER: 輸入一個變量或欄位內容 2. 執行結果: 在日期的輸入格式上為 MM/DD/YY . 使用的命令是 PARAMETERS 及 SELECTION-OPTIONS: 1. MM/DD/YYYY. 但無法使用 F 格式(浮點數) 語法: PARAMETERS <p> [DEFAULT <f>] [LOWER CASE] [OBLIGATORY] [AS CHECKBOX] [RADIOBUTTON GROUP <rad>] Example: PARAMETERS: NAME(8). AGE TYPE I. BIRTH TYPE D. 與 02/01/65 的輸入是一樣的. SELECTION-OPTIONS: 使用條件篩選畫面來輸入數據 PARAMETERS 指令 基本的輸入命令. ADD SERIES-N1 THEN SERIES-N2 UNTIL SERIES-N5 GIVING SUM. 日期輸入範圍為西元 1950 年至 2049 年 1. ADD SERIES-N2 THEN SERIES-N3 UNTIL SERIES-N6 TO SUM. 輸出如下: 150 350 在此,將 N1 到 N5 元件內容求 和並將其值 賦給欄位 SUM。然 後,將 N2 到 N6 組件求 和並將其添 加到 SUM 的值中。 *-------------------------------------------------------------------------------------* 螢幕輸入命令 在 ABAP/4 中要從螢幕輸入變量. MMDDYY 或 MMDDYYYY . DATA SUM TYPE I. 類似如 BASIC 的 INPUT 命令. DEFAULT 設定輸入的預設值 . WRITE / SUM.

GT(大於). ENDSELECT.. 螢幕上會出現一個 ? .NP(不包含) 3.OPTION... SIGN: I: 表篩選條件符合的資料 E: 表篩選條件不符合的資料 2. LOW: 最小值 .LE(小於). 直接執行或放入 Internal Table 中. 使用者必須要輸入才可. GIRL RADIOBUTTON GROUP SEX. 輸入條件後可配合 SELECT 指令自 TABLE 讀取符合條件的資料.該 Internal table 有四個欄位. OBLIGATORY 強制要求輸入. AS CHECKBOX 輸入 CHECKBOX 的格式 Example: PARAMETERS: TAX AS CHECKBOX DEFAULT 'X'. 3.. PARAMETERS: LOW LIKE SPFLI-CARRID. 2. OPTION: 比較的條件符號 EQ(等於).. 執行結果: 5. SELECT * FROM SPLFI WHERE CARRID BETWEEN LOW AND HIGH.CP(包含). BIRTH TYPE D DEFAULT '19650201'.NE(不等於).. RADIOBUTTON GROUP <rad> 輸入 RADIO BUTTON GROUP 的方式 Example: PARAMETERS: BOY RADIOBUTTON GROUP SEX DEFAULT 'X'. LOWER CASE ABAP/4 預設是將字串輸入值自動轉換為大寫.HIGH. HIGH LIKE SPFLI-CARRID.LOW. 加上此參數會將輸入的資料轉成小寫. 條件有四個參數: 1. *-------------------------------------------------------------------------------------* SELECTION-OPTIONS SELECTION-OPTIONS 所輸入的值實際上是放在 internal table 中的. NTD AS CHECKBOX. 4.Example: PARAMETERS: COMPANY(20) DEFAULT 'DELTA'.分別 是:SIGN... exp : TABLES SPLFI. . 條件篩選檢查條件輸入畫面指令.

SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID. 可配合使用 SELECT 指令 1.4. LOWER CASE 輸入轉換成大寫 5.使用 WHERE <條件式> Example: TABLES SPFLI. .SPFLI-CITYFROM. WRITE: / SPFLI-CONNID. SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID. HIGH: 最大值 語法: SELECTION-OPTIONS <check-option> FOR <table-field> Example: TABLES SPFLI. DEFAULT <begin> TO <end> 設定開始結束範圍輸入預設值 Example: SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID DEFAULT '2042' TO '4555'.使用 CHECK 參數 Example: TABLES SPFLI. ENDSELECT. CHECK AIRLINE. 2. SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.SPFLI-CITYTO. NO INTERVALS 設定不要區間範圍輸入畫面 4. SELECT * FROM SPFLI. NO-EXTENSION 設定不要 Multi-Option 輸入畫面 3. 將條件的輸入值存放入 AIRLINE. SELECT * FROM SPFLI WHERE CONNID IN AIRLINE. OBLIGATORY 強制要求輸入 *-------------------------------------------------------------------------------------* 配合 SELECT 命令 條件輸入完後要將符合條件的資料篩選出來. 2. 篩選選擇為 SPFLI 中的 CONNID 欄位 改變條件輸入格式 1.

產生空白列 語法: SELECTION-SCREEN SKIP [<n>] Example: SELECTION-SCREEN SKIP 2. SELECT-OPTIONS: S_CARRID FOR SPFLI-CARRID. ENDIF. S_CONNID FOR SPFLI-CONNID. SPFLI-CITYFR IN S_CITYFR. 產生兩列空白列 2.SPFLI-CITYTO. 3. SPFLI-CONNID. SPFLI-CONNID IN S_CONNID. * exp: TABLES SPFLI. ENDSELECT. *-------------------------------------------------------------------------------------* SELECTION-SCREEN 1.SPFLI-CITYTO. ENDSELECT. WRITE: / SPFLI-CONNID. SPFLI-CITYFROM. IF SPFLI-CONNID IN AIRLINE. WRITE: / SPFLI-CARRID. S_CITYTO FOR SPFLI-CITYTO. SPFLI-CITYTO.產生底線 語法: SELECTION-SCREEN ULINE / <pos>(length) . S_CITYFR FOR SPFLI-CITYFROM.SPFLI-CITYFROM.使用 IF … IN 敘述 Example: SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID. SPFLI-CITYTO IN S_CITYTO. ENDSELECT. SELECT * FROM SPFLI. SELECT * FROM SPFLI.SPFLI-CITYFROM.WRITE: / SPFLI-CONNID. CHECK: SPFLI-CARRID IN S_CARRID.

4. 同一列中輸入數個資料項 語法: SELECTION-SCREEN BEGIN OF LINE. Example: SELECTION-SCREEN BEGIN OF LINE. PARAMETER R2 RADIOBUTTON GROUP GR1. SELECTION-SCREEN END OF BLOCK RADIO. PARAMETERS NAME(10).Example: SELECTION-SCREEN ULINE /10(30). . SELECTION-SCREEN COMMENT /10(30) REMARK. SELECTION-SCREEN POSITION 40.印出備註說明 語法: SELECTION-SCREEN COMMENT / <pos>(length) <name> Example: REMARK = 'Pls enter your name'. PARAMETER R3 RADIOBUTTON GROUP GR1. PARAMETERS BIRTH TYPE D. ……. 40 格輸入 BIRTH 的內容 5. …… SELECTION-SCREEN END OF LINE. 在 20 格輸入 NAME 內容. SELECTION-SCREEN END OF BLOCK <block>. *-------------------------------------------------------------------------------------* SQL 語法 WITH FRAME . 繪出 BLOCK PANEL 語法: SELECTION-SCREEN BEGIN OF BLOCK <block> [WITH FRAME [TITLE <title>]. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN POSITION 20. Example: SELECTION-SCREEN BEGIN OF BLOCK RADIO PARAMETER R1 RADIOBUTTON GROUP GR1. 自第 10 格開始產生長度 30 的底線 3.

開 始下一次循環.如果邏輯表達式成立. 退出循環. 而 NATIVE SQL 語句則是標准的 SQL 語句.SQL 語法分為 DDL(DATA DEFINE LANGUAGE)語言和 DML(DATA MULTIPULATION LANGUAGE)語言. ABAP/4 中可以利用 SQL 語法創建或讀取 TABLE. (從 MARD 中抓取所有料號=3520421700 的資料) . 它直接針對 Databases 操作. SQL 語句有 OPEN SQL 語句和 NATIVE SQL 語句. <Statements>.讀取數據最常用的方法就是 通過 SQL 語法實現的.DDL 語言是指數據定義語言. DML 語言是 數據操作語言.則繼續執行. ENDSELECT.是循環方式讀取記錄的. 利用循環方式讀取所有記錄 SELECT …. SELECT [DISTINCT] * FROM MARD WHERE MATNR = '3520421700'. OPEN SQL 語句不是標准 SQL 語句. 例如: TABLES MARD. CHECK <logistic statement>.ENDSELECT..例如 CREATE 等.否則. 相關的命令: EXIT.利用 OPEN SQL 語句能在 Databases 和 Command 之間產 生一個 BUFFER.是 ABAP/4 語言.所以它有一個語言轉換的過程.經常需要從 TABLE 中根據某些條件讀取數據. 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>排序的欄位元及方式 相關的系統變量: SY-SUBRC = 0 表示讀取數據成功 <> 0 表示未找到符合條件的記錄 SY-DBLNT: 被處理過的記錄的筆數.我們在編寫 ABAP4 程式的時候. INSERT 等語句.例如 SELECT.

.. . INTO CORRESPONDING FIELDS OF <work area> . INTO <work area> .SPFLI-PLANT... WERKS LIKE MARD-WERKS.. LGORT LIKE MARD-LGORT. DATA NAME(10). LABST LIKE MARD-LABST. INTO TABLE <internal table> . (將讀取的結果放在 Internal table ITAB 中) DATA: BEGIN OF WA. INTO CORRESPONDING FIELDS OF TABLE <internal table> . ◆將讀取的記錄放在 work area 中.. APPENDING CORRESPONDING FIELDS OF TABLE <internal table> 舉例一: TABLES MARD. WRITE: / SPFLI-COMPANY. SELECT * FROM (NAME) INTO WA. END OF ITAB. SELECT SINGLE * FROM SPFLI WHERE PLANT ='CHUNGLI' AND TEL='4526174'. LINE(240). END OF WA...並且加入 Internal table 中. APPENDING TABLE <internal table> . APPEND ITAB.. 格式有: . MATNR LIKE MARD-MATNR..SPFLI-TEL. SELECT MATNR WERKS LGORT LABST INTO CORRESPONDING FIELDS OF ITAB FROM MARD WHERE MATNR = '3520421700'... CLEAR ITAB.. fn) 變量組.. INTO (f1.◆讀取一筆資料 Example: TABLES SPFLI.. . NAME = 'SPFLI'. DATA: BEGIN OF ITAB OCCURS 10. . ENDSELECT...

DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE. DATA WA LIKE TABLES. 一次讀取 5 筆記錄 .WRITE: / WA-LINE. t_mtart. INTO TABLE <itab> PACKAGE SIZE <n> 一次讀取 <n> 筆記錄至 <itab>中 Example: TABLES SPFLI. maktx 中)。 Example: TABLES SPFLI.放在變量 t_matnr. (從 MARD 中抓取料號=3520421700 的料號、類型和描述. SELECT MATNR MTART MAKTX INTO (t_matnr. SELECT * FROM SPFLI INTO ITAB PACKAGE SIZE 5. SELECT * FROM SPFLI INTO WA. 資料庫表名 稱 SPFLI 被賦給字元 欄位 NAME。SELECT 語句將所有 的行從 SPFLI 中讀到目標 區 WA 中。在 該示 例中,WA 與 SPFLI 的結構並不 相同,每一 行都將自動 地轉換成字 符欄位. 逐筆寫入 WA 工作區中 舉例三.. ENDSELECT. ENDSELECT. 一次讀 10 筆(Initial Table 的長度)記錄存入 ITAB 中 SELECT . ENDSELECT. WRITE: / WA-COMPANY.WA-PLANT. <Statements>. 舉例二. t_mtart. TABLES MARD. SELECT * FROM SPFLI INTO ITAB.. INTO TABLE <itab> Example: TABLES SPFLI. DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE. maktx) FROM MARD WHERE MATNR = '3520421700'. 將讀取的資料寫入 Initial Table 中 語法: SELECT .

SBOOK-SMOKER. ENDSELECT. DATA: BEGIN OF WA. END OF WA. SBOOK-LUGGWEIGHT. (利用參數 ORDER BY 所指定的欄位排序) *-------------------------------------------------------------------------------------* ◆ 抓取數據的條件敘述 (1) BETWEEN <g1> AND <g2> 例如: WHERE YEAR BETWEEN 1995 AND 2000. CITYTO LIKE SPFLI-CITYTO. CITYFROM LIKE SPFLI-CITYFROM. WA-CITYFROM. NUMBER TYPE I VALUE 1. WA-CITYTO. SBOOK-WUNIT. SBOOK-INVOICE.exp : TABLES SPFLI. ENDSELECT. SELECT * FROM SBOOK WHERE CARRID = 'LH' AND CONNID = '0400' AND FLDATE = '19950228' ORDER BY BOOKID ASCENDING. 輸出如下所 示: 在該示例中 ,系統只將 資料庫表 SPFLI 中選定行的 列 CITYFROM 和 CITYTO 傳送到 WA 中。WA 中的組件 NUMBER 保持不變。 *-------------------------------------------------------------------------------------* 按指定的欄位排序 TABLES SBOOK. SBOOK-CUSTOMID. ('%'是萬用字元號) . (2) LIKE <g> 例如: WHERE NAME LIKE 'MIKE%'. SBOOK-CUSTTYPE. WRITE: / WA-NUMBER. WRITE: / SBOOK-BOOKID. SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF WA.

ORDER BY PRIMARY KEY. (表示 PLANT 只要是'CHUNGLI'或'TAOYUAN'或'LIUTU'都可以). CODE(6) TYPE C.可以直接寫成: INSERT <internal table> 例如: DATA: BEGIN OF WA OCCURS 10.. DATA: VEN LIKE WA OCCURS 10. 根據 PRIMARY KEY 遞增排序 (2)…ORDER BY <f1> [DESCENDING] <f2> [DESCENDING] Example: SELECT * FROM IM ORDER BY PART . 例如: WHERE PLANT IN ('CHUNGLI'. 'TAOYUAN'. LTD'. . (4) ORDER BY 敘述 指定排序的欄位或順序 (1). END OF WA. WA-NAME = 'XINGDA ELECTRONICS CO. 如果 work area 的名稱就是 internal table 的名稱. … WA-CODE = '530120'. ◆從另外一個 Internal table 中 INSERT 資料 . CODE(6) TYPE C.. WA-NAME = 'XINGDA ELECTRONICS CO.(3) IN (<g1>…<gn>) 是<g1>…<gn>裡面的任意一個值即可. INSERT INTO VEN VALUES WA . NAME(30) TYPE C.LTD'. END OF WA.'LIUTU'). … WA-CODE = '530120'. NAME(30) TYPE C. INSERT WA.. *-------------------------------------------------------------------------------------* INSERT 語句 ◆從 work area 加入到 Internal Table 中 格式: INSERT INTO <database> VALUES <work area> 例如: DATA: BEGIN OF WA.

也可寫成 INSERT SPFLI FROM ITAB. 若有重覆則 SY-SUBRC 會傳回 4 Example: TABLES SPFLI.自 Work Area 工作區 語法: INSERT INTO <database> VALUES <wa> Example: TABLES SPFLI. ITAB-NO = '34051920'. ITAB-COMPANY = 'DELTA'. 2. ….格式: INSERT <itab1> FROM TABLE <itab2> [ACCEPTING DUPLICATE KEY] 將<itab2>中非 NULL 的資料加入<itab1>中. DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE. INSERT SPFLI FROM SPFLI. 所以也可 寫成 INSERT SPFLI. INSERT SPFLI VALUES WA. 加入一筆記錄至資料庫 1. DATA WA LIKE SPFLI.加上[ACCEPTING DUPLICATE KEY]能限制相同 PRIMARY KEY 不重複加入. 將 ITAB 資料加入 SPFLI 中. SPFLI-NO='34299876'. WA-NO = '34051920'. WA-COMPANY='DELTA'. INSERT SPFLI FROM TABLE ITAB . 將 Work Area SPFLI 中的資料加入資料庫檔案 SPFLI 中 因 Work Area SPFLI 的結構與資料檔 SPFLI 一樣. APPEND ITAB. SPFLI-COMPANY='HP'.自 Internal Table 語法: INSERT <database> FROM TABLE <itab> [ACCEPTING DUPLICATE KEY] 將 <itab>中非 NULL 的資料加入 <database>中. 加上 [ACCEPTING DUPLICATE KEY]能檢查不加入有重覆 primary key.

使用 Primary Key 語法: UPDATE <database> FROM <wa> Example: TABLES SPFLI. WA-COMPANY='DELTA'. 將其 COMPANY 欄位異動為 DELTA 2. MODIFY 語法 MODIFY <internal table> [FROM <work area>]. DATA WA LIKE SPFLI.使用條件式 語法: UPDATE <database> SET < f1>=<values>… WHERE <condition> 根據條件式異動符合條件式的記錄 Example: UPDATE SPFLI SET NO='34051920' COMPANY = 'DELTA' WHERE TEL='4526107'. 若找到則更新異動. . UPDATE SPFLI FROM WA. 則會找到 NO='34051920' 的記錄. MODIFY SPFLI FROM WA. 若找不到則新增記錄 語法: MODIFY <database> FROM <wa> Example: WA-NO='34051920'.ACCEPTING DUPLICATE KEY. *-------------------------------------------------------------------------------------* 3. 根據 Primary Key 尋找資料檔中符合的記錄. WA-NO='34051920'. *-------------------------------------------------------------------------------------* UPDATE 指令 異動已存在的記錄內容 1. 如 SPFLI 的 Primary Key 是 NO. WA-COMPANY='DELTA'.

或: DELETE <internal table> [WHERE <conditions>] 刪除資料檔的記錄 1.開啟 Database Cursor 語法: OPEN CURSOR <c> FOR SELECT … WHERE <condition> Example: TABLES SPFLI. 則會找到 NO='34051920' 的記錄. C1 TYPE CURSOR. 將經 SELECT 指令讀取的記錄存放至此暫存區. 再由此暫存區放至 Work Area 中. OPEN CURSOR C1 FOR SELECT * FROM SPFLI WHERE AREA ='TAIWAN'.使用 Primary Key 語法: DELETE <database> FROM <wa> Example: TABLES SPFLI. *-------------------------------------------------------------------------------------* 5. 找到後將此筆刪除 2. DATABASE CURSOR Database Cursor 是一個資料庫暫存區.使用條件式 語法: DELETE FROM <database> WHERE <condition> 根據條件式刪除符合條件式的記錄 Example: DELETE FROM SPFLI WHERE AREA = 'AMERICAN'. DATA WA LIKE SPFLI. WA-COMPANY='DELTA'.4. 1. . 如 SPFLI 的 Primary Key 是 NO. DELETE 語法 DELETE <internal table> [FROM <work area>]. DELETE SPFLI FROM WA. DATA: WA LIKE SPFLI. WA-NO='34051920'. 可減少資料庫讀取的次數.

PRIMARY KEY (CLIENT. DATA: F1(3). ARG1 CHAR(3) NOT NULL. 可使用 ROLLBACK WORK. 舉例二. F3(3).可使用 COMMIT WORK 指令. ARG2 CHAR(3) NOT NULL. 如果反悔要復原. *-------------------------------------------------------------------------------------* COMMIT WORK & ROLLBACK WORK 要確定資料成功寫入資料庫. ARG2) ) ENDEXEC. 讀取下一筆 Cursor 位置的資料存入 WA.如: COMMIT WORK.讀取 Database Cursor 的資料存入 Work Area 語法: FETCH NEXT CURSOR <c> INTO <wa> Example: FETCH NEXT CURSOR C1 INTO WA. 舉例一. 相反的. *-------------------------------------------------------------------------------------* 使用 NATIVE SQL 指令 語法格式: EXEC SQL [PERFORMING <form>]. F2(3). 關閉 Database Cursor 語法: CLOSE CURSOR <c> Example: CLOSE CURSOR C1. CREATE TABLE AVERI_CLNT ( CLIENT CHAR(3) NOT NULL. <statements> ENDEXEC. 如果已無資料可讀. 可復原在上個 COMMIT WORK 指令之後的資料. FUNCTION CHAR(10) NOT NULL. SY-SUBRC <>0. EXEC SQL. F3 = ' 1 ' . ARG1.2. 如: ROLLBACK WORK.

END OF WA.就用 EXIT FORM SQL 結束調用. ENDFORM.這個 FORM 能被逐次調用. EXEC SQL PERFORMING OUTPUT.就用 PERFORMING 參數.WA-AGE. F2. 例如: DATA: F1(3). F3 = '010' EXEC SQL PERFORMING WRITE_AVERI_CLNT. FORM OUTPUT. NATIVE SQL 中的 SELECT 語句沒有 CHECK 權限的功能. AGE TYPE I. SELECT CLIENT. 注意: a.我們想要逐筆記錄處理時.. b. WRITE: / F1. SELECT CLIENT. :F2 FROM AVERI_CLNT WHERE ARG2 = :F3 ENDEXEC PERFORMING <form name>的使用: 如果 NATIVE SQL 的 SELECT 命令執行結果是抓到多筆記錄. :F2 FROM AVERI_CLNT WHERE ARG2 = :F3 ENDEXEC. DATA: BEGIN OF WA. NAME(8). .所以在抓取資料時必須指定特定的 Client. DATA F1 TYPE I. WRITE: / WA-NAME. F3(3). NATIVE SQL 把 TABLE 中的 MANDT(client)欄位當作一般欄位使用. ENDFORM. FI = 20. ENDEXEC. F2(3).EXEC SQL. ARG1 INTO :F1.如果想中止調用. SELECT NAME. FORM WRITE_AVERI_CLNT. ARG1 INTO :F1.AGE INTO :WA FROM NAME_TABLE WHERE AGE >= :F1.

結束.c. 在登入 SAP R/3 系統時. IF 述敘 語法: IF <Condition1>. <Stetement 3> …. 2. WRITE / '3 is less than 8'. ELSE.要正確書寫. CASE 敘述 語法: CASE <變數 f>. <else Statement > ENDIF.在巢狀迥圈之中無法使用 ELSE 敘述.一般情況下是以句號. f. <Statement 2> ELSEIF <Condition3>. (2). WHEN <Value1>. <Statement 1 > ELSEIF <Condition2>.雙引號"不表示注釋.我們已經自動與 Database 連接. ENDIF.結束. e. *-------------------------------------------------------------------------------------* 結果語句 條件述敘 1. <Statement1> WHEN <Value2>. 某些數據庫系統對 TABLE 名字和 FIELD 名字有大小寫區別. <Statement2> …. 在 NATIVE SQL 中. . (1)..在每個判斷敘述之後要加上 . ELSE 敘述屬 IF 敘述 Example: IF 3 > 8.所以在執行 NATIVE SQL 時並不需要 CONNECT 語句. 一條 NATIVE SQL 語句可以以分號. d.

S=0. ENDCASE.S 執行結果: 1+2+3+…+10=55 2. WRITE: / . 執行結果: X X DO VARYING I FROM 1 TO 10. 迥圈敘述 1.條件迥圈 語法: WHILE <Condition>.計次迥圈 語法: DO [n TIMES] [VARYING <f> FROM <start> TO <end>. WHEN OTHERS. CASE S.'1+2+3+…+10='. WRITE / 'X'. <others Statement> ENDCASE. Example: DO 2 TIMES. <loop block> ENDDO. S = S + I. WRITE / 'String is X'. <Statement Block> ENDWHILE Example: I = 1. .WHEN OTHERS. Example: S = 'A'. ENDDO. ENDDO. WHEN 'X'. WRITE / 'String is not X'.

EXIT 跳離迥圈敘述 Example: DO 10 TIMES. ENDIF WRITE / SY-INDEX. I=I+1.WHILE I <= 10. IF SY-INDEX = 2. CHECK <Condition> CHECK 之後條件成立才繼續往下執行迥圈 Example: DO 5 TIMES. CONTINUE 跳至迥圈的下一次 Example: DO 3 TIMES. CONTINUE. 執行結果: 1 3 2. WRITE / SY-INDEX. . ENDWHILE. EXIT.S. ENDDO. IF SY-INDEX = 4. 執行結果: 2 3 4 3. CHECK SY-INDEX BETWEEN 2 AND 4. WRITE: / ' 1+2+3+…+10='. WRITE / SY-INDEX. S = S+I. 執行結果為: 1+2+3+…+10=55 迥圈控制敘述 1. ENDDO.

SY-SUBRC UNDER 'SY-SUBRC'.'. 'SY-SUBRC'. SY-FDPOS UNDER 'SY-FDPOS' SEARCH STRING FOR '. WRITE: / 'itt '. SY-SUBRC UNDER 'SY-SUBRC'.'. WRITE: / 'X'. 'SY-FDPOS'. SY-FDPOS UNDER 'SY-FDPOS' SEARCH STRING FOR 'itt '.ENDDO. 無窮迥圈必須配合 EXIT 敘述來執行 *-------------------------------------------------------------------------------------* 搜索字串 要搜索特定 模式的字元 串,請使用 SEARCH 語句,用法 如下: 語法 SEARCH <c> FOR <str> <options>. SEARCH STRING FOR 'X'. <Statement Block> ENDDO.<pattern>. 搜 索 <pattern> ,但是不忽 略尾部空格 。 *<pattern> 搜 索以 <pattern> 結尾的詞。 <pattern>* 搜 索以 <pattern> 開始的詞。 單詞之間用 空格、逗號 、句號、分 號、冒號、 問號、嘆號 、括弧、斜 杠、加號和 等號等分隔 。 DATA STRING(30) VALUE 'This is a little sentence. WRITE: / 'Searched'. ULINE /1(26). 該語句在字 段 <c> 中搜索<str> 中的字串 。如果成功 ,則將 SY-SUBRC 的返回代碼 值設置為 0 並 將 SYFDPOS 設置為欄位 <c> 中該字串 的偏移量。 否則將 SY-SUBRC 設置為 4。 搜索串 <str> 可為下列格 式之一: <str> 目的 <pattern> 搜 索 <pattern>( 任何字元順 序)。忽略 尾部空格。 . 執行結果: 1 2 3 無窮迥圈 DO . .e .

WRITE: / '*e '. SEARCH STRING FOR 's*'. SY-SUBRC UNDER 'SY-SUBRC'.e . SY-FDPOS. 0 15 *e 0 10 s* 0 17 搜索字元字 段 <c> 的各種選項 (<options>) 如下 ABBREVIATED 在欄位 <c> 中搜索包含 <str> 中指定字元 串的單詞, 其中字元可 能被其它字 符隔開。單 詞和字串 的第一 個字 母必須相同 。 STARTING AT <n1> 在欄位 <c> 中搜索從 <n1> 開始的 <str> 。結果 SY-FDPOS 參照相對於 <n1> 的偏移量而 不是欄位的 開始。 ENDING AT <n2> 在欄位 <c> 搜索 <str> 直到位置 <n2>。 AND MARK 如果找到搜 索串,則將 搜索串中的 所有字元( 和使用 ABBREVIATED 時的所有字 符)轉換為 大寫形式。 DATA: STRING(30) VALUE 'This is a fast first example. 該過程的輸 出如下: SEARCHED SY-SUBRC SY-FDPOS X 4 0 itt 0 11 . SY-SUBRC UNDER 'SY-SUBRC'. WRITE: / 'SY-FDPOS:'. POS = SY-FDPOS + 2. SY-FDPOS UNDER 'SY-FDPOS'. WRITE: / 's* '. SEARCH STRING FOR 'ft' ABBREVIATED STARTING AT POS AND MARK. OFF TYPE I. SEARCH STRING FOR 'ft' ABBREVIATED. SEARCH STRING FOR '*e'. SY-SUBRC UNDER 'SY-SUBRC'.'. SY-FDPOS UNDER 'SY-FDPOS'. WRITE: / 'SY-FDPOS:'. POS TYPE I. WRITE / STRING. . WRITE / STRING. SY-FDPOS UNDER 'SY-FDPOS'.'. SY-FDPOS.e .WRITE: / '.

WORD2(20). SY-FDPOS: 10 This is a fast FIRST example. WORD3(20) VALUE ' 4 '. WRITE / INT. INT = STRLEN( WORD1 ). SY-FDPOS: Off: 4 15 請注意,在 找到單詞' fast' 之後,為了 查找包含' ft'的第 二個單詞, 必須在偏移 量 SY-FDPOS 上加 2,然 後從位置 POS 開始查找。 否則,會再 次找到單詞 'fast' 。要獲得' first' 相對於欄位 STRING 開始的偏移 量 從 POS 和 SY-FDPOS 計算。 獲得字串 長度 要決定字元 串到最後一 個字元而不 是 SPACE 的長度,請 使用內部函 數 STRLEN, 用法如下: 語法 [COMPUTE] <n> = STRLEN( <c> ). WORD1(20) VALUE '12345'. OFF. WRITE / INT. WRITE INT. INT = STRLEN( WORD3 ).OFF = POS + SY-FDPOS -1. STRLEN 將運算元 <c> 作為字元數 據類型處理 ,而不考慮 其實際類型 。不進行轉 換。 關鍵字 COMPUTE 可選。有關 內建函式的 詳細資訊, 參見 使用數學函 數 (頁 49) 。 DATA: INT TYPE I. INT = STRLEN( WORD2 ). WRITE: / 'Off:'. 結果分別是 5,0 和 4。 *-------------------------------------------------------------------------------------* Standard Report 一個典型的報表程式是由許多的程式區塊(Code Block)所組成,在區塊間最好能加上一些 說明以利程式可讀性,一個典型的報表程式格式如下: * PROGRAM SOURCE HEADER : 說明程式名稱及目的 * Program Name: * Description: * Date/Author: * Table Update: . 該過程的輸 出如下: This is a fast first example.

* Special Logic: * Include: *-------------------------------------------------------------------------------------* * MODIFICATION LOG : 程式修改更新記錄 *-------------------------------------------------------------------------------------* * ChangeDate Programmer Request Description *-------------------------------------------------------------------------------------* * NEW PROGRAM *-------------------------------------------------------------------------------------* * REPORT NAME : 宣告程式名稱及報表格式. " 每頁報表寬度 * TABLE DESCRIPTION : 宣告程式會使用的 TABLE *-------------------------------------------------------------------------------------* TABLES: * DATA : 宣告程式所使用的變數及自定型態 *-------------------------------------------------------------------------------------* TYPES: DATA: * SELECTION SCREEN / OPTION / PARAMETER : 螢幕輸入報表篩選條件 *-------------------------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK ____ SELECT-OPTIONS: SELECTION-SCREEN END OF BLOCK ___ * INITIALIZATION : 啟動程式開始執行. 如 SELECT-OPTION 及 PARAMETER . *-------------------------------------------------------------------------------------* REPORT Z_____ NO STANDARD PAGE HEADING MESSAGE-ID __ " 所使用的 MESSAGE LINE-COUNT ___ " 每頁報表列數 LINE-SIZE ___.

INCLUDE _____ * FORM : 撰寫程式中所使用到的副程式 *-------------------------------------------------------------------------------------* * Read Data : 自 TABLE 讀取資料放入 Internal Table . * TOP OF PGAE : 每頁開始列印時執行. * AT LINE SELECTION : 由在報表中按下<F2>或 Double-Click 啟動 *-------------------------------------------------------------------------------------* AT LINE-SELECTION. 如可用來印出 USER 輸入的條件 *-------------------------------------------------------------------------------------* END-OF-SELECTION. " 指定報表執行時所用的 GUI-STATUS 名稱 PERFORM READ_DATA. PERFORM PRINT_DATA. 用於定義報表表頭 *-------------------------------------------------------------------------------------* * END OF PAGE : 報表列印完最後一頁後啟動 *-------------------------------------------------------------------------------------* END-OF-PAGE * END OF SELECTION : 在結束列印資料後啟動.*-------------------------------------------------------------------------------------* INITIALIZATION. PERFORM PRINT_SUMMARY. * AT USER Command : 執行在 GUI-STATUS 中自定的命令 *-------------------------------------------------------------------------------------* AT USER_COMMAND. 如按下<F8> *-------------------------------------------------------------------------------------* START-OF-SELECTION. SET PF-STATUS ____. PERFORM PROCESS_DATA. INCLUDE ____. * AT START SELECTION : 輸入結束後啟動的區塊.

如排序及彙總 *-------------------------------------------------------------------------------------* FORM PROCESS_DATA. 如副程式 *-------------------------------------------------------------------------------------* INCLUDE _____ INCLUDE _____ *-------------------------------------------------------------------------------------* * . ENDIF. ENDFORM. IF SY-SUBRC = 0. ENDFORM. ENDFORM. APPEND _____. SELECT * FROM ______ INTO _______ WHERE _______. * Include Program : 列出所含入的其它程式 source code. * Print Data : 依序輸出 Internal Table 的資料 *-------------------------------------------------------------------------------------* FORM PRINT_DATA. * Print Summary : 印出數值資料加總 *-------------------------------------------------------------------------------------* FORM PRINT_SUMMARY. ENDFORM. * Process Data : 處理 Internal Table 的資料. " 增加 Internal Table 元素 ENDSELECT.*-------------------------------------------------------------------------------------* FORM READ_DATA.

. ... . LINE-SIZE col 3.REPORT rep.. MESSAGE-ID mid 消息物件 5.. . .... Additions: 1. NO STANDARD PAGE HEADING 2.. LINE-COUNT n(m) 表單輸出每頁由 n 行,其中的 m 行作為頁腳; 4... DEFINING DATABASE ldb 使用邏輯資料庫,自動產生 * 事件塊 INITIALIZATION AT SELECTION-SCREEN START-OF-SELECTION GET END-OF-SELECTION TOP-OF-PAGE END-OF-PAGE * 事件塊的簡單處理過程: * ABAP 程式運行的時候,INITIALIZATION 首先被調用; 經過初始化的輸入螢幕會顯示在表示伺服器; 使用者離開輸入螢幕的時候,START-OF-SELCTION 事件會被自動調用; 結果資料會以清單的形式顯示在第二個螢幕上; * 原始程式碼中的事件塊順序不影響它們的執行順序 * 事件塊編碼規則(1) INITIALIZATION 通常在此事件塊中設定輸入螢幕欄位的初始值 * 事件塊編碼規則(2) .

IF P_DATE = SPACE . MESSAGE E001 . write : 23(1) sy-vline.AT SELECTION-SCREEN 通常在此事件塊中進行使用者輸入資料的合法性檢查,發現錯誤則以消息的形式給出警示,直到用戶輸入 正確的數值 例如: AT SELECTION-SCREEN . 效果: 在輸入螢幕使用者按下執行按鈕後,副程式 get_data_for_oil 被執行, 在其中獲得業務相關的資料存放 到內表或者其它變數,這些資料在 END-OF-SELECTION 事件塊中被輸出 * 事件塊編碼規則(4) END-OF-SELCTION 通常在此事件中進行結果清單的輸出 例如: end-of-selection . ENDIF. 24(20) tab-gas_plan right-justified . 效果: 如果欄位 P_DATE 為空,則程式會用消息 001“日期欄位不能為空!”來提示用戶必須輸入一個日期。 而且輸入螢幕會等待使用者輸入,知道該欄位數值合法 * 事件塊編碼規則(3) START-OF-SELCTION 通常在此事件中針對業務需求進行系統資料的查詢 例如: start-of-selection . perform get_data_for_oil . 效果: 資料以清單的形式輸出 * 事件塊編碼規則(5) GET 從邏輯資料庫中得到資料(較少用) TOP-OF-PAGE 在此事件塊中設計輸出清單的頁頭 TOP-OF-PAGE write : /1(240) '汽柴油日出廠情況表' centered . .

*-------------------------------------------------------------------------------------* * 比較所有的 欄位類型 要比較所有 的欄位類型 ,可以在邏 輯運算式中 使用下列運 算符: <運算子> 含 義 EQ 等於 = NE 等於 不 等於 <> 不 等於 >< 不 等於 LT 小於 < 小於 LE 小 於等於 <= 小 於等於 GT 大於 > 大於 GE 大 於等於 >= 大 於等於 . 29(10) s_date . * 事件塊編碼規則(6) END-OF-PAGE 在此事件中設定輸出清單的頁腳 例如: END-OF-PAGE . 190(10) '噸' . 180(6) '單位:' .write : /20(8) '日期:' . Write : ‘製作人’ . p_name .

Sign up to vote on this title
UsefulNot useful