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.