SAP ABAP ALV编程

时间:2015-10-21 05:49:50

标签: abap

我正在工作oops ALV,所以我创建了一个显示输出的屏幕,但我无法启用标准工具栏按钮(保存,退出,返回等)。所以 任何人都可以建议如何启用它。

我的代码是......

*&---------------------------------------------------------------------*
*& Report  ZREPT_OOPS_ALV_EDITABLE_PRA
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZREPT_OOPS_ALV_EDITABLE_PRA.

Data: it_zztstudent type STANDARD TABLE OF zztstudent,
      it_fcat TYPE STANDARD TABLE OF lvc_s_fcat,
      i_selected_rows TYPE lvc_t_row,
      w_selected_rows type lvc_s_row,
      it_modified type STANDARD TABLE OF zztstudent,
      lw_modified type zztstudent,
      lw_zztstudent type zztstudent,
      w_variant   TYPE disvariant,
      o_docking type REF TO cl_gui_docking_container,
      o_grid type ref to cl_gui_alv_grid.

FIELD-SYMBOLS: <fs_fieldcat> type lvc_s_fcat.
tables: zztstudent.
select-OPTIONS: sst_id for zztstudent-st_id.
select * from zztstudent
     into table it_zztstudent
     where st_id in sst_id.
if sy-subrc NE 0.
   message e001(zmsgpr).
ENDIF.

call screen 9000.

"PBO
Module status_9000 OUTPUT.
   if o_docking is initial.
     set PF-STATUS 'ZSTATUS'.
     set titlebar 'ZTITLE'.
   "Creating Docking Container and grid
   PERFORM create_object.
   "filling the fieldcatalog table
   PERFORM create_fieldcat.
   "Modifying the fieldcatalog table
   PERFORM modify_fieldcat.
   "Registering edit
   PERFORM register_edit.
   "displaying the output
   PERFORM display_output.
  ENDIF.
endmodule.


"PAI

MODULE user_command_9000 INPUT.
  Data: lv_ucomm TYPE sy-ucomm.
  lv_ucomm = sy-ucomm.
  CASE lv_ucomm.
    WHEN 'CANCEL' oR 'EXIT'.
      PERFORM free_objects.
      leave program.
    WHEN 'BACK'.
      PERFORM free_objects.
      SET SCREEN '0'.
      leave SCREEN.
    WHEN 'SAVE'.
      PERFORM save_database.
       CALL METHOD o_grid->refresh_table_display.
  ENDCASE.

ENDMODULE.
Form create_object.
  "create docking container
  create object o_docking
      exporting
          ratio = '95'.
  if sy-subrc eq 0.
    "create grid
    create OBJECT o_grid
       exporting
         i_parent = o_docking.
  endif.
ENDFORM.

FORM create_fieldcat.
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
   EXPORTING
*     I_BUFFER_ACTIVE              =
     I_STRUCTURE_NAME             =  'ZZTSTUDENT'
*     I_CLIENT_NEVER_DISPLAY       = 'X'
*     I_BYPASSING_BUFFER           =
*     I_INTERNAL_TABNAME           =
    CHANGING
      CT_FIELDCAT                  = IT_FCAT
   EXCEPTIONS
     INCONSISTENT_INTERFACE       = 1
     PROGRAM_ERROR                = 2
     OTHERS                       = 3
            .
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.
  ENDFORM.
"making the column as editable
FORM modify_fieldcat.
   loop at it_fcat ASSIGNING <fs_fieldcat>.
     CASE <fs_fieldcat>-fieldname.
      WHEN 'ST_NAME'.
        <fs_fieldcat>-edit = 'X'.
        WHEN 'ST_CITY'.
        <fs_fieldcat>-edit = 'X'.
     ENDCASE.
   ENDLOOP.
ENDFORM.

FORM register_edit.
  call METHOD o_grid->register_edit_event
     exporting
        i_event_id = cl_gui_alv_grid=>mc_evt_modified.
ENDFORM.

FORM display_output.
   w_variant-report = sy-repid.
   call METHOD o_grid->set_table_for_first_display
       EXPORTING
            is_variant = w_variant
            i_save     = 'A'
       CHANGING
            it_outtab  = it_zztstudent
            IT_FIELDCATALOG = it_fcat
       EXCEPTIONS
            invalid_parameter_combination = 1
            program_error = 2
            too_many_lines = 3
            others = 4.
   if sy-subrc <> 0.
     message e001(zmsgpr).
   endif.
ENDFORM.

form free_objects.
  call method o_grid->free
     EXCEPTIONS
        cntl_error = 1
        cntl_system_error = 2
        others = 3.
  if sy-subrc <> 0.
    message e001(zmsgpr).
  endif.

  call method o_docking->free
     EXCEPTIONS
       cntl_error = 1
       cntl_system_error = 2
       others = 3.
  if sy-subrc <> 0.
     message e001(zmsgpr).
  endif.

ENDFORM.

form save_database.
   call METHOD o_grid->get_selected_rows
      importing
        et_index_rows = i_selected_rows.
   "through the index capturing the values of slected rows
   loop at i_selected_rows into w_selected_rows.
     READ TABLE it_zztstudent into lw_zztstudent index w_selected_rows-index.
     if sy-subrc = 0.
        move-CORRESPONDING lw_zztstudent to lw_modified.
        append lw_modified to it_modified.
     endif.
   endloop.
   modify zztstudent from table it_modified.
ENDFORM.

2 个答案:

答案 0 :(得分:1)

首先,您必须在类定义中创建一个方法,如下所示:

METHODS on_toolbar
  FOR EVENT toolbar
              OF  cl_gui_alv_grid
  IMPORTING e_object.

之后你必须创建一个事件对象,你必须在那里设置alvgrid对象的处理程序,如下所示:

IF gcl_container IS INITIAL.

  CREATE OBJECT gcl_container
    EXPORTING
      container_name = 'CONTAINER'.

  CREATE OBJECT gcl_grid
    EXPORTING
      i_parent = gcl_container.

  "erstellt einen Handler der alle ereignisse aufnimmt
  "created object and set a handler of all events
  CREATE OBJECT gcl_event.
  SET HANDLER gcl_event->on_toolbar
      FOR gcl_grid.
ENDIF.

希望它对你有所帮助。 :)

答案 1 :(得分:0)

首先双击set PF-STATUS 'ZSTATUS'上的ZSTATUS并创建对象。

之后你会到达这里:

Screen buttons

单击功能键并为每个按钮添加所需的代码。 最后在case语句中,检查sy-ucomm是否具有您输入的代码的值。