zoukankan      html  css  js  c++  java
  • SAP 数据类型

    数据元素和基本类型对应关系

    数据字典预置类型

    ABAP类型

    运行长度

    说明

    ACCP

    N(6)

    6

    会计计算周期

    CHAR

    C(n)

    1-255

    字符

    CLNT

    C(3)

    3

    集团,数据区域代码

    CUKY

    C(5)

    5

    货币代码

    CURR(n,m)

    P((n+1)/2)DECIMALm

    1-17

    货币金额

    DATS

    D(8)

    8

    日期

    DEC n,m

    P((n+1)/2)DECIMALm

    n(1-31)m(1-17)

    数值计算

    FLTP

    F(8)

    18

    浮点数

    INT1

    X(1)(类型b)

    3

    单字节整形数

    INT2

    X(2)(类型s)

    5

    双字节整形数

    INT4

    X(4)(类型i)

    10

    四字节整形数

    LANG

    C(1)

    内部1位外部2位

    语言代码

    LCHR

    C(n)

    256-最大值

    长字符

    LRAW

    X(n)

    256-最大值

    长位字串

    NUMC n

    N(n)

    1-255

    数值文字

    PREC

    X(2)

    16

    精确度

    QUAN n,m

    P((n+1)/2)DECIMALm

    1-17

    数量

    RAW n

    X(n)

    1-255

    位字串

    TIMS

    T(6)

    6

    时间

    VARC n

    C(n)

    255-最大值

    长字符(仅3.0前可用)

    STRING

    STRING

    1-最大值

    字符串

    RAWSTRING

    XSTRING

    1-最大值

    位字符串

    UNIT

    C(n)

    2-3

    单位


    ABAP基本数据类型

    更多的类型请参考ABAP数据类型继承图

    类型

    允许最大长度(字符数)

    默认长度(省略时采用)

    说明

    初始值

    C

    1~262143个字符

    1 字符

    如果未在 DATA 语句中指定参数<length>和<type>,则创建长度为 1 的字符

    每个位置都是空格

    N

    1~262143个字符

    1 字符

    0到9之间字符组成的数字字符串

     

    如果未在 DATA 语句中指定参数<length>,则创建长度为 1          

    "0"每个位置都是阿拉伯数字0

    D

    8 个字符

     

    日期格式必须为 YYYYMMDD 取值范围:YYYY (year): 0001 to 9999, MM(month): 01 to 12, DD (day): 01 to 31

    "00000000"

    T

    6 个字符

     

    格式为 24-hour的 HHMMSS

    HH:00 to 23

    MM: 00 to 59

    SS: 00 to 59

    "000000"

    I

    4 bytes

     

    -2.147.483.648 to +2.147.483.647(.点号为千分位分隔符,不是小数点,而,逗号则表示是小数点)

    如果运算出现非整型的结果(如小数)则进行四舍五入,而不是截断

    0

    F

    8 bytes

     

    小数位最大可以到17位,即可精确到小数点后17位

    取值范围:-1,7976931348623157EE+308 to -2,2250738585072014EE-308 for the negative area, the value zero, and +2,2250738585072014EE-308 to +1,7976931348623157EE+308 for the positive area.

    如果要求高精度,则不应该使用类型 F 数据。而应代之以类型 P 数据

    F赋值时,会转换为标准形式:<±尾数部分>E±<指数部分>,且尾数部分的小数位最多为17位

    0

     

    如果值是小数,则要将值使用引号引起来

    P

    1 to 16 bytes

    8 bytes

    有效长度为1到16个字节。

    两个数字位压缩后才占一个字节,由于0-9的数字只需要4Bit位,所以一个字节实质上允许存储二位数字,这就是P数 据类型为压缩数据类型的由来,因为定义的的数据长度比存储于内存中要长。并借用最后半个字节,即字面上的一位来存储小数点、正号、负号、或者是这三种中间 的组合————存储的可能是通过将小数点与正负号经过某种位运算后的结果,因为半个字节不可能存储小数或正负号的所对应的ASCII码(都比15大)

    P类型最多允许14位小数位,即可以精确到小数点后14,再除开小数点与正负号占半个字节,即字面上1位4Bit,此时最大整数位最长可达16*2 = 32 – 1 = 31 -14 = 17位

    Depending on the field length len(len表示定义时P的整个长度) and the number of decimal places dec(dec表示小数位), the following applies for the value area: (-10^(2len -1) +1) / (10^(+dec)) to (+10^(2len -1) -1) /(10^(+dec)) in steps of 10^(-dec). Values in between this range are rounded off.

    在计算过程中如果小数部分过长,则进行四舍五入

    0

     

    若小数部分超过长度,则自动按四舍五入将多余的小数除掉;如果整数部分超过长度,则系统运行出错

     

    如果值是小数,则要将值使用引号引起来

    X

    1~524,287 bytes

    1 byte

    十六进制字符 0-9, A-F具体的范围为:00~FF

    类型X是十六进制类型,可表示内存字节实际内容,使用两个十六制字符表示一个字节中所存储的内容。但直接打印输出时,输出的还是赋值时字面意义上的值,而不是Unicode解码后的字符

    如果未在 DATA 语句中指定参数<length>,则创建长度为 1

    注:如果值是字母,则一定要大写,否则赋值不进

    DATA: x2(2) TYPE x.
    x2 = ‘3AA‘.
    WRITE : / x2."输出赋值时字面上的值:3AA0

    十六进制的00

    string

    不限定

     

    在系统内部,长度可变的内置类型(String、XString)是通过引用实际动态的数据对象的固定内存地址来进行操作,因而这两种内置类型和引用类型一样,属于纵深类型。

    长度为0的空字符串‘‘

    xstring

    不限定

     

    由十六进制字符 0-9, A-F组成字符串。直接打印输出时,输出的还是赋值时字面意义上的值,而不是Unicode解码后的字符串

    注:如果值是字母,则一定要大写,否则赋值不进

    DATA : xs TYPE xstring .
    xs = ‘303132‘."表示字符串 012
    WRITE :/ xs."但输出的还是303132

    长度为0的空字符串‘‘

    b

    1 Byte

     

    0 to 255属于ABAP内部类型,在ABAP程序中不能直接使用

    0

    s

    2 bytes

     

    -32.768 to +32.767属于ABAP内部类型,在ABAP程序中不能直接使用

    0

    P类型(压缩型)数据

    是一种压缩的定点数,其数据对象占据内存字节数和数值范围取定义时指定的整个数据大小和小数点后位数,如果不指定小数位,则将视为I类型。其有效数字位大小可以是从1~31位数字(小数点与正负号占用一个位置,半个字节),小数点后最多允许14个数字。

    P类型的数据,可用于精确运算(这里的精确指的是存储中所存储的数据与定义时字面上所看到的大小相同,而不存在精度丢失问题——看到的就是内存中实实在在的大小)。在使用P类型时,要先选择程序属性中的选项 Fixed point arithmetic(即定点算法,一般默认选中),否则系统将P类型看用整型。其效率低于I或F类型。

    "16 * 2 = 32表示了整个字面意义上允许的最大字面个数,而14表示的是字面上小数点后面允许的最大小数位,而不是指14个字节,只有这里定义时的16才表示16个字节

    DATA: p(16) TYPE p DECIMALS 14 VALUE ‘12345678901234567.89012345678901‘.

    "正负符号与小数点固定要占用半个字节,一个字面上位置,并包括在这16个字节里面。
    "16 * 2 = 32位包括了小数点与在正负号在内
    "在定义时字面上允许最长可以达到32位,除去小数点与符号需占半个字节以后
    "有效数字位可允许31位,这31位中包括了整数位与小数位,再除去定义时小
    "数位为14位外,整数位最多还可达到17位,所以下面最多只能是17个9
    DATA: p1(16) TYPE p DECIMALS 14 VALUE ‘-99999999999999999‘.

     

    "P类型是以字符串来表示一个数的,与字符串不一样的是,P类型中的每个数字位只会占用4Bit位,所以两个数字位才会占用一个字节。另外,如果定义时没有指定小数位,表示是整型,但小数点固定要占用半个字节,所以不带小数位与符号的最大与最小整数如下(最多允许31个9,而不是32个)
    DATA: p1(16) TYPE p  VALUE ‘+9999999999999999999999999999999‘.
    DATA: p2(16) TYPE p  VALUE ‘-9999999999999999999999999999999‘.

    其实P类型是以字符串形式来表示一个小数,这样才可以作到精确,就像Java中要表示一个精确的小数要使用BigDecimal一样,否则会丢失精度。

    DATA: p(9) TYPE p DECIMALS 2 VALUE ‘-123456789012345.12‘.
    WRITE: / p."123456789012345.12-

    DATA: f1 TYPE f VALUE ‘2.0‘,
          f2 TYPE f VALUE ‘1.1‘,
          f3 TYPE f.
    f3  =  f1 - f2."不能精确计算
    "2.0000000000000000E+00 1.1000000000000001E+00 8.9999999999999991E-01
    WRITE: / f1   , f2 , f3.

    DATA: p1 TYPE p DECIMALS 1 VALUE ‘2.0‘,
          p2 TYPE p DECIMALS 1 VALUE ‘1.1‘,
          p3 TYPE p DECIMALS 1.
    p3  =  p1 - p2."能精确计算
    "2.0               1.1               0.9
    WRITE: / p1   , p2 , p3.

     

    DATA: P TYPE P.

    P = 1 / 3 * 3.

    WRITE P.

    如果未设置程序属性“定点算法”,则结果为 0,这是因为除法结果被内部取整为 0。

    如果设置程序属性“定点算法”,则结果为 1,这是因为除法结果被内部存储 0.333333333333333333333333333333,精度达 31 位数字。

     

    Java中精确计算:

        publicstaticvoid main(String[] args) {

            System.out.println(2.0 - 1.1);// 0.8999999999999999

            System.out.println(sub(2.0, 0.1));// 1.9

        }

        publicstaticdouble sub(double v1, double v2) {

            BigDecimal b1 = new BigDecimal(Double.toString(v1));

            BigDecimal b2 = new BigDecimal(Double.toString(v2));

            return b1.subtract(b2).doubleValue();

        }

    ABAP数据类型继承图

    下图中左边展示了ABAP类型的继承关系(黄色表示类型、灰色表示可生成相应的数据),右边为通用数据类型(但只用在formalparameters(形式参数)与field symbols字段符号,Data通用类型只可用于定义data references变量,object通用类型只可用于定义object references变量)。

     

    character-type:text fields (c)、numeric text fields (n)、date fields (d)、and time fields (t)、text string (string),相应的通用类型为clike

    numeric-type:Integer (i)、floating point numbers (f)、and packed numbers (p),相应的通用类型为numeric.

    byte-type:Byte fields (x)、byte string (xstring),相应的通用类型为xsequence.

    通用类型

    除了object,所有的通用类型都能直接用TYPE后面(如 TYPE data,但没有TYPE object,object不能直接跟在TYPE后面,只能跟在 TYPE REF TO后面)

    TYPE REF TO 后面可接的通用类型只能是 data(数据引用)或者是 object(对象引用)通用类型,其他通用类型不行:

    TYPE REF TO data :表示的是数据引用data references

    TYPE REF TO object: 表示的是对象引用object references

    ANY代表了除data、 object 任何数据类型

    下表为ABAP预置的通用类型。ABAP数据类型继承图

    Type

    Description

    any table

    Internal table with any table type

    hashed table

    Hashed table

    index table

    Index table

    sorted table

    Sorted table

    standard table

    Standard table

    table

    Standard table

       

    c

    Text field with a generic length

    n

    Numeric text with generic length

    p

    Packed number with generic length and generic number of decimal places

    x

    Byte field with generic length

     

    C、N、P、X用在Form的形式参数中

    clike

    Character-like (c, d, n, t, string, and character-like flat structures)

    csequence

    Text-like (c, string)

    xsequence

    Byte-like (x, xstring)

    numeric

    Numeric (i (b, s), p, decfloat16, decfloat34, f)

       

    data

    Any data type

    any

    Any data type

    simple

    基础数据类型,以及只包含character-like扁平组件的数据结构

    Elementary data type including structured types with exclusively character-like flat components

    object

    Any object type (root class of the inheritance hierarchy继承层次结构)

       

     

    字符类型C作为接口参数类型使用时,则传递的参数的长度可以是任意的,但如果采用C(XX)形式定义的,则传递进去的长度固定为XX。

    如果字符符号定义成一般类型(通用类型)内表,则在使用时,你只能动态的访问各字段的名称:

    TYPES: BEGIN OF line,
      col1,
      col2,
    END OF line.
    DATA: wa TYPE line,
    itab TYPE HASHED TABLE OF line WITH UNIQUE KEY col1,
    key(4) VALUE ‘col1‘.
    FIELD-SYMBOLS <fs> TYPE ANY TABLE.
    wa-col1 = ‘X‘.
    wa-col2 = ‘Y‘.
    INSERT wa INTO TABLE itab.
    ASSIGN itab TO <fs>.
    CLEAR: wa.
    READ TABLE <fs> WITH TABLE KEY (key) = ‘X‘ INTO wa.
    "编译会出错
    *READ TABLE <fs> WITH TABLE KEY col1 = ‘X‘ INTO wa.
    WRITE:/ sy-subrc, wa-col1, wa-col2.

    因为上面的字段符号为ANY TABLE,行的结构类型不明确,所以不能静态的指定行的字段名。如果上面将字段符号定义成ANY或什么都不写是写时,根本就不可以使用READ TABLE这样的语句,原因是在静态编译的情况下,根本不为会它指向的是一个内表。

    当使用完全限定类型定义字段符号时,可以静态的使用技术属性。如,某个结构的组件元素、循环某个内表、创建某个对象(引用类型的字段符号):

    DATA: BEGIN OF line,
    col1,
    col2 VALUE ‘X‘,
    END OF line.
    FIELD-SYMBOLS <fs> LIKE line.
    ASSIGN line TO <fs>.
    MOVE <fs>-col2 TO <fs>-col1.
    WRITE: / <fs>-col1,<fs>-col2.

    INDEX/ANY TABLE通用型内表

    除三种标准类型外,还有一般性类型,即索引表(INDEX TABLE)和任意表(ANY TABLE),一般性类型可以用于类型定义中,但不能用于声明一个内表对象,因为它并没有指明任何明确的表类型,因而系统无法确定对其操作方式。一般性类型还可以用于指明字段符号和接口参数的类型,其实际类型可能在运行期内才能够确定。

     

    数据类型(TYPES)与数据对象(DATA)

    数据类型有简单的基本类型,比如你用到的 I N C P等,也有根据这些基本类型自己定义的结构化数据类型,比如自己用types定义的,系统SE11创建件的结构

    定义数据对象使用关键字data,定义数据类型使用关键字types

    定义数据对象的时候两种常用的方式,一个是参考数据类型,一个是参考数据对象

    参考数据类型的方式是使用type关键字,比如:data lv_str(10) type c.

    参考数据对象的方式是使用like关键字,比如:data lv_str1 like lv_str.

    你使用data关键字定义的typ_man,实际上是一个结构化的数据对象

    参考数据对象定义gt_tb的时候,应该使用like,而不是type。

    知识点(1)

    数据字典预置类型 ABAP类型 运行长度 说明
    ACCP N(6) 6 会计计算周期
    CHAR C(n) 1-255 字符
    CLNT C(3) 3 集团,数据区域代码
    CUKY C(5) 5 货币代码
    CURR(n,m) P((n+1)/2)DECIMALm 42736 货币金额
    DATS D(8) 8 日期
    DEC n,m P((n+1)/2)DECIMALm n(1-31)m(1-17) 数值计算
    FLTP F(8) 18 浮点数
    INT1 X(1)(类型b) 3 单字节整形数
    INT2 X(2)(类型s) 5 双字节整形数
    INT4 X(4)(类型i) 10 四字节整形数
    LANG C(1) 内部1位外部2位 语言代码
    LCHR C(n) 256-最大值 长字符
    LRAW X(n) 256-最大值 长位字串
    NUMC n N(n) 1-255 数值文字
    PREC X(2) 16 精确度
    QUAN n,m P((n+1)/2)DECIMALm 42736 数量
    RAW n X(n) 1-255 位字串
    TIMS T(6) 6 时间
    VARC n C(n) 255-最大值 长字符(仅3.0前可用)
    STRING STRING 1-最大值 字符串
    RAWSTRING XSTRING 1-最大值 位字符串
    UNIT C(n) 2~3 单位

    数据定义: 知识点(2)

    1. TYPES:BEGIN OF t_staff,  
    2.                      S_no(3) type n,  
    3.                      Name(20),  
    4.               END OF t_staff.  
    5. DATA staff TYPEt_staff.  

    定义了一个结构类型t_staff, 里面包含了 员工工号,员工姓名两个字段。并根据其声明了一个结构体对象staff.

    结构比作人,社会赋予人人的各属性是这个结构的字段。

    1. TYPES:BEGIN OF HUMAN,  
    2.         ID(18)  TYPE N,  "身份证号码  
    3.        NAME(20),   "姓名  
    4.       AGE(2) TYPE N,  "年龄  
    5.       BOB  TYPE D, " 生日  
    6.      HIGE TYPE F,  "身高  
    7.     WIGHTH TYPE F, "体重  
    8.      END HUMAN.  

     知识点(3)

    通用逻辑表达式列表:  把后面的英文记住了,这几个符号也就记住了。

    运算符

    意义

    EQ或=

    等于 (Equal)

    NE或<>或><

    不等于(NotEqual)

    LT或<

    小于(LESSTHAN)

    LE或<=

    小于等于(Less than orEqual to)

    GT或>

    大于(GreaterThan)

    GE或>=

    大于等于(Greater than orEqual to)

           知识点(4)    

    types定义的并不是结构体对象,只是结构类型,不能作为工作区,当定义的内表没有表头行(工作区)时,必须为其定义一个结构体作为工作区,否则无法使用此内表.如果没有给内表定义工作区,则在定义内表时必须声明表头行(withheader line).

    1. DATA:BEGIN OFline, "work area(structure)结构类型且结构体对象  
    2.      num TYPE i,  
    3.      sqr TYPE i,  
    4.     END OF line,  
    5.    "无表头行内表,内表定义都使用data关键词.  
    6. itab TYPE(LIKE)STANDARD TABLE OF line WITH KEY table_line.  

    DATADIRTAB LIKE CDIR OCCURS 10 WITH HEADER LINE.定义标准内表

    知识点(5)

    1.TYPES与DATA区别:TYPES是用来定义某种类(型)的,需(用DATA语句)实例化以后才可以使用,而DATA是用来定义数据对象(实例变量)的,对于用DATA直接定义的结构体对象(不参照其它结构类型),其同时也是一个结构类型.

    2.TYPE与LIKE区别:TYPE后面跟随的只能是某种类(型),而LIKE后面可以跟随类型或实例对象,参照结构体对象生成内表时只能用LIKE,不能用TYPE,因为结构体对象不是类型,只是一种实例对象,参照结构类型生成内表时可以用LIKE也可以用TYPE.其中通过LIKE定义的内表直接拥有参照结构类型的元素结构,而通过TYPE定义的内表只能间接拥有被参照结构类型的元素结构,结构类型不能作为内表的工作区,只有结构体对象才可以.

    知识点(6)

    注:CLEAR itab[].表示操作的是内表对象.而CLEAR itab.当itab有表头行时表示操作表头行,如无表头行时表示操作内表对象.

    内表分有表头的内表和没表头的内表。

    clear itab 和clear itab[] 是有区别的,clear itab[] 操作两种情况的内表。clear itab 操作的是当内表有表头时,操作表头;没表头时,操作内表对象。这样理解对吗?

    理解错了,CLEARitab[].:只清空整个内表对象数据.不清空表头行

    知识点(7)

     下面这个很难理解,我都看了5遍了。

    控制级操作(用于总计,缩进,格式控制等)

    AT FIRST|LAST|NEW f|END OF f.

           <statement block>

    ENDAT.

    说明:

    l  FIRST:当循环为内表的第一行时,执行语句块中语句.在工作区中,系统用*填充所有关键词内容.

    l  LAST:当循环为内表的最后一行时,执行语句块中语句.在工作区中,系统用*填充所有关键词内容.

    l  NEW f:字段f前面(即左边)的全部字段内容之一不同于上一行时,执行语句块中语句.在工作区中,系统用*填充f后面所有关键词内容.

    l  END OF f:如果下一行行组中的任何字段内容不同于上一行,执行语句块中语句.在工作区中,系统用*填充f后面所有关键词内容.

    注:在控制级操作期间,在工作区中,对于非标准关键词段,将全部进行初始化,在执行完控制操作后(即ENDAT语句后)工作区中的数据将全部还原到进入控制级操作语句前(即进入AT前)状态.

     知识点(8)

     FOR ALL ENTRIES IN ITAB  ”相当于循环输出内表在WHERE子句中出现的   意义相当于where子句。

  • 相关阅读:
    安装mysql_cluster报错: Data::Dumper丢失
    win10 nodejs指定ionic版本安装(npm方式)
    java项目报错: org.springframework.beans.factory.BeanCreationException找不到mapper.xml文件
    java项目跑起来报错: 程序报 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 错误
    ~/.bashrc文件写错, 导致Linux全部命令丢失
    tomcat热启动没问题, 访问项目报500解决办法
    安装OpenOffice
    redhat6.4 elasticsearch1.7.3安装配置
    MySQL新建用户保存的时报错:The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
    zabbix zabbix_agentd.conf详解
  • 原文地址:https://www.cnblogs.com/bolang100/p/7525511.html
Copyright © 2011-2022 走看看