ALV詳解:Function ALV(二)


Function ALV

單元格數據修改后立即同步(即立即觸發DATA_CHANGED事件)輸出內表

如果修改了網格中數據,如果沒有設置在單元格內容被修改后失去焦點(或回車)時立即同步到輸出內表中(即立觸發DATA_CHANGED事件),則輸出內表中的數據要等到保存、刷新、切換布局等按鈕執行后,才會觸發DATA_CHANGED事件,將修改過的數據更新到輸出內表中,如果要求在數據修改失去焦點時立即同步到輸出內表,則有以下兩種方法:

方法一:通過REUSE_ALV_GRID_DISPLAY 函數的i_grid_settings-edt_cll_cb進行設置:

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,
  key1
(1),
  key2
(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.
    gt_fieldcat
-key = &3.
    gt_fieldcat
-edit = 'X'.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'KEY1' 'KEY1' 'X'.
  fill_fdcat
'KEY2' 'KEY2' 'X'.

 
DATA: i_grid_settings TYPE  lvc_s_glay .
  i_grid_settings
-edt_cll_cb  = 'X' .

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      it_fieldcat    
= gt_fieldcat[]
"
只要在顯示界面可編輯字段上修改了數據,回車或失去焦點后就會立即將內表的數據也修改

    
 i_grid_settings = i_grid_settings
    TABLES

      t_outtab       
= gt_data[].
 
READ TABLE gt_data INDEX 1.
 
WRITE: gt_data-key1.

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

方法二:在user_command 回調Form處理:

 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      i_callback_program      
= sy-cprog
      i_callback_user_command 
= 'USER_COMMAND'

      it_fieldcat             
= fieldcat[]
   
TABLES

      t_outtab                
= gt_data.

FORM user_command USING ucomm  LIKE sy-ucommselfield  selfield TYPE slis_selfield.
  
DATA l_ref1 TYPE REF TO cl_gui_alv_grid.
 
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
   
IMPORTING
      e_grid
= l_ref1.
  CALL METHOD l_ref1->check_changed_data. "調用此方法后會觸發DATA_CHANGED事件。當此方法執行完后,被修改的數據就會更新到輸出內表中了
  "好像沒有上面幾行代碼,只需下面一行也可以自動更新,上面代碼究竟有什么作用?

 
 selfield-refresh = 'X'.
  CASE ucomm.
   
WHEN 'UPDATE'.
     
PERFORM frm_update.
 
ENDCASE.
ENDFORM.

輸出內表數據更新前觸發DATA_CHANGE事件進行數據有效性驗證

DATA_CHANGE事件觸發時,可進一步檢查數據輸入的正確性

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,
  key1
(1),
  key2
(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.
    gt_fieldcat
-key = &3.
    gt_fieldcat
-edit = 'X'.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'KEY1' 'KEY1' 'X'.
  fill_fdcat
'KEY2' 'KEY2' 'X'.

 
DATA: t_events TYPE slis_t_event WITH HEADER LINE.
  t_events
-name = slis_ev_data_changed.
  t_events
-form = 'ALV_DATA_CHANGED'.
 
APPEND t_events.

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      i_callback_program
= sy-repid
      it_fieldcat       
=
gt_fieldcat[]
      it_events         
=
t_events[]
   
TABLES

      t_outtab          
= gt_data[].
 
READ TABLE gt_data INDEX 1.
 
WRITE: gt_data-key1.

 
"注:如果沒有設置 i_grid_settings-edt_cll_cb  = 'X',在單元格數據被
 
"修改后,此Form不會自動調用,直到點擊了 保存或刷新 按鈕后才會被調用
 
"另外 cl_gui_alv_grid CHECK_CHANGED_DATA方法也會觸發 data_changed事件
FORM alv_data_changed USING pel_data TYPE REF TO cl_alv_changed_data_protocol.
 
DATA: l_name(20),ls_cells TYPE lvc_s_modi.
 
FIELD-SYMBOLS <fs_value>.
 
LOOP AT pel_data->mt_mod_cells INTO ls_cells.
   
CLEAR gt_data.
   
READ TABLE gt_data INDEX ls_cells-row_id.
   
CONCATENATE 'GT_DATA-' ls_cells-fieldname INTO l_name.
   
ASSIGN (l_name) TO <fs_value>.
    <fs_value>
= ls_cells-value.
   
"實際上不需要此句來修改輸出內表中的數據,因為只要在該Form中不
   
"彈出 E MSG,則該Form執行完后會也會自動更新輸出內表
   
"MODIFY gt_data INDEX ls_cells-row_id.
 
ENDLOOP.

ENDFORM.
FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

 

REUSE_ALV_GRID_DISPLAY[_LVC]函數中獲取生成的OO ALV對象

有時REUSE_ALV_GRID_DISPLAYREUSE_ALV_GRID_DISPLAY_LVC函數並不能滿足我們的需要,如通過REUSE_ALV_GRID_DISPLAY_LVC函數設置單元格顯示為PushButton時,無法針對Button的單元事件進行處理,所以只能借助於OOALV。只需在代碼中加入如下代碼,即可獲取到當前所產生的OO ALV對象,當拿到此對象后,就可以通過cl_gui_alv_grid來完成函數所無法完成的功能:

  DATA l_ref1 TYPE REF TO cl_gui_alv_grid.
 
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
   
IMPORTING
      e_grid
= l_ref1.

除此方法后,還可以在程序中動態獲取此對象,可以參考這里

貨幣類、數量(P小數)類型字段修改時小數點問題

對於貨幣與P類型小數(如數量)類型字段,需要對gt_fieldcat-datatype屬性進行設置,才能將輸入的數字保持原樣大小,否則輸入的數據會自動將小數點提前2位;對於數量類型,好像還需要對gt_fieldcat-INTTYPE屬性進行設置才好使,並且只能設置為C類型。datatypeINTTYPE實質上就是一種編輯類型與數據庫字段類型的映射,即Hibernate中的ORM(對象關系映射)

datatypeABAP 字典中數據庫類型,即SE11創建表結構時所參照的數據庫字段類型(ABAP詞典類型),取值如下:

ACCP   Posting period YYYYMM
CHAR   Character String
CLNT   Client
CUKY   Currency key, referenced by CURR fields

CURR
  Currency field, stored as DEC
D16D   Decimal Floating Point, 16 Digits, DEC on Database
D16R   Decimal Floating Point, 16 Digits,  RAW on Database
D16S   Decimal Floating Point. 16 Digits, with Scale Field
D34R   Decimal Floating Point, 34 Digits, RAW on Database
D34S   Decimal Floating Point, 34 Digits, with Scale Field
DATS   Date field (YYYYMMDD) stored as char(8)
DEC Counter or amount field with comma and sign
FLTP   Floating point number, accurate to 8 bytes
INT1   1-byte integer, integer number <= 255
INT2   2-byte integer, only for length field before LCHR or LRAW
INT4   4-byte integer, integer number with sign
LANG   Language key
LCHR   Long character string, requires preceding INT2 field
LRAW   Long byte string, requires preceding INT2 field
NUMC   Character string with only digits
PREC   Obsolete data type, do not use

QUAN
  Quantity field, points to a unit field with format UNIT
RAW Uninterpreted sequence of bytes
RSTR   Byte String of Variable Length
SSTR   Short Character String of Variable Length
STRG   Character String of Variable Length
TIMS   Time field (hhmmss), stored as char(6)
UNIT   Unit key for QUAN fields
VARC   Long character string, no longer supported from Rel. 3.0

INTTYPEABAP程序內部所使用的一種數據類型,即ABAP數據類型,取值如下:

C   Character String
N   Character String with Digits Only
D   Date (Date: YYYYMMDD)
T   Time (Time: HHMMSS)
X   Byte Seq. (heXadecimal), in DDIC metadata also for INT1/2/4
I   Integer number (4-byte integer with sign)
b   1-byte integer, integer number <= 254
s   2-byte integer, only for length field before LCHR or LRAW
P   Packed number
F   Floating point number to accuracy of 8 bytes
g   Character string with variable length (ABAP type STRING)
y   Byte sequence with variable length (ABAP type XSTRING)
u   Structured type, flat
v   Structured type, deep
h   Table type
V   Character string (old Dictionary type VARC)
r   Reference to class/interface
l   Reference to data object
a   Decimal Floating Point Number, 16 Digits
e   Decimal Floating Point Number, 34 Digits
j   Static Boxed Components
k   Generic Boxed Components

image031

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.
    gt_fieldcat
-edit = 'X'.
   
if &1 = 'CURR'.
     
"對於金額字段,需要設置為 CURR 數據庫字典類型
      gt_fieldcat
-datatype = 'CURR'.
   
endif.
   
if &1 = 'P'.
     
"對於小數,需要設置為 QUAN 數據庫字典類型
      gt_fieldcat
-datatype = 'QUAN'.
     
"除此之外,還需要將inttype類型設置為C類型。另外,按理來說要設置為P類型的,但
“發現不行,QUAN類型映射為 C類型??
      gt_fieldcat
-inttype = 'C'.
   
endif.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'CURR' 'CURR' .
  fill_fdcat
'INT' 'INT' .
  fill_fdcat
'P' 'P(3.2)' .

 
DATA: i_grid_settings TYPE  lvc_s_glay .
 
"單元格內容修改后立即更新到輸出內表中
  i_grid_settings
-edt_cll_cb  = 'X' .
 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      i_callback_program
= sy-repid
      it_fieldcat       
=
gt_fieldcat[]
      i_grid_settings   
=
i_grid_settings
   
TABLES

      t_outtab          
= gt_data[].
 
READ TABLE gt_data INDEX 1.
 
WRITE:/ gt_data-curr,gt_data-int,gt_data-p.

FORM inital .
  gt_data
-curr = 1.
  gt_data
-int = 1.
  gt_data
-p = 1.
 
APPEND gt_data.
ENDFORM.

排序、匯總

GRIDALV排序、分類匯總

排序之前,如果同一列有相同的數據,則排好序以后,在該列會自動將相同的數據合並為一行顯示,不再出現多行重復的情況(但是若該ALV中有字段設置了“可編輯”,合並這一現象會失效

只要某字段參設置了gt_sort-down/up,則在展示時,排序以后垂直的網格中相鄰相同的單元格就會合並起來(即分類合並,如果要避免合並,請在布局中設置"no_merging""X"),而不是看是否設置了gt_sort-subtot屬性(該設置只會決定是否進行大匯總與分類小計):

  gt_sort-spos = '2'."排序的順序,如果根據多個字段來排時,決定哪個先排
  gt_sort
-fieldname = 'KEY2'.
  gt_sort
-down = 'X'."降序
* gt_sort-subtot    = 'X'.

 
APPEND gt_sort.

image032

雖然INT1INT2設置了gt_fieldcat-do_sum屬性,但沒有設置gt_sort-subtot,所以沒有進行分類小計,只是對整列進行了合計(如需分類小計,則需要設置gt_sort-subtot):

"需要進行統計的字段:INT1INT2
   
if &1 = 'INT1' or &1 = 'INT2'.
      gt_fieldcat
-do_sum = 'X'.
   
endif.
gt_sort-spos = '2'."
排序的順序,如果根據多個字段來排時,決定哪個先排
  gt_sort
-fieldname = 'KEY2'.
  gt_sort
-down = 'X'."降序
 
APPEND gt_sort.

image033

設置gt_sort-subtot后,才會對該列進行分類小計:

"需要進行統計的字段:INT1INT2
   
if &1 = 'INT1' or &1 = 'INT2'.
      gt_fieldcat
-do_sum = 'X'.
   
endif.
  gt_sort-spos = '2'."
排序的順序,如果根據多個字段來排時,決定哪個先排
  gt_sort
-fieldname = 'KEY2'.
  gt_sort
-down = 'X'."降序
*  "是否需要以此字段進行分類合並、並進行小計(注:與本列是否參與排序無關系,只要設置此屬性
*  "
就進行分類合並且小計,但如果設置了按其他列排序,則會對此列分類合並有影響——即
*  "
相同類型的單格不一定會合並成一個單元格,可能會合並出多個),另外,小計的前提條件是要對gt_fieldcat-do_sum進行了設置
  gt_sort
-subtot    = 'X'.
 
APPEND gt_sort.

image034

根據KEY1KEY2多列進行排序且小計:

image035

下面是完整代碼:

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,
  key1
(1),
  key2
(2),
  str
(3),
  int1
TYPE i,
  int2
TYPE i,
  int3
TYPE i,
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
    gt_fieldcat
-key = &3.
   
"需要進行分類小計及匯總的字段:INT1INT2
    if &1 = 'INT1' or &1 = 'INT2'.
"決定此列是否進行分類匯總與大匯總。注:如果不設置gt_sort-subtot,則只有大匯總,不會進行分類小匯總(分類小計前提除了需要對要對gt_sort-subtot 進行了設置,還需要對gt_fieldcat-do_sum進行設置)
      gt_fieldcat-do_sum = 'X'. "如果此參數也不設置的話,則大匯總與小匯總都沒有
   
endif.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'KEY1' 'KEY1' 'X'.
  fill_fdcat
'KEY2' 'KEY2' 'X'.
  fill_fdcat
'STR' 'STR' ''.
  fill_fdcat
'INT1' 'INT1' ''.
  fill_fdcat
'INT2' 'INT2' ''.
  fill_fdcat
'INT3' 'INT3' ''.

 
"* alv sort
  gt_sort
-spos = '1'."排序的順序,如果根據多個字段來排時,決定哪個先排
  gt_sort
-fieldname = 'KEY1'.
  gt_sort
-up = 'X'."升序,如果不指定排序(即gt_sort-upgt_sort-down都沒設置時),默認為升序
 
"是否需要以此字段進行分類小計
  gt_sort
-subtot    = 'X'.
 
APPEND gt_sort.
  gt_sort
-spos = '2'."排序的順序,如果根據多個字段來排時,決定哪個先排
  gt_sort
-fieldname = 'KEY2'.
  gt_sort
-down = 'X'."降序
  gt_sort
-subtot    = 'X'.
 
APPEND gt_sort.

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
"i_callback_program = sy-repid
注:
      it_fieldcat
= gt_fieldcat[]
      it_sort    
=
gt_sort[]
   
TABLES

      t_outtab   
= gt_data.

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aaa'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 1.
  gt_data
-int3 = 8.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aab'.
  gt_data
-int1 = 3.
  gt_data
-int2 = 2.
  gt_data
-int3 = 7.
 
APPEND gt_data.

  gt_data
-key1 = 'c'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aab'.
  gt_data
-int1 = 4.
  gt_data
-int2 = 2.
  gt_data
-int3 = 6.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'ab'.
  gt_data
-str = 'aba'.
  gt_data
-int1 = 6.
  gt_data
-int2 = 1.
  gt_data
-int3 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'ab'.
  gt_data
-str = 'abb'.
  gt_data
-int1 = 3.
  gt_data
-int2 = 4.
  gt_data
-int3 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'e'.
  gt_data
-key2 = 'ca'.
  gt_data
-str = 'eca'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 2.
  gt_data
-int3 = 4.
 
APPEND gt_data.

  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'ba'.
  gt_data
-str = 'bba'.
  gt_data
-int1 = 8.
  gt_data
-int2 = 5.
  gt_data
-int2 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'bb'.
  gt_data
-str = 'bbb'.
  gt_data
-int1 = 1.
  gt_data
-int2 = 2.
  gt_data
-int3 = 4.
 
APPEND gt_data.

  gt_data
-key1 = 'c'.
  gt_data
-key2 = 'ca'.
  gt_data
-str = 'cca'.
  gt_data
-int1 = 5.
  gt_data
-int2 = 1.
  gt_data
-int2 = 3.
 
APPEND gt_data.

  gt_data
-key1 = 'c'.
  gt_data
-key2 = 'cc'.
  gt_data
-str = 'ccc'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 1.
  gt_data
-int3 = 5.
 
APPEND gt_data.

  gt_data
-key1 = 'd'.
  gt_data
-key2 = 'ca'.
  gt_data
-str = 'dca'.
  gt_data
-int1 = 4.
  gt_data
-int2 = 6.
  gt_data
-int3 = 2.
 
APPEND gt_data.
ENDFORM.

小分類分隔方式(GROUP = */UL),僅適用於LIST輸出的ALV

gt_sort-group = '*/UL'只在REUSE_ALV_LIST_DISPLAY列表方式輸出時起作用,對  "REUSE_ALV_GRID_DISPLAY網格輸出方式不起作用

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,
  key1
(1),
  key2
(2),
  str
(3),
  int1
TYPE i,
  int2
TYPE i,
  int3
TYPE i,
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
    gt_fieldcat
-key = &3.
   
"需要進行統計的字段:INT1INT2
   
if &1 = 'INT1' or &1 = 'INT2'.
      gt_fieldcat
-do_sum = 'X'.
   
endif.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'KEY1' 'KEY1' 'X'.
  fill_fdcat
'KEY2' 'KEY2' 'X'.
  fill_fdcat
'STR' 'STR' ''.
  fill_fdcat
'INT1' 'INT1' ''.
  fill_fdcat
'INT2' 'INT2' ''.
  fill_fdcat
'INT3' 'INT3' ''.

 
"* alv sort
  gt_sort
-spos = '1'.
  gt_sort
-fieldname = 'KEY1'.
  gt_sort
-up = 'X'.
  gt_sort
-subtot    = 'X'.
  "小分類之間如何分隔,注:只在REUSE_ALV_LIST_DISPLAY列表方式輸出時起作用,對
  "REUSE_ALV_GRID_DISPLAY
網格輸出方式不起作用。
  "*
:小分類之間用分頁符分開,即小分類之間完全隔斷
  "UL
:小分類之間不隔斷,而是使用下划線分隔
  gt_sort-group = '*'.
  APPEND gt_sort.

  gt_sort
-spos = '2'.
  gt_sort
-fieldname = 'KEY2'.
  gt_sort
-down = 'X'.
  gt_sort
-subtot    = 'X'.

 
gt_sort-group = '*'.
 
APPEND gt_sort.

 
CALL FUNCTION
'REUSE_ALV_LIST_DISPLAY'
   
EXPORTING
      
"i_callback_program = sy-repid 注:
      it_fieldcat
= gt_fieldcat[]
      it_sort    
=
gt_sort[]
   
TABLES

      t_outtab   
= gt_data.

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aaa'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 1.
  gt_data
-int3 = 8.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aab'.
  gt_data
-int1 = 3.
  gt_data
-int2 = 2.
  gt_data
-int3 = 7.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'ab'.
  gt_data
-str = 'aba'.
  gt_data
-int1 = 6.
  gt_data
-int2 = 1.
  gt_data
-int3 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'ab'.
  gt_data
-str = 'abb'.
  gt_data
-int1 = 3.
  gt_data
-int2 = 4.
  gt_data
-int3 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'ba'.
  gt_data
-str = 'bba'.
  gt_data
-int1 = 8.
  gt_data
-int2 = 5.
  gt_data
-int2 = 2.
 
APPEND gt_data.
ENDFORM.

無分隔時(不設置gt_sort-group)

image036

線分隔(gt_sort-group = 'UL')

image037

分頁方式分隔(gt_sort-group = '*')

image038

表頭信息說明

可以通過兩種回調方式來實現,第一種:直接通過REUSE_ALV_GRID_DISPLAY函數的i_callback_html_top_of_page來回調Form;第二種:通過REUSE_ALV_GRID_DISPLAY函數的it_events參數接口,向事件內表中Append事件top_of_page與對應的Form

i_callback_html_top_of_page參數回調接口

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      it_fieldcat                
= fieldcat[]
      i_callback_program         
= sy-
repid
    
 i_callback_html_top_of_page 
= 'HTML_TOP_OF_PAGE'
   
TABLES
      t_outtab                   
= t_stock[].

FORM html_top_of_page USING r_ddoc TYPE REF TO cl_dd_document.
 
DATA: text TYPE sdydo_text_element.
 
CALL METHOD r_ddoc->initialize_document.
 
CALL METHOD r_ddoc->add_text"控制輸出字體為粗體
   
EXPORTING
    
text = '行狀態圖標含義'
     sap_emphasis
= 'STRONG'.

 
DEFINE write_inf.
   
call method r_ddoc->new_line."換行
   
call method r_ddoc->add_icon"輸出圖標
     
exporting
        sap_icon
= &1.
   
call method r_ddoc->add_text"輸出文本
     
exporting
       
text = &2.
 
END-OF-DEFINITION.

  write_inf
'ICON_GREEN_LIGHT' ':商品可用庫存'."表頭輸出的圖標及類型
  write_inf
'ICON_RED_LIGHT' ':商品非可用庫存'.
ENDFORM.  

image039

top_of_page事件

使用 i_callback_html_top_of_page參數創建的ALV頭不可打印,而使用REUSE_ALV_COMMENTARY_WRITETOP_OF_PAGE事件中輸出的頭可以打印,但SLIS_T_LISTHEADER-INFO只有60位,有一定的局限性,但可采用另一種而向對象方式來實現解決

image040

TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gt_event TYPE slis_t_event WITH HEADER LINE,
      gt_comment
TYPE slis_t_listheader WITH HEADER LINE.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
(1),
  key2
(2),
  str
(3),
  int1
TYPE i,
  int2
TYPE i,
  int3
TYPE i,
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
PERFORM frm_set_event.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
    gt_fieldcat
-key = &3.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'KEY1' 'KEY1' 'X'.
  fill_fdcat
'KEY2' 'KEY2' 'X'.
  fill_fdcat
'STR' 'STR' ''.
  fill_fdcat
'INT1' 'INT1' ''.
  fill_fdcat
'INT2' 'INT2' ''.
  fill_fdcat
'INT3' 'INT3' ''.

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      i_callback_program
= sy-repid
      it_fieldcat       
=
gt_fieldcat[]
      it_events         
=
gt_event[]
   
TABLES

      t_outtab          
= gt_data.

 
"取全部的事件,並且更改處理頁眉頁腳的事件的FORM的值
FORM frm_set_event .
 
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
   
EXPORTING
      i_list_type
= 0
   
IMPORTING
      et_events  
= gt_event[].
 
READ TABLE gt_event WITH KEY name = slis_ev_end_of_list .
 
IF sy-subrc = 0.
   
"頁尾輸出觸發事件時所回調的Form
    gt_event
-form = 'ALV_END_OF_LIST'.
   
MODIFY gt_event INDEX sy-tabix.
 
ENDIF.

 
READ TABLE gt_event WITH KEY name = slis_ev_top_of_page.
 
IF sy-subrc = 0.
   
"頁眉輸出觸發事件時所回調的Form
    gt_event
-form = 'ALV_TOP_OF_PAGE'.
   
MODIFY gt_event INDEX sy-tabix.
 
ENDIF.
 
"DELETE gt_event WHERE form IS INITIAL.
ENDFORM.

"頁眉觸發時所回調Form
FORM alv_top_of_page.
 
DATA:lr_rows TYPE REF TO cl_salv_form_layout_grid,
        lr_grid_rows
LIKE lr_rows,
        lr_row
TYPE REF TO cl_salv_form_layout_flow,
        lr_logo
TYPE REF TO cl_salv_form_layout_logo.

 
DATA: l_row TYPE i VALUE '1'.
 
CREATE OBJECT lr_rows.
 
CREATE OBJECT lr_logo.

 
"相當於 H(header)
  lr_row
= lr_rows->add_row( )."創建行對象
  lr_row
->create_header_information( text = '表頭(字體加粗加大,長度無限制)' )."為行對象設置表頭信息

  lr_row
= lr_rows->add_row( )."空一行

  lr_row
= lr_rows->add_row( ).
  lr_grid_rows
= lr_row->create_grid( )."使行對象具有網格模式,即可以行列來定位
 
"相當於 S(selection) 下面為為單元格來填充內容
  lr_grid_rows
->create_label( row = l_row column = 1 text = '標簽1(字體加粗,長度無限制):'). "Key
  lr_grid_rows
->create_textrow = l_row column = 2 text = '標簽說明1(正常字體,長度無限制)' )."Info
  lr_grid_rows
->create_textrow = l_row column = 3 text = '標簽說明2(正常字體,長度無限制)' )."Info
  l_row
= l_row + 1.
 
"為網格下一行填充內容
  lr_grid_rows
->create_label( row = l_row column = 1 text = '標簽2(字體加粗,長度無限制):').

  lr_row
= lr_rows->add_row( ).

  lr_row
= lr_rows->add_row( ).
 
"相當於 A(action)
  lr_row
->create_action_information( text = '信息(字體斜體,長度無限制)' ).

 
"下面新增logo,左邊為上面創建的文本內容,右邊為指定的 logo 圖標
  lr_logo
->set_left_content( lr_rows ).
  lr_logo
->set_right_logo( 'ENJOYSAP_LOGO' ).

 
"最后將組織好的內容設置進去
  cl_salv_form_content
=>set( lr_logo ).

*================下面是另一種實現,但輸出長度有局限性,所以最好采用上面方式
*  REFRESH gt_comment.
*  CLEAR gt_comment.
*  "typ的取值為:"H=Header, S=Selection, A=Action
*  "H
:表示輸出內容為列表頭。通常只有一行(但可以有多行),此時KEY不會輸出,
*  "  
只有INFO值才會輸出。字體會加粗加大,左對齊
*  "S
:表示輸出內容為字段型說明,即針對某個詞進行說明,分兩列(KEY--INFO)輸出。
*  "  
通常有多個,且每行中只允許一對。此時KEYINFO都會輸出。Key字段會加粗,INFO正常
*  "  
均左對齊輸出。
*  "A
:表示輸出內容為提示說明性文字。通常只有一行(但可以有多行)。此時KEY不會輸出,
*  "  
只有INFO值才會輸出。字粗為斜體
*  "  
左對齊輸出。
*  "
同時有 HSA時,會按照 HSA的先后順序輸出(而不管向內表APEPEND的順序)
*  "
,且HSA之間會使用空行分隔,但它們各自內部(類型相同的行)之間不會輸出空行
*  "
*  "
另外,由於keyinfo字段長度都有限制(2060),所以超出此寬度的長度無法輸出,此時
*  "
只能采用另一種面向對象的方式來輸出,請參考上面的部分
*  gt_comment-typ  = 'H'.
*  gt_comment-key  = space."A類型時,Key不會輸出
*  gt_comment-info = '表頭(字體加粗加大,長度限制在60個字符)'.
*  APPEND gt_comment TO gt_comment.
*
*  CLEAR gt_comment.
*  gt_comment-typ  = 'S'.
*  gt_comment-key  = '標簽(字體加粗,長度限制在20個字符):'.
*  gt_comment-info = '標簽說明(正常字體,長度限制在60個字符)'.
*  APPEND gt_comment TO gt_comment.
*
*  CLEAR gt_comment.
*  gt_comment-typ  = 'A'.
*  gt_comment-key  = space."A類型時,Key不會輸出
*  gt_comment-info = '信息(字體斜體,長度限制在60個字符)'.
*  APPEND gt_comment TO gt_comment.
*  CLEAR gt_comment.
*
*  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
*    EXPORTING
*      it_list_commentary = gt_comment[]
*      i_logo             = 'ENJOYSAP_LOGO'." 輸出圖標
ENDFORM.

"頁腳觸發時所回調Form
FORM alv_end_of_list .
 
PERFORM alv_top_of_page.
ENDFORM.
FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aaa'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 1.
  gt_data
-int3 = 8.
 
APPEND gt_data.
ENDFORM.

ALV-F4-Layout、布局變式切換捕獲(動態訪問函數中定義的全局變量)

REUSE_ALV_GRID_DISPLAY函數的i_save參數值決定了ALV的布局相關的變式,是否可修改及是否只用於特定用戶:
' ' = Display variants cannot be saved顯示變式,但不能修改,此為默認值
'X' = Standard save mode
標准的保存模式,此模式下變式可存儲為標准的變式,但不能存儲為用戶模式
'U' = User-specific save mode
用戶保存模式,哪個創建,只能哪個來用
'A' = Standard and user-specific save mode
標准與用戶模式,此模式下可以選擇存儲為標准還是用戶變式

image041這三個按鈕分配是布局修改、布局選擇、布局保存,如果不輸入或輸入空時,沒有保存布局image042按鈕,如 i_save = 'X'情況下創建創建布局變式:

image043

i_save = 'U'情況下創建創建布局變式:

image044

i_save = 'A'情況下創建創建布局變式:

image045

當創建完上面三個模式的布局變式時,選擇布局時,看到的情況如下:

image046

另外,在創建布局變式時,可以選擇是否將某個布局變式設設置為默認的布局,這樣在REUSE_ALV_GRID_DISPLAY函數調用時,沒有傳遞is_variant 時,會默認采用此處設置的默認布局,另外默認布局還可以被REUSE_ALV_VARIANT_DEFAULT_GET函數讀取出來:

image047

該程序實現了屏幕上選擇Layout、獲取默認的Layout、檢查輸入的Layout變式是否存在,獲取當前使用的Layout中的顯示字段與顯示的順序

image048

TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gs_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(4),"用來存儲顏色
 
END OF lt_stock.
DATA: gx_variant         LIKE disvariant.
DATA: g_variant          LIKE disvariant.
PARAMETERS: p_varit TYPE disvariant-variant.

INITIALIZATION.
 
PERFORM inital.

 
CLEAR: gx_variant.
  gx_variant
-report = sy-repid.
 
CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
   
EXPORTING
      i_save       
= 'A'
   
CHANGING
      cs_variant   
= gx_variant
   
EXCEPTIONS

      error_message
= 1.
  p_varit
= gx_variant-variant.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_varit.
 
CLEAR: g_variant.
  g_variant
-report = sy-repid.
 
DATA: e_exit.
 
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
   
EXPORTING
      is_variant   
= g_variant
      i_save       
= 'A'

   
IMPORTING
      e_exit       
= e_exit "用戶是否關掉了對話框
      es_variant   
= gx_variant"返回用戶選擇的Layout
   
EXCEPTIONS
      error_message
= 1.
  p_varit
= gx_variant-variant.

AT SELECTION-SCREEN ON p_varit.

 
CHECK p_varit is NOT INITIAL.
  g_variant
-report  = sy-repid.
  g_variant
-variant = p_varit.

 
"判斷界面上用戶所輸入的布局變式名是否存在
 
CALL FUNCTION 'LVC_VARIANT_EXISTENCE_CHECK'
   
EXPORTING
      i_save    
= 'A'
   
CHANGING
      cs_variant
= g_variant
   
EXCEPTIONS

      not_found
      =1
.
 
IF sy-subrc = 1.
   
MESSAGE '布局變式名不存在' TYPE 'W'.
 
ENDIF.

START-OF-SELECTION.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1. "需要顯示的內表行結構中的哪個字段
    gt_fieldcat
-seltext_l = &2. "ALV顯示時標題欄中的文本
    gt_fieldcat
-key = &3. "是否是關鍵字段,如果是則單元格顯示的顏色會不同,並會靠前顯示
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'WERKS' '工廠' 'X'.
  fill_fdcat
'MATNR' '物料' 'X'.
  fill_fdcat
'LABST' '庫存' ''.
  fill_fdcat
'INT' '自定義字段' ''.

 
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參數一定要加上,不然即使設置了i_save,也不會出現布局選擇與保存按鈕
     i_callback_program     
= sy-repid
      it_fieldcat             =
gt_fieldcat[]
      i_save                 
= 'A'

      i_callback_user_command
= 'USER_COMMAND1'
      it_event_exit          
= event_exit[]
      is_variant             
= g_variant "ALV
展示時,所使用的布局變式名。如果不存在,按默認來
   
TABLES
      t_outtab               
= lt_stock.

FORM user_command1  USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
 
CASE  r_ucomm.
     
"當點擊選擇布局按鈕時執行
   
WHEN '&OAD'."不知道為什么,&OAD功能(選擇布局變式時)執行了兩次?其他保留Funcode又是正常的編程時需注意
      
FIELD-SYMBOLS: <alv_grid> TYPE REF TO cl_gui_alv_grid.
      DATA: l_variant LIKE disvariant.
注:不能動態訪問某個函數中定義的變量,這與報表程序中定義的變量是不一樣的。這里需要動態訪問gt_grid變量,所以不能這樣訪問:(REUSE_ALV_GRID_DISPLAY)gt_grid來動態訪問,跟蹤gt_grid變量時,發現是在LSLVC_FULLSCREENTOP Include文件中定義的,該文件又是被REUSE_ALV_GRID_DISPLAY函數所在函數組SLVC_FULLSCREEN所對應主程序SAPLSLVC_FULLSCREEN所包含進來,所以只能通過函數所在的函數組所對應主程序來動態訪問:(SAPLSLVC_FULLSCREEN)gt_grid-grid
      
ASSIGN ('(SAPLSLVC_FULLSCREEN)gt_grid-grid') TO <alv_grid>."動態獲取ALV所對應的ALV OO實例
      "獲取當前切換的布局變式,l_variant用來接收 ALV Grid當前切換的變式布局名
      <alv_grid>
->get_variant( IMPORTING es_variant = l_variant ).
另外,除了像上面這樣通過程序動態提示外,還可以通過GET_GLOBALS_FROM_SLVC_FULLSCR函數來獲取,具體請參考這里
     
DATA:p_fieldcat_tab TYPE slis_t_fieldcat_alv, p_exit.
     
"當知道當前用戶所選擇的布局變式后,再通過函數 REUSE_ALV_VARIANT_SELECT 可以
     
"得到布局變式所對應的布局具體信息,如哪些字段顯示、字段顯示的順序如何等,當得到這些
     
"布局信息后,可以用在用戶在導出ALV數據到文件時使用,這樣可以保持ALV顯示的布局與
     
"導出去的文件顯示的哪些內容及字段順序體質一致
     
CALL FUNCTION 'REUSE_ALV_VARIANT_SELECT'
       
EXPORTING         
         
"X時會彈出當前布局變式列表框,這里只是想借助此函數來讀取當前布局變式所對應的
         
"詳細布局信息,所以不需要彈出對話框,讓其在后台運行
          i_dialog           
= ' '
          i_user_specific    
= 'X'" U類型的Layout也會顯示出來
          it_default_fieldcat
= gt_fieldcat[]
         
i_layout           
= gs_layout
       
IMPORTING         
         
" i_dialog X(即彈出框時)設置才有意義,作用是判斷用戶在對話框中點擊的確認還是取消
         
"X時,表示用戶點擊的是取消按鈕
          e_exit             
= p_exit
         
"
可以根據返回的p_fieldcat_tab,得到當前ALV所使用的布局變式所對應的Layout情況,如
         
"ALV數據下載成文件時需要與當前Layout布局一樣:輸出相同的字段與順序,可以根據
         
"p_fieldcat_tab NO_OUT(控制是否輸出)、COL_POS(控制順序)來控制,文件表頭可取
         
"seltext_lseltext_mseltext_s。可用於導出文件布局
          et_fieldcat        
= p_fieldcat_tab[]
       
CHANGING

          cs_variant         
= l_variant."傳入的布局布局變式名'

     
"""""""下面就是對 p_fieldcat_tab[] 內表字段結構進行分析及應用了
     
....
 
ENDCASE.
ENDFORM.

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.

image049

image050

紅綠燈layout-lights_fieldname

image051

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,
  light
(1), "信息燈列
  val
(1),
  sel
, "選擇列
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
   
"請注意:這里一定要設置一下ddictxt,否則light列標題將顯示為Exception
    gt_fieldcat-ddictxt = &3.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'LIGHT' '紅綠燈'  'L'.
  fill_fdcat
'VAL' ''  'L'.

  gs_layout
-lights_fieldname  = 'LIGHT'."指定燈列名

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      it_fieldcat
= gt_fieldcat[]
      is_layout  
=
gs_layout
   
TABLES

      t_outtab   
= gt_data.

FORM inital .
  gt_data
-light = ' '."
取值范圍為:空、1~3
  gt_data
-val = ''.
 
APPEND gt_data .

  gt_data
-light = '1'.
  gt_data
-val = '1'.
 
APPEND gt_data .

  gt_data
-light = '2'.
  gt_data
-val = '2'.
 
APPEND gt_data .

  gt_data
-light = '3'.
  gt_data
-val = '3'.
 
APPEND gt_data .
ENDFORM.

F4幫助

image052
TYPE-POOLS:slis.
DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

DATA:BEGIN OF t_stock OCCURS 0,
  werks
LIKE mard-werks,"工廠
  matnr
LIKE mara-matnr,"物料
 
END OF t_stock.

INITIALIZATION.
 
PERFORM inital.

START-OF-SELECTION.

 
DEFINE fill_fdcat.
   
clear fieldcat.
    fieldcat
-fieldname = &1.
    fieldcat
-seltext_l = &2.
    fieldcat
-key = &3.
   
"如果不設為可編輯,則F4幫助只能看,不能選
    fieldcat
-edit = 'X'.
   
if &1  = 'WERKS'.
      fieldcat
-ref_tabname   = 'MARD'. "F4幫助,參照的表
      fieldcat
-ref_fieldname = 'WERKS'."F4幫助,參照的表中哪個字段
   
endif.
   
append fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'WERKS' 'WERKS' ''.
  fill_fdcat
'MATNR' 'MATNR' ''.

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      it_fieldcat
= fieldcat[]
   
TABLES

      t_outtab   
= t_stock.

FORM inital .
  t_stock
-werks = '1001'.
  t_stock
-matnr = '1001M1'.
 
APPEND t_stock .
ENDFORM.

行多選按鈕、復選框

image053
注:按住CTRL鍵可以選擇多行

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_stock OCCURS 0,
  sel
,"用來做選擇按鈕列image054
 
checkbox,"用作復選框列image055
  werks
LIKE mard-werks,"工廠
  matnr
LIKE mara-matnr,"物料
 
END OF gt_stock.

INITIALIZATION.
 
PERFORM inital.

START-OF-SELECTION.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
    gt_fieldcat
-key = &3.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'WERKS' '工廠' 'X'.
  fill_fdcat
'MATNR' '物料' 'X'.
 
"==========復選框設置
 
CLEAR gt_fieldcat.
  gt_fieldcat
-seltext_l = '復選框'.
  gt_fieldcat
-fieldname = 'SEL'.
"
當用戶點擊復選框后,如需將數據更新到輸出內表中,則需對REUSE_ALV_GRID_DISPLAY函數參數i_grid_settings-edt_cll_cb進行設置
  gt_fieldcat
-checkbox = 'X'.
 
APPEND gt_fieldcat.

  gs_layout
-box_fieldname = 'CHECKBOX'."行多選擇按鈕設置

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      it_fieldcat
= gt_fieldcat[]
      is_layout  
=
gs_layout
   
TABLES

      t_outtab   
= gt_stock.

FORM inital .
  gt_stock
-sel = 'X'.
  gt_stock
-checkbox = 'X'.
  gt_stock
-werks = '1001'.
  gt_stock
-matnr = '1001M1'.
 
APPEND gt_stock .

 
CLEAR:gt_stock.
  gt_stock
-sel = 'X'.
  gt_stock
-werks = '1001'.
  gt_stock
-matnr = '1001M2'.
 
APPEND gt_stock .
ENDFORM.

ALV報表標題

image056

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      it_fieldcat
=
gt_fieldcat[]
      i_grid_title = 'ALV
報表標題'
   
TABLES
      t_outtab   
= gt_data.

熱點

image057


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,
  key1
(1),
  key2
(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.
    gt_fieldcat
-key = &3.

 
  
gt_fieldcat-hotspot = 'X'.
    append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'KEY1' 'KEY1' 'X'.
  fill_fdcat
'KEY2' 'KEY2' 'X'.

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      i_callback_program     
= sy-repid
      it_fieldcat            
=
gt_fieldcat[]
      i_callback_user_command
= 'USER_COMMAND'

   
TABLES
      t_outtab               
= gt_data[].

FORM user_command  USING r_ucomm LIKE sy-ucommrs_selfield TYPE slis_selfield.
 
MESSAGE i001(00) WITH '熱點觸發事務碼:r_ucomm.
ENDFORM.

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.


免責聲明!

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



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