四. 顯示圖示:
語法: WRITE:AS SYMBOL.
WRITE: AS ICON.
例如: INCLUDE.
INCLUDE[I].
WRITE: / 'Phone symbol:', SYM_PHONE AS SYMBOL.
WRITE: / 'Alarm Icon:', ICON_VOICE_OUTPUT AS ICON.
要查看系統所提供有那些符號及圖示,可選擇'EDIT'下的'Insert Statement',選擇'Write',接下來選擇要查看的群組,如SYMBOL 或ICON, 接下來按'Display'即可.
*-------------------------------------------------------------------------------------*
一. Internal Table 的宣告
ABAP/4中的Internal Table是一种Data Structure,類似于其他語言中的STRUTURE,它可以由几個不同類型的欄位(field)組成,用來表示具有不同屬性的某一事物,單獨一筆資料表示某個事物,多筆資料表示具有相同屬性的多個事物.
Internal table 的定義有以下几种格式:
格式一. DATA: BEGIN OF OCCURS,
TYPE ,
[TYPE ,
TYPE ,
…
]
END OF.
語法:
DATAOCCURS[WITHHEADERLINE]
Example:
DATAVECTORTYPEIOCCURS10WITHHEADERLINE.
格式二. TYPES: BEGIN OF ,
TYPE ,
[TYPE ,
TYPE ,
…
]
END OF .
TYPES TYPEOCCURS .
格式三. DATA: BEGIN OF .
INCLUDE STRUCTURE [table].
DATA: END OF .
DATA: LIKEOCCURS .
exp:
TYPES VECTOR TYPE I OCCURS 10.
TYPES: BEGIN OF LINE,
COLUMN1 TYPE I,
COLUMN2 TYPE I,
COLUMN3 TYPE I,
END OF LINE.
TYPES ITAB TYPE LINE OCCURS 10.
TYPES: BEGIN OF DEEPLINE,
TABLE1 TYPE VECTOR,
TABLE2 TYPE ITAB,
END OF DEEPLINE.
TYPES DEEPTABLE TYPE DEEPLINE OCCURS 10.
本示例创建 与上例相同 的内表数据 类型(VECTOR 和 ITAB) 。然后创建 数据类型 DEEPLINE 作为字段串 ,包含这些 内表作为组 件。通过该 字段串,数 据类型 DEEPTABLE 被创建为内 表。因此该 内表的元素 本身就是内 表。
exp :
TYPES: BEGIN OF LINE,
COLUMN1 TYPE I,
COLUMN2 TYPE I,
COLUMN3 TYPE I,
END OF LINE.
TYPES ITAB TYPE LINE OCCURS 10.
DATA TAB1 TYPE ITAB.
DATA TAB2 LIKE TAB1 WITH HEADER LINE.
同 创建内表数 据类型 (页 99) 中所示,该 示例创建数 据类型 ITAB 作为内表。 通过使用 DATA 语句的 TYPE 参数引用 ITAB, 使数据对象 TAB1 与 ITAB 结构相同。 通过使用 DATA 语句的 LIKE 参数引用 TAB1, 使数据对象 TAB2 结构相同。 创建的 TAB2 带表头行。 因此,可以 在程序中使 用 TAB2-COLUMN1、 TAB2-COLUMN2 和 TAB2-COLUMN3 等定位表格 工作区域 TAB2。
exp :
DATA FLIGHT_TAB LIKE SFLIGHT OCCURS 10.
本示例创建 数据对象 FLIGHT_TAB, 其结构与数 据库表格 SFLIGHT 相同。
本示例介绍 如何采用两 种不同的步 骤创建同一 内表。
TYPES VECTOR_TYPE TYPE I OCCURS 10.
DATA VECTOR TYPE VECTOR_TYPE WITH HEADER LINE.
在此创建一 个内表数据 类型 VECTOR_TYPE, 其行包含首 先创建的基 本类型 I 字段。然后 ,通过引用 VECTOR_TYPE 创建数据对 象 VECTOR。 通过使用 WITH HEADER LINE 选项还创建 表格工作区 域 VECTOR。 在这种情况 下,表格工 作区域包含 一种类型 I 字段,可以 通过名称 VECTOR 定位。
DATA VECTOR TYPE I OCCURS 10 WITH HEADER LINE.
在这种情况 下,通过直 接在 DATA 语句中使用 OCCURS 选项创建完 全一样的数 据类型 VECTOR。
*-------------------------------------------------------------------------------------*
1. TYPES type.
2. TYPES type(len).
3. TYPES: BEGIN OF structype...
END OF structype.
4. TYPES itabtype {TYPE tabkind OF linetype LIKE tabkind OF lineobj}
[WITH [UNIQUE|NON-UNIQUE] keydef] [INITIAL SIZE n].
5. TYPES itabtype TYPE RANGE OF type.
TYPES itabtype LIKE RANGE OF f.
6. TYPES itabtype {TYPE linetype|LIKE lineobj} OCCURS n.
*-------------------------------------------------------------------------------------*
APPEND LINE
格式:APPENDTO
举例一:(使用WORK AREA)
DATA : BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.
DO 2 TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
LOOP AT ITAB INTO LINE.
WRITE : / LINE-COL1,LINE-COL2.
ENDLOOP.
举例二 (不使用WORK AREA)
DATA : BEGIN OF ITAB OCCURS 10,
COL1 TYPE I,
COL2 TYPE I,
END OF ITAB.
DO 2 TIMES.
ITAB-COL1 = SY-INDEX.
ITAB-COL2 = SY-INDEX ** 2.
APPEND ITAB.
ENDDO.
LOOP AT ITAB.
WRITE : / ITAB-COL1,ITAB-COL2.
ENDLOOP.
exp:
DATA: BEGIN OF ITAB OCCURS 10,
COL1 TYPE C,
COL2 TYPE I,
END OF ITAB.
DO 3 TIMES.
APPEND INITIAL LINE TO ITAB.
ITAB-COL1 = SY-INDEX. ITAB-COL2 = SY-INDEX ** 2.
APPEND ITAB.
ENDDO.
LOOP AT ITAB.
WRITE: / ITAB-COL1, ITAB-COL2.
ENDLOOP.
舉例三. (加入另一個Internal table的元素)
格式: APPEND LINES OF [FROM] [TO ] TO .
將的元素加入至中,可選取自至的范圍.
APPEND LINES OF ITAB TO JTAB.
COLLECT LINE
COLLECT 指令也是將元素加入Internal table中,与APPEND 的區別是: COLLECT指令在非數值欄位相同的情況下,將數值欄位匯總.
格式:COLLECT [ INTO ]
DATA: BEGIN OF ITAB OCCURS 3,
COL1(3)TYPE C,
COL2 TYPE I,
END OF ITAB.
ITAB-COL1 = 'ABC'.ITAB-COL2 = 10.
COLLECTITAB.
ITAB-COL1 = 'XYZ'.ITAB-COL2 = 20.
COLLECTITAB.
ITAB-COL1 = 'ABC'.ITAB-COL2 = 80.
COLLECTITAB.
此時, internal table中放的是2筆數据, 分別為:
ITAB-COL1ITAB-COL2
'ABC'
90
'XYZ'
20
*-------------------------------------------------------------------------------------*
INSERT LINE
將元素插入在指定的internal table位置之前.
格式: INSERT [ INTO] [INITIAL LINE INTO ] [INDEX ]
或者: INSERT LINES OF [FROMTO ] INTO INDEX
其中: 即work area,工作區中的元素.
[INITIAL LINE INTO] :插入一筆初始化的記錄.
: internal table
[INDEX ]: internal table 的記錄號.(新加入的元素放在此記錄前面)
Example:
DATA:BEGINOFLINE,
COL1TYPEI,
COL2TYPEI,
ENDOFLINE.
DATAITABLIKELINEOCCURS10.
DO3TIMES.
LINE-COL1 = SY-INDEX *10.
LINE-COL2 = SY-INDEX *20.
APPENDLINEINTOITAB.
ENDDO.
LINE-COL1=100.
LINE-COL2=200.
INSERTLINEINTOITABINDEX2."插入在位置2之前
LOOPATITABINTOLINE.
WRITE:/SY-TABIX,LINE-COL1,LINE-COL2. "SY-TABIX為Table位置
ENDLOOP.
執行結果:
110 20
2 100200"插入的元素
320 40
430 60
插入另一Internal Table元素
語法:
INSERTLINESOF[FROMTO ]TOINDEX
將的元素插入至中, 位置在 之前, 可選取自至的範圍
Example:
APPENDLINESOFITABTOJTABINDEX3.
將ITAB所有元素插入JTAB中, 位置在第三個元素之前
*-------------------------------------------------------------------------------------*
讀取internal table
格式一:
LOOP AT [INTO ][FROMTO ][WHERE ]
ENDLOOP.
Example:
LOOPATITABINTOLINEWHERECOL1 >100.
WRITE:/SY-TABIX,LINE-COL1.
ENDLOOP.
僅讀取 COL1 > 100 的元素
格式二:
READ TABLE [INTO ] [INDEX / WITH KEY ]
舉例. (格式二)
DATA: BEGIN OF ITAB OCCURS 10,
COL1 TYPE I,
COL2 TYPE I,
END OF ITAB.
DO 10 TIMES.
ITAB-COL1 = SY-INDEX.
ITAB-COL2 = SY-INDEX * 2.
APPEND ITAB.
ENDDO.
READ TABLE ITAB INDEX 3.
(或者: READ TABLEITAB WITH KEY COL1 = 3.)
WRITE: / 'ITAB-COL1 = ', ITAB-COL1, 'ITAB-COL2 = ', ITAB-COL2.
執行結果同樣是:
ITAB-COL1 =3
ITAB-COL2 =6.
Example:
READTABLEITABINTOLINEINDEX5
讀取 ITAB的第5個元素資料, 放入 LINE的欄位中
根據欄位內容尋找
語法:
READTABLEINTO
Example:
ITAB-COL1 = 'ABC'.
READTABLEITABINTOLINE.
找出ITAB 中 COL1 欄位內容是 ABC 的元素, 找到的值放入 LINE 中
若找到 SY-SUBRC傳回0, 找不到則傳回 4, 必須宣告有 work area
*-------------------------------------------------------------------------------------*
修改internal table 中的值
格式: MODIFY [FROM ][INDEX ][TRANSPORTING …][WHERE ]
舉例一. READ TABLE ITAB INDEX 3.
LINE-COL1 = 29.
MODIFY ITAB FROM LINE TRANSPORTING COL1.
將第三筆記錄的COL1欄位的值修改為29.
舉例二. T_SALARY - salary = 50.
MODIFY T_SALARY TRANSPORTING salary WHERE birthday = '1999/12/06'.
DELETE internal table中的欄位
格式: DELETE INDEX .
或: DELETE [FROMTO ] [WHERE ]
Internal table 排序
SORT [][BY …]
其中: 有DESCENDING 和ASCENDING, Default 為ASCENDING.
: 為指定排序的欄位.
Example:
SORTITABDESCENDINGBYCOL2.
將 ITAB 根據 COL2欄位遞減排序
*-------------------------------------------------------------------------------------*
确定内表属 性
如果在处理 过程中想知 道内表一共 包含多少行 ,或者想知 道定义的 OCCURS 参数的大小 ,请使用 DESCRIBE 语句,用法 如下:
语法
DESCRIBE TABLE [LINES ] [OCCURS ].
如果使用 LINES 参数,则将 填充行的数 量写入变量 。 如果使用 OCCURS 参数,则将 行的初始号 写入变量 。
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE LINE OCCURS 10.
DATA: LIN TYPE I, OCC TYPE I.
DESCRIBE TABLE ITAB LINES LIN OCCURS OCC.
WRITE: / LIN, OCC.
DO 1000 TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
APPEND LINE TO ITAB.
ENDDO.
DESCRIBE TABLE ITAB LINES LIN OCCURS OCC.
WRITE: / LIN, OCC.
其输出为:
0 10
1.000 10
在此创建内 表 ITAB。 在填充表格 前后执行 DESCRIBE 语句。更改 当前行号, 但无法更改 初始行号。
*-------------------------------------------------------------------------------------*
加總
SUM.
總和計算存放与work area中,但只能在LOOP 中使用.
例: LOOP AT ITAB INTO LINE.
SUM.
ENDLOOP.
WRITE: / LINE-COL1, LINE-COL2.
LINE-COL1 和 LINE-COL2 存數值總和初始化internal table
REFRESH .清空中的值.使用在沒有 HEADER LINE 的 Internal Table中, 清除所有元素
CLEAR .清空的Header Line.使用在有 HEADER LINE 的 Internal Table中, 清除所有元素
FREE .釋放記憶体空間.釋放(Release) Internal Table所佔的記憶體空間, 用在 REFRESH和 CLEAR指令之後
将值重置为 默认值
可以用 CLEAR 语句重置任 何数据对象 值,如下所 示:
语法
CLEAR .
exp:
DATA NUMBER TYPE I VALUE '10'.
WRITE NUMBER.
CLEAR NUMBER.
WRITE / NUMBER.
输出为:
10
0
CLEAR 语句将字段 NUMBER 的内容从10 重置为默认 值 0。
*-------------------------------------------------------------------------------------*
添加字段 顺序并将结 果赋给另一 个字段
语法
ADDTHENUNTILGIVING .
如果 、 、 ... 、是在内存中 相同类型和 长度的等距 字段序列, 则进行求和 计算并将结 果赋给
添加字段 顺序并将结 果添加到另 一个字段的 内容中
语法
ADDTHENUNTILTO .
该语句除了 将字段总和 添加到的旧内容中 之外,与上 面语句的工 作方式相同 。
有关其它相 似变体的信 息,参见有 关 ADD 语句的关键 字文档。
DATA: BEGIN OF SERIES,
N1 TYPE I VALUE 10,
N2 TYPE I VALUE 20,
N3 TYPE I VALUE 30,
N4 TYPE I VALUE 40,
N5 TYPE I VALUE 50,
N6 TYPE I VALUE 60,
END OF SERIES.
DATA SUM TYPE I.
ADD SERIES-N1 THEN SERIES-N2 UNTIL SERIES-N5 GIVING SUM.
WRITE SUM.
ADD SERIES-N2 THEN SERIES-N3 UNTIL SERIES-N6 TO SUM.
WRITE / SUM.
输出如下:
150
350
在此,将 N1 到 N5 组件内容求 和并将其值 赋给字段 SUM。然 后,将 N2 到 N6组件求 和并将其添 加到 SUM 的值中。
*-------------------------------------------------------------------------------------*
屏幕輸入命令
在ABAP/4中要從螢幕輸入變量, 使用的命令是 PARAMETERS 及SELECTION-OPTIONS:
1. PARAMETER: 輸入一個變量或欄位內容
2. SELECTION-OPTIONS: 使用條件篩選畫面來輸入數据
PARAMETERS 指令
基本的輸入命令, 類似如BASIC的INPUT命令, 但無法使用F格式(浮點數)
語法:
PARAMETERS[DEFAULT ][LOWER CASE]
[OBLIGATORY][AS CHECKBOX]
[RADIOBUTTON GROUP ]
Example:
PARAMETERS:NAME(8),
AGETYPEI,
BIRTHTYPED.
執行結果:
在日期的輸入格式上為 MM/DD/YY , MM/DD/YYYY, MMDDYY或MMDDYYYY , 如輸入 020165表 1965年02月01日, 與02/01/65的輸入是一樣的, 日期輸入範圍為西元1950年至2049年
1. DEFAULT
設定輸入的預設值
Example:
PARAMETERS:COMPANY(20)DEFAULT'DELTA',
BIRTHTYPEDDEFAULT'19650201'.
2. LOWER CASE
ABAP/4預設是將字串輸入值自動轉換為大寫, 加上此參數會將輸入的資料轉成小寫,
3. OBLIGATORY
強制要求輸入, 螢幕上會出現一個 ? , 使用者必須要輸入才可.
4. AS CHECKBOX
輸入 CHECKBOX的格式
Example:
PARAMETERS:TAXASCHECKBOXDEFAULT 'X',
NTDASCHECKBOX.
執行結果:
5.RADIOBUTTON GROUP
輸入 RADIO BUTTON GROUP 的方式
Example:
PARAMETERS: BOYRADIOBUTTON GROUPSEXDEFAULT 'X',
GIRLRADIOBUTTON GROUPSEX.
exp :
TABLES SPLFI.
PARAMETERS: LOWLIKE SPFLI-CARRID,
HIGH LIKE SPFLI-CARRID.
SELECT * FROM SPLFI WHERE CARRID BETWEEN LOW AND HIGH.
........
ENDSELECT.
*-------------------------------------------------------------------------------------*
SELECTION-OPTIONS
SELECTION-OPTIONS所輸入的值實際上是放在internal table中的,該Internal table 有四個欄位,分別是:SIGN,OPTION,LOW,HIGH.. 條件篩選檢查條件輸入畫面指令, 輸入條件後可配合SELECT指令自TABLE讀取符合條件的資料, 直接執行或放入 Internal Table中, 條件有四個參數:
1. SIGN:
I: 表篩選條件符合的資料
E: 表篩選條件不符合的資料
2. OPTION: 比較的條件符號
EQ(等於),NE(不等於),GT(大於),LE(小於),CP(包含),NP(不包含)
3. LOW: 最小值
4. HIGH: 最大值
語法:
SELECTION-OPTIONSFOR[table]
Example:
TABLESSPFLI.
SELECT-OPTIONSAIRLINEFORSPFLI-CONNID.
將條件的輸入值存放入 AIRLINE, 篩選選擇為SPFLI中的CONNID欄位
改變條件輸入格式
1. DEFAULTTO
設定開始結束範圍輸入預設值
Example:
SELECT-OPTIONSAIRLINEFORSPFLI-CONNID DEFAULT'2042'TO'4555'.
2. NO-EXTENSION
設定不要Multi-Option輸入畫面
3. NOINTERVALS
設定不要區間範圍輸入畫面
4. LOWER CASE
輸入轉換成大寫
5. OBLIGATORY
強制要求輸入
*-------------------------------------------------------------------------------------*
|