ABAP_ALV_Function方式與OO方式(較為簡單、普通的ALV)


一、ALV簡介

1、簡介

2、ALV_GRID介紹

3、其它描述

二、開發ALV的基本流程

三、ALV相關開發細節

1、標准ALV與對象ALV的共同開發細節

2、標准ALV開發相關細節

3、對象ALV開發相關細節

四、注意事項

五、附屬信息

1、ALV快捷工具欄功能說明(如下圖)

2、類型SLIS_FIELDCAT_ALV常用參數說明

3、類型SLIS_T_SORTINFO_ALV常用參數說明

4、類型SLIS_LAYOUT_ALV常用參數說明

5、類型SLIS_T_EVENT常用參數說明

6、結構LVC_S_FCAT參數說明(清單觀察器控制的字段目錄)

7、結構LVC_S_LAYO參數說明(ALV 控制: 布局結構)

8、打印的參數控制請參考結構 [LVC_S_PRNT]

9、排序的參數控制請參考結構[LVC_S_SORT]

11、'REUSE_ALV_GRID_DISPLAY'函數常用參數

12、'REUSE_ALV_LIST_DISPLAY'函數常用參數

13、方法"set_table_for_first_display"的參數說明

14方法"REFRESH_TABLE_DISPLAY"的參數說明

六、ALV常見問題

七、示例程序

 

一、ALV簡介

1、簡介

ALV――SAP LIST VIEWER是SAP中的一種報表方式,這里姑且稱之為ABAP表單瀏覽器,用它可以標准化,簡單化R/3系統中的表單,它可以提供給用戶一個統一的表單格式及用戶接口。ALV是系統的一種網格的顯示方式,這種方式帶有匯總\排序\篩選等功能,ALV格式的數據是以單元格為單位顯示,SAP提供了一套ALV的功能模塊,可以對輸出報表的樣式作修飾,提高報表輸出的可讀性和功能性,對於動態報表程序是一個很有效率的工具。ALV家族包含3中ALV工具:簡易的,兩層ALV,分等級連續的列表和樹形結構的ALV。一般的ALV報表有一個表頭,再加上表內容,並附加一些如排序,分類匯總,合計或下載為本地文件等預設功能。ALV報表顯示方式基本上有2種,一種是Grid方式,一種是List方式,是分別調用不同的Function來實現。

1)當調用“REUSE_ALV_GRID_DISPLAY”函數時,ALV的顯示樣式如下:

 

2)當調用“REUSE_ALV_LIST_DISPLAY”函數時,ALV的顯示樣式如下:

 

 

2、ALV_GRID介紹

The ALV Grid Control (ALV = SAP List Viewer)是一個顯示列表的靈活的工具,它提供了基本功能的列表操作,也可以通過自定義來進行增強,因此可以允許你可以在大型的應用程序中使用。在SAP的開發項目中,ALV GRID也可以作為修改和創建數據的一種工具。它包括3大部分,工具欄,標題,用於顯示數據的網格控制器.如果有必要,用戶可以隱藏標題和工具欄。

 

3、其它描述

報表的自主開發設計主要邏輯都是依托於選擇屏幕上字段,也就是提供給用戶讓他們得到自己想要結果的選擇條件途徑。其中最重要的就是必選字段,因為必選字段是取數邏輯的精華所在,他可以很巧妙的限制很多非必要的情況出現,減少開發人員的開發量,還能讓用戶最直接最快捷的得到與實際業務相關的展現結果。

對於一個報表程序的開發流程,一般都會有幾個INCLUDE.(X代表任意自定義字母)

REPORT ZXXXXXX.

INCLUDE ZXXXX_INIT.

INCLUDE ZXXXX_F01.

INCLUDE ZXXXX_block.

很多都是個人習慣吧,但是有一些習慣,能夠讓其他人在讀程序或者修改程序的時候,很快捷,有規律可循。

INCLUDE ZXXXXX_BlOCK

里面無非就是以下幾個部分

INITIALIZATION.(初始化。在所有以下事件塊運行之前運行的,只運行一次的事件塊)

AT SELECTTION-SCREEN OUTPUT.(PBO事件塊,即屏幕輸出前事件塊)

AT SELECTION-SCREEN ON VALUE-REQUEST FOR 選擇屏幕字段名稱。(自定義搜索幫助事件塊)

AT SELECTION-SCREEN.(PAI事件塊,即屏幕操作后事件塊)

START-OF-SELECTION.(程序運行事件塊)

 

其它見解:SAP中的程序還是有很多類型的.尤其是類報表程序,有可執行程序(REPORT 開頭)還有MODULE POOL(PROGARM 開頭)2種形式.

ABAP開發屬於事件驅動開發,這句話也清晰的解釋了SAP程序的必然結構。對於事件驅動,SAP程序就需要是由一個個事件去觸發才能夠執行的程序,當我們使用SE38去創建1類型的可執行性程序(REPORT 開頭)這樣的程序,我們可以直接調試,我們會發現,這個程序是按照上面所寫的事件塊的順序去依次執行的。它的事件塊的順序是指定好的。所以我們能夠按F8,去運行。我們所創建的MODULE POOL就不能去執行,因為它需要用TCODE的去指定運行入口,一般都會在MODULE POOL 里面創建 SCREEN . 在一個SCREEN里就會有兩個事件塊,分別是PBO 和PAI。我們使用多個屏幕,或者使用TABLECONTROL控件,再或是使用子屏幕范圍控件嵌套各種SUBSCREEN(子屏幕),其中都是需要PAI 和 PBO 相互聯系的,一個屏幕的PAI中,必然后會有一個CALL SCREEN 或者CALL SUBSCREEN ... INCLUDIG....命令去調用另一個屏幕或者子屏幕,然后另一個屏幕先運行PBO,有屏幕上的操作,就執行被操作屏幕的PAI。個人感覺正式這種靈活的編寫方式,導致了這種類型(MODULE POOL)的程序不能直接F8,編譯器無法獲取程序從哪里開始,而TCODE就會指定從哪個屏幕開始。

INCLUDE ZXXXX_INIT(ZXXXX_TOP):進入程序的第一個INCLUDE。INCLUDE 是什么??(CR:就是產生的請求號,也可以理解為一個程序的代碼版本,所有的SAP程序都是在D系統(DEVELOPMENT SYSTEM)然后傳到Q(測試)系統由顧問進行測試,又不干擾生產系統的程序運行,最后再傳到P(生產)系統,覆蓋原來的代碼,變成修改后代碼邏輯)恩,我感覺它是一種封裝起來的思想。我研究一下,它單獨產生CR,而和它的主程序沒有任何關聯。這也是必然的,因為INCLUDE是一個全局全系統的聲明,一旦你取了一個名字,那么其他人也能夠引用使用,這就導致它的修改CR是單獨產生的。這里也可以定義程序所需的數據類型和數據對象。

INCLUDE ZXXXX_F01:習慣使用PERFROM來封裝代碼,取有意義的名字,然后把所有的FORM都放在這邊。

在START-OF-SELECTION中,我們一般都會寫以下幾個PERFORM,

PREFORM frm_get_data. (取數邏輯)

PERFORM frm_alv_layout_build. (創建ALV顯示格式)

PERFORM frm_alv_set_columns.(調用ALV函數)

 

二、開發ALV的基本流程

 

第一步:定義ALV所要用到的類型池:TYPE-POOLS: SLIS ;

第二步:定義ALV所要顯示的數據對應的內表數據類型及內表數據對象;

第三步:定義一些顯示ALV時所要使用到的變量,例如:

Data: w_repid like sy-repid, “ABAP程序,我們一般取當前程序

w_callback_ucomm type slis_formname, "字符型,功能

w_print type slis_print_alv, "類型組

w_layout type slis_layout_alv, "類型組

w_html_top_of_page type slis_formname, "字符型

w_fieldcat_alv like line of i_fieldcat_alv, “從上面的數據結構類型引用過來的

w_excluding like line of i_excluding, “同上

w_events like line of i_events, “同上

w_event_exit like line of i_event_exit, “同上

w_list_comments like line of i_list_comments.“同上

第四步:定義選擇屏幕 ;

第五步:聲明各個選擇屏幕事件塊,例如:

定義initialization部分,在這個部分往往要指定w_repid的值,w_repid = sy-repid。

定義start-of-selection部分,在這通常會調用各種子程序,以下以標准ALV顯示為例:

1)調用一個子程序(通常命名為frm_get_dataXXX(X代表任意自定義字母)),用於獲取ALV所要顯示的數據 ;例如:

FORM frm_get_data.

… … “其它處理邏輯

SELECT lifnr "供應商賬號
ktokk 
"賬號組
name1 
"名稱1
name2 
"名稱2
INTO CORRESPONDING FIELDS OF TABLE it_main
FROM zmmjyht003
WHERE (l_where)
.

… … “其它處理邏輯

ENDFORM.

2)調用一個子程序(通常命名為frm_alv_layout_build),用於設置ALV所要顯示的樣式 ;

例如:

FORM frm_alv_layout_build.
g_layout-zebra = 
'X'.
g_layout-colwidth_optimize = 
'X'"列數據最優化顯示
g_layout-box_fieldname = 
'SELFLAG'"表示ALV行項目選中的字段
ENDFORM.

3)調用一個子程序(通常命名為frm_alv_set_columns),用於完成ALV所要顯示的列的相關設置 ;

例如:

FORM frm_alv_set_columns.

REFRESH g_fieldcat_alv.
PERFORM frm_set_l_fieldcat USING 1 'LIFNR' '供應商賬號'.

ENDFORM.

FORM frm_set_l_fieldcat USING p_pos p_name p_text.

DATA: l_fieldcat TYPE slis_fieldcat_alv.
l_fieldcat-col_pos = p_pos.
l_fieldcat-fieldname = p_name.
l_fieldcat-seltext_l = p_text.

APPEND l_fieldcat TO g_fieldcat_alv.

ENDFORM.

4)調用顯示ALV的函數,例如:REUSE_ALV_GRID_DISPLAY ;

FORM frm_alv_display_data.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = g_repid
i_callback_pf_status_set = 
'FRM_STATUS_ALV'
i_callback_user_command = 
'FRM_USER_COMMAND_ALV'
is_layout = g_layout
it_fieldcat = g_fieldcat_alv[]
TABLES
t_outtab = it_main
EXCEPTIONS
program_error = 
1
OTHERS = 2
.
ENDFORM.

如果ALV所要展示的列過多時,建議先在數據字典系統中創建相應的結構,這樣可免去對輸出列表頭信息的繁瑣編輯處理,代碼行也會縮短。只要將上面函數中的it_fieldcat參數替換成i_structure_name,如:I_STRUCTURE_NAME = 'TY_OUT_FILE',注意:此處的TY_OUT_FILE結構必須是數據字典中已經存在的對象

 

以上步驟,詳見“示例程序”部分:示例一(標准ALV)。

 

 

三、ALV相關開發細節

1、標准ALV與對象ALV的共同開發細節

 

 

2、標准ALV開發相關細節

2.1、ALV中的各種結構類型注解:

1)TYPE-POOLS: slis:用於指定ALV類型組;

2)slis_listheader:用於定義top of page的抬頭結構;

3)slis_t_listheader:用於定義top of page的抬頭表

4)slis_t_sortinfo_alv:用於指定ALV排序分類合計等信息的數據對象;

3slis_layout_alv :用於定義布局類型數據對象;

4slis_t_fieldcat_alv WITH HEADER LINE:用於定義ALV列字段相關類型數據

對象;(slis_t_fieldcat_alv是表字段的整體,slis_fieldcat_alv是某一個字段的內容,將該字段的內容寫到slis_fieldcat_alv后,通過append添加到slis_t_fieldcat_alv中,后者是整個列表的標題,在顯示的時候用到。)

5)slis_t_event :是event的整體可看作event的集合,感覺可以用來寫表頭。

slis_alv_event是某個event, 需要將slis_alv_event append到slis_t_event.它可以包含圖片和listheader等,也就是說listheader等是靠event來顯示的。

6)slis_t_listheader :是listheader的集合,slis_listheader是某個listheader。將slis_listheader賦值后append到slis_t_listheader中。它是內表的表頭。

7)slis_listheader : 包含:typ :H = header,S = Selection,A = action. key :

是和s對應的,是那個的標題吧. info:可以是變量和賦值的。跟在key的標題后面,

是個表達值。

 

2.2、ALV中所用到的函數:

1)顯示ALV函數:

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING

i_callback_program = g_repid 
i_callback_pf_status_set = 
'FRM_STATUS_ALV'
i_callback_user_command = 
'FRM_USER_COMMAND_ALV'
is_layout = g_layout
it_fieldcat = g_fieldcat_alv[]
TABLES
t_outtab = it_main

上面“REUSE_ALV_GRID_DISPLAY “函數的參數說明:

1> g_repid:用於保存當前程序名,例如:

g_repid TYPE sy-repid VALUE sy-repid "保存當前程序名

2> FRM_STATUS_ALV:該子程序用於指定程序狀態,例如:

FORM frm_status_alv USING p_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD'.

ENDFORM.

3> FRM_USER_COMMAND_ALV:該子程序指定相關函數功能碼的響應邏輯,例如:

FORM frm_user_command_alv USING p_ucomm

TYPE sy-ucomm p_selfield TYPE slis_selfield.
ok_code = p_ucomm.

CASE ok_code.

WHEN 'CREATE'
… …

WHEN 'DELETE'.

… …

ENDCASE.

p_selfield-refresh = 'X'"ALV被修改時會自動刷新,沒有修改不進行刷新

ENDFORM.

4> g_layout:用於設置ALV布局樣式,例如:

FORM frm_alv_layout_build.
g_layout-zebra = 
'X'.
g_layout-colwidth_optimize = 
'X'"列數據最優化顯示
g_layout-box_fieldname = 
'SELFLAG'"表示ALV行項目選中的字段
ENDFORM.

5> g_fieldcat_alv[]:用於指定ALV字段相關屬性信息,例如:

FORM frm_alv_set_columns.
REFRESH g_fieldcat_alv.
PERFORM frm_set_l_fieldcat USING 1 'LIFNR' '供應商賬號'.

ENDFORM.

FORM frm_set_l_fieldcat USING p_pos p_name p_text.
DATA: l_fieldcat TYPE slis_fieldcat_alv.
l_fieldcat-col_pos = p_pos.
l_fieldcat-fieldname = p_name.
l_fieldcat-seltext_l = p_text.
* l_fieldcat-no_zero = 'X'.
APPEND l_fieldcat TO g_fieldcat_alv.
ENDFORM.

6> it_main:此內表中保存的是ALV所要展示的數據,例如:

it_main TYPE TABLE OF typ_item WITH HEADER LINE"ALV對應的內表

SELECT lifnr "供應商賬號
ktokk 
"賬號組
name1 
"名稱1
name2 
"名稱2
INTO CORRESPONDING FIELDS OF TABLE it_main
FROM zmmjyht003
WHERE (l_where)
.

此函數的其它參數信息,詳見附屬信息中的 'REUSE_ALV_GRID_DISPLAY'函數常用參數

2) reuse_alv_events_get : 將各個事件的名字寫到slis_t_eventname中。這樣,可以在后面,根據名字的不同,對不同的event付不同的form,來實現不同功能。

 

2.3、ALV其它相關信息:

1)ABAP alv中對數字字段進行去掉小數點后面的零的操作如下:

在slis_t_fieldcat_alv結構中,給demcimals_out字段設為零即可,代碼如下:

IF P_FIELD = 'LINE_SUM'.
LS_FIELDCAT-DECIMALS_OUT = '0'.
ENDIF.

2)通過HTML格式來顯示表頭,示例代碼如下:

*-------ALV Commit Setting of ALV_top_of_page--------
FORM alv_top_of_page USING cl_dd TYPE REF TO cl_dd_document.
DATA: m_p TYPE i.

DATA: m_buff TYPE string.

*表頭其實完全可以是一個html文件,自己使用html語言進行格式控制

m_buff = '<html>'.

CALL METHOD cl_dd->html_insert

EXPORTING

contents = m_buff

CHANGING

position = m_p.

m_buff = '<center><H2>配件報廢品種匯總表</H2></Center>'.

CALL METHOD CL_DD->HTML_INSERT

EXPORTING

CONTENTS = m_buff

CHANGING

POSITION = m_p.

CONCATENATE '報表日期:' S_DATE-LOW ' TO ' S_DATE-HIGH '<BR>' into m_buff.

CALL METHOD CL_DD->HTML_INSERT

EXPORTING

CONTENTS = m_buff

CHANGING

POSITION = m_p.

m_buff = '</html>'.

CALL METHOD cl_dd->html_insert

EXPORTING

contents = m_buff

CHANGING

position = m_p.
ENDFORM. "ALV_top_of_page

 

3)ALV中設置選擇字段

g_layout-box_fieldname = 'SELFLAG'.

上面中的“SELFLAG”是ALV所要顯示的內表對應的類型中的一個字段定義,形式如下:

selflag TYPE c"用於判斷行項目是否被選中

box_fieldname賦值為”SELFLAG”后,就可以通過“SELFLAG”來判斷ALV顯示中的行項目是否被選中。

 

 

3、對象ALV開發相關細節

3.1、ALV GRID CONTROL (ALV網格控制器)

ALV GRID CONTROL使用了控制器技術以實現藝術性的屏幕顯示,象所有的控制器一樣,ALV GRID CONTROL通過系統中的一個全局的類提供方法,以響應它的動作。

使用了ABAP的對象以后,列表是通過ALV的一個實例(INSTANCE)來顯示的,程序員可以使用ABAP對象的事件管理.

3.2、ALV GRID CONTROL 實例

ALV GRID實例的定義,參照CL_GUI_ALV_GRID類

data ALV_GRID1 type ref to cl_gui_alv_grid.

3.3、簡單對象ALV的開發流程

3.3.1、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

*----刷新ALV

CALL METHOD gr_alvgrid->refresh_table_display

 

第三步,獲取要顯示數據的字段目錄.有兩種方式.

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 .

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 .

 

第四步,設置布局

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_mb_sum .

APPEND ls_exclude TO pt_exclude.

ENDFORM .

 

以上步驟,詳見“示例程序”部分:示例二(對象ALV)。

 

 

3.3.2、對象ALV的一些功能.

功能一:在第一次顯示以后,修改字段目錄和布局.

在運行的時候,很有可能需要在顯示之后,需要設置一個新的布局或者字段目錄.有下面這些方法去實現.

字段目錄 : 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 .

 

功能二:設置排序條件

有時候我們需要使用到數據的排序.這個可以通過填充參考結構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的標准按鈕中已經有過濾的功能,我們也可以在初始顯示的時候就設置過濾條件.我們需要把過濾條件填充到參考表類型"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"來獲取過濾條件和設置過濾條件.

 

功能四:選擇方式

有時候,我們需要選擇一些單元格,行或者列,在布局中,有個參數"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網格上繪上一些顏色.可以給特定的行,某個特定的列,某個特定的單元格繪制顏色.

如果某列被設置為關鍵列,這列的顏色將被自動繪制,而不需要我們額外的指定.

先介紹ALV里色碼.就是顏色編碼,4位CHAR型.

Cxyz---

Color || |

| 1/0: 相反 開/關

1/0: 強化 開/關

其中C是固定的第一位,第二位代表是顏色編碼(1到7),第三位是加強的設置,第四位是相反,個人理解,在強化關閉的情況下,相反的作用是背景和字體的變化.

 

顏色編碼:

顏色 主要使用在

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 .

注意:

顏色設置中有優先級順序,他們是單元格--->行--->列.

 

功能六:插入超鏈接

插入超鏈接是通過一個含有超級鏈接和句柄的表來實現的.這個表類型為"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.

 

功能七:把字段設置為下拉

有時候我們可以把一些字段設置為下拉,比如一些類型,一些字段的值是比較固定的一些值,當然,我們也可以通過搜索幫助來做,這些只是看各自的愛好和需要了.

設置為下拉,和上一篇設置超級鏈接是類似的,也是使用了一個內表存放了句柄和對應的值,這個表類型為"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控制器有很多響應用戶交互的事件.這些事件經常被用來增強一些用戶響應的功能.為實現這樣的功能,我們必須在程序中創建一個類的實例來作為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 .

 

3.4、ABAP-AVL-OO方法中的ALV的如何自己添加按鈕及其響應

SAP在做報表開發中,不同公司對報表的風格往往各異,為此經常在使用OO方法做ALV報表中需要去掉自帶的工具欄而自行添加一些工具按鈕,下面將簡單介紹一下添加按鈕及如何響應的實現方法:

步驟一:創建一個事件處理類

CLASS lcl_event_receiver DEFINITION.
* public attributes and method
PUBLIC SECTION.
METHODS:
handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING
e_object,
handle_user_command 
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING
e_ucomm,
ENDCLASS"lcl_event_receiver DEFINITION

注意這個事件處理類中添加了兩個方法,第一個方法負責往工具欄上添加按鈕,第二個方法用來響應工具欄上按鈕的動作

步驟二:類的實現

CLASS lcl_event_receiver IMPLEMENTATION.


* method toolbar handler
METHOD handle_toolbar.
PERFORM set_toolbar CHANGING e_object.
ENDMETHOD"handle_toolbar

 

METHOD handle_user_command.
* Handle own functions defined in the toolbar
CASE e_ucomm.
WHEN 'ADD'.
PERFORM xyz. “這里你想干嘛就可以干嘛
ENDCASE.

ENDMETHOD"handle_user_command

 

ENDCLASS"lcl_event_receiver IMPLEMENTATION

步驟三:在FORM-----set_toolbar 中添加button

FORM set_toolbar

CHANGING prf_object TYPE REF TO cl_alv_event_toolbar_set.

CLEAR prf_object->mt_toolbar.

CLEAR gs_toolbar.
MOVE 'ADD' TO gs_toolbar-function.
MOVE TO gs_toolbar-quickinfo.
MOVE TO gs_toolbar-text.
MOVE ' ' TO gs_toolbar-disabled.
INSERT gs_toolbar INTO prf_object->mt_toolbar INDEX 1.

ENDFORM" set_toolbar1

 

步驟四:創建事件處理對象--這一步一般在 grf_grid->set_table_for_first_display 之后

SET HANDLER grf_event_receiver->handle_user_command FOR grf_grid.
SET HANDLER grf_event_receiver->handle_toolbar FOR grf_grid.
CALL METHOD grf_grid->set_toolbar_interactive.

 

注意:STB_BUTTON結構包含的字段

FUNCTION UI_FUNC CHAR 70 0 Function Code
ICON ICONNAME CHAR 30 0 Name of an Icon
QUICKINFO ICONQUICK CHAR 30 0 Quickinfo for an icon
BUTN_TYPE TB_BTYPE INT4 10 0 Toolbar button type
DISABLED CHAR 1 0 Disabled
TEXT TEXT40 CHAR 40 0 Text, 40 Characters Long
CHECKED CHAR 1 0 Printed

TB_BTYPE 的可選擇值 ,主要用來決定按鈕的類型

0 Button (normal)
1 Menu and default button
2 Menu
3 Separator
4 Radio button
5 Checkbox
6 Menu entry

 

詳見“示例程序”部分:示例二(對象ALV添加自己的按鈕)。

 

3.5ABAP-AVL-如何去掉OO方法中的ALV的標准按鈕

SAP在做報表開發中,不同公司對報表的風格往往各異,為此經常在使用OO方法做ALV報表中需要去掉自帶的工具欄而自行添加一些工具按鈕,下面將簡單介紹一些其實現過程與原理:

步驟一:

DATA : gt_exclude TYPE ui_functions.
步驟二:寫一個FORM將要去掉的按鈕添加到上面定義的表(gt_exclude)

perform exclude_tb_functions tables gt_exclude

 

FORM exclude_tb_functions TABLES 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 .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_sort_asc.
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_sort_dsc .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_find .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_filter .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_print .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_print_prev .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_mb_export .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_graph .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_mb_view .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_detail .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_help .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_info .
APPEND ls_exclude TO pt_exclude.

ls_exclude = cl_gui_alv_grid=>MC_MB_VARIANT.
APPEND ls_exclude TO pt_exclude. 
ENDFORM" exclude_tb_functions

步驟三:

CALL METHOD grf_grid1->set_table_for_first_display
EXPORTING
is_variant = gs_variant
i_save = 
' '
is_layout = gs_layout
it_toolbar_excluding = gt_exclude
CHANGING
it_outtab = gt_result1[]
it_fieldcatalog = gt_fcat_lvc.

 

3.6、對象ALV單元格編輯狀態設計

ALV函數只能實現對整列的編輯狀態控制,單元格的編輯狀態控制只能通過ALV OO實現。

1.單元格狀態控制和單元格顏色控制類似,在LIST DATA TABLE中定義一個字段cellstyle. TYPE lvc_t_styl

 

list data table中的cellstyle字段將被用來存儲單元格樣式信息,單元格編輯狀態就是通過表中的內容來控制

2.根據相關條件調整list data table中的cellstyle字段內容

 

3.設置樣式輸出控制結構的stylename字段內容為單元格狀態控制字段名

 

 

3.7、cell 更新事件

ALV單元格設置為可輸入后,通常我們需要對單元格輸入的值做一個檢查,一般來說用循環內表的方法可以實現上述操作,不過如果ALV中有大量數據,而我們只更新了少量的單元格數據,這樣檢查顯得非常的麻煩,而且效率低下
在ALV OO中我們可以通過DATA_CHANGE事件得到被修改的單元格的信息,利用這些信息我們可以很方便的對所填數據做檢查,別且可以給用戶相應的錯誤提示,以及自動修改單元格數據
1.我們需要在處理事件的類中添加一個處理DATA_CHANGE事件的方法
Eg:
CLASS lcl_alv_receiver DEFINITION DEFERRED.
CLASS lcl_alv_receiver DEFINITION.

PUBLIC SECTION.
……..
METHODS:
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
ENDCLASS. "lcl_event_receiver DEFINITION

2.初始化ALV后為lcl_alv_receiver類注冊一個DATA_CHANGED事件 Eg:
CALL METHOD g_grid->set_table_for_first_display
EXPORTING
i_save = x_save
is_variant = ls_layout
is_layout = is_layout
CHANGING
it_fieldcatalog = it_fieldcat
it_outtab = lt_zqsdmx[].
SET HANDLER g_alv_application->handle_data_changed FOR g_grid.
CALL METHOD g_grid->register_edit_event “注冊更新事件
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter . 
其中i_event_id = cl_gui_alv_grid=>mc_evt_enter 表示在單元格修改后回車或者執行其他操作時觸發事件,此類型可用於多個單元格修改后一起檢查修改的值
i_event_id = cl_gui_alv_grid=>mc_evt_modified 表示單光標焦點移開被修改單元格后既觸發事件,此類型可用於每個每個單元個的實時更新檢查

3.實現lcl_alv_receiver類的handle_data_changed方法,其中一些常用的一些屬性方法我會在后附表列出

Eg:

CLASS lcl_alv_receiver IMPLEMENTATION.
METHOD handle_toolbar.
METHOD handle_data_changed.
PERFORM. handle_data_changed USING er_data_changed.
ENDMETHOD. "handle_data_changed
ENDCLASS. "lcl_ALV_event_receiver

*&---------------------------------------------------------------------*
*& Form handle_data_changed
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ER_DATA_CHANGED text
*----------------------------------------------------------------------*

FORM. handle_data_changed USING p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol.
*如果更新的reason字段長度小於10為則提示用戶填入字符數不能低於10
DATA:mod_data TYPE lvc_t_modi,
wa_mod_data TYPE lvc_s_modi.
mod_data = p_er_data_changed->mt_mod_cells.
LOOP AT mod_data INTO wa_mod_data Where fieldname = 'ZRESON'.
IF STRLEN( wa_mod_data-value ) < 10.
CALL METHOD p_er_data_changed->add_protocol_entry
EXPORTING
i_msgid = '00'
i_msgty = 'E'
i_msgno = '001'
i_msgv1 = '長度必須大於10 '
i_fieldname = wa_mod_data-fieldname.

*如果長度小於10,則將字段內容更新為長都無法確定
CALL METHOD p_er_data_changed->modify_cell
EXPORTING
i_row_id = wa_mod_data-row_id
i_fieldname = wa_mod_data-fieldname.
ENDIF.
ENDLOOP.

ENDFORM.

 

四、注意事項

1、在ALV中,需要注意所有添加的需要顯示的列,都必須在相應的內表中有對應的字段,否則,只要使用合計或者分類匯總都會導致程序的崩潰。

2、在SAP ABAP程序中,字符串的大小寫很重要,在單引號包圍的字符串中,一般來說都應該用大寫,特別是在調用一些系統的方法時傳入字符串參數時,例如在ALV中,
Call Function ‘REUSE_ALV_GRID_DISPLAY’時,
傳入的下面的兩個參數:
i_callback_pf_status_set = ‘SET_PF_STATUS’
i_callback_user_command = ‘USER_COMMAND’ 
就必須使用大寫字符串,否則就會出現Perform_not_found的系統錯誤。

3、另外,傳入到ALV中的列對應的字段名稱也必須使用大寫字母,否則數據不會顯示出來。

4、使用宏定義可以減少代碼量,並且盡可能實現代碼的復用。

5、注意在FORM里定義的變量在離開FORM后,就會被系統釋放掉,回收內存空間。

6、注意LUW概念,即:數據庫的更新回滾,如果是進行多個屏幕的操作,會導致數據庫語句隱式的COMMIT, 從而導致數據的不一致,也無法做到數據的全部回滾,還有使用PERORM ... ON COMMIT等方式可以是暫時制止隱式的數據庫提交,與標准程序使用的數據庫表互鎖(審批程序)(SAP的鎖概念,是很有意思的。) (再就是解釋BDC其中DB COMMIT選項的妙用,會跳過類似COMMIT的控件繼續錄屏,而不會終止當前錄屏操作。

7、給ALV的各個系統數據類型的數據對象的賦值時,單引號內的數據必須大寫。

8、標准ALV顯示工具欄的屬性是:slis_layout_alv-def_status。

 

 

 

五、附屬信息

1、ALV快捷工具欄功能說明(如下圖)
   細節按鈕,你首先必須選中列表中的一行,然后點擊它的話,就會彈出一個窗口,顯示選中行的細節內容。(另外:你雙擊你要選擇的行,也可以顯示細節)

   按升序排列,首先選中一列,然后再點擊它,就可以看到該列是按照升序重新排列。

   按降序排列,首先選中一列,然后再點擊它,就可以看到該列是按照降序重新排列。

   設置過濾器,通過設置它可以達到篩選的目的,以列名稱作為篩選的篩選標准,填入過濾器相應的標准值,然后就可以篩選出滿足自己條件的記錄。

   打印預覽,點擊它之后,就可以預覽一下將要打印內容的布局情況。

   Microsoft Excel,調用MS的Excel到當前ALV的列表顯示區域。(前提:必須安裝了MS的Excel)

   字處理,字處理的相關設置。

   本地文件,將當前表單存儲到本地機器上,有幾種供選擇的存儲格式。

   郵件收件人,給系統內用戶發郵件

   圖形,點擊它可以根據表單情況繪制相關圖表。

   更改布局,點擊它可以對表單中的列項目排列次序的互換,刪減等。

   選擇布局,從以及保存的布局中選擇自己滿意的布局。

   保存布局,對於自己滿意的布局,可以通過點擊它來將布局保存起來。

 

2、類型SLIS_FIELDCAT_ALV常用參數說明

(用來定義表單中的各個列的相關信息)

(賦值’’中內容必須為大寫)
fieldname 對應內表中哪個字段,必須

Intlen 表示可以篩選的長度,如果不輸得話有可能在篩選的時候顯示不夠 長

emphasize(4) 帶有顏色的高亮列

col_pos = n. 輸出列在ALV中的位置索引值

tabname = ‘FIELDNAME’. 對應的內表字段名(標簽名稱)

seltext_s/m/l = ‘列名’. 輸出列文本(_s:短文本 _l:長文本)必須

emphasize = ‘CX10’. 帶有顏色的高亮列(其中X=(1-7)顏色同format)

hotspot = ‘X’. 作為熱點顯示可觸發鼠標觸發事件

currency = ‘CURRKEY’. 表 TCURX 中的貨幣名稱

quantity(3) 計量單位

qfieldname 參考計量單位的字段名稱

round = n. 四舍五入至小數位數下n 位

exponent = n. 浮點數的冪指數為n

key = ‘X’. 關鍵字段

icon = ‘X’. 作為圖標輸出

symbol = ‘X’. 輸出作為符號

checkbox = ‘X’. 作為復選框輸出

just = SPACE, \'R\', \'L\', \'C\'. 對齊方式

lzero = ‘X’. 輸出前導零

no_sign = ‘X’. 輸出抑制符號

no_zero = ‘X’. 為輸出隱藏零

edit_mask = SPACE, mask.. 輸出為mask的模式(為輸出編輯掩碼)

 

fix_column = ‘X’. 固定列

do_sum = ‘X’. 總計列值總和

no_out = ‘X’. 列不輸出

tech = ‘X’. 該字段為技術字段

outputlen = n 列的字符寬度為n

decimals_out = n 能控制小數點的位數為n

datatype = C,I,N… 定義數據類型

 

3、類型SLIS_T_SORTINFO_ALV常用參數說明

(排序)

Fieldname 字段名

Up 升序排列

Down 降序排列

Subtot

 

4、類型SLIS_LAYOUT_ALV常用參數說明

(用於定義ALV表單的相關格式、屬性)

info_fieldname = \'LINE_COLOR\'. 設置特殊行顏色

(將LINE_COLOR增加到內表字段,寫\'CX10\'到特殊行的LINE_COLOR, X為顏色值)

colwidth_optimize = ‘X’. 優化列寬設置

no_colhead = \'X\'. 不顯示列名

no_vline = \'X\'. 不顯示列間豎線

zebra

f2code = \'&ETA\'. 設置觸發彈出詳細信息窗口的功能碼,這里是雙擊

no_vline 這個用來設置列間隔線

detail_popup 是否彈出詳細信息窗口

detail_titlebar 設置彈出窗口的標題欄

 

 

5、類型SLIS_T_EVENT常用參數說明

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.

ALV標准按鈕對應的函數功能碼如下:

 

功能代碼: 函數文本: 圖標名稱:

&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

 

6、結構LVC_S_FCAT參數說明(清單觀察器控制的字段目錄)

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  

 

7、結構LVC_S_LAYO參數說明(ALV 控制: 布局結構)

布局是用來控制整個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個字符

 

8、打印的參數控制請參考結構 [LVC_S_PRNT]

9、排序的參數控制請參考結構[LVC_S_SORT]

10、過濾的參數控制請參考結構[LVC_S_FILT]

 

11、'REUSE_ALV_GRID_DISPLAY'函數常用參數

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.

 

 

12、'REUSE_ALV_LIST_DISPLAY'函數常用參數

 

 

13、方法"set_table_for_first_display"的參數說明

_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 過濾的標准

 

14方法"REFRESH_TABLE_DISPLAY"的參數說明

IS_STABLE 刷新的穩定性,有2個參數,一個是行,一個是列.如果設置了相應的值,

那么對應的行,或者列,在刷新的時候,將會保持穩定,就是滾動條保持不動.

I_SOFT_REFRESH 這個參數只是在異常情況下被使用,如果設置了這個參數,任何創建的合計,

任何排序次序,任何為了顯示數據而設置的過濾都將保持不變.這個是非常

有意義的.例如:當然你沒有修改數據內表里的數據而想刷新ALV,僅僅只是

改變一下布局和字段目錄.

 

 

六、ALV常見問題

1、當為報表程序創建完TCODE后,如果新創建的報表程序沒有激活的話,即使在命令域中輸入了對應的TCODE,也無法導入到報表程序對應的運行界面,而應該先激活報表程序,這樣TCODE才能起作用

 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM