分享 SAP R/3 ABAP 開發過程中一些總結

1、ST05是用於在開發ABAP程序時,對應事務碼取得的字段是“數據結構”而不是“透明表”的時候,通過ST05的“SQL跟蹤”來獲得相關“Select”的語句;一般查看“REC”列耗時比較多的“Select”語句;
2、跟蹤時如果有涉及到“數量”這類有對數據表進行更新或插入操作的,則直接去查Update和Insert的SQL語句;
3、在跟蹤後,直接雙擊“對象名”列的名稱,點選“表格
”轉到“SE11”的表字段表;
4、ABAP程序開頭的Tables:“數據表名”,只有在屏幕中有用到的表,才需要聲明;在程序中用到的表則不需要進行在Tables內聲名;
5、抓SAP“文本”字段的數據,要先自定義變量,然後通過SE37的函數“FUNCTION ’ZREAD_TEXT’”取回文本數據;
6、新建的ABAP程序,在測試運行的時候要先進行“激活”,才能測試運行;
7、SE93:把ABAP寫好的程序指定一個事務碼執行;
8、abap引號內的字符’’必須要是大寫;
9、ABAP select 裏面的語句,不能像mssql有那麼豐富的函數使用,需要導到內表後再對數據進行操作;
10、’EQ’是單個數據值,’BT’是between區間的意思。
11、在寫select inner join 裏面,要注意是否需要加上銷售組織的條件;on 條件1 and 銷售組織條件。
12、SELECTION-SCREEN,裏面有兩個子項,PARAMETERS和select-options。
PARAMETERS 一般是用於必輸項的屏幕參數設置,如果這個參數不是必輸項的,就要用select-options。在select ...where條件裏,用PARAMETERS的條件語法是“數據字段 = 屏幕字段”;而select-options的條件語法是“數據字段 in 屏幕字段”。
13、在where判斷一個日期型數據是空,不是DEAKT = ’’,也不是DEAKT is initial,而應該寫成DEAKT = ’00000000’ (8個0)。
14、一對多的inner join,如果取出的數據有重複,前面加上distinct,用法和MSSQL相同。

15、sy-subrc,指上一個語句執行是否成功;執行成功返回0,執行不成功返回非0。用if判斷。

16、如果一個語句中,該名稱同時可能代表內表或者同名表工作區,則需要在內表名稱之後加“[]”指明當前操作的是內表對象。不提倡使用帶有表頭行的內表,而是應該總是聲明結構相同的其他數據對象作爲顯示工作區進行內錶行操作。  

如何調整ABAP程序的性能(copy)
1、使用where語句 
不推薦
Select * from zflight.
Check : zflight-airln = ‘LF’ and zflight-fligh = ‘BW222’.
Endselect.
推薦
Select * from zflight where airln = ‘LF’ and fligh = ‘222’.
Endselect.
2、使用聚合函數
不推薦
Maxnu = 0.
Select * from zflight where airln = ‘LF’ and cntry = ‘IN’.
Check zflight-fligh > maxnu.
Maxnu = zflight-fligh.
Endselect.
推薦
Select max( fligh ) from zflight into maxnu where airln = ‘LF’ and cntry = ‘IN’.

3、使用視圖代替基本表查詢
不推薦
Select * from zcntry where cntry like ‘IN%’. [Page]
Select single * from zflight where cntry = zcntry-cntry and airln = ‘LF’.
Endselect.
推薦
Select * from zcnfl where cntry like ‘IN%’ and airln = ‘LF’.
Endselect.

4、使用INTO table 代替select endselect
不推薦
Refresh: int_fligh.
Select * from zflight into int_fligh.
Append int_fligh. Clear int_fligh.
Endselect.
推薦
Refresh: int_fligh.
Select * from zflight into table int_fligh.

5、使用批量修改內表代替逐行修改
不推薦
Loop at int_fligh.
If int_fligh-flag is initial.
Int_fligh-flag = ‘X’.
Endif.
Modify int_fligh.
Endloop.
推薦
Int_fligh-flag = ‘X’.
Modify int_fligh transporting flag where flag is initial.

6、使用二分法查詢,提高查詢內表數據速度
不推薦
Read table int_fligh with key airln = ‘LF’.
推薦
Read table int_fligh with key airln = ‘LF’ binary search.

7、兩個內表添加使用批量增加代替逐行
不推薦
Loop at int_fligh1.
Append int_fligh1 to int_fligh2.
Endloop.
推薦
Append lines of int_fligh1 to int_fligh2.

8、使用table buffering
Use of buffered tables is recommended to improve the performance considerably. The buffer is bypassed while using the following statementsSelect distinct 
Select … for update 
Order by, group by, having clause 
Joins 
Use the Bypass buffer addition to the select clause in order to explicitly bypass the buffer while selecting the data.

9、 使用FOR ALL Entries
不推薦
Loop at int_cntry. Select single * from zfligh into int_fligh where cntry = int_cntry-cntry. Append int_fligh. Endloop.
推薦
Select * from zfligh appending table int_fligh
For all entries in int_cntry 
Where cntry = int_cntry-cntry.

10、正確地使用where語句,使查詢能使用索引When a base table has multiple indices, the where clause should be in the order of the index, either a primary or a secondary index
To choose an index, the optimizer checks the field names specified in the where clause and then uses an index that has the same order of the fields. One more tip is that if a table begins with MANDT, while an index does not, there is a high possibility that the optimizer might not use that index.

11、正確地使用MOVE語句

Instead of using the move-corresponding clause it is advisable to use the move statement instead. Attempt should be made to move entire internal table headers in a single shot, rather than moving the fields one by one.

12、正確地使用inner joinLet us take an example of 2 tables, zairln and zflight. The table zairln has the field airln, which is the airline code and the field lnnam, which is the name of the airline. The table zflight has the field airln, the airline code and other fields which hold the details of the flights that an airline operates. [Page]
Since these 2 tables a re logically joined by the airln field, it is advisable to use the inner join.
Select a~airln a~lnnam b~fligh b~cntry into table int_airdet
From zairln as a inner join zflight as b on a~airln = b~airln.
In order to restrict the data as per the selection criteria, a where clause can be added to the above inner join.

13、使用sort by 代替order by

14、避免使用SELECT DISTINCT語句
使用的 ABAP SORT + DELETE ADJACENT DUPLICATES 代替.

定義內表與工作區最方便的方法

*定義 名爲 ITAB 的內表, 內表結構 參照表 TABLE 。

DATA: ITAB TYPE TABLE OF TABLE. 

*定義 名爲 WA 的工作區, 其 行結構與 內表 ITAB 相同 。

DATA: WA LIKE LINE OF ITAB. 

----------------------------------------------------------------

1.使用occurs 0,定義的不再是對象,而是internal table 
2.使用with header line後綴,定義爲internal table的同時也定義了一個同名對象,因此可以用以下語句: 
LOOP AT STH. 
WRITE: / STH. 
ENDLOOP. 
3.TYPE後面接結構,LIKE後面接對象 
4.OBLIGATORY爲必輸字段 
5.DATA SEPARATER . = DATA SEPARATER TYPE C.
6.關於內表的結構描述,它的當前記錄數據是放在header line中的,Occurs 是分配數據緩衝區,大小不重要,系統會自動分配。但定義內表不用occurs就需要用with header line,occurs語句記得是爲了向下兼容。
7.occurs 指明的數量是有一點學問的. 
1.當你知道可能每次用Select命中或交換的紀錄數xxx時,可指明 occurs xxx. 
2.如用occurs 0 聲明時, buffers 由系統自動分配. 
8.SELECT 在into時記得一般都要加上table,不然是into一個工作區,即wa,而工作區要寫入內表,則需要再append,所以直接定放內表即可,內表和工作區的區別就在於工作區就相當於表頭,是有一行,data定義begin of itab時不加occurs就是工作區,加了就是內表,occurs *,後面表示系統初始分配給此內表多少行,每次滿時再多分配多少行,我們平常爲了節約內存,一般直接用0,with header line是爲了定義含表頭的內表,平常occurs就直接帶表頭,而with header line一般是在itab1 like itab occurs 0 with header line時用,這是參照一個內表定義另一內表,如果要帶表頭,一定要加with header line。 
你這樣問不是辦法,最好不懂時直接接F1,查到SAP的幫助即可. check是檢查後面的邏緝是否滿足,不滿足則在上例是跳出form,不的執行下面的語句。 

說實在,初略的看了一下上面的程序,寫得太爛了,竟然將usr01或usr03透明表中的字段按條件取到一個表工作區,竟然不加single,象這種不加single的select按理說應該是調不過的,必須在後面再對應一個endselect,而這種select加endselect用每次去讀一次透明表,訪問數據庫的次數太多了,換個好一點程序自己研究吧。

 

SAP ABAP PA certification 培訓筆記

P (4)  長度4個字節

Xstring (10)  長度爲10個字節,可以容納20個數字

大結構體與小結構體的兼容

Move 大 to 小  大的覆蓋小的  大結構體的剩餘部分保持不變

Move 小 to 大  匹配的部分 被小的覆蓋, 其餘的字段被初始化

P 類型 與 F類型的優缺點

P:計算精確,適合商業結算,但範圍短

F:儲存範圍大,計算不精確

P 與 F 類型的運算方式

F IEEE 用二進制數進行運算

P 採用半字節儲存一個數字的方式進行運算

字段 結構體 兼容問題

1.  字段兼容:類型和長度相同

2.  結構體:字段按順序兼容,並且字段數相同

3.  內表兼容:行類型相同, KEY 兼容,表類型相同

如果字符串 move 到一個比字符串小的結構體 ,

[][][][] ---à [][]

[][]

一個字段 move 到一個 內表中

Internal table 內表.

1.  靜態數據對象包括: 簡單數據類型(除了string 和xstring 類型), 結構體(不包含string 和xstring 類型)

2.  動態數據對象:string , xstring , 包含string 或 xstring 的結構體, 內表

一個結構體是否可以包含STRING 或xstring,  如果可以 結構體可以拓展嗎?

定義一個 只有一個字段的 內表 字段長度是c(18),

定義一個結構體 結構體裏 包含三個字段, 類型 隨意,  第二個類型,是另一個結構體

定義一個內表 內表的行類型 是第一個結構體.

再用第二個結構體定義一個內表 ,利用這個內表 作爲行類型,做一個內表

內表的三個基本屬性

1.  line type 行類型

2.  key definition 鍵類型

3.  table kind 表類型

1)  在standard table 中 使用 table key的查找方式爲 table scan 全表掃描

2)  在 sorted table 中使用table key 在遵循; left-aligned 從左至右匹配, no gaps 沒有間隔,使用”=” 填充字段時, 使用 二分查找法 ,其它情況下 使用 table scan查找

3)  對hash表訪問, 只能通過key訪問單條記錄, 訪問的速度不依賴於表中的數據量,而在其餘兩種表中,查詢的時間與表中數據量成正比

其它情況是否代表,只是順序不符合left-aligned. 哈希表可以通過部分的key 進行訪問嗎?

定義內表

1.  定義一個局部內表類型,通過該類型定義內表變量

2.  直接定義字段 直接定義內表變量(隱藏了一個內表類型)

3.  通過全局內表類型定義內表變量

標準的定義內表語句

Types or DATA name

TYPE table_kind

OF line_type

WITH key_def

[INITIAL SIZE n.]

Table kind and key. 表類型 和 表鍵

注意:在定義standard類型的內表時,如果使用 WITH DEFAULT KEY. 系統會自動將內表中的字符類型字段(c,n,d,t,x,string,xstring)組合成table key.

內表的key

1.  standard標準表: key 不唯一.

2.  sorted排序表: 可以指定KEY是否唯一

3.  Hash 哈希表: KEY必須是唯一

在內表中使用不是結構體類型的行類型

當內表的行類型只有一列的時候,需要使用pseudo-compnent 僞列,

用途:設置一個按鈕工具欄,用只含有一列的內表.

對內表的操作

1.  move對內表的拷貝

2.  clear 將數據清空

3.  free 釋放內存

4.  compare表之間的操作,比較

5.  sort 排序表

6.  array fetch

遞歸比較

1.  先對內表之間的行數進行比較

2.  如果有必有的話,還需要對行的組件進行比較

內表之間的比較

用行數比較, 有必要的話 可以 用內容比較

定義兩個內表  兩個 內表不兼容 一個有3個字段 一個有5個

對兩個內表進行比較.

定義兩個內表, 結構一樣 , 變量不一樣

全做成數字型字段 

第一個  添加 小數字

第二個內表 添加大數字

排序可以指定升序降序.

對內表具體操作

1.  Insert  插入

2.  Read  讀取

3.  Change 修改

4.  Delete 刪除

5.  Insert summated collect. 插入累計

對內表中的數據行進行限制條件操作

對數據的訪問

一、單條數據訪問

1)  通過 table key訪問

2)  通過 line index 訪問(對於line index 類型內表)

3)  通過 condition條件訪問

二、多條數據訪問

1)  通過condition條件訪問

2)  通過 index interval 通過行區間訪問

指定訪問數據的傳輸方式

1.  使用 結構體 work area 進行 copy 對內表數據進行操作

2.  定義 field symblo 指針 指向訪問數據,(可以直接訪問數據)

3.  通過將內表插入內表的操作

重要: 不能通過line index 對hash 表 進行訪問, 在排序表中插入數據.除非插入的位置 正好是排序表中規定的位置,否則會出現 運行期異常(強烈不推薦使用insert往 sorted b表中插入數據)

 

 

Field symbol 指針

作用: 直接對內表進行操作,而不用再重新定義結構體對目標內表數據進行拷貝, 增大了效率.

定義指針語法:

Data: var_a TYPE I VALUE 4.

FIELD-SYMBOLS: <fs> TYPE i.

ASSIGN var_a TO <fs>.

<fs> = 77.

重要: 定義的指針名,必須加”<>”

Insert 插入操作

一、  單條數據的插入操作

1)  標準表: 可以使用 index (推薦) 和 table key 方式插入

2)  排序表: 可以通過 table key方式插入 , 但也可以用index插入(強烈不推薦, 很有可能出現運行錯誤)

3)  Hash表: 只能夠用table key 方式插入

二、  多條記錄的插入

1)  源內表爲 index table : 則可以指定源內表的數據範圍,並插入到目標內表中

2)  目標內表爲index table: 則可以可以指定目標內表被插入數據的具體index 位置.

具體的語句插入語法:

Insert wa INTO TABLE itab.  單條插入不指定位置

Insert wa INTO itab INDEX n.  單條插入指定插入位置

INSERT LINES OF itab1

[from n1 to n2]

INTO TABLE itab2.

INTO itab2 [ INDEX n]

讀取 內表的一條 將數據 讀到結構體中

如果系統獨到行  sy-subrc = 0 . 然後讀取到結構體中,

Sy-tfill 存放總行數

Sy-tleng 行的長度

Transporting

指定特定列 傳輸字段  ,  傳送部分字段

TRANSPORTING NO Fields 不傳值, 作用 ,看內表中 有沒有 這條數據

Camparing

有一個結構體 和內表

C1 C2 C3

Lh 0019 17

Lh 0018 18

通過comparing 後的值, 可以判斷讀取的值是否符合要求.

現在結構體中需要比較的字段賦值,

先判斷 相應字段是否相等

回去做個練習

比較成功 sy-subrc = 0

Zmycompare_2009

用一個結構作爲 查詢條件,

到內表查詢符合條件的數據

With key 可以用 table key 或 普通字段作爲條件

使用field symbol

通過一個內表  定義一個 結構體 作爲 指針

Read table itab [index n / key ] assigning <fs>.

Write: / <fs>-field_1.

直接修改 <fs> 的值 會怎麼樣?

Change 修改內表

Transporting  的 傳輸方向

通過 field symbol

直接修改 內表

重要: 不能直接指針對sorted 和 hash表進行操作

Delete

Delete table itab key

Key:  from wa ()

With table key k1 = f1….

不能用sort 對排序表進行排序

對 sorted 表進行 insert modify , 使用不當 可能會出錯

HASH表不能通過 index 進行操作

Header line

With head line 關鍵字定義  廢棄用法

Occur + 整數, 10 ,

Occur 0 , 默認大小,

Occur 0 with head line  廢棄用法了

重要: 在面向環境中 不能用帶有 head line 的內表

Data: so_carr LIKE RANGE OF carrid.

Loop 內表

Where 條件 從起始點二分查找

標準表 可以部分指定順序

From 1 to 5

對於一個標準表來說, 加上二分查找  是不是 先排序

先把標準表 排序, 然後再二分

必須先手工排序,再進行二分查找


sap abap programming---關於ABAP內表(about abap internal table)

1. 內表的類型及定義:

(1).ANY TABLE:即任意表類型,此種定義方式只能在傳遞參數的時候定義。

例如:FORM XXX USING/CHANGING TYPE ANY TABLE .

(2).ANY TABLE包括了兩種類型:INDEX TABLE和HASHED TABLE 。

《1》.INDEX TABLE:包括了STANDARD TABLE和SORTED TABLE

A. STANDARD TABLE:其實就是一個線性表,通過key訪問內表是線性查找的,也就是說,隨着表中記錄的增加,對錶的

操作的時間開銷也相應的增加。

定義方法:TYPES/DATA: LIKE/TYPE STANDARD TABLE OF .

B. SORTED TABLE:顧名思義,表中的記錄是按照一定的順序排列的。訪問表的主要方式是表中定義的key,如果key不唯

一,則選擇index最小的那個。也可以通過index來訪問排序表,如果你想通過index插入一條記錄,系統會自動檢查你插入的

位置是否正確。所以,如果插入的時間比插入到標準表的時間會長。因此,儘量選擇key來對排序表進行操作。

定義方法:TYPES/DATA: LIKE/TYPE SORTED TABLE OF .

《2》.HASHED TABLE:對哈希表只能用你定義的key進行操作,而不能使用index進行操作。因此,定義哈希表必須定義unique

key 。注意:所有關於使用index操作表的語句都不能用於操作哈希表。例如:sort,loop等。

定義方法:TYPES/DATA: LIKE/TYPE HASHED TABLE OF .

2. 內表的操作:

(1).創建:

A. 定義一個結構,然後type/like這個結構

例如:

TYPES: BEGIN OF ,
...
i> ...,
...
END OF .

DATA TYPE STANDARD TABLE OF
WITH NON-UNIQUE DEFAULT KEY
INITIAL SIZE
WITH HEADER LINE.

B. type/like系統表或者數據庫表或者結構

DATA TYPE STANDARD TABLE OF <系統表名>
INITIAL SIZE
WITH HEADER LINE.

(2).添加數據:

A.APPEND:直接向表中添加數據

1. APPEND [wa TO|INITIAL LINE TO] itab[ASSIGNING |REFERENCE INTO dref].

2. APPEND LINES OF itab1 [FROM idx1] [TO idx2] TO itab2.

3. APPEND [wa TO] itab SORTED BY f [ASSIGNING

B.向表中插入數據:

1. INSERT [wa INTO|INITIAL LINE INTO] itab [INDEX idx] [ASSIGNING |REFERENCE INTO dref].

2. INSERT [wa INTO|INITIAL LINE INTO] TABLE itab [ASSIGNING |REFERENCE INTO dref].

3. INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO itab2 [INDEX idx3].

4. INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO TABLE itab2.

C.相同字段求和向表裏添加:

Basic form

COLLECT [wa INTO] itab.

Extras:

1. ... ASSIGNING
2. ... REFERENCE INTO dref
3. ... SORTED BY f

(3).刪除數據:

1. DELETE itab.
2. DELETE TABLE itab WITH TABLE KEY k1 = v1 ... kn = vn.
3. DELETE TABLE itab [FROM wa].
4. DELETE itab INDEX idx.
5. DELETE itab FROM idx1 TO idx2.
6. DELETE itab WHERE logexp.
7. DELETE ADJACENT DUPLICATES FROM itab.

(4).修改數據:

1. MODIFY itab [FROM wa] [INDEX idx] [ASSIGNING |REFERENCE INTO dref] [TRANSPORTING f1 ... fn].

2. MODIFY TABLE itab [FROM wa] [ASSIGNING |REFERENCE INTO dref] [TRANSPORTING f1 ... fn].

3. MODIFY itab [FROM wa] TRANSPORTING f1 ... fn WHERE cond.
sap --- ABAP 內表(internal table) 標題行(header line) 工作區(work area) 簡介 OCCURS 0
 

剛開始學ABAP的時候,學到iternal table時,感覺一陣混亂.
搞不清楚什麼是work area,什麼是header line,以及occurs是幹什麼用的.
今天終於差不多搞明白了(我還是太弱啊...BS自己一下)
所以還是記錄下來..省得自己以後再忘記...

先是用TYPES關鍵字定義一個行(row)的類型.如下:
TYPES: BEGIN OF line,
  field1 TYPE i,
  field2 TYPE i,
END OF line.
這裏的line,就相當於一個自定義的類型,表示一行(row)的字段(field).
這裏一行有兩個字段field1和field2.

然後是聲明一個work area:
DATA wa TYPE line.
我用C++(還是對cpp最有好感^^)的概念理解就是,
line是一個class,而wa是一個object.

接着是聲明一個每一行的類型是line的internal table:
DATA itab TYPE line OCCURS 0.
我在暫時把OCCURS作爲了區別工作區和內表的標誌.
OCCURS應該有更深層次的意義,但我目前只能領悟至此...
當我們用以上這個方法來聲明一個iternal table時,可以選擇是否有無header line.
上面這句就是沒有header line的.改成如下就有了:
DATA itab TYPE line OCCURS 0 WITH HEADER LINE.
有無header line的區別就是,header line可以當作一個work area來使用(參照我之前的一個日誌).
有一下兩種方式操作itab:
1).
wa-field1 = 1.
wa-field2 = 2.
APPEND wa TO itab.
2).
itab-field1 = 1.
itab-field2 = 2.
APPEND itab.
這裏wa就是上面那個已經定義的work area.
有header line的時候,這兩種都可以.
無header line的時候,只能用第1種.
第2種裏,itab的意義是一個header line,而不是內表.
因爲"DATA itab TYPE line OCCURS 0 WITH HEADER LINE."這樣的聲明,
已經隱式聲明瞭一個與內表同名的header line.
所以OCCURS用來聲明內表可能造成二義性(ambiguous).
於是,OCCURS被認爲是old的東西,採用一下方式聲明一個內表比較好:
DATA itab TYPE STANDARD TABLE OF line.

還有一種聲明內表的方法:
DATA: BEGIN OF itab OCCURS 0,
              field1 TYPE i,
              field2 TYPE i,
           END OF itab.
這樣的itab就自動有了一個同名的header line.
好像不會有 WITHOUT HEADER LINE 或者 NOT WITH HEADER LINE 這樣的用法...
如果沒有OCCURS 0,比如這樣:
DATA: BEGIN OF itab,
              field1 TYPE i,
              field2 TYPE i,
          END OF itab.
那麼這個itab就不是內表咯,只是一個structure,可以作爲itab的work area.

寫到這裏發現,歸根到底就是TYPES和DATA這兩個關鍵字的區別嘛.
還有有無OCCURS的區別.

這樣一想,簡單明瞭~~

OCCURS 是在3.0以前申明內表的關鍵字。意思是內表初始的時候有多少行。現在不提倡使用。看到了認識就行。

 

=======================================================
ABAP Work Area & Header Line -

1. Difference between Work Area and Header Line
    工作區與標題行的不同之處
原文地址:
http://www.sap-img.com/abap/difference-between-work-area-and-header-line.htm
我翻譯下,嘿嘿
在對內表進行一些操作的時候,比如增加或者取回一條記錄.我們必須暫時保存這條記錄.
這條記錄就保存在內表的工作區裏(work area).內表的工作區必須和內表有相同的結構.
內表由主體(body)和一個可選的標題行(head line)組成.
標題行是一個隱式的(implicit)工作區.在內表聲明的時候,可以選擇有無標題行.
e.g.
data: begin of itab occurs 10,
        ab type c,
        cd type i,
      end of itab.
這樣的內表itab,是有標題行的.
data: wa_itab like itab.
這樣的wa_itab是顯式(explicit)聲明的一個itab的工作區.
data: itab1 like itab occurs 10.
這樣的內表itab1,是沒有標題行的.

標題行是一個和內表主體有着一樣結構的字段的串,標題行只有一行.
所以,標題行相當於一個緩衝區(buffer),用於存放被操作的紀錄,是內表的缺省的工作區.

2. Using Header Lines as Work Areas
    把標題行當工作區來使用
原文地址: 
http://help.sap.com/saphelp_nw04/helpdata/en/fc/eb36a1358411d1829f0000e829fbfe/content.htm
我再翻譯下...
當你在創建一個內表的時候,你同時也聲明瞭一個具有相同名稱的標題行(這個好像很奇特的樣子麼...).可以把這個標題行當作工作區來對內表進行操作.
如果一個內表有標題行,則對其進行操作的ABAP語句會簡短一些,因爲這些語句會自動認爲標題行是一個隱式的工作區.語句的不同如下表:

 

Operations without header line

 

Operations with header line

 

Operations for all Table Types

 

INSERT INTO TABLE .

 

INSERT TABLE ITAB.

 

 

COLLECT INTO .

 

 

COLLECT .

 

 

 

READ TABLE ... INTO .

 

 

READ TABLE ...

 

 

 

MODIFY TABLE FROM ...

 

 

MODIFY TABLE ...

 

 

MODIFY FROM ...WHERE ...

 

 

MODIFY ... WHERE ...

 

 

DELETE TABLE FROM .

 

DELETE TABLE .

 

 

LOOP AT ITAB INTO ...

 

LOOP AT ITAB ...

 

Operations for Index Tables

 

APPEND TO .

 

 

APPEND .

 

 

 

INSERT INTO ...

 

 

INSERT ...

 

 

MODIFY FROM ...

 

 

MODIFY ...

 

但是,用隱式的工作區,代碼難以被理解,所以還是用一個不同名稱的工作區比較好.

 

 

 

 

 

 

 


sap abap---通過例子學習ABAP--初始化內表 清空內表
 

初始化內表的作用是清空內表所有的數據行,將內表恢復到填充或賦值之前的狀態。初始化內表過程中需要注意之處仍然是初始化無 表頭行內表和有表頭行內表的區別,以及初始化內表和表頭行的區別。

(1)CLEAR    ITAB.       同時清空表頭和行內表的值

(2)CLEAR    ITAB.       只清空內表本身的值,保留表頭行的值。

(3)REFRESH I   TAB     只清空內表本身的值,保留表頭行的值。

(4)FREE    ITAB.            只清空內表本身的值,保留表頭行的值。

DATA: BEGIN OF line,
         col1(1) TYPE c,
         col2(1) TYPE c,
END OF line.
DATA itab LIKE TABLE OF line WITH HEADER LINE.
line-col1 = 'A'. line-col2 = 'B'.
APPEND line TO itab.
loop at itab.
write : itab-col1.
endloop.
clear itab.  "在這裏可以嘗試CLEAR ITAB[],FREE ITAB,REFRESH ITAB,看看效果是不是如上所說這樣。
IF itab IS INITIAL.
WRITE 'ITAB is empty'.
ENDIF.

 

 

很多程序BUG,就是這一類 不起眼的東西引起的~
*********************************************************************
*-------- Clear & Refresh Internal Table. -------------------------
*********************************************************************
1. with headerline.
CLEAR itab.        : Clear the headerline of the Internal Table only.
CLEAR itab[].        : Clear the contents of the Internal Table except the headerline.
REFRESH itab.        : Same as CLEAR itab[].
REFRESH itab[].       : Same as CLEAR itab[].
2. without headerline. ( all four commands have same functionality )
CLEAR itab.        : Clear all contents of the Internal Table.
CLEAR itab[].        : Same as CLEAR itab.
REFRESH itab.        : Same as CLEAR itab.
REFRESH itab[].        : Same as CLEAR itab.

 

 

如何一次性的給內表的一列賦值,不用LOOP循環來做,比如把第一列都給設置成空.

CLEAR 對應工作區清空
MODIFY 內表 FROM 內表對應工作區 
TRANSPORTING 修改字段
WHERE 修改字段 <> SPACE.

MODIFY itab [FROM wa] TRANSPORTING f1 ... fn WHERE cond
這句話的意思是凡是內表itab中滿足條件cond的記錄都被工作區wa的數據修改,修改的字段是f1...f
4月4日
sap abap programming----CALL TRANSACTION USING bdc_tab for Data Transfer
 

http://help.sap.com/saphelp_sm32/helpdata/en/fa/09715a543b11d1898e0000e8322d00/frameset.htm
DATA: it_bdcdata TYPE TABLE OF bdcdata,
      wa_bdcdata TYPE bdcdata.
wa_bdcdata-program = 'SAPLBTCH'.
wa_bdcdata-dynpro = '2170'.
wa_bdcdata-dynbegin = 'X'.
APPEND wa_bdcdata TO it_bdcdata.
CLEAR wa_bdcdata.
wa_bdcdata-fnam = 'BTCH2170-JOBNAME'.
wa_bdcdata-fval = '*'.
APPEND wa_bdcdata TO it_bdcdata.
wa_bdcdata-fnam = 'BTCH2170-USERNAME'.
wa_bdcdata-fval = sy-uname.
APPEND wa_bdcdata TO it_bdcdata.
CALL TRANSACTION 'SM37' USING it_bdcdata.
--------------------------------------------------------
Submit to executable program via selection options
--------------------------------------------------------
SUBMIT zrmm0001 VIA SELECTION-SCREEN
    AND RETURN
    WITH p_matnr = itab-matnr
    WITH p_werks = itab-werks
    WITH p_lgort = itab-lgort
    WITH s_charg = itab-charg
    WITH p_num = p_label
    WITH p_dest = p_print.

----------------------------------------------------------

Submit to program which not has selection screen

----------------------------------------------------------

SET PARAMETER ID 'RBN' FIELD S_ARSEG-BELNR.
SET PARAMETER ID 'GJR' FIELD S_ARSEG-GJAHR.
CALL TRANSACTION 'MIR4' AND SKIP FIRST SCREEN.
sap abap programming----execute--Call Underlying Database Store Procedure in ABAP
 

 

摘自sapguys.cn羣中Robbin和徐的交流
1. 配置個外部DB, T-code爲: DB59, DB50N, 測試連接
2. 執行Native SQL
eg:
EXEC SQL.
  EXECUTE PROCEDURE EAI_ETL_CONTROL(IN :XX1,IN :XX2,IN :wa_datet_update,IN :XX3,OUT :YY1)
ENDEXEC.
sap ABAP 常用函數(sap abap function)
 

 

RS_VARIANT_VALUES_TECH_DATA

可以返回一個內表, 裏面存的是PARAMETER SELECT-OPTION的名字 以及對應的值. 可用於background job中對vaiant的修改.
函數名 描述
SD_VBAP_READ_WITH_VBELN 根據銷售訂單讀取表vbap中的信息
EDIT_LINES 把READ_TEXT返回的LINES中的行按照TDFORMAT=“*”重新組織
VIEW_MAINTENANCE_CALL 維護表視圖
函數名 描述
DY_GET_FOCUS 獲得屏幕焦點
DY_GET_SET_FIELD_VALUE 獲得或者設置屏幕字段的值
函數名 描述
F4IF_INT_TABLE_VALUE_REQUEST 顯示檢索help
READ_TEXT 讀取長文本
CONVERSION_EXIT_CUNIT_OUTPUT 單位轉換
SJIS_DBC_TO_SBC 全角轉半角
SJIS_SBC_TO_DBC 半角轉換爲全角
CO_R0_CHECK_DECIMAL_POINT 根據單位檢查數據的小數位
POSTAL_CODE_CHECK 檢查郵政編碼
函數名 描述
CONVERSION_EXIT_ALPHA_INPUT 全數字則在前面補0
CONVERSION_EXIT_ALPHA_INPUT 和上面相反
GET_JOB_RUNTIME_INFO 獲得job相關信息
TERMINAL_ID_GET 獲得端末id
DATE_CONVERT_TO_FACTORYDATE 把輸入日期轉爲工廠日曆日期
MESSAGE_TEXT_BUILD 把消息轉爲文本
函數名 描述
POPUP_TO_CONFIRM 彈出確認窗口
函數名 描述
CONVERSION_EXIT_MATN1_INPUT 物料號碼轉換函數
CONVERSION_EXIT_MATN1_OUTPUT 同上相反
CONVERT_TO_LOCAL_CURRENCY 按照指定日期匯率轉換金額爲指定貨幣類型
SSF_FUNCTION_MODULE_NAME 根據form名取得對應的函數名(SmartForm)
函數名 描述
DATE_CHECK_PLAUSIBILITY 日期CHECK
cl_gui_frontend_services=>gui_upload 上傳到服務器
cl_gui_frontend_services=>gui_download 下載到服本地
SSF_FUNCTION_MODULE_NAME SMARTFORMS輸出報表時,生成一個函數名稱,然後CALL這個名稱
函數名 描述
POPUP_TO_DECIDE_LIST 彈出供選擇窗口
ABAP_DOCU_DOWNLOAD – 以HTML格式下載ABAP文檔。
ARFC_GET_TID – 以十六進制形式返回終端的IP地址。
BAL_* -容納了SAP的應用程序日誌所有的函數模塊。
BP_EVENT_RAISE –在 ABAP/4 程序中觸發一個事件。
BP_JOBLOG_READ –獲得job log的執行結果。
CLOI_PUT_SIGN_IN_FRONT – 將負號前置, SAP默認將負號放在數字後面。
CLPB_EXPORT –從內表導入到剪貼板。
CLPB_IMPORT – 從剪貼板導入內表。
COMMIT_TEXT -To load long text into SAP 。
CONVERSION_EXIT_ALPHA_INPUT - 數字串前補0
example:
input = 123
output = 0000000000000。。。000000000000123
CONVERSION_EXIT_ALPHA_OUTPUT – 消除數字串前的0
example:
input = 00000000000123
output = 123
CONVERT_OTF – 將SAP文檔(SAP Script)轉換成其他類型。
example:
CALL FUNCTION 'CONVERT_OTF'
EXPORTING
FORMAT = 'PDF'
IMPORTING
BIN_FILESIZE = FILE_LEN
TABLES
OTF = OTFDATA
LINES = PDFDATA
EXCEPTIONS
ERR_MAX_LINEWIDTH = 1
ERR_FORMAT = 2
ERR_CONV_NOT_POSSIBLE = 3
OTHERS = 4.
DATE_GET_WEEK – 返回一個日期所在的週數。
DATE_CHECK_PLAUSIBILITY – 檢查一個日期是否是SAP的有效格式。
DYNP_VALUES_READ – 讀取SCREEN字段的值,也可以用來讀取報表SELECTION SCREEN。
DYNP_VALUES_UPDATE -更新屏幕字段的值。
ENQUE_SLEEP –在繼續處理之前等待一個指定的時間。
ENQUEUE_ESFUNCTION – 鎖定一個ABAP程序使它不可以被執行:
RELID = 'ZZ'
SRTF2 = 0
SRTF = (your report name)
注意不要用SY-REPID來傳遞你的報表名字,當把SY-REPID作爲參數傳遞給函數模塊的時候,SY-REPID的值實際上已經發生了變化。
EPS_GET_FILE_ATTRIBUTES – 獲得文件屬性。
EPS_GET_DIRECTORY_LISTING – 返回一個本地或網絡目錄的文件列表。
F4_DATE - 彈出一個窗口顯示一個日曆允許用戶選擇一個日期。
F4IF_SHLP_EXIT_EXAMPLE – F4接口模塊。
FILENAME_GET – 彈出一個文件選擇對話框。
DATA out(60) TYPE c.
CALL FUNCTION 'FILENAME_GET'
  EXPORTING
    filename = 'c:\1.txt'
    title    = 'GET FILENAME'
  IMPORTING
    filename = OUT.
FTP_CONNECT    – 打開並登陸FTP服務器的連接。
FTP_COMMAND    – 在FTP服務器上執行一個命令。
FTP_DISCONNECT –關閉指向FTP服務器的連接。
FORMAT_MESSAGE - Takes a message id and number, and puts it into a variable。 Works better than WRITE_MESSAGE, since some messages use $ as a place holder, and WRITE_MESSAGE does not accommodate that, it only replaces the ampersands (&) in the message。
GET_GLOBAL_SYMBOLS – 返回一個程序的tables, select options, texts, etc 。甚至包含selection screen的文本定義。
GET_INCLUDETAB – 獲得一個程序的INCLUDES列表。
GUI_CREATE_DIRECTORY –在顯示服務器端創建一個目錄 。
GUI_DELETE_FILE – 在顯示服務器端刪除一個文件 。
GUI_DOWNLOAD – 從應用服務器下載內表到顯示服務器。
GUI_EXEC – 調用一個文件或程序,取代了WS_EXECUTE。
GUI_GET_DESKTOP_INFO – 獲得客戶端桌面信息,取代了WS_QUERY。
GUI_REMOVE_DIRECTORY – 從顯示服務器刪除一個目錄 。
GUI_RUN – 啓動一個文件或程序 。
GUI_UPLOAD – 從顯示服務器上傳文件到應用服務器,取代了WS_UPLOAD。
HELP_START – 爲一個字段顯示幫助。 Useful for doing AT SELECTION SCREEN ON VALUE REQUEST for those fields that do not provide F4 help at the DDIC level。
HOLIDAY_GET – 基於Factory Calendar&/ Holiday Calendar提供了一個節日表。
INIT_TEXT –上傳長文本到SAP。
K_WERKS_OF_BUKRS_FIND – 返回一個特定公司代碼的所有工廠。
LIST_TO_ASCII –將ABAP報表從 OTF形式轉換成ASCII 形式。
LIST_FROM_MEMORY – Retrieves the output of a report from memory when the report was executed using SUBMIT。。。EXPORTING LIST TO MEMORY。 See also WRITE_LIST。
MONTH_NAMES_GET – 獲得所有的月和名字
**** MS_EXCEL_OLE_STANDARD_OLE – 創建一個文件並自動啓動Excel 。
CONVERT_OTFSPOOLJOB_2_PDF - converts a OTF spool to PDF (i。e。 Sap script document)
CONVERT_ABAPSPOOLJOB_2_PDF -convert ABAP spool output to PDF
POPUP_TO_CONFIRM_LOSS_OF_DATA – 彈出一個對話框告知用戶有可能丟失數據,詢問是否操作繼續。
POPUP_TO_CONFIRM_STEP -彈出一個對話框詢問用戶是否操作繼續。
POPUP_TO_CONFIRM_WITH_MESSAGE  可以顯示定製的提示信息的確認窗口 類似POPUP_TO_CONFIRM_STEP,只是多三行的文本錯誤診斷提示。
POPUP_TO_CONFIRM_WITH_VALUE  用此函數可以建立一個對話框用於詢問用戶是否執行某步操作,該操作可能會丟失數據,用戶可以選擇Yes No                             或者Cancel。該函數可以傳入一個標題,兩行的文本(提示問題)和一個對象值
POPUP_TO_DECIDE              顯示一個對話框,用戶可以兩個操作中的一個或者取消。可以傳入三行提示文本
POPUP_TO_DECIDE_WITH_MESSAGE   類似POPUP_TO_DECIDE
POPUP_TO_DISPLAY_TEXT  顯示多行信息的窗口
POPUP_TO_SELECT_MONTH –彈出一個對話框供選擇月。
POPUP_WITH_TABLE_DISPLAY -Provide a display of a table for user to select one,
with the value of the table line returned when selected。
PRICING – 獲得定價條件
PROFILE_GET - 從INI文件讀取一條記錄
PROFILE_SET – 往INI文件寫一條記錄
READ_TEXT – 上傳長文本
REGISTRY_GET – 從註冊表讀取一條記錄
REGISTRY_SET – 在註冊表裏設置一條記錄
RFC_ABAP_INSTALL_AND_RUN – 當MODE參數值爲‘F’時運行PROGRAM表中的程序'.
RH_GET_ACTIVE_WF_PLVAR – 獲得激活的HR計劃
RH_START_EXCEL_WITH_DATA – 啓動Excel並用內表給文件賦值
RH_STRUC_GET –返回所有相關的組織信息
RP_CALC_DATE_IN_INTERVAL – 年月日加減
RP_LAST_DAY_OF_MONTHS – 獲得一個月的最後一天
RPY_DYNPRO_READ – 讀取屏幕
RPY_TRANSACTION_READ – 給定一個事務代碼,獲得其程序和屏幕;或給定一個程序和屏幕獲得事務代碼
RS_COVERPAGE_SELECTIONS – 獲得一個報表的選擇參數列表。
RS_REFRESH_FROM_SELECTOPTIONS –獲得當前選擇屏幕的內容
RS_SEND_MAIL_FOR_SPOOLLIST – 在程序中給SAP office 發送消息
RS_VARIANT_CONTENTS – 獲得一個變式的內容
RZL_SLEEP – 將當前程序掛起
RZL_SUBMIT – 提交一個遠程報表
RZL_READ_DIR_LOCAL – 讀取應用服務器的目錄
RZL_READ_DIR – 如果服務器名字左部爲空,從本地讀取目錄,否則讀取遠程服務器的目錄
RZL_READ_FILE – 如果爲給定服務器名字則讀取本地文件,否則讀取遠程服務器文件。
RZL_WRITE_FILE_LOCAL - 將內表保存到顯示服務器(not PC). 不使用OPEN DATASET因此避免了授權檢查。
SAPGUI_PROGRESS_INDICATOR – 顯示一個進度條
SAVE_TEXT – 上傳長文本
SCROLLING_IN_TABLE –當編寫模塊池的時候可以用它來處理滾動
SD_DATETIME_DIFFERENCE – 兩日期作差
SO_NEW_DOCUMENT_ATT_SEND_API1 - 將文檔作爲郵件的一部分發送
SO_SPLIT_FILE_AND_PATH – 將一個包含路徑的全文件名分割爲文件名和路徑
SO_SPOOL_READ – 根據SPOOL號獲得printer spool
SO_WIND_SPOOL_LIST – 根據用戶瀏覽printer spool號
SX_OBJECT_CONVERT_OTF_PDF – 從OTF轉換爲PDF (SAP 腳本轉換)
SX_OBJECT_CONVERT_OTF_PRT – 從OTF轉換爲打印機格式(SAP 腳本轉換)
SX_OBJECT_CONVERT_OTF_RAW – 從OTF轉換爲ASCII(SAP 腳本轉換)
SXPG_CALL_SYSTEM - 檢查用戶是否有執行某個命令的權限
SXPG_COMMAND_LIST_GET – 獲得一個包含所有定義的外部OS命令的列表.
SXPG_COMMAND_DEFINITION_GET – 從R/3系統數據庫讀取單個外部OS命令的定義
SXPG_COMMAND_CHECK - 檢查用戶是否有執行某個命令的權限
SXPG_COMMAND_EXECUTE -檢查用戶是否有執行某個命令的權限,擁有授權則執行命令
TERMINAL_ID_GET –返回終端ID
TH_DELETE_USER – 剔除一個用戶,效果同SM04
TH_ENVIRONMENT – 獲得UNIX環境
TH_POPUP –在特定用戶屏幕上顯示一個系統消息
TH_REMOTE_TRANSACTION – 在遠程服務器上運行事務代碼
TH_USER_INFO – 獲得當前用戶的信息 (會話,登陸的工作臺等)
TH_USER_LIST –顯示登陸到應用服務器的用戶列表
UNIT_CONVERSION_SIMPLE –衡量單位轉換
UPLOAD –上傳文件到顯示服務器
UPLOAD_FILES – 上傳一個或多個文件
WRITE_LIST –顯示一個列表對象
WS_DOWNLOAD –將內表下載到顯示服務器
WS_EXCEL –啓動EXCEL
WS_EXECUTE –執行一個程序
WS_FILE_DELETE – 刪除一個文件
WS_FILENAME_GET –調用文件選擇對話框
WS_MSG –顯示一個對話框顯示在線消息
WS_UPLOAD – 從顯示服務器上傳文件到內表
WS_VOLUME_GET –獲得終端設備標籤
WWW_LIST_TO_HTML – 運行一個報表之後,調用這個方法將列表輸出轉換成HTML
SD_VBAP_READ_WITH_VBELN 根據銷售訂單讀取表vbap中的信息
EDIT_LINES 把READ_TEXT返回的LINES中的行按照TDFORMAT=“*”重新組織
VIEW_MAINTENANCE_CALL 維護表視圖
DY_GET_FOCUS 獲得屏幕焦點
DY_GET_SET_FIELD_VALUE 獲得或者設置屏幕字段的值
F4IF_INT_TABLE_VALUE_REQUEST 顯示檢索help
CONVERSION_EXIT_CUNIT_OUTPUT 單位轉換
SJIS_DBC_TO_SBC 全角轉半角
SJIS_SBC_TO_DBC 半角轉換爲全角
CO_R0_CHECK_DECIMAL_POINT 根據單位檢查數據的小數位
POSTAL_CODE_CHECK 檢查郵政編碼 GET_JOB_RUNTIME_INFO 獲得job相關信息
TERMINAL_ID_GET 獲得終端
idDATE_CONVERT_TO_FACTORYDATE 把輸入日期轉爲工廠日曆日期
MESSAGE_TEXT_BUILD 把消息轉爲文本
CONVERT_TO_LOCAL_CURRENCY 按照指定日期匯率轉換金額爲指定貨幣類型
SSF_FUNCTION_MODULE_NAME 根據form名取得對應的函數名(SmartForm)
DATE_CHECK_PLAUSIBILITY 檢查日期合法性
CHECKcl_gui_frontend_services=>gui_upload 上傳到服務器
cl_gui_frontend_services=>gui_download 下載到本地
SSF_FUNCTION_MODULE_NAME SMARTFORMS輸出報表時,生成一個函數名稱,然後CALL這個名  
通過這個日期得出那天是星期幾
DAY_IN_WEEK
用來得到將來/過去的日期的
RP_CALC_DATE_IN_INTERVAL
日期的加減
BKK_ADD_MONTH_TO_DATE
一組有用的用戶交互窗口函數
POPUP_TO_CONFIRM_LOSS_OF_DATA 顯示有YES/NO的彈出窗口,提示用戶未保存的數據將丟失
POPUP_TO_CONFIRM_STEP 提示是否確認操作的彈出窗口
POPUP_TO_CONFIRM_WITH_MESSAGE 可以顯示定製的提示信息的確認窗口
POPUP_TO_CONFIRM_WITH_VALUE 顯示確認用戶對某個特定對象的操作的彈出窗口
POPUP_TO_DECIDE 將待確認選項以單選按鈕的方式顯示的彈出窗口
POPUP_TO_DECIDE_WITH_MESSAGE 帶消息的確認窗口
POPUP_TO_DISPLAY_TEXT 顯示多行信息的窗口
POPUP_TO_SELECT_MONTH 月份選擇窗口
POPUP_WITH_TABLE_DISPLAY 有表格對象的確認窗口
一組操縱客戶端文件系統的函數
GUI_CREATE_DIRECTORY 在PC上建立文件目錄
GUI_DELETE_FILE 刪除PC上的文件
GUI_DOWNLOAD 文件下載函數
GUI_EXEC 執行PC上的程序,或者打開文件
GUI_GET_DESKTOP_INFO 得到PC客戶端的系統信息,比如操作系統等
GUI_REMOVE_DIRECTORY 刪除PC目錄
GUI_RUN 運行PC程序(ShellExecute)
GUI_UPLOAD 從PC上傳程序
判斷某天是否是假日
HOLIDAY_CHECK_AND_GET_INFO
ABAP_DOCU_DOWNLOAD
Download ABAP documentation in HTML format.
GET_CURRENT_YEAR
得到當前的財政年(fiscal year)
察看某日期的屬性,包括該日期是星期幾,第幾天(周2=2),是不是公共假期等,需要輸入國家日曆。
DAY_ATTRIBUTES_GET
Return useful information about a day. Will tell you the day of the week as a word (Tuesday), the day of the week (2 would be Tuedsay), whether the day is a holiday, and more.(provided by Francois Henrotte)?
CLPB_IMPORT :從剪貼板導入internal table
CLPB_EXPORT : 從internal table輸入到剪貼板
示例程序:GRCLPB_1


sap abap programming---關於ABAP程序執行效率和優化(z)

程序的效率是每個程序員都應該重視的,無論是採用的哪一種語言進行開發.
在我做過的一個項目中,一個幾萬條數據的運行,在沒有考慮效率,對代碼沒有進行優化前的運行時間是7個小時,當對代碼進行一系列的優化修改後,運行的時間就只剩一個小時,由此可見,代碼的優化是多麼的重要。
那麼,我們在寫ABAP程序時,怎樣的語句才能提高到效率呢,下面是我總結到的幾點:
1、抽取數據時,避免使用SELECT *, 儘量使用SELECT A B INTO TABLE ITAB這樣的語句。
2、不要使用SELECT...ENDSELECT語句。
3、儘量避免在LOOP中訪問數據庫。可以在之前先把數據取到內表,在LOOP中用READ TABLE WITH KEY ... BINARY SEARCH.進行讀取對應的數據。
4、用SORT代替ORDER BY。
5、避免使用嵌套的循環。
6、儘量不要使用JOIN進行多表連接。把一個表的數據先取到內表,然後使用FOR ALL ENTRIES語句再進行抽取。
7、使用二分查找法。
   READ TABLE的之前使用SORT TABLE BY對內表進行排序, 然後使用READ TABLE WITH KEY ...BINARY SEARCH.
8、避免使用SELECT DISTINCT語句。在抽取數據到內表後用DELETE ADJACENT DUPLICATES語句來消除重複行。
9、儘量加多WHERE語句進行條件抽取。
以上,說的還不全,會進行不斷更新。
另外,可以通過TCODE:ST05 SE30 進行程序和SQL語句性能和效率的分析
sap 在ABAP 中 MOVE ... TO 和 WRITE ... TO 的區別
 

WRITE  ... TO 把源的格式 附值到目標。

MOVE ... TO 直接把源的值附到目標。

示例:

data: gv_char1(20) type c,
     gv_char2(20) type c,
     dec1(10) type p decimals 2 value '22345.89'.

start-of-selection.
* date *
  write:/ 'date variable'.
  write sy-datum to gv_char1.
  write:/ 'write to', gv_char1.
  move sy-datum to gv_char2.
  write:/ 'move to', gv_char2.
  skip 1.
* decimal *
  write:/ 'decimal variable'.
  write dec1 to gv_char1.
  write:/ 'write to', gv_char1.
  move dec1 to gv_char2.
  write:/'move to', gv_char2.

 

Start of Content Area
Assigning Values with MOVE

To assign the value of a data object source to a variable destination, use the following statement:

MOVE source TO destination.

or the equivalent statement

destination = source.

The content of source remains unchanged, source does not therefore have to be a variable - it can also be a literal, a text symbol, or a constant. You must always specify decimal points with a period (.), regardless of the user’s personal settings.

Multiple assignments

f4 = f3 = f2 = f1.

are also possible. ABAP processes them from right to left as follows:

MOVE f1 TO f2.
MOVE f2 TO f3.
MOVE f3 TO f4.

In the MOVE statement (or when you assign one value to another with the equal sign), it is not possible to specify the field names dynamically as the contents of other fields. If you need to do this, you must use field symbols .

The source and target fields can be of different data types. The result of the value assignment depends on whether these data types are compatible and whether a type conversion can be performed. If there is no conversion rule between the data types in question, no assignment can be made.

Example

DATA: t(10) TYPE c,
      number TYPE p DECIMALS 2,
      count  TYPE i.

t = 1111.
MOVE '5.75' TO number.
count = number.

Following these assignments, the fields t, number and count have the values ‘1111      ’, 5.75, and 6 respectively. When you assign the number literal 1111 to T, it is converted into a character field with length 10. When you assign number to count , the decimal number is rounded to an integer (as long as the program attribute Fixed pt. arithmetic has been set).
Assigning Values Between Components of Structures

The rules for value assignments between data objects also apply to structures. With the command

DATA: struct1 TYPE structure,
struct2 TYPE structure.
struct1 = struct2.

two structures of the same type can be assigned to one another without difficulty. Here, the entire source structure is seen as a unit and copied to the source structure. It is then possible to access the components individually again. If the structures in question are not compatible, see the conversion rules for structures.

In practice, however, you will often only need to assign certain components of a structure to be certain components of another structure. ABAP has a special statement for this purpose:

MOVE-CORRESPONDING sourcestruct TO destinationstruct.

This statement assigns the contents of the components of structure sourcestruct to the components of the destinationstruct structure that have identical names.

When it is executed, it is broken down into a set of MOVEstatements, one for each pair of fields with identical names, as follows:

MOVE sourcestruct-comp1 TO destinationstruct-comp1.

MOVE sourcestruct-comp2 TO destinationstruct-comp2.

...

Any necessary type conversions are performed individually.

Example

DATA: BEGIN OF address,
        firstname(20) TYPE c VALUE 'Fred',
        surname(20) TYPE c VALUE 'Flintstone',
        initials(4) TYPE c VALUE 'FF',
        street(20) TYPE c VALUE 'Cave Avenue',
        number TYPE i VALUE '11',
        postcode(5) TYPE n VALUE '98765',
        city(20) TYPE c VALUE  'Bedrock',
      END OF address.

DATA: BEGIN OF name,
        surname(20) TYPE c,
        firstname(20) TYPE c,
        initials(4) TYPE c,
        title(10) TYPE c VALUE 'Mister',
      END OF name.

MOVE-CORRESPONDING address TO name.

In this example, the values of name-surname, name-firstname and name-initials are set to 'Flintstone’, ‘Fred’, and 'FF'. name-title always has the value ‘Mister’.

This graphic is explained in the accompanying text
sap ABAP--關於Data Reference的使用---FIELD-SYMBOLS
 

Data References(只能指向abap定義的基本數據或者基本數據組合體)

1、定義數據參考變量(Data References)

DATA dref TYPE REF TO DATA.(指向任意類型,但在創建時必須指定對象類型)

DATA dref TYPE REF TO DATA_TYPE.

或者

TYPES t_dref TYPE REF TO DATA.

DATA dref TYPE t_dref.

在完成地址變量定義時,變量沒有指向任何對象,此時你不可引用。只有在變量賦值後在引用。地址變量的賦值有兩種方法:

CREATE DATA

GET REFERENCE OF dobj INTO dref.

2、動態創建數據參考的內存空間(CREATE DATA)

CREATE DATA dref {TYPE type}|{LIKE dobj}這種語句創建的對象沒有名稱,只有地址變量指向該內存變量;在申明參考變量時,未指定類型則必須加{TYPE type}|{LIKE dobj}說明。

有時需要動態創建動態類型數據對象,語法如下

CREATE DATA dref TYPE (name).

3、將數據地址賦值給數據參考變量(GET REFERENCE)

GET REFERENCE OF dobj INTO dref.

4、訪問數據參考變量指定的數據

訪問數據參考變量指定的數據有兩種情況:

1) 對於使用DATA dref TYPE REF TO DATA_TYPE來聲明的數據參考變量,程序可以直接通過->*運算符直接訪問數據;

代碼樣例

types: begin of STRUC_1,
         A type I,
         B type ref to SFLIGHT,
         C type P,
       end of STRUC_1.
data: S1 type STRUC_1.
types: begin of STRUC_2,
         X(10) type C,
         Y     type ref to STRUC_1,
         Z     type I,
       end of STRUC_2.
data:  S2 type STRUC_2,
       R2 type ref to STRUC_2.
if S1-A > 10.
  create data S1-B.
  S1-B->CARRID = 'LH'.
  S1-B->PAYMENTSUM = 1000.
endif.

S2-Y->A   = 100.
S2-Y->*-A = 200. "Same as S2-Y->A 
S2-Y->B->FLDATE = SY-DATUM.

2) 對於使用DATA dref TYPE REF TO DATA來聲明的數據參考變量,程序如果要訪問數據參考變量指定的數據,你首先要將數據參考變量賦值給一個字段符號(Field sysbol)(是不能直接通過數據參考變量來訪問的).如果數據參考變量爲初始化狀態, sy-subrc就返回4。

ASSIGN dref->* TO <fs> [CASTING ...].

代碼樣例

DATA: numref     TYPE REF TO DATA,
      number     TYPE I VALUE 123.
FIELD-SYMBOLS: <fs> TYPE ANY.
GET REFERENCE OF number INTO numref.
ASSIGN numref->* TO <fs>.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章