數據在屏幕輸出是用戶獲取信息的重要途徑之一,本篇將介紹如何在SAP中實現數據輸出及數值傳遞。
1)數據的基本輸出
通過關鍵字"WRITE"的聲明,能夠實現數據對象的輸出,並能夠實現輸出對象的長度、輸出位置及格式等屬性的控制。與變量定義一樣,WRITE可以同時輸出多個數據對象,對於不同的對象可以通過反斜杠”/”換行輸出。
FOR EXAMPLE:
DATA:WORD(16) VALUE '0123456789ABCDEF'.
DATA:N TYPE I VALUE 123.
WRITE WORD. "單獨輸出一個變量.
WRITE:WORD,N. "WRITE語句鏈輸出兩個變量.
WRITE:/ WORD,/ N. "換行輸出兩個變量.
WRITE AT /(10) WORD. "輸出變量的前10位.
WRITE AT /3(10) WORD. "縮進3格輸出變量前10位.
2)數據的格式化輸出
程序開發中經常有不同的輸出格式需求,使用WRITE語句能夠實現對輸出數值的格式化,其相關語法如下。
1) NO-ZERO:若輸出對象為N或者C類型,將前面的0取代為空格。
FOR EXAMPLE:
DATA str TYPE STRING.
str = '00866'.
WRITE str. "輸出:00866.
WRITE / str NO-ZERO. "輸出: 866.
2) NO-SIGN:對於I、P或者F類型,前面都會有一個標識符號,在實際輸出中占用一位但不顯示,使用該語法其前面的符號不會輸出。
3) NO-GROUPING:對於I或P類型,省略千分號符號。
FOR EXAMPLE:
DATA wealth TYPE I VALUE 86666669.
WRITE wealth. "輸出:86,666,669.
WRITE wealth NO-GROUPING. "輸出:86666669.
DATA nowdate TYPE P.
nowdate = 20120321.
WRITE nowdate. "輸出:20,120,321.
WRITE nowdate NO-GROUPING. "輸出:20120321.
4) DD/MM/YY、NNM/DD/YY、DD/MM/YYYY、MM/DD/YYYY、DDMMYY、MMDDYY、YYMMDD:定義日期輸出格式。
FOR EXAMPLE:
DATA now TYPE D VALUE '20120321'.
WRITE / now. "輸出:20120321.
WRITE / now DD/MM/YY. "輸出:12.03.21.
WRITE / now MM/DD/YY. "輸出:12.03.21.
WRITE / now DD/MM/YYYY. "輸出:2012.03.21.
WRITE / now MM/DD/YYYY. "輸出:2012.03.21.
WRITE / now DDMMYY. "輸出:120321.
WRITE / now MMDDYY. "輸出:120321.
WRITE / now YYMMDD. "輸出:120321.
5) CURRENCY w:使貨幣字段按格式輸出,w代表貨幣單位。維護表TCURX中貨幣類型時有效。
FOR EXAMPLE:
DATA sales TYPE P.
sales = 93860.
WRITE / sales CURRENCY 'DEM' ROUND 2 DECIMALS 2. "輸出:9.39
WRITE / sales CURRENCY 'ITL' ROUND 2 DECIMALS 2. "輸出:938.60
6) DECIMALS d:控制輸出數值小數位。
FOR EXAMPLE:
DATA:x TYPE P DECIMALS 2 VALUE '1.267',
y TYPE F VALUE '125.45623'.
WRITE: / x DECIMALS 0, "輸出:1
/ x DECIMALS 2, "輸出:1.27
/ x DECIMALS 5, "輸出:1.27000
/ y DECIMALS 0, "輸出:1.3E+02
/ y DECIMALS 5, "輸出:1.25456E+02
/ y DECIMALS 20. "輸出:1.25456230000000001E+02
7) +<offset>(<length>):字符串按某一偏移量進行輸出,即可以截取字符串中的一段。
FOR EXAMPLE:
DATA: s(16) TYPE C VALUE 'ABCDEFGHIJKLMNOP'.
WRITE: / s+0(10), "輸出:ABCDEFGHIJ
/ s+0(5), "輸出:ABCDE
/ s+1(9), "輸出:BCDEFGHIJ
/ s+5(5), "輸出:FGHIJ
/ s+3. "輸出:DEFGHIJKLMNOP
8) EXPONENT <n1> DECIMALS <n2>:對於浮點型數值,輸出采用科學記數法。
FOR EXAMPLE:
DATA: x TYPE P VALUE '1023456987886'.
WRITE: / x EXPONENT 0. "輸出:1,023,456,987,886.
9) ROUND r:移除數值左邊或者右邊的r位小數:
FOR EXAMPLE:
DATA l TYPE P DECIMALS 2 VALUE '12593.86'.
WRITE: / l ROUND -2, "輸出:1259386.00
/ l ROUND 0, "輸出:12593.86
/ l ROUND 2, "輸出:125.94
/ l ROUND 5. "輸出:0.13
10) TIME ZONE tz:實現不同時區的時間轉換。
FOR EXAMPLE:
DATA ts TYPE TIMESTAMP VALUE 20120322086069.
WRITE: s_stst TIME ZONE 'UTC+12', "輸出:2012.03.22 08:60:6
/, s_stst TIME ZONE 'UTC+12' DD/MM/YY. "輸出:12.03.22 08:60:6
11) USING EDIT MASK mask:輸出數據自定義格式。
FOR EXAMPLE:
DATA TIME TYPE T VALUE '154633'.
WRITE /(8) TIME USING EDIT MASK '__:__:__'. "輸出:15:46:33
WRITE /(5) TIME USING EDIT MASK '_:_:_'. "輸出:1:5:4
12) UNDER g:參照上一行輸出位置並列輸出,只對WRITE語句有效。
FOR EXAMPLE:
WRITE: /10 'Name'(001),30'RoomNo',50'Age'(002).
WRITE: / 'JERY' UNDER 'Name',
'5.21' UNDER 'RoomNo',
'27' UNDER 'Age'(002).
輸出如下(前面的數字索引代表縮進量,如果前面數字占據了后面的位置,則不顯示):
Name RoomNo Age
JERY 5.21 27
13) NO-GAP:去除輸出值間的空格,該語法只對WRITE語句有效。
FOR EXAMPLE:
WRITE: / 'A' NO-GAP,'B' NO-GAP,'C'.
WRITE: / 'A','B','C'.
輸出:ABC
A B C
14) LEFT-JUSTIFIED(向左對齊)、RIGHT-JUSTIFIED(向右對齊)、CENTERED(居中對齊):輸出參數對齊方式設置。
FOE EXAMPLE:
DATA count TYPE I VALUE 100.
WRITE: /5 'The Total is',count.
WRITE: /5 'The Total is',count LEFT-JUSTIFIED.
輸出:The Total is 100
The Total is 100 “左對齊
不同的數據類型都會有各自默認的對齊方式。各基本數據默認輸出對齊方式如下表所示:
C=LEFT-JUSTIFIED | I=RIGHT-JUSTIFIED | P=RIGHT-JUSTIFIED | F=RIGHT-JUSTIFIED |
N=LEFT-JUSTIFIED | D=LEFT-JUSTITIED | T=LEFT-JUSTIFIED | X=LEFT-JUSTITIED |
3) 數據的賦值
對變量的賦值是程序的常用操作之一,ABAP通常的賦值語句是MOVE或賦值運算符”=“,還可以通過WRITE語句實現將源字段的值賦值給目標變量,源字段可為常量或變量等數據對象。
語法定義如下:
MOVE <value> TO <field>.
<field> = <value or expression>.
這兩種方式是完全等價的,另外,通過WRITE語名可以實現字符類型數值傳遞而不會輸出該值。
WRITE <vaule> TO <field>.
需要強調的是,WRITE賦值只可以在字符類型對象中賦值,否則系統會出錯。
數據賦值還可以使用源字段的偏移量。下例實現在源字段中取偏移量賦值給目標變量,其語法定義及實例如下:
<field>+<offset>(<length>) = <value>.
FOR EXAMPLE:
DATA m TYPE I VALUE 186.
DATA: o TYPE I.
MOVE m TO o.
WRITE: / m,/ o.
"輸出:186
186
DATA: company(8) TYPE C VALUE 'TAOHEUNG',
mycompany(8) TYPE C,
hiscompany LIKE company.
WRITE company TO mycompany.
WRITE: / 'mycompany is',mycompany.
MOVE company+3(5) TO hiscompany.
WRITE: / 'hiscompany',hiscompany.
"輸出:mycompany is TAOHEUNG
hiscompany is HEUNG.
4)通過指針實現數據的賦值
上一面賦值方式不同,字段符號(FIELD SYMBOLS)不是直接對變量賦值,而是通過指針給變量分配源字段的內存地址。指針對象通過語名FIELD-SYMBOLS加上尖括號“<>”來定義,用語句ASSIGN來分配數值。
FOR EXAMPLE:
DATA:number TYPE I VALUE 12.
FIELD-SYMBOLS:<f1>,
<f2> TYPE I,
<f3> LIKE number.
ASSIGN:number TO <f1>,
number TO <f2>,
number TO <f3>.
WRITE: / 'f1 is',<f1>,
/ 'f2 is',<f2>,
/ 'f3 is',<f3>.
<f1> = 36. "重新賦值
WRITE: / 'f1 is',<f1>,
/ 'f2 is',<f2>,
/ 'f3 is',<f3>.
“輸出:f1 is 12
f2 is 12
f3 is 12
f1 is 32
f2 is 32
f3 is 32
上例中,將number的地址同時分配給了<f1>、<f2>、<f3>三個指針,的怪三個指針對應的值都為12,當通過運算符”=“重新給<f1>賦值時,實際是修改了其對應地址number的值,所以三個指針對應的值都變成了32。