調用功能模塊: CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_interface_check = '' 接口一致性檢查 i_callback_program = sy-repid 當前程序名 is_layout = layout 輸出樣式 it_fieldcat = fieldcat[] 字段定義描述表 i_callback_pf_status_set = 'PF_STATUS_SET' 觸發事件調用子程序 i_callback_user_command = 'USER_COMMAND' 鼠標事件操作子程序 it_events = i_events[] 出口程序觸發事件 i_callback_html_top_of_page = 'ALV_TOP_OF_PAGE' ALV輸出表頭設置 i_grid_settings = wl_lvc_s_glay 打印表頭設置 it_sort = sortable[] 排序設置 TABLES t_outtab = ig_out EXCEPTIONS program_error = 1 OTHERS = 2. 常用屬性:(賦值’’中內容必須為大寫) 1. Fieldcat data: fieldcat type slis_t_fieldcat_alv with header line. it_fieldcat = fieldcat[] 屬性 (用來定義表單中的各個列的相關信息) Fieldcat-col_pos = n. 輸出列 Fieldcat-tabname = ‘FIELDNAME’. 對應的內表字段名 Fieldcat-seltext_s/m/l = ‘列名’. 輸出列文本 (_s:短文本 _l:長文本) Fieldcat-emphasize = ‘CX10’. 帶有顏色的高亮列 (其中X=(1-7) 顏色同format) Fieldcat-hotspot = ‘X’. 作為熱點顯示 可觸發鼠標觸發事件 Fieldcat-currency = ‘CURRKEY’. 表 TCURX 中的貨幣名稱 Fieldcat-quantity(3) 計量單位 Fieldcat-qfieldname 參考計量單位的字段名稱 Fieldcat-round = n. 四舍五入至小數位數下 n 位 Fieldcat-exponent = n. 浮點數的冪指數為n Fieldcat-key = ‘X’. 關鍵字段 Fieldcat-icon = ‘X’. 作為圖標輸出 Fieldcat-symbol = ‘X’. 輸出作為符號 Fieldcat-checkbox = ‘X’. 作為復選框輸出 Fieldcat-just = SPACE, 'R', 'L', 'C'. 對齊方式 Fieldcat-lzero = ‘X’. 輸出前導零 Fieldcat-no_sign = ‘X’. 輸出抑制符號 Fieldcat-no_zero = ‘X’. 為輸出隱藏零 Fieldcat-edit_mask = SPACE, mask.. 輸出為mask的模式 Fieldcat-fix_column = ‘X’. 固定列 Fieldcat-do_sum = ‘X’. 總計列值總和 Fieldcat-no_out = ‘X’. 列不輸出 Fieldcat-tech = ‘X’. 該字段為技術字段 Fieldcat-outputlen = n 列的字符寬度為n Fieldcat-decimals_out = n 能控制小數點的位數為n Fieldcat-datatype = C,I,N… 定義數據類型ABAP 字典中的數據類型 Fieldcat-inttype = C,I,N… ABAP 數據類型(C,D,N,...) 2. SORT data: sortable type slis_t_sortinfo_alv with header line. it_sort = sortable[] 屬性 (排序) Sortable-Fieldname 字段名 Up 升序排列 Down 降序排列 Subtot subtotals group grouplevel, 3. Layout data: layout type slis_layout_alv . is_layout = layout 屬性 (用於定義ALV表單的相關格式、屬性) info_fieldname = 'LINE_COLOR'. 設置特殊行顏色 (將LINE_COLOR增加到內表字段,寫'CX10'到特殊行的LINE_COLOR, X為顏色值) colwidth_optimize = ‘X’. 優化列寬設置 no_colhead = 'X'. 不顯示列名 no_vline = 'X'. 不顯示列間豎線 zebra striped pattern(有斑紋線模式) f2code = '&ETA'. 設置觸發彈出詳細信息窗口的功能碼,這里是雙擊 no_vline 這個用來設置列間隔線 detail_initial_lines " show also initial lines detail_popup " show detail in popup 是否彈出詳細信息窗口 detail_titlebar 設置彈出窗口的標題欄 totals_text " text for 1st col. in total line totals_only " show only totals group_change_edit " Settings by user for new group header_text " Text for header button 4.按鈕 DATA: i_events TYPE slis_t_event WITH HEADER LINE. 事件: it_events = i_events[] i_callback_pf_status_set = 'PF_STATUS_SET' i_callback_user_command = 'USER_COMMAND' 出口程序觸發事件對應子程序: FORM PF_STATUS_SET USING rt_extab TYPE slis_t_extab. FORM user_command USING ucomm LIKE sy-ucomm selfield TYPE slis_selfield. 功能代碼: 函數文本: 圖標名稱: &ETA 細節 ICON_SELECT_DETAIL &EB9 調用報告... ICON_TABLE_SETTINGS &REFRESH 刷新 ICON_REFRESH &ALL 全部選擇 ICON_SELECT_ALL &SAL 取消全選 ICON_DESELECT_ALL &OUP 按升序排列 ICON_SORT_UP &ODN 按降序排列 ICON_SORT_DOWN &ILT 設置過濾器 ICON_FILTER &UMC 總計 ICON_SUM &SUM 小計... ICON_INTERMEDIATE_SUM &RNT_PREV 打印預覽 ICON_LAYOUT_CONTROL &VEXCEL Microsoft Excel ICON_XLS &AQW 字處理... ICON_WORD_PROCESSING %PC 本地文件 ... ICON_EXPORT %SL 郵件收件人 ICON_MAIL &ABC ABC 分析 ICON_ABC &GRAPH 圖形 ICON_GRAPHICS &OL0 更改布局... ICON_ALV_VARIANTS &OAD 選擇格式... ICON_ALV_VARIANT_CHOOSE &AVE 保存格式... ICON_ALV_VARIANT_SAVE &INFO 信息 ICON_INFORMATION 1. ALV表頭設置 i_callback_html_top_of_page = 'ALV_TOP_OF_PAGE' form top_of_page using cl_dd type ref to cl_dd_document. 語法同HTML fomat 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 .