ABAP基本數據類型、通用類型


ABAP基本數據類型

更多的類型請參考ABAP數據類型繼承圖

類型

允許最大長度(字符數)

默認長度(省略時采用)

說明

初始值

C

1~262143個字符

1 字符

如果未在 DATA 語句中指定參數<length><type>則創建長度為 1 的字符

每個位置都是空格

N

1~262143個字符

1 字符

09之間字符組成的數字字符串

 

如果未在 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

HH00 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

有效長度為116個字節。

兩個數字位壓縮后才占一個字節,由於0-9的數字只需要4Bit位,所以一個字節實質上允許存儲二位數字,這就是P數據類型為壓縮數據類型的由來,因為定義的的數據長度比存儲於內存中要長。並借用最后半個字節,即字面上的一位來存儲小數點、正號、負號、或者是這三種中間的組合————存儲的可能是通過將小數點與正負號經過某種位運算后的結果,因為半個字節不可能存儲小數或正負號的所對應的ASCII碼(都比15大)

P類型最多允許14位小數位,即可以精確到小數點后14,再除開小數點與正負號占半個字節,即字面上14Bit,此時最大整數位最長可達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

不限定

 

在系統內部,長度可變的內置類型(StringXString)是通過引用實際動態的數據對象的固定內存地址來進行操作,因而這兩種內置類型和引用類型一樣,屬於縱深類型。

長度為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類型看用整型。其效率低於IF類型。

"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位,所以下面最多只能是179
DATA: p1(16) TYPE p DECIMALS 14 VALUE '-99999999999999999'.

 

"P類型是以字符串來表示一個數的,與字符串不一樣的是,P類型中的每個數字位只會占用4Bit位,所以兩個數字位才會占用一個字節。另外,如果定義時沒有指定小數位,表示是整型,但小數點固定要占用半個字節,所以不帶小數位與符號的最大與最小整數如下(最多允許319,而不是32個)
DATA: p1(16) TYPEVALUE '+9999999999999999999999999999999'
.
DATA: p2(16) TYPEVALUE '-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-typetext fields (c)numeric text fields (n)date fields (d)and time fields (t)text string (string),相應的通用類型為clike

numeric-typeInteger (i)floating point numbers (f)and packed numbers (p),相應的通用類型為numeric.

byte-typeByte fields (x)byte string (xstring),相應的通用類型為xsequence.

 

Byte-type  Character-type

  • Byte-type x or xstring.
  • Character-type c, n, d, t, string或者是由純的character-type類型字段組成的結構structure

 

image099

通用類型

除了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

 

CNPX用在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),一般性類型可以用於類型定義中,但不能用於聲明一個內表對象,因為它並沒有指明任何明確的表類型,因而系統無法確定對其操作方式。一般性類型還可以用於指明字段符號和接口參數的類型,其實際類型可能在運行期內才能夠確定。

image176

 

扁平類型和縱深類型

扁平結構就是指變量內存中直接存儲的是內容,而不是地址,指針是一種典型的引用類型即縱深類型。

 

扁平結構指的是所有代表實際操作內容的數據對象,因此固定長度的基本類型(即除開stringXstring類型外的基本類型)數據均為扁平結構數據

 

縱深結構指的是數據對象的內容為其他的內存地址區域,因而引用類型的數據對象是典型的縱深結構,然而內表和字符串為縱深結構StringXstring類型對象),因為它們內部機制也是類似的引用尋址方式。對於結構體而言,如果其中一個組件含有上述縱深類型數據,則本身也是縱深結構,如果全部由基本類型數據組成,則該結構體也是扁平結構。因此扁平類型是運行時長度固定的類型,而縱深類型對應的數據對象所占內存長度在運行時內可變,系統是以指針的形式為尋址方式對其定位。

 

參數的通用類型

一般性類型及其兼容性檢查規則(一般性類型/非完全限定):

image041

這種通用的類型指定在參數傳遞過程中可以帶來方便,但也會由於系統檢查級別的降低而增加危險性,也可能因為類型的不明確性造成誤用,所以在大多數據可能的情況下,還是盡量明確地指定接口參數的類型。

image042[4]

image043


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM