SAP ABAP 基礎知識

zhulch發表於2007-12-20

轉載收藏~..

[@more@]

資料型別
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 [] [][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 [] [] []

系統專用變數說明
系統內部專門建立了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] [ / ] [] [()] 資料項 []
其中: / : 在下一行輸出
: 指定輸出的行號;
():指定輸出位數(長度)
: 指定顯示格式引數,引數有:
LEFT-JUSTIFIED 資料靠左對齊
CENTERED 資料靠中間對齊
RIGHT-JUSTIFIED 資料靠右對齊
UNDER 正對在資料項的下面顯示
NO-GAP 緊接著顯示,不留空格
USING EDIT MASK : 使用內嵌子元顯示, 如 12:03:20
USING NO EDIT MASK: 不使用內嵌子元
NO-ZERO: 數字前面 0 的部分不顯示
NO-SIGN: 不顯示正負號
DECIMALS : 顯示 位小數
EXPOENT : F(浮點數)指數的值
ROUND : 四捨五入至小數點後
CURRENCY : 幣別顯示
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 TO [

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.
在此,三條 運算語句進 行相同算術 運算

輸出螢幕上 的線和空行

用下列語法 ,可以在輸 出螢幕上生 成水平線:
語法
ULINE [AT [/][][()]].
它等同於
WRITE [AT [/][][()]] SY-ULINE.
AT 後的格式規 範,與在 在螢幕上定 位 WRITE 輸出 (頁 28) 中為 WRITE 語句說明的 格式規範完 全一樣。
如果沒有格 式規範,系 統則開始新 的一行,並 用水平線填 充該行。否 則,只按指 定輸出水平 線。
生成水平線 的另一種方 法,是在 WRITE 語句中鍵入 恰當數量的 連字元,如 下所示:
WRITE [AT [/][][()]] '-----...'.
垂直線
用下列語法 ,可以在輸 出螢幕上生 成垂直線:
語法
WRITE [AT [/][]] SY-VLINE.

WRITE [AT [/][]] '|'.
空行
用下列語法 ,可以在輸 出螢幕上生 成空行:
語法
SKIP [].
該語句從當 前行開始, 在輸出螢幕 上生成 個空行。如 果沒有指定 的值,就輸 出一個空行 。
要將輸出定 位在螢幕的 指定行上, 請使用:
語法
SKIP TO LINE .
該語句允許 將輸出位置 向上或向下 移動。

四. 顯示圖示:
語法: WRITE: AS SYMBOL.
WRITE: AS ICON.
例如: INCLUDE .
INCLUDE .
WRITE: / 'Phone symbol:', SYM_PHONE AS SYMBOL.
WRITE: / 'Alarm Icon:', ICON_VOICE_OUTPUT AS ICON.
要檢視系統所提供有那些符號及圖示,可選擇'EDIT'下的'Insert Statement',選擇'Write',接下來選擇要檢視的群組,如SYMBOL 或ICON, 接下來按'Display'即可.
*-------------------------------------------------------------------------------------*

一. Internal Table 的宣告
ABAP/4中的Internal Table是一種Data Structure,類似於其他語言中的STRUTURE,它可以由幾個不同型別的欄位(field)組成,用來表示具有不同屬性的某一事物,單獨一筆資料表示某個事物,多筆資料表示具有相同屬性的多個事物.

Internal table 的定義有以下幾種格式:
格式一. DATA: BEGIN OF OCCURS ,
TYPE ,
[ TYPE ,
TYPE ,
… ]
END OF .
語法:
DATA OCCURS [WITH HEADER LINE]
Example:
DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.

格式二. TYPES: BEGIN OF ,
TYPE ,
[ TYPE ,
TYPE ,
… ]
END OF .
TYPES TYPE OCCURS .

格式三. DATA: BEGIN OF .
INCLUDE STRUCTURE

.
DATA: END OF .
DATA: LIKE OCCURS .

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.
本示例建立 與上例相同 的內表資料 型別(VECTOR 和 ITAB) 。然後建立 資料型別 DEEPLINE 作為欄位串 ,包含這些 內表作為組 件。透過該 欄位串,數 據型別 DEEPTABLE 被建立為內 表。因此該 內表的元素 本身就是內 表。
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.
同 建立內表數 據型別 (頁 99) 中所示,該 示例建立數 據型別 ITAB 作為內表。 透過使用 DATA 語句的 TYPE 引數引用 ITAB, 使資料物件 TAB1 與 ITAB 結構相同。 透過使用 DATA 語句的 LIKE 引數引用 TAB1, 使資料物件 TAB2 結構相同。 建立的 TAB2 帶表頭行。 因此,可以 在程式中使 用 TAB2-COLUMN1、 TAB2-COLUMN2 和 TAB2-COLUMN3 等定位表格 工作區域 TAB2。
exp :

DATA FLIGHT_TAB LIKE SFLIGHT OCCURS 10.
本示例建立 資料物件 FLIGHT_TAB, 其結構與數 據庫表格 SFLIGHT 相同。

本示例介紹 如何採用兩 種不同的步 驟建立同一 內表。
TYPES VECTOR_TYPE TYPE I OCCURS 10.
DATA VECTOR TYPE VECTOR_TYPE WITH HEADER LINE.
在此建立一 個內表資料 型別 VECTOR_TYPE, 其行包含首 先建立的基 本型別 I 欄位。然後 ,透過引用 VECTOR_TYPE 建立資料對 象 VECTOR。 透過使用 WITH HEADER LINE 選項還建立 表格工作區 域 VECTOR。 在這種情況 下,表格工 作區域包含 一種型別 I 欄位,可以 透過名稱 VECTOR 定位。
DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.
在這種情況 下,透過直 接在 DATA 語句中使用 OCCURS 選項建立完 全一樣的數 據型別 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 TO

舉例一:(使用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 [FROM ] [TO ] TO .
的元素加入至中,可選取自的範圍.
APPEND LINES OF ITAB TO JTAB.

COLLECT LINE
COLLECT 指令也是將元素加入Internal table中,與APPEND 的區別是: COLLECT指令在非數值欄位相同的情況下,將數值欄位匯總.
格式: COLLECT [ INTO ]
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筆資料, 分別為:
ITAB-COL1 ITAB-COL2
'ABC' 90
'XYZ' 20
*-------------------------------------------------------------------------------------*

INSERT LINE
將元素插入在指定的internal table位置之前.
格式: INSERT [ INTO] [INITIAL LINE INTO ] [INDEX ]
或者: INSERT LINES OF [FROM TO ] INTO INDEX
其中: 即work area,工作區中的元素.
[INITIAL LINE INTO] :插入一筆初始化的記錄.
: internal table
[INDEX ]: 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.
執行結果:
1 10 20
2 100 200 "插入的元素
3 20 40
4 30 60

插入另一Internal Table元素
語法:
INSERT LINES OF [FROM TO ] TO INDEX
的元素插入至中, 位置在 之前, 可選取自的範圍
Example:
APPEND LINES OF ITAB TO JTAB INDEX 3.
將ITAB所有元素插入JTAB中, 位置在第三個元素之前
*-------------------------------------------------------------------------------------*
讀取internal table
格式一:
LOOP AT [INTO ][FROM TO ][WHERE ]

ENDLOOP.

Example:
LOOP AT ITAB INTO LINE WHERE COL1 >100.
WRITE: / SY-TABIX,LINE-COL1.
ENDLOOP.
僅讀取 COL1 > 100 的元素

格式二:
READ TABLE [INTO ] [INDEX / WITH KEY ]
舉例. (格式二)
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.
執行結果同樣是:
ITAB-COL1 = 3
ITAB-COL2 = 6.

Example:
READ TABLE ITAB INTO LINE INDEX 5
讀取 ITAB的第5個元素資料, 放入 LINE的欄位中

根據欄位內容尋找
語法:
READ TABLE INTO
Example:
ITAB-COL1 = 'ABC'.
READ TABLE ITAB INTO LINE.
找出ITAB 中 COL1 欄位內容是 ABC 的元素, 找到的值放入 LINE 中
若找到 SY-SUBRC傳回0, 找不到則傳回 4, 必須宣告有 work area
*-------------------------------------------------------------------------------------*

修改internal table 中的值
格式: MODIFY [FROM ][INDEX ][TRANSPORTING …][WHERE ]
舉例一. 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 INDEX .
或: DELETE [FROM TO ] [WHERE ]

Internal table 排序
SORT [][BY …]
其中: 有DESCENDING 和ASCENDING, Default 為ASCENDING.
: 為指定排序的欄位.
Example:
SORT ITAB DESCENDING BY COL2.
將 ITAB 根據 COL2欄位遞減排序
*-------------------------------------------------------------------------------------*
確定內表屬 性
如果在處理 過程中想知 道內表一共 包含多少行 ,或者想知 道定義的 OCCURS 引數的大小 ,請使用 DESCRIBE 語句,用法 如下:
語法
DESCRIBE TABLE [LINES ] [OCCURS ].
如果使用 LINES 引數,則將 填充行的數 量寫入變數 。 如果使用 OCCURS 引數,則將 行的初始號 寫入變數

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
在此建立內 表 ITAB。 在填充表格 前後執行 DESCRIBE 語句。更改 當前行號, 但無法更改 初始行號。
*-------------------------------------------------------------------------------------*
加總
SUM.
總和計算存放與work area中,但只能在LOOP 中使用.
例: LOOP AT ITAB INTO LINE.
SUM.
ENDLOOP.
WRITE: / LINE-COL1, LINE-COL2.
LINE-COL1 和 LINE-COL2 存數值總和初始化internal table

REFRESH . 清空中的值.使用在沒有 HEADER LINE 的 Internal Table中, 清除所有元素
CLEAR . 清空的Header Line.使用在有 HEADER LINE 的 Internal Table中, 清除所有元素
FREE . 釋放記憶體空間.釋放(Release) Internal Table所佔的記憶體空間, 用在 REFRESH和 CLEAR指令之後

將值重置為 預設值

可以用 CLEAR 語句重置任 何資料物件 值,如下所 示:
語法
CLEAR .

exp:
DATA NUMBER TYPE I VALUE '10'.
WRITE NUMBER.
CLEAR NUMBER.
WRITE / NUMBER.
輸出為:
10
0
CLEAR 語句將欄位 NUMBER 的內容從10 重置為預設 值 0。
*-------------------------------------------------------------------------------------*

新增欄位 順序並將結 果賦給另一 個欄位
語法
ADD THEN UNTIL GIVING .
如果 、 ... 、 是在記憶體中 相同型別和 長度的等距 欄位序列, 則進行求和 計算並將結 果賦給
新增欄位 順序並將結 果新增到另 一個欄位的 內容中
語法
ADD THEN UNTIL TO .
該語句除了 將欄位總和 新增到 的舊內容中 之外,與上 面語句的工 作方式相同 。
有關其它相 似變體的信 息,參見有 關 ADD 語句的關鍵 字文件。

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 元件內容求 和並將其值 賦給欄位 SUM。然 後,將 N2 到 N6元件求 和並將其添 加到 SUM 的值中。
*-------------------------------------------------------------------------------------*

螢幕輸入命令

在ABAP/4中要從螢幕輸入變數, 使用的命令是 PARAMETERS 及SELECTION-OPTIONS:
1. PARAMETER: 輸入一個變數或欄位內容
2. SELECTION-OPTIONS: 使用條件篩選畫面來輸入資料

PARAMETERS 指令
基本的輸入命令, 類似如BASIC的INPUT命令, 但無法使用F格式(浮點數)
語法:
PARAMETERS

[DEFAULT ] [LOWER CASE]
[OBLIGATORY] [AS CHECKBOX]
[RADIOBUTTON GROUP ]
Example:
PARAMETERS: NAME(8),
AGE TYPE I,
BIRTH TYPE D.
執行結果:
在日期的輸入格式上為 MM/DD/YY , MM/DD/YYYY, MMDDYY或MMDDYYYY , 如輸入 020165表 1965年02月01日, 與02/01/65的輸入是一樣的, 日期輸入範圍為西元1950年至2049年
1. DEFAULT
設定輸入的預設值
Example:
PARAMETERS: COMPANY(20) DEFAULT 'DELTA',
BIRTH TYPE D DEFAULT '19650201'.
2. LOWER CASE
ABAP/4預設是將字串輸入值自動轉換為大寫, 加上此引數會將輸入的資料轉成小寫,
3. OBLIGATORY
強制要求輸入, 螢幕上會出現一個 ? , 使用者必須要輸入才可.
4. AS CHECKBOX
輸入 CHECKBOX的格式
Example:
PARAMETERS: TAX AS CHECKBOX DEFAULT 'X',
NTD AS CHECKBOX.
執行結果:

5. RADIOBUTTON GROUP
輸入 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讀取符合條件的資料, 直接執行或放入 Internal Table中, 條件有四個引數:
1. SIGN:
I: 表篩選條件符合的資料
E: 表篩選條件不符合的資料
2. OPTION: 比較的條件符號
EQ(等於),NE(不等於),GT(大於),LE(小於),CP(包含),NP(不包含)
3. LOW: 最小值
4. HIGH: 最大值
語法:
SELECTION-OPTIONS FOR
Example:
TABLES SPFLI.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
將條件的輸入值存放入 AIRLINE, 篩選選擇為SPFLI中的CONNID欄位

改變條件輸入格式
1. DEFAULT TO
設定開始結束範圍輸入預設值
Example:
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID DEFAULT '2042' TO '4555'.
2. NO-EXTENSION
設定不要Multi-Option輸入畫面
3. NO INTERVALS
設定不要區間範圍輸入畫面
4. LOWER CASE
輸入轉換成大寫
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引數
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.產生空白列
語法:
SELECTION-SCREEN SKIP []
Example:
SELECTION-SCREEN SKIP 2.
產生兩列空白列
2.產生底線
語法:
SELECTION-SCREEN ULINE / (length)
Example:
SELECTION-SCREEN ULINE /10(30).
自第10格開始產生長度30的底線
3.印出備註說明
語法:
SELECTION-SCREEN COMMENT / (length)
Example:
REMARK = 'Pls enter your name'.
SELECTION-SCREEN COMMENT /10(30) REMARK.
4. 同一列中輸入數個資料項
語法:
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內容, 40格輸入 BIRTH的內容

5. 繪出BLOCK PANEL
語法:
SELECTION-SCREEN BEGIN OF BLOCK
[WITH FRAME [TITLE ].<br> …….<br>SELECTION-SCREEN END OF BLOCK <block>.<br>Example:<br> SELECTION-SCREEN BEGIN OF BLOCK RADIO WITH FRAME .<br> PARAMETER R1 RADIOBUTTON GROUP GR1.<br> PARAMETER R2 RADIOBUTTON GROUP GR1.<br> PARAMETER R3 RADIOBUTTON GROUP GR1.<br> SELECTION-SCREEN END OF BLOCK RADIO. <br>*-------------------------------------------------------------------------------------*</block>

SQL語法
我們在編寫ABAP4程式的時候,經常需要從TABLE中根據某些條件讀取資料,.讀取資料最常用的方法就是透過SQL語法實現的.
ABAP/4中可以利用SQL語法建立或讀取TABLE,SQL語法分為DDL(DATA DEFINE LANGUAGE)語言和DML(DATA MULTIPULATION LANGUAGE)語言,DDL語言是指資料定義語言,例如CREATE等, DML語言是資料操作語言,例如SELECT, INSERT等語句. SQL語句有OPEN SQL語句和NATIVE SQL語句. OPEN SQL語句不是標準SQL語句,是ABAP/4語言,利用OPEN SQL語句能在Databases 和 Command 之間產生一個BUFFER,所以它有一個語言轉換的過程.
而NATIVE SQL語句則是標準的SQL語句, 它直接針對Databases操作.

OPEN SQL

SELECT語句
語法格式:
SELECT [INTO ] [FROM ] [WHERE ]
[GROUP BY ] [ORDER BY ]
其中: 指定要抓取的欄位
將讀取的記錄存放在work area中
指定從那個TABLE中讀取資料
抓取資料的條件
指定按那些欄位分組
排序的欄位及方式
相關的系統變數:
SY-SUBRC = 0 表示讀取資料成功
<> 0 表示未找到符合條件的記錄
SY-DBLNT: 被處理過的記錄的筆數.
相關的命令:
EXIT. 退出迴圈.
CHECK .如果邏輯表示式成立,則繼續執行,否則,開
始下一次迴圈.

利用迴圈方式讀取所有記錄
SELECT ….ENDSELECT.是迴圈方式讀取記錄的.
例如:
TABLES MARD.
SELECT [DISTINCT] * FROM MARD WHERE MATNR = '3520421700'.
.
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
... INTO CORRESPONDING FIELDS OF
... INTO (f1, ..., fn) 變數組.
... INTO TABLE
... INTO CORRESPONDING FIELDS OF TABLE
... APPENDING TABLE
... APPENDING CORRESPONDING FIELDS OF 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.
(將讀取的結果放在Internal table ITAB中)
<source>
<source>

DATA: BEGIN OF WA,
LINE(240),
END OF WA.
DATA NAME(10).
NAME = 'SPFLI'.
SELECT * FROM (NAME) INTO WA.
WRITE: / WA-LINE.
ENDSELECT.
資料庫表名 稱 SPFLI 被賦給字元 欄位 NAME。 SELECT 語句將所有 的行從 SPFLI 中讀到目標 區 WA 中。在該示 例中,WA 與 SPFLI 的結構並不 相同,每一 行都將自動 地轉換成字 符欄位.

舉例二.
TABLES MARD.
SELECT MATNR MTART MAKTX INTO (t_matnr, t_mtart, maktx)
FROM MARD
WHERE MATNR = '3520421700'.
.
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 工作區中
舉例三.
將讀取的資料寫入 Initial Table 中
語法:
SELECT .. INTO TABLE
Example:
TABLES SPFLI.
DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE.
SELECT * FROM SPFLI INTO ITAB.
一次讀10筆(Initial Table的長度)記錄存入 ITAB 中

SELECT .. INTO TABLE PACKAGE SIZE
一次讀取 筆記錄至
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.
輸出如下所 示:

在該示例中 ,系統只將 資料庫表 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.
(利用引數ORDER BY所指定的欄位排序)
*-------------------------------------------------------------------------------------*

◆ 抓取資料的條件敘述
(1) BETWEEN AND
例如: WHERE YEAR BETWEEN 1995 AND 2000.
(2) LIKE
例如: WHERE NAME LIKE 'MIKE%'.
('%'是萬用字元號)
(3) IN ()
裡面的任意一個值即可.
例如: WHERE PLANT IN ('CHUNGLI', 'TAOYUAN','LIUTU').
(表示PLANT 只要是'CHUNGLI'或'TAOYUAN'或'LIUTU'都可以).
(4) ORDER BY 敘述
指定排序的欄位或順序
(1). ..ORDER BY PRIMARY KEY.
根據 PRIMARY KEY 遞增排序
(2)…ORDER BY [DESCENDING] [DESCENDING]
Example:
SELECT * FROM IM ORDER BY PART .
*-------------------------------------------------------------------------------------*

INSERT 語句
◆從work area 加入到Internal Table中
格式: INSERT INTO VALUES
例如:
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
例如:
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 FROM TABLE [ACCEPTING DUPLICATE KEY]
中非NULL的資料加入中,加上[ACCEPTING DUPLICATE KEY]能限制相同PRIMARY KEY不重複加入.

加入一筆記錄至資料庫

1.自 Work Area 工作區
語法:
INSERT INTO VALUES
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的結構與資料檔 SPFLI一樣, 所以也可
寫成 INSERT SPFLI.

2.自 Internal Table
語法:
INSERT FROM TABLE [ACCEPTING DUPLICATE KEY]
中非 NULL的資料加入 中, 加上 [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 指令
異動已存在的記錄內容

1.使用 Primary Key
語法:
UPDATE FROM
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 SET < f1>=… WHERE
根據條件式異動符合條件式的記錄
Example:
UPDATE SPFLI SET NO='34051920'
COMPANY = 'DELTA'
WHERE TEL='4526107'.
*-------------------------------------------------------------------------------------*

3. MODIFY 語法
MODIFY [FROM ].
根據 Primary Key 尋找資料檔中符合的記錄, 若找到則更新異動, 若找不到則新增記錄
語法:
MODIFY FROM
Example:
WA-NO='34051920'.
WA-COMPANY='DELTA'.
MODIFY SPFLI FROM WA.

4. DELETE 語法
DELETE [FROM ].
或: DELETE [WHERE ]
刪除資料檔的記錄

1.使用 Primary Key
語法:
DELETE FROM
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 WHERE
根據條件式刪除符合條件式的記錄
Example:
DELETE FROM SPFLI WHERE AREA = 'AMERICAN'.

*-------------------------------------------------------------------------------------*

5. DATABASE CURSOR
Database Cursor是一個資料庫暫存區, 將經SELECT指令讀取的記錄存放至此暫存區, 再由此暫存區放至Work Area中, 可減少資料庫讀取的次數.
1.開啟 Database Cursor
語法:
OPEN CURSOR FOR SELECT … WHERE
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 INTO
Example:
FETCH NEXT CURSOR C1 INTO WA.
讀取下一筆Cursor位置的資料存入WA, 如果已無資料可讀, SY-SUBRC <>0.
關閉 Database Cursor
語法:
CLOSE CURSOR
Example:
CLOSE CURSOR C1.

*-------------------------------------------------------------------------------------*

COMMIT WORK & ROLLBACK WORK
要確定資料成功寫入資料庫,可使用COMMIT WORK指令,如:
COMMIT WORK.
相反的, 如果反悔要復原, 可使用 ROLLBACK WORK, 可復原在上個COMMIT WORK指令之後的資料, 如:
ROLLBACK WORK.
*-------------------------------------------------------------------------------------*
使用NATIVE SQL指令
語法格式:
EXEC SQL [PERFORMING

].

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

的使用:
如果NATIVE SQL的SELECT命令執行結果是抓到多筆記錄,我們想要逐筆記錄處理時,就用PERFORMING 引數,這個FORM能被逐次呼叫.如果想中止呼叫,就用EXIT FORM SQL結束呼叫.
例如:
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許可權的功能;
c. 在登入SAP R/3系統時,我們已經自動與Database連線,所以在執行NATIVE
SQL時並不需要CONNECT語句;
d. 一條NATIVE SQL語句可以以分號;結束,一般情況下是以句號.結束.
e. 某些資料庫系統對TABLE名字和FIELD名字有大小寫區別,要正確書寫.
f. 在NATIVE SQL中,雙引號"不表示注釋.
*-------------------------------------------------------------------------------------*

結果語句

條件述敘
1. IF 述敘
語法:
IF .

ELSEIF .

ELSEIF .

…..
ELSE.

ENDIF.
(1).在每個判斷敘述之後要加上 .
(2).在巢狀迥圈之中無法使用 ELSE 敘述, ELSE 敘述屬 IF 敘述
Example:
IF 3 > 8.
WRITE / '3 is less than 8'.
ENDIF.

2. CASE 敘述
語法:
CASE .
WHEN .

WHEN .

….
WHEN OTHERS.

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 FROM TO .

ENDDO.
Example:
DO 2 TIMES.
WRITE / 'X'.
ENDDO.
執行結果:
X
X
DO VARYING I FROM 1 TO 10.
S = S + I.
ENDDO.
WRITE: / ,'1+2+3+…+10=',S
執行結果: 1+2+3+…+10=55
2.條件迥圈
語法:
WHILE .

ENDWHILE
Example:
I = 1.
S=0.
WHILE I <= 10.
S = S+I.
I=I+1.
ENDWHILE.
WRITE: / ' 1+2+3+…+10=',S.
執行結果為: 1+2+3+…+10=55

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

無窮迥圈
DO .

ENDDO.
無窮迥圈必須配合 EXIT 敘述來執行
*-------------------------------------------------------------------------------------*

搜尋字串

要搜尋特定 模式的字元 串,請使用 SEARCH 語句,用法 如下:
語法
SEARCH FOR .
該語句在字 段 中搜尋 中的字串 。如果成功 ,則將 SY-SUBRC 的返回程式碼 值設定為0並 將 SY-FDPOS 設定為欄位 中該字串 的偏移量。 否則將 SY-SUBRC 設定為4。
搜尋串 可為下列格 式之一:
目 的
搜 索 ( 任何字元順 序)。忽略 尾部空格。
.. 搜 索 ,但是不忽 略尾部空格 。
* 搜 索以 結尾的詞。
* 搜 索以 開始的詞。
單詞之間用 空格、逗號 、句號、分 號、冒號、 問號、歎號 、括號、斜 槓、加號和 等號等分隔 。

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

搜尋字元字 段 的各種選項 () 如下
ABBREVIATED
在欄位 中搜尋包含 中指定字元 串的單詞, 其中字元可 能被其它字 符隔開。單 詞和字串 的第一個字 母必須相同 。
STARTING AT
在欄位 中搜尋從 開始的 。結果 SY-FDPOS 參照相對於 的偏移量而 不是欄位的 開始。
ENDING AT
在欄位 搜尋 直到位置
AND MARK
如果找到搜 索串,則將 搜尋串中的 所有字元( 和使用 ABBREVIATED 時的所有字 符)轉換為 大寫形式。

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 的長度,請 使用內部函 數 STRLEN, 用法如下:
語法
[COMPUTE] = STRLEN( ).
STRLEN 將運算元 作為字元數 據型別處理 ,而不考慮 其實際型別 。不進行轉 換。
關鍵字 COMPUTE 可選。有關 內部函式的 詳細資訊, 參見 使用數學函 數 (頁 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.
結果分別是 5,0 和 4。
*-------------------------------------------------------------------------------------*

Standard Report
一個典型的報表程式是由許多的程式區塊(Code Block)所組成,在區塊間最好能加上一些
說明以利程式可讀性,一個典型的報表程式格式如下:

* 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 ___ " 每頁報表列數
LINE-SIZE ___. " 每頁報表寬度

* 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
*-------------------------------------------------------------------------------------*
INITIALIZATION.

INCLUDE ____.

* AT START SELECTION : 輸入結束後啟動的區塊, 如按下
*-------------------------------------------------------------------------------------*
START-OF-SELECTION.
SET PF-STATUS ____. " 指定報表執行時所用的 GUI-STATUS名稱

PERFORM READ_DATA.
PERFORM PROCESS_DATA.
PERFORM PRINT_DATA.
PERFORM PRINT_SUMMARY.

* AT USER Commaand : 執行在GUI-STATUS中自定的命令
*-------------------------------------------------------------------------------------*
AT USER_COMMAND.

* AT LINE SELECTION : 由在報表中按下或Double-Click啟動
*-------------------------------------------------------------------------------------*
AT LINE-SELECTION.


* TOP OF PGAE : 每頁開始列印時執行, 用於定義報表表頭
*-------------------------------------------------------------------------------------*

* END OF PAGE : 報表列印完最後一頁後啟動
*-------------------------------------------------------------------------------------*
END-OF-PAGE

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

TOP-OF-PAGE
在此事件塊中設計輸出清單的頁頭
TOP-OF-PAGE
write : /1(240) '汽柴油日出廠情況表' centered .
write : /20(8) '日期:' ,
29(10) s_date ,
180(6) '單位:' ,
190(10) '噸' .
*
事件塊編碼規則(6)
END-OF-PAGE
在此事件中設定輸出清單的頁尾
例如:
END-OF-PAGE .
Write : ‘製作人’ , p_name .
*-------------------------------------------------------------------------------------*

*
比較所有的 欄位型別

要比較所有 的欄位型別 ,可以在邏 輯表示式中 使用下列運 算符:

含 義
EQ 等於
= 等於
NE 不 等於
<> 不 等於
>< 不 等於
LT 小 於
< 小於
LE 小 於等於
<= 小 於等於
GT 大 於
> 大於
GE 大 於等於
>= 大 於等於

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7318139/viewspace-995281/,如需轉載,請註明出處,否則將追究法律責任。

上一篇:
SAP ABAP  基礎知識
請登入後發表評論 登入
全部評論