日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ALV全解

發布時間:2025/3/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?,????"?相當于工作區
?????????? i_fieldcat??TYPE?slis_t_fieldcat_alv?,??"?存放列名的捏表
?????????? i_layout????TYPE?slis_layout_alv?.??????"?負責整個ALV的全局屬性

第2個函數用到的全局變量:

DATA:?wa_fieldcat?TYPE?lvc_s_fcat?,?"?相當于工作區
?????????? 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'?.???????"?自動優化列寬
??i_layout_lvc-detailinit???=?'X'?.???????"?是否出現細節屏幕
??i_layout_lvc-detailtitl???=?'詳細內容'?.?"?細節屏幕標題

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"?定義緩沖區變量
DATA:?m_p?TYPEiTYPE?string?.

1.4.3.????????準備好所需數據,如登錄用戶的描述、制表日期等

"?得到登錄用戶的描述
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?.

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是靠經驗積累而 掌握的);

、????設將需要隱藏的標準按鈕的"FCODE"添加到內表IT_EXCLUDING中,代碼如下:

"?設置要隱藏的按鈕的"FCODE"
??wa_excluding-fcode?=?'&ABC'APPEND?wa_excluding?TO?it_excluding?.

、????在顯示ALV的函數的輸入參數里添加隱藏按鈕的屬性參數:

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的函數的輸入參數里指定自定義按鈕的子FORM

i_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",進入創建工具欄的界面,輸入名字后進入最終的界面在界面右側,

點擊"應用工具條"后面的展開符號,在"項目"后面的白色方框內輸入"自定義按鈕"的代碼后回車,選擇靜態文本回車,在"函數文本"后面輸入想要顯示的按鈕的名稱,在"圖標名稱"后面選擇相應的圖標(可選),回車在這一界面選擇一個"快捷鍵"(必填)后回車,這樣一個自定義按鈕就做好了,也可以修改,記住剛剛創建的按鈕的代碼,在下面的捕捉用戶的動作的自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?.???"?顯示具體細節
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.????????顯示具體細節

、????先定義一個存放具體內容的內表并整理好相關數據; 、????調用 一個指定大小的屏幕來顯示具體的內容,代碼如下:

CALLSCREEN0100STARTINGAT1212?ENDING?AT13724?.

、????雙擊該屏幕號碼"0100"創建該屏幕,在"屬性"卡輸入該屏幕的描述,在"邏輯流"卡里將系統默認注釋掉的PBO、PAI事件的模塊取消注釋并產生這兩個模塊(雙擊并確定); 、????在"屏幕制作器"界面點擊進入"屏幕制作器"的圖形界面,開始繪制我們需要的屏幕元素,這里我們需要一個"表控制"(最左邊從下數第四個元素),該表格的屬性設置為:

名稱:

起始行列和高寬

上圖表示"列標題"為"具體內容",可以水平或垂直的調節大小,有水平和垂直的分隔符,只能同時選中一行一列,帶選擇列(DE_BOX),最左端兩列固定不滾動;

、????接下來給單元格和列標題名稱并給單元格指定內表的字段, 、????屏幕的PBO、PAI事件的代碼如下:

PROCESS?BEFOREOUTPUTMODULELOOPAT?i_detail?INTOWITHCONTROL?vs_detail?CURSORENDLOOP.
*
PROCESS?AFTERINPUTLOOPATENDLOOPMODULE?user_command_0100.

、????需要在定義變量的時候聲明一下表控制和動作的接受者(OK_CODE)如下:

*?表控制IS_MATNR
CONTROLS?vs_detail?TYPE?TABLEVIEW?USINGSCREEN0100?.

"?利用同名傳遞原理,來接受細節屏幕上的元素"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

完成調用細節屏幕;

注意:在顯示細節屏幕的字段的類型上,當內表中有數據為貨幣類型的時候,要在"格式"里指明該字段是貨幣類型的數據,如下圖:

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),當用戶點擊界面上設置好的打開文件圖標時,就會觸發子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.????????單列優化寬度

當在子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.????????作為圖標輸出

、首先在開始包含進一個包括,如下:

"?包含圖標等在內的一些信息
INCLUDE?<list> .

、然后在內表中定義一個代表圖標的字段(這里如ICON_FOLDER),在整理數據的時候,需要將代表圖標的代碼賦給給字段,如下

"?圖標
????wa_banfn-icon_folder?=?icon_object_folder?.

、接著在子FORM(F_FIELDS)里給需要圖標顯示的列添加下列屬性:

??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界面中顯示了,其中添加"熱點"的目的是為了當用戶點擊該圖標的時候,可以觸發一系列的操作,如文件的選擇等等;

注意:圖標的名稱用事務碼"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'?.

在顯示ALV的函數(REUSE_ALV_GRID_DISPLAY_LVC)里添加輸入參數如,下:

i_grid_settings???????????????????=?i_grid_settings

這時只要在顯示界面可編輯字段上修改了數據,回車后就會立即將內表的數據也修改了;

對于貨幣字段,要在其設置字段和列名的屬性中再添加一個"指定數據類型"的屬性,如下:

wa_fieldcat-datatype??????=?'CURR'?.?????"?指定數據類型

這樣在修改數據并保存時,才能將數據保持原樣,否則輸入的數據會自動將小數點提前2位;

對于數量字段,也要添加一個"指定數據類型"的屬性,才能保持數據的正確性,如下:

??wa_fieldcat-datatype??????=?'QUAN'?.??"?指定數據類型
??wa_fieldcat-inttype???????=?'C'?.

將界面數據保存到數據庫表中,觸發事件見子FORM中的F_SAVE_DATA,代碼如下:

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

、在定義內表的時候定義一個代表行列顏色的字段,如下: 、在子FORM(F_BUILD_LAYOUT)里,要指明代表行列顏色的字段的名稱,如下:

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'?.

注意: 顏色設置中有優先級順序,他們是單元格-->行-->列,即若同時使用了上述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全解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。