〔轉載〕ALV知識

azqf發表於2007-12-09

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,呼叫MSExcel到當前ALV的列表顯示區域。(前提:必須安裝了MSExcel

字處理,字處理的相關設定。

本地檔案,將當前表單儲存到本地機器上,有幾種供選擇的儲存格式。

郵件收件人,給系統內使用者發郵件

圖形,點選它可以根據表單情況繪製相關圖表。

更改佈局,點選它可以對錶單中的列專案排列次序的互換,刪減等。

選擇佈局,從已經儲存的佈局中選擇自己滿意的佈局。

儲存佈局,對於自己滿意的佈局,可以透過點選它來將佈局儲存起來。

2. 表單標題區

這個區域主要是用來顯示一些抬頭資訊(總攬資訊),類似於WORD中的頁首。我們在使用的時候根據需要來進行相關填寫。

3.表單顯示區

這個區域主要是用來顯示我們透過程式碼篩選出來的資料,相關的操作在下面的程式編寫部分詳細介紹。

三、程式的編寫

1.在我們寫ALV程式的時候,有一個型別組是肯定要用到的:

TYPE-POOLSSLIS

在這個型別組中有很多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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章