OO ALV 學習參考


http://blog.csdn.net/sapliumeng/article/details/18653491

.ALV介紹  

 The ALV Grid Control (ALV = SAPList Viewer)是一個顯示列表的靈活的工具,它提供了基本功能的列表操作,也可以通過自定義來進行增強,因此可以允許你可以在大型的應用程序中使用.

   SAP提示: 在SAP的開發項目中,ALV GRID也可以作為修改和創建數據的一種工具,然而,目前這個功能只在實驗計划中使用,還沒有向客戶發布.

   下面是一個ALV GRID的圖片:

 

它包括3大部分,工具欄,標題,用於顯示數據的網格控制器.如果有必要,用戶可以隱藏標題和工具欄.

     ALV家族包含3中ALV工具:簡易的,兩層ALV,分等級連續的列表和樹形結構的ALV.

 .ALV GRID CONTROL (ALV網格控制器)

 

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

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

 

.ALV GRID CONTROL實例

   ALV GRID實例的定義,參照CL_GUI_ALV_GRID

   

     data ALV_GRID1 type refto cl_gui_alv_grid.

 

  ALV GRID繼承結構:

 

四、ALV GRID相關的幾個控制結構
    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',合計

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

 

2.布局控制[layout]

 

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

 

 

3.打印和排序,過濾控制

 

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

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

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

 

 這里不再一一解釋,進入中文版本,里面應該也有解釋的,雖然一些不是很清楚.

 

五.編寫簡單的ALV程序.

 

   首先這里就不詳細介紹DIALOG的用法了.

 

   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 BEFOREOUTPUT .             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 CHANGINGgt_fieldcat .

       *-----設置布局

PERFORM prepare_layout CHANGING gs_layout .

       *-----顯示ALV

CALL METHODgr_alvgrid->set_table_for_first_display EXPORTING

* I_BUFFER_ACTIVE =

* I_CONSISTENCY_CHECK =

* I_STRUCTURE_NAME =

* IS_VARIANT =

* I_SAVE =

* I_DEFAULT = 'X'

is_layout = gs_layout

* IS_PRINT =

* IT_SPECIAL_GROUPS =

* IT_TOOLBAR_EXCLUDING =

* IT_HYPERLINK =

CHANGING

it_outtab = gt_list[]

it_fieldcatalog = gt_fieldcat

* IT_SORT =

* IT_FILTER =

EXCEPTIONS

invalid_parameter_combination = 1

program_error = 2

too_many_lines = 3

OTHERS = 4 .

ELSE .

        *----刷新ALV

CALL METHODgr_alvgrid->refresh_table_display *

EXPORTING * IS_STABLE = *

I_SOFT_REFRESH =

EXCEPTIONS

finished = 1

OTHERS = 2 .

IF sy-subrc <> 0. *--異常處理 ENDIF.

ENDIF .

 

 

 方法"set_table_for_first_display"的參數說明

 

參數

含義

I_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

過濾的標准

  

方法"REFRESH_TABLE_DISPLAY"的參數說明

 

參數

含義

IS_STABLE

刷新的穩定性,有2個參數,一個是行,一個是列.如果設置了相應的值, 那么對應的行,或者列,在刷新的時候,將會保持穩定,就是滾動條保持不動.

I_SOFT_REFRESH

這個參數只是在異常情況下被使用,如果設置了這個參數,任何創建的合計, 任何排序次序,任何為了顯示數據而設置的過濾都將保持不變.這個是非常 有意義的.例如:當然你沒有修改數據內表里的數據而想刷新ALV,僅僅只是 改變一下布局和字段目錄.

 

 

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

       1.手動創建

 

FORM prepare_field_catalog CHANGINGpt_fieldcat TYPE lvc_t_fcat . 

DATA ls_fcat type lvc_s_fcat . 

ls_fcat-fieldname = 'CARRID' . 

ls_fcat-inttype = 'C' . l

s_fcat-outputlen = '3' .

ls_fcat-coltext = 'Carrier ID' . 

ls_fcat-seltext = 'Carrier ID' . 

APPEND ls_fcat to pt_fieldcat . 

CLEAR ls_fcat .

ls_fcat-fieldname = 'CONNID' . 

ls_fcat-ref_table = 'SFLIGHT' . 

ls_fcat-ref_table = 'CONNID' . 

ls_fcat-outputlen = '3' . 

ls_fcat-coltext = 'Connection ID' . 

ls_fcat-seltext = 'Connection ID' . 

APPEND ls_fcat to pt_fieldcat . 

ENDFORM .

   2.半自動的創建

 

FORM prepare_field_catalog CHANGING pt_fieldcat TYPElvc_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 TYPElvc_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 TYPEui_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 .

ENDFORM .

按照上面的步驟,一個ALV的DEMO基本可以創建了.下面我們將講述一些功能.

 

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

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

   字段目錄 :    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 TYPElvc_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 TYPElvc_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方法來恢復這些選擇.

  

功能六:插入超鏈接

 

    插入超鏈接是通過一個含有超級鏈接和句柄的表來實現的.這個表類型為"LVC_T_HYPE" ,句柄是一個INT4類型的字段,我們需要在數據顯示的內表中,加入這樣的字段,來告訴ALV,我們的字段指定的句柄,從而找到對應的超級鏈接.在字段目錄中,WEB_FIELD是用來指定對應的句柄名的.

 

   下面舉個例子來說明,我們要為字段CARRID,CONNID建立超級鏈接:

 

首先,內表定義中,我們加入2個句柄字段:

 

DATA BEGIN OF gt_list OCCURS 0 .    

INCLUDE STRUCTURESFLIGHT .

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 CHANGINGpt_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 TOlt_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 METHODgr_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_toolbarFOR 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.

METHODS HANDLE_ONF4                     "F4
    FOR EVENT ONF4 OF CL_GUI_ALV_GRID
    IMPORTING E_FIELDNAME ES_ROW_NO ER_EVENT_DATA.

PRIVATE SECTION. ENDCLASS.

下面是類的實現的一些概要代碼,參數可以從ALV的事件中直接獲取出來:

 

CLASS lcl_event_handler IMPLEMENTATION.

 *-- Handle toolbar

 METHOD handle_toolbar.

    PERFORM handle_toolbarUSIGN e_object e_interactive.

 ENDMETHOD.

 *-- Handle hotspot click

 METHOD handle_hotspot_click.

    PERFORMhandle_hotspot_click USING e_row_id e_column_id es_row_no.

 ENDMETHOD.

 *-- Handle double click

 METHOD handle_double_click.

    PERFORMhandle_double_click USING e_row e_column es_row_no.

 ENDMETHOD.

 *-- Handle after user command

 METHOD handle _after_user_command.

    PERFORMhandle_after_user_command USING e_object.

 ENDFORM.

 *-- Handle before user command

 METHOD handle_before_user_command.

    PERFORMhandle_before_user_command.

 ENDMETHOD.

 *--Handle data changed

 METHOD handle_data_changed.

    PERFORMhandle_data_changed USING er_data_changed.

 ENDMEHTOD.

 METHOD handle_data_changed_finished.

     PERFORMhandle_data_chaged USING e_modified.

 ENDMETHOD.

 METHOD handle_menu_button.

     PERFORMhandle_menu_button USING e_object e_ucomm.

 ENDMEHTOD.

 MEHTOD handle_button_click.

     PERFORMhandle_button_click USING e_objcet e_ucomm.

 ENDMETHOD.
 MEHTOD METHODS HANDLE_ONF4 .
PERFORM METHODS HANDLE_ONF4 USING .
 ENDMETHOD. ENDCALSS. *光定義了這些還不夠,我們需要把事件管理類注冊到ALV GRID的實例事件. *--------------f4--
  DATA: L_FIELD TYPE LVC_FNAME,
        LT_F4   TYPE LVC_T_F4,
        LS_F4   TYPE LVC_S_F4.

*  LS_F4-FIELDNAME  = 'UMSKZ'.
*  LS_F4-REGISTER   = 'X'.
  "LS_F4-GETBEFORE  = 'X'. "打'X'會在彈出窗體之前先刷新ALV數據
  "LS_F4-CHNGEAFTER = 'X'. "打'X'會在關閉窗體之后刷新ALV數據
  "LS_F4-INTERNAL   = ''.
  INSERT LS_F4 INTO TABLE LT_F4.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = TEM_GRID.

  CALL METHOD TEM_GRID->REGISTER_EDIT_EVENT     "注冊GRID事件
    EXPORTING
      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER"事件:回車
    EXCEPTIONS
      ERROR      = 1
      OTHERS     = 2.

*  CALL METHOD TEM_GRID->REGISTER_F4_FOR_FIELDS
*    EXPORTING
*      IT_F4 = LT_F4.

  CREATE OBJECT GT_EVENT_RECEIVER.
  SET HANDLER GT_EVENT_RECEIVER->HANDLE_MODIFY FOR TEM_GRID.
  SET HANDLER GT_EVENT_RECEIVER->HANDLE_ONF4   FOR TEM_GRID.

*-----------
DATA gr_event_handler TYPE REF TOlcl_event_handler . .. .. *--Creating an instance for the eventhandler
CREATE OBJECT gr_event_handler . *--Registering handler methods to handleALV Grid events
SET HANDLERgr_event_handler->handle_user_command FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_toolbar FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_menu_button FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_double_click FOR gr_alvgrid .
SET
HANDLERgr_event_handler->handle_hotspot_click FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_button_click FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_before_user_command FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_context_menu_request FOR gr_alvgrid .
SET HANDLERgr_event_handler->handle_data_changed FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_data_changed_finished FOR gr_alvgrid .

 

1.熱點事件(單擊事件)

 

    前面在介紹字段目錄的時候,我們說到,在某個字段的控制字段"HOTSPOT"設置為"X",那么這個字段就可以接受單擊事件HOTSPOT_CLICK.這個HOTSPOT_CLICK事件有三個參數,其中第一個參數"E_ROW_ID"已經作廢,另外2個參數是:參考類型LVC_S_COL定義的"E_COLUMN_ID",可以通過E_COLUMN_ID-FIELDNAME來反映當前點擊的字段名.參考類型LVC_S_ROID定義的"ES_ROW_NO",可以通過ES_ROW_NO-ROW_ID來反映當前點擊的行號,從而可以定位鼠標的位置.

 

    下面是響應單擊事件的一段處理代碼:

 

FORM handle_hotspot_click USING i_row_idTYPE lvc_s_row

                             I_column_id TYPE lvc_s_col

                             Is_row_no TYPE lvc_s_roid.

    READ TABLE gt_list INDEXis_row_no-rowid.

    IF sy-subrc = 0 ANDi_column_id-fieldname = ‘SEATSOCC’.

       CALLSCREEN 200.

    ENDIF.

ENDFORM.

 

當點擊的字段是SEATSOCC,調用屏幕200.

 

   2.雙擊事件

 

   雙擊事件和單擊事件的處理是類似的,同樣也是3個參數.我們不需要設置字段目錄就可以響應雙擊事件了.

 

    下面是示例:

 

FORM handle_double_click USING i_row TYPElvc_s_row

                             I_column TYPE lvc_s_col

                             Is_row_no TYPE lvc_s_rowid.

    READ TABLE gt_list INDEXis_row_no-row_id.

    IF sy-subrc = 0 ANDi_column-fieldname = ‘SEATSOCC’.

       CALLSCREEN 200.

    ENDIF.

ENDFORM.

 

當然鼠標雙擊字段SEATSOCC才調用屏幕200.

 

3.添加自定義的按鈕和響應命令

 

    我們在ALV的工具條上增加一些按鈕來增加我們自定義的功能,當然也可以在GUI狀態中增加,2種的處理方式是不一樣的.

    我們通過toolbar事件來增加按鈕,然后通過user_command事件來實現我們自定義的功能.

 

    在TOOLBAR事件里,我們把自定義的按鈕加到參數"e_object"的表屬性"mt_toolbar"中可以了.下面是一段示例代碼:

 

FORM handle_toolbar USING i_object TYPE REFTO cl_alv_event_toolbar_set.

   DATA: ls_toolbar TYPEstb_button.

 

   CLEAR ls_toolbar.

   MOVE 3 TOls_toolbar-butn_type.

   APPEND ls_toolbar TOi_object->mt_toolbar.

 

   CLEAR ls_toolbar.

   MOVE 'PER' TOls_toolbar-function.

   MOVE icon_display_text TOls_toolbar-icon.

   MOVE 'Passenger Info'(201) TOls_toolbar-quickinfo.

   MOVE 'Passenger Info'(201) TOls_toolbar-text.

   MOVE ' ' TOls_toolbar-disabled.

   APPEND ls_toolbar TOi_object->mt_toolbar.

 

   CLEAR ls_toolbar.

   MOVE 'EXCH' TOls_toolbar-function.

   MOVE 2 TOls_toolbar-butn_type.

   MOVE icon_calculation TOls_toolbar-icon.

   MOVE 'Payment in otherCurencies'(202) TO ls_toolbar-quickinfo.

   MOVE ' ' TOls_toolbar-text.

   MOVE ' ' TOls_toolbar-disapbled.

   APPEND ls_toolbar TOi_object->mt_toolbar.

ENDFORM.

增加自定義按鈕的結構如下:

Field

Description

FUNCTION

功能代碼

BUTN_TYPE

按鈕類型

可用的按鈕類型:

0                                                     Button(normal)

1                                                     Menu and default button

2                                                     Menu

3                                                     分割符

4                                                     Radio button

5                                                     Checkbox

6                                                     Menu entry

ICON

按鈕圖標(可選)

TEXT

按鈕文本(可選)

QUICKINFO

按鈕的懸停文本(可選)

DISABLED

灰化

在上面的代碼例子里,我們增加了一個常規的按鈕和一個含有菜單的按鈕.通過把按鈕的類型設置為1或者2,我們可以增加一個含有菜單的按鈕,在事件menu_button還可以實現子菜單:

FORM handle_menu_button USING i_object TYPEREF TO cl_ctmenu

I_ucommTYPE syucomm..

 CASE i_ucomm.

 WHEN ‘EXCH’.

CALLMETHOD i_object->add_function

     EXPORTING 

        Fcode     = ‘EU’

        Text      = ‘Euro’.

CALLMETHOD i_object->add_function

     EXPORTING

        Fcode     = ‘TRL’

        Text      = ‘Turkish Lira’.

 ENDCASE.

ENDFORM.

 

為了實現這些自定義的按鈕的功能,我們使用USER_COMMAND事件來處理.

 

FORM handle_user_command USING i_ucomm TYPEsy-ucomm.

 DATA lt_selected_rows TYPElvc_t_rowid.

 DATA ls_selected_row TYPE lvc_s_roid.

 

 CALL METHODgr_alvgrid->get_selected_rows

       IMPORTING

             Et_row_no = lt_selected_rows.

 READ TABLE lt_selected_rows INTOls_selected_row INDEX 1.

 If sy-subrc ne 0.

    MESSAGE S000(su) WITH'Select a row'(203).

 ENDIF.

 CASE i_ucomm.

 WHEN 'CAR'.

     READ TABLE gt_listINDEX ls_selected_row-row_id.

     IF sy-subrc = 0.

       CALLFUNCTION 'ZDISPLAY_CARRIER_INFO'

            EXPORTING carrid = gt_list-carrid

            EXCEPTIONS carrier_not_found  = 1

                         Oters           = 2.

     ENDIF.

 WHEN 'EU'.

     READ TABLE gt_listINDEX ls_selected_row-row_id.

     IF sy-subrc = 0.

       CALL FUNCTION 'ZPOPUP_CONV_CURR_ADD_DISPLAY'

             EXPORTING monun = 'EU'

                         Quant = gt_list-paymentsum.

     ENDIF.

 ENDCASE.

ENDFORM.

 我們通過方法get_selected_rows來獲取選擇的行.功能EXCH2個子功能,所以我們不需要實現它.為了能顯示ALV附加的一些功能,可以在ALV實例創建的時候調用set_toolbar_interactive方法.

   CALL METHODgr_alv_grid->set_toolbar_interactive.

4.覆蓋標准的功能.

 

    ALV也給我們提供了修改標准功能的機會.為了實現這個目的,我們需要在"before_user_command"事件中截取標准的功能,然后使用方法"set_user_command"來修改功能碼,可以指向自己定義的功能碼.

 

   下面是示例: 

FORM handle_before_user_command USINGi_ucomm TYPE syucomm .    

CASE e_ucomm .      

WHEN '&INFO' .        

CALL FUNCTION 'ZSFLIGHT_PROG_INFO' .        

CALL METHOD gr_alvgrid->set_user_command            

EXPORTING i_ucomm = space.    ENDCASE .  E

NDFORM .

 

    5.設置單元格的風格(style不知道符合翻譯為好,這里的style可以在CL_GUI_ALV_GRID的屬性中可以查到,分MC_STYLE4_LINK,MC_STYLE4_LINK_NO,MC_STYLE_BUTTON,MC_STYLE_DISABLED,....),包含單元格級別的可編輯/不可編輯,是否有F4,是否有鏈接,把單元格設置為按鈕,單元格級別的熱點......

 

     5.1 把單元格設置為PUSHBUTTON

  要想實現這個功能,我們需要在數據顯示內表增加一個表字段,參考表類型"LVC_T_STYL".數據實現內表定義為:

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 cellstyles TYPE lvc_t_styl.

DATA END OF gt_list.

把需要設置為按鈕的字段填進內表字段中: 

把第7行的字段SEATSMAX設置為按鈕. 

DATA ls_style TYPE lvc_s_styl.

READ TABLE gt_list INDEX 7.

Ls_style-fieldname = 'SEATSMAX'.

Ls_style-style =cl_gui_alv_grid=>mc_style_button.

APPEND ls_style TO gt_list-cellstyles.

MODIFY gt_list INDEX 7.

 然后在布局中指定對應的STYLE內表字段,注意字段名字一定要對上: 

     gs_layout-stylefname = 'CELLSTYLES'.

 

這里的按鈕點擊事件和單擊事件類似,也是需要2個參數來確定位置. 

    5.2設置單元格級別的可編輯和不可編輯

 

     單元格級別的可編輯和不可編輯是個非常有用的功能,SAP標准的一些事務中,經常可以看到這些方面的應用.通常用到的比較多的地方,是需要數據驗證的,比如輸入類型A,后面的某個字段才可以編輯,如果輸入了類型B,后面的這個字段就不可編輯.

 

    想讓一列可以編輯,我們可以在字段目錄中設置EDIT"X".在可編輯的情況下,ALV會自動多出來幾個編輯按鈕,刪除,新增,插入,復制.如果你不需要它們,可以使用前面介紹的方法滅了它們.

 

    單元格級別的可編輯和不可編輯,實現起來和5.1是類似的,也是內表字段,參考表類型"LVC_T_STYL".不過填入的style應該為CL_GUI_ALV_GRID=>MC_STYLE_ENABLEDCL_GUI_ALV_GRID=>MC_STYLE_DISABLED.指定字段名就可以.CL_GUI_ALV_GRID=>MC_STYLE_ENABLED使字段可以編輯,CL_GUI_ALV_GRID=>MC_STYLE_DISABLED使字段不可以編輯.代碼如下:

 

FORM adjust_edittables USING pt_list LIKEgt_list[].

 DATA ls_listrow LIKE LINE OF pt_list.

 DATA ls_stylerow TYPE lvc_s_styl.

 DATA lt_styletab TYPE lvc_t_styl.

 

 LOOP AT pt_list INTO ls_listrow.

IFls_listrow-carrid = 'XY'.

 Ls_stylerow-fieldname= 'SEATSMAX'.

 Ls_stylerow-style= cl_alv_grid=>mc_style_disabled.

 APPENDls_stylerow TO lt_styletab.

ENDIF.

IFls_listrow-connid = '02'.

 Ls_stylerow-fieldname= 'PLANETYPE'

Ls_stylerow-style= cl_alv_grid=>mc_style_enabled.

APPENDls_Pstylerow TO lt_styletab.

ENDIF.

INSERTLINES OF lt_styletab INTO ls_listrow-cellstyles.

MODIFYpt_list FROM ls_listrow. 

 ENDLOOP.

ENDFORM.

 

當然也是一樣,需要告訴ALV哪個字段是控制STYLE的內表字段.

 

  gs_layout-stylefname ='CELLSTYLES'.

 

一般情況下,單元格的設置會覆蓋整列的設置。如果想在程序里動態切換各種模式。只需要修改內表里關於STYLE設置的值然后刷新.使用方法set_ready_for_input傳入參數i_ready_for_input = 1可以是ALV進入編輯狀態。

使用這個方法可以使ALV在編輯和不可編輯模式之間切換。顯然如果把參數i_ready_for_input設置為0就進入不可編輯狀態。

 

 

當然還可以設置搜索幫助啊,等等,這里就不一一贅述了。

 

 

6. 控制數據變化

 

       我們可以設置alv處於可編輯狀態,當然ALV也提供給我們控制數據的輸入。Alv grid有兩個事件:data_changeddata_changed_finished.第一個事件在可編輯字段的數據發生變化時觸發,可用來檢查數據的輸入,第二個事件是當數據修改完成后觸發。

    

         我們可以通過方式REGISTER_EDIT_EVENT來設置,如何觸發數據改變事件.2種方式:

     1.按回車觸發:      i_event_id = cl_gui_alv_grid=>mc_evt_enter

     2.單元格失去焦點:   i_event_id = cl_gui_alv_grid=>mc_evt_modified

 

必須設置一種方式,要不然數據變化事件不會被觸發.

 

         為了獲取ALV里字段修改的一些信息,DATA_CHANGED事件會把參考CL_ALV_CHANGED_DATA_PROTOCOL創建的實例通過參數ER_DATA_CHANGED傳遞給ALV.

通過這個參數我們可以知道哪些單元格被修改了,修改了什么值.下面是類CL_ALV_CHANGED_DATA_PROTOCOL的一些方法:

Get_cell_value

獲取單元格的值

Modify_cell

修改單元格

Add_protocol_entry

增加日志記錄

Protocol_is_visible

是否允許錯誤表可見

Refresh_protocol

刷新日志記錄

 

  通過這個類的屬性,我們可以查到一些修改信息:

MT_MOD_CELLS

Contains address of modified cells with rowed and field name

MT_MOD_ROWS

Contain modified rows Its type is genric

MT_GOOD_CELLS

Contain cells have proper values

MT_DELETED_ROWS

Contain rows deleted from the list

MT_INSERTED_ROWS

Contain rows deleted from the list

通過上述一系列方式和屬性,可以獲取修改的值,而進行一些輸入的檢查.

 

 

下面是一段示例代碼:

 

FORM handle_data_changed USINGir_data_changed

                       TYPE REF TO cl_alv_changed_data_protocol.

 DATA: ls_mod_cell TYPE lvc_s_modi,

       Lv_value   TYPE lvc_value.

 

 SORT ir_data_changed->mt_mod_cellsBY row_id.

 LOOP ATir_data_changed->mt_mod_cells

                       INTO ls_mod_cell

                      WHERE fieldname = 'SEATSMAX'.

CALLMETHOD ir_data_changed->get_cell_value

    EXPORTING i_row_id = ls_mod_cell-row_id

                I_fieldname = 'CARRID'

    IMPORTING e_value    = lv_value.

 IFlv_value = 'THY' AND ls_mod_cell-value > '500'.

  CALL METHOD ir_data_changed->add_protocol_entry

        EXPORTING 

           I_msgid = 'SU'

           I_msgno = '000'

           I_msgty = 'E'

           I_msgv1 = 'This number can not exceed 500 for '

           I_msgv2 = lv_value

           I_msgv3 = 'The value is et to ''500'''

           I_fieldname = ls_mod_cell-fieldname

           I_row_id = ls_mod_cell-rowid.

  CALL METHOD ir_data_changed->modify_cell

        EXPORTING i_row_id = ls_mod_cell-row_id

                    I_fieldname = ls_mod_cell-fieldname

                    I_value = '500'.

 ENDIF.

 ENDLOOP.

ENDFORM.

附錄:ABAP顏色代碼

ABAP中的顏色代碼是由4位字都組成的

Cxyz

C:color的簡寫,顏色代碼均以C開頭

   x:標准色代碼,SAP中一共有7個標准色

   y:反轉顏色啟用/關閉 1/0

   z:增強顏色啟用/關閉 1/0

 

注意:

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

 

 
               


免責聲明!

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



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