Field-Symbols总结
生活随笔
收集整理的這篇文章主要介紹了
Field-Symbols总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Field-Symbols(以下簡稱FS)大致類似于C語言里的指針,主要作用是程序更加靈活,有時可以實現一般無法實現的功能(比如之前那篇關于動態內表的),合理使用FS還可以提高程序效率,但是FS也有缺點,影響程序可讀性,為修改和維護代碼造成困難,出錯隱蔽,而且很多錯誤都是編譯器檢查不出來的,只有運行時才會發生錯誤,提示內容也各種千奇百怪,不容易排查錯誤。
FS的定義類型大體分為變量和表,具體查閱SAP幫助,下面是FS的一些零散的心得和碰到的情況:
1,在使用FS前必須ASSIGN,不然會發生RUNTIME ERROR。
?
2, ASSIGN ‘200’ TO<FS1>.意思是指向常量的<FS1>,之后不可更改值(比如<FS1> = ‘300’),否則發生RUNTIME ERROR。
?
3,如果想實現2里類似的效果,那么需要ASSIGN一個變量給FS:
DATA V_ABC(20) TYPE C.
V_ABC = '200'.
ASSGIN V_ABC TO <FS1>.
<FS1> = '300'.
這時<FS1>就從200變更為300了,另外如果直接改變變量的值,那么<FS1>也會發生變化。
比如上例里V_ABC = '400',那么<FS1>也隨之變為400。
?
4, 假設定義了<FS1>和<FS2>兩個FS,分別ASSGIN到兩個變量,變量A和變量B。
ASSIGN <FS1> TO <FS2>的意思是,讓<FS2>同樣指向<FS1>所指向的地方,即變量A,執行完該語句后,兩個FS都指向變量A。而<FS2>= <FS1>的意思是,<FS2>所指向的變量B的值變成<FS1>所指向的變量A的值,<FS1>和<FS2>仍然是一個指向變量A,一個指向變量B。
?
5,如果LOOP時,LOOP AT IT_TAB ASSIGNING <WA_TAB>.,那么之后假如有REFRESH TABLE的操作的話,<WA_TAB>就再次回到初始未被ASSIGN的狀態,這時如果使用<WA_TAB>會RUNTIME ERROR。
?
6,LOOP和READ語句把TABLEASSIGN到工作區的一些寫法:
LOOP AT IT_TAB ASSIGNING <WA_TAB>.
READ TABLE IT_TAB ASSIGNING <WA_TAB>INDEX 1.
(注:LOOP AT IT_TAB INTO<WA_TAB>的寫法也是允許的,但是含義和ASSIGNING不同,如果之前循環過內表,這里再是INTO的話,讀到的數據是上次循環最后一行的數據,只有用ASSIGNING才能保證從內表第一行重新開始循環)。
其中<WA_TAB>有兩種定義法:
FIELD-SYMBOLS <WA_TAB> TYPE TY_TAB."結構
FIELD-SYMBOLS <WA_TAB> TYPE ANY.
前者是指定了結構了,后者是不指定結構。
?
之后在為<WA_TAB>賦值時,寫法有區別:
ASSIGN COMPONNET 'COL1' OF STUCTURE <WA_TAB>TO <FS1>
<FS> = 'ABC'."為<WA_TAB>里的COL1字段賦值ABC
此種寫法對有結構定義和沒有結構定義的<WA_TAB>都可行。
?但是有結構定義的<WA_TAB>可以直接使用<WA_TAB>-COL = 'ABC'來賦值。
一般如果知道結構的話,還是應該用TYPE結構的來定義FS。
<WA_TAB>嚴格說來不是工作區,和WA_TAB工作原理不同,這里只是為了閱讀方便才用WA前綴。
下面介紹下為什么<WA_TAB>要比工作區WA_TAB效率高:
內表寫數據到工作區時,系統會開辟額外的內存。也就是說,工作區只是內表里的數據的一個副本,操作這個副本并不會影響內表里的數據。在工作區數據量大時,建議使用FS,它是只是一個指針,指向內表數據,所以使用<WA_TAB>操作數據時,是直接操作內表里的數據(而不是像WA_TAB那樣是創建副本)。所以使用Field-Symbols比工作區效率更高。
?注意:由于Field-Symbols是直接操作內表里的數據,所以不需要像工作區那樣使用MODIFY語句,同理如果是CLEAR語句會直接清空內表里的數據,所以不能像使用工作區那樣每次LOOP結束就清空一次工作區。還有就是<WA_TAB>必須是定義結構型才能提高效率,如果是定義成TYPE ANY的FS,反而比普通的工作區寫法效率低。
FS的定義類型大體分為變量和表,具體查閱SAP幫助,下面是FS的一些零散的心得和碰到的情況:
1,在使用FS前必須ASSIGN,不然會發生RUNTIME ERROR。
?
2, ASSIGN ‘200’ TO<FS1>.意思是指向常量的<FS1>,之后不可更改值(比如<FS1> = ‘300’),否則發生RUNTIME ERROR。
?
3,如果想實現2里類似的效果,那么需要ASSIGN一個變量給FS:
DATA V_ABC(20) TYPE C.
V_ABC = '200'.
ASSGIN V_ABC TO <FS1>.
<FS1> = '300'.
這時<FS1>就從200變更為300了,另外如果直接改變變量的值,那么<FS1>也會發生變化。
比如上例里V_ABC = '400',那么<FS1>也隨之變為400。
?
4, 假設定義了<FS1>和<FS2>兩個FS,分別ASSGIN到兩個變量,變量A和變量B。
ASSIGN <FS1> TO <FS2>的意思是,讓<FS2>同樣指向<FS1>所指向的地方,即變量A,執行完該語句后,兩個FS都指向變量A。而<FS2>= <FS1>的意思是,<FS2>所指向的變量B的值變成<FS1>所指向的變量A的值,<FS1>和<FS2>仍然是一個指向變量A,一個指向變量B。
?
5,如果LOOP時,LOOP AT IT_TAB ASSIGNING <WA_TAB>.,那么之后假如有REFRESH TABLE的操作的話,<WA_TAB>就再次回到初始未被ASSIGN的狀態,這時如果使用<WA_TAB>會RUNTIME ERROR。
?
6,LOOP和READ語句把TABLEASSIGN到工作區的一些寫法:
LOOP AT IT_TAB ASSIGNING <WA_TAB>.
READ TABLE IT_TAB ASSIGNING <WA_TAB>INDEX 1.
(注:LOOP AT IT_TAB INTO<WA_TAB>的寫法也是允許的,但是含義和ASSIGNING不同,如果之前循環過內表,這里再是INTO的話,讀到的數據是上次循環最后一行的數據,只有用ASSIGNING才能保證從內表第一行重新開始循環)。
其中<WA_TAB>有兩種定義法:
FIELD-SYMBOLS <WA_TAB> TYPE TY_TAB."結構
FIELD-SYMBOLS <WA_TAB> TYPE ANY.
前者是指定了結構了,后者是不指定結構。
?
之后在為<WA_TAB>賦值時,寫法有區別:
ASSIGN COMPONNET 'COL1' OF STUCTURE <WA_TAB>TO <FS1>
<FS> = 'ABC'."為<WA_TAB>里的COL1字段賦值ABC
此種寫法對有結構定義和沒有結構定義的<WA_TAB>都可行。
?但是有結構定義的<WA_TAB>可以直接使用<WA_TAB>-COL = 'ABC'來賦值。
一般如果知道結構的話,還是應該用TYPE結構的來定義FS。
<WA_TAB>嚴格說來不是工作區,和WA_TAB工作原理不同,這里只是為了閱讀方便才用WA前綴。
下面介紹下為什么<WA_TAB>要比工作區WA_TAB效率高:
內表寫數據到工作區時,系統會開辟額外的內存。也就是說,工作區只是內表里的數據的一個副本,操作這個副本并不會影響內表里的數據。在工作區數據量大時,建議使用FS,它是只是一個指針,指向內表數據,所以使用<WA_TAB>操作數據時,是直接操作內表里的數據(而不是像WA_TAB那樣是創建副本)。所以使用Field-Symbols比工作區效率更高。
?注意:由于Field-Symbols是直接操作內表里的數據,所以不需要像工作區那樣使用MODIFY語句,同理如果是CLEAR語句會直接清空內表里的數據,所以不能像使用工作區那樣每次LOOP結束就清空一次工作區。還有就是<WA_TAB>必須是定義結構型才能提高效率,如果是定義成TYPE ANY的FS,反而比普通的工作區寫法效率低。
總結
以上是生活随笔為你收集整理的Field-Symbols总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABAP 查询性能提高之我见
- 下一篇: ABAP ALV检查单元格更新数据