數據轉換規則:
可以將基本數據類型的源字段內容賦給其它基本數據類型的目標字段(除了數據類型 D 無法賦給數據類型 T,反之亦然)。ABAP/4 也支持結構化數據和基本數據對象之間或結構不同的數據對象之間的賦值。
對於每一賦值語句(用 MOVE 或賦值運算符),系統都檢查源字段和目標字段的數據類型。如果定義了此類組合的類型轉換,則將源字段內容轉換為目標字段數據類型並將其值賦給目標字段。
總是按處理無小數位的類型 P 的相同方式處理類型 I。所以,下面表格中提到類型 P 時,同樣適用於類型 I 字段。
注意:此表僅只適用於賦值時類型的轉換(包括實參傳遞給形參?),如果是比較的邏輯運算,請參考比較轉換規則,其他如Write、字段符號都不會按此規則表進行轉換。
附錄C數據轉換規則 | |||||||||||||
源類型 | 目標類型 | 轉換規則 | |||||||||||
C | C | 左對齊將源中的字符傳輸到目標字段中,如長度不同,則用空格從右邊開始進行填充(短於目標時),則在右邊將其內容截斷(長於目標時)。注:源中的尾部空格不會被傳輸到目標字段中 |
|||||||||||
C | D | 源字段頭8個字符傳輸到目標字段中。為了日期有效,頭8個字符應包含格式為YYYYMMDD的8個數字字符日期,但實質每位可以是任意字符,轉換時不會出錯,並且會原樣傳輸到目標字段中 | |||||||||||
C | F | 源字段內容必須是類型F字段的有效表示。 先將源字段格式化為 <±尾數部分>E±<指數部分(至少占兩位)> ,尾數部分為整數只有一位的小數格式,如果尾數部分的小數位大小於16位,第17位會四舍五入截斷 如果源全為空格,或者空格后面緊跟着非F類型所包含的合法字符時,則轉換結果為0;如是有前導空格,但后面緊跟着的是合法的F格式字符,則還是會正確轉換;如果含有的全是F格式合法字符,且中間含有空格時,空格后面所有合法的字符也不再被解析;如果不是以空格開頭,且又含有非法字符,則運行時會拋出異常。 DATA: c(30) VALUE '123.012345678901274567', f TYPE f." 1.2301234567890127E+02 注:空格字符為F格式的合法字符,且空格后緊跟着的所有字符都會被忽略不處理,所以空格后面緊跟着的其他非法字符也是沒有問題的,比如 ' 1 a'就可以合法轉換,但 ' 1a' 運行時就會拋出異常 |
|||||||||||
C | N | 將源字段中的所有數字傳輸到目標字段中,並且是右對齊的方式。 如果目標字段過長,則會使用0來填充左邊;如果目標字段過短,則左邊多余的會截斷 |
|||||||||||
C | I、P | 所有能轉換的字符組成的結果不能超出I的取值范圍(-2147483648~+2147483647),否則會拋出異常。 不能大於目標P所定義的長度,比如下面代碼中,p最大只能為 999 ,如果再多一位,則運行時就會拋出異常 DATA: c(3) VALUE '999', p(2) TYPE p . 如果源全為空格,則轉換結果為0;如是有前導空格,但后面緊跟着的是合法的I/P格式字符,則還是會正確轉換; 與 C→F不同的是,' 1 2' 類似的串運行時會拋異常,也就是說,在源串中,空格只能為前導,而不能出現在中間,即使所有的字符都是I/P格式合法字符。 |
|||||||||||
C | T | 源字段應包含格式為HHMMSS的6個數字字符時間。其他規則與 C→D是一樣的 | |||||||||||
C | X | 源字段應包含十六進制字符串格式,有效字符為0、1、2、3、4、5、6、7、8、9、A、B、C、D、E和F(注:字母都是大寫,小寫是無效的)。該字符串被視為十六進制數,左對齊傳送,並且右邊用零填充或截斷。轉換時,會從左到右來讀取源中的所有合法的十六進制字符,如果一旦遇到一個不會合法的十六進制字符時,會立即終止讀取,並且從這個非法字符到最后所有字符都會使用0來代替(另:不足目標長度時也會補0): DATA: c(6) VALUE 'bBAAaa' , x(3) TYPE x. x = c. WRITE: x."000000 c = 'BBAAaa'. x = c. WRITE: x."BBAA00 |
|||||||||||
C | String | 以左對齊的方式將源字段中的字符傳輸到目標字段中,但不包括尾部空格。目標的長度由傳輸的字符個數來決定 | |||||||||||
C | XString | C→X規則也適用。 如果源中能轉換的字符個數是奇數,則會在目標串的最后補一個0 |
|||||||||||
D | C | 參考 C→C |
|||||||||||
D | D | 未轉換傳送 | |||||||||||
D | F | 如果源字段為合法的 YYYYMMDD 的格式,則會使用該日期與 0001.01.01 日期相減,會得到一個數,這個數會存儲到目標字段中;否則如果為非法日期格式,則結果為0 | |||||||||||
D | N | 左對齊將源中的所有字符(不管是否是合法數字字符)都會被傳輸到目標字段中,如果目標字段過長,則會使用0來填充,如果過短,是會截斷源的右邊字符。 在傳輸過程中,源的尾部空格也會被傳輸到目標字段中。 |
|||||||||||
D | I、P | 如果源字段為合法的 YYYYMMDD 的格式,則會使用該日期與 0001.01.01 日期相減,會得到一個數,這個數會存儲到目標字段中;否則如果為非法日期格式,則結果為0。 另外,如果目標字段為P類型,源結果如果太大運行時會拋異常 |
|||||||||||
D | T | 不支持該類型間轉換,將導致語法檢查錯誤信息或運行時錯誤 | |||||||||||
D | X |
先D→I,再I→X | |||||||||||
D | String | 參考C→String | |||||||||||
D | XString | 先D→I,再I→Xstring | |||||||||||
F | C | 先將源字段轉換為<±尾數部分>E±<指數部分(至少占兩位)>的格式,然后右對齊傳送給C類型字段。 轉換后的尾數小數格式(其小數的整數部分只有一位)取值范圍為(-10,-1]、0、[1,10)(區間包括小數) 在轉尾數部分時,被截部分會使用四舍五入法進行取舍 當F為正數時,尾數部分的正數會自動忽略,但指數總是帶符號的 目標字段長度至少應為5字節(當F為0時)或者是6字節(當F非0時) 如果目標字段長度小於最小長度(5或者6字節時),則目標字段結果使用*填充 如果F轉尾數部分后,尾數部分的小數位最多不能超過16位(如果多余16位,第17位及后面的會以四舍五入方式截斷),且不足時補0,如果目標字段長度超過22字節(F為正時)或23字節(F為負時)時,左邊會補空格 DATA: f VALUE '-0.0' TYPE f,c(5)."0E+00 DATA: f VALUE '-0.155' TYPE f,c(5)."***** DATA: f VALUE '-0.155' TYPE f,c(6)."-2E-01 DATA: f VALUE '-0.155' TYPE f,c(7)." -2E-01 DATA: f VALUE '-0.155' TYPE f,c(8)."-1.6E-01 DATA: f VALUE '-0.155' TYPE f,c(9)."-1.55E-01 DATA: f VALUE '-0.155' TYPE f,c(10)."-1.550E-01 DATA: f VALUE '-0.155' TYPE f,c(24)." -1.5500000000000000E-01 |
|||||||||||
F | D | 先F→I,再I→D | |||||||||||
F | F | 未轉換傳送 | |||||||||||
F | N | 先將源字段F通過四舍五入的方式轉換為最接近的整數,然后以右對齊的方式將F轉換整數的絕對值傳輸到目標字段中。如果目標字段過長,則會使用0填充左邊,如果過短,則會將左邊截斷。 | |||||||||||
F | I | 先將源字段F通過四舍五入的方式轉換為最接近的整數,然后存儲到目標字段中。如果超過目標字段的取值范圍,則運行時會拋異常 | |||||||||||
F | P | 將源字段F以四舍五入的方式轉換為P類型的數據。但不能超出P的取值范圍,否則運行時會拋異常 | |||||||||||
F | T | 先F→I,再I→T | |||||||||||
F | X | 先F→I,再I→X | |||||||||||
F | String | 參考F→C。轉換后目標字段的長度為22(為正數時)、23(為負數時) | |||||||||||
F | XString | 先F→I,再I→XString | |||||||||||
N | C | 參看 C→C |
|||||||||||
N | D | 參看 C→D | |||||||||||
N | F | 參看 C→F | |||||||||||
N | N | 右對齊傳送(包括局部空格),並在左邊用0填充或截斷 | |||||||||||
N | I、P | 分別參看 C→I或者 C→P | |||||||||||
N | T | 參看 C→T | |||||||||||
N | X | 先N→I,再I→X | |||||||||||
N | String | 參看 C→String | |||||||||||
N | XString | 先N→I,再I→XString | |||||||||||
P | C | 右對齊方式傳輸。當P為負數時,最后一位必為減號“-”;當P為正數且C足夠長時,最后一位可以是空格,如果不夠,則不會有這個空格。 如果目標字段過長,左邊會補空格,如果過短,左邊會被截斷,且此時第一位用一個星號*表示。 注:不管目標字段固定長度有多長,也不會千分位分隔符出現 DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(1)."* DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(5)."*4567 DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(6)."*.4567 DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(7)."*3.4567 DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(8)."123.4567 DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(9)."123.4567 DATA: p(4) TYPE p DECIMALS 4 VALUE '123.4567',c(10)."123.4567 DATA: p(4) TYPE p DECIMALS 4 VALUE '-123.4567',c(2)."*- DATA: p(4) TYPE p DECIMALS 4 VALUE '-123.4567',c(3)."*7- DATA: p(4) TYPE p DECIMALS 4 VALUE '-123.4567',c(9)."123.4567- DATA: p(4) TYPE p DECIMALS 4 VALUE '-123.4567',c(10)."123.4567- |
|||||||||||
P | D | P→I,I→D | |||||||||||
P | F | 先將P格式化成 <±尾數部分>E±<指數部分> 格式的F,再對尾數部分的小數部分的第17位(如果小數位足夠17位時情況下,沒有就補0至16位)四舍五入 DATA: p(16) TYPE p DECIMALS 14 VALUE '-10000.0123456781235',f TYPE f." -1.0000012345678124E+04 DATA: p(16) TYPE p DECIMALS 14 VALUE '10000.0123456781235',f TYPE f." 1.0000012345678124E+0 DATA: p(16) TYPE p DECIMALS 14 VALUE '-1.01234567890123',f TYPE f." -1.0123456789012300E+00 |
|||||||||||
P | N | 四舍五入將P轉換為整數,然后將其絕對值右對齊傳輸到目標中。不夠時左邊補0,超長時截斷左邊。 | |||||||||||
P | I | 四舍五入將P轉換為整數,然后存儲到目標字段中。如果超過I取值范圍,則拋異常 | |||||||||||
P | P | 四舍五入將源字段小數部分格式化成目標字段的小數部分,然后存儲到目標字段中。如果超出目標字段的取值范圍,則運行時拋異常 DATA: p(4) TYPE p VALUE '12.34567' DECIMALS 5,p2(4) TYPE p DECIMALS 4."12.3457 |
|||||||||||
P | T | 先P→I,再I→T | |||||||||||
P | X | 先P→I,再I→X | |||||||||||
P | String | 右對齊方式傳輸。當P為負數時,最后一位必為減號“-”;當P為正數時,最后一位是空格。轉換時不帶千分位分隔符 | |||||||||||
P | XString | 先P→I,再I→Xstring | |||||||||||
T | C | 參考 C→C | |||||||||||
T | D | 不支持該類型間轉換,將導致語法檢查錯誤信息或運行時錯誤 | |||||||||||
T | F | 如果源字段T只包括數字(不會驗證其有效性,如256060都可以),則會按着 hhmmss 格式求秒數:hh*3600+mm*60+ss ,再將結果存儲到目標字段中。 如果源字段T只包括了其他非數字,則結果為0。 DATA: t TYPE t VALUE '256060',f TYPE f." 9.3660000000000000E+04 |
|||||||||||
T | N | 將源字段左對齊傳輸到目標字段中,包括空格。如果目標過長,則右邊補0,如果過短,右邊會被截斷 | |||||||||||
T | I | 如果源字段T只包括數字(不會驗證其有效性,如256060都可以),則會按着 hhmmss 格式求秒數:hh*3600+mm*60+ss ,再將結果存儲到目標字段中。 如果源字段T只包括了其他非數字,則結果為0。 |
|||||||||||
T | P | 如果源字段T只包括數字(不會驗證其有效性,如256060都可以),則會按着 hhmmss 格式求秒數:hh*3600+mm*60+ss ,再將結果存儲到目標字段中。 如果源字段T只包括了其他非數字,則結果為0。 如果超過目標字段大小,則運行時會拋異常 |
|||||||||||
T | T | 不會發生轉換 | |||||||||||
T | X | 先T→I,再I→X | |||||||||||
T | String | 參考C→String | |||||||||||
T | XString | 先T→I,再I→XString | |||||||||||
X | C | 將源字段中每4位轉換成十六進制的字符 0~9、A~F,然后左對齊傳輸到目標字段中。如果目標字段過長,則右邊補空格,如果過短,則右邊會被截斷 | |||||||||||
X | D | X→I,I→D | |||||||||||
X | F | X→I,I→F | |||||||||||
X | N | X→I,I→N | |||||||||||
X | I | 只是將源字段中最后4個字節轉換為整數,如果源不足4字節,則左邊會補十六進制0到4字節后再進行轉換。 源的取值可以是:"00000000" to "7FFFFFFF" ,即 0~+2 147 483 647,"80000000" to "FFFFFFFF",即 -1~-2 147 483 648 DATA: x(1) TYPE x VALUE '10',i TYPE i."16 |
|||||||||||
X | P | X→I,I→P | |||||||||||
X | T | X→I,I→T | |||||||||||
X | X | 左對齊傳送,如有必要,右邊用X'00'進行填充或截斷 | |||||||||||
X | String | 將源字段中每4位轉換成十六進制的字符 0~9、A~F,然后左對齊傳輸到目標字段中。傳輸的字符數決定了目標字段的長度 | |||||||||||
X | XString | 左對齊傳送。傳輸的字符數決定了目標字段的長度 | |||||||||||
I | C | 右對齊方式傳輸(不包括千分位符號)。當I為負數時,最后一位必為減號“-”;當I為正數且C足夠長時,最后一位可以是空格,如果不夠,則不會有這個空格。 如果目標字段過長,左邊會補空格,如果過短,左邊會被截斷,且此時第一位用一個星號*表示。 DATA: i TYPE i VALUE '123',c(1)."* DATA: i TYPE i VALUE '123',c(2)."*3 DATA: i TYPE i VALUE '123',c(3)."123 DATA: i TYPE i VALUE '123',c(4)."123 DATA: i TYPE i VALUE '123',c(5)." 123 DATA: i TYPE i VALUE '-123',c(2)."*- DATA: i TYPE i VALUE '-123',c(3)."*3- DATA: i TYPE i VALUE '-123',c(5)." 123- |
|||||||||||
I | D | 此時I的取值范圍只能為1 ~ 3652060,如果超過此范圍,則D會以0來填充。如果I有效,則會從0001.01.01日期加上這個天數,則會將得到日期存儲到D中 | |||||||||||
I | F | 將源字段以F類型格式化后存儲到目標字段中 | |||||||||||
I | N | 右對齊將源字段的絕對值傳輸到目標字段中。如果目標字段過長,則在左邊補0,如果過短,則將左邊截斷 |
|||||||||||
I | I | 不會發生類型轉換 | |||||||||||
I | P | 將源以P類型格式化后存入目標字段中。如果源字段大小超出了目標取值范圍,則運行時拋出異常 | |||||||||||
I | T | 以I以除86400的余數來表示從午夜00:00:00所經歷的秒數,從而轉換成相應的時間點后存儲到T中。 DATA: i TYPE i VALUE '1',t TYPE t."000001 DATA: i TYPE i VALUE '3601',t TYPE t."010001 DATA: i TYPE i VALUE '86399',t type t."235959 DATA: i TYPE i VALUE '86400',t type t."000000 DATA: i TYPE i VALUE '86401',t type t."000001除以86400后得余數1,以1來計算時間點 |
|||||||||||
I | X | 將I的4個字節以高字節序(即人的閱讀習慣順序,程序中的賦值方式只能是高字節序方式)轉換為十六進制后,以右對齊方式存儲到X字段中。如果X過長,則左邊使用十六進制0來填充,如果太短,則會截斷左邊 | |||||||||||
I | String | 右對齊方式傳輸(不包括千分位符號)。當I為負數時,最后一位為減號“-”;當I為正數時(包括0),最后一位是空格。 | |||||||||||
I | XString | 將I的4個字節以高字節序(即人的閱讀習慣順序,程序中的賦值方式只能是高字節序方式)轉換為十六進制后存儲到X字段中 如果I為負數,則目標長度為8。如果I為正數,則目標長度可能為2、4、6、8 DATA: i TYPE i VALUE '0',xstr TYPE xstring."00 DATA: i TYPE i VALUE '1',xstr TYPE xstring."01 DATA: i TYPE i VALUE '256',xstr TYPE xstring."0100 DATA: i TYPE i VALUE '65536',xstr TYPE xstring."010000 DATA: i TYPE i VALUE '16777216',xstr TYPE xstring."01000000 DATA: i TYPE i VALUE '-1',xstr TYPE xstring."FFFFFFFF DATA: i TYPE i VALUE '-256',xstr TYPE xstring."FFFFFF00 DATA: i TYPE i VALUE '-65536',xstr TYPE xstring."FFFF0000 DATA: i TYPE i VALUE '-16777216',xstr TYPE xstring."FF000000 |
|||||||||||
String | C | 參考C→C,與此規則不同的是,源字段的尾部空格也會被傳輸到目標字段中。如果源字段的長度為0,則目標字段為會使用空格來填充 | |||||||||||
String | D | 參考C→D,與此規則不同的是,源字段的尾部空格也會被傳輸到目標字段中。如果源字段的長度為0,則目標字段為會使用0來填充 | |||||||||||
String | F | 參考C→F,並且,如果源字段的長度為0,則結果也為0 | |||||||||||
String | N | 參考C→N,源字段的尾部空格也會被傳輸到目標字段中。如果源字段的長度為0,則目標字段為會使用0來填充 | |||||||||||
String | I | 參考C→I,並且,如果源字段的長度為0,則結果也為0 | |||||||||||
String | P | 參考C→P,並且,如果源字段的長度為0,則結果也為0 | |||||||||||
String | T | 參考C→T,並且源字段的尾部空格也會被傳輸到目標字段中。如果源字段的長度為0,則目標字段為會使用0來填充 |
|||||||||||
String | X | 參考C→X,如果源字段長度為0,則會使用十六進制的0來填充目標字段 | |||||||||||
String | String | 不會發生轉換。只是目標字段會重新指向源字段字符串 | |||||||||||
String | XString | 參考C→XString。如果源字段長度為0,則目標字段的長度也會是0 | |||||||||||
XString | C | 參考X→C。如果源字段的長度為0,則目標字段為會使用空格來填充 | |||||||||||
XString | D | 參考X→D。如果源字段的長度為0,則目標字段為會使用0來填充 | |||||||||||
XString | F | 參考X→F,並且,如果源字段的長度為0,則結果也為0 | |||||||||||
XString | N | 參考X→N,源字段的尾部空格也會被傳輸到目標字段中。如果源字段的長度為0,則目標字段為會使用0來填充 | |||||||||||
XString | I | 參考X→I,並且,如果源字段的長度為0,則結果也為0 | |||||||||||
XString | P | 參考X→P,並且,如果源字段的長度為0,則結果也為0 | |||||||||||
XString | T | 參考X→T。如果源字段的長度為0,則目標字段為會使用0來填充 | |||||||||||
XString | X | 參考X→X,如果源字段長度為0,則會使用十六進制的0來填充目標字段 | |||||||||||
XString | String | 參考X→String。如果源字段長度為0,則目標字段的長度也會是0 | |||||||||||
XString | XString | 參考X→XString。如果源字段長度為0,則目標字段的長度也會是0 |