〔轉載〕ALV知識
ALV知識
Xiaogangh
一、ALV相關概念
ALV――ABAP LIST VIEWER,這裡我姑且稱之為ABAP表單瀏覽器,用它可以標準化,簡單化R/3系統中的表單,它可以提供給使用者一個統一的表單格式以及使用者介面。
ALV即能顯示簡單表單(SIMPLE LIST)又能顯示有序表單(SEQUENTIAL LIST):
● 簡單表單(SIMPLE LIST)包含一系列不分層次的(NON-HIERARCHICAL),使用者自定義的列。
● 層次表(即有序表SEQUENTIAL LIST)包含列表頭以及它的子行,一個列表頭的關鍵行能帶出它下面的一些列專案(我們自己理解的時候可以想到BOM表的層次結構)。
● 我們還可以在簡單表單以及關聯表單中顯示小計和總計
二、結合一個具體的例項來看ALV的功能
首先我們看下圖中的這個ALV的佈局(這是一般ALV程式表單的典型佈局):
根據上面對ALV的直觀形象,下面將螢幕上的區域劃分成幾塊,分別來解釋它的作用:
1.快捷工具欄(如下圖)
細節按鈕,你首先必須選中列表中的一行,然後點選它的話,就會彈出一個視窗,顯示選中行的細節內容。(另外:你雙擊你要選擇的行,也可以顯示細節)
按升序排列,首先選中一列,然後再點選它,就可以看到該列是按照升序重新排列。
按降序排列,首先選中一列,然後再點選它,就可以看到該列是按照降序重新排列。
設定過濾器,透過設定它可以達到篩選的目的,以列名稱作為篩選的篩選標準,填入過濾器相應的標準值,然後就可以篩選出滿足自己條件的記錄。
列印預覽,點選它之後,就可以預覽一下將要列印內容的佈局情況。
Microsoft Excel,呼叫MS的Excel到當前ALV的列表顯示區域。(前提:必須安裝了MS的Excel)
字處理,字處理的相關設定。
本地檔案,將當前表單儲存到本地機器上,有幾種供選擇的儲存格式。
郵件收件人,給系統內使用者發郵件
圖形,點選它可以根據表單情況繪製相關圖表。
更改佈局,點選它可以對錶單中的列專案排列次序的互換,刪減等。
選擇佈局,從已經儲存的佈局中選擇自己滿意的佈局。
儲存佈局,對於自己滿意的佈局,可以透過點選它來將佈局儲存起來。
2. 表單標題區
這個區域主要是用來顯示一些抬頭資訊(總攬資訊),類似於WORD中的頁首。我們在使用的時候根據需要來進行相關填寫。
3.表單顯示區
這個區域主要是用來顯示我們透過程式碼篩選出來的資料,相關的操作在下面的程式編寫部分詳細介紹。
三、程式的編寫
1.在我們寫ALV程式的時候,有一個型別組是肯定要用到的:
TYPE-POOLS:SLIS。
在這個型別組中有很多ALV的自定義資料型別以及結構化資料型別(透過TYPE來定義的),我們在寫ALV表單的時候需要呼叫的。我們常用的幾個有(藍色部分):
I.對一個最簡單的ALV表單(無標題區和頁尾區),我們只需要定義下面幾個
data: i_fieldcat_alv type slis_t_fieldcat_alv with header line,
i_layout type slis_layout_alv, "alv的格式
i_fieldcat type slis_fieldcat_alv,
w_repid like sy-repid.
它對應的start-of-selection中定義子函式如下:
start-of-selection.
perform getdata. “從資料庫中取資料到相應內表中
perform layout_build. “用於定義ALV表單的相關格式、屬性
perform fields. “用來定義表單中的各個列的相關資訊,比如列名等
perform display_data. “用來顯示ALV表單
子函式定義如下:
form layout_build.
i_layout-zebra = 'X'.
i_layout-detail_popup = 'X'. “是否彈出詳細資訊視窗
w_repid = sy-repid. “程式為當前程式
i_layout-f2code = '&ETA'.“設定觸發彈出詳細資訊視窗的功能碼,這裡是雙擊
i_layout-no_vline = 'X'.“這個用來設定列間隔線
i_layout-colwidth_optimize = 'X'. “最佳化列寬選項是否設定
i_layout-detail_initial_lines = 'X'.
i_layout-detail_titlebar = '詳細內容'. “設定彈出視窗的標題欄
endform.
form fields.
refresh i_fieldcat_alv.
pos = 1.
clear i_fieldcat.
i_fieldcat-col_pos = pos. “第幾列
i_fieldcat-fieldname = 'NUM'.
i_fieldcat-seltext_l = '序號'. “列名
append i_fieldcat to i_fieldcat_alv.
pos = pos + 1.
i_fieldcat-col_pos = pos.
i_fieldcat-fieldname = 'AUFNR'.
i_fieldcat-seltext_l = '生產訂單'.
append i_fieldcat to i_fieldcat_alv.
clear i_fieldcat.
…………
Endform.
form display_data.
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
i_callback_program = w_repid “當前程式
i_save = ''
is_layout = i_layout “子函式layout_build填充的格式定義
it_fieldcat = i_fieldcat_alv[] “子函式fields填充的各列
tables
t_outtab = head1. “假設資料都在head1內表中
endform.
II.對一個稍微複雜一點的ALV表單(有標題區和頁尾區),我們需要定義下面幾個
data: i_fieldcat_alv type slis_t_fieldcat_alv,
“用來儲存我們將要在表單顯示區域顯示出來的表單的列名,每個列名對應的欄位名以及列表頭其他相關屬性資訊的資料型別
i_fieldcat type slis_fieldcat_alv,
i_layout type slis_layout_alv. “ALV的格式
data: i_events type slis_t_event,
i_event_exit type slis_t_event_exit,
i_list_comments type slis_t_listheader, “用來填充表單標題區域的資料型別
i_excluding type slis_t_extab.
data:
w_variant like disvariant, "顯示變式結構
wx_variant like disvariant,
w_variant_save(1) type c,
w_exit(1) type c,
w_user_specific(1) type c,
w_callback_ucomm type slis_formname, "字元型
w_print type slis_print_alv, "型別組
w_layout type slis_layout_alv, "型別組
w_html_top_of_page type slis_formname, "字元型
w_fieldcat_alv like line of i_fieldcat_alv,
w_excluding like line of i_excluding,
w_events like line of i_events,
w_event_exit like line of i_event_exit,
w_list_comments like line of i_list_comments.
*===========================================================================*
initialization.
perform init_variant. “這個子函式很重要,沒有它會出錯
*-----------------------------------------*
它對應的start-of-selection中定義子函式如下:
start-of-selection.
perform getdata. “從資料庫中取資料到相應內表中
perform event_build.
perform layout_build. “用於定義ALV表單的相關格式、屬性
perform fields. “用來定義表單中的各個列的相關資訊,比如列名等
perform display_data. “用來顯示ALV表單
*-----------------------------------------*
子函式定義如下:(這裡只定義前面文件沒有提到的子函式,其他同名的請參考前面)
form init_variant.
clear: w_variant.
w_repid = sy-repid. “當前程式
w_variant-report = w_repid.
w_variant-username = sy-uname.
w_variant_save = 'A'. "All types
endform.
form event_build.
call function 'REUSE_ALV_EVENTS_GET'
exporting
i_list_type = 0
importing
et_events = i_events.
read table i_events
with key name = slis_ev_top_of_page
into w_events.
if sy-subrc = 0.
move 'ALV_TOP_OF_PAGE' to w_events-form. “將標題區資料賦值給W_EVENTS
modify i_events from w_events index sy-tabix.
endif.
read table i_events
with key name = slis_ev_end_of_list
into w_events.
if sy-subrc = 0.
move 'ALV_END_OF_LIST' to w_events-form.“將頁尾資料賦值給W_EVENTS
modify i_events from w_events index sy-tabix.
endif.
read table i_events
with key name = slis_ev_end_of_page
into w_events.
if sy-subrc = 0.
move 'ALV_END_OF_PAGE' to w_events-form. “將頁尾區資料賦值給W_EVENTS
modify i_events from w_events index sy-tabix.
endif.
endform.
*-----------------------------------------*
form event_build子函式中黑體字部分對應的幾個子函式,我們需要定義如下:
form alv_top_of_page.
clear: i_list_comments[].
w_list_comments-typ = 'H'. "H=Header, S=Selection, A=Action供選擇
w_list_comments-key = ''.
w_list_comments-info = 'XX汽車有限公司變速箱廢品率報表'.
append w_list_comments to i_list_comments.
w_list_comments-typ = 'S'. " H = Header, S = Selection, A = Action
w_list_comments-key = ''.
concatenate '庫位:' werks-low into werks_t.
w_list_comments-info = werks_t.
append w_list_comments to i_list_comments.
w_list_comments-typ = 'S'. " H = Header, S = Selection, A = Action
w_list_comments-key = ''.
concatenate '庫位:' werks-low into werks_t.
w_list_comments-info = werks_t.
append w_list_comments to i_list_comments.
call function 'REUSE_ALV_COMMENTARY_WRITE'
exporting
i_logo = 'ENJOYSAP_LOGO'
it_list_commentary = i_list_comments.
endform.
form alv_end_of_list.
clear: i_list_comments[].
w_list_comments-typ = 'A'. "H = Header, S = Selection, A = Action
w_list_comments-key = ''.
w_list_comments-info = '頁尾顯示'.
append w_list_comments to i_list_comments.
call function 'REUSE_ALV_COMMENTARY_WRITE'
exporting
it_list_commentary = i_list_comments
i_logo = 'ENJOYSAP_LOGO'
i_end_of_list_grid = 'X'.
endform.
form alv_end_of_page.
它的定義類似上面兩個子函式的內容,這裡不再贅述
endform.
*-----------------------------------------*
form display_data.
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
* i_background_id = 'SIWB_WALLPAPER'
i_background_id = 'SIWB_WALLPAPER'
i_callback_program = w_repid
i_callback_html_top_of_page = w_html_top_of_page
* i_structure_name = 'TRDIR'
i_default = 'X'
i_save = 'A'
is_variant = w_variant
is_layout = w_layout
* i_callback_user_command = w_callback_ucomm
it_fieldcat = i_fieldcat_alv
it_events = i_events
it_event_exit = i_event_exit
it_excluding = i_excluding
is_print = w_print
* i_screen_start_column = 1
* i_screen_start_line = 1
* i_screen_end_column = 70
* i_screen_end_line = 30
tables
t_outtab = head1.
endform.
2.寫一個ALV程式的基本流程(主要包括ALV相關的那部分,後面會附上一個ALV源程式的程式碼):
第一步:定義將要用到的表,即TALBES定義部分,然後定義TYPE-POOLS: SLIS.
第二步:定義“1”中提到的這些資料型別或者內表的實體物件
第三步:定義一些需要用到的變數
第四步: 定義自己的選擇螢幕
第五步: 定義INITIALIZATION部分,在這個部分往往要指定w_repid的值,
w_repid = sy-repid。
第六步: start-of-selection部分
1用一個子函式完成對ALV表單標題區域的賦值(i_list_comments)。
2用一個子函式完成自己所需要資料的抓取
3用一個子函式完成要顯示列表的列名行(第一行)的相關賦值(i_fieldcat_alv)以及設定
4用一個子函式完成輸出格式的設定(i_layout),比如雙擊一條記錄是否彈出對話方塊啊?是用哪個功能鍵觸發等等
5用一個子函式FORM DISPLAY_DATA來顯示上面我們已經分別封裝好的資料,需要呼叫兩個常用的FUNCTION MODULE:
FUNCTION 'REUSE_ALV_GRID_DISPLAY' “用來顯示錶單資料
FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' “用來顯示錶單標題
附件: 示例程式原始碼(注:下面這個程式呼叫的ALV功能應該講是比較完全的了,大家可以透過上面的學習之後,再看這個程式,應該會有所收穫)
*----------------------------------------------------------------------
* Program: ZZ_ALV_REPORT_STUB
* Author : Clayton Mergen
* Date :
*
* Purpose: Report using ALV function
*
* Notes:
* 1) Logos & wallpapers can be found in table BDS_CONN05
* with class = PICTURES
*
* 2) Transaction OAER can be used to create PICTURES.
* Run transaction OAER with class name = PICTURES, Class type = OT,
* and Object key with whatever name you want to create. In the
* next screen, right clicking on screen and import
*
*----------------------------------------------------------------------
* Revisions
*----------------------------------------------------------------------
* Name :
* Date :
* Comments:
*----------------------------------------------------------------------
report zflex004
no standard page heading
line-size 200
line-count 65
message-id zz.
*--------------------------------
* Tables
*--------------------------------
tables:
ekpo,
mara,
trdir.
*--------------------------------
* Global Types
*--------------------------------
type-pools: slis.
*--------------------------------
* Global Internal Tables
*--------------------------------
data:
i_fieldcat_alv type slis_t_fieldcat_alv,
i_events type slis_t_event,
i_event_exit type slis_t_event_exit,
i_list_comments type slis_t_listheader,
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/494796/viewspace-990584/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 知識管理(轉載)
- 全面質量管理基本知識(轉載)
- 【轉載】ALV的Excel方式顯示缺少模板Excel
- goroutine 背後的系統知識(轉載)Go
- (轉載)ios開發知識總結 — 下iOS
- 執行緒的基礎知識(轉載)執行緒
- SA8000基本知識解讀(轉載)
- ios轉載的記憶體方面的知識iOS記憶體
- 運營知識與管理知識(轉)
- 新手知識:認識(轉)
- 移動終端開發必備知識(轉載)
- [轉] 知識索引--RAC索引
- Oracle 基本知識(轉)Oracle
- 負載均衡基礎知識負載
- 負載均衡知識全概要負載
- (轉載)機器學習知識點(十二)座標下降法(Coordinate descent)機器學習
- 專案管理九大知識體系 質量管理(轉載)專案管理
- CUJ:普及知識:typeint (轉)
- [轉] Oracle RAC知識索引Oracle索引
- BIOS知識大全(轉)iOS
- QuickReport基本知識 (轉)UI
- HTML基礎知識(轉)HTML
- 發現AI自我意識:知識及其載體AI
- Java類載入知識總結Java
- vue知識點整理(轉發)Vue
- [TCP]轉TCP相關知識TCP
- 反對知識霸權 (轉)
- 儲存_硬碟_小知識_轉硬碟
- [轉]Linux基礎知識Linux
- swap分割槽的知識(轉)
- 保護模式知識(三) (轉)模式
- 交換機基礎知識(轉)
- korn shell基礎知識(轉)
- JavaScript 物件的基本知識(轉)JavaScript物件
- 網路管理知識集萃(轉)
- Linux使用小知識(轉)Linux
- 研發知識管理(一)(轉)
- 研發知識管理(二)(轉)