Function ALV
ALV:SAPListViewer
ALV顯示格式分為GRID及LIST兩種模式,一個以網格顯示,另一個以表格顯示,兩者都有工具欄稍有不同
Layout結構
Layout主要用於設置ALV整體輸出格式,為ALV可選項參數。屬於類型池 TYPE-POOLS:SLIS
TYPE-POOLS:slis.
DATA: layout TYPE slis_layout_alv.
Layout結構所定義的所有字段如下(各字段詳細使用說明,可參考REUSE_ALV_GRID_DISPLAY的 is_layout參數文檔說明):
no_colhead(1) type c, " no headings不顯示列標題行
no_hotspot(1) type c, " headings not as hotspot
zebra(1) type c, " striped pattern斑馬線顯示,顏色隔行交替顯示
no_vline(1) type c, " columns separated by space不顯示垂直網格線
no_hline(1) type c, "rows separated by space B20K8A0N5D不顯示水平網格線
cell_merge(1) type c, " not suppress field replication ALV單元格中的內容能夠復制到剪貼板
edit(1) type c, " for grid onlyALV是否可編輯,注意只對Grid模式有效,對List模式無效
edit_mode(1) type c, " for grid only
numc_sum(1) type c, " totals for NUMC-Fields possib.
no_input(1) type c, " only display fields
f2code like sy-ucomm, "gs_layout-f2code = '&ETA'.設置觸發彈出詳細信息窗口的功能碼,這里是雙擊(&ETA)就可以彈出詳細窗口,而不需要通過右鍵菜單
reprep(1) type c, " report report interface active
no_keyfix(1) type c, " do not fix keycolumns
expand_all(1) type c, " Expand all positions
no_author(1) type c, " No standard authority check
* PF-status
def_status(1) type c, " default status space or 'A'
item_text(20) type c, " Text for item button
countfname type lvc_fname,
* Display options
colwidth_optimize(1) type c, ALV網格(單元格)寬度設置為自動最優化,按輸出內容寬度自動調整
no_min_linesize(1) type c, " line size = width of the list
min_linesize like sy-linsz, " if initial min_linesize = 80
max_linesize like sy-linsz, " Default 250
window_titlebar like sy-title,
no_uline_hs(1) type c,
* Exceptions
lights_fieldname type slis_fieldname," fieldname for exception列顯示為紅綠燈
lights_tabname type slis_tabname, " fieldname for exception
lights_rollname like dfies-rollname," rollname f. exceptiondocu
lights_condense(1) type c, " fieldname for exception
* Sums
no_sumchoice(1) type c, " no choice for summing up
no_totalline(1) type c, " no total line
no_subchoice(1) type c, " no choice for subtotals
no_subtotals(1) type c, " no subtotals possible
no_unit_splitting type c, " no sep. tot.lines by inh.units
totals_before_items type c, " diplay totals before the items統計行會在數據行前面顯示
totals_only(1) type c, " show only totals只顯示合計
totals_text(60) type c, " text for 1st col. in total line合計第一列文本
subtotals_text(60) type c, " text for 1st col. in subtotals
* Interaction交互
box_fieldname type slis_fieldname, " fieldname for checkbox指定數據內表中哪列以選擇按鈕形式顯示(首列前可按下或彈上來的按鈕),ALV最左上角會出現全選按鈕
box_tabname type slis_tabname," tabname for checkbox
box_rollname like dd03p-rollname," rollname for checkbox
expand_fieldname type slis_fieldname, " fieldname flag 'expand'
hotspot_fieldname type slis_fieldname, " fieldname flag hotspot
confirmation_prompt, " confirm. prompt when leaving當退出ALV報表展示界面時,是否需要提示用戶
key_hotspot(1) type c, " keys as hotspot " K_KEYHOT設置關鍵字段是否是熱點,可單擊
flexible_key(1) type c, " key columns movable,...
group_buttons(1) type c, " buttons for COL1 - COL5
get_selinfos(1) type c, " read selection screen
group_change_edit(1) type c, " Settings by user for new group
no_scrolling(1) type c, " no scrolling
* Detailed screen詳細屏幕
detail_popup(1) type c, " show detail in popup 右鍵中有 Detail 菜單,是否彈出詳細信息窗口
detail_initial_lines(1) type c, " show also initial lines為空行時單元格內容也會顯示在右鍵彈出的詳細框中
detail_titlebar like sy-title," Titlebar for detail設置詳細彈出窗口的標題欄
* Display variants
header_text(20) type c, " Text for header button
default_item(1) type c, " Items as default
* colour顏色
info_fieldname type slis_fieldname, " infofield for listoutput指定數據輸出內表中哪列存儲的是顏色,用來設置ALV每行數據的顏色。注:使用屬性需要同時在數據內表中定義一個與該參數所定義字段名相同的欄位,如:LAYOUT-INFO_FIELDNAME=’COLOR’,假設數據內表名為LT_OUT,則需要在該內表增加一個欄們“COLOR”,顏色范圍 C000~C999
coltab_fieldname type slis_fieldname, " colors
* others
list_append(1) type c, " no call screen
xifunckey type aqs_xikey, " eXtended interaction(SAPQuery)
xidirect type flag, " eXtended INTeraction(SAPQuery)
dtc_layout type dtc_s_layo, "Layout for configure the Tabstip
allow_switch_to_list(1) type c, "ACC: Switch from FullGrid to List
Fieldcat結構
Fieldcat主要用於ALV數據顯示結構的定義,包括具體的欄位名稱、類型、各字段的輸出格式(與Layout不一樣的是輸出格式只針對某個字段),為ALV必選參數
TYPE-POOLS:slis.
DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
Fieldcat結構所定義的所有字段如下(各字段詳細使用說明,可參考REUSE_ALV_GRID_DISPLAY的 it_fieldcat參數文檔說明):
row_pos like sy-curow, " output in row
col_pos like sy-cucol, " position of the column列的輸出位置字段在表中第幾列
fieldname type slis_fieldname,"針對輸出內表哪列進行設置,只有設置了的列才會顯示,如果沒有設置,則不會顯示在ALV中。如果此字段是CURR(currency field) ,QUAN(Quantity field) 需要指定相應的CUKY, UNIT字段.需設置Cfieldname Ctabname 和Qfieldname Qtabname
tabname type slis_tabname,
currency(5) type c, TCURX表中的貨幣名稱
cfieldname type slis_fieldname, " field with currency unit金額字段所參照的貨幣單位字段名稱(貨幣單位字段為數據內表中的某列?)
ctabname type slis_tabname, " and table
ifieldname type slis_fieldname, " initial column
quantity(3) type c,計量單位
qfieldname type slis_fieldname, " field with quantity unit
qtabname type slis_tabname, " and table
roundtypei, " round in write statement四舍五入至小數點后多少位
exponent(3) type c, " exponent for floats浮點數的冪指數為多少位
key(1) type c, " column with key-color指定字段是否是關鍵字段,如果是則單元格顯示的顏色會不同,並會靠前顯示
icon(1) type c, " as icon字段將以圖標形式顯示,INCLUDE <list> ,圖標字段內容來自list Inc.文件
symbol(1) type c, " as symbol字段內容作為符號輸出,與上面的ICON屬性相似
checkbox(1) type c, " as checkbox字段將以復選框形式顯示
just(1) type c, " (R)ight (L)eft (C)ent.單元格中內容顯示時對齊方式。不設置時按鈕數據類型默認對齊方式來對齊
lzero(1) type c, " leading zero 為X時輸出前導零
no_sign(1) type c, " write no-sign 不顯示數字符號
no_zero(1) type c, " write no-zero 只輸出有意義的值,空值不輸出。為X時全為零(如:00000)時不輸出,所以不輸出零時應該最好同時設置lzero = sapce與no_zero = X,相反如果要輸出,則應同時設置lzero = X 與no_zero = space
no_convext(1) type c,
edit_mask type slis_edit_mask, "對字段內容進行掩碼格式化輸出,具體請參照《ABAP BC Programming.docx》中的WRITE … TO章節,如:gt_fieldcat-edit_mask = '____/__/__'可對日期字段都日期格式化顯示
emphasize(4) type c, " emphasize設置列的顏色
fix_column(1) type c, " Spalte fixieren列固定不滾動,與Key屬性相似,但顏色不會發生變化
do_sum(1) type c, " sum up該列是否進行小計,需與gt_sort-subtot一起使用(即需要參考排序),否則只對整列進行一個合計
no_out(1) type c, " (O)blig.(X)no out但注意用戶可以change layout(布局設置)來顯示出此列
tech(1) type c, " technical field該字段為技術字段:設置為技術列的列將不會再顯示出來,即使是在布局設置里也是看不到的
outputlen like dd03p-outputlen,列的字符輸出寬度
offset type dd03p-outputlen, " offset
調整輸出列抬頭的文本:文本可以隨着用戶調整列的寬度而變化,其文本即是在對應data element中定義的,如果需要定制,則可以指定以下字段
seltext_l like dd03p-scrtext_l, " long key word標題字段顯示的名稱(長)
seltext_m like dd03p-scrtext_m, " middle key word標題字段顯示的名稱(中)
seltext_s like dd03p-scrtext_s, " short key word標題字段顯示的名稱(短)
ddictxt(1) type c, " (S)hort (M)iddle (L)ong設置以長、中還是短名稱來顯示,取值分別為 S、M、L。直接指定文本顯示為長文本、中、還是短文本, 指定這個字段后則會固定下來,不會隨着用戶的寬度調整變化.
reptext_ddic like dd03p-reptext, " heading (ddic),(header) Analogous(相似) to the Data element main header
rollname like dd03p-rollname,F1幫助需參照的DataElement,在ALV的顯示界面將鼠標放到該字段的位置后按F1會彈出該字段的說明。另外,可以不指明字段的描述(如seltext_l、seltext_m、seltext_s),函數會自動將字段的描述顯示為該參照的數據元素
下面datatype兩個屬性在字段如果是金額或P小數(數量)類型時,需要對datatype此屬性進行設置,否則,如果不設置時,在修改對應單元格內容時,會自動將你所輸入的數除100,即小數點提前兩位;並且如果是數量類型,除了設置datatype外,inttype也需要進行設置,且為 C,具體實現請參考這里
datatype like dd03p-datatype,
inttype like dd03p-inttype,
intlen like dd03p-intlen,
lowercase like dd03p-lowercase,
ref_fieldname like dd03p-fieldname,"如需單元格顯示F4輸入幫助,則需要指定字段所參照的表名
ref_tabname like dd03p-tabname,"如需單元格顯示F4輸入幫助,則需要指定字段所參照的表中的字段名
roundfieldname type slis_fieldname,
roundtabname type slis_tabname,
decimalsfieldname type slis_fieldname,
decimalstabname type slis_tabname,
decimals_out(6) type c, " decimals in write statement控制小數點的位數
text_fieldname type slis_fieldname,
ddic_outputlen like dd03p-outputlen,
key_sel(1) type c, " field not obligatory
no_sum(1) type c, " do not sum up
sp_group(4) type c, " group specification
reprep(1) type c, " selection for rep/rep
input(1) type c, " input
edit(1) type c, " internal use only是否可編輯
hotspot(1) type c, " hotspot設置字段內容下面是否有熱點(有下划線,可點擊,單擊即可觸發相應事件)
ALV相關函數
REUSE_ALV_GRID_DISPLAY:Grid 格式的ALV
REUSE_ALV_LIST_DISPLAY: LIST格式的 ALV
REUSE_ALV_FIELDCATALOG_MERGE:根據程序中的數據內表結構,來自動生成FIELDCAT[]內表,會根據內表結構所參照的詞典類型來自動完成如表標題字段名的生成,得到大概的FIELDCAT[]后,可以再根據特殊情況再修改FIELDCAT[]內表,這樣可以大大減少FIELDCAT[]內表的創建工作。注:程序中用來輸出的內表結構中的每個字段都要參考了數據字典中的Data element,否則無法獲取字段的相關信息,此時在自動構建FIELDCAT后再手動對無參照字典類型的字段進行手工設置
注:還有一種以 LVC結尾的ALV函數REUSE_ALV_GRID_DISPLAY_LVC,此函數中引用到的類型大部分都不再從類型池slis 中來引用(TYPE-POOLS:slis.),而是直接引用字典中已定義好的表或結構類型,這種函數屬於新性函數,與面向對象的CL_GUI_ALV_GRID生成的ALV參數類型上基本相同,所以以后一般如果使用函數方式來產生ALV,推薦使用REUSE_ALV_GRID_DISPLAY_LVC函數,而非REUSE_ALV_GRID_DISPLAY函數因為這樣方便修改面向對象方式的ALV
REUSE_ALV_GRID_DISPLAY與REUSE_ALV_LIST_DISPLAY函數的參數基本相同:
CALLFUNCTION'REUSE_ALV_GRID_DISPLAY' |
CALLFUNCTION'REUSE_ALV_LIST_DISPLAY' |
簡單實例
TYPE-POOLS:slis.
DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA:BEGIN OF lt_stock OCCURS 0,
sel,"用來做選擇按鈕列
checkbox,"用作復選框列
werks LIKE mard-werks,"工廠
matnr LIKE mara-matnr,"物料
labst LIKE mard-labst,"庫存
int TYPE i,"用來測試統計的自定義字段
color(4),"用來存儲顏色
END OF lt_stock.
INITIALIZATION.
PERFORM inital.
START-OF-SELECTION.
DEFINE fill_fdcat.
clear fieldcat.
fieldcat-fieldname = &1. "需要顯示的內表行結構中的哪個字段
fieldcat-seltext_l = &2. "ALV顯示時標題欄中的文本
fieldcat-key = &3. "是否是關鍵字段,如果是則單元格顯示的顏色會不同,並會靠前顯示
append fieldcat.
END-OF-DEFINITION.
fill_fdcat 'WERKS' '工廠' 'X'.
fill_fdcat 'MATNR' '物料' 'X'.
fill_fdcat 'LABST' '庫存' ''.
fill_fdcat 'INT' '自定義字段' ''.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = fieldcat[]
TABLES
t_outtab = lt_stock.
FORM inital .
lt_stock-sel = 'X'.
lt_stock-checkbox = 'X'.
lt_stock-werks = '1001'.
lt_stock-matnr = '1001M1'.
lt_stock-labst = 4.
lt_stock-int = 2.
lt_stock-color = 'C100'.
APPEND lt_stock .
CLEAR:lt_stock.
lt_stock-sel = 'X'.
lt_stock-werks = '1001'.
lt_stock-matnr = '1001M2'.
lt_stock-labst = 3.
lt_stock-int = 1.
lt_stock-color = 'C200'.
APPEND lt_stock .
CLEAR:lt_stock.
lt_stock-checkbox = 'X'.
lt_stock-werks = '1002'.
lt_stock-matnr = '1001M1'.
lt_stock-labst = 2.
lt_stock-int = 3.
lt_stock-color = 'C300'.
APPEND lt_stock .
CLEAR:lt_stock.
lt_stock-werks = '1002'.
lt_stock-matnr = '1001M2'..
lt_stock-labst = 1.
lt_stock-int = 1.
lt_stock-color = 'C300'.
APPEND lt_stock .
ENDFORM.
Fieldcat動態創建
通過編程創建
注:通過此種方式實現時,顯示內表中的所有列都會輸出,只是那些沒有參照字典中的類型字段沒有字段標題名而已,這需要在FieldCat生產后,通過代碼修改即可。
REPORT zalv_test.
TYPE-POOLS:slis.
DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: layout TYPE slis_layout_alv.
DATA:BEGIN OF lt_stock OCCURS 0,
sel,"用來做選擇按鈕列
checkbox,"用作復選框列
werks LIKE mard-werks,"工廠
matnr LIKE mara-matnr,"物料
labst LIKE mard-labst,"庫存
int TYPE i,"用來測試統計的自定義字段
color(5),"用來存儲顏色
END OF lt_stock.
INITIALIZATION.
PERFORM inital.
START-OF-SELECTION.
PERFORM build_fieldcat.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = fieldcat[]
TABLES
t_outtab = lt_stock.
FORM build_fieldcat .
DATA: descr_ref TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS: <comp_output> TYPE abap_compdescr.
DATA: absname TYPE string.
DATA: ref_datadesrc TYPE REF TO cl_abap_datadescr.
DATA: BEGIN OF title ,
rollname TYPE dd04l-rollname,
scrtext_s TYPE dd04t-scrtext_s,
scrtext_m TYPE dd04t-scrtext_m,
scrtext_l TYPE dd04t-scrtext_l,
END OF title.
"lt_stock為帶表頭的內表,這里傳遞的是表頭,在使用時修改這里即可
descr_ref ?= cl_abap_typedescr=>describe_by_data( lt_stock ).
LOOP AT descr_ref->components ASSIGNING <comp_output>.
ref_datadesrc = descr_ref->get_component_type( <comp_output>-name ).
absname = ref_datadesrc->absolute_name.
SPLIT absname AT `=` INTO absname absname.
CLEAR:title.
SELECT SINGLE dd04l~rollname dd04t~scrtext_s dd04t~scrtext_m dd04t~scrtext_l
INTO CORRESPONDING FIELDS OF title
FROM dd04l INNER JOIN dd04t ON dd04l~rollname = dd04t~rollname
WHERE ddlanguage = sy-langu AND dd04l~rollname = absname.
fieldcat-fieldname = <comp_output>-name.
* 如果fieldcat定義為:data: fieldcat type table of lvc_s_fcat(不過此時不能再使用REUSE_ALV_GRID_DISPLAY函數了,還是使用以LVC結尾的REUSE_ALV_GRID_DISPLAY_LVC函數,否則參數類型不匹).使用下面語句:
* fieldcat-reptext = title-scrtext_l.
* fieldcat-scrtext_l = title-scrtext_l.
* fieldcat-scrtext_m = title-scrtext_m.
* fieldcat-scrtext_s = title-scrtext_s.
* 如果fieldcat定義為:data: fieldcat type slis_t_fieldcat_alv with header line.使用下面語句進行設置:
fieldcat-seltext_l = title-scrtext_l.
fieldcat-seltext_m = title-scrtext_m.
fieldcat-seltext_s = title-scrtext_s.
APPEND fieldcat.
ENDLOOP.
ENDFORM. "build_fieldcatalog
FORM inital .
lt_stock-sel = 'X'.
lt_stock-checkbox = 'X'.
lt_stock-werks = '1001'.
lt_stock-matnr = '1001M1'.
lt_stock-labst = 4.
lt_stock-int = 2.
lt_stock-color = 'C100'.
APPEND lt_stock .
CLEAR:lt_stock.
lt_stock-sel = 'X'.
lt_stock-werks = '1001'.
lt_stock-matnr = '1001M2'.
lt_stock-labst = 3.
lt_stock-int = 1.
lt_stock-color = 'C200'.
APPEND lt_stock .
CLEAR:lt_stock.
lt_stock-checkbox = 'X'.
lt_stock-werks = '1002'.
lt_stock-matnr = '1001M1'.
lt_stock-labst = 2.
lt_stock-int = 3.
lt_stock-color = 'C300'.
APPEND lt_stock .
CLEAR:lt_stock.
lt_stock-werks = '1002'.
lt_stock-matnr = '1001M2'..
lt_stock-labst = 1.
lt_stock-int = 1.
lt_stock-color = 'C300'.
APPEND lt_stock .
ENDFORM.
通過REUSE_ALV_FIELDCATALOG_MERGE函數創建
TYPE-POOLS:slis.
DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: layout TYPE slis_layout_alv.
"注:如果是參照字典中的structure, table, view中的某個字段時,字段的定義只能使用
"LIKE操作符,否則使用TYPE時,該字段在使用 REUSE_ALV_FIELDCATALOG_MERGE
"函數時將被忽略,但不參照字典類型的除外。另外,內表本身的定義只能采用老式方式
"來定義,不能采用新方式定義,否則不能被REUSE_ALV_FIELDCATALOG_MERGE找到
DATA:BEGIN OF T_STOCK OCCURS 0,
sel,"用來做選擇按鈕列
checkbox,"用作復選框列
werks LIKE mard-werks,"工廠
matnr LIKE mara-matnr,"物料
labst LIKE mard-labst,"庫存
int TYPE i,"用來測試統計的自定義字段
color(5),"用來存儲顏色
END OF T_STOCK.
INITIALIZATION.
PERFORM inital.
START-OF-SELECTION.
*REUSE_ALV_FIELDCATALOG_MERGE函數內部實現規則:
*
* 數據類型為 clnt 字典類型字段不是顯示,即 fieldcat-no_out = space ,如果
* 需要顯示,則可以設置REUSE_ALV_FIELDCATALOG_MERGE參數i_client_never_display
* 來顯示
* 如果參照的字典structure, table, view類型中的某字段是關鍵字然,則會設置
* fieldcat-key = 'X'
* dictionary references to unit fields are copied if the reference
* fields are in the structure.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_inclname = sy-repid"一般指定為本程序名,如果顯示內表參照的為字典中的類型則可省略
i_internal_tabname = 'T_STOCK' "顯示輸出內表名,要大小
"如果定義的顯示輸出內表是參照的字典中的structure, table, view時,才需要指定
* i_structure_name =
i_client_never_display = 'X'"類型為CLNT字典類型的字段將不會被設置,即不會顯示
i_bypassing_buffer = 'X'"另外,此函數還有緩存問題,發現在修改輸出內表顯示結構后,此函數不會刷新,加了以下這兩個參數還是一樣,只能將顯示輸出內表的變量名修改一下,不知道如何做才好啊
i_buffer_active = ' '
CHANGING
ct_fieldcat = fieldcat[].
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = fieldcat[]
TABLES
t_outtab = T_STOCK.
FORM inital .
T_STOCK-sel = 'X'.
T_STOCK-checkbox = 'X'.
T_STOCK-werks = '1001'.
T_STOCK-matnr = '1001M1'.
T_STOCK-labst = 4.
T_STOCK-int = 2.
T_STOCK-color = 'C100'.
APPEND T_STOCK .
CLEAR:T_STOCK.
T_STOCK-sel = 'X'.
T_STOCK-werks = '1001'.
T_STOCK-matnr = '1001M2'.
T_STOCK-labst = 3.
T_STOCK-int = 1.
T_STOCK-color = 'C200'.
APPEND T_STOCK .
CLEAR:T_STOCK.
T_STOCK-checkbox = 'X'.
T_STOCK-werks = '1002'.
T_STOCK-matnr = '1001M1'.
T_STOCK-labst = 2.
T_STOCK-int = 3.
T_STOCK-color = 'C300'.
APPEND T_STOCK .
CLEAR:T_STOCK.
T_STOCK-werks = '1002'.
T_STOCK-matnr = '1001M2'..
T_STOCK-labst = 1.
T_STOCK-int = 1.
T_STOCK-color = 'C300'.
APPEND T_STOCK .
ENDFORM.
自定義ALV工具條
默認輸出的ALV已供了很多標准的按鈕了:
自定義ALV工具欄有兩種方式:第一處是自已創建一個GUI Status(通常作法是從SLVC_FULLSCREEN函數組中的拷貝STANDARD_FULLSCREENGui Status,再在此基礎之上新增按鈕即可);第二種是調用系統已定義好的標准ALV工具欄;
系統已定義好的標准ALV GUI Status 在程序SAPLKKBL中,可以通過SET PF-STATUS … OF PROGRAM語句直接來調用,如:
SET PF-STATUS 'STANDARD_FULLSCREEN' OF PROGRAM 'SAPLKKBL'.
SAPLKKBL程序中定義的系統標准的ALV GUI Status有以下幾種:
l STDPOPUP_FULLSCREEN
l STANDARD_FULLSCREEN 與SLVC_FULLSCREEN函數組中的STANDARD_FULLSCREEN是一樣的,都是標准的(函數組SALV中的STANDARDstatus也是標准的)
l STDPOPBX_FULLSCREEN
l STDPOPUP_FULLSCREEN
l STANDARD_FULLSCR_HR
l STDPOPBX_FS_LIGHT
l STDPOPUP_FS_LIGHT
l STD_LIGHT_FULLSCREEN
這些工具條中的按鈕都已經設置了Function Code,且都是保留字,這些Funcode都已經在ALV Guid控件中實現,不需得新分配Funcode功能代碼,按鈕默認功能碼:
ALV中自定義工具欄需要通過REUSE_ALV_GRID_DISPLAY函數的I_CALLBACK_PF_STATUS_SET參數,傳遞設置GUI Status的Form的名稱,在此Form使用SET PF-STATUS語句來重新定義ALV工具欄,該Form接口如下:
FORM set_pf_status USING rt_extab TYPE slis_t_extab
rt_extab是要排除掉的按鈕,根據Funcode來排除。另外,也可以通過REUSE_ALV_GRID_DISPLAY函數IT_EXCLUDING內表參數來直接排除哪些預置按鈕不可用,IT_EXCLUDING內表結構只有一個fcode字段,即根據保留的FunCode即可disabled掉。
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
it_fieldcat = fieldcat[]
I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
TABLES
t_outtab = t_stock1.
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
"去激活Function code為&ETA的詳情按鈕
APPEND '&ETA' TO rt_extab.
SET PF-STATUS 'STANDARD_FULLSCREEN' OF PROGRAM 'SAPLKKBL' EXCLUDING
rt_extab.
ENDFORM.
如果沒有重定義ALV工具欄,則會默認使用函數組SLVC_FULLSCREEN中定義的STANDARD_FULLSCREEN工具條
快速拷貝GUI Status
在自定義工具欄時,通常從標准GUI Status上拷貝出來,再新加按鈕。
函數組 SLVC_FULLSCREEN中定義的STANDARD_FULLSCREEN GUI Status拷貝方式如下,通過 SE41可以快速拷貝:
如果不是ALV,是Write輸出時,拷貝:
ALV事件
ALV觸發的事件(如雙擊某行數據、單擊熱點、點ALV工具欄上的自定義的按鈕時),會回調I_CALLBACK_USER_COMMAND參數指定的Form,接口如下:
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
Parameter R_UCOMM 為觸發的function code
結構 RS_SELFIELD 包括了以下字段:
- tabname : Name of the internal output table 輸出內表名
- tabindex : Index of the internal output table 數據行索引
- endsum : Cursor is located on the totals line
- sumindex : If >0, the cursor is located on a subtotals line
- value : Value of the field on the list 光標所在單元格的值
- refresh : (Exporting) List should be set up again為X時,當用戶在顯式界面上對數據進行修改時,同時內表中的數據也隨之刷新
- col_stable:(Exporting) Keep column position when list is set up again
- row_stable:(Exporting) Keep row position when list is set up again
- exit :(Exporting) Exit list (and ALV)
- before_action: Call before standard action execution
- after_action : Call after standard action execution, before list setup
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
it_fieldcat = fieldcat[]
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
TABLES
t_outtab = gt_data[].
注:只有自已新增的按鈕(或雙擊數據行時、熱點點擊)再會調用,ALV 標准默認的Function Code是不會調用的(除非使用使用IT_EVENT_EXIT)
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
MESSAGE i001(00) WITH '事件觸發時當前行:' rs_selfield-tabindex.
ENDFORM.
所支持事件
ALV可觸發的事件可用REUSE_ALV_EVENTS_GET 函數來獲得,輸出一個內表,類型是slis_t_event,行項為slis_alv_event,包含兩個字段:一個為事件名,另一個是事件處理的FORM名
DATA: i_events TYPE slis_t_event WITH HEADER LINE.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
"0:表示獲取的是通過函數REUSE_ALV_LIST_DISPLAY產生的ALV所支持的事件
"4:表示獲取的是通過函數REUSE_ALV_GUID_DISPLAY產生的ALV所支持的事件
i_list_type = 4
IMPORTING
et_events = i_events[].
LOOP AT i_events.
WRITE:/ i_events-name,i_events-form.
ENDLOOP.
觸發USER_COMMAND事件時,會調用以下簽名的Form:
觸發PF_STATUS_SET事件時,會調用以下簽名的Form(其中pf_status_set名是自定義的,非固定為 pf_status_set):
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
事件名 |
何時觸發 |
觸發時所回調Form的簽名要求 |
回調方式 |
USER_COMMAND |
用戶點擊工具欄中自定義按鈕、預置按鈕(需通過REUSE_ALV_GRID_DISPLAY函數的IT_EVENT_EXIT參數來特殊處理才會回調指定的Form)、數據行雙擊、單元格熱點點擊等一系列用戶操作 |
FORM user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. (其中user_command名是自定義的,而不是固定為 user_command) |
1. 通過REUSE_ALV_GRID_DISPLAY函數的I_CALLBACK_USER_COMMAND參數接口回調 2. 通過REUSE_ALV_GRID_DISPLAY函數的IT_EVENTS參數接口回調 |
PF_STATUS_SET |
ALV工具欄顯示前,可自定義工具條 |
FORM pf_status_set USING rt_extab TYPE slis_t_extab (其中 pf_status_set 名是自定義的,而不是固定為 pf_status_set ) |
1. 通過REUSE_ALV_GRID_DISPLAY函數的I_CALLBACK_PF_STATUS_SET參數接口回調 2. 通過REUSE_ALV_GRID_DISPLAY函數的IT_EVENTS參數接口回調 |
types: slis_t_event type slis_alv_event occurs 0.
*--- Structure for event handling
types: begin of slis_alv_event,
name(30),"事件名
form(30),"事件觸發時需回調的Form名
end of slis_alv_event.
工具條預置按鈕回調出口IT_EVENT_EXIT
點擊ALV默認提供的工具欄按鈕時,不會回調I_CALLBACK_USER_COMMAND = 'USER_COMMAND'參數中指定的Form ,因為那些按鈕所對應的功能代碼已被設為保留Funcode了,如果要想在點擊這些標准的按鈕時也回調指定的Form,可通過REUSE_ALV_GRID_DISPLAY函數的IT_EVENT_EXIT 參數實現的,可以向IT_EVENT_EXIT參數內表填充需要被攔截的保留Funcode,及在是執行對應功能代碼之前還是之后調用,具體應用請參考這里:
DATA: event_exit TYPE slis_t_event_exit WITH HEADER LINE.
event_exit-ucomm = '&OAD'."此Funcode為點擊AlV工具欄上的選擇布局按鈕時會被USER_COMMAND Form攔截
event_exit-after = 'X'.
APPEND event_exit.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
it_fieldcat = fieldcat[]
i_callback_user_command = 'USER_COMMAND'
IT_EVENT_EXIT = event_exit[]
TABLES
t_outtab = gt_result.
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
...
ENDFORM.
顏色
注意:
顏色設置中有優先級順序,他們是單元格-->行-->列,即若同時使用了上述3中更改顏色的方法,則列的顏色會被行的顏色覆蓋掉,而行的顏色又會被單元格的顏色覆蓋掉,最終只會顯示出單元格的顏色。
如果這列被設置為關鍵列,就是LS_FCAT-KEY = 'X' ,那么顏色設置就不會起作用
行顏色
ALV中的每行數據顏色是通過LayOut來控制的。需要在顯示輸出內表結構中增加一列字段,用來存儲數據行的顏色
TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gs_layout TYPE slis_layout_alv.
DATA:BEGIN OF gt_data OCCURS 0,
val1(4),"顏色值
val2(4),"顏色值
color(4),"用來存儲行顏色
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
DEFINE fill_fdcat.
clear gt_fieldcat.
gt_fieldcat-fieldname = &1.
gt_fieldcat-seltext_l = &2.
append gt_fieldcat.
END-OF-DEFINITION.
fill_fdcat 'VAL1' '顏色值'.
fill_fdcat 'VAL2' '顏色值'.
gs_layout-info_fieldname = 'COLOR'." 指定哪一列用來作為行顏色的列
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = gt_fieldcat[]
is_layout = gs_layout
TABLES
t_outtab = gt_data.
FORM inital .
DATA: c1,c2,c3.
DO 8 TIMES.
c1 = sy-index - 1.
DO 2 TIMES.
c2 = sy-index - 1.
DO 2 TIMES.
c3 = sy-index - 1.
CONCATENATE 'C' c1 c2 c3 INTO gt_data-color.
gt_data-val1 = gt_data-color.
gt_data-val2 = gt_data-color.
APPEND gt_data.
ENDDO.
ENDDO.
ENDDO.
ENDFORM.
顏色值定義為4位字符,首位固定為字母“C”,第2位為顏色,由0~7表示,不同的數字表示不同的顏色屬性,如:
0 = background color 1 = Gray-blue 2 = Light gray 3 = yellow
4 = blue-gray 5 = green 6 = red 7 = orange
第3位表示輸出文字是否高亮顯示,由0~1表示,為1時表示高亮顯示。第4位測試了一下,基本上0~9顏色都差不多,唯一就是當取值為1時,底色又回到了灰色(且只是在第3位為0時才有此效果)。
ALV中的顏色是由4位數組成:'C'+COL+INT+INV
*** Structure for colors
types: begin of slis_color,
col type i,
int type i,
inv type i,
end of slis_color.
第1位:固定取值為C
第2位COL:顏色值,取值為0~7
第3位INT:高亮,即顏色是否加深,取值為0、1。1表示加深顯示
第4位INV:顏色是否反轉,即顏色是作用在背景上,還是作用在輸出字符上,取值上為0、1。為1時表示設置的是前景色,即輸出字符本身的顏色(好像只有在第3位為0時才有效?)
以下是各種顏色值測試表:
列顏色
TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gt_sort TYPE slis_t_sortinfo_alv WITH HEADER LINE.
DATA:BEGIN OF gt_data OCCURS 0,
curr TYPE ekpo-netpr,
int TYPE i,
p TYPE p LENGTH 5 DECIMALS 2,
END OF gt_data.
START-OF-SELECTION.
PERFORM inital.
DEFINE fill_fdcat.
clear gt_fieldcat.
gt_fieldcat-fieldname = &1.
gt_fieldcat-seltext_l = &2.
if &1 = 'CURR' .
"設置列顏色
gt_fieldcat-emphasize = 'C510'.
endif.
if &1 = 'INT' .
gt_fieldcat-emphasize = 'C610'.
endif.
append gt_fieldcat.
END-OF-DEFINITION.
fill_fdcat 'CURR' 'CURR' .
fill_fdcat 'INT' 'INT' .
fill_fdcat 'P' 'P(3.2)' .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
it_fieldcat = gt_fieldcat[]
TABLES
t_outtab = gt_data[].
FORM inital .
gt_data-curr = 1.
gt_data-int = 1.
gt_data-p = 1.
APPEND gt_data.
gt_data-curr = 2.
gt_data-int = 2.
gt_data-p = 2.
APPEND gt_data.
ENDFORM.
單元格顏色
除了可為整行設置行顏色外,每個單元格(不只是整列)的顏色也是可以單獨進行設置。當然既然可以給單元格設置顏色,則整列相同顏色也是可以采用此方式來設置的
TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gs_layout TYPE slis_layout_alv.
DATA:BEGIN OF gt_data OCCURS 0,
val1(40),"顏色值
val2(40),"顏色值
val3(40),
colortable TYPE slis_t_specialcol_alv, "每行中的單元格顏色內表,可對多個單元格進行不同顏色設置
END OF gt_data.
"每行中單元格顏色列表
DATA: gt_color TYPE slis_t_specialcol_alv WITH HEADER LINE.
START-OF-SELECTION.
PERFORM inital.
DEFINE fill_fdcat.
clear gt_fieldcat.
gt_fieldcat-fieldname = &1.
gt_fieldcat-seltext_l = &2.
append gt_fieldcat.
END-OF-DEFINITION.
fill_fdcat 'VAL1' '顏色值'.
fill_fdcat 'VAL2' '顏色值'.
fill_fdcat 'VAL3' '無顏色'.
gs_layout-coltab_fieldname = 'COLORTABLE'."設置輸出內表中哪列為顏色列表
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
it_fieldcat = gt_fieldcat[]
is_layout = gs_layout
TABLES
t_outtab = gt_data.
FORM inital .
DATA: c1,c2.
DO 7 TIMES.
c1 = gt_color-color-col = sy-index - 1."顏色值
DO 2 TIMES.
c2 = gt_color-color-int = sy-index - 1."顏色亮度
gt_color-color-inv = '0'."顏色作用於背景
CASE sy-index .
WHEN 1.
gt_color-fieldname = 'VAL1'."需進行顏色設置的列名(已具體到單元格)
CONCATENATE 'col=' c1 ` ` 'int=' c2 ` ` 'inv=0' INTO gt_data-val1 .
WHEN 2.
gt_color-fieldname = 'VAL2'."需進行顏色設置的列名(已具體到單元格)
CONCATENATE 'col=' c1 ` ` 'int=' c2 ` ` 'inv=0' INTO gt_data-val2 .
ENDCASE.
APPEND gt_color.
ENDDO.
"設置每行數據中單元格的顏色內表
gt_data-colortable = gt_color[].
gt_data-val3 = '無顏色'.
APPEND gt_data.
CLEAR:gt_color,gt_color[].
ENDDO.
ENDFORM.
可編輯
可以通過layout(slis_layout_alv)中的edit參數來設置整個網格(所有單元格)是否可編輯:
DATA: gs_layout TYPE slis_layout_alv.
gs_layout-edit = 'X'.
如果只想讓某列(一整列)可修改,而不是整個網格,則可對fieldcat中的edit參數來設置某列是否可編輯:
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
gt_fieldcat-edit = 'X'.
如果想對某些單元格進行設置,在滿足一定條件的單元格才能修改,此時只能使用以LVC結尾的REUSE_ALV_GRID_DISPLAY_LVC函數,而非REUSE_ALV_GRID_DISPLAY函數:
"TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE lvc_t_fcat WITH HEADER LINE."注:此時的fieldcat不再引用slis_t_fieldcat_alv類型
DATA: gs_layout TYPE lvc_s_layo."注:此時的Layout不再是引用slis_layout_alv類型
DATA:BEGIN OF gt_data OCCURS 0,
val1(40),
val2(40),
cellstab TYPE lvc_t_styl,"單元格可編輯控制
END OF gt_data.
"單元格可編輯控制內表
DATA: gt_cellstab TYPE lvc_t_styl WITH HEADER LINE.
START-OF-SELECTION.
PERFORM inital.
DEFINE fill_fdcat.
clear gt_fieldcat.
gt_fieldcat-fieldname = &1.
gt_fieldcat-scrtext_l = &2.
"設置單元格為可編輯狀態:此處設置所有單元格都可編輯
gt_fieldcat-edit = 'X'.
append gt_fieldcat.
END-OF-DEFINITION.
fill_fdcat 'VAL1' '列1'.
fill_fdcat 'VAL2' '列2'.
gs_layout-stylefname = 'CELLSTAB'."設置可編輯信息
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat[]
TABLES
t_outtab = gt_data.
FORM inital .
gt_data-val1 = 'cell1'.
gt_data-val2 = 'cell2'.
gt_cellstab-fieldname = 'VAL1'.
"將原本可編輯的單元格切換到不可編輯樣式。注:這里
"只是樣式的切換,不能僅僅使用cl_gui_alv_grid=>mc_style_enabled來將單元格設置為
"可編輯狀態,單元格真正是否可編輯是由fieldcat-edit或layout-edit來決定的,而僅
"設置為cl_gui_alv_grid=>mc_style_enabled是不可編輯的
gt_cellstab-style = cl_gui_alv_grid=>mc_style_disabled.
APPEND gt_cellstab.
gt_data-cellstab = gt_cellstab[].
APPEND gt_data.
ENDFORM.