數據元素和基本類型對應關系
數據字典預置類型 |
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. |
十六進制的00 |
string |
不限定 |
|
在系統內部,長度可變的內置類型(String、XString)是通過引用實際動態的數據對象的固定內存地址來進行操作,因而這兩種內置類型和引用類型一樣,屬於縱深類型。 |
長度為0的空字符串‘‘ |
xstring |
不限定 |
|
由十六進制字符 0-9, A-F組成字符串。直接打印輸出時,輸出的還是賦值時字面意義上的值,而不是Unicode解碼后的字符串 注:如果值是字母,則一定要大寫,否則賦值不進 DATA : xs TYPE xstring . |
長度為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 |
|
index table |
|
sorted 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)
- TYPES:BEGIN OF t_staff,
- S_no(3) type n,
- Name(20),
- END OF t_staff.
- DATA staff TYPEt_staff.
定義了一個結構類型t_staff, 里面包含了 員工工號,員工姓名兩個字段。並根據其聲明了一個結構體對象staff.
結構比作人,社會賦予人人的各屬性是這個結構的字段。
- TYPES:BEGIN OF HUMAN,
- ID(18) TYPE N, "身份證號碼
- NAME(20), "姓名
- AGE(2) TYPE N, "年齡
- BOB TYPE D, " 生日
- HIGE TYPE F, "身高
- WIGHTH TYPE F, "體重
- 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).
- DATA:BEGIN OFline, "work area(structure)結構類型且結構體對象
- num TYPE i,
- sqr TYPE i,
- END OF line,
- "無表頭行內表,內表定義都使用data關鍵詞.
- 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子句。