实现ALV显示可编辑,并可更新至数据库

来源:互联网 发布:钢丝野猪吊脚套锁淘宝 编辑:程序博客网 时间:2024/05/16 23:43
现步骤:

1. 定义存放显示数据的internal table it_output[], 定义一个class,并声明一个实例:

  CLASS lcl_event_receiver DEFINITION.

    PUBLIC SECTION.

      METHODS handle_data_changed

        FOR EVENT data_changed OF cl_gui_alv_grid

        IMPORTING er_data_changed.

  ENDCLASS.                    "lcl_event_receiver DEFINITION

  CLASS lcl_event_receiver IMPLEMENTATION.

    METHOD handle_data_changed.

      PERFORM change_data.

    ENDMETHOD.                    "handle_data_changed

  ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION


  DATA: event_receiver TYPE REF TO lcl_event_receiver.


2. 如普通ALV Grid控件显示一样,完成基本步骤,然后将事件注册,并设置触发

  CREATE OBJECT event_receiver.

  SET HANDLER event_receiver->handle_data_changed FOR c_alvgd.

  CALL METHOD c_alvgd->register_edit_event

    EXPORTING

      i_event_id = cl_gui_alv_grid=>mc_evt_modified.


3. 当数据改动后,回车会出发事件,事件会将改动的数据重新显示(貌似多余,先留着)

4. 点击SAVE时,PAI中进行处理,将数据更新至数据库,并重新显示


注意:在建立 Fieldcatalog时,需要将字段的edit设成'X'才能进行编辑

 Code:


*&---------------------------------------------------------------------*

*& Report  ZBRAYNT_ALV_EDITF4DISPLAY

*&

*&---------------------------------------------------------------------*

*&

*&

*&---------------------------------------------------------------------*


REPORT  zbraynt_alv_editf4display.


*Type pools for alv

TYPE-POOLS : slis.



*Structure for output display

TYPES : BEGIN OF ty_output.

        INCLUDE STRUCTURE zemployee.

TYPES : number TYPE n,

       END OF ty_output.

*internal table and work area declarations

DATA : it_output TYPE STANDARD TABLE OF ty_output INITIAL SIZE 0,

       it_table TYPE STANDARD TABLE OF ty_output INITIAL SIZE 0,

       it_pbo TYPE STANDARD TABLE OF ty_output INITIAL SIZE 0,

       wa_output TYPE ty_output.

*Data declarations for dropdown lists for f4

DATA: it_dropdown TYPE lvc_t_drop,

      ty_dropdown TYPE lvc_s_drop,

*data declaration for refreshing of alv

      stable TYPE lvc_s_stbl.

*Global variable declaration

DATA: gstring TYPE c.

*Data declarations for ALV

DATA: c_ccont TYPE REF TO cl_gui_custom_container,         "Custom container object

      c_alvgd         TYPE REF TO cl_gui_alv_grid,         "ALV grid object

      it_fcat            TYPE lvc_t_fcat,                  "Field catalogue

      it_layout          TYPE lvc_s_layo.                  "Layout

*ok code declaration

DATA:

  ok_code       TYPE ui_func.


**************************************************************

* LOCAL CLASS Definition for data changed in fieldcatalog ALV

**************************************************************

CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.

    METHODS handle_data_changed

      FOR EVENT data_changed OF cl_gui_alv_grid

      IMPORTING er_data_changed.

ENDCLASS.                    "lcl_event_receiver DEFINITION

**************************************************************

* LOCAL CLASS implementation for data changed in fieldcatalog ALV

**************************************************************

CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD handle_data_changed.

    PERFORM change_data.

  ENDMETHOD.                    "handle_data_changed

ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION

DATA: event_receiver TYPE REF TO lcl_event_receiver.

*initialization event

INITIALIZATION.

*start of selection event

START-OF-SELECTION.

*select the infotypes maintained

  SELECT * FROM zemployee INTO CORRESPONDING FIELDS OF TABLE

    it_table UP TO 10 ROWS.


  it_output[] = it_table[].


* Calling the ALV screen with custom container

  CALL SCREEN 0600.

*&---------------------------------------------------------------------*

*&      Module  STATUS_0600  OUTPUT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

MODULE status_0600 OUTPUT.

  SET PF-STATUS 'DISP'.

  SET TITLEBAR 'ALVF4'.

ENDMODULE.                 " STATUS_0600  OUTPUT

* calling the PBO module ALV_GRID.

*&---------------------------------------------------------------------*

*&      Module  PBO  OUTPUT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

MODULE pbo OUTPUT.

*Creating objects of the container

  CHECK c_ccont IS INITIAL.

  CREATE OBJECT c_ccont

    EXPORTING

      container_name = 'CCONT'.

*  create object for alv grid

  CREATE OBJECT c_alvgd

    EXPORTING

      i_parent = c_ccont.

  CREATE OBJECT event_receiver.

  SET HANDLER event_receiver->handle_data_changed FOR c_alvgd.

  CALL METHOD c_alvgd->register_edit_event

    EXPORTING

      i_event_id = cl_gui_alv_grid=>mc_evt_modified.

*  SET field for ALV

  PERFORM alv_build_fieldcat.

* Set ALV attributes FOR LAYOUT

  PERFORM alv_report_layout.

  CHECK NOT c_alvgd IS INITIAL.

* Call ALV GRID

  CALL METHOD c_alvgd->set_table_for_first_display

    EXPORTING

      is_layout                     = it_layout

      i_save                        = 'A'

    CHANGING

      it_outtab                     = it_output

      it_fieldcatalog               = it_fcat

    EXCEPTIONS

      invalid_parameter_combination = 1

      program_error                 = 2

      too_many_lines                = 3

      OTHERS                        = 4.

  IF sy-subrc <> 0.

    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  ENDIF.

ENDMODULE.                 " PBO  OUTPUT

*&---------------------------------------------------------------------*

*&      Form  alv_build_fieldcat

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      <--P_IT_FCAT  text

*----------------------------------------------------------------------*

*subroutine to build fieldcat

FORM alv_build_fieldcat.

  DATA lv_fldcat TYPE lvc_s_fcat.

  CLEAR lv_fldcat.

  lv_fldcat-row_pos   = '1'.

  lv_fldcat-col_pos   = '1'.

  lv_fldcat-fieldname = 'EMP_NO'.

  lv_fldcat-tabname   = 'IT_OUTPUT'.

  lv_fldcat-outputlen = 8.

  lv_fldcat-scrtext_m = 'Emp. No'.

  lv_fldcat-icon = 'X'.

  APPEND lv_fldcat TO it_fcat.

  CLEAR lv_fldcat.

  lv_fldcat-row_pos   = '1'.

  lv_fldcat-col_pos   = '2'.

  lv_fldcat-fieldname = 'EMP_NAME'.

  lv_fldcat-tabname   = 'IT_OUTPUT'.

  lv_fldcat-outputlen = 15.

  lv_fldcat-scrtext_m = 'Emp. Name'.

  lv_fldcat-icon = ''.

  APPEND lv_fldcat TO it_fcat.

  CLEAR lv_fldcat.

  lv_fldcat-row_pos   = '1'.

  lv_fldcat-col_pos   = '3'.

  lv_fldcat-fieldname = 'DNAME'.

  lv_fldcat-tabname   = 'IT_OUTPUT'.

  lv_fldcat-outputlen = 20.

  lv_fldcat-scrtext_m = 'Department'.

  lv_fldcat-icon = ''.

  lv_fldcat-edit ='X'.

  APPEND lv_fldcat TO it_fcat.

  CLEAR lv_fldcat.

  lv_fldcat-row_pos   = '1'.

  lv_fldcat-col_pos   = '4'.

  lv_fldcat-fieldname = 'NUMBER'.

  lv_fldcat-tabname   = 'IT_OUTPUT'.

  lv_fldcat-outputlen = 15.

  lv_fldcat-scrtext_m = 'Number'.

  lv_fldcat-icon = ''.

  lv_fldcat-edit ='X'.

  APPEND lv_fldcat TO it_fcat.

  CLEAR lv_fldcat.

*To create drop down for the field 'DAVO'

* with our own f4 help

  ty_dropdown-handle = '1'.

  ty_dropdown-value = ' '.

  APPEND ty_dropdown TO it_dropdown.

  ty_dropdown-handle = '1'.

  ty_dropdown-value = '1'.

  APPEND ty_dropdown TO it_dropdown.

  ty_dropdown-handle = '1'.

  ty_dropdown-value = '2'.

  APPEND ty_dropdown TO it_dropdown.

  ty_dropdown-handle = '1'.

  ty_dropdown-value = '3'.

  APPEND ty_dropdown TO it_dropdown.

  CALL METHOD c_alvgd->set_drop_down_table

    EXPORTING

      it_drop_down = it_dropdown.

  LOOP AT it_fcat INTO lv_fldcat.

    CASE lv_fldcat-fieldname.

** To assign dropdown in the fieldcataogue

      WHEN 'NUMBER'.

        lv_fldcat-drdn_hndl = '1'.

        lv_fldcat-outputlen = 15.

        MODIFY it_fcat FROM lv_fldcat.

    ENDCASE.

  ENDLOOP.

ENDFORM.                    " alv_build_fieldcat

*&---------------------------------------------------------------------*

*&      Form  alv_report_layout

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      <--P_IT_LAYOUT  text

*----------------------------------------------------------------------*

*Subroutine for setting alv layout

FORM alv_report_layout.

  it_layout-cwidth_opt = 'X'.

  it_layout-col_opt = 'X'.

  it_layout-zebra = 'X'.

ENDFORM.                    " alv_report_layout

* PAI module of the screen created. In case we use an interactive ALV or

*for additional functionalities we can create OK codes

*and based on the user command we can do the coding.

*&---------------------------------------------------------------------*

*&      Module  PAI  INPUT

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

MODULE pai INPUT.

*To change the existing values and refresh the grid

*And only values in the dropdown or in the default

*F4 can be given , else no action takes place for the dropdown

*and error is thrown for the default F4 help and font changes to red

*and on still saving, value is not changed

  DATA v_valid(1).

  DATA c_change(1).

*  CALL METHOD c_alvgd->check_changed_data

*    IMPORTING

*      e_valid   = v_valid

*    CHANGING

*      c_refresh = c_change.

*Based on the user input

*When user clicks 'SAVE;

  CASE ok_code.

    WHEN 'SAVE'.

      IF it_table[] = it_output[].

        MESSAGE 'No changed ,so no need to save' TYPE 'S'.

        EXIT.

      ENDIF.

*A pop up is called to confirm the saving of changed data

      CALL FUNCTION 'POPUP_TO_CONFIRM'

        EXPORTING

          titlebar       = 'SAVING DATA'

          text_question  = 'Continue?'

          icon_button_1  = 'icon_booking_ok'

        IMPORTING

          answer         = gstring

        EXCEPTIONS

          text_not_found = 1

          OTHERS         = 2.

      IF sy-subrc NE 0.

*       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

      ENDIF.

*When the User clicks 'YES'

      IF ( gstring = '1' ).

*Subroutine to display the ALV with changed data.

        PERFORM save_data.

        MESSAGE 'Saved' TYPE 'S'.

      ELSE.

*When user clicks NO or Cancel

        MESSAGE 'Not Saved'  TYPE 'S'.

        PERFORM redisplay.

      ENDIF.

**When the user clicks the 'EXIT; he is out

    WHEN 'EXIT'.

      LEAVE PROGRAM.

    WHEN 'BACK' OR 'CANCEL'.

      SET SCREEN 0.

      LEAVE SCREEN.

  ENDCASE.

  CLEAR: ok_code.

  CLEAR: v_valid.

ENDMODULE.                 " PAI  INPUT

*&---------------------------------------------------------------------*

*&      Form  REDISPLAY

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*  -->  p1        text

*  <--  p2        text

*----------------------------------------------------------------------*

FORM redisplay .

*Cells of the alv are made non editable after entering OK to save

*  CALL METHOD c_alvgd->set_ready_for_input

*    EXPORTING

*      i_ready_for_input = 0.

*Row and column of the alv are refreshed after changing values

  stable-row = 'X'.

  stable-col = 'X'.

*REfreshed ALV display with the changed values

*This ALV is non editable and contains new values

  CALL METHOD c_alvgd->refresh_table_display

    EXPORTING

      is_stable = stable

    EXCEPTIONS

      finished  = 1

      OTHERS    = 2.

  CALL METHOD cl_gui_cfw=>flush.

  IF sy-subrc <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

ENDFORM.                    " REDISPLAY

*&---------------------------------------------------------------------*

*&      Form  save_data

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

FORM save_data .

  CALL FUNCTION 'ENQUEUE_E_TABLE'

    EXPORTING

      mode_rstable   = 'E'

      tabname        = 'ZEMPLOYEE'

    EXCEPTIONS

      foreign_lock   = 1

      system_failure = 2

      OTHERS         = 3.

  IF sy-subrc = 0.

*       Modify the database table with these changes

    MODIFY zemployee FROM TABLE it_output.

    it_table[] = it_output[].

*       Unlock the table

    CALL FUNCTION 'DEQUEUE_E_TABLE'

      EXPORTING

        mode_rstable = 'E'

        tabname      = 'ZEMPLOYEE'.

  ENDIF.

ENDFORM.                    "save_data

原创粉丝点击