轉載自:https://blog.csdn.net/champaignwolf/article/details/51208881
(一)定義
1 . FIELD-SYMBOLS: <fs> [<type>]為內部字段定義field-symbols .
當不輸入<type>時﹐<fs>繼承賦給它的變量的所有屬性
當輸入<type>時﹐賦給它的變量必須與<fs>同類型
例如﹕ (說明﹕用戶日期格式為dd.mm.yyyy)
FIELD-SYMBOLS: <f1> .
DATA: dat(8) VALUE '19950916' .
ASSIGN dat TO <f1> .
WRITE:/ <f1> .
<f1>繼承dat屬性﹐為C型﹐輸出為: 19950916
FIELD-SYMBOLS: <f1> TYPE d.
DATA: dat(8) VALUE '19950916' .
ASSIGN dat TO <f1> .
WRITE:/ <f1> .
<f1>類型為D型﹐而dat為C型﹐類型不匹配﹐出現語法錯誤
FIELD-SYMBOLS: <f1> TYPE d.
DATA: dat(8) VALUE '19950916' .
ASSIGN dat TO <f1> TYPE 'D' .
WRITE:/ <f1> .
<f1>類型為D型﹐而dat為C型﹐類型不匹配﹐但TYPE ‘D’是將dat類型轉換成D型再分配給<f1>
輸出為﹕16091995
2.定義結構化的field-symbols
FIELD-SYMBOLS: <fs> STRUCTURE <s> DEFAULT<f> .
首先將<f>指派給<fs> ,然后<fs>繼承結構<s>的屬性
注意點: a. <s>中不包涵類型為I或F字段時﹐<f>的定義長度>= <s>所有字段長度之和﹐否則語
法錯誤
b. <s>中包涵類型為I或F字段時﹐<f>最好為結構類型﹐且結構應該同與<s> ﹐否則容
易出錯
例如﹕
DATA: wa(100) VALUE '001LH 123419950627' .
DATA: BEGIN OF line1 ,
col1(6) TYPE c,
col2(4) TYPE c,
col3(8) TYPE c,
END OF line1.
FIELD-SYMBOLS: <f1> STRUCTURE sbook DEFAULT wa . “sbook為SAP現存結構
FIELD-SYMBOLS: <f2> STRUCTURE line1 DEFAULT wa .
WRITE:/ <f1>-mandt, <f1>-carrid, <f1>-connid,<f1>-fldate .
WRITE:/ <f2>-col1, <f2>-col2, <f2>-col3 .
輸出結果﹕ 001 LH 1234 27.06.1995
001LH 1234 19950627
如果下列代碼就會出錯﹕ (原因wa沒有line1長)
DATA: wa(17) VALUE '001LH 123419950627' .
DATA: BEGIN OF line1 ,
col1(6) TYPE c,
col2(4) TYPE c,
col3(8) TYPE c,
END OF line1.
FIELD-SYMBOLS: <f2> STRUCTURE line1 DEFAULT wa .
結構中含有I, F類型的結構例如﹕
DATA: BEGIN OF line1 ,
col1 TYPE i,
col2(4) TYPE c,
END OF line1.
DATA: BEGIN OF line2,
col1 TYPE i,
col2(4) TYPE c ,
END OF line2 .
line2-col1 = 8 . line2-col2 = 'test' .
FIELD-SYMBOLS: <f2> STRUCTURE line1 DEFAULT line2 .
WRITE:/ <f2>-col1, <f2>-col2 .
輸出結果﹕ 8 test
如果如下則錯誤(因為line2長度< line1 )
DATA: BEGIN OF line1 ,
col1 TYPE i,
col2(5) TYPE c,
END OF line1.
DATA: BEGIN OF line2,
col1 TYPE i,
col2(4) TYPE c ,
END OF line2 .
line2-col1 = 8 . line2-col2 = 'test' .
FIELD-SYMBOLS: <f2> STRUCTURE line1 DEFAULT line2 .
WRITE:/ <f2>-col1, <f2>-col2 .
(二) ASSIGN的用法﹕
1.靜態分配
a.無偏移量
ASSIGN <f> TO <fs>
例如﹕
FIELD-SYMBOLS: <f1> .
FIELD-SYMBOLS: <f2> TYPE i .
DATA: txt(20) TYPE c VALUE 'Hello, How are you?'.
DATA: num TYPE i VALUE 5 .
ASSIGN txt TO <f1> .
ASSIGN num TO <f2> .
DESCRIBE FIELD <f1> LENGTH <f2>.
WRITE:/ <f1> , 'has length', <f2> .
輸出結果﹕Hello, How are you? has length 20
如下代碼將出錯(原因<f2>沒有指向任何內存地址)
FIELD-SYMBOLS: <f1> .
FIELD-SYMBOLS: <f2> TYPE i .
DATA: txt(20) TYPE c VALUE 'Hello, How are you?'.
DATA: num TYPE i VALUE 5 .
ASSIGN txt TO <f1> .
*ASSIGN num TO <f2> .
DESCRIBE FIELD <f1> LENGTH <f2>.
WRITE:/ <f1> , 'has length', <f2> .
b.有偏移量
ASSIGN <f>[+<o>][(<l>)] TO <fs>
說明﹕(1). <o>和<l>都可以是變量
(2).系統不會判斷所選擇的部分是否在<f>內部,偏移量<o>和長度<l>都可以比
<f>的長度大,寫地址時﹐可以超出<f>的的限制﹐但不能超過定義的內存區
(3).如果沒有指定長度<l> ,系統默認為<f>的長度
(4).如果<o>小於<f>的長度﹐可以通過為<l>指定一個‘*’來阻止<fs>參
照<f>限制之外的區域
例如﹕
FIELD-SYMBOLS: <f1> .
DATA: BEGIN OF line1,
col1(10) VALUE'0123456789',
col2(10) VALUE'abedefghij',
END OF line1.
WRITE:/ line1-col1+5.
ASSIGN line1-col1+5 TO <f1> .
WRITE:/ <f1> .
ASSIGN line1-col1+5(*) TO <f1> .
WRITE:/ <f1> .
輸出結果﹕56789
56789abede
56789
在內存地址分配時﹐和容易造成內存中的數據更改問題﹐例如﹕
FIELD-SYMBOLS: <f1>, <f2> .
DATA: BEGIN OF line ,
a VALUE '1', b VALUE '2',
c VALUE '3', d VALUE '4',
e VALUE '5', f VALUE '6',
g VALUE '7', h VALUE '8',
END OF line .
DATA: off TYPE i .
DATA: len TYPE i VALUE 2 .
ASSIGN line TO <f2> .
WRITE:/ <f2> .
DO 2 TIMES .
off = sy-index * 3 .
ASSIGN line-a+off(1) TO <f1> .
<f1> = 'XX'.
ENDDO .
ASSIGN line TO <f2> .
WRITE:/ <f2> .
輸出結果為﹕12345678
123X56X8
可以看出在把<f1>的地址指向line時﹐<f1> = ‘XX’時就更改了<f>所指定的內存中的值
2.動態分配(不是萬不得以﹐不要使用這種方式,因其找<f>非常容易出錯)
a. ASSIGN (<f>) TO <fs>
說明﹕ 1.如果分配是在子程序或功能模塊中執行﹐程序將在局部的子程序或功能模塊中搜索字
段<f>
2.如果分配是在子程序或功能模塊之外執行,或未找到字段<f>,程序在全局變量中搜索
字段<f>
3.如在全局變量中都未找到字段<f>,則在工作程序Tables處聲明的工作區中尋找
注意﹕如果找到<f> ,則SY-SUBRC = 0 ,否則SY-SUBRC = 4
例如﹕
主程序Report1 .
REPORT1 .
TABLES : SBOOK .
SBOOK-FLDATE = ‘20031219’ .
PERFORM fomr1(Report2) .
子程序Report2 .
REPORT2 .
FORM form1 .
PERFORM form2(Report3) .
ENDFORM .
字程序Report3 .
REPORT3.
FORM form2 .
DATA: name(20) TYPE CVALUE ‘SBOOK-FLDATE’ .
FIELD-SYMBOLS <f1>.
ASSIGN (name) to<f1> .
IF SY-SUBRC = 0 .
WRITE:/ <f1> .
ENDIF .
ENDFORM .
輸出結果﹕19.12.2003
說明﹕子程序Report3中引用了主程序的工作取區域的字段fldate,如果用靜態Assign來無法實現﹐因為在子程序Report3無SBOOK-FLDATE ,語法檢查會出現錯誤
b.表工作區的動態分配
ASSIGN TABLE FIELD (<f>) TO <fs>
把主程序Tables處聲明的工作區域指派給<fs>
例如﹕
TABLES : sbook .
DATA: name1(20) VALUE 'SBOOK-FLDATE' .
DATA: name2(20) VALUE 'name1' .
FIELD-SYMBOLS : <f1> .
ASSIGN TABLE FIELD (name1) TO <f1> .
WRITE:/ 'sy-subrc' , sy-subrc .
ASSIGN TABLE FIELD (name2) TO <f1> .
WRITE:/ 'sy-subrc' , sy-subrc .
輸出結果﹕ sy-subrc 0
sy-subrc 4
3.將字段符號分配給其他字段符號
ASSIGN<f1>[+<O>][(<l>)] TO <f2> .
等同與下列動態分配
ASSING TABLE FIELD(<f>) TO <f2> .
其中<f>包含字段符號<f1>的名稱
說明﹕<f2>與<f1>可以是同一個字段符號
例如﹕
DATA: BEGIN OF line1 ,
a VALUE '1', b VALUE '2',
c VALUE '3', d VALUE '4',
e VALUE '5', f VALUE '6',
g VALUE '7', h VALUE '8',
END OF line1 .
DATA: off TYPE i .
FIELD-SYMBOLS : <f1> .
ASSIGN line1-a TO <f1> .
DO 4 TIMES .
off = sy-index - 1 .
ASSIGN <f1>+off(1) TO <f1> .
WRITE: <f1> .
ENDDO .
輸出結果﹕ 1 2 4 7
分析﹕
首先<f1>指向line1-a地址
循環中﹕
off = 0時, <f1>à+0(1) <f1> , <f1>指向line1-a地址值為﹕1
off = 1時, <f1>à+1(1) <f1> , <f1>指向line1-b地址值為﹕2
off = 2時, <f1>à+2(1) <f1> , <f1>指向line1-d地址值為﹕4
off = 3時, <f1>à+2(1) <f1> , <f1>指向line1-g地址值為﹕7
4.分配字段串組件
ASSIGN COMPONENT <comp> OF STRUCTURE<s> TO <fs> .
系統將字符串<s>的組件<comp>賦給字段符號<fs> ,可以指定<comp>為文字或變量
例如﹕
DATA: BEGIN OF line1,
col1 TYPE i VALUE '11',
col2 TYPE i VALUE '22',
col3 TYPE i VALUE '33',
END OF line1.
DATA: comp(10) TYPE c VALUE 'col3' .
FIELD-SYMBOLS : <f1>, <f2>, <f3> .
ASSIGN line1 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> .
輸出結果﹕ 11 22 33
33
(三) .定義字段符號的格式
1.定義字段符號的類型
ASSIGN …. TO <fs> TYPE<t> .
說明﹕a.如果<fs>沒有定義類型﹐則<fs>不繼承賦給它的變量的類型與長度﹐而類型為<t>
b.如果<fs>定義了類型﹐則系統將賦給它的變量的類型轉換成<t>在給<fs>,此時
注意類型轉化的可兼容性
例如﹕
DATA: text(8) TYPE c VALUE '20031221' .
DATA: t_type .
DATA: t_len TYPE i .
FIELD-SYMBOLS : <f1> .
ASSIGN text TO <f1> .
WRITE:/ <f1> .
DESCRIBE FIELD <f1> TYPE t_type
LENGTH t_len .
WRITE: t_type , t_len .
ASSIGN text TO <f1> TYPE 'D' .
WRITE:/ <f1> .
DESCRIBE FIELD <f1> TYPE t_type
LENGTH t_len .
WRITE: t_type , t_len .
輸出結果﹕20031221 C 8
21122003 D 8
2.更改字段符號的小數位
ASSIGN …. TO <fs> DECIMALS <d> .
說明﹕<fs>的小數位為<d>位﹐這會導致字段符號的值與指派的變量的值不同。
<d>可以是變量或常量﹐如果<d>不在0和14之間﹐或者指派的變量的類型不是P
型﹐將導致程序運行錯誤
例如﹕
DATA: pack1 TYPE p DECIMALS 2 VALUE '400' .
DATA: pack2 TYPE p DECIMALS 2 .
DATA: pack3 TYPE p DECIMALS 2 .
FIELD-SYMBOLS: <f1> , <f2> .
WRITE:/1(8) 'Pack1', pack1 .
ASSIGN pack1 TO <f1> DECIMALS 1 .
WRITE:/1(8) '<f1>', <f1> .
pack2 = <f1> .
WRITE:/1(8) 'Pack2', pack2 .
ASSIGN pack2 TO <f2> DECIMALS 4 .
WRITE:/1(8) '<f2>', <f2> .
pack3 = <f1> + <f2> .
WRITE:/1(8) 'Pack3', pack3 .
<f2> = '1234.56779' .
WRITE:/1(8) '<f2>', <f2> .
WRITE:/1(8) 'Pack2', pack2 .
輸出結果﹕
Pack1 400.00
<f1> 4,000.0
Pack2 4,000.00
<f2> 40.0000
Pack3 4,040.00
<f2> 1,234.5678
Pack2 123,456.78
(四) .運行檢查﹐防止取指派變量定義取之外的數據
注意點﹕1.對於內表﹐存儲區的大小由記錄的行數的多少﹐這種表行數不固定﹐運行時存儲區動態分配,
容易造成取存儲區之外的數據﹐應該注意
2.對於DATA定義的變量﹐存儲區固定﹐注意不要取存儲區之外的數據
例如﹕
DATA: BEGIN OF line1 ,
col1(4) TYPE c VALUE '1234',
col2(2) TYPE c VALUE '56',
END OF line1 .
DATA: text1(1) TYPE c VALUE 'a' .
DATA: text2(2) TYPE c VALUE 'bc' .
DATA: text3(3) TYPE c VALUE 'def'.
FIELD-SYMBOLS : <f1> .
DO 6 TIMES .
ASSIGN text1+sy-index(1) TO <f1> .
WRITE: <f1> .
ENDDO.
程序運行錯誤,因為在循環中超出存儲區域的范圍