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