作者: 惟湛
1、ST05是用于在開發(fā)ABAP程序時,對應(yīng)事務(wù)碼取得的字段是“數(shù)據(jù)結(jié)構(gòu)”而不是“透明表”的時候,通過ST05 的“SQL跟蹤”來獲得相關(guān)“Select”的語句;一般查看“REC”列耗時比較多的“Select”語句;
2、跟蹤時如果有涉及到“數(shù)量”這類有對數(shù)據(jù)表進行更新或插入操作的,則直接去查Update和Insert的SQL語句;
3、在跟蹤后,直接雙擊“對象名”列的名稱,點選“表格”轉(zhuǎn)到“SE11”的表字段表;
4、ABAP程序開頭的Tables:“數(shù)據(jù)表名”,只有在屏幕中有用到的表,才需要聲明;在程序中用到的表則不需要進行在Tables內(nèi)聲名;
5、抓SAP“文本”字段的數(shù)據(jù),要先自定義變量,然后通過SE37的函數(shù)“FUNCTION ’ZREAD_TEXT’”取回文本數(shù)據(jù);
6、新建的ABAP程序,在測試運行的時候要先進行“激活”,才能測試運行;
7、SE93:把ABAP寫好的程序指定一個事務(wù)碼執(zhí)行;
8、abap引號內(nèi)的字符’’必須要是大寫;
9、ABAP select 里面的語句,不能像mssql有那么豐富的函數(shù)使用,需要導(dǎo)到內(nèi)表后再對數(shù)據(jù)進行操作;
10、’EQ’是單個數(shù)據(jù)值,’BT’是between區(qū)間的意思。
11、在寫select inner join 里面,要注意是否需要加上銷售組織的條件;on 條件1 and 銷售組織條件。
12、SELECTION-SCREEN,里面有兩個子項,PARAMETERS和select-options。 PARAMETERS 一般是用于必輸項的屏幕參數(shù)設(shè)置,如果這個參數(shù)不是必輸項的,就要用select-options。在select ...where條件里,用PARAMETERS的條件語法是“數(shù)據(jù)字段 = 屏幕字段”;而select-options的條件語法是“數(shù)據(jù)字段 in 屏幕字段”。
13、在where判斷一個日期型數(shù)據(jù)是空,不是DEAKT = ’’,也不是DEAKT is initial,而應(yīng)該寫成DEAKT = ’00000000’ (8個0)。
14、一對多的inner join,如果取出的數(shù)據(jù)有重復(fù),前面加上distinct,用法和MSSQL相同。
15、sy-subrc,指上一個語句執(zhí)行是否成功;執(zhí)行成功返回0,執(zhí)行不成功返回非0。用if判斷。
16、如果一個語句中,該名稱同時可能代表內(nèi)表或者同名表工作區(qū),則需要在內(nèi)表名稱之后加“[]”指明當前操作的是內(nèi)表對象。不提倡使用帶有表頭行的內(nèi)表,而是應(yīng)該總是聲明結(jié)構(gòu)相同的其他數(shù)據(jù)對象作為顯示工作區(qū)進行內(nèi)表行操作。
如何調(diào)整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、使用聚合函數(shù)
不推薦
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、使用批量修改內(nèi)表代替逐行修改
不推薦
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、使用二分法查詢,提高查詢內(nèi)表數(shù)據(jù)速度
不推薦
Read table int_fligh with key airln = ‘LF’.
推薦
Read table int_fligh with key airln = ‘LF’ binary search.
7、兩個內(nèi)表添加使用批量增加代替逐行
不推薦
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 代替.
定義內(nèi)表與工作區(qū)最方便的方法
*定義 名為 ITAB 的內(nèi)表, 內(nèi)表結(jié)構(gòu) 參照表 TABLE 。
DATA: ITAB TYPE TABLE OF TABLE.
*定義 名為 WA 的工作區(qū), 其 行結(jié)構(gòu)與 內(nèi)表 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后面接結(jié)構(gòu),LIKE后面接對象
4.OBLIGATORY為必輸字段
5.DATA SEPARATER . = DATA SEPARATER TYPE C.
6.關(guān)于內(nèi)表的結(jié)構(gòu)描述,它的當前記錄數(shù)據(jù)是放在header line中的,Occurs 是分配數(shù)據(jù)緩沖區(qū),大小不重要,系統(tǒng)會自動分配。但定義內(nèi)表不用occurs就需要用with header line,occurs語句記得是為了向下兼容。
7.occurs 指明的數(shù)量是有一點學(xué)問的.
1.當你知道可能每次用Select命中或交換的紀錄數(shù)xxx時,可指明 occurs xxx.
2.如用occurs 0 聲明時, buffers 由系統(tǒng)自動分配.
8.SELECT 在into時記得一般都要加上table,不然是into一個工作區(qū),即wa,而工作區(qū)要寫入內(nèi)表,則需要再append,所以直接定放內(nèi)表即可,內(nèi)表和工作區(qū)的區(qū)別就在于工作區(qū)就相當于表頭,是有一行,data定義begin of itab時不加occurs就是工作區(qū),加了就是內(nèi)表,occurs *,后面表示系統(tǒng)初始分配給此內(nèi)表多少行,每次滿時再多分配多少行,我們平常為了節(jié)約內(nèi)存,一般直接用0,with header line是為了定義含表頭的內(nèi)表,平常occurs就直接帶表頭,而with header line一般是在itab1 like itab occurs 0 with header line時用,這是參照一個內(nèi)表定義另一內(nèi)表,如果要帶表頭,一定要加with header line。
你這樣問不是辦法,最好不懂時直接接F1,查到SAP的幫助即可. check是檢查后面的邏緝是否滿足,不滿足則在上例是跳出form,不的執(zhí)行下面的語句。
說實在,初略的看了一下上面的程序,寫得太爛了,竟然將usr01或usr03透明表中的字段按條件取到一個表工作區(qū),竟然不加single,象這種不加single的select按理說應(yīng)該是調(diào)不過的,必須在后面再對應(yīng)一個endselect,而這種select加endselect用每次去讀一次透明表,訪問數(shù)據(jù)庫的次數(shù)太多了,換個好一點程序自己研究吧。
SAP ABAP PA certification 培訓(xùn)筆記
P (4) 長度4個字節(jié)
Xstring (10) 長度為10個字節(jié),可以容納20個數(shù)字
大結(jié)構(gòu)體與小結(jié)構(gòu)體的兼容
Move 大 to 小 大的覆蓋小的 大結(jié)構(gòu)體的剩余部分保持不變
Move 小 to 大 匹配的部分 被小的覆蓋, 其余的字段被初始化
P 類型 與 F類型的優(yōu)缺點
P:計算精確,適合商業(yè)結(jié)算,但范圍短
F:儲存范圍大,計算不精確
P 與 F 類型的運算方式
F IEEE 用二進制數(shù)進行運算
P 采用半字節(jié)儲存一個數(shù)字的方式進行運算
字段 結(jié)構(gòu)體 兼容問題
字段兼容:類型和長度相同
結(jié)構(gòu)體:字段按順序兼容,并且字段數(shù)相同
內(nèi)表兼容:行類型相同, KEY 兼容,表類型相同
如果字符串 move 到一個比字符串小的結(jié)構(gòu)體 ,
[][][][] ---à [][]
[][]
一個字段 move 到一個 內(nèi)表中
Internal table 內(nèi)表.
靜態(tài)數(shù)據(jù)對象包括: 簡單數(shù)據(jù)類型(除了string 和xstring 類型), 結(jié)構(gòu)體(不包含string 和xstring 類型)
動態(tài)數(shù)據(jù)對象:string , xstring , 包含string 或 xstring 的結(jié)構(gòu)體, 內(nèi)表
一個結(jié)構(gòu)體是否可以包含STRING 或xstring, 如果可以 結(jié)構(gòu)體可以拓展嗎?
定義一個 只有一個字段的 內(nèi)表 字段長度是c(18),
定義一個結(jié)構(gòu)體 結(jié)構(gòu)體里 包含三個字段, 類型 隨意, 第二個類型,是另一個結(jié)構(gòu)體
定義一個內(nèi)表 內(nèi)表的行類型 是第一個結(jié)構(gòu)體.
再用第二個結(jié)構(gòu)體定義一個內(nèi)表 ,利用這個內(nèi)表 作為行類型,做一個內(nèi)表
內(nèi)表的三個基本屬性
line type 行類型
key definition 鍵類型
table kind 表類型
在standard table 中 使用 table key的查找方式為 table scan 全表掃描
在 sorted table 中使用table key 在遵循; left-aligned 從左至右匹配, no gaps 沒有間隔,使用”=” 填充字段時, 使用 二分查找法 ,其它情況下 使用 table scan查找
對hash表訪問, 只能通過key訪問單條記錄, 訪問的速度不依賴于表中的數(shù)據(jù)量,而在其余兩種表中,查詢的時間與表中數(shù)據(jù)量成正比
其它情況是否代表,只是順序不符合left-aligned. 哈希表可以通過部分的key 進行訪問嗎?
定義內(nèi)表
定義一個局部內(nèi)表類型,通過該類型定義內(nèi)表變量
直接定義字段 直接定義內(nèi)表變量(隱藏了一個內(nèi)表類型)
通過全局內(nèi)表類型定義內(nèi)表變量
標準的定義內(nèi)表語句
Types or DATA name
TYPE table_kind
OF line_type
WITH key_def
[INITIAL SIZE n.]
Table kind and key. 表類型 和 表鍵
注意:在定義standard類型的內(nèi)表時,如果使用 WITH DEFAULT KEY. 系統(tǒng)會自動將內(nèi)表中的字符類型字段(c,n,d,t,x,string,xstring)組合成table key.
內(nèi)表的key
standard標準表: key 不唯一.
sorted排序表: 可以指定KEY是否唯一
Hash 哈希表: KEY必須是唯一
在內(nèi)表中使用不是結(jié)構(gòu)體類型的行類型
當內(nèi)表的行類型只有一列的時候,需要使用pseudo-compnent 偽列,
用途:設(shè)置一個按鈕工具欄,用只含有一列的內(nèi)表.
對內(nèi)表的操作
move對內(nèi)表的拷貝
clear 將數(shù)據(jù)清空
free 釋放內(nèi)存
compare表之間的操作,比較
sort 排序表
array fetch
遞歸比較
先對內(nèi)表之間的行數(shù)進行比較
如果有必有的話,還需要對行的組件進行比較
內(nèi)表之間的比較
用行數(shù)比較, 有必要的話 可以 用內(nèi)容比較
定義兩個內(nèi)表 兩個 內(nèi)表不兼容 一個有3個字段 一個有5個
對兩個內(nèi)表進行比較.
定義兩個內(nèi)表, 結(jié)構(gòu)一樣 , 變量不一樣
全做成數(shù)字型字段
第一個 添加 小數(shù)字
第二個內(nèi)表 添加大數(shù)字
排序可以指定升序降序.
對內(nèi)表具體操作
Insert 插入
Read 讀取
Change 修改
Delete 刪除
Insert summated collect. 插入累計
對內(nèi)表中的數(shù)據(jù)行進行限制條件操作
對數(shù)據(jù)的訪問
一、單條數(shù)據(jù)訪問
通過 table key訪問
通過 line index 訪問(對于line index 類型內(nèi)表)
通過 condition條件訪問
二、多條數(shù)據(jù)訪問
通過condition條件訪問
通過 index interval 通過行區(qū)間訪問
指定訪問數(shù)據(jù)的傳輸方式
使用 結(jié)構(gòu)體 work area 進行 copy 對內(nèi)表數(shù)據(jù)進行操作
定義 field symblo 指針 指向訪問數(shù)據(jù),(可以直接訪問數(shù)據(jù))
通過將內(nèi)表插入內(nèi)表的操作
重要: 不能通過line index 對hash 表 進行訪問, 在排序表中插入數(shù)據(jù).除非插入的位置 正好是排序表中規(guī)定的位置,否則會出現(xiàn) 運行期異常(強烈不推薦使用insert往 sorted b表中插入數(shù)據(jù))
Field symbol 指針
作用: 直接對內(nèi)表進行操作,而不用再重新定義結(jié)構(gòu)體對目標內(nèi)表數(shù)據(jù)進行拷貝, 增大了效率.
定義指針語法:
Data: var_a TYPE I VALUE 4.
FIELD-SYMBOLS: <fs> TYPE i.
ASSIGN var_a TO <fs>.
<fs> = 77.
重要: 定義的指針名,必須加”<>”
Insert 插入操作
一、 單條數(shù)據(jù)的插入操作
標準表: 可以使用 index (推薦) 和 table key 方式插入
排序表: 可以通過 table key方式插入 , 但也可以用index插入(強烈不推薦, 很有可能出現(xiàn)運行錯誤)
Hash表: 只能夠用table key 方式插入
二、 多條記錄的插入
源內(nèi)表為 index table : 則可以指定源內(nèi)表的數(shù)據(jù)范圍,并插入到目標內(nèi)表中
目標內(nèi)表為index table: 則可以可以指定目標內(nèi)表被插入數(shù)據(jù)的具體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]
讀取 內(nèi)表的一條 將數(shù)據(jù) 讀到結(jié)構(gòu)體中
如果系統(tǒng)獨到行 sy-subrc = 0 . 然后讀取到結(jié)構(gòu)體中,
Sy-tfill 存放總行數(shù)
Sy-tleng 行的長度
Transporting
指定特定列 傳輸字段 , 傳送部分字段
TRANSPORTING NO Fields 不傳值, 作用 ,看內(nèi)表中 有沒有 這條數(shù)據(jù)
Camparing
有一個結(jié)構(gòu)體 和內(nèi)表
C1 C2 C3
Lh 0019 17
Lh 0018 18
通過comparing 后的值, 可以判斷讀取的值是否符合要求.
現(xiàn)在結(jié)構(gòu)體中需要比較的字段賦值,
先判斷 相應(yīng)字段是否相等
回去做個練習(xí)
比較成功 sy-subrc = 0
Zmycompare_2009
用一個結(jié)構(gòu)作為 查詢條件,
到內(nèi)表查詢符合條件的數(shù)據(jù)
With key 可以用 table key 或 普通字段作為條件
使用field symbol
通過一個內(nèi)表 定義一個 結(jié)構(gòu)體 作為 指針
Read table itab [index n / key ] assigning <fs>.
Write: / <fs>-field_1.
直接修改 <fs> 的值 會怎么樣?
Change 修改內(nèi)表
Transporting 的 傳輸方向
通過 field symbol
直接修改 內(nèi)表
重要: 不能直接指針對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 關(guān)鍵字定義 廢棄用法
Occur + 整數(shù), 10 ,
Occur 0 , 默認大小,
Occur 0 with head line 廢棄用法了
重要: 在面向環(huán)境中 不能用帶有 head line 的內(nèi)表
Data: so_carr LIKE RANGE OF carrid.
Loop 內(nèi)表
Where 條件 從起始點二分查找
標準表 可以部分指定順序
From 1 to 5
對于一個標準表來說, 加上二分查找 是不是 先排序
先把標準表 排序, 然后再二分
必須先手工排序,再進行二分查找
sap abap programming---關(guān)于ABAP內(nèi)表(about abap internal table)
- 內(nèi)表的類型及定義:
(1).ANY TABLE:即任意表類型,此種定義方式只能在傳遞參數(shù)的時候定義。
例如: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訪問內(nèi)表是線性查找的,也就是說,隨著表中記錄的增加,對表的
操作的時間開銷也相應(yīng)的增加。
定義方法:TYPES/DATA: LIKE/TYPE STANDARD TABLE OF .
B. SORTED TABLE:顧名思義,表中的記錄是按照一定的順序排列的。訪問表的主要方式是表中定義的key,如果key不唯
一,則選擇index最小的那個。也可以通過index來訪問排序表,如果你想通過index插入一條記錄,系統(tǒng)會自動檢查你插入的
位置是否正確。所以,如果插入的時間比插入到標準表的時間會長。因此,盡量選擇key來對排序表進行操作。
定義方法:TYPES/DATA: LIKE/TYPE SORTED TABLE OF .
《2》.HASHED TABLE:對哈希表只能用你定義的key進行操作,而不能使用index進行操作。因此,定義哈希表必須定義unique
key 。注意:所有關(guān)于使用index操作表的語句都不能用于操作哈希表。例如:sort,loop等。
定義方法:TYPES/DATA: LIKE/TYPE HASHED TABLE OF .
- 內(nèi)表的操作:
(1).創(chuàng)建:
A. 定義一個結(jié)構(gòu),然后type/like這個結(jié)構(gòu)
例如:
TYPES: BEGIN OF ,
...
i> ...,
...
END OF .
DATA TYPE STANDARD TABLE OF
WITH NON-UNIQUE DEFAULT KEY
INITIAL SIZE
WITH HEADER LINE.
B. type/like系統(tǒng)表或者數(shù)據(jù)庫表或者結(jié)構(gòu)
DATA TYPE STANDARD TABLE OF <系統(tǒng)表名>
INITIAL SIZE
WITH HEADER LINE.
(2).添加數(shù)據(jù):
A.APPEND:直接向表中添加數(shù)據(jù)
APPEND [wa TO|INITIAL LINE TO] itab[ASSIGNING |REFERENCE INTO dref].
APPEND LINES OF itab1 [FROM idx1] [TO idx2] TO itab2.
APPEND [wa TO] itab SORTED BY f [ASSIGNING
B.向表中插入數(shù)據(jù):
INSERT [wa INTO|INITIAL LINE INTO] itab [INDEX idx] [ASSIGNING |REFERENCE INTO dref].
INSERT [wa INTO|INITIAL LINE INTO] TABLE itab [ASSIGNING |REFERENCE INTO dref].
INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO itab2 [INDEX idx3].
INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO TABLE itab2.
C.相同字段求和向表里添加:
Basic form
COLLECT [wa INTO] itab.
Extras:
- ... ASSIGNING
- ... REFERENCE INTO dref
- ... SORTED BY f
(3).刪除數(shù)據(jù):
- DELETE itab.
- DELETE TABLE itab WITH TABLE KEY k1 = v1 ... kn = vn.
- DELETE TABLE itab [FROM wa].
- DELETE itab INDEX idx.
- DELETE itab FROM idx1 TO idx2.
- DELETE itab WHERE logexp.
- DELETE ADJACENT DUPLICATES FROM itab.
(4).修改數(shù)據(jù):
MODIFY itab [FROM wa] [INDEX idx] [ASSIGNING |REFERENCE INTO dref] [TRANSPORTING f1 ... fn].
MODIFY TABLE itab [FROM wa] [ASSIGNING |REFERENCE INTO dref] [TRANSPORTING f1 ... fn].
MODIFY itab [FROM wa] TRANSPORTING f1 ... fn WHERE cond.
sap --- ABAP 內(nèi)表(internal table) 標題行(header line) 工作區(qū)(work area) 簡介 OCCURS 0
剛開始學(xué)ABAP的時候,學(xué)到iternal table時,感覺一陣混亂.
搞不清楚什么是work area,什么是header line,以及occurs是干什么用的.
今天終于差不多搞明白了(我還是太弱啊...BS自己一下)
所以還是記錄下來..省得自己以后再忘記...
先是用TYPES關(guān)鍵字定義一個行(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作為了區(qū)別工作區(qū)和內(nèi)表的標志.
OCCURS應(yīng)該有更深層次的意義,但我目前只能領(lǐng)悟至此...
當我們用以上這個方法來聲明一個iternal table時,可以選擇是否有無header line.
上面這句就是沒有header line的.改成如下就有了:
DATA itab TYPE line OCCURS 0 WITH HEADER LINE.
有無header line的區(qū)別就是,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就是上面那個已經(jīng)定義的work area.
有header line的時候,這兩種都可以.
無header line的時候,只能用第1種.
第2種里,itab的意義是一個header line,而不是內(nèi)表.
因為"DATA itab TYPE line OCCURS 0 WITH HEADER LINE."這樣的聲明,
已經(jīng)隱式聲明了一個與內(nèi)表同名的header line.
所以O(shè)CCURS用來聲明內(nèi)表可能造成二義性(ambiguous).
于是,OCCURS被認為是old的東西,采用一下方式聲明一個內(nèi)表比較好:
DATA itab TYPE STANDARD TABLE OF line.
還有一種聲明內(nèi)表的方法:
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就不是內(nèi)表咯,只是一個structure,可以作為itab的work area.
寫到這里發(fā)現(xiàn),歸根到底就是TYPES和DATA這兩個關(guān)鍵字的區(qū)別嘛.
還有有無OCCURS的區(qū)別.
這樣一想,簡單明了~~
OCCURS 是在3.0以前申明內(nèi)表的關(guān)鍵字。意思是內(nèi)表初始的時候有多少行?,F(xiàn)在不提倡使用??吹搅苏J識就行。
=======================================================
ABAP Work Area & Header Line -
- Difference between Work Area and Header Line
工作區(qū)與標題行的不同之處
原文地址:
http://www.sap-img.com/abap/difference-between-work-area-and-header-line.htm
我翻譯下,嘿嘿
在對內(nèi)表進行一些操作的時候,比如增加或者取回一條記錄.我們必須暫時保存這條記錄.
這條記錄就保存在內(nèi)表的工作區(qū)里(work area).內(nèi)表的工作區(qū)必須和內(nèi)表有相同的結(jié)構(gòu).
內(nèi)表由主體(body)和一個可選的標題行(head line)組成.
標題行是一個隱式的(implicit)工作區(qū).在內(nèi)表聲明的時候,可以選擇有無標題行.
e.g.
data: begin of itab occurs 10,
ab type c,
cd type i,
end of itab.
這樣的內(nèi)表itab,是有標題行的.
data: wa_itab like itab.
這樣的wa_itab是顯式(explicit)聲明的一個itab的工作區(qū).
data: itab1 like itab occurs 10.
這樣的內(nèi)表itab1,是沒有標題行的.
標題行是一個和內(nèi)表主體有著一樣結(jié)構(gòu)的字段的串,標題行只有一行.
所以,標題行相當于一個緩沖區(qū)(buffer),用于存放被操作的紀錄,是內(nèi)表的缺省的工作區(qū).
- Using Header Lines as Work Areas
把標題行當工作區(qū)來使用
原文地址:
http://help.sap.com/saphelp_nw04/helpdata/en/fc/eb36a1358411d1829f0000e829fbfe/content.htm
我再翻譯下...
當你在創(chuàng)建一個內(nèi)表的時候,你同時也聲明了一個具有相同名稱的標題行(這個好像很奇特的樣子么...).可以把這個標題行當作工作區(qū)來對內(nèi)表進行操作.
如果一個內(nèi)表有標題行,則對其進行操作的ABAP語句會簡短一些,因為這些語句會自動認為標題行是一個隱式的工作區(qū).語句的不同如下表:
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 ...
但是,用隱式的工作區(qū),代碼難以被理解,所以還是用一個不同名稱的工作區(qū)比較好.
sap abap---通過例子學(xué)習(xí)ABAP--初始化內(nèi)表 清空內(nèi)表
初始化內(nèi)表的作用是清空內(nèi)表所有的數(shù)據(jù)行,將內(nèi)表恢復(fù)到填充或賦值之前的狀態(tài)。初始化內(nèi)表過程中需要注意之處仍然是初始化無 表頭行內(nèi)表和有表頭行內(nèi)表的區(qū)別,以及初始化內(nèi)表和表頭行的區(qū)別。
(1)CLEAR ITAB. 同時清空表頭和行內(nèi)表的值
(2)CLEAR ITAB. 只清空內(nèi)表本身的值,保留表頭行的值。
(3)REFRESH I TAB 只清空內(nèi)表本身的值,保留表頭行的值。
(4)FREE ITAB. 只清空內(nèi)表本身的值,保留表頭行的值。
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. -------------------------
- 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[]. - 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.
如何一次性的給內(nèi)表的一列賦值,不用LOOP循環(huán)來做,比如把第一列都給設(shè)置成空.
CLEAR 對應(yīng)工作區(qū)清空
MODIFY 內(nèi)表 FROM 內(nèi)表對應(yīng)工作區(qū)
TRANSPORTING 修改字段
WHERE 修改字段 <> SPACE.
MODIFY itab [FROM wa] TRANSPORTING f1 ... fn WHERE cond
這句話的意思是凡是內(nèi)表itab中滿足條件cond的記錄都被工作區(qū)wa的數(shù)據(jù)修改,修改的字段是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和徐的交流
- 配置個外部DB, T-code為: DB59, DB50N, 測試連接
- 執(zhí)行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 常用函數(shù)(sap abap function)
RS_VARIANT_VALUES_TECH_DATA
可以返回一個內(nèi)表, 里面存的是PARAMETER SELECT-OPTION的名字 以及對應(yīng)的值. 可用于background job中對vaiant的修改.
函數(shù)名 描述
SD_VBAP_READ_WITH_VBELN 根據(jù)銷售訂單讀取表vbap中的信息
EDIT_LINES 把READ_TEXT返回的LINES中的行按照TDFORMAT=“”重新組織
VIEW_MAINTENANCE_CALL 維護表視圖
函數(shù)名 描述
DY_GET_FOCUS 獲得屏幕焦點
DY_GET_SET_FIELD_VALUE 獲得或者設(shè)置屏幕字段的值
函數(shù)名 描述
F4IF_INT_TABLE_VALUE_REQUEST 顯示檢索help
READ_TEXT 讀取長文本
CONVERSION_EXIT_CUNIT_OUTPUT 單位轉(zhuǎn)換
SJIS_DBC_TO_SBC 全角轉(zhuǎn)半角
SJIS_SBC_TO_DBC 半角轉(zhuǎn)換為全角
CO_R0_CHECK_DECIMAL_POINT 根據(jù)單位檢查數(shù)據(jù)的小數(shù)位
POSTAL_CODE_CHECK 檢查郵政編碼
函數(shù)名 描述
CONVERSION_EXIT_ALPHA_INPUT 全數(shù)字則在前面補0
CONVERSION_EXIT_ALPHA_INPUT 和上面相反
GET_JOB_RUNTIME_INFO 獲得job相關(guān)信息
TERMINAL_ID_GET 獲得端末id
DATE_CONVERT_TO_FACTORYDATE 把輸入日期轉(zhuǎn)為工廠日歷日期
MESSAGE_TEXT_BUILD 把消息轉(zhuǎn)為文本
函數(shù)名 描述
POPUP_TO_CONFIRM 彈出確認窗口
函數(shù)名 描述
CONVERSION_EXIT_MATN1_INPUT 物料號碼轉(zhuǎn)換函數(shù)
CONVERSION_EXIT_MATN1_OUTPUT 同上相反
CONVERT_TO_LOCAL_CURRENCY 按照指定日期匯率轉(zhuǎn)換金額為指定貨幣類型
SSF_FUNCTION_MODULE_NAME 根據(jù)form名取得對應(yīng)的函數(shù)名(SmartForm)
函數(shù)名 描述
DATE_CHECK_PLAUSIBILITY 日期CHECK
cl_gui_frontend_services=>gui_upload 上傳到服務(wù)器
cl_gui_frontend_services=>gui_download 下載到服本地
SSF_FUNCTION_MODULE_NAME SMARTFORMS輸出報表時,生成一個函數(shù)名稱,然后CALL這個名稱
函數(shù)名 描述
POPUP_TO_DECIDE_LIST 彈出供選擇窗口
ABAP_DOCU_DOWNLOAD – 以HTML格式下載ABAP文檔。
ARFC_GET_TID – 以十六進制形式返回終端的IP地址。
BAL_ -容納了SAP的應(yīng)用程序日志所有的函數(shù)模塊。
BP_EVENT_RAISE –在 ABAP/4 程序中觸發(fā)一個事件。
BP_JOBLOG_READ –獲得job log的執(zhí)行結(jié)果。
CLOI_PUT_SIGN_IN_FRONT – 將負號前置, SAP默認將負號放在數(shù)字后面。
CLPB_EXPORT –從內(nèi)表導(dǎo)入到剪貼板。
CLPB_IMPORT – 從剪貼板導(dǎo)入內(nèi)表。
COMMIT_TEXT -To load long text into SAP 。
CONVERSION_EXIT_ALPHA_INPUT - 數(shù)字串前補0
example:
input = 123
output = 0000000000000。。。000000000000123
CONVERSION_EXIT_ALPHA_OUTPUT – 消除數(shù)字串前的0
example:
input = 00000000000123
output = 123
CONVERT_OTF – 將SAP文檔(SAP Script)轉(zhuǎn)換成其他類型。
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 – 返回一個日期所在的周數(shù)。
DATE_CHECK_PLAUSIBILITY – 檢查一個日期是否是SAP的有效格式。
DYNP_VALUES_READ – 讀取SCREEN字段的值,也可以用來讀取報表SELECTION SCREEN。
DYNP_VALUES_UPDATE -更新屏幕字段的值。
ENQUE_SLEEP –在繼續(xù)處理之前等待一個指定的時間。
ENQUEUE_ESFUNCTION – 鎖定一個ABAP程序使它不可以被執(zhí)行:
RELID = 'ZZ'
SRTF2 = 0
SRTF = (your report name)
注意不要用SY-REPID來傳遞你的報表名字,當把SY-REPID作為參數(shù)傳遞給函數(shù)模塊的時候,SY-REPID的值實際上已經(jīng)發(fā)生了變化。
EPS_GET_FILE_ATTRIBUTES – 獲得文件屬性。
EPS_GET_DIRECTORY_LISTING – 返回一個本地或網(wǎng)絡(luò)目錄的文件列表。
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服務(wù)器的連接。
FTP_COMMAND – 在FTP服務(wù)器上執(zhí)行一個命令。
FTP_DISCONNECT –關(guān)閉指向FTP服務(wù)器的連接。
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 –在顯示服務(wù)器端創(chuàng)建一個目錄 。
GUI_DELETE_FILE – 在顯示服務(wù)器端刪除一個文件 。
GUI_DOWNLOAD – 從應(yīng)用服務(wù)器下載內(nèi)表到顯示服務(wù)器。
GUI_EXEC – 調(diào)用一個文件或程序,取代了WS_EXECUTE。
GUI_GET_DESKTOP_INFO – 獲得客戶端桌面信息,取代了WS_QUERY。
GUI_REMOVE_DIRECTORY – 從顯示服務(wù)器刪除一個目錄 。
GUI_RUN – 啟動一個文件或程序 。
GUI_UPLOAD – 從顯示服務(wù)器上傳文件到應(yīng)用服務(wù)器,取代了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提供了一個節(jié)日表。
INIT_TEXT –上傳長文本到SAP。
K_WERKS_OF_BUKRS_FIND – 返回一個特定公司代碼的所有工廠。
LIST_TO_ASCII –將ABAP報表從 OTF形式轉(zhuǎn)換成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 – 創(chuàng)建一個文件并自動啟動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 – 彈出一個對話框告知用戶有可能丟失數(shù)據(jù),詢問是否操作繼續(xù)。
POPUP_TO_CONFIRM_STEP -彈出一個對話框詢問用戶是否操作繼續(xù)。
POPUP_TO_CONFIRM_WITH_MESSAGE 可以顯示定制的提示信息的確認窗口 類似POPUP_TO_CONFIRM_STEP,只是多三行的文本錯誤診斷提示。
POPUP_TO_CONFIRM_WITH_VALUE 用此函數(shù)可以建立一個對話框用于詢問用戶是否執(zhí)行某步操作,該操作可能會丟失數(shù)據(jù),用戶可以選擇Yes No 或者Cancel。該函數(shù)可以傳入一個標題,兩行的文本(提示問題)和一個對象值
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 – 在注冊表里設(shè)置一條記錄
RFC_ABAP_INSTALL_AND_RUN – 當MODE參數(shù)值為‘F’時運行PROGRAM表中的程序'.
RH_GET_ACTIVE_WF_PLVAR – 獲得激活的HR計劃
RH_START_EXCEL_WITH_DATA – 啟動Excel并用內(nèi)表給文件賦值
RH_STRUC_GET –返回所有相關(guān)的組織信息
RP_CALC_DATE_IN_INTERVAL – 年月日加減
RP_LAST_DAY_OF_MONTHS – 獲得一個月的最后一天
RPY_DYNPRO_READ – 讀取屏幕
RPY_TRANSACTION_READ – 給定一個事務(wù)代碼,獲得其程序和屏幕;或給定一個程序和屏幕獲得事務(wù)代碼
RS_COVERPAGE_SELECTIONS – 獲得一個報表的選擇參數(shù)列表。
RS_REFRESH_FROM_SELECTOPTIONS –獲得當前選擇屏幕的內(nèi)容
RS_SEND_MAIL_FOR_SPOOLLIST – 在程序中給SAP office 發(fā)送消息
RS_VARIANT_CONTENTS – 獲得一個變式的內(nèi)容
RZL_SLEEP – 將當前程序掛起
RZL_SUBMIT – 提交一個遠程報表
RZL_READ_DIR_LOCAL – 讀取應(yīng)用服務(wù)器的目錄
RZL_READ_DIR – 如果服務(wù)器名字左部為空,從本地讀取目錄,否則讀取遠程服務(wù)器的目錄
RZL_READ_FILE – 如果為給定服務(wù)器名字則讀取本地文件,否則讀取遠程服務(wù)器文件。
RZL_WRITE_FILE_LOCAL - 將內(nèi)表保存到顯示服務(wù)器(not PC). 不使用OPEN DATASET因此避免了授權(quán)檢查。
SAPGUI_PROGRESS_INDICATOR – 顯示一個進度條
SAVE_TEXT – 上傳長文本
SCROLLING_IN_TABLE –當編寫模塊池的時候可以用它來處理滾動
SD_DATETIME_DIFFERENCE – 兩日期作差
SO_NEW_DOCUMENT_ATT_SEND_API1 - 將文檔作為郵件的一部分發(fā)送
SO_SPLIT_FILE_AND_PATH – 將一個包含路徑的全文件名分割為文件名和路徑
SO_SPOOL_READ – 根據(jù)SPOOL號獲得printer spool
SO_WIND_SPOOL_LIST – 根據(jù)用戶瀏覽printer spool號
SX_OBJECT_CONVERT_OTF_PDF – 從OTF轉(zhuǎn)換為PDF (SAP 腳本轉(zhuǎn)換)
SX_OBJECT_CONVERT_OTF_PRT – 從OTF轉(zhuǎn)換為打印機格式(SAP 腳本轉(zhuǎn)換)
SX_OBJECT_CONVERT_OTF_RAW – 從OTF轉(zhuǎn)換為ASCII(SAP 腳本轉(zhuǎn)換)
SXPG_CALL_SYSTEM - 檢查用戶是否有執(zhí)行某個命令的權(quán)限
SXPG_COMMAND_LIST_GET – 獲得一個包含所有定義的外部OS命令的列表.
SXPG_COMMAND_DEFINITION_GET – 從R/3系統(tǒng)數(shù)據(jù)庫讀取單個外部OS命令的定義
SXPG_COMMAND_CHECK - 檢查用戶是否有執(zhí)行某個命令的權(quán)限
SXPG_COMMAND_EXECUTE -檢查用戶是否有執(zhí)行某個命令的權(quán)限,擁有授權(quán)則執(zhí)行命令
TERMINAL_ID_GET –返回終端ID
TH_DELETE_USER – 剔除一個用戶,效果同SM04
TH_ENVIRONMENT – 獲得UNIX環(huán)境
TH_POPUP –在特定用戶屏幕上顯示一個系統(tǒng)消息
TH_REMOTE_TRANSACTION – 在遠程服務(wù)器上運行事務(wù)代碼
TH_USER_INFO – 獲得當前用戶的信息 (會話,登陸的工作臺等)
TH_USER_LIST –顯示登陸到應(yīng)用服務(wù)器的用戶列表
UNIT_CONVERSION_SIMPLE –衡量單位轉(zhuǎn)換
UPLOAD –上傳文件到顯示服務(wù)器
UPLOAD_FILES – 上傳一個或多個文件
WRITE_LIST –顯示一個列表對象
WS_DOWNLOAD –將內(nèi)表下載到顯示服務(wù)器
WS_EXCEL –啟動EXCEL
WS_EXECUTE –執(zhí)行一個程序
WS_FILE_DELETE – 刪除一個文件
WS_FILENAME_GET –調(diào)用文件選擇對話框
WS_MSG –顯示一個對話框顯示在線消息
WS_UPLOAD – 從顯示服務(wù)器上傳文件到內(nèi)表
WS_VOLUME_GET –獲得終端設(shè)備標簽
WWW_LIST_TO_HTML – 運行一個報表之后,調(diào)用這個方法將列表輸出轉(zhuǎn)換成HTML
SD_VBAP_READ_WITH_VBELN 根據(jù)銷售訂單讀取表vbap中的信息
EDIT_LINES 把READ_TEXT返回的LINES中的行按照TDFORMAT=“*”重新組織
VIEW_MAINTENANCE_CALL 維護表視圖
DY_GET_FOCUS 獲得屏幕焦點
DY_GET_SET_FIELD_VALUE 獲得或者設(shè)置屏幕字段的值
F4IF_INT_TABLE_VALUE_REQUEST 顯示檢索help
CONVERSION_EXIT_CUNIT_OUTPUT 單位轉(zhuǎn)換
SJIS_DBC_TO_SBC 全角轉(zhuǎn)半角
SJIS_SBC_TO_DBC 半角轉(zhuǎn)換為全角
CO_R0_CHECK_DECIMAL_POINT 根據(jù)單位檢查數(shù)據(jù)的小數(shù)位
POSTAL_CODE_CHECK 檢查郵政編碼 GET_JOB_RUNTIME_INFO 獲得job相關(guān)信息
TERMINAL_ID_GET 獲得終端
idDATE_CONVERT_TO_FACTORYDATE 把輸入日期轉(zhuǎn)為工廠日歷日期
MESSAGE_TEXT_BUILD 把消息轉(zhuǎn)為文本
CONVERT_TO_LOCAL_CURRENCY 按照指定日期匯率轉(zhuǎn)換金額為指定貨幣類型
SSF_FUNCTION_MODULE_NAME 根據(jù)form名取得對應(yīng)的函數(shù)名(SmartForm)
DATE_CHECK_PLAUSIBILITY 檢查日期合法性
CHECKcl_gui_frontend_services=>gui_upload 上傳到服務(wù)器
cl_gui_frontend_services=>gui_download 下載到本地
SSF_FUNCTION_MODULE_NAME SMARTFORMS輸出報表時,生成一個函數(shù)名稱,然后CALL這個名
通過這個日期得出那天是星期幾
DAY_IN_WEEK
用來得到將來/過去的日期的
RP_CALC_DATE_IN_INTERVAL
日期的加減
BKK_ADD_MONTH_TO_DATE
一組有用的用戶交互窗口函數(shù)
POPUP_TO_CONFIRM_LOSS_OF_DATA 顯示有YES/NO的彈出窗口,提示用戶未保存的數(shù)據(jù)將丟失
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 有表格對象的確認窗口
一組操縱客戶端文件系統(tǒng)的函數(shù)
GUI_CREATE_DIRECTORY 在PC上建立文件目錄
GUI_DELETE_FILE 刪除PC上的文件
GUI_DOWNLOAD 文件下載函數(shù)
GUI_EXEC 執(zhí)行PC上的程序,或者打開文件
GUI_GET_DESKTOP_INFO 得到PC客戶端的系統(tǒng)信息,比如操作系統(tǒng)等
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 :從剪貼板導(dǎo)入internal table
CLPB_EXPORT : 從internal table輸入到剪貼板
示例程序:GRCLPB_1
sap abap programming---關(guān)于ABAP程序執(zhí)行效率和優(yōu)化(z)
程序的效率是每個程序員都應(yīng)該重視的,無論是采用的哪一種語言進行開發(fā).
在我做過的一個項目中,一個幾萬條數(shù)據(jù)的運行,在沒有考慮效率,對代碼沒有進行優(yōu)化前的運行時間是7個小時,當對代碼進行一系列的優(yōu)化修改后,運行的時間就只剩一個小時,由此可見,代碼的優(yōu)化是多么的重要。
那么,我們在寫ABAP程序時,怎樣的語句才能提高到效率呢,下面是我總結(jié)到的幾點:
1、抽取數(shù)據(jù)時,避免使用SELECT *, 盡量使用SELECT A B INTO TABLE ITAB這樣的語句。
2、不要使用SELECT...ENDSELECT語句。
3、盡量避免在LOOP中訪問數(shù)據(jù)庫??梢栽谥跋劝褦?shù)據(jù)取到內(nèi)表,在LOOP中用READ TABLE WITH KEY ... BINARY SEARCH.進行讀取對應(yīng)的數(shù)據(jù)。
4、用SORT代替ORDER BY。
5、避免使用嵌套的循環(huán)。
6、盡量不要使用JOIN進行多表連接。把一個表的數(shù)據(jù)先取到內(nèi)表,然后使用FOR ALL ENTRIES語句再進行抽取。
7、使用二分查找法。
READ TABLE的之前使用SORT TABLE BY對內(nèi)表進行排序, 然后使用READ TABLE WITH KEY ...BINARY SEARCH.
8、避免使用SELECT DISTINCT語句。在抽取數(shù)據(jù)到內(nèi)表后用DELETE ADJACENT DUPLICATES語句來消除重復(fù)行。
9、盡量加多WHERE語句進行條件抽取。
以上,說的還不全,會進行不斷更新。
另外,可以通過TCODE:ST05 SE30 進行程序和SQL語句性能和效率的分析
sap 在ABAP 中 MOVE ... TO 和 WRITE ... TO 的區(qū)別
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--關(guān)于Data Reference的使用---FIELD-SYMBOLS
Data References(只能指向abap定義的基本數(shù)據(jù)或者基本數(shù)據(jù)組合體)
1、定義數(shù)據(jù)參考變量(Data References)
DATA dref TYPE REF TO DATA.(指向任意類型,但在創(chuàng)建時必須指定對象類型)
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、動態(tài)創(chuàng)建數(shù)據(jù)參考的內(nèi)存空間(CREATE DATA)
CREATE DATA dref {TYPE type}|{LIKE dobj}這種語句創(chuàng)建的對象沒有名稱,只有地址變量指向該內(nèi)存變量;在申明參考變量時,未指定類型則必須加{TYPE type}|{LIKE dobj}說明。
有時需要動態(tài)創(chuàng)建動態(tài)類型數(shù)據(jù)對象,語法如下
CREATE DATA dref TYPE (name).
3、將數(shù)據(jù)地址賦值給數(shù)據(jù)參考變量(GET REFERENCE)
GET REFERENCE OF dobj INTO dref.
4、訪問數(shù)據(jù)參考變量指定的數(shù)據(jù)
訪問數(shù)據(jù)參考變量指定的數(shù)據(jù)有兩種情況:
- 對于使用DATA dref TYPE REF TO DATA_TYPE來聲明的數(shù)據(jù)參考變量,程序可以直接通過->*運算符直接訪問數(shù)據(jù);
代碼樣例
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.
- 對于使用DATA dref TYPE REF TO DATA來聲明的數(shù)據(jù)參考變量,程序如果要訪問數(shù)據(jù)參考變量指定的數(shù)據(jù),你首先要將數(shù)據(jù)參考變量賦值給一個字段符號(Field sysbol)(是不能直接通過數(shù)據(jù)參考變量來訪問的).如果數(shù)據(jù)參考變量為初始化狀態(tài), 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>.