R/3 ABAP開發學習筆記(轉)

qmhiro發表於2008-03-13

R/3 ABAP開發學習筆記
T-Code:ST05,SE38,SE37,SE93,SE73,ABAPhelp

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、如果一個語句中,該名稱同時可能代表內表或者同名表工作區,則需要在內表名稱之後加“[]”指明當前操作的是內表物件。不提倡使用帶有表頭行的內表,而是應該總是宣告結構相同的其他資料物件作為顯示工作區進行內錶行操作。

come from a PLMM blog , thank you

:

如何調整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%’.
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 statements
Select 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.
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用每次去讀一次透明表,訪問資料庫的次數太多了,換個好一點程式自己研究吧。

9.透明表可以連線查詢,簇表只能透過簡單的select查詢,如bseg.
內表相當於陣列,可以透過loop,read進行查詢。
內表中的記錄都是放在工作區中進行編輯和察看的。結構同內表。程式中宣告內表時,表名為 ITAB_XXXX,字尾儘可能為關聯DBTab或內表用途

[@more@]

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

相關文章