数据转换规则:

可以将基本数据类型的源字段内容赋给其它基本数据类型的目标字段(除了数据类型 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

ABAP数据转换规则的更多相关文章

  1. C语言中不同类型的数据转换规则

    不同类型数据间的混合运算与类型转换 1.自动类型转换 在C语言中,自动类型转换遵循以下规则: ①若参与运算量的类型不同,则先转换成同一类型,然后进行运算 ②转换按数据长度增加的方向进行,以保证精度不降 ...

  2. ABAP锁、数据库锁

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  3. ABAP锁,数据库锁

    原文出自 江正军 技术博客,博客链接:www.cnblogs.com/jiangzhengjun ABAP数据锁定 SM12锁查看与维护 通用加锁与解锁函数 ABAP程序锁定 数据库锁 锁的分类和兼容 ...

  4. ABAP,Java和JavaScript的序列化,反序列化

    ABAP 1. ABAP提供了一个工具类cl_proxy_xml_transform,通过它的两个方法abap_to_xml_xstring和xml_xstring_to_abap实现两种格式的互换. ...

  5. ABAP和XML数据格式互相转换的两种方式

    ABAP和XML数据格式互相转换是广大开发人员经常遇到的需求.本文介绍两种方式. 1. ABAP提供了一个工具类cl_proxy_xml_transform,通过它的两个方法abap_to_xml_x ...

  6. ABAP里SELECT的用法汇总(转)

    通常使用Open SQL的数据查询语句SELECT将数据库条目选择到内存.一.SELECT语句:1)SELECT用于确定读取数据表中的哪些字段:2)FROM子句用于确定从哪些内表或者视图中读取数据:3 ...

  7. SAP导出内表数据到excel

    DATA: EXCEL    TYPE OLE2_OBJECT,      SHEET    TYPE OLE2_OBJECT,      CELL     TYPE OLE2_OBJECT,     ...

  8. 如何将DynamoDB的数据增量迁移到表格存储

    Amazon DynamoDB是一个完全托管的NoSQL数据库服务,可以提供快速的.可预期的性能,并且可以实现无缝扩展.由于DynamoDB并可以根据实际需求对表进行扩展和收缩,这个过程既不需要停止对 ...

  9. ABAP基础2:数据类型

    数据类型-Data Type:定义程序中可以使用的数据类型,使用前要先定义 数据变量-Data Variable:参照数据类型定义的.可以存储值的变量,就是变量嘛 数据类型 数据类型在ABAP程序中用 ...

随机推荐

  1. 如何让Surface RT支持网站的flash

    Go to the desktop version of IE10, hit the click ALT button on your keyboard, click on and then Comp ...

  2. SpringMVC之三:配置Spring MVC Controller

    一.Controller配置方式 第一种 URL对应Bean如果要使用此类配置方式,需要在XML中做如下样式配置 以上配置,访问/hello.do就会寻找ID为/hello.do的Bean,此类方式仅 ...

  3. 用Pyinstaller把Python3.7程序打包成可执行文件exe

    1.通过pip3 install pyinstaller 安装成功 2.然后执行命令,首先:需要切换到程序所在的目录 执行命令 pyinstaller -F -w <文件名.py>,-F代 ...

  4. complexType

    //decltype的表达式如果是加上括号的变量,结果将是引用 decltype((variable)) ruiy; //此变量的数据类型是引用(但此处变量的申明语句是错误的,引用不是对象,指向的对象 ...

  5. ENFP喜欢的职业

    外向(E)+直觉(N)+情感(F)+知觉(P). 1. 设计:设计本身很能满足ENFP对工作的各种要求,但是有个附加条件就是,这份工作不能让ENFP长时间的一个人工作,没机会和别人交流,也就是说有一个 ...

  6. POJ 2348 Euclid's Game (博弈)

    题意:给定两个整数,两个人轮流操作,每次可以用较大数减去较小数的整数倍,当一个数变成0时,则结束,问谁会胜. 析:很明显如果 a == b 那么就可以直接结束了,那么如果 a > b我们可以交换 ...

  7. HTML5学习笔记(三)新属性、功能

    HTML5 拖放 1.元素的 draggable 属性设置为 true 2.ondragstart 属性调用函数,函数中dataTransfer.setData() 方法设置被拖数据的数据类型和值 3 ...

  8. JQ 获取ul\ol 下面li的个数

    使用 jQuery 获取 ul 下面 li 的个数,那么我们需要遍历我们的ul.如果你的ul有class .id 或两者都没,您可以使用 ul 标签来遍历. //遍历ul 获取li个数 $(" ...

  9. C++11/14的新特性——更简洁

      新的字符串表示方式——原生字符串(Raw String Literals) C/C++中提供了字符串,字符串的转义序列,给输出带来了很多不变,如果需要原生义的时候,需要反转义,比较麻烦. C++提 ...

  10. Kbengine

    Kbengine 编辑 KBEngine是一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互, 使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d ...