oo ALV 简单实现

REPORT ytest_ooalv_tc MESSAGE-ID zdev_tc.

INCLUDE ytest_ooalv_tctop.
INCLUDE ytest_ooalv_tccls.
INCLUDE ytest_ooalv_tco01.
INCLUDE ytest_ooalv_tci01.
INCLUDE ytest_ooalv_tcf01.

START-OF-SELECTION.
  PERFORM get_data.

END-OF-SELECTION.
  IF gt_data IS NOT INITIAL.
    CALL SCREEN '9000'.
  ELSE.
    MESSAGE s000 DISPLAY LIKE 'E'.
  ENDIF.

TABLES:zspfli_dev, zscarr_dev,zsflight_dev.
*----------------------------------------------------------------------*
* Data declaration
*----------------------------------------------------------------------*
types: BEGIN OF gty_data.
include TYPE zsflight_demo.
types: cell  TYPE lvc_t_styl,
       END OF gty_data.

DATA: gs_data TYPE gty_data,
      gt_data TYPE STANDARD TABLE OF gty_data.

DATA save_ok LIKE sy-ucomm.
DATA ok_code TYPE sy-ucomm .

DATA gs_stable TYPE lvc_s_stbl .
DATA gs_layout TYPE lvc_s_layo .

*OO ALV DISPLAY
DATA: gs_alv  TYPE REF TO cl_gui_alv_grid.       "ALV对象
DATA: gs_parent TYPE REF TO cl_gui_custom_container.

DATA gt_fieldcat TYPE lvc_t_fcat.                "列结构
DATA gs_fieldcat TYPE lvc_s_fcat.                "列结构-工作区


*事件相关
CLASS lcl_event_compt DEFINITION DEFERRED .
DATA  event_handler TYPE REF TO lcl_event_compt .

*----------------------------------------------------------------------*
* SELECTION-SCREEN
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS s_carrid FOR zscarr_dev-carrid OBLIGATORY.
  SELECT-OPTIONS s_caname FOR zscarr_dev-carrname.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
  SELECT-OPTIONS s_connid FOR zspfli_dev-connid .
  SELECT-OPTIONS s_counfr FOR zspfli_dev-countryfr.
  SELECT-OPTIONS s_counto FOR zspfli_dev-countryto.
  SELECT-OPTIONS s_cityfr FOR zspfli_dev-cityfrom.
  SELECT-OPTIONS s_cityto FOR zspfli_dev-cityto.
SELECTION-SCREEN END OF BLOCK b2.

SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-003.
  SELECT-OPTIONS s_fldate FOR zsflight_dev-fldate.
  SELECT-OPTIONS s_pltype FOR zsflight_dev-planetype.
SELECTION-SCREEN END OF BLOCK b3.

*&---------------------------------------------------------------------*
*& 包含               YTEST_OOALV_TCCLS
*&---------------------------------------------------------------------*CLASS lcl_event_compt DEFINITION .
  PUBLIC SECTION .
    METHODS handle_toolbar FOR EVENT toolbar
      OF cl_gui_alv_grid
      IMPORTING e_object .

    METHODS handle_user_command FOR EVENT user_command
      OF cl_gui_alv_grid
      IMPORTING e_ucomm .

    METHODS handle_data_changed   FOR EVENT data_changed
      OF cl_gui_alv_grid
      IMPORTING er_data_changed.


ENDCLASS .

CLASS lcl_event_compt IMPLEMENTATION .

*HANDLE TOOLBAR
  METHOD handle_toolbar .
    DATA ls_button TYPE stb_button .

    CLEAR:  ls_button .

    ls_button-butn_type = '3' .
    APPEND ls_button TO e_object->mt_toolbar .

    CLEAR:  ls_button .

    ls_button-function = 'select' .
    ls_button-quickinfo = 'select all'.
    ls_button-icon     = icon_select_all .
    APPEND ls_button TO e_object->mt_toolbar .

    CLEAR:  ls_button .

    ls_button-function = 'deselect' .
    ls_button-quickinfo = 'deselect all'.
    ls_button-icon     = icon_deselect_all .
    APPEND ls_button TO e_object->mt_toolbar .

    CLEAR:  ls_button .
    ls_button-function = 'add' .
    ls_button-quickinfo = 'add flight'.
    ls_button-icon     =  icon_insert_row.
    APPEND ls_button TO e_object->mt_toolbar .

    CLEAR:  ls_button .

    ls_button-function = 'delete' .
    ls_button-quickinfo = 'delete flight'.
    ls_button-icon     = icon_delete_row .
    APPEND ls_button TO e_object->mt_toolbar .


  ENDMETHOD .

*HANDLER USER_COMMAND
  METHOD handle_user_command .
    PERFORM fm_user_command USING e_ucomm .

  ENDMETHOD .

  METHOD handle_data_changed.

    PERFORM frm_data_changed USING er_data_changed.
    PERFORM refresh_alv .
    ENDMETHOD .
ENDCLASS .

*&---------------------------------------------------------------------*
*& 包含               YTEST_OOALV_TCO01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*MODULE status_9000 OUTPUT.
 SET PF-STATUS '0100'.
 SET TITLEBAR '0100'.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module INIT_ALV OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_alv OUTPUT.
  IF gs_alv IS INITIAL.
    PERFORM set_fieldcat.
    PERFORM build_alv.
    PERFORM set_handler .
  ELSE .
    PERFORM refresh_alv .
  ENDIF .
ENDMODULE.

*&---------------------------------------------------------------------*
*& 包含               YTEST_OOALV_TCI01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*MODULE user_command_9000 INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'SAVE'.
      PERFORM save_data.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.
    WHEN 'EXIT' OR 'cancel'.
      LEAVE PROGRAM.
    WHEN OTHERS.
*     do nothing
  ENDCASE.

ENDMODULE.

*&---------------------------------------------------------------------*
*& 包含               YTEST_OOALV_TCF01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM get_data .
  SELECT zspfli_dev~carrid,
         zscarr_dev~carrname,
         zspfli_dev~connid,
         zspfli_dev~countryfr,
         zspfli_dev~cityfrom,
         zsflight_dev~fldate,
         zsflight_dev~planetype,
         zsflight_dev~price,
         zsflight_dev~currency
    FROM zspfli_dev
    INNER JOIN zsflight_dev
    ON zspfli_dev~carrid = zsflight_dev~carrid
    AND zspfli_dev~connid = zsflight_dev~connid
    INNER JOIN zscarr_dev
    ON zspfli_dev~carrid = zscarr_dev~carrid
    INTO CORRESPONDING FIELDS OF TABLE @gt_data
    WHERE zspfli_dev~carrid      IN @s_carrid
      AND zscarr_dev~carrname    IN @s_caname
      AND zspfli_dev~connid      IN @s_connid
      AND zspfli_dev~countryfr   IN @s_counfr
      AND zspfli_dev~cityfrom    IN @s_cityfr
      AND zsflight_dev~fldate    IN @s_fldate
      AND zsflight_dev~planetype IN @s_pltype.

  LOOP AT gt_data INTO gs_data .
    gs_data-status = icon_green_light.
    gs_data-details = icon_flight.
    MODIFY gt_data FROM gs_data.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM set_fieldcat .
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name       = 'zsflight_demo'
    CHANGING
      ct_fieldcat            = gt_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.
  LOOP AT gt_fieldcat INTO gs_fieldcat.
    CASE gs_fieldcat-fieldname.
      WHEN 'SEL'.
        gs_fieldcat-coltext   = 'sel'.
        gs_fieldcat-outputlen = 5.
        gs_fieldcat-checkbox  = 'X'.
        gs_fieldcat-edit      = 'X'.
      WHEN 'STATUS'.
        gs_fieldcat-coltext   = 'STATUS'.
        gs_fieldcat-outputlen = 8.
      WHEN 'CARRID'.
        gs_fieldcat-coltext   = 'Airline Code'.
        gs_fieldcat-outputlen = 8.
      WHEN 'CARRNAME'.
        gs_fieldcat-coltext   = 'Airline Name'.
        gs_fieldcat-outputlen = 10.
      WHEN 'CONNID'.
        gs_fieldcat-coltext   = 'connection'.
        gs_fieldcat-outputlen = 8.
      WHEN 'FLDATE'.
        gs_fieldcat-coltext   = 'Fly date'.
        gs_fieldcat-outputlen = 8.
      WHEN 'COUNTRYFR'.
        gs_fieldcat-coltext   = 'countryfr'.
        gs_fieldcat-outputlen = 7.
      WHEN 'CITYFROM'.
        gs_fieldcat-coltext   = 'cityfrom'.
        gs_fieldcat-outputlen = 10.
      WHEN 'DETAILS'.
        gs_fieldcat-coltext   = 'details'.
        gs_fieldcat-outputlen = 8.
      WHEN 'PRICE'.
        gs_fieldcat-coltext   = 'Airfare'.
        gs_fieldcat-outputlen = 8.
      WHEN 'CURRENCY'.
        gs_fieldcat-coltext   = 'Currency'.
        gs_fieldcat-outputlen = 8.
      WHEN 'PLANETYPE'.
        gs_fieldcat-coltext   = 'Planetype'.
        gs_fieldcat-outputlen = 8.
      WHEN OTHERS.
    ENDCASE.

    MODIFY  gt_fieldcat FROM gs_fieldcat.
    CLEAR  gs_fieldcat.
  ENDLOOP.

  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form build_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM build_alv .
* 实例化
* GS_PARENT的实例化 - 实例化容器
  CREATE OBJECT gs_parent
    EXPORTING
      container_name = 'ZALV01'.      "界面中的CUNSTROMER CONTROL控件名称

* CREATE OBJECT...  - 将ALV植入到容器中
  CREATE OBJECT gs_alv
    EXPORTING
      i_parent = gs_parent.

  gs_layout-zebra = 'X' .
  gs_layout-col_opt = 'X' .

 *设置可编辑

  gs_layout-stylefname = 'cell'.   

* 调用方法输出
  CALL METHOD gs_alv->set_table_for_first_display
    EXPORTING
      is_layout                     = gs_layout
    CHANGING
      it_outtab                     = gt_data         "传出数据的表格
      it_fieldcatalog               = gt_fieldcat     "
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.
  IF sy-subrc <> 0.
*   Implement suitable error handling here
  ENDIF.
*

ENDFORM.
*&---------------------------------------------------------------------*
*& Form set_handler
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM set_handler .
  CREATE OBJECT event_handler .

  SET HANDLER event_handler->handle_toolbar      FOR gs_alv .
  SET HANDLER event_handler->handle_user_command FOR gs_alv .
  SET HANDLER event_handler->handle_data_changed FOR gs_alv.
  CALL METHOD gs_alv->set_toolbar_interactive.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form refresh_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM refresh_alv .
  gs_stable-row = 'X' .
  gs_stable-col = 'X' .

  CALL METHOD gs_alv->refresh_table_display
    EXPORTING
      is_stable = gs_stable
*     I_SOFT_REFRESH =
    EXCEPTIONS
      finished  = 1
      OTHERS    = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form fm_user_command
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> E_UCOMM
*&---------------------------------------------------------------------*
FORM fm_user_command  USING    p_ucomm.
  CASE p_ucomm .
    WHEN 'add'.
      PERFORM  frm_create.
    WHEN 'delete'.
      DATA:lw_answer TYPE char1.
      CALL FUNCTION 'POPUP_TO_CONFIRM'
        EXPORTING
          titlebar       = '执行确认'
*         DIAGNOSE_OBJECT             = ' '
          text_question  = '是否确认执行'
          text_button_1  = '是'
*         ICON_BUTTON_1  = ' '
          text_button_2  = '否'
*         ICON_BUTTON_2  = ' '
          start_column   = 25
          start_row      = 6
        IMPORTING
          answer         = lw_answer
        EXCEPTIONS
          text_not_found = 1
          OTHERS         = 2.
      IF lw_answer = '2'
        OR lw_answer = 'A'.

        MESSAGE '操作已取消' TYPE 'S'.
        RETURN.
      ENDIF.

      PERFORM frm_delete.
      IF sy-subrc <> 0.
        MESSAGE s000 DISPLAY LIKE 'E'.
      ENDIF.
      PERFORM refresh_alv .

    WHEN 'select'.
      PERFORM select_all_entries CHANGING gt_data .
    WHEN 'deselect'.
      PERFORM deselect_all_entries CHANGING gt_data.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form save_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM save_data .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_create
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create .
  CLEAR gs_data.

  gs_data-sel     = abap_true.
  gs_data-status  = icon_green_light.
  gs_data-details = icon_flight.
  gs_data-fldate  = sy-datum.
  gs_data-cell = VALUE #(  style =  cl_gui_alv_grid=>mc_style_enabled

     ( fieldname = 'CARRID'  )

     ( fieldname = 'CARRNAME'   )"字段名

     ( fieldname = 'COUNTRYFR'  )   ).

  INSERT gs_data INTO  gt_data INDEX 1.
  PERFORM refresh_alv .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_delete
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_delete .

ENDFORM.

*&---------------------------------------------------------------------*
*& Form frm_data_changed
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> ER_DATA_CHANGED_>MT_MOD_CELLS
*&---------------------------------------------------------------------*
FORM frm_data_changed  USING
      uo_data_changed TYPE REF TO cl_alv_changed_data_protocol.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form select_all_entries
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- GT_DATA
*&---------------------------------------------------------------------*
FORM select_all_entries  CHANGING pt_data  TYPE STANDARD TABLE.
  DATA: l_valid  TYPE c,
        l_locked TYPE c.

*§A4ad. Before you (a)set, reset or (d)evaluate checkboxes,
*       you must check the input cells.
*
* If all entries are ok, ALV transferes new values to the output
* table which you then can modify.

  CALL METHOD gs_alv->check_changed_data
    IMPORTING
      e_valid = l_valid.

  IF l_valid EQ 'X'.

    LOOP AT pt_data INTO gs_data.
      PERFORM check_lock USING    gs_data
                         CHANGING l_locked.
      IF l_locked IS INITIAL
         AND NOT gs_data-sel EQ '-'.
        gs_data-sel = 'X'.
      ENDIF.
      MODIFY pt_data FROM gs_data.
    ENDLOOP.

    PERFORM refresh_alv .

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form check_lock
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GS_DATA
*&      <-- L_LOCKED
*&---------------------------------------------------------------------*
FORM check_lock  USING   ps_data TYPE gty_data
                 CHANGING p_locked.
  DATA ls_celltab TYPE lvc_s_styl.

  LOOP AT ps_data-cell INTO ls_celltab.
    IF ls_celltab-fieldname = 'CHECKBOX'.
      IF ls_celltab-style EQ cl_gui_alv_grid=>mc_style_disabled.
        p_locked = 'X'.
      ELSE.
        p_locked = space.
      ENDIF.
    ENDIF.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form deselect_all_entries
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- GT_DATA
*&---------------------------------------------------------------------*
FORM deselect_all_entries  CHANGING pt_data TYPE STANDARD TABLE.
  DATA: l_valid  TYPE c,
        l_locked TYPE c.


*§A4ad. Before you (a)set, reset or (d)evaluate checkboxes,
*       you must check the input cells.
*
* If all entries are ok, ALV transferes new values to the output
* table which you then can modify.

  CALL METHOD gs_alv->check_changed_data
    IMPORTING
      e_valid = l_valid.

  IF l_valid EQ 'X'.

    LOOP AT pt_data INTO gs_data.
      PERFORM check_lock USING    gs_data
                         CHANGING l_locked.
      IF l_locked IS INITIAL
         AND NOT gs_data-sel EQ '-'.
        gs_data-sel = ' '.
      ENDIF.

      MODIFY pt_data FROM gs_data.
    ENDLOOP.
    PERFORM refresh_alv .

  ENDIF..

ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值