ALV開發流程:
1. 將得到並整理好的數據以ALV的形式顯示出來 4
1.1. 在子FORM(這里如:F_FIELDS)指定需要顯示的字段 4
1.2. 在子FORM(這里如:F_BUILD_LAYOUT)里設置ALV的全局屬性 4
1.3. 在子FORM(這里如:F_DISPLAY)里將內表中的數據進行顯示 51.4. 為ALV程序添加表頭標題(這里以添加HTML表頭標題為主) 5
1.4.1. 在顯示ALV的函數(REUSE_ALV_GRID_DISPLAY_LVC)里添加一個參數 5
1.4.2. 在子FORM(F_TOP_OF_PAGE)里定義好需要的變量 5
1.4.3. 准備好所需數據,如登錄用戶的描述、制表日期等 6
1.4.4. 將表頭數據輸出 6
2. 函數“REUSE_ALV_GRID_DISPLAY_LVC”中輸入參數的應用 7
2.1. 排序 7
2.1.1. 在顯示ALV的子FORM里定義排序用到的變量 7
2.1.2. 設置好需要排序的字段 8
2.1.3. 在顯示ALV的函數的輸入參數里添加排序的屬性 8
2.2. 隱藏不必要的標准按鈕 8
2.2.1. 先在顯示ALV的子FORM里定義隱藏按鈕用到的變量 8
2.2.2. 得到需要隱藏的標准按鈕的“FCODE” 8
2.3. 自定義“工具欄” 9
2.3.1. 在顯示ALV的函數的輸入參數里指定自定義按鈕的子FORM 9
3. 熱點鏈接、用戶動作的捕捉、調用其他程序或標准事務程序 11
3.1. 在顯示ALV的函數的輸入參數里指定捕捉用戶動作的子FORM 11
3.2. 在“字段和列名”的子FORM(F_FIELDS)里,對需要鏈接的列添加“熱點”屬性 11
3.3. 操作代碼 11
3.4. 顯示具體細節 12
3.5. 調用其他事務 14
3.6. 打開並選擇文件: 14
4. 關於設置字段和列名的子FORM(F_FIELDS)的參數設置: 15
4.1. 單列優化寬度 15
4.2. 單列求和或者取消求和,添加屬性 15
4.3. 對其方式 15
4.4. 作為圖標輸出 16
4.5. 固定列和關鍵列 16
4.6. 列的字符寬度 16
5. 單元格的F1、F4幫助: 17
5.1. F1幫助: 17
5.2. F4幫助: 17
6. 輸入並保存、回調修改內表(輸入時的小數位錯位的問題、指定數據類型、小說位數) 17
7. 界面顏色的更改 18
7.1. 更改單元格(字體)的前景、背景顏色 19
7.2. 更改行的顏色和列的顏色: 19
7.3. 利用設置字段和列名子的FORM(F_FIELDS)里來設置列的顏色 20
8. ALV自帶的最左端復選框按鈕和自定義復選框按鈕 20
8.1. ALV自帶的復選框按鈕: 20
8.2. 自定義復選框按鈕 20
9. 按照上傳的模板格式導出為本地文件 21
9.1. 定義導出為EXCEL用到的數據變量 21
9.2. 上傳模板 21
9.3. 代碼 22
10. 為ALV標題添加圖片 26
10.1. 上傳圖片 26
10.2. 在子FORM(F_TOP_OF_PAGE2)里的代碼
ALV:ABAP LIST VIEW,一種比較美觀的報表顯示工具
REUSE_ALV_LIST_DISPLAY
Grid的是Excel單元格的格式,而list不是
REUSE_ALV_GRID_DISPLAY 可以控制某一行 某一列,甚至某一格(CELL)的讀寫
ALV用到的函數,目前我們有2個:REUSE_ALV_GRID_DISPLAY、REUSE_ALV_GRID_DISPLAY_LVC;兩個函數都可以將數據用ALV的形式顯示出來,只是在一些小的地方有些不同。
其中這兩個函數都用到的全局變量為:1個類型池SLIS和一個指定列數的變量
DATA: v_pos TYPE i. " 指定第幾列 pos表示列
第1個函數用到的全局變量如下:都是slis類型池中的類型,結尾都是alv(表示他們用於alv)
DATA: wa_fieldcat TYPE slis_fieldcat_alv , " 相當於工作區
i_fieldcat TYPE slis_t_fieldcat_alv , " 存放列名的內表
i_layout TYPE slis_layout_alv . " 負責整個ALV的全局屬性
第2個函數用到的全局變量:
DATA: wa_fieldcat TYPE lvc_s_fcat , " 相當於工作區
i_fieldcat_lvc TYPE lvc_t_fcat , " 存放列名的內表
i_layout_lvc TYPE lvc_s_layo . " 負責整個ALV的全局屬性
下面以第2個函數(REUSE_ALV_GRID_DISPLAY_LVC)來介紹ALV的用法;
1. 將得到並整理好的數據以ALV的形式顯示出來
1.1. 在子FORM(這里如:F_FIELDS)指定需要顯示的字段 wa_fieldcat 工作區,可以賦值
v_pos = v_pos + 1 . 初始值是零
wa_fieldcat-col_pos = v_pos . " 指定列數
wa_fieldcat-fieldname = 'PSPID' . " 需要輸出的內表的字段名
wa_fieldcat-scrtext_l = '項目定義 '. " 字段的描述-長字段標簽 screen text long
wa_fieldcat-scrtext_m = '項目定義 '. " 字段描述-中字段標簽
wa_fieldcat-scrtext_s = '項目定義 '. " 字段描述-短字段標簽
wa_fieldcat-fix_column = 'X' . " 是否是固定列 column ['kɔləm]列
APPEND wa_fieldcat TO i_fieldcat_lvc.
CLEAR wa_fieldcat.
這樣逐步的將需要顯示的字段都添加到內表i_fieldcat中;
1.2. 在子FORM(這里如:F_BUILD_LAYOUT)里設置ALV的全局屬性
i_layout_lvc-zebra = 'X' . " 使ALV界面呈現顏色交替
i_layout_lvc-sel_mode = 'A' . " 選擇模式,“A”在最左端有選擇按鈕
i_layout_lvc-cwidth_opt = 'X' . " 自動優化列寬
i_layout_lvc-detailinit = 'X' . " 是否出現細節屏幕
i_layout_lvc-detailtitl = '詳細內容' . " 細節屏幕標題
1.3. 在子FORM(這里如:F_DISPLAY)里將內表中的數據進行顯示
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_save = 'X' " 是否保存布局
TABLES
t_outtab = i_tab " 數據內表
EXCEPTIONS
program_error = 1
OTHERS = 2.
通過這一步后,一個基本的ALV程序就完成了;下面是對ALV程序的優化和擴展。
1.4. 為ALV程序添加表頭標題(這里以添加HTML表頭標題為主)
1.4.1. 在顯示ALV的函數(REUSE_ALV_GRID_DISPLAY_LVC)里添加一個參數
i_callback_html_top_of_page = 'F_TOP_OF_PAGE'
其中“F_TOP_OF_PAGE”是書寫ALV表頭標題的子FORM,只是在這里使用,沒有明顯的“PERFORM”調用,如下:
FORM f_top_of_page USING p_cl_dd TYPE REF TO cl_dd_document.
1.4.2. 在子FORM(F_TOP_OF_PAGE)里定義好需要的變量
" 定義登錄用戶的描述
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 .
1.4.3. 准備好所需數據,如登錄用戶的描述、制表日期等
" 得到登錄用戶的描述
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 .
1.4.4. 將表頭數據輸出
" 開始輸出表頭標題
m_buffer = '<HTML><CENTER><H1>ALV測試</H1></CENTER></HTML>' .
CALL METHOD p_cl_dd->html_insert
EXPORTING
contents = m_buffer
CHANGING
position = m_p.
" 輸出制表人和制表日期
CONCATENATE '<P ALIGN = CENTER >出表人:' l_name'出表日期:' l_date INTO m_buffer .
CALL METHOD p_cl_dd->html_insert
EXPORTING
contents = m_buffer
CHANGING
position = m_p.
現將需要顯示的表頭數據放到變量“M_BUFFER”中,然后調用方法“P_CL_DD->HEML_INSERT”將數據插入到HTML頁面中顯示,至此顯示表頭數據完成;
2. 函數“REUSE_ALV_GRID_DISPLAY_LVC”中輸入參數的應用
2.1. 排序
排序之前,如果同一列有相同的數據,則排好序以后,在該列會自動將相同的數據合並為一行顯示,不再出現多行重復的情況(但是若該ALV中有字段設置了“可編輯”,合並這一
現象會失效),步驟如下:
2.1.1. 在顯示ALV的子FORM里定義排序用到的變量
" 定義排序變量
DATA: wa_sort_lvc TYPE lvc_s_sort , struture
it_sort_lvc TYPE lvc_t_sort . table
2.1.2. 設置好需要排序的字段
" 設置排序參數
wa_sort_lvc-spos = 1 . " 排序順序
wa_sort_lvc-fieldname = 'CITYFROM' . " 排序字段
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 = 'CITYTO' . " 排序字段
wa_sort_lvc-up = 'X' . " 升序
APPEND wa_sort_lvc TO it_sort_lvc .
CLEAR wa_sort_lvc .
2.1.3. 在顯示ALV的函數的輸入參數里添加排序的屬性
it_sort_lvc = it_sort_lvc
2.2. 隱藏不必要的標准按鈕
2.2.1. 先在顯示ALV的子FORM里定義隱藏按鈕用到的變量
" 定義隱藏標准按鈕的變量
DATA: wa_excluding TYPE slis_t_extab ,
it_excluding TYPE slis_extab .
2.2.2. 得到需要隱藏的標准按鈕的“FCODE”
首先用事務碼“SE24”進入SAP的“類別制作器”,在“Object type”后面輸入ALV的類“CL_GUI_ALV_GRID”,點擊“Display”進入顯示界面,點擊“Attributes”選項卡,找到
自己需要的“屬性”和“初始值”,這個初始值就是我們要找的標准按鈕的“FCODE”(注意:每一個標准按鈕代表的FCODE是靠經驗積累而 掌握的);
1> 、 設將需要隱藏的標准按鈕的“FCODE”添加到內表IT_EXCLUDING中,代碼如下:
" 設置要隱藏的按鈕的“FCODE”
wa_excluding-fcode = '&ABC' .
APPEND wa_excluding TO it_excluding .
2> 、 在顯示ALV的函數的輸入參數里添加隱藏按鈕的屬性參數:
it_excluding = it_excluding
1、 ALV標題,定義標題變量並賦值,然后在顯示ALV的函數的輸入參數里添加“小標題”的參數,代碼如下:
" 小標題
DATA: i_grid_title TYPE lvc_title .
i_grid_title = '小標題 '.
**********************************
i_grid_title = i_grid_title
2.3. 自定義“工具欄”
2.3.1. 在顯示ALV的函數的輸入參數里指定自定義按鈕的子FORM
i_callback_pf_status_set = 'F_SET_STATUS'
當然該子FORM和產生表頭的子FORM一樣,也不顯式的調用,代碼如下:
FORM f_set_status USING p_extab TYPE slis_t_extab .
SET PF-STATUS 'Z_ALV_STATUS' .
ENDFORM. " f_set_status
雙擊其中的“Z_ALV_STATUS”,進入創建工具欄的界面,輸入名字后進入最終的界面在界面右側,
點擊“應用工具條”后面的展開符號,在“項目”后面的白色方框內輸入“自定義按鈕”的代碼后回車,選擇靜態文本回車,在“函數文本”后面輸入想要顯示的按鈕的名稱,在
“圖標名稱”后面選擇相應的圖標(可選),回車在這一界面選擇一個“快捷鍵”(必填)后回車,這樣一個自定義按鈕就做好了,也可以修改,記住剛剛創建的按鈕的代碼,在
下面的捕捉用戶的動作的自FORM(F_USER_COMMAND)會根據剛才的代碼來進行相應的操作;
1、 點開“功能鍵”后面的展開符號,進入功能鍵的設置,下圖是各個動作對應的代碼:
2、 沒有自定義按鈕時候,函數里的“i_callback_pf_status_set = 'F_SET_STATUS'”這個參數可以不要,這時會顯示ALV標准的按鈕,當然這些按鈕可以部分隱藏(見三、
2);
3、 當我們使用自定義按鈕后,ALV自帶的標准按鈕,就會失效,這時我們需要將一些用戶要求我們必須顯示的按鈕一一地在“應用工具條”后面補上,如下圖:
其中“分隔符”的插入方法為:在需要插入分隔符的方框內選擇菜單“Edit”“Insert”“Separator line”即可插入分隔符;
下面是上圖中的標准工具的名稱、代碼、圖標名稱、快捷鍵
名稱 代碼 圖標名稱 快捷鍵
刷新 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
上表中紅色的屬於自定義按鈕,自定義按鈕可以使用標准的圖標名稱,也可以不適用圖標;
3. 熱點鏈接、用戶動作的捕捉、調用其他程序或標准事務程序
3.1. 在顯示ALV的函數的輸入參數里指定捕捉用戶動作的子FORM
FORM f_user_command USING p_ucomm TYPE sy-ucomm
p_rs_selfield TYPE slis_selfield .
當然該子FORM和產生表頭的子FORM一樣,也不顯式的調用;
3.2. 在“字段和列名”的子FORM(F_FIELDS)里,對需要鏈接的列添加“熱點”屬性
v_pos = v_pos + 1 .
wa_fieldcat-col_pos = v_pos .
wa_fieldcat-fieldname = 'CITYFROM' .
wa_fieldcat-scrtext_l = '起飛城市' .
wa_fieldcat-fix_column = 'X' .
wa_fieldcat-hotspot = 'X' . " 熱點,鏈接用
APPEND wa_fieldcat TO i_fieldcat .
CLEAR wa_fieldcat .
這樣在顯式界面上“起飛城市”所代表的字段“CITYFROM”的下面就會出現一條下划線,同時當鼠標移動到該列時,就會變成“等待”的手勢,當用戶單擊每一條時,就會觸動子
FORM(F_USER_COMMAND)中的動作,進而引起某些操作;
3.3. 操作代碼
對於熱點鏈接,所對應的動作碼為“&IC1”,在子FORM(F_USER_COMMAND)中捕捉用戶的動作,並進行相應的操作,代碼如下:
FORM f_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 f_show_detail USING p_rs_selfield . " 顯示具體細節
ENDIF.
ELSEIF p_rs_selfield-fieldname EQ 'TCODE' .
IF NOT wa_tab-tcode IS INITIAL .
PERFORM f_call_tran USING p_rs_selfield . " 調用其他事務
ENDIF .
ELSEIF p_rs_selfield-fieldname EQ 'ICON_FOLDER' .
PERFORM f_open_folder USING p_rs_selfield . " 打開文件
ENDIF.
CLEAR wa_tab .
WHEN '&SAVE_DATA' .
PERFORM f_save_data . " 保存數據
WHEN 'PRINT' .
PERFORM f_print_data. " 打印數據
WHEN 'EXCEL' .
PERFORM f_export . " 導出數據
ENDCASE.
p_rs_selfield-refresh = 'X' . " 當用戶在顯式界面上對數據進行修改時,同時內表中的數據也隨之刷新
ENDFORM. " f_user_command
3.4. 顯示具體細節
1> 、 先定義一個存放具體內容的內表並整理好相關數據;
2> 、 調用 一個指定大小的屏幕來顯示具體的內容,代碼如下:
CALL SCREEN 0100 STARTING AT 12 12 ENDING AT 137 24 .
3> 、 雙擊該屏幕號碼“0100”創建該屏幕,在“屬性”卡輸入該屏幕的描述,在“邏輯流”卡里將系統默認注釋掉的PBO、PAI事件的模塊取消注釋並產生這兩個模塊
(雙擊並確定);
4> 、 在“屏幕制作器”界面點擊 進入“屏幕制作器”的圖形界面,開始繪制我們需要的屏幕元素,這里我們需要一個“表控制”(最左邊從下數第四個元素),該表
格的屬性設置為:
名稱:
起始行列和高寬
上圖表示“列標題”為“具體內容”,可以水平或垂直的調節大小,有水平和垂直的分隔符,只能同時選中一行一列,帶選擇列(DE_BOX),最左端兩列固定不滾動;
5> 、 接下來給單元格和列標題名稱並給單元格指定內表的字段,
6> 、 屏幕的PBO、PAI事件的代碼如下:
PROCESS BEFORE OUTPUT.
MODULE status_0100.
LOOP AT i_detail INTO wa_detail
WITH CONTROL vs_detail CURSOR i_detail-current_line .
ENDLOOP.
*
PROCESS AFTER INPUT.
LOOP AT i_detail .
ENDLOOP.
MODULE user_command_0100.
7> 、 需要在定義變量的時候聲明一下表控制和動作的接受者(OK_CODE)如下:
* 表控制IS_MATNR
CONTROLS vs_detail TYPE TABLEVIEW USING SCREEN 0100 .
" 利用同名傳遞原理,來接受細節屏幕上的元素“ok_code”的值
DATA: ok_code TYPE sy-ucomm .
8> “MODULE status_0100.”的代碼如下:
MODULE status_0100 OUTPUT.
SET PF-STATUS '0100' .
DESCRIBE TABLE i_detail LINES vs_detail-current_line .
ENDMODULE. " status_0100 OUTPUT
在“0100”的工具欄里,只設置 即可滿足需求;
“MODULE user_command_0100.”的代碼如下:
MODULE user_command_0100 INPUT.
CASE ok_code.
WHEN 'BACK' .
SET SCREEN 0 . " 返回主屏幕
ENDCASE.
ENDMODULE. " user_command_0100 INPUT
完成調用細節屏幕;
注意:在顯示細節屏幕的字段的類型上,當內表中有數據為貨幣類型的時候,要在“格式”里指明該字段是貨幣類型的數據,如下圖:
3.5. 調用其他事務
FORM f_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. " f_call_tran
“LIB”是指參數ID,查找方法:用一個事務碼進入事務界面,在輸入框內按F1,在彈出來的界面中點擊 ,新界面中的 就是參數ID;
“SE37”是指我們要調用的事務代碼,“AND SKIP FIRST SCREEN”表示跳過第一屏屏幕;
3.6. 打開並選擇文件:
1> 、現則內表中定義好存放文件路徑的字段(這里是FILE_PATH),當用戶點擊界面上設置好的打開文件圖標時,就會觸發子FORM(F_USER_COMMAND)里的打開文件的子FORM
(F_OPEN_FOLDER);
2> 子FORM(F_OPEN_FOLDER)的代碼如下:
FORM f_open_folder USING p_rs_selfield TYPE slis_selfield .
DATA: l_file_path LIKE rlgrap-filename .
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
mode = 'O'
title = '選擇文件'
IMPORTING
filename = l_file_path
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc = 0.
wa_tab-file_path = l_file_path . " 將得到的文件的路徑賦給當前行的路徑
MODIFY i_tab INDEX wa_tab-numer FROM wa_tab TRANSPORTING file_path .
CLEAR l_file_path .
ELSE .
MESSAGE s000 WITH '沒有選擇文件' .
ENDIF.
ENDFORM. " f_open_folder
4. 關於設置字段和列名的子FORM(F_FIELDS)的參數設置:
4.1. 單列優化寬度
當在子FORM(F_BUILD_LAYOUT)里沒有指明全局優化列寬的時候,在需要指定優化的字段的屬性里指定下列屬性就可以單列優化了,
wa_fieldcat-col_opt = 'X' .
4.2. 單列求和或者取消求和,添加屬性
wa_fieldcat-do_sum = 'X' . " 求和
wa_fieldcat-no_sum = 'X' . " 取消求和
如果此時在子FORM(F_BUILD_LAYOUT)里添加下列屬性,則求和后的行就會在第一行出現:
i_layout-totals_bef = 'X' .
4.3. 對其方式
wa_fieldcat-just = 'L' . " 左對齊
wa_fieldcat-just = 'C' . " 居中對齊
wa_fieldcat-just = 'R' . " 右對齊
當然,在不指明對其方式的前提下,ABAP的各種數據類型優默認的對其方式,其中字符串是默認為左對齊,而貨幣、數量默認為右對齊;
4.4. 作為圖標輸出
1> 、首先在開始包含進一個包括,如下:
" 包含圖標等在內的一些信息
INCLUDE <list> .
2> 、然后在內表中定義一個代表圖標的字段(這里如ICON_FOLDER),在整理數據的時候,需要將代表圖標的代碼賦給給字段,如下
" 圖標
wa_banfn-icon_folder = icon_object_folder .
3> 、接着在子FORM(F_FIELDS)里給需要圖標顯示的列添加下列屬性:
v_pos = v_pos + 1 .
wa_fieldcat-col_pos = v_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”進入后左邊第二列就是圖標代碼,根據需要進行選擇;
4.5. 固定列和關鍵列
兩者都可以使具有該屬性的列固定不滾動,但是前者不改變該列的顏色,而后者會將該列的顏色弄成一色,不容易確認,但它具有其他的功能,代碼如下:
wa_fieldcat-fix_column = 'X' . " 固定列
wa_fieldcat-key = 'X' . " 關鍵列
4.6. 列的字符寬度
可以明顯地指明該列的輸出寬度,屬性代碼如下:
wa_fieldcat-outputlen = 10 . " 輸出寬度
列抬頭的工具提示,在列的屬性添加下列參數,當用戶將鼠標放到列名上時,可以顯示“提示”2字,代碼如下:
wa_fieldcat-tooltip = '提示' .
5. 單元格的F1、F4幫助:
5.1. F1幫助:
1> 、在子FORM(F_FIELDS)里列的屬性添加“數據元素”這一屬性,代碼如下:
wa_fieldcat-rollname = 'PS_PSPID' . " 指定數據元素
就可以在ALV的顯示界面將鼠標放到該字段的位置后按F1會彈出該字段的說明;
2> 、指定數據元素之后,可以不指明字段的描述(如SCRTEXT_L、SCRTEXT_M、SCRTEXT_S),函數會自動將字段的描述顯示,但是沒有自己指定的靈活
5.2. F4幫助:
1> 、在子FORM(F_FIELDS)里列的屬性添加下列屬性,代碼如下:
wa_fieldcat-ref_field = 'PSPID' .
wa_fieldcat-ref_table = 'PROJ' .
這樣在ALV的顯示界面,在該字段處就可以按F4來查看相關的內容了;
6. 輸入並保存、回調修改內表(輸入時的小數位錯位的問題、指定數據類型、小說位數)
1、 首先在顯示ALV的子FORM(F_DISPLAY)里定義“回調”的變量,如下:
" 回調變量
DATA: i_grid_settings TYPE lvc_s_glay .
i_grid_settings-edt_cll_cb = 'X' .
2、 在顯示ALV的函數(REUSE_ALV_GRID_DISPLAY_LVC)里添加輸入參數如,下:
i_grid_settings = i_grid_settings
這時只要在顯示界面可編輯字段上修改了數據,回車后就會立即將內表的數據也修改了;
3、 對於貨幣字段,要在其設置字段和列名的屬性中再添加一個“指定數據類型”的屬性,如下:
wa_fieldcat-datatype = 'CURR' . " 指定數據類型
這樣在修改數據並保存時,才能將數據保持原樣,否則輸入的數據會自動將小數點提前2位;
4、 對於數量字段,也要添加一個“指定數據類型”的屬性,才能保持數據的正確性,如下:
wa_fieldcat-datatype = 'QUAN' . " 指定數據類型
wa_fieldcat-inttype = 'C' .
5、 將界面數據保存到數據庫表中,觸發事件見子FORM中的F_SAVE_DATA,代碼如下:
FORM f_save_date .
DATA: i_spfli LIKE TABLE OF spfli WITH HEADER LINE .
DATA: l_error TYPE REF TO cx_sy_open_sql_db ,
l_error2 TYPE REF TO cx_sy_arithmetic_overflow ,
l_error_text TYPE string .
" 將界面上的數據轉接到和被修改的數據庫表的結構一樣的內表中
LOOP AT i_tab INTO wa_tab .
i_spfli-carrid = 'ZZ' .
i_spfli-connid = sy-tabix .
i_spfli-cityfrom = wa_tab-cityfrom .
i_spfli-airpfrom = wa_tab-airpfrom .
i_spfli-cityto = wa_tab-cityto .
i_spfli-airpto = wa_tab-airpto .
i_spfli-distance = wa_tab-distance .
APPEND i_spfli .
CLEAR i_spfli .
ENDLOOP.
" 保存到數據庫
TRY .
DELETE spfli FROM TABLE i_spfli .
INSERT spfli FROM TABLE i_spfli .
CATCH cx_sy_open_sql_db INTO l_error .
l_error_text = l_error->get_text( ) .
sy-subrc = 1 .
ENDTRY .
IF sy-subrc NE 0 .
ROLLBACK WORK .
MESSAGE e000 WITH l_error_text .
CLEAR l_error_text .
ELSE .
MESSAGE s000 WITH '數據保存成功!' .
ENDIF.
CLEAR i_spfli .
REFRESH i_spfli .
ENDFORM. " f_save_date
7. 界面顏色的更改
ALV中的顏色代碼共有4位,其中C是固定的第一位(代表COLOR),第二位代表是顏色編碼(1到7),第三位是加強顏色的設置(1表示打開,0表示關閉),第四位是減弱顏色(1表示打
開,0表示關閉),個人理解,在強化關閉的情況下,相反的作用是背景和字體的變化:
7.1. 更改單元格(字體)的前景、背景顏色
1> 、在定義內表的時候定義一個代表單元格顏色的字段,如下:
cell_color TYPE slis_t_specialcol_alv
2> 、在子FORM(F_BUILD_LAYOUT)里,要指明代表單元格顏色的字段的名稱,如下:
i_layout-ctab_fname = 'CELL_COLOR'. " 單元格顏色設置
3> 、在子FORM(F_CELL_COLOR)里給代表單元格顏色的字段賦值,如下:
FORM f_cell_color .
" 單元格顏色
DATA: l_cellcolor TYPE slis_specialcol_alv .
LOOP AT i_tab INTO wa_tab .
IF wa_tab-price > 500 .
l_cellcolor-fieldname = 'PRICE' . " 要修改顏色的字段名
l_cellcolor-color-col = 6 . " 顏色(1-7)
l_cellcolor-color-inv = 1 . " 前景字體(int代表背景顏色)
APPEND l_cellcolor TO wa_tab-cell_color .
CLEAR l_cellcolor .
ENDIF.
MODIFY i_tab INDEX wa_tab-numer FROM wa_tab TRANSPORTING cell_color .
CLEAR wa_tab .
ENDLOOP.
ENDFORM. " f_cell_color
7.2. 更改行的顏色和列的顏色:
1> 、在定義內表的時候定義一個代表行列顏色的字段,如下:
line_color(4) TYPE c
2> 、在子FORM(F_BUILD_LAYOUT)里,要指明代表行列顏色的字段的名稱,如下:
i_layout-info_fname = 'LINE_COLOR' . " 行列顏色
3> 、在子FORM(F_LINE_COLOR)里給代表行列顏色的字段賦值,如下:
FORM f_line_color .
DATA: l_i TYPE i .
LOOP AT i_tab INTO wa_tab .
l_i = sy-tabix MOD 2 .
IF l_i = 0 .
wa_tab-line_color = 'C311' .
MODIFY i_tab INDEX wa_tab-numer FROM wa_tab TRANSPORTING line_color .
CLEAR wa_tab .
ENDIF.
ENDLOOP.
ENDFORM. " f_line_color
7.3. 利用設置字段和列名子的FORM(F_FIELDS)里來設置列的顏色
wa_fieldcat-emphasize = 'C711' .
注意: 顏色設置中有優先級順序,他們是單元格-->行-->列,即若同時使用了上述3中更改顏色的方法,則列的顏色會被行的顏色覆蓋掉,而行的顏色又會背單元格的顏色覆蓋掉,
最終只會顯示出單元格的顏色.
8. ALV自帶的最左端復選框按鈕和自定義復選框按鈕
8.1. ALV自帶的復選框按鈕:
在定義內表時,需要指明代表復選框的字段,這里如:BOX_NAME,然后在定義ALV全局屬性的子FORM(F_BUILD_LAYOUT)里指明代表復選框的字段,如下:
i_layout-box_fname = box_fname .
8.2. 自定義復選框按鈕
需要在子FORM(F_FIELDS)里添加下列如下語句:
wa_fieldcat-col_pos = v_pos .
wa_fieldcat-fieldname = 'CHECKBOX' .
wa_fieldcat-scrtext_m = '復選框' .
wa_fieldcat-checkbox = 'X' .
wa_fieldcat-edit = 'X' .
wa_fieldcat-just = 'C' .
wa_fieldcat-fix_column = 'X' .
APPEND wa_fieldcat TO i_fieldcat .
CLEAR wa_fieldcat .
該功能必須在在顯示ALV的函數的子FORM(F_DISPLAY)里添加“回調”的輸入參數,這樣當用
戶點擊復選框后才能將改變寫回到內表中,代碼如下
DATA: l_grid_settings TYPE lvc_s_glay .
l_grid_settings-edt_cll_cb = 'X' .
i_grid_settings = l_grid_settings
9. 按照上傳的模板格式導出為本地文件
9.1. 定義導出為EXCEL用到的數據變量
TYPE-POOLS ole2 .
DATA: v_excel TYPE ole2_object,
v_sheet TYPE ole2_object,
v_book TYPE ole2_object,
v_rows TYPE ole2_object,
v_cell TYPE ole2_object,
v_sheet_number TYPE i .
9.2. 上傳模板
需要用事務碼“SMW0”先上傳一個EXCEL模板,步驟:
1> 、SMW0進入界面,選擇“WebRFC應用程序的二進制數據”,點擊 進入現已界面;
2> 、在“包”后面輸入一個包名后點擊 或者按F8進入上傳模板的主界面,如下圖:
3> 、在上圖中點擊 或者按F5新建一個模板,彈出下圖:
輸入“對象名稱”(一般用程序名+。xls)和“描述”后,點擊 或者按“Shift + F6”找到自己存放模板的路徑雙擊上傳即可完成模板的上傳(名稱為Z_ALV.XLS);
9.3. 代碼
當用戶觸動子FORM(F_USER_COMMAND)里的導出程序時,就會觸動下列代碼,現將模板現在下來,
進而根據模板將數據導出到EXCEL表格中,代碼中的許多部分都是固定的,其中的紅色底色部分
為需要自己填寫代碼如下:
*&---------------------------------------------------------------------*
*& Form f_export
*&---------------------------------------------------------------------*
* 導出數據
*----------------------------------------------------------------------*
FORM f_export .
DATA: l_name LIKE wwwdatatab,
l_mine LIKE w3mime OCCURS 10,
l_title TYPE string,
l_filename TYPE string,
l_path TYPE string,
l_fullpath TYPE string.
l_name-relid = 'MI'.
l_name-objid = 'Z_ALV.XLS'.
l_name-text = sy-title.
CONCATENATE 'Z_ALV測試_' sy-uname '_' sy-datum '_' sy-uzeit INTO l_title .
*模板下載
CALL FUNCTION 'WWWDATA_IMPORT'
EXPORTING
key = l_name
TABLES
mime = l_mine
EXCEPTIONS
wrong_object_type = 1
import_error = 2
OTHERS = 3.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = l_title
default_extension = 'xls'
default_file_name = l_title
file_filter = '(電子表格EXCEL)'
CHANGING
filename = l_filename
path = l_path
fullpath = l_fullpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
STOP.
ENDIF.
IF l_filename = ''.
MESSAGE e000 WITH '已取消導出!' .
ENDIF.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = l_fullpath
filetype = 'BIN'
TABLES
data_tab = l_mine.
*--打開excel模板
PERFORM f_open_excel USING l_fullpath.
*--向excel寫數據
PERFORM f_write_excel_sheet.
*--設置excel可見
CALL METHOD OF v_excel 'Worksheets' = v_sheet
EXPORTING
#1 = 1.
CALL METHOD OF v_sheet 'Activate'.
SET PROPERTY OF v_excel 'Visible' = 1.
* 關閉EXCEL並保存
PERFORM f_save_excel USING l_fullpath.
ENDFORM. " f_export
*&---------------------------------------------------------------------*
*& Form f_OPEN_EXCEL
*&---------------------------------------------------------------------*
* 根據本地excel路徑,打開excel應用
*----------------------------------------------------------------------*
FORM f_open_excel USING pa_path.
CREATE OBJECT v_excel 'Excel.Application'.
CALL METHOD OF v_excel 'Workbooks' = v_book.
CALL METHOD OF v_book 'Open' = v_book
EXPORTING
#1 = pa_path.
CALL METHOD OF v_book 'Sheets' = v_sheet
EXPORTING
#1 = 1.
ENDFORM. " f_OPEN_EXCEL
*&---------------------------------------------------------------------*
*& Form f_WRITE_EXCEL_SHEET1
*&---------------------------------------------------------------------*
* 向excel寫入數據
*----------------------------------------------------------------------*
FORM f_write_excel_sheet.
TYPES: BEGIN OF typ_name ,
name_first(40) TYPE c ,
name_last(40) TYPE c ,
END OF typ_name .
DATA: i_name TYPE TABLE OF typ_name WITH HEADER LINE .
DATA: l_name(40) TYPE c .
SELECT adrp~name_first
adrp~name_last
INTO CORRESPONDING FIELDS OF TABLE i_name
FROM adrp
INNER JOIN usr21 ON adrp~persnumber = usr21~persnumber
WHERE usr21~bname = sy-uname .
LOOP AT i_name .
CONCATENATE i_name-name_last i_name-name_first INTO l_name .
ENDLOOP.
DATA: l_chars(50) TYPE c,
l_lines TYPE i ,
l_num TYPE i VALUE 4. "行變化,從第幾行開始導入
*寫入表頭
PERFORM f_write_cell USING 1 1 'Z_ALV測試'.
CONCATENATE '制表日期:' sy-datum+0(4) '年' sy-datum+4(2) '月' sy-datum+6(2) '日' INTO l_chars.
CONDENSE l_chars NO-GAPS .
PERFORM f_write_cell USING 2 1 l_chars.
CONCATENATE '制表人:' l_name INTO l_name .
CONDENSE l_name NO-GAPS .
PERFORM f_write_cell USING 2 5 l_name.
"通過行列的方式把數據寫入到Excel中
LOOP AT i_tab INTO wa_tab .
PERFORM f_write_cell USING l_num 1 wa_tab-numer .
PERFORM f_write_cell USING l_num 2 wa_tab-cityfrom.
PERFORM f_write_cell USING l_num 3 wa_tab-airpfrom.
PERFORM f_write_cell USING l_num 4 wa_tab-cityto.
PERFORM f_write_cell USING l_num 5 wa_tab-airpto.
PERFORM f_write_cell USING l_num 6 wa_tab-distance.
PERFORM f_write_cell USING l_num 7 wa_tab-price.
PERFORM f_write_cell USING l_num 8 wa_tab-tcode.
PERFORM f_write_cell USING l_num 9 wa_tab-file_path.
l_num = l_num + 1 .
CLEAR wa_tab .
ENDLOOP.
ENDFORM. " f_WRITE_EXCEL_SHEET1
*&---------------------------------------------------------------------*
*& Form f_SAVE_EXCEL
*&---------------------------------------------------------------------*
* 保存excel文檔
*----------------------------------------------------------------------*
* -->P_L_FULLPATH text
*----------------------------------------------------------------------*
FORM f_save_excel USING pa_fullpath.
SET PROPERTY OF v_excel 'DisplayAlerts' = 0.
CALL METHOD OF v_book 'SAVEAS'
EXPORTING
#1 = pa_fullpath.
CALL METHOD OF v_book 'Exit' = v_book.
FREE OBJECT v_excel.
ENDFORM. " f_SAVE_EXCEL
*&---------------------------------------------------------------------*
*& Form f_WRITE_CELL
*&---------------------------------------------------------------------*
* 向excel指定cell寫入數據
*----------------------------------------------------------------------*
FORM f_write_cell USING pa_row
pa_col
pa_val.
CALL METHOD OF v_sheet 'Cells' = v_cell
EXPORTING
#1 = pa_row
#2 = pa_col.
SET PROPERTY OF v_cell 'Value' = pa_val.
ENDFORM. " f_WRITE_CELL
10. 為ALV標題添加圖片
要使用圖片,顯示ALV的函數的輸入參數中的HTML表頭必須換成一般表頭,即:
i_callback_html_top_of_page = 'F_TOP_OF_PAGE1
必須換成
I_CALLBACK_TOP_OF_PAGE = 'F_TOP_OF_PAGE2'
10.1. 上傳圖片
OAER進入參數界面,在“Class name”后面輸入“PICTURES”,在“Class Type”后面輸入“OT”,在“Object ID”后面輸入一個名字,用來標記上傳的圖片,點擊 或按F8進入
上傳圖片的主界面,點擊下面的鄂“Create”展開“Standard.Doc.Types”雙擊“屏幕”上傳自己的圖片,指定好“Description”和“KeyWord”方便以后查找,完成圖片的上傳
,幾下“Object ID”,后面的程序中要用到;
10.2. 在子FORM(F_TOP_OF_PAGE2)里的代碼
*&---------------------------------------------------------------------*
*& Form f_top_of_page2
*&---------------------------------------------------------------------*
* ALV表頭標題
*----------------------------------------------------------------------*
FORM f_top_of_page2 .
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 .
" Image
wa_header-typ = 'H'.
wa_header-info = 'Z_ALV測試' .
APPEND wa_header TO i_header .
CLEAR wa_header .
CONCATENATE '制表人:' l_name INTO l_name .
CONCATENATE '制表日期:' l_date INTO l_date .
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
i_logo = 'BEPC' " OAER中的Object ID
it_list_commentary = i_header
i_alv_form = 'X'.
ENDFORM. " f_top_of_page2
效果如下圖:
雖然可以傳圖片,但是靈活度沒有F_TOP_OF_PAGE1高;
注意,全部代碼: