
實踐A1-按地區(qū)城市排序輸出客戶列表
需求分析:
1、具體需求
本《按地區(qū)城市排序輸出客戶列表》有如下需求:
- 從客戶表中取部分字段而不是所有字段進行輸出;
- 輸出的客戶列表,首先要按照地區(qū)排序、然后按城市排序;
- 需要輸出標題行以對每一列進行說明;
- 各列的文字顏色和背景色有不同要求,如客戶列有背景色,客戶名稱列為紅色……。
整體需求可見圖。

2、開發(fā)分析
要達成本實踐目標,需要綜合ABAP的數(shù)據(jù)輸出實現(xiàn)方式:
- ABAP可通過Open SQL從表中獲得要輸出的數(shù)據(jù)存儲到內(nèi)表;
- 通過Write語句可以將數(shù)據(jù)輸出到屏幕,而在輸出時需要考慮每列數(shù)據(jù)輸出起始位置及所占字符長度;
- 可以通過Format語句控制輸出顏色。
實踐步驟:
本實踐通過程序編輯器(SE38)即可完成,編寫的代碼將有如下幾部分組成,按開發(fā)人員風格不同,其組成部分并非強制一致。
| No | 部分 | 說明 |
|---|---|---|
| 1 | 程序聲明 | 聲明本程序執(zhí)行后是否包含標準標題,數(shù)據(jù)輸出寬度和每頁的行數(shù)量為多少 |
| 2 | 對象定義 | 通過定義變量或常量或要使用的表結(jié)構等,以在程序執(zhí)行過程中計算和存儲臨時值 |
| 3 | 頁眉輸出 | 如不指定標準標題,則可以通過代碼設置輸出的頁眉 |
| 4 | 獲取數(shù)據(jù) | 從表中獲得要輸出的數(shù)據(jù)數(shù)據(jù)并存儲到內(nèi)表中以待后續(xù)輸出 |
| 5 | 輸出數(shù)據(jù) | 將內(nèi)表中的數(shù)據(jù)按要求輸出 |
1、程序聲明
程序聲明部分代碼如下:
REPORT zu0401_cust_open_sql NO STANDARD PAGE HEADING
LINE-SIZE 100 LINE-COUNT 80.
REPORT 程序名稱:是對程序的定義,表明此程序代碼不是FUNCTION MODULE(功能函數(shù)),不是CLASS(類),而是可以執(zhí)行的可以輸出數(shù)據(jù)的此程序;這是對程序最基本的聲明,且必須存在的部分。
NO STANDARD PAGE HEADING:標準的標題定義,可在程序編輯器中通過菜單“轉(zhuǎn)到?文本元素”中的“列表標題”進行定義;而如果設置為此,則表示此程序不使用標準的“列表標題”。
LINE-SIZE 100 LINE-COUNT 80:對頁面的寬度高度進行定義,其中LINE-SIZE為按英文字母長度定義的頁面寬度(如此定義為100表示能容納100個數(shù)字或字母,而如果是中文則按一個中文按2個字符算);LINE-COUNT則是頁面的高度(如此定義為80,則表示每一頁面最多能容納80行,超過則在下一頁顯示)。
2、對象定義
對象定義部分代碼如下:
*****對象定義
TYPES: BEGIN OF cust_type, " CUST_TYPE-類型名稱
customerid TYPE ztcustomer-customerid,
customername TYPE ztcustomer-customername,
region TYPE ztcustomer-region,
city TYPE ztcustomer-city,
address TYPE ztcustomer-address,
contact TYPE ztcustomer-contact,
cphone TYPE ztcustomer-cphone,
END OF cust_type.
DATA:cust_stru TYPE cust_type,
cust_itab TYPE STANDARD TABLE OF cust_type.
如上代碼,首先通過TYPES定義了一個名稱為CUST_TYPE的類型,此類型包含了要輸出的字段:customerid(客戶編號)、customername(客戶名稱)、region(地區(qū))、city(城市)、address(地址)、contact(聯(lián)系人)、cphone(電話);此類型也可在數(shù)據(jù)字典中定義好后,由此在不同的程序代碼中都可以使用。
然后,通過DATA,使用CUST_TYPE定義了一個結(jié)構CUST_STRU,此結(jié)構可以在后面的程序中存儲要輸出的數(shù)據(jù);也使用此CUST_TYPE定義了一個內(nèi)表CUST_ITAB,此內(nèi)表是一個標準的不含Work Area(工作區(qū))的內(nèi)表,這個內(nèi)表用來存儲從表中獲得的數(shù)據(jù)。
定義的類型、結(jié)構及內(nèi)表在數(shù)據(jù)處理過程中的關系如圖4-2。

3、輸出頁眉
輸出頁眉部分代碼如下:
*&----------------------------------------------------------------------*
*& 輸出頁眉
*&----------------------------------------------------------------------*
TOP-OF-PAGE. "頁眉事件
FORMAT RESET.
WRITE:/5(90) sy-uline,
/5 '客戶ID', 15 '客戶地址', 30 '地區(qū)', 35 '城市', 40 '地址' , 60 '聯(lián)系人', 70 '電話號碼',
/5(90) sy-uline.
頁眉部分代碼,要通過TOP-OF-PAGE定義,在此部分可以定義每一頁上方輸出的標題行。
在如上代碼中首先通過FORMAT RESET,重置輸出數(shù)據(jù)的顏色,因為后面的數(shù)據(jù)輸出時設置了顏色。
然后,通過WRITE進行數(shù)據(jù)的輸出,其中:
/5(90) sy-uline,表示每次執(zhí)行時換行輸出,且前面空4個字符,從第5位開始輸出,輸出的內(nèi)容是長度為90的橫線(sy-uline)。
/5 '客戶ID', 15 '客戶地址',……,則是按要求輸出標題文字。
輸出效果如圖4-3。

4、獲得數(shù)據(jù)
獲得數(shù)據(jù)部分代碼如下:
*&----------------------------------------------------------------------*
*& START-OF-SELECTION
*&----------------------------------------------------------------------*
START-OF-SELECTION. "數(shù)據(jù)處理事件
*****獲得客戶信息
SELECT "通過SELECT 語句從表ZTCUSTOMER中獲得數(shù)據(jù)并賦值到內(nèi)表
customerid customername region city address contact cphone
INTO TABLE cust_itab
FROM ztcustomer
ORDER BY region city. "默認升序:ASCENDING,降序則為:DESCENDING
通過START-OF-SELECTION區(qū)分頁眉部分的處理,后面的代碼則可進行數(shù)據(jù)的處理,包括獲得數(shù)據(jù)和輸出數(shù)據(jù)。
如上SELECT代碼為ABAP的Open SQL,是為了滿足SAP系統(tǒng)在不同底層數(shù)據(jù)庫時的使用,其語句規(guī)范接近標準的SQL又有所差異;有了Open SQL,ABAPer只需要熟悉和掌握其語法則可從相應表中獲得數(shù)據(jù),而不用考慮使用的底層數(shù)據(jù)庫是Oracle還是DB2還是MysqlServer。
如上代碼執(zhí)行完成后,則可將數(shù)據(jù)從ZTCUSTOMER表中,獲得所需的各個字段的數(shù)據(jù)并存儲到內(nèi)表CUST_ITAB中,并按REGION(地區(qū))、CITY(城市)列升序,其中也可增加WHERE條件以篩選數(shù)據(jù)(本實踐中略)。
5、輸出數(shù)據(jù)
輸出數(shù)據(jù)部分代碼如下:
*****循環(huán)輸出客戶信息
LOOP AT cust_itab INTO cust_stru .
FORMAT INVERSE OFF COLOR COL_KEY. "設置輸出格式為含背景色,且為藍色
WRITE:
/5 cust_stru-customerid, "按FORMAT語句的設置輸出
15 cust_stru-customername INVERSE ON COLOR COL_NEGATIVE, "無背景色,文字為紅色
30 cust_stru-region INVERSE ON, "無背景色,文字為藍色
35 cust_stru-city INVERSE ON COLOR COL_POSITIVE, "無背景色,文字為綠色
40 cust_stru-address INVERSE ON COLOR COL_GROUP, "無背景色,文字為橙色
60 cust_stru-contact,
70 cust_stru-cphone.
ENDLOOP.
如上代碼,是將逐條從內(nèi)表CUST_ITAB中獲取數(shù)據(jù)并賦值給結(jié)構CUST_STRU后輸出。
同時通過FORMAT語句設置后續(xù)數(shù)據(jù)輸出的默認格式,其中INVERSE OFF表示為背景色,COLOR COL_KEY表示為藍色;同時WRITE語句中也可控制不同內(nèi)容的格式。
輸出效果如圖4-4。

如上從上到下各部分代碼則是組成實現(xiàn)本實踐的全部代碼,編寫完成后激活,則可進行程序的測試發(fā)布。
輸出小結(jié):
1、程序的輸出聲明
| 項目 | 說明 |
|---|---|
| NO STANDARD PAGE HEADING | 不使用標準的頁眉 |
| LINE-SIZE width | 頁眉寬度(能容納的英文字符或數(shù)字) |
| LINE-COUNT page_lines [(footer_lines)] |
頁面高度(一個頁面能容納的行數(shù)) 如指定footer_lines,則頁面中保留行給頁腳以給END-OF-PAGE使用 |
2 、WRITE語句
| 基本語法 | |
|---|---|
| / | 反斜杠為換行顯示 |
| n | 從第n個字符開始輸出 |
| (n) | 如不指定(n),則按變量常量或字符的長度輸出,按此指定后,則按此指定長度輸出,如變量常量或字符的長度超過則被截取 |
| WRITE AT | 如使用WRITE AT,則字符起始輸出位置n及輸出長度(n)都可以為變量常量,否則只能使用數(shù)值 |
| 例子 | WRITE /5(90) sy-uline. 從第5位開始,輸出長度為90的橫線 |
| 顯示格式 | ||
|---|---|---|
| 對齊 | LEFT-JUSTIFIED | 左對齊(字符類型默認) |
| CENTERED | 中對齊 | |
| RIGHT-JUSTIFIED | 右對齊(數(shù)字類型默認) | |
| UNDER <g> | 對齊到另一個輸出對象<g> | |
| 輸出 | NO-GAP | 不保留字段間空格 |
| NO-ZERO | 不顯示前導0 | |
| NO-SIGN | 不顯示正負號 | |
| USING EDIT MASK <m> | 按掩碼指定輸出 | |
| USING NO EDIT MASK | 不按掩碼指定輸出 | |
| CURRENCY <c> | 輸出代碼c對應的貨幣 | |
| 小數(shù) | DECIMALS <d> | 顯示d位小數(shù) |
| EXPONENT <e> | F(浮點數(shù))exponent的值 | |
| ROUND <r> | 四舍五入至r位小數(shù) | |
| 日期 | DD/MM/YY MM/DD/YY DD/MM/YYYY MM/DD/YYYY DDMMYY MMDDYY YYMMDD |
按不同格式指定日期輸出 |
| 例子 | WRITE / 'C10007' using edit mask _:_____. "輸出為C:10007 WRITE / sy-datum mmddyy. "輸出當前日期為10/21/17 WRITE / 'Hello', 'World' NO-GAP. "HelloWorld間無空格 |
3、空行輸出
| 項目 | 說明 |
|---|---|
| SKIP [<n>] | 從當前行開始,空n行后再輸出 |
| SKIP TO LINE <n> | 跳到第n后輸出 |
4、顏色控制
| FORMAT語句 | |
|---|---|
| FORMAT RESET | 顏色重置 |
| FORMAT INVERSE OFF | 背景色 |
| FORMAT INVERSE ON | 前景色 |
| 顏色 | |||
|---|---|---|---|
| 數(shù)字(COLOR=n) | 代碼(COL_代碼) | 顏色 | 用途 |
| 1 | HEADING | 灰藍色 | 一般用途 |
| 2 | NORMAL | 淺灰色 | 列表內(nèi)容 |
| 3 | TOTAL | 黃色 | 匯總 |
| 4 | KEY | 藍色 | 關鍵字 |
| 5 | POSITIVE | 綠色 | 正確 |
| 6 | NEGATIVE | 紅色 | 錯誤 |
| 7 | GROUP | 橙色 | 控制 |
(實踐A1 End)