电竞比分网-中国电竞赛事及体育赛事平台

分享

ALV_GRID介紹

 roadsky 2010-07-06

ALV_GRID介紹

一.ALV介紹
The ALV Grid Control (ALV = SAP List Viewer)是一個(gè)顯示列表的靈活的工具,它提供了基本功能的列表操作,也可以通過(guò)自定義來(lái)進(jìn)行增強(qiáng),因此可以允許你可以在大型的應(yīng)用程序中使用.
SAP提示: 在SAP的開發(fā)項(xiàng)目中,ALV GRID也可以作為修改和創(chuàng)建數(shù)據(jù)的一種工具,然而,目前這個(gè)功能只在實(shí)驗(yàn)計(jì)劃中使用,還沒有向客戶發(fā)布.
下面是一個(gè)ALV GRID的圖片:
它包括3大部分,工具欄,標(biāo)題,用于顯示數(shù)據(jù)的網(wǎng)格控制器.如果有必要,用戶可以隱藏標(biāo)題和工具欄.
ALV家族包含3中ALV工具:簡(jiǎn)易的,兩層ALV,分等級(jí)連續(xù)的列表和樹形結(jié)構(gòu)的ALV.
二.ALV GRID CONTROL (ALV網(wǎng)格控制器)
ALV GRID CONTROL使用了控制器技術(shù)以實(shí)現(xiàn)藝術(shù)性的屏幕顯示,象所有的控制器一樣,ALV GRID CONTROL通過(guò)系統(tǒng)中的一個(gè)全局的類提供了方法,以響應(yīng)它的動(dòng)作.
使用了ABAP的對(duì)象以后,列表是通過(guò)ALV的一個(gè)實(shí)例(INSTANCE)來(lái)顯示的,程序員可以使用ABAP對(duì)象的事件管理.
三.ALV GRID CONTROL 實(shí)例
ALV GRID實(shí)例的定義,參照CL_GUI_ALV_GRID類
data ALV_GRID1 type ref to cl_gui_alv_grid.
ALV GRID繼承結(jié)構(gòu):


ALV_GRID介紹二(1)
四、ALV GRID相關(guān)的幾個(gè)控制結(jié)構(gòu)
1.字段目錄 [Field catalog]
字段目錄是用來(lái)控制ALV顯示的網(wǎng)格中每個(gè)字段的屬性的,比如字段的順序,對(duì)齊方式,可編輯狀態(tài),顏色,等等.
常用的控制字段如下:(下面的示例將說(shuō)明這些字段的使用,參考STRUCTURE LVC_S_FCAT)
2 ROW_POS ALV 控制: 輸出行 (內(nèi)部使用)  
3 COL_POS ALV 控制: 輸出列 列的位置,第幾列,例如1,2,…..
4 FIELDNAME ALV 控制: 內(nèi)部表字段的字段名稱 字段名稱
5 TABNAME LVC 標(biāo)簽名稱 表名,如果是內(nèi)表,是1
6 CURRENCY ALV 控制: 貨幣單位  
7 CFIELDNAME ALV 控制: 參考的當(dāng)前單位的字段名稱  
8 QUANTITY ALV 控制: 計(jì)量單位  
9 QFIELDNAME ALV 控制: 參考計(jì)量單位的字段名稱  
10 IFIELDNAME ALV 控制: 內(nèi)部表字段的字段名稱  
11 ROUND ALV 控制: ROUND 值  
12 EXPONENT ALV 控制:流動(dòng)表示的指數(shù)  
13 KEY ALV 控制: 關(guān)鍵字段 關(guān)鍵字段,前面變藍(lán)色
14 KEY_SEL ALV 控制: 可以被隱藏的關(guān)鍵列 可以被隱藏的關(guān)鍵列
15 ICON ALV 控制: 作為圖標(biāo)輸出 此列作為圖標(biāo)輸出
16 SYMBOL ALV 控制: 輸出作為符號(hào)  
17 CHECKBOX ALV 控制: 作為復(fù)選框輸出 復(fù)選框輸出
18 JUST ALV 控制: 對(duì)齊 對(duì)齊方式:
'R': right justified
'L': left justified
'C': centered
19 LZERO ALV 控制: 輸出前導(dǎo)零 X'
20 NO_SIGN ALV 控制:輸出抑制符號(hào) X',不輸出符號(hào)
21 NO_ZERO ALV 控制: 為輸出隱藏零 X',隱藏0
22 NO_CONVEXT ALV 控制: 不考慮輸出的轉(zhuǎn)換退出  
23 EDIT_MASK ALV 控制: 為輸出編輯掩碼 格式
24 EMPHASIZE ALV 控制: 帶有顏色的高亮列 列的顏色
25 FIX_COLUMN ALV 控制: 固定列  
26 DO_SUM ALV 控制: 總計(jì)列值 X',合計(jì)

 


ALV_GRID介紹二(2)
27 NO_SUM ALV 控制: 沒有總計(jì)列值 X' ,沒有合計(jì)
28 NO_OUT ALV 控制: 列沒有輸出 X' ,隱藏此列
29 TECH ALV 控制: 技術(shù)字段 X'.也是隱藏,但是有點(diǎn)不一樣
30 OUTPUTLEN ALV 控制: 列的字符寬度 輸出的長(zhǎng)度
31 CONVEXIT 轉(zhuǎn)換例程  
32 SELTEXT ALV 控制: 對(duì)話功能的列標(biāo)識(shí)符  
33 TOOLTIP ALV 控制: 列抬頭的工具提示  
34 ROLLNAME ALV 控制: F1 幫助的數(shù)據(jù)元素  
35 DATATYPE ABAP 字典中的數(shù)據(jù)類型 ABAP 字典中的數(shù)據(jù)類型
36 INTTYPE ABAP 數(shù)據(jù)類型(C,D,N,...) ABAP 數(shù)據(jù)類型(C,D,N,...)
37 INTLEN 以字節(jié)計(jì)的內(nèi)部長(zhǎng)度 內(nèi)容的長(zhǎng)度
38 LOWERCASE 允許/不允許小寫字母 X' 允許大小寫
39 REPTEXT 標(biāo)題  
40 HIER_LEVEL ALV 控制: 內(nèi)部使用  
41 REPREP ALV 控制: 價(jià)值是補(bǔ)充/補(bǔ)充接口的選擇標(biāo)準(zhǔn)  
42 DOMNAME 定義域名  
43 SP_GROUP 組代碼  
44 HOTSPOT ALV 控制: 單擊敏感 X',下面出現(xiàn)下劃線,響應(yīng)單擊
45 DFIELDNAME ALV 控制: 數(shù)據(jù)庫(kù)中列組的字段名稱  
46 COL_ID ALV 控制: 列 ID  
47 F4AVAILABL 字段有輸入幫助嗎 X'.此列有搜索幫助
48 AUTO_VALUE ALV 控制: 自動(dòng)復(fù)制值  
49 CHECKTABLE 表名  
50 VALEXI 固定值存在  
51 WEB_FIELD ALV 控制: 內(nèi)部表字段的字段名稱  
52 HREF_HNDL 自然數(shù) 熱點(diǎn)連接的句柄
53 STYLE ALV 控制: 樣式 下面有例子會(huì)介紹,比如PUSHBUTTION
54 STYLE2 ALV 控制: 樣式  
55 STYLE3 ALV 控制: 樣式  
56 STYLE4 ALV 控制: 樣式  
57 DRDN_HNDL 自然數(shù) 下拉的句柄
58 DRDN_FIELD ALV 控制: 內(nèi)部表字段的字段名稱 下拉的字段
59 NO_MERGING 字符字段長(zhǎng)度 1 相同的值不合并
60 H_FTYPE ALV 樹控制: 功能類型 (總計(jì),平均,最大.最小, ...)  
61 COL_OPT 可選列優(yōu)化的條目  
62 NO_INIT_CH 字符字段長(zhǎng)度 1  
63 DRDN_ALIAS 字符字段長(zhǎng)度 1  
64 REF_FIELD ALV 控制: 內(nèi)部表字段的參考字段名稱  
65 REF_TABLE ALV 控制: 內(nèi)部表字段的參考表名稱  
66 TXT_FIELD ALV 控制: 內(nèi)部表字段的字段名稱  
67 ROUNDFIELD ALV 控制: 帶有 ROUND 說(shuō)明的字段名稱  
68 DECIMALS_O ALV 控制: 輸出小數(shù)位的編號(hào)  
69 DECMLFIELD ALV 控制: 帶有 DECIMALS 說(shuō)明的字段名稱  
70 DD_OUTLEN ALV 控制: 輸出字符長(zhǎng)度  
71 DECIMALS 小數(shù)點(diǎn)后的位數(shù) 設(shè)置小數(shù)的位數(shù)
72 COLTEXT ALV 控制: 列標(biāo)題 列標(biāo)題
73 SCRTEXT_L 長(zhǎng)字段標(biāo)簽  
74 SCRTEXT_M 中字段標(biāo)簽  
75 SCRTEXT_S 短字段標(biāo)簽  
76 COLDDICTXT ALV 控制: 確定 DDIC 文本參考  
77 SELDDICTXT ALV 控制: 確定 DDIC 文本參考  
78 TIPDDICTXT ALV 控制: 確定 DDIC 文本參考  
79 EDIT ALV 控制: 準(zhǔn)備輸入 輸出狀態(tài).'X'可輸入
80 TECH_COL ALV 控制: 內(nèi)部使用  
81 TECH_FORM ALV 控制: 內(nèi)部使用  
82 TECH_COMP ALV 控制: 內(nèi)部使用  
83 HIER_CPOS ALV 控制: 層次列位置  
84 H_COL_KEY 樹控制: 列名稱/項(xiàng)目名稱  
85 H_SELECT 標(biāo)識(shí)是否可以選擇樹控制中的列  
86 DD_ROLL 數(shù)據(jù)元素 (語(yǔ)義域)  
87 DRAGDROPID ALV 控制: 拖&放處理拖放對(duì)象  
88 MAC 字符字段長(zhǎng)度 1  
89 INDX_FIELD 自然數(shù)  
90 INDX_CFIEL 自然數(shù)  
91 INDX_QFIEL 自然數(shù)  
92 INDX_IFIEL 自然數(shù)  
93 INDX_ROUND 自然數(shù)  
94 INDX_DECML 自然數(shù)  
95 GET_STYLE 字符字段長(zhǎng)度 1  
96 MARK 字符字段長(zhǎng)度 1  

 

ALV_GRID介紹二(3)
2.布局控制[layout]
布局是用來(lái)控制整個(gè)ALV的一個(gè)布局,比如ALV的標(biāo)題,是否可編輯,行顏色,列顏色.
參照ALV的控制結(jié)構(gòu)[LVC_S_LAYO],以后的例子我將詳細(xì)介紹如何設(shè)置行顏色和列顏色.
詳細(xì)的結(jié)構(gòu)說(shuō)明

字段名 描述 Value range
CWIDTH_OPT 最優(yōu)化寬度 SPACE, 'X'
SMALLTITLE 小標(biāo)題,如果設(shè)置了這個(gè)字段,
則標(biāo)題與列標(biāo)題大小一樣 SPACE, 'X'
GRID_TITLE 標(biāo)題,在網(wǎng)格和工具條之間 最長(zhǎng)70個(gè)字符
NO_HEADERS 如果被設(shè)置,列標(biāo)題隱藏 SPACE, 'X'
NO_HGRIDLN 隱藏水平線 SPACE, 'X'
NO_MERGING 禁用單元格合并 SPACE, 'X'
NO_ROWMARK 如果被設(shè)置,選擇列在選擇模式
為D和A的時(shí)候隱藏 SPACE, 'X'
NO_TOOLBAR 隱藏工具條 SPACE, 'X'
NO_VGRIDLN 隱藏垂直線 SPACE, 'X'
SEL_MODE 選擇模式 SPACE, 'A', 'B', 'C', 'D'
EXCP_CONDS 合計(jì)例外 SPACE, 'X'
EXCP_FNAME 字段名稱帶有例外編碼 最長(zhǎng)30個(gè)字符
EXCP_LED 例外作為 LED SPACE, 'X'
EXCP_ROLLN 例外文檔的數(shù)據(jù)元素 SPACE, 'X'
CTAB_FNAME 帶有復(fù)雜單元格顏色編碼的字段名稱 最長(zhǎng)30個(gè)字符
INFO_FNAME 帶有簡(jiǎn)單行彩色代碼的字段名稱 最長(zhǎng)30個(gè)字符
ZEBRA 可選行顏色,如果設(shè)置了,出現(xiàn)了間隔色帶 SPACE, 'X'
NO_TOTLINE 沒有總計(jì) SPACE, 'X'
NUMC_TOTAL 可以對(duì)NUMC字段進(jìn)行合計(jì) SPACE, 'X'
TOTALS_BEF 總計(jì)輸出在第一行,小計(jì)在新的值之前 SPACE, 'X'
STYLEFNAME 設(shè)置單元格,比如PUSHBUTTON 最長(zhǎng)30個(gè)字符


ALV_GRID介紹二(4)
3.打印和排序,過(guò)濾控制
打印的參數(shù)控制請(qǐng)參考結(jié)構(gòu) [LVC_S_PRNT]
排序的參數(shù)控制請(qǐng)參考結(jié)構(gòu)[LVC_S_SORT]
過(guò)濾的參數(shù)控制請(qǐng)參考結(jié)構(gòu)[LVC_S_FILT]

這里不再一一解釋,進(jìn)入中文版本,里面應(yīng)該也有解釋的,雖然一些不是很清楚.

五.編寫簡(jiǎn)單的ALV程序.
首先這里就不詳細(xì)介紹DIALOG的用法了.
OO的ALV GRID必須存在于一個(gè)容器當(dāng)中,就是FUNCTION的ALV,其實(shí)也是一樣的,底層也是使用CL_GUI_ALV_GRID這個(gè)類的.
首先ALV的顯示需要有幾個(gè)先決條件.

1,字段目錄,這個(gè)是必須的,如果沒有這個(gè)參數(shù),參考一個(gè)數(shù)據(jù)字典也是可以的,就是參數(shù)I_STRUCTURE_NAME.
2.存放數(shù)據(jù)的內(nèi)表,最好內(nèi)表的結(jié)構(gòu)和字段目錄是一致的,否則可能會(huì)出現(xiàn)一些無(wú)法預(yù)知的錯(cuò)誤,當(dāng)然你說(shuō)我非要不一樣,那也不一定會(huì)出現(xiàn)錯(cuò)誤.我建議是最好一樣的.
這2個(gè)是必須的,布局的話,應(yīng)該是可以不設(shè)置的,使用默認(rèn)的就可以了.

第一步:創(chuàng)建個(gè)SCREEN,在屏幕上創(chuàng)建個(gè)容器,CONTAINER.定義變量.
DATA:
WCL_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
WCL_ALV TYPE REF TO CL_GUI_ALV_GRID .
*--- 存放字段目錄的內(nèi)表
DATA gt_fieldcat TYPE lvc_t_fcat .
*--- 布局結(jié)構(gòu)
DATA gs_layout TYPE lvc_s_layo .
*----聲明需要顯示的內(nèi)表(以SFLIGHT為例)
DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA END OF gt_list .

第二步: 創(chuàng)建ALV這個(gè)對(duì)象,它的父組件是那個(gè)容器.
在PBO中寫入如下代碼:

PROCESS BEFORE OUTPUT .
MODULE display_alv .

創(chuàng)建DISPLAY_ALV的MODULE后,寫下如下代碼:
MODULE display_alv OUTPUT .
PERFORM display_alv .
ENDMODULE .

在FORM DISPLAY_ALV中,判斷ALV實(shí)例是否存在,如果不存在,則創(chuàng)建:
IF WCL_ALV IS INITIAL .
CREATE OBJECT: WCL_CONTAINER
EXPORTING
CONTAINER_NAME = 'ALV_CON'.
CREATE OBJECT WCL_ALV
EXPORTING
I_PARENT = WCL_CONTAINER.

*-----準(zhǔn)備獲取字段目錄
PERFORM prepare_field_catalog CHANGING gt_fieldcat .
*-----設(shè)置布局
PERFORM prepare_layout CHANGING gs_layout .
*-----顯示ALV
CALL METHOD gr_alvgrid->set_table_for_first_display
EXPORTING
* I_BUFFER_ACTIVE =
* I_CONSISTENCY_CHECK =
* I_STRUCTURE_NAME =
* IS_VARIANT =
* I_SAVE =
* I_DEFAULT = 'X'
is_layout = gs_layout
* IS_PRINT =
* IT_SPECIAL_GROUPS =
* IT_TOOLBAR_EXCLUDING =
* IT_HYPERLINK =
CHANGING
it_outtab = gt_list[]
it_fieldcatalog = gt_fieldcat
* IT_SORT =
* IT_FILTER =
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4 .
ELSE .
*----刷新ALV
CALL METHOD gr_alvgrid->refresh_table_display
* EXPORTING
* IS_STABLE =
* I_SOFT_REFRESH =
EXCEPTIONS
finished = 1
OTHERS = 2 .
IF sy-subrc <> 0.
*--異常處理
ENDIF.
ENDIF .

方法"set_table_for_first_display"的參數(shù)說(shuō)明

參數(shù) 含義
I_BUFFER_ACTIVE 如果方法調(diào)用是靜態(tài)的,可以設(shè)置這個(gè)標(biāo)記,這表示,如果每次顯示ALV都是
相同的字段目錄.既然這樣,那么字段目錄會(huì)被放到一個(gè)特殊的緩存里,
這樣加速了ALV的顯示
I_STRUCTURE_NAME 輸出數(shù)據(jù)參考的數(shù)據(jù)字典的結(jié)構(gòu)名,例如'SFLIGHT'.如果指定了這個(gè)參數(shù),字段
目錄會(huì)自動(dòng)生成,下面的參數(shù)IT_FIELDCATALOG不需要傳值.
IS_VARIANT 決定布局顯示的變式
I_SAVE 決定用戶是否可以保存變式:
'X' 只能保存全局變式
'U' 只能保存特定變式
'A' 都可以保存
SPACE 不可以保存變式
I_DEFAULT 決定用戶是否可以定義默認(rèn)的布局:
'X' 可以定義默認(rèn)布局,這個(gè)參數(shù)是默認(rèn)的
SPACE 不可以定義默認(rèn)布局
IS_LAYOUT 布局參數(shù),傳遞布局控制的一些信息
IS_PRINT 后臺(tái)打印屬性的參數(shù)
IT_SPECIAL_GROUPS 如果在字段目錄中,一些字段通過(guò)SP_GROUP被分組在一起.我們就必須為這些
組傳遞一個(gè)組的文本內(nèi)表進(jìn)去
IT_TOOLBAR_EXCLUDING 需要隱藏的標(biāo)準(zhǔn)的按鈕的內(nèi)表
IT_HYPERLINK 為每個(gè)句柄分配了超連接的內(nèi)表,LVC_S_HYPE中的HREF存放了超連接的地址,
HANDLE指定了句柄,使用這些句柄,你可以在GRID中使用超連接
IT_ALV_GRAPHICS 比較復(fù)雜,沒有用過(guò),意思好象是可以在圖表中顯示ALV.
IT_OUTTAB 輸出數(shù)據(jù)存放的內(nèi)表,數(shù)據(jù)都是存放在這個(gè)內(nèi)表里
IT_FIELDCATALOG 字段目錄
IT_SORT 排序的標(biāo)準(zhǔn)
IT_FILTER 過(guò)濾的標(biāo)準(zhǔn)

方法"REFRESH_TABLE_DISPLAY"的參數(shù)說(shuō)明

參數(shù) 含義
IS_STABLE 刷新的穩(wěn)定性,有2個(gè)參數(shù),一個(gè)是行,一個(gè)是列.如果設(shè)置了相應(yīng)的值,
那么對(duì)應(yīng)的行,或者列,在刷新的時(shí)候,將會(huì)保持穩(wěn)定,就是滾動(dòng)條保持不動(dòng).
I_SOFT_REFRESH 這個(gè)參數(shù)只是在異常情況下被使用,如果設(shè)置了這個(gè)參數(shù),任何創(chuàng)建的合計(jì),
任何排序次序,任何為了顯示數(shù)據(jù)而設(shè)置的過(guò)濾都將保持不變.這個(gè)是非常
有意義的.例如:當(dāng)然你沒有修改數(shù)據(jù)內(nèi)表里的數(shù)據(jù)而想刷新ALV,僅僅只是
改變一下布局和字段目錄.

 

ALV_GRID介紹二(5)
第三步,獲取要顯示數(shù)據(jù)的字段目錄.有兩種方式.
1.手動(dòng)創(chuàng)建
FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat .
DATA ls_fcat type lvc_s_fcat .
ls_fcat-fieldname = 'CARRID' .
ls_fcat-inttype = 'C' .
ls_fcat-outputlen = '3' .
ls_fcat-coltext = 'Carrier ID' .
ls_fcat-seltext = 'Carrier ID' .
APPEND ls_fcat to pt_fieldcat .
CLEAR ls_fcat .
ls_fcat-fieldname = 'CONNID' .
ls_fcat-ref_table = 'SFLIGHT' .
ls_fcat-ref_table = 'CONNID' .
ls_fcat-outputlen = '3' .
ls_fcat-coltext = 'Connection ID' .
ls_fcat-seltext = 'Connection ID' .
APPEND ls_fcat to pt_fieldcat .
ENDFORM .
2.半自動(dòng)的創(chuàng)建
FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat .
DATA ls_fcat type lvc_s_fcat .
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'SFLIGHT'
CHANGING
ct_fieldcat = pt_fieldcat[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
*--Exception handling
ENDIF.
LOOP AT pt_fieldcat INTO ls_fcat .
CASE pt_fieldcat-fieldname .
WHEN 'CARRID' .
ls_fcat-outpulen = '10' .
ls_fcat-coltext = 'Airline Carrier ID' .
MODIFY pt_fieldcat FROM ls_fcat .
WHEN 'PAYMENTSUM' .
ls_fcat-no_out = 'X' .
MODIFY pt_fieldcat FROM ls_fcat .
ENDCASE .
ENDLOOP .
ENDFORM .

 

ALV_GRID介紹二(6)
第四步,設(shè)置布局

FORM prepare_layout CHANGING ps_layout TYPE lvc_s_layo.
ps_layout-zebra = 'X' .
ps_layout-grid_title = 'Flights' .
ps_layout-smalltitle = 'X' .
ENDFORM. " prepare_layout

第五步,排除不需要的標(biāo)準(zhǔn)按鈕(可選,這個(gè)是第一種方法,還有另外一種,在添加自定義的按鈕的時(shí)候介紹)
在你的ALV上,如果你想排除一些你不想要的標(biāo)準(zhǔn)按鈕,你可以把需要排除的按鈕填入到表UI_FUNCTIONS中,然后傳給 set_table_for_first_display方法的參數(shù)"IT_TOOLBAR_EXCLUDING".這些按鈕的功能碼一般都可以通過(guò)查看類cl_gui_alv_grid的常量屬性中獲取到,或者自己加個(gè)斷點(diǎn),在after_user_command事件中.

如果你要隱藏全部的工具條,你可以把layout中的no_toolbar設(shè)置為"X".

FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions .
DATA ls_exclude TYPE ui_func.
ls_exclude = cl_gui_alv_grid=>mc_fc_maximum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_minimum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_subtot .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_sum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_average .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_mb_sum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_mb_subtot .
ENDFORM .

 

ALV_GRID介紹二(7)
按照上面的步驟,一個(gè)ALV的DEMO基本可以創(chuàng)建了.下面我們將講述一些功能.

功能一:在第一次顯示以后,修改字段目錄和布局.

在運(yùn)行的時(shí)候,很有可能需要在顯示之后,需要設(shè)置一個(gè)新的布局或者字段目錄.有下面這些方法去實(shí)現(xiàn).

字段目錄 : get_frontend_fieldcatalog
set_frontend_fieldcatalog
布局: get_frontend_layout
set_frontend_layout

使用這些方法,你在執(zhí)行的任何時(shí)候,可以獲取這些內(nèi)容,然后修改他們.

DATA ls_fcat TYPE lvc_s_fcat .
DATA lt_fcat TYPE lvc_t_fcat .
DATA ls_layout TYPE lvc_s_layo .
CALL METHOD gr_alvgrid->get_frontend_fieldcatalog
IMPORTING
et_fieldcatalog = lt_fcat[] .
LOOP AT lt_fcat INTO ls_fcat .
IF ls_fcat-fieldname = 'PAYMENTSUM' .
ls_fcat-no_out = space .
MODIFY lt_fcat FROM ls_fcat .
ENDIF .
ENDLOOP .
CALL METHOD gr_alvgrid->set_frontend_fieldcatalog
EXPORTING
it_fieldcatalog = lt_fcat[] .

CALL METHOD gr_alvgrid->get_frontend_layout
IMPORTING
es_layout = ls_layout .
ls_layout-grid_title = 'Flights (with Payment Sums)' .
CALL METHOD gr_alvgrid->set_frontend_layout
EXPORTING
is_layout = ls_layout .

 

ALV_GRID介紹二(8)
功能二:設(shè)置排序條件

有時(shí)候我們需要使用到數(shù)據(jù)的排序.這個(gè)可以通過(guò)填充參考結(jié)構(gòu)LVC_T_SORT創(chuàng)建的內(nèi)表來(lái)實(shí)現(xiàn),這個(gè)內(nèi)表中包含了排序的標(biāo)準(zhǔn).可以傳遞給set_table_for_first_display這個(gè)方法的IT_SORT參數(shù)來(lái)初始化一個(gè)排序.

FORM prepare_sort_table CHANGING pt_sort TYPE lvc_t_sort .
DATA ls_sort TYPE lvc_s_sort .
ls_sort-spos = '1' .
ls_sort-fieldname = 'CARRID' .
ls_sort-up = 'X' . "A to Z
ls_sort-down = space .
APPEND ls_sort TO pt_sort .
ls_sort-spos = '2' .
ls_sort-fieldname = 'SEATSOCC' .
ls_sort-up = space .
ls_sort-down = 'X' . "Z to A
APPEND ls_sort TO pt_sort .
ENDFORM. " prepare_sort_table

這有2點(diǎn)特別的說(shuō)明:
1.如果這邊排序的字段名,不存在于字段目錄中,那將出現(xiàn)DUMP.
2.排序以后,垂直的網(wǎng)格中,如果出現(xiàn)相同的內(nèi)容,就會(huì)合并,如果要避免,請(qǐng)?jiān)诓季种性O(shè)置"no_merging"為"X" .

你可以通過(guò)使用方法“get_sort_criteria” 和“set_sort_criteria”來(lái)獲取和設(shè)置排序的標(biāo)準(zhǔn).

 

ALV_GRID介紹二(9)
功能三:設(shè)置過(guò)濾(和排序類似)

ALV的標(biāo)準(zhǔn)按鈕中已經(jīng)有過(guò)濾的功能,我們也可以在初始顯示的時(shí)候就設(shè)置過(guò)濾條件.我們需要把過(guò)濾條件填充到參考表類型"LVC_T_FILT"創(chuàng)建的內(nèi)表中.過(guò)濾條件是類似一個(gè)RANGES結(jié)構(gòu)的.然后把這個(gè)內(nèi)表傳遞給方法"SET_TABLE_FOR_FIRST_DISPLAY"中的參數(shù)"IT_FILTER"

FORM prepare_filter_table CHANGING pt_filt TYPE lvc_t_filt .
DATA ls_filt TYPE lvc_s_filt .
ls_filt-fieldname = 'FLDATE' .
ls_filt-sign = 'E' .
ls_filt-option = 'BT' .
ls_filt-low = '20030101' .
ls_filt-high = '20031231' .
APPEND ls_filt TO pt_filt .
ENDFORM. " preparefiltertable
我們可以使用"get_filter_criteria" 和"set_filter_criteria"來(lái)獲取過(guò)濾條件和設(shè)置過(guò)濾條件.


ALV_GRID介紹二(10)
功能四:選擇方式
有時(shí)候,我們需要選擇一些單元格,行或者列,在布局中,有個(gè)參數(shù)"SEL_MODE"可以設(shè)置我們不同的選擇方式.下面是參數(shù)的介紹.和不同的地方.
值 模式 可能的選擇 注釋
SPACE 等同于B 參考B 默認(rèn)設(shè)置
'A' 行和列的選擇,無(wú)法選擇單元格 多行,多列 用戶可以使用最左邊的選擇按鈕來(lái)選擇多行
'B' 單選,不可以多選行,不可以多選單元格 多行,多列  
'C' 多選,可以多選行,不可以多選單元格 多行,多列  
'D' 單元格的選擇,可以多選單元格 多行,多列,任何單元格多選 用戶可以使用最左邊的選擇按鈕來(lái)選擇多行

注意:
1.如果你設(shè)置了ALV是可編輯的,可能會(huì)覆蓋你在布局中選擇方式的設(shè)置的.
2.設(shè)置了選擇方式以后,我們可以使用很多方法來(lái)獲取用戶的選擇.比如"GET_SELECTED_CELLS","GET_SELECTED_CELLS_ID","GET_SELECTED_ROWS","GET_SELECTED_COLUMNS"
3.在執(zhí)行PAI以后,用戶所選擇的單元格,行或者列可能丟失.你可以在PBO中,使用對(duì)應(yīng)的SET方法來(lái)恢復(fù)這些選擇.


ALV_GRID介紹二(11)
功能五:顏色設(shè)置
有的時(shí)候,我們需要在ALV網(wǎng)格上繪上一些顏色.可以給特定的行,某個(gè)特定的列,某個(gè)特定的單元格繪制顏色.
如果某列被設(shè)置為關(guān)鍵列,這列的顏色將被自動(dòng)繪制,而不需要我們額外的指定.

先介紹ALV里色碼.就是顏色編碼,4位CHAR型.
Cxyz---
Color || |
| 1/0: 相反 開/關(guān)
1/0: 強(qiáng)化 開/關(guān)
其中C是固定的第一位,第二位代表是顏色編碼(1到7),第三位是加強(qiáng)的設(shè)置,第四位是相反,個(gè)人理解,在強(qiáng)化關(guān)閉的情況下,相反的作用是背景和字體的變化.

顏色編碼:
x 顏色 主要使用在
1 Gray-blue headers
2 Light gray List bodies
3 yellow totals
4 Blue-green Key columns
5 green Positive threshold value
6 red Negative threshold value
7 orange Control levels

A)設(shè)置列的顏色.
我們可以通過(guò)字段目錄的"emphasize"控制字段來(lái)控制某列的顏色.這個(gè)字段同樣是4位的CHAR型,傳入上述的顏色編碼.例如:
LS_FCAT-EMPHASIZE = 'C701'.

如果這列被設(shè)置為關(guān)鍵列,就是 LS_FCAT-KEY = 'X' ,那么顏色設(shè)置就不會(huì)起作用.請(qǐng)注意,自動(dòng)產(chǎn)生的字段目錄中,KEY的設(shè)置是自動(dòng)獲取的.

B)設(shè)置行的顏色

為某行設(shè)置顏色,是有點(diǎn)復(fù)雜的,我們需要在要顯示的數(shù)據(jù)內(nèi)表中增加一個(gè)字段,這個(gè)字段不需要在字段目錄中存在.同樣,這個(gè)字段也是4位的CHAR型,符合顏色編碼的定義.
那我們就需要這樣來(lái)定義我們的數(shù)據(jù)內(nèi)表:

DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA rowcolor(4) TYPE c .
DATA END OF gt_list .

很明顯,填入顏色編碼以后,ALV怎么知道它是我們用來(lái)設(shè)置顏色的呢,在布局中,有個(gè)控制字段"INFO_FNAME",我們可以設(shè)置這個(gè)字段來(lái)告訴ALV,我們的顏色字段是哪個(gè).
ps_layout-info_fname = 'ROWCOLOR'.

請(qǐng)注意,這個(gè)字段隨便你起名字,但是記住,一定是數(shù)據(jù)內(nèi)表里的字段,而且這邊設(shè)置的時(shí)候一定要大寫.你可以在任何時(shí)候設(shè)置行的顏色,只需要去修改內(nèi)表里的這個(gè)字段的值,但是記得,一定要刷新以后才起作用.

C)設(shè)置單元格的顏色
設(shè)置單元格和設(shè)置行的顏色,本質(zhì)上沒有什么大的區(qū)別,但是定位單元格需要2個(gè)參數(shù).我們需要在數(shù)據(jù)內(nèi)表中插入一個(gè)表類型的字段,這樣我們的數(shù)據(jù)內(nèi)表就變成了DEEP結(jié)構(gòu)了,不過(guò)ALV是可以處理的.不需要擔(dān)心.
插入的這個(gè)表類型的類型為"LVC_T_SCOL".
里面有3個(gè)參數(shù):
FNAME告訴我們你需要設(shè)置的是哪個(gè)字段,如果為空,然后直接在COLOR中設(shè)置顏色,就是整行設(shè)置為這個(gè)顏色.如果具體到某個(gè)單元格,必須指定是哪個(gè)字段.
COLOR字段是用來(lái)設(shè)置顏色的.
NOKEYCOL字段比較關(guān)鍵了.設(shè)置為關(guān)鍵列的一些字段,我們的顏色設(shè)置可能被覆蓋.通過(guò)這個(gè)字段的設(shè)置,可以避免被關(guān)鍵列覆蓋.
同樣,ALV在布局中有個(gè)字段"CTAB_FNAME"告訴我們,數(shù)據(jù)內(nèi)表中,哪個(gè)字段是用來(lái)設(shè)置單元格的顏色的.
DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA rowcolor(4) TYPE c .
DATA cellcolors TYPE lvc_t_scol .
DATA END OF gt_list .
DATA ls_cellcolor TYPE lvc_s_scol .
...
READ TABLE gt_list INDEX 5 .
ls_cellcolor-fname = 'SEATSOCC' .
ls_cellcolor-color-col = '7' .
ls_cellcolor-color-int = '1' .
APPEND ls_cellcolor TO gt_list-cellcolors .
MODIFY gt_list INDEX 5 .

注意:
顏色設(shè)置中有優(yōu)先級(jí)順序,他們是單元格--->行--->列.

ALV_GRID介紹二(12)
功能六:插入超鏈接
插入超鏈接是通過(guò)一個(gè)含有超級(jí)鏈接和句柄的表來(lái)實(shí)現(xiàn)的.這個(gè)表類型為"LVC_T_HYPE" ,句柄是一個(gè)INT4類型的字段,我們需要在數(shù)據(jù)顯示的內(nèi)表中,加入這樣的字段,來(lái)告訴ALV,我們的字段指定的句柄,從而找到對(duì)應(yīng)的超級(jí)鏈接.在字段目錄中,WEB_FIELD是用來(lái)指定對(duì)應(yīng)的句柄名的.
下面舉個(gè)例子來(lái)說(shuō)明,我們要為字段CARRID,CONNID建立超級(jí)鏈接:

首先,內(nèi)表定義中,我們加入2個(gè)句柄字段:

DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA rowcolor(4) TYPE c .
DATA cellcolors TYPE lvc_t_scol .
DATA carrid_handle TYPE int4 .
DATA connid_handle TYPE int4 .
DATA END OF gt_list .

第二: 建立一個(gè)超級(jí)鏈接內(nèi)表,里面存放句柄所對(duì)應(yīng)的超級(jí)鏈接.創(chuàng)建的時(shí)候注意,它參考的表類型,一定是"LVC_T_HYPE".
FORM prepare_hyperlinks_table CHANGING pt_hype TYPE lvc_t_hype .
DATA ls_hype TYPE lvc_s_hype .
ls_hype-handle = '1' .
ls_hype-href = 'http://www./carrids/car1' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '2' .
ls_hype-href = 'http://www./carrids/car1' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '3' .
ls_hype-href = 'http://www./carrids/car1' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '4' .
ls_hype-href = 'http://www./connids/con11' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '5' .
ls_hype-href = 'http://www./connids/con12'
APPEND ls_hype TO pt_hype .
.. ..
ENDFORM .

第三.通過(guò)字段目錄FIELDCATLOG來(lái)指定相應(yīng)的句柄字段.

對(duì)于CARRID的field catalog
Ls_fieldcat-web_field = ‘CARRID_HANDLE’.
對(duì)于CONNID的field catalog
Ls_fieldcat-web_field = ‘CONNID_HANDLE’.
在方法"SET_TABLE_FOR_FIRST_DISPLAY"中把句柄內(nèi)表傳給參數(shù)it_hyperlink。

第四:在數(shù)據(jù)顯示的內(nèi)表中,指定對(duì)應(yīng)的句柄:
LOOP AT gt_list.
IF gt_list-carrid = ‘XX’.
Gt_list-carrid_handle = ‘1’.
IF gt_list-connid = ‘01’.
Gt_list-connid_handle = ‘4’.
ENDIF.
ENDIF.
ENDLOOP.

ALV_GRID介紹二(13)
功能七:把字段設(shè)置為下拉
有時(shí)候我們可以把一些字段設(shè)置為下拉,比如一些類型,一些字段的值是比較固定的一些值,當(dāng)然,我們也可以通過(guò)搜索幫助來(lái)做,這些只是看各自的愛好和需要了.
設(shè)置為下拉,和上一篇設(shè)置超級(jí)鏈接是類似的,也是使用了一個(gè)內(nèi)表存放了句柄和對(duì)應(yīng)的值,這個(gè)表類型為"LVC_T_DROP".不過(guò)傳遞給ALV的方式有點(diǎn)區(qū)別.超級(jí)鏈接是通過(guò)方法"SET_TABLE_FOR_FIRST_DISPLAY"的參數(shù)來(lái)傳遞的,而下拉的內(nèi)表傳遞需要使用方法"SET_DROP_DOWN_TABLE".
如果我們希望把這個(gè)列都設(shè)置為下拉,那么我們可以在字段目錄中,把控制字段"DRDN_HNDL"指向?qū)?yīng)的下拉內(nèi)表的句柄就可以了.例如: ps_fcat-drdn_hndl = '1' .

如果是某個(gè)單元格設(shè)置為下拉,那我們就需要在數(shù)據(jù)顯示的內(nèi)表中增加一個(gè)句柄字段(如果是有多個(gè)不同的字段需要設(shè)置下拉,可以增加多個(gè)字段),同時(shí)得在字段目錄里設(shè)置"DRDN_FIELD".例如:
ps_fcat-drdn_field = 'PTYP_DD_HNDL' .

數(shù)據(jù)顯示內(nèi)表定義為:
DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA rowcolor(4) TYPE c .
DATA cellcolors TYPE lvc_t_scol .
DATA carrid_handle TYPE int4 .
DATA connid_handle TYPE int4 .
DATA ptype_dd_hndl TYPE int4 .
DATA END OF gt_list .
定義下拉的句柄內(nèi)表:
FORM prepare_drilldown_values.
DATA lt_ddval TYPE lvc_t_drop .
DATA ls_ddval TYPE lvc_s_drop .
ls_ddval-handle = '1' .
ls_ddval-value = 'JFK-12' .
APPEND ls_ddval TO lt_ddval .
ls_ddval-handle = '1' .
ls_ddval-value = 'JSF-44' .
APPEND ls_ddval TO lt_ddval .
ls_ddval-handle = '1' .
ls_ddval-value = 'KMDA-53' .
APPEND ls_ddval TO lt_ddval .
ls_ddval-handle = '1' .
ls_ddval-value = 'SS3O/N' .
APPEND ls_ddval TO lt_ddval .
CALL METHOD gr_alvgrid->set_drop_down_table
EXPORTING
it_drop_down = lt_ddval .
ENDFORM. " prepare_drilldown_values
準(zhǔn)備好內(nèi)表,以后,使用方法set_drop_down_table來(lái)傳遞給ALV.

ALV_GRID介紹二(14)
功能八:基于事件的附加功能

作為使用面向?qū)ο蟮姆椒ㄩ_發(fā)的一個(gè)組件,ALV GRID控制器有很多響應(yīng)用戶交互的事件.這些事件經(jīng)常被用來(lái)增強(qiáng)一些用戶響應(yīng)的功能.為實(shí)現(xiàn)這樣的功能,我們必須在程序中創(chuàng)建一個(gè)類的實(shí)例來(lái)作為ALV GRID實(shí)例的事件處理者.
下表列出了一些ALV GRID的事件,后面的HTML列用來(lái)說(shuō)明是否在HTML形式SAP GUI上支持.

用戶定義文本輸出:
Event Application HTML
Print_end_of_list Define output text to be printed at the end of the entire list √
Print_top_of_list Define output text to be printed at begin of the entire list √
Print_top_of_page Define output text to be printed at begin of each page √
Print_end_of_page Define output text to be printed at the end of each page √
Subtotal_text Define self-defined subtotal texts √

ALV GRID的鼠標(biāo)動(dòng)作事件
Event Application HTML
Button_click Query click on a push button in the ALV GRID control √
Double_click Query a double click on a cell of the ALV GRID √
Hotspot_click Query a hotspot click on columns defined for this purpose in advance √
ondrag Collect information when elements of the ALV GRID Control are dragged ×
ondrop Process information when elements of the ALV GRID Control are dropped ×
ondropComplete Perform final actions after successful drag&drop ×
ondropGetFlavor Distinguish between options for drag&drop behavior ×

自定義和標(biāo)準(zhǔn)功能實(shí)現(xiàn)
Event Application HTML
Before_user_command Query self-defined and standard functions √
User_command Query self-defined function codes √
After_user_command Query self-defined and standard functions codes √

自定義功能的定義(自定義按鈕,菜單等等)
Event Application HTML
Tool bar Change,delete or add gui elements on alv grid √
Menu_button Define menus for menu buttons in the toolbar √
Context_menu_request Change context menu ×
Onf1 Define self-defined f1 help √

下面是一段代碼,舉例說(shuō)明如果定義我們的事件處理類.
CLAS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
*--在ALV的工具條上增加新的按鈕
Handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive,
*--實(shí)現(xiàn)用戶命令
Handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
*--熱點(diǎn)點(diǎn)擊控制
Handle_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id e_column_id es_row_no.
*--在用戶命令觸發(fā)之前
Handle_before_user_command
FOR EVENT before_user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
*--在用戶命令觸發(fā)之后
Handle_after_user_command
FOR EVENT after_user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
*--在ALV可修改的情況下,控制數(shù)據(jù)修改
Handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
*--在數(shù)據(jù)修改完成之后
Handle_data_changed_finished
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified.
*--管理菜單
Handle_menu_button
FOR EVENT menu_button OF cl_gui_alv_grid
IMPORTING e_object e_ucomm.
*--管理按鈕點(diǎn)擊
Handle_button_click
FOR EVENT button_click OF cl_gui_alv_grid
IMPORTING e_objec e_ucomm.
PRIVATE SECTION.
ENDCLASS.

下面是類的實(shí)現(xiàn)的一些概要代碼,參數(shù)可以從ALV的事件中直接獲取出來(lái):
CLASS lcl_event_handler IMPLEMENTATION.
*-- Handle toolbar
METHOD handle_toolbar.
PERFORM handle_toolbar USIGN e_object e_interactive.
ENDMETHOD.
*-- Handle hotspot click
METHOD handle_hotspot_click.
PERFORM handle_hotspot_click USING e_row_id e_column_id es_row_no.
ENDMETHOD.
*-- Handle double click
METHOD handle_double_click.
PERFORM handle_double_click USING e_row e_column es_row_no.
ENDMETHOD.
*-- Handle after user command
METHOD handle _after_user_command.
PERFORM handle_after_user_command USING e_object.
ENDFORM.
*-- Handle before user command
METHOD handle_before_user_command.
PERFORM handle_before_user_command.
ENDMETHOD.
*--Handle data changed
METHOD handle_data_changed.
PERFORM handle_data_changed USING er_data_changed.
ENDMEHTOD.
METHOD handle_data_changed_finished.
PERFORM handle_data_chaged USING e_modified.
ENDMETHOD.
METHOD handle_menu_button.
PERFORM handle_menu_button USING e_object e_ucomm.
ENDMEHTOD.
MEHTOD handle_button_click.
PERFORM handle_button_click USING e_objcet e_ucomm.
ENDMETHOD.
ENDCALSS.

光定義了這些還不夠,我們需要把事件管理類注冊(cè)到ALV GRID的實(shí)例事件.
DATA gr_event_handler TYPE REF TO lcl_event_handler .
.. ..
*--Creating an instance for the event handler
CREATE OBJECT gr_event_handler .
*--Registering handler methods to handle ALV Grid events
SET HANDLER gr_event_handler->handle_user_command FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_toolbar FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_menu_button FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_double_click FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_hotspot_click FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_button_click FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_before_user_command FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_context_menu_request FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_data_changed FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_data_changed_finished FOR gr_alvgrid .


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多