日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ABAP语法完整版

發(fā)布時間:2025/3/21 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ABAP语法完整版 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

SAP ABAP / 4 基礎(chǔ)知識學習??

數(shù)據(jù)類型

C :字符串

D :日期型格式為 YYYYMMDD? 例:'1999/12/03'

F : 浮點數(shù)長度為8

I :整數(shù)

N :數(shù)值組成的字符串 如:011,'302'

P : PACKED數(shù)用于小數(shù)點數(shù)值? 如:12.00542

T : 時間格式為:HHMMSS 如:'14:03:00'

X : 16進制數(shù) 如:'1A03'

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

變量聲明

DATA <F> [<Length>] <type> [<value>][decimals]

???? <F> 變量名稱

???? <length><type> 變量類型及長度

???? <value> 初值

???? <decimals> 小數(shù)位數(shù)

????

exp:

?? DATA : COUNTER? TYPE P DECIMALS 3.

????????? NAME(10) TYPE C VALUE 'DELTA'.

????????? S_DATE?? TYPE D VALUE '19991203'.

exp:

?? DATA : BEGIN OF PERSON,

??????????? NAME(10) TYPE C,

??????????? AGE????? TYPE I,

??????????? WEIGHT?? TYPE DECIMALS 2,

????????? END OF PERSON.

另外,有關(guān)DATA聲明的指令還有: CONSTANTS(聲明常數(shù))、STATICS(臨時變量聲明).

exp:

CONSTANTS? PI? TYPE? P? DECIMALS? 5? VALUE? '3.14159'.

STATICS 關(guān)鍵字

聲明的變量僅在目前的程序中使用, 結(jié)束后會自動釋放

語法:?

??????? STATICS <c> [<length>] <type> [<value>] [<decimals>]

系統(tǒng)專用變量說明

?? 系統(tǒng)內(nèi)部專門創(chuàng)建了SYST這個STRUCTURE,里面的欄位存放系統(tǒng)變量,常用的系統(tǒng)變量有:

?? SY-SUBRC:? 系統(tǒng)執(zhí)行某指令后,表示執(zhí)行成功與否的變量,'0'表示成功

?? SY-UNAME:? 當前使用者登入SAP的USERNAME;

?? SY-DATUM:? 當前系統(tǒng)日期;

?? SY-UZEIT:? 當前系統(tǒng)時間;

?? SY-TCODE:? 當前執(zhí)行程序的Transaction code

?? SY-INDEX:? 當前LOOP循環(huán)過的次數(shù)

?? SY-TABIX:? 當前處理的是internal table 的第幾筆

?? SY-TMAXL:? Internal table的總筆數(shù)

?? SY-SROWS:? 屏幕總行數(shù);

?? SY-SCOLS:? 屏幕總列數(shù);

?? SY-MANDT:? CLIENT NUMBER

?? SY-VLINE:? 畫豎線

?? SY-ULINE:? 畫橫線

??

TYPE 關(guān)鍵字

? 用來指定資料型態(tài)或聲明自定資料型態(tài)

? Example:

??????? TYPES:? BEGIN? OF? MYLIST,

?????????????????? NAME(10)? TYPE? C,

?????????????????? NUMBER?? TYPE? I,

??????????????? END? OF? MYLIST.

??????? DATA? LIST? TYPE? MYLIST.

LIKE 關(guān)鍵字

?? 跟TYPE關(guān)鍵字使用格式相同, 如

?? DATA? TRANSCODE? LIKE? SY-TCODE.

?? 不同的是 LIKE 用在已有值的資料項, 如系統(tǒng)變量, 而TYPE關(guān)鍵字則是用在指定資料型態(tài)。

TABLES 關(guān)鍵字

用來聲明 Table Work Area 的數(shù)據(jù), 對應(yīng)至 ABAP/4 資料文件(Dictionary Object), 由SQL 指令加載所需數(shù)據(jù)

語法:

TABLES <dbtab>

Example:

TABLES: SPFL.

SELECT * FROM SPFL.

WRITE: SPFL-MANDT, SPFL-CARRID,SPFL-CONNECTION.

ENDSELECT.

從ABAP/4 Dictionary 的 SPFL 檔載入MANDT,CARRID,CONNECTION 三個字段至SPFL 此Table Work Area

??

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

輸出

一. WRITE 語句

ABAP/4用來在屏幕上輸出資料的指令是WRITE指令,例如:

???? WRITE: 'USER NAME IS:', SY-UNAME.

二. 指定屏幕輸出位置

指定輸出位置的語句格式為:

????? WRITE: [AT] [ / ] [<pos>] [(<len>)] 資料項 [<par>]

其中: / : 在下一行輸出

<pos>: 指定輸出的行號;

(<len>):指定輸出位數(shù)(長度)

<par>: 指定顯示格式參數(shù),參數(shù)有:

????????? LEFT-JUSTIFIED? 資料*左對齊

????????? CENTERED??????? 資料*中間對齊

????????? RIGHT-JUSTIFIED 資料*右對齊

????????? UNDER <g>?????? 正對在資料項<g>的下面顯示

????????? NO-GAP????????? 緊接著顯示,不留空格

????????? USING EDIT MASK <m>: 使用內(nèi)嵌子元顯示, 如 12:03:20

????????? USING NO EDIT MASK: 不使用內(nèi)嵌子元

????????? NO-ZER????????? 數(shù)字前面 0 的部分不顯示

????????? NO-SIGN:??????? 不顯示正負號

????????? DECIMALS <d>:?? 顯示 <d> 位小數(shù)

????????? EXPOENT <e>:??? F(浮點數(shù))指數(shù)的值

????????? ROUND <r>:????? 四舍五入至小數(shù)點后<r>位

????????? CURRENCY <c>:?? 幣別顯示

????????? DD/MM/YY :????? 日期顯示格式

????????? MM/DD/YY:??????

????????? YY/MM/DD:

????????? YY/DD/MM

????????? MM/DD/YYYY:

????????? DD/MM/YYYY

????????? YYYY/MM/DD:

????????? YYYY/DD/MM:

例如1: WRITE: /10(6) 'ABCDEFGHIJK'.

輸出結(jié)果為:??????? ABCDEF

例如2: DATA: X TYPE I VALUE '11:20:30',

???????????? A(5)? TYPE C VALUE 'AB? CDE'.

????? WRITE: / X USING EDIT MASK '__:__:__'.

????? WRITE: / X USING EDIT MASK '$___,___'.

????? WRITE: / Y NO-GAP.

輸出結(jié)果為:

??????? 11:20:30

??????? $112,030

??????? ABCDEF

例如3: DATA: LEN TYPE I VALUE 10,

?????? POS TYPE I VALUE 11,

?????? TEXT(10)?? VALUE '1234567890'

?????? WRITE 'The text ------------ appears in the text.'.

?????? WRITE AT POS(LEN) TEXT.

WRITE TO 語句的基本 形式

要將值(文字)或源字段內(nèi)容寫入目標字段,可以使用 WRITE TO 語句:

語法

WRITE <F1> TO <F2> [<option>].

DATA: NUMBER TYPE F VALUE '4.3',

????? TEXT(10),

????? FLOAT TYPE F,

????? PACK? TYPE P DECIMALS 1.

WRITE NUMBER.

WRITE NUMBER TO TEXT EXPONENT 2.

WRITE / TEXT.

WRITE NUMBER TO FLOAT.

WRITE / FLOAT.

WRITE NUMBER TO PACK.

WRITE / PACK.

MOVE NUMBER TO PACK.

WRITE / PACK.

exp:

DATA: NAME(10)?? VALUE 'SOURCE',

????? SOURCE(10) VALUE 'Antony',

????? TARGET(10).

...

WRITE (NAME) TO TARGET.

WRITE: TARGET.

exp :

DATA: COUNTER TYPE I.

COMPUTE COUNTER = COUNTER + 1.

COUNTER = COUNTER + 1.

ADD 1 TO COUNTER.

在此,三條運算語句進行相同算術(shù)運算

輸出屏幕上的線和空行

用下列語法,可以在輸出屏幕上生成水平線:

語法

ULINE [AT [/][<pos>][(<len>)]].

它等同于

WRITE [AT [/][<pos>][(<len>)]] SY-ULINE.

AT 后的格式規(guī)范,與在在屏幕上定位 WRITE 輸出(頁 28)中為 WRITE 語句說明的格式規(guī)范完全一樣。

如果沒有格式規(guī)范,系統(tǒng)則開始新的一行,并用水平線填充該行。否則,只按指定輸出水平線。

生成水平線的另一種方法,是在 WRITE 語句中鍵入恰當數(shù)量的連字符,如下所示:

WRITE [AT [/][<pos>][(<len>)]] '-----...'.

垂直線

用下列語法 ,可以在輸出屏幕上生成垂直線:

語法

WRITE [AT [/][<pos>]] SY-VLINE.

WRITE [AT [/][<pos>]] '|'.

空行

用下列語法 ,可以在輸出屏幕上生成空行:

語法

SKIP [<n>].

該語句從當前行開始,在輸出屏幕上生成 <n> 個空行。如果沒有指定 <n> 的值,就輸出一個空行 。

要將輸出定位在屏幕的指定行上,請使用:

語法

SKIP TO LINE <n>.

該語句允許將輸出位置向上或向下移動。

???????

四. 顯示圖示:

語法: WRITE: <symbol-name> AS SYMBOL.

???? WRITE: <icon-name>? AS ICON.

例如: INCLUDE? <SYMBOL>.

???? INCLUDE? <ICON>.

WRITE: / 'Phone symbol:', SYM_PHONE AS SYMBOL.

WRITE: / 'Alarm Icon:', ICON_VOICE_OUTPUT AS ICON.

要查看系統(tǒng)所提供有那些符號及圖示,可選擇'EDIT'下的'Insert Statement',選擇'Write',接下來選擇要查看的群組,如SYMBOL 或ICON, 接下來按'Display'即可.

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

一. Internal Table 的聲明

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

Internal table 的定義有以下幾種格式:

格式一.?? DATA: BEGIN OF <internal table>? OCCURS? <n>,

?????????????????? <field 1>? TYPE <type1>,

????????????????? [<field 2>? TYPE <type 2>,

?????????????????? <field 3>? TYPE <type 3>,

??????????????????? …????????????????? ]

??????????????? END OF? <internal table>.

???? 語法:

?????????? DATA? <f>? <type>? OCCURS? <n>? [WITH? HEADER? LINE]

?????????? Example:

?????????????????? DATA? VECTOR? TYPE? I? OCCURS? 10? WITH? HEADER? LINE.

??????????????????

格式二.?? TYPES: BEGIN OF <work area>,

???????????????????? <field 1>? TYPE <type1>,

??????????????????? [<field 2>? TYPE <type 2>,

???????????????????? <field 3>? TYPE <type 3>,

??????????????????? …????????????????? ]

???????????????? END OF <work area>.

????????? TYPES <internal table> TYPE <work area> OCCURS <n>.

?????????

格式三.?? DATA: BEGIN OF <work area>.

????????????????? INCLUDE STRUCTURE <table name>.

????????? DATA: END OF <work area>.

????????? DATA: <internal table> LIKE <work area> OCCURS <n>.

exp:

?????????

TYPES VECTOR TYPE I OCCURS 10.

TYPES: BEGIN OF LINE,

???????? COLUMN1 TYPE I,

???????? COLUMN2 TYPE I,

???????? COLUMN3 TYPE I,

?????? END OF LINE.

TYPES ITAB TYPE LINE OCCURS 10.

TYPES: BEGIN OF DEEPLINE,

????????? TABLE1 TYPE VECTOR,

????????? TABLE2 TYPE ITAB,

?????? END OF DEEPLINE.

TYPES DEEPTABLE TYPE DEEPLINE OCCURS 10.

本示例創(chuàng)建與上例相同的內(nèi)表數(shù)據(jù)類型(VECTOR 和 ITAB)。然后創(chuàng)建數(shù)據(jù)類型 DEEPLINE 作為字段串,包含這些內(nèi)表作為組件。通過該字段串,數(shù)據(jù)類型 DEEPTABLE 被創(chuàng)建為內(nèi)表。因此該內(nèi)表的元素本身就是內(nèi)表。

exp :

TYPES: BEGIN OF LINE,

???????? COLUMN1 TYPE I,

???????? COLUMN2 TYPE I,

???????? COLUMN3 TYPE I,

?????? END OF LINE.

TYPES ITAB TYPE LINE OCCURS 10.

DATA TAB1 TYPE ITAB.

DATA TAB2 LIKE TAB1 WITH HEADER LINE.

同創(chuàng)建內(nèi)表數(shù)據(jù)類型(頁 99)中所示,該示例創(chuàng)建數(shù)據(jù)類型 ITAB 作為內(nèi)表。通過使用 DATA 語句的 TYPE 參數(shù)引用 ITAB,使數(shù)據(jù)對象 TAB1 與 ITAB 結(jié)構(gòu)相同。通過使用 DATA 語句的 LIKE 參數(shù)引用 TAB1,使數(shù)據(jù)對象 TAB2 結(jié)構(gòu)相同。創(chuàng)建的 TAB2 帶表頭行。因此,可以在程序中使用 TAB2-COLUMN1、TAB2-COLUMN2 和 TAB2-COLUMN3 等定位表格工作區(qū)域 TAB2。

exp :

DATA FLIGHT_TAB LIKE SFLIGHT OCCURS 10.

本示例創(chuàng)建數(shù)據(jù)對象 FLIGHT_TAB, 其結(jié)構(gòu)與數(shù)據(jù)庫表格 SFLIGHT 相同。

本示例介紹 如何采用兩種不同的步驟創(chuàng)建同一內(nèi)表。

TYPES VECTOR_TYPE TYPE I OCCURS 10.

DATA VECTOR TYPE VECTOR_TYPE WITH HEADER LINE.

在此創(chuàng)建一個內(nèi)表數(shù)據(jù)類型 VECTOR_TYPE,其行包含首先創(chuàng)建的基本類型 I 字段。然后,通過引用 VECTOR_TYPE 創(chuàng)建數(shù)據(jù)對象 VECTOR。通過使用 WITH HEADER LINE 選項還創(chuàng)建表格工作區(qū)域 VECTOR。在這種情況下,表格工作區(qū)域包含一種類型 I 字段,可以通過名稱 VECTOR 定位。

DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.

在這種情況下,通過直接在 DATA 語句中使用 OCCURS 選項創(chuàng)建完全一樣的數(shù)據(jù)類型 VECTOR。

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

1. TYPES type.

2. TYPES type(len).

3. TYPES: BEGIN OF structype? ...

????????? END OF structype.

4. TYPES itabtype {TYPE tabkind OF linetype LIKE tabkind OF lineobj}

???????? [WITH [UNIQUE|NON-UNIQUE] keydef] [INITIAL SIZE n].

5. TYPES itabtype TYPE RANGE OF type.

?? TYPES itabtype LIKE RANGE OF f.

6. TYPES itabtype {TYPE linetype|LIKE lineobj} OCCURS n.

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

?????????

APPEND LINE

格式:APPEND <work area> TO <internal table>

舉例一:(使用WORK AREA)

DATA : BEGIN OF LINE,

???????????? COL1 TYPE I,

???????????? COL2 TYPE I,

?????? END OF LINE.

DATA ITAB LIKE LINE OCCURS 10.

DO 2 TIMES.

?? LINE-COL1 = SY-INDEX.

?? LINE-COL2 = SY-INDEX ** 2.

?? APPEND LINE TO ITAB.

ENDDO.

LOOP AT ITAB INTO LINE.

???? WRITE : / LINE-COL1,LINE-COL2.

ENDLOOP.

舉例二 (不使用WORK AREA)

DATA : BEGIN OF ITAB OCCURS 10,

???????????? COL1 TYPE I,

???????????? COL2 TYPE I,

?????? END OF ITAB.

DO 2 TIMES.

?? ITAB-COL1 = SY-INDEX.

?? ITAB-COL2 = SY-INDEX ** 2.

?? APPEND ITAB.

ENDDO.

LOOP AT ITAB.

???? WRITE : / ITAB-COL1,ITAB-COL2.

ENDLOOP.

exp:

DATA: BEGIN OF ITAB OCCURS 10,

??????? COL1 TYPE C,

??????? COL2 TYPE I,

????? END OF ITAB.

DO 3 TIMES.

? APPEND INITIAL LINE TO ITAB.

? ITAB-COL1 = SY-INDEX. ITAB-COL2 = SY-INDEX ** 2.

? APPEND ITAB.

ENDDO.

LOOP AT ITAB.

? WRITE: / ITAB-COL1, ITAB-COL2.

ENDLOOP.

舉例三. (加入另一個Internal table的元素)

?????? 格式: APPEND LINES OF <itab1> [FROM <n1> ] [TO <n2>] TO <itab2>.

?????? 將<itab1>的元素加入至<itab2>中,可選取自<n1>至<n2>的范圍.

?????? APPEND LINES OF ITAB TO JTAB.

COLLECT LINE

COLLECT 指令也是將元素加入Internal table中,與APPEND 的區(qū)別是: COLLECT指令在非數(shù)值欄位相同的情況下,將數(shù)值欄位匯總.

格式:? COLLECT [<work area> INTO ] <itab>

DATA: BEGIN OF ITAB OCCURS 3,

???????????? COL1(3)? TYPE C,

???????????? COL2???? TYPE I,

?????? END OF ITAB.

?????? ITAB-COL1 = 'ABC'.??? ITAB-COL2 = 10.

?????? COLLECT? ITAB.

?????? ITAB-COL1 = 'XYZ'.??? ITAB-COL2 = 20.

?????? COLLECT? ITAB.

?????? ITAB-COL1 = 'ABC'.??? ITAB-COL2 = 80.

?????? COLLECT? ITAB.

此時, internal table中放的是2筆數(shù)據(jù), 分別為:

?????? ITAB-COL1??????? ITAB-COL2

??????? 'ABC'?????????????? 90

??????? 'XYZ'?????????????? 20

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

INSERT LINE

將元素插入在指定的internal table位置之前.

格式: INSERT [<wa> INTO] [INITIAL LINE INTO ] <itab> [INDEX <idx>]

或者: INSERT LINES OF <itab1> [FROM <n1> TO <n2>] INTO <itab2> INDEX <idx>

其中: <wa>即work area,工作區(qū)中的元素.

[INITIAL LINE INTO] :插入一筆初始化的記錄.

<itab>: internal table

[INDEX <idx>]: internal table 的記錄號.(新加入的元素放在此記錄前面)

???????? Example:

????????????????? DATA:? BEGIN? OF? LINE,

?????????????????????????? COL1? TYPE? I,

?????????????????????????? COL2? TYPE? I,

?????????????????????????? END? OF? LINE.

????????????????? DATA? ITAB? LIKE? LINE? OCCURS? 10.

????????????????? DO? 3? TIMES.

???????????????????? LINE-COL1 = SY-INDEX *10.

???????????????????? LINE-COL2 = SY-INDEX *20.

???????????????????? APPEND? LINE? INTO? ITAB.

????????????????? ENDDO.

????????????????? LINE-COL1=100.

????????????????? LINE-COL2=200.

????????????????? INSERT? LINE? INTO? ITAB? INDEX? 2.? "插入在位置2之前

????????????????? LOOP? AT? ITAB? INTO? LINE.

??????????????????? WRITE:? /? SY-TABIX,LINE-COL1,LINE-COL2. "SY-TABIX為Table位置

???????????????? ENDLOOP.

???????????????? 執(zhí)行結(jié)果:

??????????????????????????? 1??????? 10?????? 20

??????????????????????????? 2?????? 100????? 200? "插入的元素

??????????????????????????? 3??????? 20?????? 40

??????????????????????????? 4??????? 30?????? 60

插入另一Internal Table元素

?? 語法:

???????? INSERT? LINES? OF? <itab1>? [FROM <n1> TO <n2>]? TO? <itab2>? INDEX <idx>

??????? 將<itab1>的元素插入至<itab2>中, 位置在 <idx>之前, 可選取自<n1>至<n2>的范圍

???????? Example:

????????????????? APPEND? LINES? OF? ITAB? TO? JTAB? INDEX? 3.

????????????????? 將ITAB所有元素插入JTAB中, 位置在第三個元素之前

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

讀取internal table

格式一:

LOOP AT <itab> [INTO <wa>][FROM <n1> TO <n2>][WHERE <conditions>]

?????? <statement>

ENDLOOP.

???????? Example:

????????????????? LOOP? AT? ITAB? INTO? LINE? WHERE? COL1 >100.

???????????????????? WRITE:? /? SY-TABIX,LINE-COL1.

????????????????? ENDLOOP.

????????????????? 僅讀取 COL1 > 100 的元素

格式二:

READ TABLE <itab> [INTO <wa>] [INDEX <idx> / WITH KEY <conditions>]

舉例. (格式二)

DATA: BEGIN OF ITAB OCCURS 10,

???????????? COL1 TYPE I,

???????????? COL2 TYPE I,

????? END OF ITAB.

????? DO 10 TIMES.

????????? ITAB-COL1 = SY-INDEX.

????????? ITAB-COL2 = SY-INDEX * 2.

????????? APPEND ITAB.

ENDDO.

READ TABLE ITAB INDEX 3.

(或者: READ TABLE? ITAB WITH KEY COL1 = 3.)

WRITE: / 'ITAB-COL1 = ', ITAB-COL1, 'ITAB-COL2 = ', ITAB-COL2.

執(zhí)行結(jié)果同樣是:

ITAB-COL1 = 3

ITAB-COL2 = 6.

???????? Example:

?????????????????? READ? TABLE? ITAB? INTO? LINE? INDEX? 5

?????????????????? 讀取 ITAB的第5個元素資料, 放入 LINE的欄位中

根據(jù)欄位內(nèi)容尋找

?? 語法:

????????? READ? TABLE? <itab>? INTO? <wa>

????????? Example:

????????????????? ITAB-COL1 = 'ABC'.

????????????????? READ? TABLE? ITAB? INTO? LINE.

????????????????? 找出ITAB 中 COL1 欄位內(nèi)容是 ABC 的元素, 找到的值放入 LINE 中

????????????????? 若找到 SY-SUBRC傳回0, 找不到則傳回 4, <itab>必須聲明有 work area

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

修改internal table 中的值

格式: MODIFY <itab> [FROM <wa>][INDEX <idx>][TRANSPORTING <f1><f2>…][WHERE <conditions>]

舉例一. READ TABLE ITAB INDEX 3.

?????? LINE-COL1 = 29.

?????? MODIFY ITAB FROM LINE TRANSPORTING COL1.

?????? 將第三筆記錄的COL1欄位的值修改為29.

舉例二. T_SALARY - salary = 50.

?????? MODIFY T_SALARY TRANSPORTING salary WHERE birthday = '1999/12/06'.

??????

DELETE internal table中的欄位

格式: DELETE <itab> INDEX <idx>.

或:?? DELETE <itab>[FROM <n1> TO <n2>] [WHERE <conditions>]

Internal table 排序?

SORT <itab> [<order way>][BY <f1><f2>…]

其中:<order way> 有DESCENDING 和ASCENDING, Default 為ASCENDING.

???? <f1>: 為指定排序的欄位.

??????? Example:

???????????????? SORT? ITAB? DESCENDING? BY? COL2.

???????????????? 將 ITAB 根據(jù) COL2欄位遞減排序

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

確定內(nèi)表屬性

如果在處理過程中想知道內(nèi)表一共包含多少行,或者想知道定義的 OCCURS 參數(shù)的大小,請使用 DESCRIBE 語句,用法如下:

語法

DESCRIBE TABLE <itab> [LINES <lin>] [OCCURS <occ>].

如果使用 LINES 參數(shù),則將填充行的數(shù)量寫入變量 <lin>。如果使用 OCCURS 參數(shù),則將行的初始號寫入變量 <occ>。

DATA: BEGIN OF LINE,

???????? COL1 TYPE I,

???????? COL2 TYPE I,

????? END OF LINE.

DATA ITAB LIKE LINE OCCURS 10.

DATA: LIN TYPE I, OCC TYPE I.

DESCRIBE TABLE ITAB LINES LIN OCCURS OCC.

WRITE: / LIN, OCC.

DO 1000 TIMES.

?? LINE-COL1 = SY-INDEX.

?? LINE-COL2 = SY-INDEX ** 2.

?? APPEND LINE TO ITAB.

ENDDO.

DESCRIBE TABLE ITAB LINES LIN OCCURS OCC.

WRITE: / LIN, OCC.

其輸出為:

???????? 0???????? 10

???? 1.000???????? 10

在此創(chuàng)建內(nèi)表 ITAB。在填充表格前后執(zhí)行 DESCRIBE 語句。更改當前行號,但無法更改初始行號。

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

加總

SUM.

總和計算存放與work area中,但只能在LOOP 中使用.

例: LOOP AT ITAB INTO LINE.

???????? SUM.

?? ENDLOOP.

?? WRITE: / LINE-COL1, LINE-COL2.

?? LINE-COL1 和 LINE-COL2 存數(shù)值總和初始化internal table

REFRESH <itab>.? 清空<itab>中的值.使用在沒有 HEADER LINE 的 Internal Table中, 清除所有元素

CLEAR?? <itab>.? 清空<itab>的Header Line.使用在有 HEADER LINE 的 Internal Table中, 清除所有元素

FREE??? <itab>.? 釋放內(nèi)存空間.釋放(Release) Internal Table所占的內(nèi)存空間, 用在 REFRESH和 CLEAR指令之后

將值重置為 默認值

可以用 CLEAR 語句重置任何數(shù)據(jù)對象值,如下所示:

語法

CLEAR <f>.

exp:

DATA NUMBER TYPE I VALUE '10'.

WRITE NUMBER.

CLEAR NUMBER.

WRITE / NUMBER.

輸出為:

??????? 10

???????? 0

CLEAR 語句將字段 NUMBER 的內(nèi)容從10 重置為默認值 0。

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

?? 添加字段順序并將結(jié)果賦給另一個字段

語法

ADD <n1> THEN <n2> UNTIL <nz> GIVING <m>.

如果 <n1>、 <n2>、 ... 、 <nz> 是在內(nèi)存中相同類型和長度的等距字段序列,則進行求和計算并將結(jié)果賦給 <m>

?? 添加字段順序并將結(jié)果添加到另一個字段的內(nèi)容中

語法

ADD <n1> THEN <n2> UNTIL <nz> TO <m>.

該語句除了將字段總和添加到 <m> 的舊內(nèi)容中之外,與上面語句的工作方式相同 。

有關(guān)其它相似變體的信息,參見有關(guān) ADD 語句的關(guān)鍵字文檔。

DATA: BEGIN OF SERIES,

???????? N1 TYPE I VALUE 10,

???????? N2 TYPE I VALUE 20,

???????? N3 TYPE I VALUE 30,

???????? N4 TYPE I VALUE 40,

???????? N5 TYPE I VALUE 50,

???????? N6 TYPE I VALUE 60,

????? END OF SERIES.

DATA SUM TYPE I.

ADD SERIES-N1 THEN SERIES-N2 UNTIL SERIES-N5 GIVING SUM.

WRITE SUM.

ADD SERIES-N2 THEN SERIES-N3 UNTIL SERIES-N6 TO SUM.

WRITE / SUM.

輸出如下:

?????? 150

?????? 350

在此,將 N1 到 N5 組件內(nèi)容求和并將其值賦給字段 SUM。然后,將 N2 到 N6 組件求和并將其添加到 SUM 的值中。

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

?????????

屏幕輸入命令

在ABAP/4中要從屏幕輸入變量, 使用的命令是 PARAMETERS 及SELECTION-OPTIONS:

??? 1. PARAMETER: 輸入一個變量或欄位內(nèi)容

??? 2. SELECTION-OPTIONS: 使用條件篩選畫面來輸入數(shù)據(jù)???

PARAMETERS 指令

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

??? 語法:

??????? PARAMETERS? <p>? [DEFAULT <f>]? [LOWER CASE]

?????????????????????????? [OBLIGATORY]? [AS CHECKBOX]

?????????????????????????? [RADIOBUTTON GROUP <rad>]

?????? Example:

??????????? PARAMETERS:? NAME(8),

?????????????????????????? AGE? TYPE? I,

?????????????????????????? BIRTH? TYPE? D.

??????????? 執(zhí)行結(jié)果:????????????

在日期的輸入格式上為 MM/DD/YY , MM/DD/YYYY, MMDDYY或MMDDYYYY , 如輸入 020165 表 1965年02月01日, 與02/01/65的輸入是一樣的, 日期輸入范圍為西元1950年至2049年

1. DEFAULT

設(shè)定輸入的預(yù)設(shè)值

Example:

?? PARAMETERS:? COMPANY(20)? DEFAULT? 'DELTA',

??????????????? BIRTH? TYPE? D? DEFAULT? '19650201'.

2.?? LOWER CASE

???? ABAP/4預(yù)設(shè)是將字串輸入值自動轉(zhuǎn)換為大寫, 加上此參數(shù)會將輸入的資料轉(zhuǎn)成小寫,

3.?? OBLIGATORY

強制要求輸入, 屏幕上會出現(xiàn)一個 ? , 使用者必須要輸入才可.

4.?? AS CHECKBOX

輸入 CHECKBOX的格式

Example:

????????? PARAMETERS:? TAX? AS? CHECKBOX? DEFAULT 'X',

?????????????????????? NTD? AS? CHECKBOX.

????????? 執(zhí)行結(jié)果:

???

5.??? RADIOBUTTON GROUP <rad>

????? 輸入 RADIO BUTTON GROUP 的方式

????? Example:

???? PARAMETERS: BOY? RADIOBUTTON GROUP? SEX? DEFAULT 'X',????????

?????????????????? GIRL? RADIOBUTTON GROUP? SEX.

exp :

TABLES SPLFI.

PARAMETERS: LOW? LIKE SPFLI-CARRID,

??????????? HIGH LIKE SPFLI-CARRID.

SELECT * FROM SPLFI WHERE CARRID BETWEEN LOW AND HIGH.

?? ........

ENDSELECT.

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

??

SELECTION-OPTIONS

?? SELECTION-OPTIONS所輸入的值實際上是放在internal table中的,該Internal table 有四個欄位,分別是:SIGN,OPTION,LOW,HIGH.. 條件篩選檢查條件輸入畫面指令, 輸入條件后可配合SELECT指令自TABLE讀取符合條件的資料, 直接執(zhí)行或放入 Internal Table中, 條件有四個參數(shù):

1. SIGN:

???? I: 表篩選條件符合的資料

???? E: 表篩選條件不符合的資料

2. OPTION: 比較的條件符號

????????? EQ(等于),NE(不等于),GT(大于),LE(小于),CP(包含),NP(不包含)

3. LOW: 最小值

4. HIGH: 最大值

?? 語法:

????????? SELECTION-OPTIONS? <check-option>? FOR? <table-field>

Example:

????????? TABLES? SPFLI.

????????? SELECT-OPTIONS? AIRLINE? FOR? SPFLI-CONNID.

將條件的輸入值存放入 AIRLINE, 篩選選擇為SPFLI中的CONNID欄位

改變條件輸入格式

1. DEFAULT? <begin>? TO? <end>

設(shè)定開始結(jié)束范圍輸入預(yù)設(shè)值

???? Example:

???? SELECT-OPTIONS? AIRLINE? FOR? SPFLI-CONNID DEFAULT? '2042'? TO? '4555'.

2. NO-EXTENSION

設(shè)定不要Multi-Option輸入畫面

3. NO? INTERVALS

設(shè)定不要區(qū)間范圍輸入畫面

4. LOWER CASE

輸入轉(zhuǎn)換成大寫

5. OBLIGATORY

強制要求輸入

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

配合 SELECT 命令

?? 條件輸入完后要將符合條件的資料篩選出來, 可配合使用 SELECT 指令

?? 1.使用WHERE <條件式>

Example:

? TABLES? SPFLI.

? SELECT-OPTIONS? AIRLINE? FOR? SPFLI-CONNID.

? SELECT? *? FROM? SPFLI? WHERE? CONNID? IN? AIRLINE.

?????? WRITE: / SPFLI-CONNID,SPFLI-CITYFROM,SPFLI-CITYTO.

? ENDSELECT.

2.使用CHECK參數(shù)

Example:

? TABLES? SPFLI.

? SELECT-OPTIONS? AIRLINE? FOR? SPFLI-CONNID.

????? SELECT? *? FROM? SPFLI.

????? CHECK? AIRLINE.

????? WRITE: / SPFLI-CONNID,SPFLI-CITYFROM,SPFLI-CITYTO.

? ENDSELECT.

? *

exp:?

TABLES SPFLI.

SELECT-OPTIONS: S_CARRID FOR SPFLI-CARRID,

??????????????? S_CITYFR FOR SPFLI-CITYFROM,

??????????????? S_CITYTO FOR SPFLI-CITYTO,

??????????????? S_CONNID FOR SPFLI-CONNID.

SELECT * FROM SPFLI.

? CHECK: SPFLI-CARRID IN S_CARRID,

?????? SPFLI-CITYFR IN S_CITYFR,

?????? SPFLI-CITYTO IN S_CITYTO,

?????? SPFLI-CONNID IN S_CONNID.

?? WRITE: / SPFLI-CARRID, SPFLI-CONNID,

????????? SPFLI-CITYFROM, SPFLI-CITYTO.

ENDSELECT.

?

3.使用 IF … IN 關(guān)鍵字

???? Example:

???????? SELECT-OPTIONS? AIRLINE? FOR? SPFLI-CONNID.

???????? SELECT? *? FROM? SPFLI.

??????????? IF? SPFLI-CONNID? IN? AIRLINE.

????????????? WRITE: / SPFLI-CONNID,SPFLI-CITYFROM,SPFLI-CITYTO.

??????????????? ENDIF.

???????????? ENDSELECT.

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

SELECTION-SCREEN

??? 1.產(chǎn)生空白列

語法:

????? SELECTION-SCREEN? SKIP? [<n>]

????????? Example:

?????????????????? SELECTION-SCREEN? SKIP? 2.

?????????????????? 產(chǎn)生兩列空白列

??? 2.產(chǎn)生底線

語法:

????? SELECTION-SCREEN? ULINE? / <pos>(length)

????????? Example:

?????????????????? SELECTION-SCREEN? ULINE? /10(30).

?????????????????? 自第10格開始產(chǎn)生長度30的底線

?? 3.印出備注說明

???? 語法:

????? SELECTION-SCREEN? COMMENT? / <pos>(length)? <name>

????????? Example:

?????????????????? REMARK = 'Pls enter your name'.

?????????????????? SELECTION-SCREEN? COMMENT? /10(30)? REMARK.

??? 4. 同一列中輸入數(shù)個資料項

語法:

????? SELECTION-SCREEN? BEGIN? OF? LINE.

???????? ……

????? SELECTION-SCREEN? END? OF? LINE.

????? Example:

????????????? SELECTION-SCREEN? BEGIN? OF? LINE.

????????????????? SELECTION-SCREEN? POSITION 20.

????????????????? PARAMETERS? NAME(10).

????????????????? SELECTION-SCREEN? POSITION 40.

????????????????? PARAMETERS? BIRTH? TYPE? D.

????????????? SELECTION-SCREEN? END? OF? LINE.

????????????? 在20格輸入NAME內(nèi)容, 40格輸入 BIRTH的內(nèi)容

??? 5. 繪出BLOCK PANEL

語法:

SELECTION-SCREEN? BEGIN? OF? BLOCK? <block>

????????????????????? [WITH? FRAME? [TITLE? <title>].

????????? …….

SELECTION-SCREEN? END? OF? BLOCK? <block>.

Example:

SELECTION-SCREEN? BEGIN? OF? BLOCK? RADIO????????????????????????? WITH? FRAME .

????????????????? PARAMETER? R1? RADIOBUTTON? GROUP? GR1.

????????????????? PARAMETER? R2? RADIOBUTTON? GROUP? GR1.

????????????????? PARAMETER? R3? RADIOBUTTON? GROUP? GR1.

?????????????? SELECTION-SCREEN? END? OF? BLOCK? RADIO.?

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

?

SQL語法
???? 我們在編寫ABAP4程序的時候,經(jīng)常需要從TABLE中根據(jù)某些條件讀取數(shù)據(jù),讀取數(shù)據(jù)最常用的方法就是通過SQL語法實現(xiàn)的。ABAP/4中可以利用SQL語法創(chuàng)建或讀取TABLE,SQL語法分為DDL(DATA DEFINE LANGUAGE)語言和DML(DATA MULTIPULATION LANGUAGE)語言,DDL語言是指數(shù)據(jù)定義語言,例如CREATE等, DML語言是數(shù)據(jù)操作語言,例如SELECT, INSERT等語句。SQL語句有OPEN SQL語句和NATIVE SQL語句。 OPEN SQL語句不是標準SQL語句,是ABAP/4語言,利用OPEN SQL語句能在Databases 和 Command 之間產(chǎn)生一個BUFFER,所以它有一個語言轉(zhuǎn)換的過程。而NATIVE SQL語句則是標準的SQL語句, 它直接針對Databases操作。

OPEN SQL

SELECT語句
語法格式:
SELECT <result> [INTO <target>] [FROM <source>] [WHERE <condition>]
?????????????? [GROUP BY <fields>] [ORDER BY <sort order>]
其中: <result>指定要抓取的欄位
????? <target>將讀取的記錄存放在work area中
????? <source>指定從那個TABLE中讀取資料
????? <condition>抓取資料的條件
????? <fields>指定按那些欄位分組
????? <sort order>排序的欄位及方式
相關(guān)的系統(tǒng)變量:
???? SY-SUBRC = 0? 表示讀取數(shù)據(jù)成功
????????????? <> 0 表示未找到符合條件的記錄
???? SY-DBLNT: 被處理過的記錄的筆數(shù).
相關(guān)的命令:
???? EXIT. 退出循環(huán).
???? CHECK <logistic statement>.如果邏輯表達式成立,則繼續(xù)執(zhí)行,否則,開始下一次循環(huán)。
???
利用循環(huán)方式讀取所有記錄
SELECT ….ENDSELECT.是循環(huán)方式讀取記錄的。
???? 例如:
TABLES MARD.
SELECT [DISTINCT] * FROM MARD WHERE MATNR = '3520421700'.
??? <Statements>.
ENDSELECT.
(從MARD中抓取所有料號=3520421700的資料)
◆讀取一筆資料
????? Example:
?????????????? TABLES? SPFLI.
?????????????? SELECT? SINGLE? *? FROM? SPFLI????
???????????????????? WHERE? PLANT ='CHUNGLI'? AND? TEL='4526174'.
?????????????? WRITE:? /? SPFLI-COMPANY,SPFLI-PLANT,SPFLI-TEL.
◆將讀取的記錄放在work area中,并且加入Internal table 中.
格式有:
?? ... INTO <work area>
?? ... INTO CORRESPONDING FIELDS OF <work area>
?? ... INTO (f1, ..., fn) 變量組.
?? ... INTO TABLE <internal table>
?? ... INTO CORRESPONDING FIELDS OF TABLE <internal table>
?? ... APPENDING TABLE <internal table>
?? ... APPENDING CORRESPONDING FIELDS OF TABLE <internal table>
舉例一:
TABLES MARD.?
DATA:? BEGIN OF ITAB OCCURS 10,
????????????? MATNR LIKE MARD-MATNR,
????????????? WERKS LIKE MARD-WERKS,
????????????? LGORT LIKE MARD-LGORT,
????????????? LABST LIKE MARD-LABST,
??????? END OF ITAB.
SELECT MATNR WERKS LGORT LABST??
????????????? INTO CORRESPONDING FIELDS OF ITAB?
????????????? FROM MARD
????????????? WHERE MATNR = '3520421700'.
?????? APPEND ITAB.
?????? CLEAR ITAB.
ENDSELECT.
(將讀取的結(jié)果放在Internal table ITAB中)

DATA: BEGIN OF WA,?
??????? LINE(240),
????? END OF WA.
DATA NAME(10).
NAME = 'SPFLI'.
SELECT * FROM (NAME) INTO WA.
? WRITE: / WA-LINE.?
ENDSELECT.
數(shù)據(jù)庫表名稱 SPFLI 被賦給字符字段 NAME。SELECT 語句將所有的行從 SPFLI 中讀到目標區(qū) WA 中。在該示例中,WA 與 SPFLI 的結(jié)構(gòu)并不相同,每一行都將自動地轉(zhuǎn)換成字符字段.

舉例二.
TABLES MARD.
SELECT MATNR? MTART? MAKTX? INTO (t_matnr, t_mtart, maktx)?
?????????????? FROM MARD
?????????????? WHERE MATNR = '3520421700'.
?????? <Statements>.
ENDSELECT.
(從MARD中抓取料號=3520421700的料號、類型和描述,放在變量t_matnr, t_mtart, maktx中)。

??????? Example:
???????????????? TABLES? SPFLI.
???????????????? DATA? WA? LIKE? TABLES.
???????????????? SELECT? *? FROM? SPFLI? INTO? WA.
??????????????????? WRITE:? /? WA-COMPANY,WA-PLANT.
???????????????? ENDSELECT.
???????????????? 逐筆寫入WA 工作區(qū)中
舉例三.
將讀取的資料寫入 Initial Table 中
? 語法:
??????? SELECT? .. INTO? TABLE? <itab>???
??????? Example:
??????? TABLES? SPFLI.
??????? DATA? ITAB? LIKE? SPFLI? OCCURS? 10? WITH? HEADER? LINE.
??????? SELECT? *? FROM? SPFLI? INTO? ITAB.
??????? 一次讀10筆(Initial Table的長度)記錄存入 ITAB 中
????????
??????? SELECT? .. INTO? TABLE? <itab>? PACKAGE? SIZE <n>
??????? 一次讀取 <n> 筆記錄至 <itab>中
??????? Example:
?????????? TABLES? SPFLI.
?????????? DATA? ITAB? LIKE? SPFLI? OCCURS? 10? WITH? HEADER? LINE.
?????????? SELECT? *? FROM? SPFLI? INTO? ITAB? PACKAGE? SIZE? 5.?
?????????? 一次讀取 5 筆記錄

exp :

TABLES SPFLI.
DATA: BEGIN OF WA,
???????? NUMBER TYPE I VALUE 1,
???????? CITYFROM LIKE SPFLI-CITYFROM,
???????? CITYTO?? LIKE SPFLI-CITYTO,
????? END OF WA.
SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF WA.
?? WRITE: / WA-NUMBER, WA-CITYFROM, WA-CITYTO.
ENDSELECT.
輸出如下所 示:

在該示例中,系統(tǒng)只將數(shù)據(jù)庫表 SPFLI 中選定行的列 CITYFROM 和 CITYTO 傳送到 WA 中。WA 中的組件 NUMBER 保持不變。
*-------------------------------------------------------------------------------------*

按指定的欄位排序
TABLES SBOOK.
SELECT * FROM SBOOK?? WHERE CARRID = 'LH' AND
??????????????????????????? CONNID = '0400' AND
??????????????????????????? FLDATE = '19950228'
??????????????????????????? ORDER BY BOOKID ASCENDING.
?? WRITE: / SBOOK-BOOKID,?? SBOOK-CUSTOMID,
?????????? SBOOK-CUSTTYPE,? SBOOK-SMOKER,
?????????? SBOOK-LUGGWEIGHT, SBOOK-WUNIT,
?????????? SBOOK-INVOICE.
ENDSELECT.
(利用參數(shù)ORDER BY所指定的欄位排序)
*-------------------------------------------------------------------------------------*

◆ 抓取數(shù)據(jù)的條件關(guān)鍵字
(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 關(guān)鍵字
???? 指定排序的欄位或順序
???? (1). ..ORDER BY PRIMARY KEY.
??????? 根據(jù) PRIMARY KEY 遞增排序
???? (2)…ORDER BY <f1> [DESCENDING] <f2> [DESCENDING]
??????? Example:
????????????????? SELECT * FROM IM ORDER BY PART .
*-------------------------------------------------------------------------------------*

INSERT 語句
◆從work area 加入到Internal Table中
格式: INSERT INTO <database> VALUES <work area>
例如:?
DATA:? BEGIN OF WA,
????????????? CODE(6)? TYPE C,
????????????? NAME(30) TYPE C,
??????? END OF WA.
DATA:? VEN LIKE WA OCCURS 10.

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

WA-CODE = '530120'.
WA-NAME? =? 'XINGDA ELECTRONICS CO., LTD'.
INSERT WA.
◆從另外一個Internal table中INSERT 資料
格式:
INSERT <itab1> FROM TABLE <itab2> [ACCEPTING DUPLICATE KEY]
將<itab2>中非NULL的資料加入<itab1>中,加上[ACCEPTING DUPLICATE KEY]能限制相同PRIMARY KEY不重復加入.

?? 加入一筆記錄至資料庫

?? 1.自 Work Area 工作區(qū)
?? 語法:
??????? INSERT? INTO? <database>? VALUES? <wa>
??????? Example:
???????????????? TABLES? SPFLI.
???????????????? DATA? WA?? LIKE? SPFLI.
???????????????? WA-NO = '34051920'.
???????????????? WA-COMPANY='DELTA'.
???????????????? INSERT? SPFLI? VALUES? WA.
???????????????? 將 ITAB 資料加入 SPFLI中, 也可寫成 INSERT? SPFLI? FROM? ITAB.
???????????
????????????????? SPFLI-NO='34299876'.
????????????????? SPFLI-COMPANY='HP'.
????????????????? INSERT? SPFLI? FROM? SPFLI.
????????????????? 將Work Area? SPFLI中的資料加入資料庫檔案 SPFLI中
????????????????? 因Work Area SPFLI的結(jié)構(gòu)與資料檔 SPFLI一樣, 所以也可
????????????????? 寫成 INSERT? SPFLI.

?? 2.自 Internal Table
???? 語法:
?????????? INSERT? <database>? FROM? TABLE? <itab>? [ACCEPTING DUPLICATE KEY]
?????????? 將 <itab>中非 NULL的資料加入 <database>中, 加上 [ACCEPTING DUPLICATE
?????????? KEY]能檢查不加入有重覆primary key, 若有重覆則 SY-SUBRC 會傳回 4
?????????? Example:
??????????????????? TABLES? SPFLI.
??????????????????? DATA? ITAB? LIKE? SPFLI? OCCURS? 10? WITH? HEADER LINE.
??????????????????? ITAB-NO = '34051920'.
??????????????????? ITAB-COMPANY = 'DELTA'.
??????????????????? APPEND? ITAB.
??????????????????? ….
??????????????????? INSERT? SPFLI? FROM? TABLE? ITAB??
???????????????????????????? ACCEPTING? DUPLICATE? KEY.
*-------------------------------------------------------------------------------------*

UPDATE 指令
?? 異動已存在的記錄內(nèi)容

1.使用 Primary Key
? 語法:?
??????????? UPDATE? <database>? FROM? <wa>
??????????? Example:
???????????????????? TABLES? SPFLI.
???????????????????? DATA? WA? LIKE? SPFLI.
???????????????????? WA-NO='34051920'.
???????????????????? WA-COMPANY='DELTA'.
??????????????????? UPDATE? SPFLI? FROM? WA.
??????????????????? 如 SPFLI 的 Primary Key是 NO, 則會找到 NO='34051920'的記錄, 將其 COMPANY欄位異動為 DELTA

2.使用條件式
? 語法:
??????? UPDATE? <database>? SET? < f1>=<values>…? WHERE? <condition>
??????? 根據(jù)條件式異動符合條件式的記錄
??????? Example:
???????????????? UPDATE? SPFLI? SET? NO ='34051920'
???????????????????????????????????? COMPANY = 'DELTA'
???????????????????????? WHERE? TEL = '4526107'.
*-------------------------------------------------------------------------------------*

3.?? MODIFY 語法
???? MODIFY <internal table> [FROM <work area>].
根據(jù) Primary Key 尋找資料檔中符合的記錄, 若找到則更新異動, 若找不到則新增記錄
語法:
?????? MODIFY? <database>? FROM? <wa>
?????? Example:
??????????????? WA-NO='34051920'.
??????????????? WA-COMPANY='DELTA'.
??????????????? MODIFY? SPFLI? FROM? WA.
?????
4.?? DELETE 語法
???? DELETE <internal table> [FROM <work area>].
?或: DELETE <internal table> [WHERE <conditions>]
?? 刪除資料檔的記錄

1.使用 Primary Key
? 語法:?
??????????? DELETE? <database>? FROM? <wa>
??????????? Example:
???????????????????? TABLES? SPFLI.
???????????????????? DATA? WA? LIKE? SPFLI.
???????????????????? WA-NO='34051920'.
???????????????????? WA-COMPANY='DELTA'.
???????????????????? DELETE? SPFLI? FROM? WA.
???????????????????? 如 SPFLI 的 Primary Key是 NO, 則會找到 NO='34051920'的記錄, 找到后將此筆刪除

2.使用條件式
? 語法:
??????? DELETE? FROM? <database>? WHERE? <condition>
??????? 根據(jù)條件式刪除符合條件式的記錄
??????? Example:
???????????????? DELETE? FROM? SPFLI? WHERE? AREA = 'AMERICAN'.
????????????????????????????????????????
*-------------------------------------------------------------------------------------*

5. DATABASE CURSOR
?? Database Cursor是一個資料庫暫存區(qū), 將經(jīng)SELECT指令讀取的記錄存放至此暫存區(qū), 再由此暫存區(qū)放至Work Area中, 可減少資料庫讀取的次數(shù).
1.開啟 Database Cursor
? 語法:
??????? OPEN? CURSOR? <c>? FOR? SELECT …? WHERE <condition>
??????? Example:
??????????????? TABLES? SPFLI.
??????????????? DATA:? WA? LIKE? SPFLI,
??????????????????????? C1? TYPE? CURSOR.
??????????????? OPEN? CURSOR? C1 FOR SELECT? *? FROM? SPFLI?
?????????????????????? WHERE? AREA ='TAIWAN'.
? 2.讀取 Database Cursor的資料存入 Work Area
語法:
????? FETCH? NEXT? CURSOR? <c>? INTO? <wa>
????????? Example:
?????????????????? FETCH? NEXT? CURSOR? C1? INTO? WA.
? 讀取下一筆Cursor位置的資料存入WA, 如果已無資料可讀, SY-SUBRC <>0.?
關(guān)閉 Database Cursor
語法:
????? CLOSE? CURSOR? <c>
????? Example:
?????????????? CLOSE? CURSOR? C1.

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

COMMIT WORK & ROLLBACK WORK
要確定資料成功寫入資料庫,可使用COMMIT WORK指令,如:?
?? COMMIT? WORK.
相反的,如果反悔要復原,可使用 ROLLBACK? WORK, 可復原在上個COMMIT WORK指令之后的資料, 如:
?? ROLLBACK? WORK.
*-------------------------------------------------------------------------------------*
使用NATIVE SQL指令
語法格式:
EXEC SQL [PERFORMING <form>].
???? <statements>
ENDEXEC.
舉例一.
EXEC SQL.
? CREATE TABLE AVERI_CLNT (
???????? CLIENT?? CHAR(3)? NOT NULL,
???????? ARG1???? CHAR(3)? NOT NULL,
???????? ARG2???? CHAR(3)? NOT NULL,
???????? FUNCTION CHAR(10) NOT NULL,
???????? PRIMARY KEY (CLIENT, ARG1, ARG2)
????????????????????????? )
ENDEXEC.
舉例二.
DATA: F1(3), F2(3), F3(3).
F3 = ' 1 '
EXEC SQL.
? SELECT CLIENT, ARG1 INTO :F1, :F2 FROM AVERI_CLNT
???????? WHERE ARG2 = :F3
ENDEXEC

PERFORMING <form name>的使用:
如果NATIVE SQL的SELECT命令執(zhí)行結(jié)果是抓到多筆記錄,我們想要逐筆記錄處理時,就用PERFORMING 參數(shù),這個FORM能被逐次調(diào)用。如果想中止調(diào)用,就用EXIT FORM SQL結(jié)束調(diào)用。
例如:
DATA: F1(3), F2(3), F3(3).

F3 = '010'
EXEC SQL PERFORMING WRITE_AVERI_CLNT.
? SELECT CLIENT, ARG1 INTO :F1, :F2 FROM AVERI_CLNT
???????? WHERE ARG2 = :F3
ENDEXEC.
FORM WRITE_AVERI_CLNT.
? WRITE: / F1, F2.
ENDFORM.

???????????????? DATA: BEGIN? OF? WA,
??????????????????????? NAME(8),
??????????????????????? AGE? TYPE? I,
??????????????????????? END?? OF? WA.
???????????????? DATA? F1? TYPE? I.
???????????????? FI = 20.
???????????????? EXEC? SQL? PERFORMING? OUTPUT.
??????????????????? SELECT? NAME,AGE? INTO? :WA? FROM? NAME_TABLE?
???????????????????????????? WHERE? AGE >= :F1.
???????????????? ENDEXEC..
???????????????? FORM? OUTPUT.
?????????????????? WRITE:? /? WA-NAME,WA-AGE.
???????????????? ENDFORM.

注意:
a. NATIVE SQL把TABLE中的MANDT(client)欄位當作一般欄位使用,所以在抓取資料時必須指定特定的Client;
b. NATIVE SQL中的SELECT語句沒有CHECK權(quán)限的功能;
c. 在登入SAP R/3系統(tǒng)時,我們已經(jīng)自動與Database連接,所以在執(zhí)行NATIVE SQL時并不需要CONNECT語句;
d. 一條NATIVE SQL語句可以以分號;結(jié)束,一般情況下是以句號.結(jié)束.
e. 某些數(shù)據(jù)庫系統(tǒng)對TABLE名字和FIELD名字有大小寫區(qū)別,要正確書寫.
f. 在NATIVE SQL中,雙引號"不表示注釋.
*-------------------------------------------------------------------------------------*

結(jié)果語句

條件述敘
?? 1. IF 述敘
? 語法:
??????? IF? <Condition1>.
????????? <Statement 1 >
??????? ELSEIF? <Condition2>.
????????? <Statement 2>
??????? ELSEIF? <Condition3>.
????????? <Stetement 3>
??????? …..
??????? ELSE.
????????? <else Statement >
??????? ENDIF.
??????? (1).在每個判斷關(guān)鍵字之后要加上 .
??????? (2).在巢狀循環(huán)之中無法使用 ELSE 關(guān)鍵字, ELSE 關(guān)鍵字屬 IF 關(guān)鍵字
??????? Example:
???????????????? IF? 3 > 8.
?????????????????? WRITE / '3 is less than 8'.
??????????????? ENDIF.
?????????????????

2. CASE 關(guān)鍵字
? 語法:
?????? CASE? <變量f>.
???????? WHEN <Value1>.
??????????? <Statement1>
???????? WHEN <Value2>.
??????????? <Statement2>
???????? ….
???????? WHEN OTHERS.
??????????? <others Statement>
?????? ENDCASE.
?????? Example:
???????????????? S = 'A'.?
???????????????? CASE? S.
??????????????????? WHEN? 'X'.
?????????????????????? WRITE / 'String is X'.
??????????????????? WHEN OTHERS.
?????????????????????? WRITE / 'String is not X'.
???????????????? ENDCASE.

循環(huán)關(guān)鍵字
1.計次循環(huán)
? 語法:
?????? DO? [n TIMES]? [VARYING? <f>? FROM? <start>? TO? <end>.
????????? <loop block>
?????? ENDDO.
?????? Example:
??????????????? DO? 2? TIMES.
??????????????????? WRITE /? 'X'.
??????????????? ENDDO.
??????????????? 執(zhí)行結(jié)果:
?????????????????????????? X
?????????????????????????? X
??????????????? DO? VARYING? I? FROM 1? TO? 10.
?????????????????? S = S + I.
??????????????? ENDDO.
??????????????? WRITE: / ,'1+2+3+…+10=',S
??????????????? 執(zhí)行結(jié)果:? 1+2+3+…+10=55
? 2.條件循環(huán)
語法:
???? WHILE? <Condition>.
??????? <Statement Block>
???? ENDWHILE
???? Example:
????????????? I = 1.
????????????? S=0.
???????????? WHILE? I <= 10.
??????????????? S = S+I.
??????????????? I=I+1.
???????????? ENDWHILE.
???????????? WRITE: / ' 1+2+3+…+10=',S.
???????????? 執(zhí)行結(jié)果為: 1+2+3+…+10=55

循環(huán)控制關(guān)鍵字
1. CONTINUE
跳至循環(huán)的下一次
Example:
??????? DO? 3? TIMES.
?????????? IF? SY-INDEX = 2.
???????????? CONTINUE.
?????????? WRITE / SY-INDEX.
??????? ENDDO.
??????? 執(zhí)行結(jié)果:?
????????????????? 1
????????????????? 3
2. CHECK <Condition>
CHECK 之后條件成立才繼續(xù)往下執(zhí)行循環(huán)
? Example:
?????????? DO? 5? TIMES.
????????????? CHECK? SY-INDEX? BETWEEN? 2? AND? 4.
????????????? WRITE? /? SY-INDEX.
?????????? ENDDO.
?????????? 執(zhí)行結(jié)果:
???????????????????? 2
???????????????????? 3
???????????????????? 4
3. EXIT
跳離循環(huán)關(guān)鍵字
Example:
???????? DO? 10? TIMES.
??????????? IF? SY-INDEX = 4.
????????????? EXIT.
??????????? ENDIF
??????????? WRITE / SY-INDEX.
???????? ENDDO.
???????? 執(zhí)行結(jié)果:
?????????????????? 1
?????????????????? 2
?????????????????? 3

無窮循環(huán)
?? DO .
???? <Statement Block>
?? ENDDO.
?? 無窮循環(huán)必須配合 EXIT 關(guān)鍵字來執(zhí)行
*-------------------------------------------------------------------------------------*

搜索字符串

要搜索特定模式的字符串,請使用 SEARCH 語句,用法如下:
語法
SEARCH <c> FOR <str> <options>.
該語句在字段 <c> 中搜索<str> 中的字符串。如果成功,則將 SY-SUBRC 的返回代碼值設(shè)置為0并將 SY-FDPOS 設(shè)置為字段 <c> 中該字符串的偏移量。否則將 SY-SUBRC 設(shè)置為4。
搜索串 <str> 可為下列格 之一:
<str> 目 的
<pattern> 搜索 <pattern>( 任何字符順序)。忽略尾部空格。
.<pattern>. 搜索 <pattern> ,但是不忽略尾部空格 。
*<pattern> 搜索以 <pattern> 結(jié)尾的詞。
<pattern>* 搜索以 <pattern> 開始的詞。
單詞之間用空格、逗號、句號、分號、冒號、問號、嘆號、括號、斜杠、加號和等號等分隔 。

DATA STRING(30) VALUE 'This is a little sentence.'.
WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.
ULINE /1(26).
SEARCH STRING FOR 'X'.
WRITE: / 'X', SY-SUBRC UNDER 'SY-SUBRC',
?????????????? SY-FDPOS UNDER 'SY-FDPOS'?
SEARCH STRING FOR 'itt?? '.
WRITE: / 'itt?? ', SY-SUBRC UNDER 'SY-SUBRC',
?????????????????? SY-FDPOS UNDER 'SY-FDPOS'?
SEARCH STRING FOR '.e .'.
WRITE: / '.e .', SY-SUBRC UNDER 'SY-SUBRC',
????????????????? SY-FDPOS UNDER 'SY-FDPOS'.
SEARCH STRING FOR '*e'.
WRITE: / '*e ', SY-SUBRC UNDER 'SY-SUBRC',
??????????????? SY-FDPOS UNDER 'SY-FDPOS'.
SEARCH STRING FOR 's*'.
WRITE: / 's* ', SY-SUBRC UNDER 'SY-SUBRC',
??????????????? SY-FDPOS UNDER 'SY-FDPOS'.
該過程的輸 出如下:
SEARCHED SY-SUBRC SY-FDPOS
X??????????? 4??????? 0
itt????????? 0?????? 11
.e .???????? 0?????? 15
*e?????????? 0?????? 10
s*?????????? 0?????? 17

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

DATA: STRING(30) VALUE 'This is a fast first example.',
????? POS TYPE I,
????? OFF TYPE I.
WRITE / STRING.
SEARCH STRING FOR 'ft' ABBREVIATED.
WRITE: / 'SY-FDPOS:', SY-FDPOS.
POS = SY-FDPOS + 2.
SEARCH STRING FOR 'ft' ABBREVIATED STARTING AT POS AND MARK.
WRITE / STRING.
WRITE: / 'SY-FDPOS:', SY-FDPOS.
OFF = POS + SY-FDPOS -1.
WRITE: / 'Off:', OFF.
該過程的輸 出如下:
This is a fast first example.
SY-FDPOS:??? 10
This is a fast FIRST example.
SY-FDPOS:??? 4
Off:??????? 15
請注意,在找到單詞' fast' 之后,為了查找包含' ft'的第二個單詞,必須在偏移量 SY-FDPOS 上加2,然后從位置 POS 開始查找。否則,會再次找到單詞 'fast'。要獲得' first' 相對于字段 STRING 開始的偏移量,從 POS 和 SY-FDPOS 計算。
獲得字符串長度

要決定字符串到最后一個字符而不是 SPACE 的長度,請使用內(nèi)部函數(shù) STRLEN,用法如下:
語法
[COMPUTE] <n> = STRLEN( <c> ).
STRLEN 將操作數(shù) <c> 作為字符數(shù)據(jù)類型處理,而不考慮其實際類型。不進行轉(zhuǎn)換。
關(guān)鍵字 COMPUTE 可選。有關(guān)內(nèi)部函數(shù)的詳細信息,參見使用數(shù)學函數(shù)(頁 49) 。

DATA: INT TYPE I,
????? WORD1(20) VALUE '12345'.?
????? WORD2(20).
????? WORD3(20) VALUE '?? 4???????? '.?
INT = STRLEN( WORD1 ). WRITE?? INT.
INT = STRLEN( WORD2 ). WRITE / INT.
INT = STRLEN( WORD3 ). WRITE / INT.
結(jié)果分別是 5,0 和 4。
*-------------------------------------------------------------------------------------*

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

*? PROGRAM SOURCE HEADER? : 說明程序名稱及目的
* Program Name:?
* Description:
* Date/Author:?
* Table Update:
* Special Logic:
* Include:
*-------------------------------------------------------------------------------------*
*? MODIFICATION LOG : 程序修改更新記錄?
*-------------------------------------------------------------------------------------*
* ChangeDate Programmer??? Request????? Description
*-------------------------------------------------------------------------------------*
*?????????????????????????????????????? NEW PROGRAM
*-------------------------------------------------------------------------------------*
* REPORT NAME : 聲明程序名稱及報表格式,?
*-------------------------------------------------------------------------------------*
REPORT Z_____
?????? NO STANDARD PAGE HEADING
????????? MESSAGE-ID __??? " 所使用的MESSAGE
????????? LINE-COUNT ___?? " 每頁報表列數(shù)
????????? LINE-SIZE? ___.? " 每頁報表寬度

*? TABLE DESCRIPTION : 聲明程序會使用的TABLE

*-------------------------------------------------------------------------------------*
TABLES:?
????????????????
* DATA : 聲明程序所使用的變量及自定型態(tài)
*-------------------------------------------------------------------------------------*
TYPES:

DATA:?
?????

*? SELECTION SCREEN / OPTION / PARAMETER : 屏幕輸入報表篩選條件
*-------------------------------------------------------------------------------------*

? SELECTION-SCREEN BEGIN OF BLOCK ____
?????? SELECT-OPTIONS:

? SELECTION-SCREEN END OF BLOCK ___

* INITIALIZATION : 啟動程序開始執(zhí)行, 如SELECT-OPTION及PARAMETER
*-------------------------------------------------------------------------------------*
INITIALIZATION.

INCLUDE ____.

* AT START SELECTION : 輸入結(jié)束后啟動的區(qū)塊, 如按下<F8>
*-------------------------------------------------------------------------------------*
START-OF-SELECTION.
? SET PF-STATUS ____.? " 指定報表執(zhí)行時所用的 GUI-STATUS名稱

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

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

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


* TOP OF PGAE : 每頁開始列印時執(zhí)行, 用于定義報表表頭
*-------------------------------------------------------------------------------------*

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

* END OF SELECTION : 在結(jié)束列印資料后啟動, 如可用來印出USER輸入的條件
*-------------------------------------------------------------------------------------*
END-OF-SELECTION.
INCLUDE? _____
* FORM : 撰寫程序中所使用到的副程序
*-------------------------------------------------------------------------------------*
* Read Data : 自TABLE讀取資料放入Internal Table
*-------------------------------------------------------------------------------------*
FORM READ_DATA.
? SELECT * FROM ______
?????????? INTO _______
?????????? WHERE _______.
???? IF SY-SUBRC = 0.

???? ENDIF.
???? APPEND _____.? " 增加Internal Table元素
? ENDSELECT.

ENDFORM.

* Process Data : 處理Internal Table的資料, 如排序及匯總
*-------------------------------------------------------------------------------------*
FORM PROCESS_DATA.

ENDFORM.

* Print Data : 依序輸出 Internal Table的資料
*-------------------------------------------------------------------------------------*
FORM PRINT_DATA.

ENDFORM.

* Print Summary : 印出數(shù)值資料加總
*-------------------------------------------------------------------------------------*
FORM PRINT_SUMMARY.

ENDFORM.

* Include Program : 列出所含入的其它程序source code, 如副程序
*-------------------------------------------------------------------------------------*
INCLUDE _____
INCLUDE _____

*-------------------------------------------------------------------------------------*
*
REPORT rep.?
Additions:?
1. ... NO STANDARD PAGE HEADING?
2. ... LINE-SIZE col?
3. ... LINE-COUNT n(m)
??????????? 表單輸出每頁由n行,其中的m行作為頁腳;?
4. ... MESSAGE-ID mid???????? 消息對象
5.? ... DEFINING DATABASE ldb?
?????? 使用邏輯數(shù)據(jù)庫,自動產(chǎn)生
*
事件塊
INITIALIZATION
AT SELECTION-SCREEN
START-OF-SELECTION
GET
END-OF-SELECTION
TOP-OF-PAGE
END-OF-PAGE
*
事件塊的簡單處理過程:
*
ABAP程序運行的時候,INITIALIZATION首先被調(diào)用;
經(jīng)過初始化的輸入屏幕會顯示在表示服務(wù)器;
用戶離開輸入屏幕的時候,START-OF-SELCTION事件會被自動調(diào)用;
結(jié)果數(shù)據(jù)會以列表的形式顯示在第二個屏幕上;
*
源代碼中的事件塊順序不影響它們的執(zhí)行順序
*
事件塊編碼規(guī)則(1)
INITIALIZATION
??? 通常在此事件塊中設(shè)定輸入屏幕字段的初始值
*
事件塊編碼規(guī)則(2)
AT SELECTION-SCREEN
??? 通常在此事件塊中進行用戶輸入數(shù)據(jù)的合法性檢查,發(fā)現(xiàn)錯誤則以消息的形式給出警示,直到用戶輸入正確的數(shù)值
例如: AT SELECTION-SCREEN .
??????????????????? IF P_DATE = SPACE .
??????????????????????? MESSAGE E001 .
??????????????????? ENDIF.
??? 效果:如果字段P_DATE為空,則程序會用消息001“日期字段不能為空!”來提示用戶必須輸入一個日期。而且輸入屏幕會等待用戶輸入,知道該字段數(shù)值合法
*
事件塊編碼規(guī)則(3)
START-OF-SELCTION
??? 通常在此事件中針對業(yè)務(wù)需求進行系統(tǒng)數(shù)據(jù)的查詢
例如:
???? start-of-selection .
????????? perform get_data_for_oil .
效果:
???? 在輸入屏幕用戶按下執(zhí)行按鈕后,子程序get_data_for_oil被執(zhí)行,在其中獲得業(yè)務(wù)相關(guān)的數(shù)據(jù)存放到內(nèi)表或者其它變量,這些數(shù)據(jù)在END-OF-SELECTION事件塊中被輸出
*
事件塊編碼規(guī)則(4)
END-OF-SELCTION
??? 通常在此事件中進行結(jié)果清單的輸出
例如:
??? end-of-selection .
???????? write : 23(1) sy-vline,
?????????? 24(20) tab-gas_plan right-justified ,
效果:
??? 數(shù)據(jù)以清單的形式輸出
*
事件塊編碼規(guī)則(5)
GET
??? 從邏輯數(shù)據(jù)庫中得到數(shù)據(jù)(較少用)

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

*
比較所有的字段類型

要比較所有的字段類型,可以在邏輯表達式中使用下列運算符:

<運算符> 含義
EQ?等于
=?等于
NE?不等于
<>?不等于
><?不等于
LT?小于

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?------------------轉(zhuǎn)自360文檔

轉(zhuǎn)載于:https://www.cnblogs.com/caizjian/archive/2013/04/15/3022261.html

總結(jié)

以上是生活随笔為你收集整理的ABAP语法完整版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。