SAP基础知识学习资料整理

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据类型
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> 正對在資料項<g>的下面顯示
NO-GAP 緊接著顯示,不留空格
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.
ADD 1 TO COUNTER.
在此,三条运算语句进行相同算术运算
输出屏幕上的线和空行
用下列语法,可以在输出屏幕上生成水平线:
语法
ULINE [AT [/][<pos>][(<len>)]].
它等同于
WRITE [AT [/][<pos>][(<len>)]] SY-ULINE.
AT 后的格式规范,与在在屏幕上定位 WRITE 输出 (页 28) 中为 WRITE 语句说明的格式规范完全一样。

如果没有格式规范,系统则开始新的一行,并用水平线填充该行。

否则,只按指定输出水平线。

生成水平线的另一种方法,是在 WRITE 语句中键入恰当数量的连字符,如下所示:
WRITE [AT [/][<pos>][(<len>)]] '-----...'.
垂直线
用下列语法,可以在输出屏幕上生成垂直线:
语法
WRITE [AT [/][<pos>]] SY-VLINE.

WRITE [AT [/][<pos>]] '|'.
空行
用下列语法,可以在输出屏幕上生成空行:
语法
SKIP [<n>].
该语句从当前行开始,在输出屏幕上生成 <n> 个空行。

如果没有指定 <n> 的值,就输出一个空行。

要将输出定位在屏幕的指定行上,请使用:
语法
SKIP TO LINE <n>.
该语句允许将输出位置向上或向下移动。

四. 顯示圖示:
語法: WRITE: <symbol-name> AS SYMBOL.
WRITE: <icon-name> AS ICON.
例如: INCLUDE <SYMBOL>.
INCLUDE <ICON>.
WRITE: / 'Phone symbol:', SYM_PHONE AS SYMBOL.
WRITE: / 'Alarm Icon:', ICON_VOICE_OUTPUT AS ICON.
要查看系統所提供有那些符號及圖示,可選擇'EDIT'下的'Insert Statement',選擇'Write',接下來選擇要查看的群組,如SYMBOL 或ICON, 接下來按
'Display'即可.
*-------------------------------------------------------------------------------------*
一. Internal Table 的宣告
ABAP/4中的Internal Table是一种Data Structure,類似于其他語言中的STRUTURE,它可以由几個不同類型的欄位(field)組成,用來表示具有不同屬性的某一事物,單獨一筆資料表示某個事物,多筆資料表示具有相同屬性的多個事物.
Internal table 的定義有以下几种格式:
格式一. DATA: BEGIN OF <internal table> OCCURS <n>,
<field 1> TYPE <type1>,
[<field 2> TYPE <type 2>,
<field 3> TYPE <type 3>,
… ]
END OF <internal table>.
語法:
DATA <f> <type> OCCURS <n> [WITH HEADER LINE]
Example:
DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.
格式二. TYPES: BEGIN OF <work area>,
<field 1> TYPE <type1>,
[<field 2> TYPE <type 2>,
<field 3> TYPE <type 3>,
… ]
END OF <work area>.
TYPES <internal table> TYPE <work area> OCCURS <n>.
格式三. DATA: BEGIN OF <work area>.
INCLUDE STRUCTURE <table name>.
DATA: END OF <work area>.
DATA: <internal table> LIKE <work area> OCCURS <n>.
exp:
TYPES VECTOR TYPE I OCCURS 10.
TYPES: BEGIN OF LINE,
COLUMN1 TYPE I,
COLUMN2 TYPE I,
COLUMN3 TYPE I,
END OF LINE.
TYPES ITAB TYPE LINE OCCURS 10.
TYPES: BEGIN OF DEEPLINE,
TABLE1 TYPE VECTOR,
TABLE2 TYPE ITAB,
END OF DEEPLINE.
TYPES DEEPTABLE TYPE DEEPLINE OCCURS 10.
本示例创建与上例相同的内表数据类型(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 <work area> TO <internal table>
举例一:(使用WORK AREA)
DATA : BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.
DO 2 TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
LOOP AT ITAB INTO LINE.
WRITE : / LINE-COL1,LINE-COL2.
ENDLOOP.
举例二 (不使用WORK AREA)
DATA : BEGIN OF ITAB OCCURS 10,
COL1 TYPE I,
COL2 TYPE I,
END OF ITAB.
DO 2 TIMES.
ITAB-COL1 = SY-INDEX.
ITAB-COL2 = SY-INDEX ** 2.
APPEND ITAB.
ENDDO.
LOOP AT ITAB.
WRITE : / ITAB-COL1,ITAB-COL2.
ENDLOOP.
exp:
DATA: BEGIN OF ITAB OCCURS 10,
COL1 TYPE C,
COL2 TYPE I,
END OF ITAB.
DO 3 TIMES.
APPEND INITIAL LINE TO ITAB.
ITAB-COL1 = SY-INDEX. ITAB-COL2 = SY-INDEX ** 2.
APPEND ITAB.
ENDDO.
LOOP AT ITAB.
WRITE: / ITAB-COL1, ITAB-COL2.
ENDLOOP.
舉例三. (加入另一個Internal table的元素)
格式: APPEND LINES OF <itab1> [FROM <n1> ] [TO <n2>] TO <itab2>.
將<itab1>的元素加入至<itab2>中,可選取自<n1>至<n2>的范圍.
APPEND LINES OF ITAB TO JTAB.
COLLECT LINE
COLLECT 指令也是將元素加入Internal table中,与APPEND 的區別是: COLLECT 指令在非數值欄位相同的情況下,將數值欄位匯總.
格式: COLLECT [<work area> INTO ] <itab>
DATA: BEGIN OF ITAB OCCURS 3,
COL1(3) TYPE C,
COL2 TYPE I,
END OF ITAB.
ITAB-COL1 = 'ABC'. ITAB-COL2 = 10.
COLLECT ITAB.
ITAB-COL1 = 'XYZ'. ITAB-COL2 = 20.
COLLECT ITAB.
ITAB-COL1 = 'ABC'. ITAB-COL2 = 80.
COLLECT ITAB.
此時, internal table中放的是2筆數据, 分別為:
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,工作區中的元素.
[INITIAL LINE INTO] :插入一筆初始化的記錄.
<itab>: internal table
[INDEX <idx>]: internal table 的記錄號.(新加入的元素放在此記錄前面)
Example:
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.
DO 3 TIMES.
LINE-COL1 = SY-INDEX *10.
LINE-COL2 = SY-INDEX *20.
APPEND LINE INTO ITAB.
ENDDO.
LINE-COL1=100.
LINE-COL2=200.
INSERT LINE INTO ITAB INDEX 2. "插入在位置2之前
LOOP AT ITAB INTO LINE.
WRITE: / SY-TABIX,LINE-COL1,LINE-COL2. "SY-TABIX為Table位置ENDLOOP.
執行結果:
1 10 20
2 100 200 "插入的元素
3 20 40
4 30 60
插入另一Internal Table元素
語法:
INSERT LINES OF <itab1> [FROM <n1> TO <n2>] TO <itab2> INDEX <idx> 將<itab1>的元素插入至<itab2>中, 位置在 <idx>之前, 可選取自<n1>至<n2>的範圍
Example:
APPEND LINES OF ITAB TO JTAB INDEX 3.
將ITAB所有元素插入JTAB中, 位置在第三個元素之前
*-------------------------------------------------------------------------------------*
讀取internal table
格式一:
LOOP AT <itab> [INTO <wa>][FROM <n1> TO <n2>][WHERE <conditions>]
<statement>
ENDLOOP.
Example:
LOOP AT ITAB INTO LINE WHERE COL1 >100.
WRITE: / SY-TABIX,LINE-COL1.
ENDLOOP.
僅讀取 COL1 > 100 的元素
格式二:
READ TABLE <itab> [INTO <wa>] [INDEX <idx> / WITH KEY <conditions>] 舉例. (格式二)
DATA: BEGIN OF ITAB OCCURS 10,
COL1 TYPE I,
COL2 TYPE I,
END OF ITAB.
DO 10 TIMES.
ITAB-COL1 = SY-INDEX.
ITAB-COL2 = SY-INDEX * 2.
APPEND ITAB.
ENDDO.
READ TABLE ITAB INDEX 3.
(或者: READ TABLE ITAB WITH KEY COL1 = 3.)
WRITE: / 'ITAB-COL1 = ', ITAB-COL1, 'ITAB-COL2 = ', ITAB-COL2.
執行結果同樣是:
ITAB-COL1 = 3
ITAB-COL2 = 6.
Example:
READ TABLE ITAB INTO LINE INDEX 5
讀取 ITAB的第5個元素資料, 放入 LINE的欄位中
根據欄位內容尋找
語法:
READ TABLE <itab> INTO <wa>
Example:
ITAB-COL1 = 'ABC'.
READ TABLE ITAB INTO LINE.
找出ITAB 中 COL1 欄位內容是 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 根據 COL2欄位遞減排序
*-------------------------------------------------------------------------------------*
确定内表属性
如果在处理过程中想知道内表一共包含多少行,或者想知道定义的 OCCURS 参数的大小,请使用 DESCRIBE 语句,用法如下:
语法
DESCRIBE TABLE <itab> [LINES <lin>] [OCCURS <occ>].
如果使用 LINES 参数,则将填充行的数量写入变量 <lin>。

如果使用 OCCURS 参数,则将行的初始号写入变量 <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
在此创建内表 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 <itab>. 清空<itab>中的值.使用在沒有 HEADER LINE 的 Internal Table中, 清除所有元素
CLEAR <itab>. 清空<itab>的Header Line.使用在有 HEADER LINE 的 Internal Table中, 清除所有元素
FREE <itab>. 釋放記憶体空間.釋放(Release) Internal Table所佔的記憶體空間, 用在 REFRESH和 CLEAR指令之後
将值重置为默认值
可以用 CLEAR 语句重置任何数据对象值,如下所示:
语法
CLEAR <f>.
exp:
DATA NUMBER TYPE I VALUE '10'.
WRITE NUMBER.
CLEAR NUMBER.
WRITE / NUMBER.
输出为:
10
CLEAR 语句将字段 NUMBER 的内容从10 重置为默认值 0。

*-------------------------------------------------------------------------------------*
添加字段顺序并将结果赋给另一个字段
语法
ADD <n1> THEN <n2> UNTIL <nz> GIVING <m>.
如果 <n1>、 <n2>、 ... 、 <nz> 是在内存中相同类型和长度的等距字段序列,则进行求和计算并将结果赋给 <m>
添加字段顺序并将结果添加到另一个字段的内容中
语法
ADD <n1> THEN <n2> UNTIL <nz> TO <m>.
该语句除了将字段总和添加到 <m> 的旧内容中之外,与上面语句的工作方式相同。

有关其它相似变体的信息,参见有关 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 <p> [DEFAULT <f>] [LOWER CASE]
[OBLIGATORY] [AS CHECKBOX]
[RADIOBUTTON GROUP <rad>]
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 <rad>
輸入 RADIO BUTTON GROUP 的方式
Example:
PARAMETERS: BOY RADIOBUTTON GROUP SEX DEFAULT 'X',
GIRL RADIOBUTTON GROUP SEX.
exp :
TABLES SPLFI.
PARAMETERS: LOW LIKE SPFLI-CARRID,
HIGH LIKE SPFLI-CARRID.
SELECT * FROM SPLFI WHERE CARRID BETWEEN LOW AND HIGH. ........
ENDSELECT.
*-------------------------------------------------------------------------------------*
SELECTION-OPTIONS
SELECTION-OPTIONS所輸入的值實際上是放在internal table中的,該Internal table 有四個欄位,分別是:SIGN,OPTION,LOW,HIGH.. 條件篩選檢查條件輸入畫面指令, 輸入條件後可配合SELECT指令自TABLE讀取符合條件的資料, 直接執行或放入 Internal Table中, 條件有四個參數:
1. SIGN:
I: 表篩選條件符合的資料
E: 表篩選條件不符合的資料
2. OPTION: 比較的條件符號
EQ(等於),NE(不等於),GT(大於),LE(小於),CP(包含),NP(不包含)
3. LOW: 最小值
4. HIGH: 最大值
語法:
SELECTION-OPTIONS <check-option> FOR <table-field>
Example:
TABLES SPFLI.
SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID.
將條件的輸入值存放入 AIRLINE, 篩選選擇為SPFLI中的CONNID欄位
改變條件輸入格式
1. DEFAULT <begin> TO <end>
設定開始結束範圍輸入預設值
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 [<n>]
Example:
SELECTION-SCREEN SKIP 2.
產生兩列空白列
2.產生底線
語法:
SELECTION-SCREEN ULINE / <pos>(length)
Example:
SELECTION-SCREEN ULINE /10(30).
自第10格開始產生長度30的底線
3.印出備註說明
語法:
SELECTION-SCREEN COMMENT / <pos>(length) <name> 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 <block>
[WITH FRAME [TITLE <title>].
…….
SELECTION-SCREEN END OF BLOCK <block>.
Example:
SELECTION-SCREEN BEGIN OF BLOCK RADIO WITH FRAME . PARAMETER R1 RADIOBUTTON GROUP GR1.
PARAMETER R2 RADIOBUTTON GROUP GR1.
PARAMETER R3 RADIOBUTTON GROUP GR1.
SELECTION-SCREEN END OF BLOCK RADIO.
*-------------------------------------------------------------------------------------*
SQL語法
我們在編寫ABAP4程式的時候,經常需要從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 <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: 被處理過的記錄的筆數.
相關的命令:
EXIT. 退出循環.
CHECK <logistic statement>.如果邏輯表達式成立,則繼續執行,否則,開
始下一次循環.
利用循環方式讀取所有記錄
SELEC T ….ENDSELECT.是循環方式讀取記錄的.
例如:
TABLES MARD.
SELECT [DISTINCT] * FROM MARD WHERE MATNR = '3520421700'.
<Statements>.
ENDSELECT.
(從MARD中抓取所有料號=3520421700的資料)
◆讀取一筆資料
Example:
TABLES SPFLI.
SELECT SINGLE * FROM SPFLI
WHERE PLANT ='CHUNGLI' AND TEL='4526174'.
WRITE: / SPFLI-COMPANY,SPFLI-PLANT,SPFLI-TEL.
◆將讀取的記錄放在work area中,并且加入Internal table 中.
格式有:
... INTO <work area>
... INTO CORRESPONDING FIELDS OF <work area>
... INTO (f1, ..., fn) 變量組.
... INTO TABLE <internal table>
... INTO CORRESPONDING FIELDS OF TABLE <internal table>
... APPENDING TABLE <internal table>
... APPENDING CORRESPONDING FIELDS OF TABLE <internal table>
舉例一:
TABLES MARD.
DATA: BEGIN OF ITAB OCCURS 10,
MATNR LIKE MARD-MATNR,
WERKS LIKE MARD-WERKS,
LGORT LIKE MARD-LGORT,
LABST LIKE MARD-LABST,
END OF ITAB.
SELECT MATNR WERKS LGORT LABST
INTO CORRESPONDING FIELDS OF ITAB
FROM MARD
WHERE MATNR = '3520421700'.
APPEND ITAB.
CLEAR ITAB.
ENDSELECT.
(將讀取的結果放在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.
数据库表名称 SPFLI 被赋给字符字段 NAME。

SELECT 语句将所有的行从SPFLI 中读到目标区 WA 中。

在该示例中,WA 与 SPFLI 的结构并不相同,每一行都将自动地转换成字符字段.
舉例二.
TABLES MARD.
SELECT MATNR MTART MAKTX INTO (t_matnr, t_mtart, maktx)
FROM MARD
WHERE MATNR = '3520421700'.
<Statements>.
ENDSELECT.
(從MARD中抓取料號=3520421700的料號、類型和描述,放在變量t_matnr, t_mtart, maktx中)。

Example:
TABLES SPFLI.
DATA WA LIKE TABLES.
SELECT * FROM SPFLI INTO WA.
WRITE: / WA-COMPANY,WA-PLANT.
ENDSELECT.
逐筆寫入WA 工作區中
舉例三.
將讀取的資料寫入 Initial Table 中
語法:
SELECT .. INTO TABLE <itab>
Example:
TABLES SPFLI.
DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE.
SELECT * FROM SPFLI INTO ITAB.
一次讀10筆(Initial Table的長度)記錄存入 ITAB 中
SELECT .. INTO TABLE <itab> PACKAGE SIZE <n>
一次讀取 <n> 筆記錄至 <itab>中
Example:
TABLES SPFLI.
DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE.
SELECT * FROM SPFLI INTO ITAB PACKAGE SIZE 5.
一次讀取 5 筆記錄
exp :
TABLES SPFLI.
DATA: BEGIN OF WA,
NUMBER TYPE I VALUE 1,
CITYFROM LIKE SPFLI-CITYFROM,
CITYTO LIKE SPFLI-CITYTO,
END OF WA.
SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF WA.
WRITE: / WA-NUMBER, WA-CITYFROM, WA-CITYTO.
ENDSELECT.
输出如下所示:
在该示例中,系统只将数据库表 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 <g1> AND <g2>
例如: WHERE YEAR BETWEEN 1995 AND 2000.
(2) LIKE <g>
例如: WHERE NAME LIKE 'MIKE%'.
('%'是通配符號)
(3) IN (<g1>…<gn>)
是<g1>…<gn>里面的任意一個值即可.
例如: WHERE PLANT IN ('CHUNGLI', 'TAOYUAN','LIUTU').
(表示PLANT 只要是'CHUNGLI'或'TAOYUAN'或'LIUTU'都可以).
(4) ORDER BY 敘述
指定排序的欄位或順序
(1). ..ORDER BY PRIMARY KEY.
根據 PRIMARY KEY 遞增排序
(2)…ORDER BY <f1> [DESCENDING] <f2> [DESCENDING]
Example:
SELECT * FROM IM ORDER BY PART .
*-------------------------------------------------------------------------------------*
INSERT 語句
◆從work area 加入到Internal Table中
格式: INSERT INTO <database> VALUES <work area>
例如:
DATA: BEGIN OF WA,
CODE(6) TYPE C,
NAME(30) TYPE C,
END OF WA.
DATA: VEN LIKE WA OCCURS 10.

WA-CODE = '530120'.
WA-NAME = 'XINGDA ELECTRONICS CO.,LTD'.
INSERT INTO VEN VALUES WA .
如果work area的名稱就是internal table的名稱,可以直接寫成:
INSERT <internal table>
例如:
DATA: BEGIN OF WA OCCURS 10,
CODE(6) TYPE C,
NAME(30) TYPE C,
END OF WA.

WA-CODE = '530120'.
WA-NAME = 'XINGDA ELECTRONICS CO., LTD'.
INSERT WA.
◆從另外一個Internal table中INSERT 資料
格式:
INSERT <itab1> FROM TABLE <itab2> [ACCEPTING DUPLICATE KEY]
將<itab2>中非NULL的資料加入<itab1>中,加上[ACCEPTING DUPLICATE KEY]能限制相同PRIMARY KEY不重复加入.
加入一筆記錄至資料庫
1.自 Work Area 工作區
語法:
INSERT INTO <database> VALUES <wa>
Example:
TABLES SPFLI.
DATA WA LIKE SPFLI.
WA-NO = '34051920'.
WA-COMPANY='DELTA'.
INSERT SPFLI VALUES WA.
將 ITAB 資料加入 SPFLI中, 也可寫成 INSERT SPFLI FROM ITAB.
SPFLI-NO='34299876'.
SPFLI-COMPANY='HP'.
INSERT SPFLI FROM SPFLI.
將Work Area SPFLI中的資料加入資料庫檔案 SPFLI中
因Work Area SPFLI的結構與資料檔 SPFLI一樣, 所以也可
寫成 INSERT SPFLI.
2.自 Internal Table
語法:
INSERT <database> FROM TABLE <itab> [ACCEPTING DUPLICATE KEY]
將 <itab>中非 NULL的資料加入 <database>中, 加上 [ACCEPTING DUPLICATE KEY]能檢查不加入有重覆primary key, 若有重覆則 SY-SUBRC 會傳回 4 Example:
TABLES SPFLI.
DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE.
ITAB-NO = '34051920'.
ITAB-COMPANY = 'DELTA'.
APPEND ITAB.
….
INSERT SPFLI FROM TABLE ITAB
ACCEPTING DUPLICATE KEY.
*-------------------------------------------------------------------------------------*
UPDATE 指令
異動已存在的記錄內容
1.使用 Primary Key
語法:
UPDATE <database> FROM <wa>
Example:
TABLES SPFLI.
DATA WA LIKE SPFLI.
WA-NO='34051920'.
WA-COMPANY='DELTA'.
UPDATE SPFLI FROM WA.
如 SPFLI 的 Primary Key是 NO, 則會找到 NO='34051920'
的記錄, 將其 COMPANY欄位異動為 DELTA
2.使用條件式
語法:
UPDATE <database> SET < f1>=<values>… WHERE <condition>
根據條件式異動符合條件式的記錄
Example:
UPDATE SPFLI SET NO='34051920'
COMPANY = 'DELTA'
WHERE TEL='4526107'.
*-------------------------------------------------------------------------------------*
3. MODIFY 語法
MODIFY <internal table> [FROM <work area>].
根據 Primary Key 尋找資料檔中符合的記錄, 若找到則更新異動, 若找不到則新增記錄
語法:
MODIFY <database> FROM <wa>
Example:
WA-NO='34051920'.
WA-COMPANY='DELTA'.
MODIFY SPFLI FROM WA.
4. DELETE 語法
DELETE <internal table> [FROM <work area>].
或: DELETE <internal table> [WHERE <conditions>]
刪除資料檔的記錄
1.使用 Primary Key
語法:
DELETE <database> FROM <wa>
Example:
TABLES SPFLI.
DATA WA LIKE SPFLI.
WA-NO='34051920'.
WA-COMPANY='DELTA'.
DELETE SPFLI FROM WA.
如 SPFLI 的 Primary Key是 NO, 則會找到 NO='34051920'
的記錄, 找到後將此筆刪除
2.使用條件式
語法:
DELETE FROM <database> WHERE <condition>
根據條件式刪除符合條件式的記錄
Example:
DELETE FROM SPFLI WHERE AREA = 'AMERICAN'.
*-------------------------------------------------------------------------------------*
5. DATABASE CURSOR
Database Cursor是一個資料庫暫存區, 將經SELECT指令讀取的記錄存放至此暫存區, 再由此暫存區放至Work Area中, 可減少資料庫讀取的次數.
1.開啟 Database Cursor
語法:
OPEN CURSOR <c> FOR SELECT … WHERE <condition>
Example:
TABLES SPFLI.
DATA: WA LIKE SPFLI,。

相关文档
最新文档