ALV全解
ALV:SAP LIST VIEW,一種比較美觀的報表顯示工具
ALV用到的函數,目前我們有2個:REUSE_ALV_GRID_DISPLAY、REUSE_ALV_GRID_DISPLAY_LVC;兩個函數都可以將數據用ALV的形式顯示出來,只是方在一些小的地方有些不同。
其中第兩個函數都用到的全局變量為:1個類型池SLIS和一個指定列數的變量
DATA:?v_pos???????TYPEi?.??"?指定第幾列
第1個函數用到的全局變量如下:
DATA:?wa_fieldcat?TYPE?slis_fieldcat_alv?,????"?相當于工作區(qū)
 ?????????? i_fieldcat??TYPE?slis_t_fieldcat_alv?,??"?存放列名的捏表
 ?????????? i_layout????TYPE?slis_layout_alv?.??????"?負責整個ALV的全局屬性 
第2個函數用到的全局變量:
DATA:?wa_fieldcat?TYPE?lvc_s_fcat?,?"?相當于工作區(qū)
 ?????????? i_fieldcat??TYPE?lvc_t_fcat?,?"?存放列名的捏表
 ?????????? i_layout????TYPE?lvc_s_layo?.?"?負責整個ALV的全局屬性???? 
下面以第2個函數(REUSE_ALV_GRID_DISPLAY_LVC)來介紹ALV的用法;
1.????????將得到并整理好的數據以ALV的形式顯示出來
1.1.????????在子FORM(這里如:F_FIELDS)指定需要顯示的字段
??v_pos?=?v_pos?+?1?.
 ??wa_fieldcat -col_pos???????=?v_pos?.???????"?指定列數
 ??wa_fieldcat -fieldname?????=?'PSPID'?.?????"?需要輸出的內表的字段名
 ??wa_fieldcat -scrtext_l?????=?'項目定義?'.??"?字段的描述-長字段標簽
 ??wa_fieldcat scrtext_m????? =?'項目定義?'.??"?字段描述-中字段標簽
 ??wa_fieldcat -scrtext_s?????=?'項目定義?'.??"?字段描述-短字段標簽
 ??wa_fieldcat -fix_column????=?'X'?.?????????"?是否是固定列
 APPEND wa_fieldcat?TOCLEAR? wa_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'?.???????"?自動優(yōu)化列寬
 ??i_layout_lvc-detailinit???=?'X'?.???????"?是否出現細節(jié)屏幕
 ??i_layout_lvc-detailtitl???=?'詳細內容'?.?"?細節(jié)屏幕標題 
1.3.????????在子FORM(這里如:F_DISPLAY)里將內表中的數據進行顯示
CALLFUNCTION'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. 
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?TYPEREFTO?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"?定義登錄日期
 DATA:?l_date?TYPE"?定義緩沖區(qū)變量
 DATA:?m_p?TYPEiTYPE?string?. 
"?得到登錄用戶的描述
 SELECTSINGLE?adrp~name_first
 ????????????????adrp~name_last
 INTOFROMJOIN?usr21?ON?adrp~persnumber?=?usr21~persnumber
 WHEREIF?sy-subrc?=?0CONCATENATE?name_last?name_first?INTOELSEENDIFCLEARCLEAR"?拼接制表日期
 CONCATENATE?sy-datum+0(2)?'.'
 ??????????????sy-datum+4(2)?'.'
 ??????????????sy-datum+6(2)?'.'
 INTO?l_date?. 
"?開始輸出表頭標題
 ??m_buffer?=?'<HTML><CENTER><H1>ALV測試</H1></CENTER></HTML>'CALLMETHODEXPORTINGCHANGING
 position"?輸出制表人和制表日期
 CONCATENATE'<P?ALIGN?=?CENTER?>出表人:''?????????? ????????'
 '??????????????????'
 '??????????????????'
 '??????????????????'
 '??????????????????'
 '??????????????????'
 '出表日期:'?l_date?INTOCALLMETHODEXPORTINGCHANGING
 position?=?m_p. 
現將需要顯示的表頭數據放到變量"M_BUFFER"中,然后調用方法"P_CL_DD->HEML_INSERT"將數據插入到HTML頁面中顯示,至此顯示表頭數據完成;
2.????????函數"REUSE_ALV_GRID_DISPLAY_LVC"中輸入參數的應用
排序之前,如果同一列有相同的數據,則排好序以后,在該列會自動將相同的數據合并為一行顯示,不再出現多行重復的情況(但是若該ALV中有字段設置了"可編輯",合并這一現象會失效),步驟如下:
2.1.1.????????在顯示ALV的子FORM里定義排序用到的變量"?定義排序變量
 DATA:?wa_sort_lvc?TYPE?lvc_s_sort?,
 ????????it_sort_lvc?TYPE?lvc_t_sort?. 
????
2.1.2.????????設置好需要排序的字段"?設置排序參數
 ??wa_sort_lvc-spos????????=?1?.???????????"?排序順序
 ??wa_sort_lvc-fieldname???=?'CITYFROM'?.??"?排序字段
 ??wa_sort_lvc-up??????????=?'X'?.?????????"?升序
 APPEND?wa_sort_lvc?TOCLEAR?wa_sort_lvc?.
 
 ??wa_sort_lvc-spos????????=?2?.???????????"?排序順序
 ??wa_sort_lvc-fieldname???=?'CITYTO'?.??"?排序字段
 ??wa_sort_lvc-up??????????=?'X'?.?????????"?升序
 APPEND?wa_sort_lvc?TOCLEAR?wa_sort_lvc?. 
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?. 
首先用事務碼"SE24"進入SAP的"類別制作器",在"Object type"后面輸入ALV的類"CL_GUI_ALV_GRID",點擊"Display"進入顯示界面,點擊"Attributes"選項卡,找到自己需要的"屬性"和"初始值",這個初始值就是我們要找的標準按鈕的"FCODE"(注意:每一個標準按鈕代表的FCODE是靠經驗積累而 掌握的);
、????設將需要隱藏的標準按鈕的"FCODE"添加到內表IT_EXCLUDING中,代碼如下:"?設置要隱藏的按鈕的"FCODE"
 ??wa_excluding-fcode?=?'&ABC'APPEND?wa_excluding?TO?it_excluding?. 
it_excluding??????????????????????=?it_excluding
ALV標題,定義標題變量并賦值,然后在顯示ALV的函數的輸入參數里添加"小標題"的參數,代碼如下:"?小標題
 DATA:?i_grid_title?TYPE?lvc_title?.
 ??i_grid_title?=?'小標題'?. 
???? **********************************
???? i_grid_title??????????????????????=?i_grid_title
2.3.????????自定義"工具欄"
2.3.1.????????在顯示ALV的函數的輸入參數里指定自定義按鈕的子FORMi_callback_pf_status_set??????????=?'F_SET_STATUS'
當然該子FORM和產生表頭的子FORM一樣,也不顯式的調用,代碼如下:
FORM?f_set_status?USING?p_extab?TYPESET?PF-STATUS?'Z_ALV_STATUS'?.
 ENDFORM.????????????????????"?f_set_status 
???? 雙擊其中的"Z_ALV_STATUS",進入創(chuàng)建工具欄的界面,輸入名字后進入最終的界面在界面右側,
點擊"應用工具條"后面的展開符號,在"項目"后面的白色方框內輸入"自定義按鈕"的代碼后回車,選擇靜態(tài)文本回車,在"函數文本"后面輸入想要顯示的按鈕的名稱,在"圖標名稱"后面選擇相應的圖標(可選),回車在這一界面選擇一個"快捷鍵"(必填)后回車,這樣一個自定義按鈕就做好了,也可以修改,記住剛剛創(chuàng)建的按鈕的代碼,在下面的捕捉用戶的動作的自FORM(F_USER_COMMAND)會根據剛才的代碼來進行相應的操作;
點開"功能鍵"后面的展開符號,進入功能鍵的設置,下圖是各個動作對應的代碼: 沒有自定義按鈕時候,函數里的"i_callback_pf_status_set??=?'F_SET_STATUS'"這個參數可以不要,這時會顯示ALV標準的按鈕,當然這些按鈕可以部分隱藏(見三、2); 當我們使用自定義按鈕后,ALV自帶的標準按鈕,就會失效,這時我們需要將一些用戶要求我們必須顯示的按鈕一一地在"應用工具條"后面補上,如下圖:其中"分隔符"的插入方法為:在需要插入分隔符的方框內選擇菜單"Edit"à"Insert"à"Separator line"即可插入分隔符;
下面是上圖中的標準工具的名稱、代碼、圖標名稱、快捷鍵
更改布局…
&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'hotspot???????=?'X'?.?????"?熱點,鏈接用
 APPEND?wa_fieldcat?TOCLEAR?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?TYPECASEWHEN'&IC1'?.???"?判斷用戶的動作
 "?讀取用戶點擊的當前行的一行內容
 READTABLE?i_tab?INTO?wa_tab?INDEXIF?p_rs_selfield-fieldname?EQ'CITYFROM'.???"?判斷用戶點擊的是哪一列
 IFNOT?wa_tab-cityfrom?ISINITIALPERFORM?f_show_detail?USING?p_rs_selfield?.???"?顯示具體細節(jié)
 ENDIFELSEIF?p_rs_selfield-fieldname?EQ'TCODE'IFNOT?wa_tab-tcode?ISINITIALPERFORM?f_call_tran?USING?p_rs_selfield?.?????"?調用其他事務
 ENDIFELSEIF?p_rs_selfield-fieldname?EQ'ICON_FOLDER'PERFORM?f_open_folder?USING?p_rs_selfield?.?????"?打開文件
 ENDIFCLEARWHEN'&SAVE_DATA'PERFORM?f_save_data?.?????????????????????????????"?保存數據
 WHEN'PRINT'PERFORM?f_print_data.?????????????????????????????"?打印數據
 WHEN'EXCEL'PERFORM?f_export?.????????????????????????????????"?導出數據
 ENDCASErefresh?=?'X'?.???"?當用戶在顯式界面上對數據進行修改時,同時內表中的數據也隨之刷新
 ENDFORM.????????????????????"?f_user_command 
3.4.????????顯示具體細節(jié)
、????先定義一個存放具體內容的內表并整理好相關數據; 、????調用 一個指定大小的屏幕來顯示具體的內容,代碼如下:CALLSCREEN0100STARTINGAT1212?ENDING?AT13724?.
、????雙擊該屏幕號碼"0100"創(chuàng)建該屏幕,在"屬性"卡輸入該屏幕的描述,在"邏輯流"卡里將系統(tǒng)默認注釋掉的PBO、PAI事件的模塊取消注釋并產生這兩個模塊(雙擊并確定); 、????在"屏幕制作器"界面點擊進入"屏幕制作器"的圖形界面,開始繪制我們需要的屏幕元素,這里我們需要一個"表控制"(最左邊從下數第四個元素),該表格的屬性設置為:名稱:
起始行列和高寬
上圖表示"列標題"為"具體內容",可以水平或垂直的調節(jié)大小,有水平和垂直的分隔符,只能同時選中一行一列,帶選擇列(DE_BOX),最左端兩列固定不滾動;
、????接下來給單元格和列標題名稱并給單元格指定內表的字段, 、????屏幕的PBO、PAI事件的代碼如下:PROCESS?BEFOREOUTPUTMODULELOOPAT?i_detail?INTOWITHCONTROL?vs_detail?CURSORENDLOOP.
 *
 PROCESS?AFTERINPUTLOOPATENDLOOPMODULE?user_command_0100. 
*?表控制IS_MATNR
 CONTROLS?vs_detail?TYPE?TABLEVIEW?USINGSCREEN0100?. 
"?利用同名傳遞原理,來接受細節(jié)屏幕上的元素"ok_code"的值
 DATA:?ok_code?TYPE?sy-ucomm?. 
MODULE?status_0100?OUTPUTSET?PF-STATUS?'0100'DESCRIBETABLE?i_detail?LINES?vs_detail-current_line?.
 ENDMODULE.?????????????????"?status_0100??OUTPUT 
在"0100"的工具欄里,只設置即可滿足需求;
MODULE?user_command_0100?INPUTCASEWHEN'BACK'SETSCREEN0?.????"?返回主屏幕
 ENDCASE.
 ENDMODULE.?????????????????"?user_command_0100??INPUT 
完成調用細節(jié)屏幕;
注意:在顯示細節(jié)屏幕的字段的類型上,當內表中有數據為貨幣類型的時候,要在"格式"里指明該字段是貨幣類型的數據,如下圖:
3.5.????????調用其他事務
FORM?f_call_tran?USING?p_rs_selfield?TYPESETPARAMETERID'LIB'FIELDCALLTRANSACTION'SE37'?."AND?SKIP?FIRST?SCREEN?.
 ENDFORM.????????????????????"?f_call_tran 
"LIB"是指參數ID,查找方法:用一個事務碼進入事務界面,在輸入框內按F1,在彈出來的界面中點擊,新界面中的就是參數ID;
"SE37"是指我們要調用的事務代碼,"AND?SKIP?FIRST?SCREEN"表示跳過第一屏屏幕;
3.6.????????打開并選擇文件:
、現則內表中定義好存放文件路徑的字段(這里是FILE_PATH),當用戶點擊界面上設置好的打開文件圖標時,就會觸發(fā)子FORM(F_USER_COMMAND)里的打開文件的子FORM(F_OPEN_FOLDER); 子FORM(F_OPEN_FOLDER)的代碼如下:FORM?f_open_folder?USING?p_rs_selfield?TYPEDATA:?l_file_path?LIKECALLFUNCTION'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???????????=?5IF?sy-subrc?=?0.
 ????wa_tab-file_path?=?l_file_path?.?"?將得到的文件的路徑賦給當前行的路徑
 MODIFY?i_tab?INDEX?wa_tab-numer?FROM?wa_tab?TRANSPORTINGCLEARELSEMESSAGE?s000?WITH'沒有選擇文件'ENDIF.
 ENDFORM.????????????????????"?f_open_folder 
4.????????關于設置字段和列名的子FORM(F_FIELDS)的參數設置:
4.1.????????單列優(yōu)化寬度
當在子FORM(F_BUILD_LAYOUT)里沒有指明全局優(yōu)化列寬的時候,在需要指定優(yōu)化的字段的屬性里指定下列屬性就可以單列優(yōu)化了,
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的各種數據類型優(yōu)默認的對其方式,其中字符串是默認為左對齊,而貨幣、數量默認為右對齊;
4.4.????????作為圖標輸出
、首先在開始包含進一個包括,如下:"?包含圖標等在內的一些信息
 INCLUDE?<list> . 
"?圖標
 ????wa_banfn-icon_folder?=?icon_object_folder?. 
??v_pos?=?v_pos?+?1?.
 ??wa_fieldcat-col_pos???????=?v_pos?.
 ??wa_fieldcat-fieldname?????=?'ICON_FOLDER'???.
 ??wa_fieldcat-scrtext_l?????=?'ICON'icon??????????=?'X'?.???"?圖標
 ??wa_fieldcat-hotspot???????=?'X'APPEND?wa_fieldcat?TOCLEAR?wa_fieldcat?. 
這樣圖標就可以在ALV界面中顯示了,其中添加"熱點"的目的是為了當用戶點擊該圖標的時候,可以觸發(fā)一系列的操作,如文件的選擇等等;
注意:圖標的名稱用事務碼"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幫助:
、在子FORM(F_FIELDS)里列的屬性添加"數據元素"這一屬性,代碼如下:wa_fieldcat-rollname??????=?'PS_PSPID'?.????"?指定數據元素
就可以在ALV的顯示界面將鼠標放到該字段的位置后按F1會彈出該字段的說明;
、指定數據元素之后,可以不指明字段的描述(如SCRTEXT_L、SCRTEXT_M、SCRTEXT_S),函數會自動將字段的描述顯示,但是沒有自己指定的靈活5.2.????????F4幫助:
、在子FORM(F_FIELDS)里列的屬性添加下列屬性,代碼如下:??wa_fieldcat-ref_field?????=?'PSPID'?.
 ??wa_fieldcat-ref_table?????=?'PROJ'?. 
這樣在ALV的顯示界面,在該字段處就可以按F4來查看相關的內容了;
6.????????輸入并保存、回調修改內表(輸入時的小數位錯位的問題、指定數據類型、小說位數)
首先在顯示ALV的子FORM(F_DISPLAY)里定義"回調"的變量,如下:"?回調變量
 DATA:?i_grid_settings?TYPE??lvc_s_glay?.
 ??i_grid_settings-edt_cll_cb??=?'X'?. 
i_grid_settings???????????????????=?i_grid_settings
這時只要在顯示界面可編輯字段上修改了數據,回車后就會立即將內表的數據也修改了;
對于貨幣字段,要在其設置字段和列名的屬性中再添加一個"指定數據類型"的屬性,如下:wa_fieldcat-datatype??????=?'CURR'?.?????"?指定數據類型
這樣在修改數據并保存時,才能將數據保持原樣,否則輸入的數據會自動將小數點提前2位;
對于數量字段,也要添加一個"指定數據類型"的屬性,才能保持數據的正確性,如下:??wa_fieldcat-datatype??????=?'QUAN'?.??"?指定數據類型
 ??wa_fieldcat-inttype???????=?'C'?. 
FORMDATA:?i_spfli?LIKETABLEOF?spfli?WITHHEADERLINEDATA:?l_error?TYPEREFTO?cx_sy_open_sql_db?,
 ????????l_error2?TYPEREFTO?cx_sy_arithmetic_overflow?,
 ????????l_error_text?TYPE"?將界面上的數據轉接到和被修改的數據庫表的結構一樣的內表中
 LOOPAT?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?.
 APPENDCLEARENDLOOP"?保存到數據庫
 TRYDELETE?spfli?FROMTABLEINSERT?spfli?FROMTABLECATCH?cx_sy_open_sql_db?INTO?l_error?.
 ??????l_error_text?=?l_error->get_text(?)?.
 ??????sy-subrc?=?1ENDTRYIF?sy-subrc?NE0ROLLBACKWORKMESSAGE?e000?WITHCLEARELSEMESSAGE?s000?WITH'數據保存成功!'ENDIFCLEARREFRESH?i_spfli?.
 ENDFORM.????????????????????"?f_save_date 
7.????????????界面顏色的更改
ALV中的顏色代碼共有4位,其中C是固定的第一位(代表COLOR),第二位代表是顏色編碼(1到7),第三位是加強顏色的設置(1表示打開,0表示關閉),第四位是減弱顏色(1表示打開,0表示關閉),個人理解,在強化關閉的情況下,相反的作用是背景和字體的變化:
7.1.????????更改單元格(字體)的前景、背景顏色
、在定義內表的時候定義一個代表單元格顏色的字段,如下:cell_color?TYPE?slis_t_specialcol_alv?
、在子FORM(F_BUILD_LAYOUT)里,要指明代表單元格顏色的字段的名稱,如下:i_layout-ctab_fname???=?'CELL_COLOR'.???"?單元格顏色設置
、在子FORM(F_CELL_COLOR)里給代表單元格顏色的字段賦值,如下:FORM"?單元格顏色
 DATA:?l_cellcolor?TYPELOOPAT?i_tab?INTOIF?wa_tab-price?>?500?.
 ??????l_cellcolor-fieldname?=?'PRICE'?.?"?要修改顏色的字段名
 ??????l_cellcolor-color-col?=?6?.???????????????????????????"?顏色(1-7)
 ??????l_cellcolor-color-inv?=?1?.???????"?前景字體(int代表背景顏色)
 APPEND?l_cellcolor?TOCLEARENDIFMODIFY?i_tab?INDEX?wa_tab-numer?FROM?wa_tab?TRANSPORTINGCLEARENDLOOP.
 ENDFORM.????????????????????"?f_cell_color 
i_layout-info_fname???=?'LINE_COLOR'??.?"?行列顏色
、在子FORM(F_LINE_COLOR)里給代表行列顏色的字段賦值,如下:FORMDATA:?l_i?TYPEiLOOPAT?i_tab?INTO?wa_tab?.
 
 ????l_i?=?sy-tabix?MOD2IF?l_i?=?0?.
 ??????wa_tab-line_color?=?'C311'MODIFY?i_tab?INDEX?wa_tab-numer?FROM?wa_tab?TRANSPORTINGCLEARENDIFENDLOOP.
 ENDFORM.????????????????????"?f_line_color 
7.3.????????利用設置字段和列名子的FORM(F_FIELDS)里來設置列的顏色
wa_fieldcat-emphasize?????=?'C711'?.
注意: 顏色設置中有優(yōu)先級順序,他們是單元格-->行-->列,即若同時使用了上述3中更改顏色的方法,則列的顏色會被行的顏色覆蓋掉,而行的顏色又會背單元格的顏色覆蓋掉,最終只會顯示出單元格的顏色.
8.????????ALV自帶的最左端復選框按鈕和自定義復選框按鈕
8.1.????????ALV自帶的復選框按鈕:
在定義內表時,需要指明代表復選框的字段,這里如:BOX_NAME,然后在定義ALV全局屬性的子FORM(F_BUILD_LAYOUT)里指明代表復選框的字段,如下:
i_layout-box_fname????????= box_fname .
8.2.????????自定義復選框按鈕
??wa_fieldcat-col_pos?????=?v_pos?.?????
 ??wa_fieldcat-fieldname???=?'CHECKBOX'?.
 ??wa_fieldcat-scrtext_m???=?'復選框'checkbox????=?'X'edit????????=?'X'?.
 ??wa_fieldcat-just????????=?'C'fix_column???=?'X'APPEND?wa_fieldcat?TOCLEAR?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?TYPETYPETYPETYPETYPE?ole2_object,
 ??????v_sheet_number?TYPEi?. 
9.2.????????上傳模板
需要用事務碼"SMW0"先上傳一個EXCEL模板,步驟:
、SMW0進入界面,選擇"WebRFC應用程序的二進制數據",點擊進入現已界面; 、在上圖中點擊或者按F5新建一個模板,彈出下圖:輸入"對象名稱"(一般用程序名+。xls)和"描述"后,點擊或者按"Shift + F6"找到自己存放模板的路徑雙擊上傳即可完成模板的上傳(名稱為Z_ALV.XLS);
9.3.????????代碼
當用戶觸動子FORM(F_USER_COMMAND)里的導出程序時,就會觸動下列代碼,現將模板現在下來,
為需要自己填寫代碼如下:
*&---------------------------------------------------------------------*
 *&??????Form??f_export
 *&---------------------------------------------------------------------*
 *???????導出數據
 *----------------------------------------------------------------------*
 FORMDATA:?l_name?LIKE?wwwdatatab,
 ?????????l_mine?LIKE?w3mime?OCCURS10TYPE?string,
 ?????????l_filename?TYPETYPE?string,
 ?????????l_fullpath?TYPE'MI'text?=?sy-titleCONCATENATE'Z_ALV測試_'?sy-uname?'_'?sy-datum?'_'?sy-uzeit?INTO*模板下載
 CALLFUNCTION'WWWDATA_IMPORT'
 EXPORTING
 keyTABLES
 ??????mime??????????????=?l_mine
 EXCEPTIONS
 ??????wrong_object_type?=?1
 ??????import_error??????=?2
 OTHERS????????????=?3CALLMETHOD?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???????????????=?4IF?sy-subrc?<>?0STOPENDIFIF?l_filename?=?''MESSAGE?e000?WITH'已取消導出!'ENDIFCALLFUNCTION'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可見
 CALLMETHODOF?v_excel?'Worksheets'EXPORTING
 ????#1?=?1CALLMETHODOF?v_sheet?'Activate'SETPROPERTYOF?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??USINGCREATE?OBJECT?v_excel?'Excel.Application'CALLMETHODOF?v_excel?'Workbooks'CALLMETHODOF?v_book?'Open'EXPORTING
 ????#1CALLMETHODOF?v_book?'Sheets'EXPORTING
 ????#1?=?1.
 ENDFORM.????????????????????"?f_OPEN_EXCEL
 *&---------------------------------------------------------------------*
 *&??????Form??f_WRITE_EXCEL_SHEET1
 *&---------------------------------------------------------------------*
 *???????向excel寫入數據
 *----------------------------------------------------------------------*
 FORMTYPES:?BEGINOF?typ_name?,
 ????????????name_first(40)?TYPEc40)??TYPEcENDOFDATA:?i_name?TYPETABLEOF?typ_name?WITHHEADERLINEDATA:?l_name(40)?TYPEcSELECT?adrp~name_first
 ?????????adrp~name_last
 INTO?CORRESPONDING?FIELDSOFTABLEFROMJOIN?usr21?ON?adrp~persnumber?=?usr21~persnumber
 WHERELOOPATCONCATENATE?i_name-name_last?i_name-name_first?INTOENDLOOPDATA:?l_chars(50)?TYPEcTYPEiTYPEiVALUE4.?"行變化,從第幾行開始導入
 
 *寫入表頭
 PERFORM?f_write_cell?USING11CONCATENATE'制表日期:'?sy-datum+0(4)?'年'?sy-datum+4(2)??'月'??sy-datum+6(2)?'日'INTOCONDENSE?l_chars?NOPERFORM?f_write_cell?USING21CONCATENATE'制表人:'?l_name?INTOCONDENSE?l_name?NOPERFORM?f_write_cell?USING25"通過行列的方式把數據寫入到Excel中
 LOOPAT?i_tab?INTOPERFORM?f_write_cell?USING?l_num?1PERFORM?f_write_cell?USING?l_num?2PERFORM?f_write_cell?USING?l_num?3PERFORM?f_write_cell?USING?l_num?4PERFORM?f_write_cell?USING?l_num?5PERFORM?f_write_cell?USING?l_num?6PERFORM?f_write_cell?USING?l_num?7PERFORM?f_write_cell?USING?l_num?8PERFORM?f_write_cell?USING?l_num?9wa_tab-file_path.
 
 ????l_num?=?l_num?+?1CLEARENDLOOP.
 ENDFORM.????????????????????"?f_WRITE_EXCEL_SHEET1
 *&---------------------------------------------------------------------*
 *&??????Form??f_SAVE_EXCEL
 *&---------------------------------------------------------------------*
 *??????保存excel文檔
 *----------------------------------------------------------------------*
 *??????-->P_L_FULLPATH??text
 *----------------------------------------------------------------------*
 FORM?f_save_excel?USINGSETPROPERTYOF?v_excel?'DisplayAlerts'?=?0CALLMETHODOF?v_book?'SAVEAS'
 EXPORTING
 ????#1CALLMETHODOF?v_book?'Exit'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.
 CALLMETHODOF?v_sheet?'Cells'EXPORTING
 ????#12SETPROPERTYOF?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",后面的程序中要用到;
*&---------------------------------------------------------------------*
 *&??????Form??f_top_of_page2
 *&---------------------------------------------------------------------*
 *???????ALV表頭標題
 *----------------------------------------------------------------------*
 FORMDATA:?i_header??TYPE?slis_t_listheader,
 ????????wa_header?TYPE"?定義登錄用戶的描述
 DATA:?l_name?TYPE?string?,
 ????????name_first?LIKE?adrp-name_first?,
 ????????name_last??LIKE"?定義登錄日期
 DATA:?l_date?TYPE"?得到登錄用戶的描述
 SELECTSINGLE?adrp~name_first
 ????????????????adrp~name_last
 INTOFROMJOIN?usr21?ON?adrp~persnumber?=?usr21~persnumber
 WHEREIF?sy-subrc?=?0CONCATENATE?name_last?name_first?INTOELSEENDIFCLEARCLEAR"?拼接制表日期
 CONCATENATE?sy-datum+0(4)?'.'
 ??????????????sy-datum+4(2)?'.'
 ??????????????sy-datum+6(2)?INTO"?Image
 ??wa_header-typ??=?'H''Z_ALV測試'APPEND?wa_header?TOCLEARCONCATENATE'制表人:'?l_name?INTOCONCATENATE'制表日期:'?l_date?INTO?l_date?.
 ??wa_header-typ??=?'S'key??=?l_name?.
 ??wa_header-info?=?l_date?.
 APPEND?wa_header?TOCLEARCALLFUNCTION'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 
總結
 
                            
                        - 上一篇: ALV程序checkbox全选及取消全选
- 下一篇: ALV总结
