ALV_GRID介绍
一.ALV介紹
The ALV Grid Control (ALV = SAP List Viewer)是一個顯示列表的靈活的工具,它提供了基本功能的列表操作,也可以通過自定義來進行增強,因此可以允許你可以在大型的應用程序中使用.
SAP提示: 在SAP的開發項目中,ALV GRID也可以作為修改和創建數據的一種工具,然而,目前這個功能只在實驗計劃中使用,還沒有向客戶發布.
下面是一個ALV GRID的圖片:
它包括3大部分,工具欄,標題,用于顯示數據的網格控制器.如果有必要,用戶可以隱藏標題和工具欄.
ALV家族包含3中ALV工具:簡易的,兩層ALV,分等級連續的列表和樹形結構的ALV.
二.ALV GRID CONTROL (ALV網格控制器)
ALV GRID CONTROL使用了控制器技術以實現藝術性的屏幕顯示,象所有的控制器一樣,ALV GRID CONTROL通過系統中的一個全局的類提供了方法,以響應它的動作.
使用了ABAP的對象以后,列表是通過ALV的一個實例(INSTANCE)來顯示的,程序員可以使用ABAP對象的事件管理.
三.ALV GRID CONTROL 實例
ALV GRID實例的定義,參照CL_GUI_ALV_GRID類
data ALV_GRID1 type ref to cl_gui_alv_grid.
ALV GRID繼承結構:
ALV_GRID介紹二(1)
四、ALV GRID相關的幾個控制結構
1.字段目錄 [Field catalog]
字段目錄是用來控制ALV顯示的網格中每個字段的屬性的,比如字段的順序,對齊方式,可編輯狀態,顏色,等等.
常用的控制字段如下:(下面的示例將說明這些字段的使用,參考STRUCTURE LVC_S_FCAT)
2 ROW_POS ALV 控制: 輸出行 (內部使用)
3 COL_POS ALV 控制: 輸出列 列的位置,第幾列,例如1,2,…..
4 FIELDNAME ALV 控制: 內部表字段的字段名稱 字段名稱
5 TABNAME LVC 標簽名稱 表名,如果是內表,是1
6 CURRENCY ALV 控制: 貨幣單位
7 CFIELDNAME ALV 控制: 參考的當前單位的字段名稱
8 QUANTITY ALV 控制: 計量單位
9 QFIELDNAME ALV 控制: 參考計量單位的字段名稱
10 IFIELDNAME ALV 控制: 內部表字段的字段名稱
11 ROUND ALV 控制: ROUND 值
12 EXPONENT ALV 控制:流動表示的指數
13 KEY ALV 控制: 關鍵字段 關鍵字段,前面變藍色
14 KEY_SEL ALV 控制: 可以被隱藏的關鍵列 可以被隱藏的關鍵列
15 ICON ALV 控制: 作為圖標輸出 此列作為圖標輸出
16 SYMBOL ALV 控制: 輸出作為符號
17 CHECKBOX ALV 控制: 作為復選框輸出 復選框輸出
18 JUST ALV 控制: 對齊 對齊方式:
'R': right justified
'L': left justified
'C': centered
19 LZERO ALV 控制: 輸出前導零 X'
20 NO_SIGN ALV 控制:輸出抑制符號 X',不輸出符號
21 NO_ZERO ALV 控制: 為輸出隱藏零 X',隱藏0
22 NO_CONVEXT ALV 控制: 不考慮輸出的轉換退出
23 EDIT_MASK ALV 控制: 為輸出編輯掩碼 格式
24 EMPHASIZE ALV 控制: 帶有顏色的高亮列 列的顏色
25 FIX_COLUMN ALV 控制: 固定列
26 DO_SUM ALV 控制: 總計列值 X',合計
?
ALV_GRID介紹二(2)
27 NO_SUM ALV 控制: 沒有總計列值 X' ,沒有合計
28 NO_OUT ALV 控制: 列沒有輸出 X' ,隱藏此列
29 TECH ALV 控制: 技術字段 X'.也是隱藏,但是有點不一樣
30 OUTPUTLEN ALV 控制: 列的字符寬度 輸出的長度
31 CONVEXIT 轉換例程
32 SELTEXT ALV 控制: 對話功能的列標識符
33 TOOLTIP ALV 控制: 列抬頭的工具提示
34 ROLLNAME ALV 控制: F1 幫助的數據元素
35 DATATYPE ABAP 字典中的數據類型 ABAP 字典中的數據類型
36 INTTYPE ABAP 數據類型(C,D,N,...) ABAP 數據類型(C,D,N,...)
37 INTLEN 以字節計的內部長度 內容的長度
38 LOWERCASE 允許/不允許小寫字母 X' 允許大小寫
39 REPTEXT 標題
40 HIER_LEVEL ALV 控制: 內部使用
41 REPREP ALV 控制: 價值是補充/補充接口的選擇標準
42 DOMNAME 定義域名
43 SP_GROUP 組代碼
44 HOTSPOT ALV 控制: 單擊敏感 X',下面出現下劃線,響應單擊
45 DFIELDNAME ALV 控制: 數據庫中列組的字段名稱
46 COL_ID ALV 控制: 列 ID
47 F4AVAILABL 字段有輸入幫助嗎 X'.此列有搜索幫助
48 AUTO_VALUE ALV 控制: 自動復制值
49 CHECKTABLE 表名
50 VALEXI 固定值存在
51 WEB_FIELD ALV 控制: 內部表字段的字段名稱
52 HREF_HNDL 自然數 熱點連接的句柄
53 STYLE ALV 控制: 樣式 下面有例子會介紹,比如PUSHBUTTION
54 STYLE2 ALV 控制: 樣式
55 STYLE3 ALV 控制: 樣式
56 STYLE4 ALV 控制: 樣式
57 DRDN_HNDL 自然數 下拉的句柄
58 DRDN_FIELD ALV 控制: 內部表字段的字段名稱 下拉的字段
59 NO_MERGING 字符字段長度 1 相同的值不合并
60 H_FTYPE ALV 樹控制: 功能類型 (總計,平均,最大.最小, ...)
61 COL_OPT 可選列優化的條目
62 NO_INIT_CH 字符字段長度 1
63 DRDN_ALIAS 字符字段長度 1
64 REF_FIELD ALV 控制: 內部表字段的參考字段名稱
65 REF_TABLE ALV 控制: 內部表字段的參考表名稱
66 TXT_FIELD ALV 控制: 內部表字段的字段名稱
67 ROUNDFIELD ALV 控制: 帶有 ROUND 說明的字段名稱
68 DECIMALS_O ALV 控制: 輸出小數位的編號
69 DECMLFIELD ALV 控制: 帶有 DECIMALS 說明的字段名稱
70 DD_OUTLEN ALV 控制: 輸出字符長度
71 DECIMALS 小數點后的位數 設置小數的位數
72 COLTEXT ALV 控制: 列標題 列標題
73 SCRTEXT_L 長字段標簽
74 SCRTEXT_M 中字段標簽
75 SCRTEXT_S 短字段標簽
76 COLDDICTXT ALV 控制: 確定 DDIC 文本參考
77 SELDDICTXT ALV 控制: 確定 DDIC 文本參考
78 TIPDDICTXT ALV 控制: 確定 DDIC 文本參考
79 EDIT ALV 控制: 準備輸入 輸出狀態.'X'可輸入
80 TECH_COL ALV 控制: 內部使用
81 TECH_FORM ALV 控制: 內部使用
82 TECH_COMP ALV 控制: 內部使用
83 HIER_CPOS ALV 控制: 層次列位置
84 H_COL_KEY 樹控制: 列名稱/項目名稱
85 H_SELECT 標識是否可以選擇樹控制中的列
86 DD_ROLL 數據元素 (語義域)
87 DRAGDROPID ALV 控制: 拖&放處理拖放對象
88 MAC 字符字段長度 1
89 INDX_FIELD 自然數
90 INDX_CFIEL 自然數
91 INDX_QFIEL 自然數
92 INDX_IFIEL 自然數
93 INDX_ROUND 自然數
94 INDX_DECML 自然數
95 GET_STYLE 字符字段長度 1
96 MARK 字符字段長度 1
?
ALV_GRID介紹二(3)
2.布局控制[layout]
布局是用來控制整個ALV的一個布局,比如ALV的標題,是否可編輯,行顏色,列顏色.
參照ALV的控制結構[LVC_S_LAYO],以后的例子我將詳細介紹如何設置行顏色和列顏色.
詳細的結構說明
字段名 描述 Value range
CWIDTH_OPT 最優化寬度 SPACE, 'X'
SMALLTITLE 小標題,如果設置了這個字段,
則標題與列標題大小一樣 SPACE, 'X'
GRID_TITLE 標題,在網格和工具條之間 最長70個字符
NO_HEADERS 如果被設置,列標題隱藏 SPACE, 'X'
NO_HGRIDLN 隱藏水平線 SPACE, 'X'
NO_MERGING 禁用單元格合并 SPACE, 'X'
NO_ROWMARK 如果被設置,選擇列在選擇模式
為D和A的時候隱藏 SPACE, 'X'
NO_TOOLBAR 隱藏工具條 SPACE, 'X'
NO_VGRIDLN 隱藏垂直線 SPACE, 'X'
SEL_MODE 選擇模式 SPACE, 'A', 'B', 'C', 'D'
EXCP_CONDS 合計例外 SPACE, 'X'
EXCP_FNAME 字段名稱帶有例外編碼 最長30個字符
EXCP_LED 例外作為 LED SPACE, 'X'
EXCP_ROLLN 例外文檔的數據元素 SPACE, 'X'
CTAB_FNAME 帶有復雜單元格顏色編碼的字段名稱 最長30個字符
INFO_FNAME 帶有簡單行彩色代碼的字段名稱 最長30個字符
ZEBRA 可選行顏色,如果設置了,出現了間隔色帶 SPACE, 'X'
NO_TOTLINE 沒有總計 SPACE, 'X'
NUMC_TOTAL 可以對NUMC字段進行合計 SPACE, 'X'
TOTALS_BEF 總計輸出在第一行,小計在新的值之前 SPACE, 'X'
STYLEFNAME 設置單元格,比如PUSHBUTTON 最長30個字符
ALV_GRID介紹二(4)
3.打印和排序,過濾控制
打印的參數控制請參考結構 [LVC_S_PRNT]
排序的參數控制請參考結構[LVC_S_SORT]
過濾的參數控制請參考結構[LVC_S_FILT]
這里不再一一解釋,進入中文版本,里面應該也有解釋的,雖然一些不是很清楚.
五.編寫簡單的ALV程序.
首先這里就不詳細介紹DIALOG的用法了.
OO的ALV GRID必須存在于一個容器當中,就是FUNCTION的ALV,其實也是一樣的,底層也是使用CL_GUI_ALV_GRID這個類的.
首先ALV的顯示需要有幾個先決條件.
1,字段目錄,這個是必須的,如果沒有這個參數,參考一個數據字典也是可以的,就是參數I_STRUCTURE_NAME.
2.存放數據的內表,最好內表的結構和字段目錄是一致的,否則可能會出現一些無法預知的錯誤,當然你說我非要不一樣,那也不一定會出現錯誤.我建議是最好一樣的.
這2個是必須的,布局的話,應該是可以不設置的,使用默認的就可以了.
第一步:創建個SCREEN,在屏幕上創建個容器,CONTAINER.定義變量.
DATA:
WCL_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
WCL_ALV TYPE REF TO CL_GUI_ALV_GRID .
*--- 存放字段目錄的內表
DATA gt_fieldcat TYPE lvc_t_fcat .
*--- 布局結構
DATA gs_layout TYPE lvc_s_layo .
*----聲明需要顯示的內表(以SFLIGHT為例)
DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA END OF gt_list .
第二步: 創建ALV這個對象,它的父組件是那個容器.
在PBO中寫入如下代碼:
PROCESS BEFORE OUTPUT .
MODULE display_alv .
創建DISPLAY_ALV的MODULE后,寫下如下代碼:
MODULE display_alv OUTPUT .
PERFORM display_alv .
ENDMODULE .
在FORM DISPLAY_ALV中,判斷ALV實例是否存在,如果不存在,則創建:
IF WCL_ALV IS INITIAL .
CREATE OBJECT: WCL_CONTAINER
EXPORTING
CONTAINER_NAME = 'ALV_CON'.
CREATE OBJECT WCL_ALV
EXPORTING
I_PARENT = WCL_CONTAINER.
*-----準備獲取字段目錄
PERFORM prepare_field_catalog CHANGING gt_fieldcat .
*-----設置布局
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"的參數說明
參數 含義
I_BUFFER_ACTIVE 如果方法調用是靜態的,可以設置這個標記,這表示,如果每次顯示ALV都是
相同的字段目錄.既然這樣,那么字段目錄會被放到一個特殊的緩存里,
這樣加速了ALV的顯示
I_STRUCTURE_NAME 輸出數據參考的數據字典的結構名,例如'SFLIGHT'.如果指定了這個參數,字段
目錄會自動生成,下面的參數IT_FIELDCATALOG不需要傳值.
IS_VARIANT 決定布局顯示的變式
I_SAVE 決定用戶是否可以保存變式:
'X' 只能保存全局變式
'U' 只能保存特定變式
'A' 都可以保存
SPACE 不可以保存變式
I_DEFAULT 決定用戶是否可以定義默認的布局:
'X' 可以定義默認布局,這個參數是默認的
SPACE 不可以定義默認布局
IS_LAYOUT 布局參數,傳遞布局控制的一些信息
IS_PRINT 后臺打印屬性的參數
IT_SPECIAL_GROUPS 如果在字段目錄中,一些字段通過SP_GROUP被分組在一起.我們就必須為這些
組傳遞一個組的文本內表進去
IT_TOOLBAR_EXCLUDING 需要隱藏的標準的按鈕的內表
IT_HYPERLINK 為每個句柄分配了超連接的內表,LVC_S_HYPE中的HREF存放了超連接的地址,
HANDLE指定了句柄,使用這些句柄,你可以在GRID中使用超連接
IT_ALV_GRAPHICS 比較復雜,沒有用過,意思好象是可以在圖表中顯示ALV.
IT_OUTTAB 輸出數據存放的內表,數據都是存放在這個內表里
IT_FIELDCATALOG 字段目錄
IT_SORT 排序的標準
IT_FILTER 過濾的標準
方法"REFRESH_TABLE_DISPLAY"的參數說明
參數 含義
IS_STABLE 刷新的穩定性,有2個參數,一個是行,一個是列.如果設置了相應的值,
那么對應的行,或者列,在刷新的時候,將會保持穩定,就是滾動條保持不動.
I_SOFT_REFRESH 這個參數只是在異常情況下被使用,如果設置了這個參數,任何創建的合計,
任何排序次序,任何為了顯示數據而設置的過濾都將保持不變.這個是非常
有意義的.例如:當然你沒有修改數據內表里的數據而想刷新ALV,僅僅只是
改變一下布局和字段目錄.
?
ALV_GRID介紹二(5)
第三步,獲取要顯示數據的字段目錄.有兩種方式.
1.手動創建
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.半自動的創建
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)
第四步,設置布局
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
第五步,排除不需要的標準按鈕(可選,這個是第一種方法,還有另外一種,在添加自定義的按鈕的時候介紹)
在你的ALV上,如果你想排除一些你不想要的標準按鈕,你可以把需要排除的按鈕填入到表UI_FUNCTIONS中,然后傳給 set_table_for_first_display方法的參數"IT_TOOLBAR_EXCLUDING".這些按鈕的功能碼一般都可以通過查看類cl_gui_alv_grid的常量屬性中獲取到,或者自己加個斷點,在after_user_command事件中.
如果你要隱藏全部的工具條,你可以把layout中的no_toolbar設置為"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)
按照上面的步驟,一個ALV的DEMO基本可以創建了.下面我們將講述一些功能.
功能一:在第一次顯示以后,修改字段目錄和布局.
在運行的時候,很有可能需要在顯示之后,需要設置一個新的布局或者字段目錄.有下面這些方法去實現.
字段目錄 : get_frontend_fieldcatalog
set_frontend_fieldcatalog
布局: get_frontend_layout
set_frontend_layout
使用這些方法,你在執行的任何時候,可以獲取這些內容,然后修改他們.
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)
功能二:設置排序條件
有時候我們需要使用到數據的排序.這個可以通過填充參考結構LVC_T_SORT創建的內表來實現,這個內表中包含了排序的標準.可以傳遞給set_table_for_first_display這個方法的IT_SORT參數來初始化一個排序.
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點特別的說明:
1.如果這邊排序的字段名,不存在于字段目錄中,那將出現DUMP.
2.排序以后,垂直的網格中,如果出現相同的內容,就會合并,如果要避免,請在布局中設置"no_merging"為"X" .
你可以通過使用方法“get_sort_criteria” 和“set_sort_criteria”來獲取和設置排序的標準.
?
ALV_GRID介紹二(9)
功能三:設置過濾(和排序類似)
ALV的標準按鈕中已經有過濾的功能,我們也可以在初始顯示的時候就設置過濾條件.我們需要把過濾條件填充到參考表類型"LVC_T_FILT"創建的內表中.過濾條件是類似一個RANGES結構的.然后把這個內表傳遞給方法"SET_TABLE_FOR_FIRST_DISPLAY"中的參數"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"來獲取過濾條件和設置過濾條件.
ALV_GRID介紹二(10)
功能四:選擇方式
有時候,我們需要選擇一些單元格,行或者列,在布局中,有個參數"SEL_MODE"可以設置我們不同的選擇方式.下面是參數的介紹.和不同的地方.
值 模式 可能的選擇 注釋
SPACE 等同于B 參考B 默認設置
'A' 行和列的選擇,無法選擇單元格 多行,多列 用戶可以使用最左邊的選擇按鈕來選擇多行
'B' 單選,不可以多選行,不可以多選單元格 多行,多列
'C' 多選,可以多選行,不可以多選單元格 多行,多列
'D' 單元格的選擇,可以多選單元格 多行,多列,任何單元格多選 用戶可以使用最左邊的選擇按鈕來選擇多行
注意:
1.如果你設置了ALV是可編輯的,可能會覆蓋你在布局中選擇方式的設置的.
2.設置了選擇方式以后,我們可以使用很多方法來獲取用戶的選擇.比如"GET_SELECTED_CELLS","GET_SELECTED_CELLS_ID","GET_SELECTED_ROWS","GET_SELECTED_COLUMNS"
3.在執行PAI以后,用戶所選擇的單元格,行或者列可能丟失.你可以在PBO中,使用對應的SET方法來恢復這些選擇.
ALV_GRID介紹二(11)
功能五:顏色設置
有的時候,我們需要在ALV網格上繪上一些顏色.可以給特定的行,某個特定的列,某個特定的單元格繪制顏色.
如果某列被設置為關鍵列,這列的顏色將被自動繪制,而不需要我們額外的指定.
先介紹ALV里色碼.就是顏色編碼,4位CHAR型.
Cxyz---
Color || |
| 1/0: 相反 開/關
1/0: 強化 開/關
其中C是固定的第一位,第二位代表是顏色編碼(1到7),第三位是加強的設置,第四位是相反,個人理解,在強化關閉的情況下,相反的作用是背景和字體的變化.
顏色編碼:
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)設置列的顏色.
我們可以通過字段目錄的"emphasize"控制字段來控制某列的顏色.這個字段同樣是4位的CHAR型,傳入上述的顏色編碼.例如:
LS_FCAT-EMPHASIZE = 'C701'.
如果這列被設置為關鍵列,就是 LS_FCAT-KEY = 'X' ,那么顏色設置就不會起作用.請注意,自動產生的字段目錄中,KEY的設置是自動獲取的.
B)設置行的顏色
為某行設置顏色,是有點復雜的,我們需要在要顯示的數據內表中增加一個字段,這個字段不需要在字段目錄中存在.同樣,這個字段也是4位的CHAR型,符合顏色編碼的定義.
那我們就需要這樣來定義我們的數據內表:
DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA rowcolor(4) TYPE c .
DATA END OF gt_list .
很明顯,填入顏色編碼以后,ALV怎么知道它是我們用來設置顏色的呢,在布局中,有個控制字段"INFO_FNAME",我們可以設置這個字段來告訴ALV,我們的顏色字段是哪個.
ps_layout-info_fname = 'ROWCOLOR'.
請注意,這個字段隨便你起名字,但是記住,一定是數據內表里的字段,而且這邊設置的時候一定要大寫.你可以在任何時候設置行的顏色,只需要去修改內表里的這個字段的值,但是記得,一定要刷新以后才起作用.
C)設置單元格的顏色
設置單元格和設置行的顏色,本質上沒有什么大的區別,但是定位單元格需要2個參數.我們需要在數據內表中插入一個表類型的字段,這樣我們的數據內表就變成了DEEP結構了,不過ALV是可以處理的.不需要擔心.
插入的這個表類型的類型為"LVC_T_SCOL".
里面有3個參數:
FNAME告訴我們你需要設置的是哪個字段,如果為空,然后直接在COLOR中設置顏色,就是整行設置為這個顏色.如果具體到某個單元格,必須指定是哪個字段.
COLOR字段是用來設置顏色的.
NOKEYCOL字段比較關鍵了.設置為關鍵列的一些字段,我們的顏色設置可能被覆蓋.通過這個字段的設置,可以避免被關鍵列覆蓋.
同樣,ALV在布局中有個字段"CTAB_FNAME"告訴我們,數據內表中,哪個字段是用來設置單元格的顏色的.
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 .
注意:
顏色設置中有優先級順序,他們是單元格--->行--->列.
ALV_GRID介紹二(12)
功能六:插入超鏈接
插入超鏈接是通過一個含有超級鏈接和句柄的表來實現的.這個表類型為"LVC_T_HYPE" ,句柄是一個INT4類型的字段,我們需要在數據顯示的內表中,加入這樣的字段,來告訴ALV,我們的字段指定的句柄,從而找到對應的超級鏈接.在字段目錄中,WEB_FIELD是用來指定對應的句柄名的.
下面舉個例子來說明,我們要為字段CARRID,CONNID建立超級鏈接:
首先,內表定義中,我們加入2個句柄字段:
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 .
第二: 建立一個超級鏈接內表,里面存放句柄所對應的超級鏈接.創建的時候注意,它參考的表類型,一定是"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.company.com/carrids/car1' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '2' .
ls_hype-href = 'http://www.company.com/carrids/car1' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '3' .
ls_hype-href = 'http://www.company.com/carrids/car1' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '4' .
ls_hype-href = 'http://www.company.com/connids/con11' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '5' .
ls_hype-href = 'http://www.company.com/connids/con12'
APPEND ls_hype TO pt_hype .
.. ..
ENDFORM .
第三.通過字段目錄FIELDCATLOG來指定相應的句柄字段.
對于CARRID的field catalog
Ls_fieldcat-web_field = ‘CARRID_HANDLE’.
對于CONNID的field catalog
Ls_fieldcat-web_field = ‘CONNID_HANDLE’.
在方法"SET_TABLE_FOR_FIRST_DISPLAY"中把句柄內表傳給參數it_hyperlink。
第四:在數據顯示的內表中,指定對應的句柄:
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)
功能七:把字段設置為下拉
有時候我們可以把一些字段設置為下拉,比如一些類型,一些字段的值是比較固定的一些值,當然,我們也可以通過搜索幫助來做,這些只是看各自的愛好和需要了.
設置為下拉,和上一篇設置超級鏈接是類似的,也是使用了一個內表存放了句柄和對應的值,這個表類型為"LVC_T_DROP".不過傳遞給ALV的方式有點區別.超級鏈接是通過方法"SET_TABLE_FOR_FIRST_DISPLAY"的參數來傳遞的,而下拉的內表傳遞需要使用方法"SET_DROP_DOWN_TABLE".
如果我們希望把這個列都設置為下拉,那么我們可以在字段目錄中,把控制字段"DRDN_HNDL"指向對應的下拉內表的句柄就可以了.例如: ps_fcat-drdn_hndl = '1' .
如果是某個單元格設置為下拉,那我們就需要在數據顯示的內表中增加一個句柄字段(如果是有多個不同的字段需要設置下拉,可以增加多個字段),同時得在字段目錄里設置"DRDN_FIELD".例如:
ps_fcat-drdn_field = 'PTYP_DD_HNDL' .
數據顯示內表定義為:
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 .
定義下拉的句柄內表:
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
準備好內表,以后,使用方法set_drop_down_table來傳遞給ALV.
ALV_GRID介紹二(14)
功能八:基于事件的附加功能
作為使用面向對象的方法開發的一個組件,ALV GRID控制器有很多響應用戶交互的事件.這些事件經常被用來增強一些用戶響應的功能.為實現這樣的功能,我們必須在程序中創建一個類的實例來作為ALV GRID實例的事件處理者.
下表列出了一些ALV GRID的事件,后面的HTML列用來說明是否在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的鼠標動作事件
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 ×
自定義和標準功能實現
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 √
下面是一段代碼,舉例說明如果定義我們的事件處理類.
CLAS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
*--在ALV的工具條上增加新的按鈕
Handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive,
*--實現用戶命令
Handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
*--熱點點擊控制
Handle_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id e_column_id es_row_no.
*--在用戶命令觸發之前
Handle_before_user_command
FOR EVENT before_user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
*--在用戶命令觸發之后
Handle_after_user_command
FOR EVENT after_user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
*--在ALV可修改的情況下,控制數據修改
Handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
*--在數據修改完成之后
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.
*--管理按鈕點擊
Handle_button_click
FOR EVENT button_click OF cl_gui_alv_grid
IMPORTING e_objec e_ucomm.
PRIVATE SECTION.
ENDCLASS.
下面是類的實現的一些概要代碼,參數可以從ALV的事件中直接獲取出來:
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.
光定義了這些還不夠,我們需要把事件管理類注冊到ALV GRID的實例事件.
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 .
總結
以上是生活随笔為你收集整理的ALV_GRID介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在TC里输出下拉列表
- 下一篇: SAP alv 去掉标准按钮