一个OO-ALV的通例子

*& Report  ZMYTEST003
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

report  zmytest003.
type-pools: icon.
class lcl_event_receiver definition deferred.

tables: sflight.

data:
gi_index_rows type lvc_t_row,
g_selected_row like lvc_s_row.
data: gt_fieldcat type lvc_t_fcat,
      wa_fieldcat type lvc_s_fcat,
      tmp_fieldcat type lvc_t_fcat,
gs_layout type lvc_s_layo.

data:
o_event_receiver type ref to lcl_event_receiver.
data:zcw type  lvc_t_cell,
     wa_cw type lvc_s_cell.


data:m1_flag type i value 1.           "手工输入的开关

data:zd type sflight.

data:zkey(1) type c.
data:zc type string.
data:ztext type string.
    data:l_lines type i.
    data:zrow_no type lvc_t_roid,
         zno1 type lvc_s_roid.

*****************************定义类
class lcl_event_receiver definition.
   public section.
    methods:
     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,

****************************************以下 定义的方法必要的时候可激活
*Hotspot click control
handle_hotspot_click
for event hotspot_click of cl_gui_alv_grid
importing e_row_id e_column_id es_row_no ,

*Double-click control
handle_double_click
for event double_click of cl_gui_alv_grid
importing e_row e_column es_row_no,

*To be triggered before user commands
handle_before_user_command
for event before_user_command of cl_gui_alv_grid
importing e_ucomm,


*Controlling data changes when ALV Grid is editable
handle_data_changed
for event data_changed of cl_gui_alv_grid
importing er_data_changed ,

*To be triggered after data changing is finished
handle_data_changed_finished
for event data_changed_finished of cl_gui_alv_grid
importing e_modified ,


*To control menu buttons
handle_menu_button
for event menu_button of cl_gui_alv_grid
importing e_object e_ucomm .

endclass.

data: tab_toolbar type  ttb_button,
          no_toolbar type stb_button..

types: begin of st_sflight.
        include structure sflight.
types:  traffic_light type c.
types:  line_color(4) type c.
types: ptype_dd_hndl type int4 .
types: cellstyles type lvc_t_styl.
types: end of st_sflight.

data:g_wa_sflight type st_sflight.
data:it_sflight like table of sflight,
     wa_sflight like sflight.
data: gi_sflight type standard table of st_sflight.
data: ok_code like sy-ucomm.


data:
     go_grid             type ref to cl_gui_alv_grid,
     go_custom_container type ref to cl_gui_custom_container.


*****************************" 选择屏幕窗口对像表结构表
tables sscrfields.
selection-screen:
           begin of line,
             pushbutton 2(10) s1 user-command c1,
             pushbutton 12(10) s2 user-command c2,
           end of line.


**************************为下拉列表的定义
type-pools: vrm.
data: it_val type vrm_values,
      w_line like line of it_val.
*****************************




initialization.
**********************初始下拉列表
w_line-key = '1'.
w_line-text = '销售部'.
append w_line to it_val.
clear w_line.
w_line-key = '2'.
w_line-text = '国贸部'.
append w_line to it_val.
clear w_line.
w_line-key = '3'.
w_line-text = '洁具 销售部'.
append w_line to it_val.
clear w_line.
call function 'VRM_SET_VALUES'
  exporting            id     = 'zsxdw'
                       values = it_val.
*************************按钮初始化
      s1 = '按钮1'.
      s2 = '按钮2'.


select-options:zid for sflight-carrid.
select-options:zcoid for sflight-connid.
parameter:zsxdw as listbox visible length 10.

***************************选择屏幕按钮的触发
  at selection-screen.
     case sscrfields-ucomm.
        when 'C1'.
          zid-low = 'AC'.
          zid-sign = 'I'.
          zid-option = 'EQ'.
          append zid.
          zsxdw = '1'.
       when 'C2'.
          zid-low = 'AF'.
          zid-sign = 'I'.
          zid-option = 'EQ'.
          clear zid[].
          append zid.
          zsxdw = '2'.
    endcase.



start-of-selection.


perform. get_data.

set screen '200'.


data: num1(4) type n value '800'."初始化窗口800。

*********************************************根据选择读下拉列表
read table it_val with key key = zsxdw into w_line.
zkey = w_line-key.
ztext =  w_line-text.

**********************************************************屏幕的输出处理
module status_0200 output.
  set pf-status 'ZSTANDARD'.
**********************************************初始 客户在标准屏幕上的控件
     if go_custom_container is initial.
       create object go_custom_container
         exporting container_name = 'ALV_CONTAINER'.
       create object go_grid
         exporting
           i_parent = go_custom_container.

       perform. load_data_into_grid.
     endif.

     create object o_event_receiver."创造事件对象
*************************************注册时间对象
    set handler o_event_receiver->handle_user_command for go_grid.
    set handler o_event_receiver->handle_toolbar for go_grid.
   set handler o_event_receiver->handle_menu_button for go_grid .
   set handler o_event_receiver->handle_double_click for go_grid .
   set handler o_event_receiver->handle_hotspot_click for go_grid .
*   SET HANDLER o_event_receiver->handle_button_click FOR go_grid .
   set handler o_event_receiver->handle_before_user_command for go_grid.
   set handler o_event_receiver->handle_data_changed for go_grid.
   set handler o_event_receiver->handle_data_changed_finished for
go_grid.

     call method go_grid->set_toolbar_interactive.
     call method cl_gui_control=>set_focus exporting control = go_grid.



endmodule.                 " STATUS_0100  OUTPUT

**********************************************************屏幕的输入处理
module user_command_0200 input.
     case ok_code.
       when 'EXIT' or 'BACK' or 'UP' or 'CANCEL'.
         leave to  screen 0.
       when 'ZZSAVE'.
         data :show_num type n.
show_num = zc.
message show_num type 'S'.
         perform. save_changes.


      when 'ZF'.
     show_num = zc.
message show_num type 'S'.
     endcase.
   endmodule.                 " USER_COMMAND_0100  INPUT

form. load_data_into_grid .
   data:
    l_layout type disvariant.
  l_layout-report = sy-repid.

loop at gi_sflight into g_wa_sflight.
      if g_wa_sflight-paymentsum < 1000.
        g_wa_sflight-traffic_light = '1'.
        g_wa_sflight-line_color    = 'C610'.
      elseif g_wa_sflight-paymentsum => 1000 and
             g_wa_sflight-paymentsum < 2000.
        g_wa_sflight-traffic_light = '2'.
      else.
        g_wa_sflight-traffic_light = '3'.
      endif.
      modify gi_sflight from g_wa_sflight.
endloop.



perform. prepare_field_catalog changing gt_fieldcat .
perform. prepare_layout changing gs_layout .
perform. prepare_drilldown_values.

      go_grid->set_table_for_first_display(
        exporting
*          I_BUFFER_ACTIVE               = I_BUFFER_ACTIVE
*          I_BYPASSING_BUFFER            = I_BYPASSING_BUFFER
*          I_CONSISTENCY_CHECK           = I_CONSISTENCY_CHECK
          i_structure_name              = 'SFLIGHT'
*          IS_VARIANT                    = IS_VARIANT
          i_save                        = 'A'
*          I_DEFAULT                     = 'X'
          is_layout                     = gs_layout
*          IS_PRINT                      = IS_PRINT
*          IT_SPECIAL_GROUPS             = IT_SPECIAL_GROUPS
*          IT_TOOLBAR_EXCLUDING          = IT_TOOLBAR_EXCLUDING
*          IT_HYPERLINK                  = IT_HYPERLINK
*          IT_ALV_GRAPHICS               = IT_ALV_GRAPHICS
*          IT_EXCEPT_QINFO               = IT_EXCEPT_QINFO
*          IR_SALV_ADAPTER               = IR_SALV_ADAPTER
        changing
          it_outtab                     = gi_sflight
          it_fieldcatalog               = gt_fieldcat
*          IT_SORT                       = IT_SORT
*          IT_FILTER                     = IT_FILTER
             ).


endform.                    " load_data_into_grid


class lcl_event_receiver implementation.
  method handle_toolbar.
    constants:
      c_button_normal           type i value 0,
      c_menu_and_default_button type i value 1,
      c_menu                    type i value 2,
      c_separator               type i value 3,
      c_radio_button            type i value 4,
      c_checkbox                type i value 5,
      c_menu_entry              type i value 6.
    data:
        ls_toolbar  type stb_button,
        no_toolbar type stb_button.


    clear ls_toolbar.
    move c_separator to ls_toolbar-butn_type.
tab_toolbar = e_object->mt_toolbar.
**************************屏幕更新的时候  按钮 只添加一次。
read table tab_toolbar with key function = 'ZCHANGE' into no_toolbar.
if sy-subrc <> 0.
    clear ls_toolbar.
****************************添加按钮 函数
    move 'ZCHANGE'        to ls_toolbar-function.
    move  icon_change    to ls_toolbar-icon.
    move 'Change flight' to ls_toolbar-quickinfo.
    move '修改'        to ls_toolbar-text.
    move ' '             to ls_toolbar-disabled.
    append ls_toolbar  to e_object->mt_toolbar.
endif.
clear no_toolbar.
read table tab_toolbar with key function = 'ZSAVE' into no_toolbar.
if sy-subrc <> 0.
    clear ls_toolbar.
    move 'ZSAVE'        to ls_toolbar-function.
    move  icon_system_save    to ls_toolbar-icon.
    move '保存表里的 数据系统数据库' to ls_toolbar-quickinfo.
    move '保存到数据库'        to ls_toolbar-text.
    move ' '             to ls_toolbar-disabled.
    append ls_toolbar    to e_object->mt_toolbar.
endif.
read table tab_toolbar with key function = 'ZSELECTION' into no_toolbar.
if sy-subrc <> 0.
    clear ls_toolbar.
    move 'ZSELECTION'        to ls_toolbar-function.
    move '编辑列' to ls_toolbar-quickinfo.
    move '编辑列'        to ls_toolbar-text.
    move ' '             to ls_toolbar-disabled.
    append ls_toolbar    to e_object->mt_toolbar.
endif.
read table tab_toolbar with key function = 'ZINPUT' into no_toolbar.
if sy-subrc <> 0.
    clear ls_toolbar.
    move 'ZINPUT'        to ls_toolbar-function.
    move '手工输入' to ls_toolbar-quickinfo.
    move '手工输入'        to ls_toolbar-text.
    move ''             to ls_toolbar-disabled.
endif.
    append ls_toolbar    to e_object->mt_toolbar.
read table tab_toolbar with key function = 'ZREF' into no_toolbar.
if sy-subrc <> 0.
    clear ls_toolbar.
    move 'ZREF'        to ls_toolbar-function.
    move '刷新' to ls_toolbar-quickinfo.
    move '刷新'        to ls_toolbar-text.
    move  ''             to ls_toolbar-disabled.
    append ls_toolbar    to e_object->mt_toolbar.
endif.
endmethod.
method handle_user_command.
    case e_ucomm.
      when 'ZCHANGE'.
*        CALL FUNCTION 'ZCHANGE'.
***********************************************8判断是否选择行,没有则提示
       call method go_grid->get_selected_rows
        importing
         et_index_rows = gi_index_rows
         et_row_no = zrow_no.
       describe table gi_index_rows lines l_lines.
       if l_lines = 0.
              call function 'POPUP_TO_DISPLAY_TEXT'
               exporting
                  titel              = '操作提示! '
              textline1          = '请选择你要修改的行记录之后,'
              textline2          = '   再点“修改”按钮。'
             start_column       = 4
             start_row          = 4.
        exit.
        endif.

loop at gi_index_rows into g_selected_row.
     read table gi_sflight index g_selected_row-index into g_wa_sflight.
     move-corresponding g_wa_sflight to zd.
endloop.
leave to screen '200'.

   when 'ZSAVE'.
   describe table gi_index_rows lines l_lines.
   clear it_sflight.
   loop at gi_sflight into g_wa_sflight.
     move-corresponding g_wa_sflight to wa_sflight.
     append wa_sflight to it_sflight.
   endloop.
   modify sflight from table it_sflight.
   if sy-subrc = 0.
     message s000(zd003) with '保存成功!'.
   else.
     message e000(zd003) with '保存不成功!'.
   endif.

  when 'ZSELECTION'.
************************888框架操作
    go_grid->get_frontend_fieldcatalog(
      importing
        et_fieldcatalog = gt_fieldcat
           ).

     loop at gt_fieldcat into wa_fieldcat.
      if wa_fieldcat-fieldname = 'PRICE' .
      wa_fieldcat-edit = 'X' .
      modify gt_fieldcat from wa_fieldcat.
      endif .
    endloop .
    call method go_grid->set_frontend_fieldcatalog
     exporting
       it_fieldcatalog = gt_fieldcat .
     call method go_grid->refresh_table_display.
     call method cl_gui_cfw=>flush.

    data: zvalue type string.

     go_grid->get_selected_cells(
       importing
         et_cell = zcw
            ).
     loop at zcw into wa_cw.
       read table gi_sflight into g_wa_sflight index wa_cw-row_id.
       concatenate 'g_wa_sflight-' wa_cw-col_id into zvalue.
       message s000(zd003) with '你选择的值为:'  (zvalue).
     endloop.


  when 'ZINPUT'.
   perform. adjust_editables using gi_sflight.
   when 'ZREF'.
     loop at gi_sflight into g_wa_sflight.
          clear g_wa_sflight-cellstyles.
        modify gi_sflight from g_wa_sflight.
     endloop.
     m1_flag = 1.
     call method go_grid->refresh_table_display.
     call method cl_gui_cfw=>flush.

endcase.

  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 Before User Command
method handle_before_user_command .
*PERFORM. handle_before_user_command USING e_ucomm .
endmethod .

*Handle Data Changed
method handle_data_changed .
*PERFORM. handle_data_changed USING er_data_changed .
endmethod.

*Handle Data Changed Finished
method handle_data_changed_finished .
*PERFORM. handle_data_changed_finished USING e_modified .
endmethod .

*Handle Menu Buttons
method handle_menu_button .
*PERFORM. handle_menu_button USING e_object e_ucomm .
endmethod .
endclass.               "lcl_event_receiver


form. save_changes .
   data: l_traffic_light type c.
if zd-carrid <> '' and zd-connid <> '' and zd-fldate <> ''.
   move-corresponding zd to g_wa_sflight.
   modify gi_sflight index g_selected_row-index from g_wa_sflight.

     call method go_grid->refresh_table_display.
     call method cl_gui_cfw=>flush.
        clear zd.
else.
   message i000(zd003) with '请填写前三项!'.
endif.

endform.                    " save_changes

form. get_data .
     select *
       from sflight
       into corresponding fields of table gi_sflight
       where carrid in zid and connid in zcoid.
endform.                    " get_data
*&---------------------------------------------------------------------*
*&      Form  prepare_field_catalog
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GT_FIELDCAT  text
*----------------------------------------------------------------------*
form. prepare_field_catalog  changing pt_fieldcat type lvc_t_fcat .
data ls_fcat type lvc_s_fcat .
clear ls_fcat .
ls_fcat-fieldname = 'FLDATE' .
ls_fcat-ref_table = 'SFLIGHT' .
ls_fcat-ref_table = 'CONNID' .
ls_fcat-outputlen = '10' .
ls_fcat-emphasize = 'C410'.
ls_fcat-drdn_hndl = '1' .     " 设置为下拉表形式
*ls_fcat-EDIT = 'X'.
append ls_fcat to pt_fieldcat .
clear ls_fcat .
endform.                    " prepare_field_catalog
*&---------------------------------------------------------------------*
*&      Form  prepare_layout
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GS_LAYOUT  text
*----------------------------------------------------------------------*
form. prepare_layout  changing ps_layout type lvc_s_layo.
*************************************************布局设置
      ps_layout-grid_title = 'Flights'."ALV的标题
      ps_layout-excp_fname = 'TRAFFIC_LIGHT'.
      ps_layout-info_fname = 'LINE_COLOR'.
      ps_layout-zebra = 'X' .
      ps_layout-sel_mode = 'D'.
      ps_layout-stylefname = 'CELLSTYLES' .

endform.                    " prepare_layout

*--- Drilldown values
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 = '20080502' .
    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 .

go_grid->set_drop_down_table(
    it_drop_down       = lt_ddval
       ).

endform. " prepare_drilldown_values

form. handle_double_click using i_row type lvc_s_row i_column type
lvc_s_col is_row_no type lvc_s_roid.
data: zvalue type string.

read table gi_sflight into g_wa_sflight index is_row_no-row_id .
       concatenate 'g_wa_sflight-' i_column into zvalue.
       message s000(zd003) with '你双击的单元格值为:'  (zvalue).
endform. .
*&---------------------------------------------------------------------*
*&      Form  adjust_editables
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GI_SFLIGHT  text
*----------------------------------------------------------------------*
form. adjust_editables  using   pt_list like gi_sflight .
if m1_flag = 1.
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 .

if ls_listrow-carrid = 'AC' .
ls_stylerow-fieldname = 'FLDATE' .
ls_stylerow-style. = cl_gui_alv_grid=>mc_style_disabled .
append ls_stylerow to lt_styletab .
endif .
if ls_listrow-connid = '0455' .
ls_stylerow-fieldname = 'PAYMENTSUM' .
ls_stylerow-style. = cl_gui_alv_grid=>mc_style_enabled .
append ls_stylerow to lt_styletab .
endif .
clear ls_stylerow.
loop at lt_styletab  into ls_stylerow.
  append ls_stylerow to ls_listrow-cellstyles.
*INSERT LINES OF lt_styletab INTO ls_listrow-cellstyles .
  modify pt_list from ls_listrow .
endloop.

clear lt_styletab.
     call method go_grid->refresh_table_display.
     call method cl_gui_cfw=>flush.
endloop .
m1_flag = 0.
endif.

endform.                    " adjust_editables

你可能感兴趣的:(一个OO-ALV的通例子)