一.ALV介紹 程序員
The ALV Grid Control (ALV = SAPList Viewer)是一個顯示列表的靈活的工具,它提供了基本功能的列表操做,也能夠經過自定義來進行加強,所以能夠容許你能夠在大型的應用程序中使用.web
SAP提示: 在SAP的開發項目中,ALV GRID也能夠做爲修改和建立數據的一種工具,然而,目前這個功能只在實驗計劃中使用,尚未向客戶發佈.sql
下面是一個ALV GRID的圖片:docker
它包括3大部分,工具欄,標題,用於顯示數據的網格控制器.若是有必要,用戶能夠隱藏標題和工具欄.數據庫
ALV家族包含3中ALV工具:簡易的,兩層ALV,分等級連續的列表和樹形結構的ALV.緩存
二.ALV GRID CONTROL (ALV網格控制器)app
ALV GRID CONTROL使用了控制器技術以實現藝術性的屏幕顯示,象全部的控制器同樣,ALV GRID CONTROL經過系統中的一個全局的類提供了方法,以響應它的動做.frontend
使用了ABAP的對象之後,列表是經過ALV的一個實例(INSTANCE)來顯示的,程序員可使用ABAP對象的事件管理.工具
三.ALV GRID CONTROL實例
ALV GRID實例的定義,參照CL_GUI_ALV_GRID類
data ALV_GRID1 type refto cl_gui_alv_grid.
ALV GRID繼承結構:
4、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',合計 |
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 |
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個字符 |
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 BEFOREOUTPUT . 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 CHANGINGgt_fieldcat .
*-----設置佈局
PERFORM prepare_layout CHANGING gs_layout .
*-----顯示ALV
CALL METHODgr_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 METHODgr_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,僅僅只是 改變一下佈局和字段目錄. |
第三步,獲取要顯示數據的字段目錄.有兩種方式.
1.手動建立
FORM prepare_field_catalog CHANGINGpt_fieldcat TYPE lvc_t_fcat . DATA ls_fcat type lvc_s_fcat . ls_fcat-fieldname = 'CARRID' . ls_fcat-inttype = 'C' . l s_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 TYPElvc_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 .
第四步,設置佈局
FORM prepare_layout CHANGING ps_layout TYPElvc_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 TYPEui_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的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 .
功能二:設置排序條件
有時候咱們須要使用到數據的排序.這個能夠經過填充參考結構LVC_T_SORT建立的內表來實現,這個內表中包含了排序的標準.能夠傳遞給set_table_for_first_display這個方法的IT_SORT參數來初始化一個排序.
FORM prepare_sort_table CHANGING pt_sort TYPElvc_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的標準按鈕中已經有過濾的功能,咱們也能夠在初始顯示的時候就設置過濾條件.咱們須要把過濾條件填充到參考表類型"LVC_T_FILT"建立的內表中.過濾條件是相似一個RANGES結構的.而後把這個內表傳遞給方法"SET_TABLE_FOR_FIRST_DISPLAY"中的參數"IT_FILTER"
FORM prepare_filter_table CHANGING pt_filt TYPElvc_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"來獲取過濾條件和設置過濾條件.
功能四:選擇方式
有時候,咱們須要選擇一些單元格,行或者列,在佈局中,有個參數"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方法來恢復這些選擇.
功能六:插入超連接
插入超連接是經過一個含有超級連接和句柄的表來實現的.這個表類型爲"LVC_T_HYPE" ,句柄是一個INT4類型的字段,咱們須要在數據顯示的內表中,加入這樣的字段,來告訴ALV,咱們的字段指定的句柄,從而找到對應的超級連接.在字段目錄中,WEB_FIELD是用來指定對應的句柄名的.
下面舉個例子來講明,咱們要爲字段CARRID,CONNID創建超級連接:
首先,內表定義中,咱們加入2個句柄字段:
DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURESFLIGHT .
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 CHANGINGpt_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.
功能七:把字段設置爲下拉
有時候咱們能夠把一些字段設置爲下拉,好比一些類型,一些字段的值是比較固定的一些值,固然,咱們也能夠經過搜索幫助來作,這些只是看各自的愛好和須要了.
設置爲下拉,和上一篇設置超級連接是相似的,也是使用了一個內表存放了句柄和對應的值,這個表類型爲"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 TOlt_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 METHODgr_alvgrid->set_drop_down_table EXPORTING it_drop_down= lt_ddval . ENDFORM. " prepare_drilldown_values
準備好內表,之後,使用方法set_drop_down_table來傳遞給ALV.
功能八:基於事件的附加功能
做爲使用面向對象的方法開發的一個組件,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_toolbarFOR 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.
METHODS HANDLE_ONF4 "F4
FOR EVENT ONF4 OF CL_GUI_ALV_GRID
IMPORTING E_FIELDNAME ES_ROW_NO ER_EVENT_DATA.
PRIVATE SECTION. ENDCLASS.
下面是類的實現的一些概要代碼,參數能夠從ALV的事件中直接獲取出來:
CLASS lcl_event_handler IMPLEMENTATION. *-- Handle toolbar METHOD handle_toolbar. PERFORM handle_toolbarUSIGN e_object e_interactive. ENDMETHOD. *-- Handle hotspot click METHOD handle_hotspot_click. PERFORMhandle_hotspot_click USING e_row_id e_column_id es_row_no. ENDMETHOD. *-- Handle double click METHOD handle_double_click. PERFORMhandle_double_click USING e_row e_column es_row_no. ENDMETHOD. *-- Handle after user command METHOD handle _after_user_command. PERFORMhandle_after_user_command USING e_object. ENDFORM. *-- Handle before user command METHOD handle_before_user_command. PERFORMhandle_before_user_command. ENDMETHOD. *--Handle data changed METHOD handle_data_changed. PERFORMhandle_data_changed USING er_data_changed. ENDMEHTOD. METHOD handle_data_changed_finished. PERFORMhandle_data_chaged USING e_modified. ENDMETHOD. METHOD handle_menu_button. PERFORMhandle_menu_button USING e_object e_ucomm. ENDMEHTOD. MEHTOD handle_button_click. PERFORMhandle_button_click USING e_objcet e_ucomm. ENDMETHOD.
MEHTOD METHODS HANDLE_ONF4 .
PERFORM METHODS HANDLE_ONF4 USING .
ENDMETHOD. ENDCALSS. *光定義了這些還不夠,咱們須要把事件管理類註冊到ALV GRID的實例事件. *--------------f4--
DATA: L_FIELD TYPE LVC_FNAME,
LT_F4 TYPE LVC_T_F4,
LS_F4 TYPE LVC_S_F4.
* LS_F4-FIELDNAME = 'UMSKZ'.
* LS_F4-REGISTER = 'X'.
"LS_F4-GETBEFORE = 'X'. "打'X'會在彈出窗體以前先刷新ALV數據
"LS_F4-CHNGEAFTER = 'X'. "打'X'會在關閉窗體以後刷新ALV數據
"LS_F4-INTERNAL = ''.
INSERT LS_F4 INTO TABLE LT_F4.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = TEM_GRID.
CALL METHOD TEM_GRID->REGISTER_EDIT_EVENT "註冊GRID事件
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER"事件:回車
EXCEPTIONS
ERROR = 1
OTHERS = 2.
* CALL METHOD TEM_GRID->REGISTER_F4_FOR_FIELDS
* EXPORTING
* IT_F4 = LT_F4.
CREATE OBJECT GT_EVENT_RECEIVER.
SET HANDLER GT_EVENT_RECEIVER->HANDLE_MODIFY FOR TEM_GRID.
SET HANDLER GT_EVENT_RECEIVER->HANDLE_ONF4 FOR TEM_GRID.
*----------- DATA gr_event_handler TYPE REF TOlcl_event_handler . .. .. *--Creating an instance for the eventhandler
CREATE OBJECT gr_event_handler . *--Registering handler methods to handleALV Grid events
SET HANDLERgr_event_handler->handle_user_command FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_toolbar FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_menu_button FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_double_click FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_hotspot_click FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_button_click FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_before_user_command FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_context_menu_request FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_data_changed FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_data_changed_finished FOR gr_alvgrid .
1.熱點事件(單擊事件)
前面在介紹字段目錄的時候,咱們說到,在某個字段的控制字段"HOTSPOT"設置爲"X",那麼這個字段就能夠接受單擊事件HOTSPOT_CLICK.這個HOTSPOT_CLICK事件有三個參數,其中第一個參數"E_ROW_ID"已經做廢,另外2個參數是:參考類型LVC_S_COL定義的"E_COLUMN_ID",能夠經過E_COLUMN_ID-FIELDNAME來反映當前點擊的字段名.參考類型LVC_S_ROID定義的"ES_ROW_NO",能夠經過ES_ROW_NO-ROW_ID來反映當前點擊的行號,從而能夠定位鼠標的位置.
下面是響應單擊事件的一段處理代碼:
FORM handle_hotspot_click USING i_row_idTYPE lvc_s_row
I_column_id TYPE lvc_s_col
Is_row_no TYPE lvc_s_roid.
READ TABLE gt_list INDEXis_row_no-rowid.
IF sy-subrc = 0 ANDi_column_id-fieldname = ‘SEATSOCC’.
CALLSCREEN 200.
ENDIF.
ENDFORM.
當點擊的字段是SEATSOCC,調用屏幕200.
2.雙擊事件
雙擊事件和單擊事件的處理是相似的,一樣也是3個參數.咱們不須要設置字段目錄就能夠響應雙擊事件了.
下面是示例:
FORM handle_double_click USING i_row TYPElvc_s_row
I_column TYPE lvc_s_col
Is_row_no TYPE lvc_s_rowid.
READ TABLE gt_list INDEXis_row_no-row_id.
IF sy-subrc = 0 ANDi_column-fieldname = ‘SEATSOCC’.
CALLSCREEN 200.
ENDIF.
ENDFORM.
固然鼠標雙擊字段SEATSOCC才調用屏幕200.
3.添加自定義的按鈕和響應命令
咱們在ALV的工具條上增長一些按鈕來增長咱們自定義的功能,固然也能夠在GUI狀態中增長,2種的處理方式是不同的.
咱們經過toolbar事件來增長按鈕,而後經過user_command事件來實現咱們自定義的功能.
在TOOLBAR事件裏,咱們把自定義的按鈕加到參數"e_object"的表屬性"mt_toolbar"中能夠了.下面是一段示例代碼:
FORM handle_toolbar USING i_object TYPE REFTO cl_alv_event_toolbar_set. DATA: ls_toolbar TYPEstb_button. CLEAR ls_toolbar. MOVE 3 TOls_toolbar-butn_type. APPEND ls_toolbar TOi_object->mt_toolbar. CLEAR ls_toolbar. MOVE 'PER' TOls_toolbar-function. MOVE icon_display_text TOls_toolbar-icon. MOVE 'Passenger Info'(201) TOls_toolbar-quickinfo. MOVE 'Passenger Info'(201) TOls_toolbar-text. MOVE ' ' TOls_toolbar-disabled. APPEND ls_toolbar TOi_object->mt_toolbar. CLEAR ls_toolbar. MOVE 'EXCH' TOls_toolbar-function. MOVE 2 TOls_toolbar-butn_type. MOVE icon_calculation TOls_toolbar-icon. MOVE 'Payment in otherCurencies'(202) TO ls_toolbar-quickinfo. MOVE ' ' TOls_toolbar-text. MOVE ' ' TOls_toolbar-disapbled. APPEND ls_toolbar TOi_object->mt_toolbar. ENDFORM.
增長自定義按鈕的結構以下:
Field |
Description |
FUNCTION |
功能代碼 |
BUTN_TYPE |
按鈕類型 可用的按鈕類型: 0 Button(normal) 1 Menu and default button 2 Menu 3 分割符 4 Radio button 5 Checkbox 6 Menu entry |
ICON |
按鈕圖標(可選) |
TEXT |
按鈕文本(可選) |
QUICKINFO |
按鈕的懸停文本(可選) |
DISABLED |
灰化 |
在上面的代碼例子裏,咱們增長了一個常規的按鈕和一個含有菜單的按鈕.經過把按鈕的類型設置爲1或者2,咱們能夠增長一個含有菜單的按鈕,在事件menu_button還能夠實現子菜單:
FORM handle_menu_button USING i_object TYPEREF TO cl_ctmenu I_ucommTYPE syucomm.. CASE i_ucomm. WHEN ‘EXCH’. CALLMETHOD i_object->add_function EXPORTING Fcode = ‘EU’ Text = ‘Euro’. CALLMETHOD i_object->add_function EXPORTING Fcode = ‘TRL’ Text = ‘Turkish Lira’. ENDCASE. ENDFORM. 爲了實現這些自定義的按鈕的功能,咱們使用USER_COMMAND事件來處理. FORM handle_user_command USING i_ucomm TYPEsy-ucomm. DATA lt_selected_rows TYPElvc_t_rowid. DATA ls_selected_row TYPE lvc_s_roid. CALL METHODgr_alvgrid->get_selected_rows IMPORTING Et_row_no = lt_selected_rows. READ TABLE lt_selected_rows INTOls_selected_row INDEX 1. If sy-subrc ne 0. MESSAGE S000(su) WITH'Select a row'(203). ENDIF. CASE i_ucomm. WHEN 'CAR'. READ TABLE gt_listINDEX ls_selected_row-row_id. IF sy-subrc = 0. CALLFUNCTION 'ZDISPLAY_CARRIER_INFO' EXPORTING carrid = gt_list-carrid EXCEPTIONS carrier_not_found = 1 Oters = 2. ENDIF. WHEN 'EU'. READ TABLE gt_listINDEX ls_selected_row-row_id. IF sy-subrc = 0. CALL FUNCTION 'ZPOPUP_CONV_CURR_ADD_DISPLAY' EXPORTING monun = 'EU' Quant = gt_list-paymentsum. ENDIF. ENDCASE. ENDFORM.
咱們經過方法get_selected_rows來獲取選擇的行.功能EXCH有2個子功能,因此咱們不須要實現它.爲了能顯示ALV附加的一些功能,能夠在ALV實例建立的時候調用set_toolbar_interactive方法.
CALL METHODgr_alv_grid->set_toolbar_interactive.
4.覆蓋標準的功能.
ALV也給咱們提供了修改標準功能的機會.爲了實現這個目的,咱們須要在"before_user_command"事件中截取標準的功能,而後使用方法"set_user_command"來修改功能碼,能夠指向本身定義的功能碼.
下面是示例:
FORM handle_before_user_command USINGi_ucomm TYPE syucomm . CASE e_ucomm . WHEN '&INFO' . CALL FUNCTION 'ZSFLIGHT_PROG_INFO' . CALL METHOD gr_alvgrid->set_user_command EXPORTING i_ucomm = space. ENDCASE . E NDFORM .
5.設置單元格的風格(style不知道符合翻譯爲好,這裏的style能夠在CL_GUI_ALV_GRID的屬性中能夠查到,分MC_STYLE4_LINK,MC_STYLE4_LINK_NO,MC_STYLE_BUTTON,MC_STYLE_DISABLED,....),包含單元格級別的可編輯/不可編輯,是否有F4,是否有連接,把單元格設置爲按鈕,單元格級別的熱點......
5.1 把單元格設置爲PUSHBUTTON
要想實現這個功能,咱們須要在數據顯示內表增長一個表字段,參考表類型"LVC_T_STYL".數據實現內表定義爲:
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 cellstyles TYPE lvc_t_styl. DATA END OF gt_list.
把須要設置爲按鈕的字段填進內表字段中:
把第7行的字段SEATSMAX設置爲按鈕.
DATA ls_style TYPE lvc_s_styl. READ TABLE gt_list INDEX 7. Ls_style-fieldname = 'SEATSMAX'. Ls_style-style =cl_gui_alv_grid=>mc_style_button. APPEND ls_style TO gt_list-cellstyles. MODIFY gt_list INDEX 7.
而後在佈局中指定對應的STYLE內表字段,注意字段名字必定要對上:
gs_layout-stylefname = 'CELLSTYLES'.
這裏的按鈕點擊事件和單擊事件相似,也是須要2個參數來肯定位置.
5.2設置單元格級別的可編輯和不可編輯
單元格級別的可編輯和不可編輯是個很是有用的功能,在SAP標準的一些事務中,常常能夠看到這些方面的應用.一般用到的比較多的地方,是須要數據驗證的,好比輸入類型A,後面的某個字段才能夠編輯,若是輸入了類型B,後面的這個字段就不可編輯.
想讓一列能夠編輯,咱們能夠在字段目錄中設置EDIT爲"X".在可編輯的狀況下,ALV會自動多出來幾個編輯按鈕,刪除,新增,插入,複製.若是你不須要它們,可使用前面介紹的方法滅了它們.
單元格級別的可編輯和不可編輯,實現起來和5.1是相似的,也是內表字段,參考表類型"LVC_T_STYL".不過填入的style應該爲CL_GUI_ALV_GRID=>MC_STYLE_ENABLED和CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.指定字段名就能夠.CL_GUI_ALV_GRID=>MC_STYLE_ENABLED使字段能夠編輯,而CL_GUI_ALV_GRID=>MC_STYLE_DISABLED使字段不能夠編輯.代碼以下:
FORM adjust_edittables USING pt_list LIKEgt_list[]. DATA ls_listrow LIKE LINE OF pt_list. DATA ls_stylerow TYPE lvc_s_styl. DATA lt_styletab TYPE lvc_t_styl. LOOP AT pt_list INTO ls_listrow. IFls_listrow-carrid = 'XY'. Ls_stylerow-fieldname= 'SEATSMAX'. Ls_stylerow-style= cl_alv_grid=>mc_style_disabled. APPENDls_stylerow TO lt_styletab. ENDIF. IFls_listrow-connid = '02'. Ls_stylerow-fieldname= 'PLANETYPE' Ls_stylerow-style= cl_alv_grid=>mc_style_enabled. APPENDls_Pstylerow TO lt_styletab. ENDIF. INSERTLINES OF lt_styletab INTO ls_listrow-cellstyles. MODIFYpt_list FROM ls_listrow. ENDLOOP. ENDFORM.
固然也是同樣,須要告訴ALV哪一個字段是控制STYLE的內表字段.
gs_layout-stylefname ='CELLSTYLES'.
通常狀況下,單元格的設置會覆蓋整列的設置。若是想在程序裏動態切換各類模式。只須要修改內表裏關於STYLE設置的值而後刷新.使用方法set_ready_for_input傳入參數i_ready_for_input = 1能夠是ALV進入編輯狀態。
使用這個方法可使ALV在編輯和不可編輯模式之間切換。顯然若是把參數i_ready_for_input設置爲0就進入不可編輯狀態。
固然還能夠設置搜索幫助啊,等等,這裏就不一一贅述了。
6. 控制數據變化
咱們能夠設置alv處於可編輯狀態,固然ALV也提供給咱們控制數據的輸入。Alv grid有兩個事件:data_changed和data_changed_finished.第一個事件在可編輯字段的數據發生變化時觸發,可用來檢查數據的輸入,第二個事件是當數據修改完成後觸發。
咱們能夠經過方式REGISTER_EDIT_EVENT來設置,如何觸發數據改變事件.2種方式:
1.按回車觸發: i_event_id = cl_gui_alv_grid=>mc_evt_enter
2.單元格失去焦點: i_event_id = cl_gui_alv_grid=>mc_evt_modified
必須設置一種方式,要否則數據變化事件不會被觸發.
爲了獲取ALV裏字段修改的一些信息,DATA_CHANGED事件會把參考CL_ALV_CHANGED_DATA_PROTOCOL建立的實例經過參數ER_DATA_CHANGED傳遞給ALV.
經過這個參數咱們能夠知道哪些單元格被修改了,修改了什麼值.下面是類CL_ALV_CHANGED_DATA_PROTOCOL的一些方法:
Get_cell_value |
獲取單元格的值 |
Modify_cell |
修改單元格 |
Add_protocol_entry |
增長日誌記錄 |
Protocol_is_visible |
是否容許錯誤表可見 |
Refresh_protocol |
刷新日誌記錄 |
經過這個類的屬性,咱們能夠查到一些修改信息:
MT_MOD_CELLS |
Contains address of modified cells with rowed and field name |
MT_MOD_ROWS |
Contain modified rows Its type is genric |
MT_GOOD_CELLS |
Contain cells have proper values |
MT_DELETED_ROWS |
Contain rows deleted from the list |
MT_INSERTED_ROWS |
Contain rows deleted from the list |
經過上述一系列方式和屬性,能夠獲取修改的值,而進行一些輸入的檢查.
下面是一段示例代碼:
FORM handle_data_changed USINGir_data_changed TYPE REF TO cl_alv_changed_data_protocol. DATA: ls_mod_cell TYPE lvc_s_modi, Lv_value TYPE lvc_value. SORT ir_data_changed->mt_mod_cellsBY row_id. LOOP ATir_data_changed->mt_mod_cells INTO ls_mod_cell WHERE fieldname = 'SEATSMAX'. CALLMETHOD ir_data_changed->get_cell_value EXPORTING i_row_id = ls_mod_cell-row_id I_fieldname = 'CARRID' IMPORTING e_value = lv_value. IFlv_value = 'THY' AND ls_mod_cell-value > '500'. CALL METHOD ir_data_changed->add_protocol_entry EXPORTING I_msgid = 'SU' I_msgno = '000' I_msgty = 'E' I_msgv1 = 'This number can not exceed 500 for ' I_msgv2 = lv_value I_msgv3 = 'The value is et to ''500''' I_fieldname = ls_mod_cell-fieldname I_row_id = ls_mod_cell-rowid. CALL METHOD ir_data_changed->modify_cell EXPORTING i_row_id = ls_mod_cell-row_id I_fieldname = ls_mod_cell-fieldname I_value = '500'. ENDIF. ENDLOOP. ENDFORM.
附錄:ABAP顏色代碼
ABAP中的顏色代碼是由4位字都組成的
Cxyz
C:color的簡寫,顏色代碼均以C開頭
x:標準色代碼,SAP中一共有7個標準色
y:反轉顏色啓用/關閉 1/0
z:加強顏色啓用/關閉 1/0
注意:
顏色設置中有優先級順序,他們是單元格--->行--->列.