需求分析:
1你稚、具體需求
本《使用宏技術輸出系統(tǒng)圖標列表》有如下需求:
- 將系統(tǒng)中自帶的圖標輸出為列表寇壳;
- 分頁輸出醒颖,并在每頁的上方輸出頁碼和列表抬頭;
-
內(nèi)容含四周(上下左右)框線輸出壳炎。
其中列表輸出效果如圖5-1泞歉。
2、開發(fā)分析
要達成本實踐目標匿辩,在不考慮使用模塊化編程技術的情況下腰耙,其方式可有2種,如圖5-2所示铲球。
如上兩種方式挺庞,都可以完成本實踐,且實現(xiàn)的代碼也并不復雜睬辐。如果使用方式1挠阁,一條記錄一次輸出,從效率上比較高溯饵,但代碼的復用性比較弱侵俗,如有其他的需求,或同一個報表僅僅是增加一列丰刊,或需要指定另一個長度隘谣,或輸出顏色要單獨設置,那么輸出數(shù)據(jù)、輸出上/下橫線的代碼則都需要修改寻歧;使用方式2時掌栅,每個單元格的輸出步驟都是類似的,可以充分使用ABAP的模塊化編程技術码泛,將輸出一個單元格內(nèi)容的完整步驟封裝為一個模塊猾封,如此在相同的程序或不同的程序中都可以重復調(diào)用,如此代碼的可讀性噪珊、可維護性都將提高晌缘,當然,因為需要每個單元格都需獨立完成一遍輸出痢站,效率會低點磷箕。
如果不考慮代碼的可讀性、可維護性阵难、可重用性岳枷,不對方式2的代碼進行模塊化編程,每個單元格獨立一次輸出呜叫,此時使用方式2是完全沒優(yōu)勢的空繁,如此肯定是優(yōu)先選擇方式1;而在項目實踐應用中怀偷,代碼的可讀性家厌、可維護性、可重用性會更為重要椎工,如此本實踐使用模塊化編程技術之一——宏予以實現(xiàn)饭于。
實踐步驟:
本實踐通過程序編輯器(SE38)即可完成,編寫的代碼將有如下幾部分組成维蒙,按開發(fā)人員風格不同掰吕,其組成部分并非強制一致。
No | 部分 | 說明 |
---|---|---|
1 | 程序聲明 | 聲明本程序執(zhí)行后是否包含標準標題颅痊,數(shù)據(jù)輸出寬度和每頁的行數(shù)量為多少殖熟。 |
2 | 對象定義 | 通過定義類型池以在程序中使用相應的圖標,定義要使用的變量等斑响,以在程序執(zhí)行過程中計算和存儲臨時值 |
3 | 宏定義 | 通過宏定義單元格內(nèi)容菱属,以及列表數(shù)據(jù)表頭的輸出 |
4 | 獲取和輸出數(shù)據(jù) | 從表中獲得要輸出的數(shù)據(jù),并調(diào)用宏將數(shù)據(jù)按要求輸出 |
1舰罚、程序聲明
程序聲明部分的代碼如下:
REPORT zu0501_icon_list_macro NO STANDARD PAGE HEADING
LINE-SIZE 100.
通過如上代碼定義纽门,程序輸出時,頁面寬度為100(能容納100個數(shù)字或英文字符)营罢,不控制輸出行數(shù)赏陵,而是在代碼中定義。
2、對象定義
對象定義部分的代碼如下:
****對象定義
TABLES icon. " 定義了一個與表icon同名的工作區(qū)
DATA: col TYPE sy-colno, " 用于記錄輸出位置的列
lin TYPE sy-linno, " 用于記錄輸出位置的行
length TYPE i, " 用于確定輸出橫線的長度
cnt(6) TYPE c, " 用于記錄輸出的序號
cntr TYPE i, " 用于記錄輸出的行數(shù)
pg TYPE sy-pagno. " 頁碼
如上代碼蝙搔,使用類型MAT_AG_TYPE定義了一個含工作區(qū)的標準內(nèi)表缕溉,如此,在輸出時吃型,可以將內(nèi)表數(shù)據(jù)遍歷后放到內(nèi)表自己的工作區(qū)中证鸥,而不需要另外一個結(jié)構存儲。在實際開發(fā)中败玉,偏向于使用不含工作區(qū)的內(nèi)表敌土,如此增加代碼的可讀性。
3运翼、宏定義
本實踐定義了2個分別用于輸出單元格數(shù)據(jù)和輸出列表數(shù)據(jù)抬頭的宏,代碼如下兴枯。
3.1血淌、單元格數(shù)據(jù)輸出宏
此部分代碼如下:
*&---------------------------------------------------------------------*
*& DEFINE WRITE_GRID
*&---------------------------------------------------------------------*
* 定義宏輸出單元格內(nèi)容數(shù)據(jù)
* &1: 輸出內(nèi)容
* &2: 輸出內(nèi)容占位長度
* &3: 顏色設置,on财剖,文字顏色悠夯,off 背景色
* &4: 背景顏色濃淡設置,on濃躺坟, off淡沦补,如&3為on不起作用
* &5: 顏色代碼color_XXXX
*----------------------------------------------------------------------*
DEFINE write_grid.
lin = sy-linno. col = sy-colno. "將當前輸出所在行列賦值給變量
FORMAT INVERSE &3 INTENSIFIED &4 COLOR &5. "輸出顏色設置
WRITE: sy-vline NO-GAP, (&2) &1 NO-GAP, sy-vline NO-GAP. "繪制左右豎線和內(nèi)容
length = sy-colno - col. "確定橫線輸出長度
lin = lin - 1.
SKIP TO LINE lin. "移動到上一行
ULINE AT col(length). "繪制頂部橫線
lin = lin + 2.
SKIP TO LINE lin. "移動到下一行
ULINE AT col(length). "繪制底部橫線
lin = lin - 1. col = sy-colno - 2.
SKIP TO LINE lin. POSITION col. "移動到右側(cè)豎線前一位置,以備下一輸出
END-OF-DEFINITION.
通過DEFINE……END-OF-DEFINITION定義一個宏咪橙,可以在調(diào)用宏時傳入變量值夕膀,并可在代碼中按順序使用&1……&5在宏定義的代碼中使用。
3.2美侦、列表數(shù)據(jù)抬頭輸出宏
此部分代碼如下:
*&---------------------------------------------------------------------*
*& DEFINE WRITE_PHEAD
*&---------------------------------------------------------------------*
* 定義宏輸出每頁的列表數(shù)據(jù)抬頭
*----------------------------------------------------------------------*
DEFINE write_phead.
NEW-PAGE NO-HEADING. "無頁眉新頁
pg = pg + 1.
WRITE:/65 '頁碼:', (3) pg.
SKIP 2.
POSITION 5.
write_grid 'NO' 6 on off col_key. "調(diào)用宏輸出
write_grid '圖標名稱' 35 on off col_key.
write_grid '圖示' 8 on off col_group.
write_grid '代碼' 4 on off col_total.
cntr = 5. "包含列表頭已輸出5行
"每頁輸出行數(shù)重置
SKIP 2. "空2行以輸出下一行數(shù)據(jù)
POSITION 5. "空5個字符作為起始位置
END-OF-DEFINITION.
本部分代碼定義的宏产舞,也調(diào)用了“單元格數(shù)據(jù)輸出宏”,以輸出列表數(shù)據(jù)抬頭菠剩,同時此宏其輸出內(nèi)容都是在代碼中定義的易猫,無需在調(diào)用時傳入變量值。
4具壮、獲取和輸出數(shù)據(jù)
獲取和輸出數(shù)據(jù)部分的代碼如下:
*&----------------------------------------------------------------------*
*& START-OF-SELECTION
*&----------------------------------------------------------------------*
START-OF-SELECTION.
*****獲得ICON數(shù)據(jù)
SELECT * FROM icon.
IF cntr => 59 OR cnt IS INITIAL. "輸出超過59行或在初始時輸出表頭
"每頁輸出(59-5)/2=27條記錄
write_phead. "調(diào)用宏輸出數(shù)據(jù)列表抬頭
ENDIF.
cnt = sy-dbcnt.
write_grid cnt 6 on off col_key. "調(diào)用宏輸出數(shù)據(jù)
write_grid icon-name 35 on off col_key.
write_grid icon-id 8 on off col_group.
write_grid icon+1(2) 4 on off col_total.
cntr = cntr + 2. "包括下橫線增加了2行輸出
SKIP 2. "空2行以輸出下一行數(shù)據(jù)
POSITION 5. "空5個字符作為起始位置
ENDSELECT.
本部分通過SELECT語句從icon中獲得數(shù)據(jù)后存儲到icon表同名的工作區(qū)中准颓,然后按需求輸出列表抬頭和逐條輸出系統(tǒng)圖標內(nèi)容。
如上4部分代碼合在一起則實現(xiàn)了本實踐的需求棺妓。
本實踐小結(jié):
宏(Macros)是一段獨立的代碼攘已,與子程序類似,能實現(xiàn)數(shù)據(jù)的運算與輸出涧郊,主要應用于同一程序中需要的重復運算與輸出贯被,以簡化代碼;而與子程序不同,宏不需要定義接收參數(shù)的類型及格式彤灶,其通過&N(N為索引)接收傳入的參數(shù)看幼;宏只能被本程序中定義于宏后面的語名所調(diào)用,因此一般定義于程序最開始幌陕。
可以在表TRMAC中查看到系統(tǒng)所包含的宏诵姜。
(實踐5A1 End)