REUSE_ALV_GRID_DISPLAY_LVC函數輸入參數屬性的應用
前面我們講過,ALV Grid 函數的輸出有兩個:REUSE_ALV_GRID_DISPLAY 和 REUSE_ALV_GRID_DISPLAY_LVC
兩者的操作大同小異,只是后者能更好的和ALV容器結合使用,前后則不能;而在輸入參數屬性的結構上也有些差異。
本篇文章主要講解下ALV函數中輸入參數的一些應用。
首先了解下ALV函數輸入參數的作用(粗體為常用參數):
I_INTERFACE_CHECK: 檢查接口一致性
I_BYPASSING_BUFFER: 是否使用緩存
I_BUFFER_ACTIVE:是否激活緩存,如果每次顯示ALV都是相同的字段目錄,則該字段目錄會被放到一特殊的緩存里,加快顯示速度。
I_CALLBACK_PROGRAM:調用ALV的程序名稱
I_CALLBACK_PF_STATUS_SET:ALV工具欄Subroutine(子程序)
I_CALLBACK_USER_COMMAND:ALV User Command Subroutine(子程序),實現對應菜單項及相應事件功能
I_CALLBACK_TOP_OF_PAGE:ALV抬頭內容信息
I_CALLBACK_HTML_TOP_OF_PAGE:ALV HTML格式抬頭內容信息
I_CALLBACK_HTML_END_OF_LIST:ALV HTML格式頁腳內容信息
I_STRUCTURE_NAME:為輸出表數據結構的命名,指定了這個參數,域目錄將會自動生成
I_BACKGROUND_ID:ALV背景圖片Object ID
I_GRID_TITLE:ALV 標題
I_GRID_SETTINGS:GRID信息
IS_LAYOUT / IS_LAYOUT_LVC:ALV輸出布局樣式
IT_FIELDCAT / IT_FIELDCAT_LVC:設定顯示的項目名稱及輸出設定
IT_EXCLUDING:隱藏設置的ALV工具欄
IT_SPECIAL_GROUPS / IT_SPECIAL_GROUPS_LVC:若內表中一些字段通過SP_GROUP被分組在一起,必須為這些組傳遞組文本內表
IT_SORT / IT_SORT_LVC:ALV排序設置
IT_FILTER / IT_FILTER_LVC:ALV過濾設置
IS_SEL_HIDE:替換或修改屏幕中select-option的值
I_DEFAULT:用戶是否可以定義默認的布局,’X'-可以定義默認布局,Space-不可以定義默認布局 (默認:X)
I_SAVE:保存表格布局,’X'-只能保存全局變式;’U'-只能保存特定變式;’A'-都可以保存;Space-不能保存變式 (默認:space)
IS_VARIANT:表格布局變式
IT_EVENTS:設置事件, 類型為slis_t_event的內表(name:事件名稱,form:事件的FORM)
IT_EVENT_EXIT:設置回調的方法的執行行為,表明用戶所寫的代碼是在執行標准執行之前還是之后
IS_PRINT:后台打印的相關參數
I_SCREEN_START_COLUMN:以對話框形式顯示的開始列
I_SCREEN_START_LINE:以對話框形式顯示的開始行
I_SCREEN_END_COLUMN:以對話框形式顯示的結束列
I_SCREEN_END_LINE:以對話框形式顯示的結束行
I_HTML_HEIGHT_TOP:HTML抬頭的高度
I_HTML_HEIGHT_END:HTML頁腳的高度
IT_ALV_GRAPHICS:是否可以在圖表中顯示ALV
IT_HYPERLINK:使用超鏈接
下面詳細介紹下常用的輸入參數:
定義調用程序名稱,一般為當前程序sy-repid
2. I_CALLBACK_PF_STATUS_SET 參數
定義ALV屏幕菜單,此參數允許報表展現用戶自定義的屏幕菜單,
參數類型為:SLIS_FORMNAME,指定自定義按鈕的子FORM,該子FORM不顯式的調用;
如:
i_callback_pf_status_set = 'FRM_SET_STATUS'
Form中的定義為:
FORM frm_set_status USING p_extab TYPE slis_t_extab. SET PF-STATUS 'Z_ALV_STATUS' . ENDFORM. " frm_set_status
2.1). 沒有自定義按鈕時候,該參數可以不要,這時會顯示ALV標准的按鈕;
當然這些按鈕可以部分隱藏(見:IT_EXCLUDING 參數屬性);
2.2). 當我們使用自定義按鈕后,ALV自帶的標准按鈕,則會失效,這時需要將一些必要的按鈕在工具條補上;
2.3). 其中 “分隔符” 的插入方法為:在需要插入分隔符的方框內,選擇菜單:Edit->Insert-> Separator line 即可插入分隔符;
2.4). 下面是ALV中的標准工具的名稱、代碼、圖標名稱、快捷鍵:
名稱 | 代碼 | 圖標名稱 | 快捷鍵 |
刷新 | REFRESH | ICON_REFRESH | F8(可隨便更改) |
導出為EXCEL表格 | EXCEL | 無 | Shift-F8(可隨便更改) |
ABC 分析 | &ABC | ICON_ABC | Ctrl-F1 |
按升序排列 | &OUP | ICON_SORT_UP | Ctrl-F4 |
設置過濾器 | &ILT | ICON_FILTER | Ctrl-F5 |
總計 | &UMC | ICON_SUM | Ctrl-F6 |
郵件查收件 | %SL | ICON_MAIL | Ctrl-F7 |
更改布局… | &OL0 | ICON_ALV_VARIANTS | Ctrl-F8 |
選擇布局… | &OAD | ICON_ALV_VARIANT_CHOOSE | Ctrl-F9 |
保存布局… | &AVE | ICON_ALV_VARIANT_SAVE | Ctrl-F10 |
信息 | &INFO | ICON_INFORMATION | Ctrl-F12 |
明細 | &ETA | ICON_SELECT_DETAIL | Ctrl-Shift-F3 |
按降序排列 | &ODN | ICON_SORT_DOWN | Ctrl-Shift-F4 |
刪除過濾器 | &ILD | ICON_FILTER_UNDO | Ctrl-Shift-F5 |
小計 | &SUM | ICON_INTERMEDIATE_SUM | Ctrl-Shift-F6 |
Microsof | &VEXCEL | ICON_XLS | Ctrl-Shift-F7 |
字處理 | &AQW | ICON_WORD_PROCESSING | Ctrl-Shift-F8 |
本地文件 | %PC | ICON_EXPORT | Ctrl-Shift-F9 |
打印預覽 | &RNT_PREV | ICON_LAYOUT_CONTROL | Ctrl-Shift-F10 |
圖形 | &GRAPH | ICON_GRAPHICS | Ctrl-Shift-F11 |
2.5). 一般情況下,可以快速拷貝標准程序的菜單欄,再進行修改、篩選;
操作步驟如下:
01). 進入 SE80,打開 Repository Information System;
02). 打開路徑: Repository Information System-> Program Library->Program SubObjects->GUI Status;
03). 在右邊屏幕的程序名稱(Program Name)輸入框內輸入標准程序名稱:SAPLKKBL,然后執行;
04). 在輸出的列表中,找到 STANDARD 或 STANDARD_FULLSCREEN:
05).雙擊進入菜單編輯后,拷貝到需要用到的程序中即可。
標注:步驟1:在程序上右鍵-創建-GUI狀態
步驟2:報表
步驟3:附加 -調整模板
步驟4:在程序填寫 SAPLKKBL 在狀態填寫 STANDARD_FULLSCREEN
完成標准按鈕添加
3. I_CALLBACK_USER_COMMAND 參數屬性
響應菜單項及其相應事件,捕捉點擊相應的按鈕或雙擊等操作的 Function Code(FCode);
參數類型為:SLIS_FORMNAME,與 I_CALLBACK_PF_STATUS_SET 參數一樣,為定義的子 FORM,不顯式調用;
如:
i_callback_user_command = 'FRM_ ALV_USER_COMMAND'
Form 的定義為:
*&---------------------------------------------------------------------* *& Form FRM_ALV_USER_COMMAN *&---------------------------------------------------------------------* FORM frm_alv_user_command USING p_ucomm TYPE sy-ucomm p_rs_selfield TYPE slis_selfield. CASE p_ucomm. WHEN '&IC1' . " 判斷用戶的動作 "讀取用戶點擊的當前行的一行內容 READ TABLE i_tab INTO wa_tab INDEX p_rs_selfield-tabindex . IF p_rs_selfield-fieldname EQ 'CITYFROM'. "判斷用戶點擊的是哪一列 IF NOT wa_tab-cityfrom IS INITIAL . PERFORM frm_show_detail USING p_rs_selfield . " 顯示明細 ENDIF. ELSEIF p_rs_selfield-fieldname EQ 'TCODE' . IF NOT wa_tab-tcode IS INITIAL . PERFORM frm_call_tran USING p_rs_selfield . " 調用其他事務 ENDIF . ELSEIF p_rs_selfield-fieldname EQ 'ICON_FOLDER' . PERFORM frm_open_folder USING p_rs_selfield . " 打開文件 ENDIF. CLEAR wa_tab. WHEN '&SAVE_DATA' . PERFORM frm_save_data . " 保存數據 WHEN 'PRINT' . PERFORM frm_print_data. " 打印數據 WHEN 'EXCEL' . PERFORM frm_export . " 導出數據 ENDCASE. p_rs_selfield-refresh = 'X' . " 當用戶在顯式界面上對數據進行修改時,同時內表中的數據也隨之刷新 ENDFORM. " frm_alv_user_command
其中,標准按鈕的FCode,可以通過類 CL_GUI_ALV_GRID 中的 Attributes 查看;
操作步驟:
01). 進入事務碼SE24,輸入類名稱:CL_GUI_ALV_GRID,點擊顯示( Display );
02). 切換到 Attributes 標簽,找到自己需要的”屬性”和”初始值”,這個初始值就是我們要找的標准按鈕的FCODE;
3.1 熱點鏈接
熱點鏈接,即 Fieldcat中 的 hotspot 屬性;
設置之后,當用戶點擊帶有熱點的字段時,就會觸發 Subroutine(FRM_USER_COMMAND)中的動作;
對於熱點鏈接,所對應的FCode為 “&IC1“;
示例如下:
lv_pos = lv_pos + 1 . wa_fieldcat-col_pos = lv_pos . wa_fieldcat-fieldname = 'MATNR' . wa_fieldcat-scrtext_l = '物料編號'. wa_fieldcat-fix_column = 'X' . wa_fieldcat-hotspot = 'X' . " 熱點,鏈接用 APPEND wa_fieldcat TO i_fieldcat . CLEAR wa_fieldcat. *&---------------------------------------------------------------------* *& Form FRM_ALV_USER_COMMAND *&---------------------------------------------------------------------* FORM frm_alv_user_command USING p_ucomm TYPE sy-ucomm p_rs_selfield TYPE slis_selfield . CASE p_ucomm. WHEN '&IC1' . "判斷用戶的動作 "讀取用戶點擊的當前行的一行內容 READ TABLE i_tab INTO wa_tab INDEX p_rs_selfield-tabindex . IF p_rs_selfield-fieldname EQ 'MATNR'. " 判斷用戶點擊的是哪一列 IF NOT wa_tab-matnr IS INITIAL . ……… ENDIF. ELSEIF p_rs_selfield-fieldname EQ 'TCODE' . IF NOT wa_tab-tcode IS INITIAL . PERFORM frm_call_tran USING p_rs_selfield. " 調用其他事務 ENDIF . ENDIF. CLEAR wa_tab. ENDCASE. p_rs_selfield-refresh = 'X'. ENDFORM. " frm_alv_user_command
3.2 顯示明細
在使用 REUSE_ALV_GRID_DISPLAY_LVC 時,會發現使用 REUSE_ALV_GRID_DISPLAY 時的雙擊顯示行明細功能沒有了;
這是SAP標准程序決定的,REUSE_ALV_GRID_DISPLAY_LVC 已經取消了雙擊顯示行明細功能。
當然,也可以點擊工具欄中的放大鏡按鈕,直接查看明細;
如若想要實現雙擊顯示明細,則可以直接執行FCode:&ETA調用標准功能:
*&---------------------------------------------------------------------* *& Form FRM_ALV_USER_COMMAND *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PA_UCOMM text * -->PS_SELFIELD text *----------------------------------------------------------------------* FORM frm_alv_user_command USING pa_ucomm TYPE sy-ucomm ps_selfield TYPE slis_selfield. CASE pa_ucomm. WHEN '&IC1'. "雙擊 pa_ucomm = '&ETA'. "查看明細 ENDCASE. ENDFORM. " FRM_ALV_USER_COMMAND
3.3 調用其他事務
*&---------------------------------------------------------------------* *& Form frm_alv_call_tran *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_RS_SELFIELD text *----------------------------------------------------------------------* FORM frm_alv_call_tran USING p_rs_selfield TYPE slis_selfield . SET PARAMETER ID 'LIB' FIELD p_rs_selfield-value. CALL TRANSACTION 'SE37' AND SKIP FIRST SCREEN. ENDFORM. " frm_alv_call_tran
其中,”LIB“是指:參數ID(PARAMETER ID)。
查找方法:
01). 用一個事務碼進入屏幕界面,在輸入框內按 F1;
02). 在彈出來的界面中點擊”技術信息”按鈕,在字段數據的最后一行,即為參數ID;
“SE37″ 是指我們要調用的事務代碼,AND SKIP FIRST SCREEN 表示跳過第一屏屏幕;
4. I_CALLBACK_TOP_OF_PAGE / I_CALLBACK_HTML_TOP_OF_PAGE 參數屬性
I_CALLBACK_TOP_OF_PAGE 與 I_CALLBACK_HTML_TOP_OF_PAGE 參數屬性都用於書寫 ALV抬頭標題信息,
只是區別在於后者支持 HTML格式;
參數類型:SLIS_FORMNAME,也與 I_CALLBACK_PF_STATUS_SET 參數一樣,為定義的子FORM,不顯式調用。
如:
i_callback_top_of_page = 'FRM_TOP_OF_PAGE' i_callback_html_top_of_page = 'FRM_HTML_TOP_OF_PAGE'
其中,對應 FORM(FRM_HTML_TOP_OF_PAGE)的定義,需要引用類:CL_DD_DOCUMENT(動態文本類)來顯示HTML格式。
如:
*&---------------------------------------------------------------------* *& Form frm_html_top_of_page *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_CL_DD text *----------------------------------------------------------------------* FORM frm_html_top_of_page USING p_cl_dd TYPE REF TO cl_dd_document. … ENDFORM. "frm_html_top_of_page
下圖是SAP標准文檔中的說明:
示例如下:
*&---------------------------------------------------------------------* *& Form frm_html_top_of_page *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM frm_html_top_of_page USING p_cl_dd TYPE REF TO cl_dd_document. " 定義登錄用戶的描述 DATA: l_name TYPE string , name_first LIKE adrp-name_first , name_last LIKE adrp-name_last . " 定義登錄日期 DATA: l_date TYPE string . " 定義緩沖區變量 DATA: m_p TYPE i , m_buffer TYPE string . " 得到登錄用戶的描述 SELECT SINGLE adrp~name_first adrp~name_last INTO (name_first,name_last) FROM adrp INNER JOIN usr21 ON adrp~persnumber = usr21~persnumber WHERE usr21~bname = sy-uname . IF sy-subrc = 0 . CONCATENATE name_last name_first INTO l_name . ELSE . l_name = sy-uname . ENDIF. CLEAR name_first . CLEAR name_last . " 拼接制表日期 CONCATENATE sy-datum+0(2) '.' sy-datum+4(2) '.' sy-datum+6(2) '.' INTO l_date . m_buffer = '
ALV DEMO
' . CALL METHOD p_cl_dd->html_insert EXPORTING contents = m_buffer CHANGING position = m_p. " 輸出制表人和制表日期 CONCATENATE '
出表人:' l_name ' ' '出表日期:' l_date '
' INTO m_buffer . CALL METHOD p_cl_dd->html_insert EXPORTING contents = m_buffer CHANGING position = m_p. ENDFORM. "frm_html_top_of_page * ALV CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid " 當前程序 i_callback_top_of_page = 'FRM_TOP_OF_PAGE' i_callback_html_top_of_page = 'FRM_HTML_TOP_OF_PAGE' is_layout_lvc = i_layout_lvc " 屬性內表 it_fieldcat_lvc = i_fieldcat_lvc[] " 列明內表 i_save = 'X' " 是否保存布局 TABLES t_outtab = i_tab " 數據內表 EXCEPTIONS program_error = 1 OTHERS = 2.
效果如圖所示:
4.1 REUSE_ALV_COMMENTARY_WRITE 函數
上面文檔中出現 REUSE_ALV_COMMENTARY_WRITE 函數,這里順便了解下該函數的應用。
該函數與 CL_DD_DOCUMENT 類一樣,用於 I_CALLBACK_TOP_OF_PAGE FORM 中輸出抬頭/頁腳內容信息;
所以一般情況下:
I_CALLBACK_TOP_OF_PAGE Form 與 REUSE_ALV_COMMENTARY_WRITE 函數配合使用;
I_CALLBACK_HTML_TOP_OF_PAGE Form 與 CL_DD_DOCUMENT 類配合使用。
REUSE_ALV_COMMENTARY_WRITE 函數包括一個必須參數,三個可選參數:
01). IT_LIST_COMMENTARY(必須):一個類型為 SLIS_T_LISTHEADER 的內表;
* Header table for top of page TYPES: BEGIN OF slis_listheader, typ(1) TYPE C, " H = Header, S = Selection, A = Action key(20) TYPE C, info TYPE slis_entry, END OF slis_listheader. TYPES: slis_t_listheader TYPE slis_listheader OCCURS 1.
02). I_LOGO(可選):圖片/Logo 的 Object ID
03). I_END_OF_LIST_GRID(可選):用於頁腳的信息
04). I_ALV_FORM(可選):是否用於 ALV 的FORM中,默認為:Space
接下來,看下示例:
*&---------------------------------------------------------------------* *& Form frm_top_of_page *&---------------------------------------------------------------------* * ALV 標題 *----------------------------------------------------------------------* FORM frm_top_of_page. DATA: i_header TYPE slis_t_listheader, wa_header TYPE slis_listheader. * 定義登錄用戶的描述 DATA: l_name TYPE string , name_first LIKE adrp-name_first , name_last LIKE adrp-name_last . * 定義登錄日期 DATA: l_date TYPE string . * 得到登錄用戶的描述 SELECT SINGLE adrp~name_first adrp~name_last INTO (name_first,name_last) FROM adrp INNER JOIN usr21 ON adrp~persnumber = usr21~persnumber WHERE usr21~bname = sy-uname . IF sy-subrc = 0 . CONCATENATE name_last name_first INTO l_name . ELSE . l_name = sy-uname . ENDIF. CLEAR name_first. CLEAR name_last. * 拼接制表日期 CONCATENATE sy-datum+0(4) '.' sy-datum+4(2) '.' sy-datum+6(2) INTO l_date. CONCATENATE '制表人:' l_name INTO l_name . CONCATENATE '制表日期:' l_date INTO l_date . * 位於標題第一行 wa_header-typ = 'H'. wa_header-info = 'ALV DEMO' . APPEND wa_header TO i_header . CLEAR wa_header . * 相關內容信息,這里用於顯示登錄用戶信息描述 wa_header-typ = 'S'. wa_header-key = l_name . wa_header-info = l_date . APPEND wa_header TO i_header . CLEAR wa_header . CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' EXPORTING it_list_commentary = i_header i_alv_form = 'X'. ENDFORM. "frm_top_of_page * ALV CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid " 當前程序 i_callback_top_of_page = 'FRM_TOP_OF_PAGE' is_layout_lvc = i_layout_lvc " 屬性內表 it_fieldcat_lvc = i_fieldcat_lvc[] " 列明內表 i_save = 'X' " 是否保存布局 TABLES t_outtab = i_tab " 數據內表 EXCEPTIONS program_error = 1 OTHERS = 2.
效果如圖所示:
4.2 上傳圖片
01).通過事務碼:OAER,進入 Business Document Navigator 參數界面;
02).輸入值:
ClassName 輸入:”PICTURES”;
Class Type 輸入: “OT”
Object Key 輸入: 自定義ID名稱(這里輸入ZJX_LOGO),用於標記上上傳圖片的唯一標識
03).按F8執行后,進入到導航界面:
04) 選擇 PICTURES 節點后,在創建標簽中,打開標准文檔類型節點;
05) 雙擊屏幕節點,會彈出文件框,直接上傳現有的圖片;
06) 選擇文件后,輸入描述與關鍵字,便於搜索查找;
07) 上傳成功后,記錄下Object Key:”ZJX_LOGO”
然后在 ALV抬頭中加入上傳后的LOGO:
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' EXPORTING it_list_commentary = i_header i_logo = 'ZJX_LOGO' “ OAER 中的Object Key i_alv_form = 'X'.
效果如圖所示:
關於圖片上傳的內容,可以查看以下內容:
* Notes:
* 1) Logos & wallpapers can be found in table BDS_CONN05
* 2) Transaction OAER can be used to create PICTURES.
* Run transaction OAER with class Class type = OT,
* and Object key with whatever name you want to create. In the
* next screen, right clicking on screen and import
Steps for uploading Logo :-:
1. Goto the transaction OAER
2. Enter the class name as ‘PICTURES’
3. Enter the class type as ‘OT’
4. Enter the object key as the name of the logo you wish to give
5. Execute
6. Then in the new screen select Standard doc. types in bottom window
Click on the Screen icon
Now, it will ask for the file path where you have to upload the logo
7. Now you can use this logo in REUSE_ALV_COMMENTARY_WRITE
or
Import Logo and Background Picture for Reporting
In this step, you can import a customer-specific logo and a background picture into the R/3 System.
These will be displayed in the header area of reports in HR Funds and Position Management.
From the SPRO:
HR Funds and Position Management –> Dialog Control –> Customize Reporting Interface –> Import Logo and Background Picture for Reporting.
Activities
1. Enter the Name of your logo/background picture as an object key in the initial screen.
2. Make sure that the class name is PICTURES, and the class type is OT.
3. Choose Execute.
4. Double-click the document type Picture on the Create tab page.
A dialog box will appear in which you can enter the path in which the logo/background picture can be found.
5. Enter the path and choose Open. The logo will be uploaded into the current R/3 System.
If the logo/background picture is to be transported into other systems as well, choose Transport.
6. Return to the initial screen and repeat the procedure after having entered the Name of your background picture as an object key.
Please note that the logo/background picture can only be displayed in ALV-based reports with an HTML header.
Manually programmed reports such as business distribution plans are not based on the ALV.
If you have selected several initial objects, ALV-based reports in HR Funds and Position Management will automatically use a hiearchical-sequential display.
A logo is not displayed here either. Note also that the logo cannot be printed (see print preview in program).
Make sure that the logo does not exceed a height of 100 pixels because it would mean that the header of the report will be scrollable.
該參數為 ALV 小標題,位於 ALV 抬頭信息下方;示例如下:
DATA: i_grid_title TYPE lvc_title . i_grid_title = '小標題' . CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid " 當前程序 i_callback_top_of_page = 'FRM_TOP_OF_PAGE' i_callback_html_top_of_page = 'FRM_HTML_TOP_OF_PAGE' i_grid_title = i_grid_title is_layout_lvc = i_layout_lvc " 屬性內表 it_fieldcat_lvc = i_fieldcat_lvc[] " 列明內表 i_save = 'X' " 是否保存布局 TABLES t_outtab = i_tab " 數據內表 EXCEPTIONS program_error = 1 OTHERS = 2.
效果如圖所示:
該參數用於設置Grid相關參數(打印、單元格回調);
類型為:LVC_S_GLAY,該結構包括:
01) COLL_TOP_P:最小化 TOP_OF_PAGE
02) COLL_END_L:最小化 END_OF_LIST
03) TOP_P_ONLY:僅打印TOP_OF_PAGE
04) EOL_P_ONLY:僅打印END_OF_LIST
05) NO_COLWOPT:不優化打印的列寬
06) EDT_CLL_CB:退出可編輯單元格時回調
其中,常用的是 EDT_CLL_CB 字段,該字段用於回調輸入的變量;
即,當我們在ALV的顯示界面可編輯字段上修改了數據,回車后會回調我們修改的數據到內表中,並對其修改;
這個字段在編輯操作中很關鍵。
示例代碼如下:
* 定義回調變量 DATA: i_grid_settings TYPE lvc_s_glay. i_grid_settings-edt_cll_cb = 'X' . * 在ALV中使用 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid is_layout_lvc = i_layout_lvc it_fieldcat_lvc = i_fieldcat_lvc[] i_grid_settings = i_grid_settings i_save = 'X' TABLES t_outtab = i_tab EXCEPTIONS program_error = 1 OTHERS = 2.
7. IS_LAYOUT/ IS_LAYOUT_LVC 參數屬性
關於該參數,前面文章《ALV簡介和Fieldcat與Layout相關參數屬性》中已經講述過其相關參數屬性;
可查看相關參數屬性:Layout屬性,這里列舉下常用的一些屬性:
7.1 設置grid的字段列寬度自動適應
i_layout-colwidth_optimize = 'X'
7.2 設置grid的行顏色變換顯示
i_layout-zebra = 'X'
7.3 設置彈出窗口的標題欄
i_layout-detail_titlebar = '詳細內容'
7.4 設置grid的多行選擇列,其中box必須為內表的一列,為一個字符長度
i_layout-box_fieldname= 'BOX'
7.5 設置grid是否顯示行分割線
i_layout-no_vline= 'X'
7.6 設置grid的合計行顯示在明細的上面
i_layout-totals_before_items= 'X'
7.7 設置grid不顯示彈出明細顯示窗口
i_layout-detail_popup= 'X'
7.8 設置grid顯示led列, light為內表字段,,一個字符長,,值范圍為1-3
i_layout-excp_fname= 'light'
7.9 設置grid的沒有標題
i_layout-no_colhead = 'X'
8. IT_FIELDCAT/ IT_FIELDCAT_LVC 參數屬性
與 IS_LAYOUT/ IS_LAYOUT_LVC 參數一樣,前面文章《ALV簡介和Fieldcat與Layout相關參數屬性》中已經講述過該參數的相關屬性;
可查看相關參數屬性:Fieldcat屬性,這里列舉下常用的一些屬性:
8.1 單列優化寬度
wa_fieldcat-col_opt = 'X'.
8.2 單列求和或者取消求和,添加屬性
wa_fieldcat-do_sum = ‘X’. " 求和 wa_fieldcat-no_sum = ‘X’. " 取消求和
如若在IS_LAYOUT屬性中加上下列屬性,則求和后的行就會在第一行出現
i_layout-totals_bef = 'X'.
8.3 對齊方式
wa_fieldcat-just = 'L' . " 左對齊 wa_fieldcat-just = 'C' . " 居中對齊 wa_fieldcat-just = 'R' . " 右對齊
默認情況下,ABAP 的各種數據類型優默認的對其方式:
字符串是默認為左對齊;
貨幣、數量默認為右對齊;
8.4 以圖標方式輸出
需要作為圖標輸出,首先要引入圖標的信息:Include <list>;
然后在內表中添加顯示圖標的字段名稱;
在 Fieldcat 添加屬性的時候,則可以為內表顯示圖標的字段添加相關圖標。
示例如下:
* 內表字段 i_tab-icon_folder = icon_object_folder. * FieldCat 屬性 lv_pos = lv_pos + 1 . wa_fieldcat-col_pos = lv_pos . wa_fieldcat-fieldname = 'ICON_FOLDER'. wa_fieldcat-scrtext_l = 'ICON' . wa_fieldcat-icon = 'X' . "啟用圖標 wa_fieldcat-hotspot = 'X' . APPEND wa_fieldcat TO i_fieldcat . CLEAR wa_fieldcat .
這樣圖標就可以在ALV界面中顯示了,其中添加”熱點”的目的是為了當用戶點擊該圖標的時候,可以觸發一系列的操作,如文件的選擇等等;
注意:圖標的名稱用事務碼”ICON“進入后,第二列就是圖標代碼,根據需要進行選擇;
8.5 單元格的F1、F4幫助
8.5.1 F1幫助
在Fieldcat的RollName屬性中,添加指定的數據元素,即可激活F1幫助;如:
wa_fieldcat-rollname = 'PS_PSPID' . " 指定數據元素
8.5.2 F4幫助
在Fieldcat中添加下列屬性:
wa_fieldcat-ref_field = 'PSPID'. " 對應DDIC中的參考字段 wa_fieldcat-ref_table = 'PROJ'. " 對應DDIC中的參考表
這樣在ALV的顯示界面,在該字段處就可以按F4來查看相關的內容了;
8.6 字段類型保留
對於貨幣或數量字段,需要在其設置字段中再添加一個”指定數據類型”的屬性,如下:
* 貨幣字段 wa_fieldcat-datatype = 'CURR' . " 指定數據類型 * 數量字段 wa_fieldcat-datatype = 'QUAN' . " 指定數據類型 wa_fieldcat-inttype = 'C' . " 數據類型以C類型輸出
該參數可對ALV標准工具欄隱藏不必要的功能;
對於該參數的應用,需要知道ALV標准按鈕對應的 FCode,這里在上面講過,可以查看 CL_GUI_ALV_GRID 類的屬性及其初始值;
示例代碼如下:
* 定義隱藏標准按鈕的變量 DATA: wa_excluding TYPE slis_t_extab , it_excluding TYPE slis_extab . * 將需要隱藏的標准按鈕的"FCODE"添加到內表IT_EXCLUDING中 wa_excluding-fcode = '&ABC' . APPEND wa_excluding TO it_excluding. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid is_layout_lvc = i_layout_lvc it_fieldcat_lvc = i_fieldcat_lvc[] it_excluding = it_excluding " 添加隱藏按鈕的屬性參數 i_save = 'X' TABLES t_outtab = i_tab EXCEPTIONS program_error = 1 OTHERS = 2.
ALV 字段排序設置;
兩個參數的類型定義雖然不一樣,但結構是一樣的,所以操作上並無差異;
下面查看下IT_SORT參數的類型結構定義:
TYPES: BEGIN OF slis_sortinfo_alv, spos LIKE alvdynp-sortpos, “ 排序順序序號 fieldname TYPE slis_fieldname, “ 排序內表字段名稱 tabname TYPE slis_fieldname, “ 排序內表名稱 up LIKE alvdynp-sortup, “ 升序 down LIKE alvdynp-sortdown, “ 降序 group LIKE alvdynp-grouplevel,“ subtot LIKE alvdynp-subtotals, “ 輸出小計 comp(1) TYPE c, expa(1) TYPE c, obligatory(1) TYPE c, ENF OF slis_sortinfo_alv.
示例代碼如下:
* 定義排序變量 DATA: wa_sort_lvc TYPE lvc_s_sort , it_sort_lvc TYPE lvc_t_sort . * 設置排序參數 wa_sort_lvc-spos = 1 . " 排序順序 wa_sort_lvc-fieldname = 'WERKS' . " 排序字段 wa_sort_lvc-up = 'X' . " 升序 APPEND wa_sort_lvc TO it_sort_lvc . CLEAR wa_sort_lvc . wa_sort_lvc-spos = 2 . " 排序順序 wa_sort_lvc-fieldname = ‘matnr’ . " 排序字段 wa_sort_lvc-up = 'X' . " 升序 APPEND wa_sort_lvc TO it_sort_lvc . CLEAR wa_sort_lvc . * ALV 中添加排序屬性 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid " is_layout_lvc = i_layout_lvc " it_fieldcat_lvc = i_fieldcat_lvc[] " it_sort_lvc = it_sort_lvc TABLES t_outtab = i_tab " EXCEPTIONS program_error = 1 OTHERS = 2.
11. I_DEFAULT/ I_SAVE/ IS_VARIANT 參數屬性
這三個參數都是用於ALV 布局的保存設置:
01). I_DEFAULT參數用於設置用戶是否可以定義默認的布局: ’X' 可以定義默認布局, SPACE 不可以定義默認布局 (默認:X)
02). I_SAVE 參數 保存表格布局: ’X' 只能保存全局變式 ’U' 只能保存特定變式 ’A' 都可以保存 SPACE 不能保存變式 (默認:space)
03). IS_VARIANT 參數用於啟用用戶表格布局變式
IT_EVENTS 參數屬性,傳入一個 SLIS_T_EVENT 類型的內表,設置相應處理FORM;
通過與REUSE_ALV_EVENTS_GET函數配合使用,可自定義ALV事件。
首先,查看下SLIS_T_EVENT的類型結構定義,如下所示:
*--- Structure for event handling TYPES: BEGIN OF slis_alv_event, name(30), form(30), END OF slis_alv_event. TYPES: slis_t_event TYPE slis_alv_event OCCURS 0.
再看下 REUSE_ALV_EVENTS_GET 函數,該函數可以獲取ALV中現有的事件,其參數也較為簡單:
Import 參數:I_LIST_TYPE,類型為SLIS_LIST_TYPE,即為ALV事件的序號,其輸入可以為:0,1,2,4
Export 參數:ET_EVENTS,類型為 SLIS_T_EVENT;
接下來,查看下示例:
* 全局變量 DATA: gv_index TYPE sy_tabix. DATA: gt_events TYPE slis_t_event. "ALV 事件 *&---------------------------------------------------------------------* *& Form FRM_GET_EVENT *&---------------------------------------------------------------------* FORM frm_get_event. DATA formname_top_of_page TYPE slis_formname VALUE 'FRM_TOP_OF_PAGE'. DATA lw_events TYPE LINE OF slis_t_event. CALL FUNCTION 'REUSE_ALV_EVENTS_GET' EXPORTING i_list_type = 0 IMPORTING et_events = gt_events EXCEPTIONS list_type_wrong = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. * 修改TOP_OF_PAGE以加入表頭,設置處理子程序為'FRM_TOP_OF_PAGE' CLEAR gv_index. CLEAR lw_events. READ TABLE gt_events INTO lw_events WITH KEY name = slis_ev_top_of_page. IF sy-subrc = 0. gv_index = sy-tabix. MOVE 'FRM_TOP_OF_PAGE' TO lw_events-form. MODIFY gt_events FROM lw_events INDEX gv_index. ELSE. lw_events-form = 'FRM_TOP_OF_PAGE'. lw_events-name = slis_ev_top_of_page. APPEND lw_events TO gt_events. ENDIF. lw_events-name = 'CALLER_EXIT'. lw_events-form = 'FRM_BUTTON'. APPEND lw_events TO gt_events. ENDFORM. " FRM_GET_EVENT *&---------------------------------------------------------------------* *& Form frm_button *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM frm_button USING e_grid TYPE slis_data_caller_exit. * ENDFORM. "FRM_BUTTON
通過IT_EVENTS 參數屬性,就可以為ALV添加自定義的事件 CALLER_EXIT;
其事件的相應處理,則放在FORM中。