Code: Alles auswählen.
*& Report ZMS_KINO_VERWALTUNG
*&---------------------------------------------------------------------*
REPORT zms_kino_verwaltung.
*----------------------------------------------------------------------*
* SELECTION-SCREEN
*----------------------------------------------------------------------*
PARAMETERS: name TYPE zms_de_buchungsname OBLIGATORY DEFAULT sy-uname.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: rb_res RADIOBUTTON GROUP rb1 DEFAULT 'X', " Reservierungen
rb_filme RADIOBUTTON GROUP rb1, " Aktuelle Filme
rb_beide RADIOBUTTON GROUP rb1. " Beides
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN SKIP 1.
" Stammdaten-Pflege Buttons
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
SELECTION-SCREEN PUSHBUTTON /1(30) pb_saal USER-COMMAND saal.
SELECTION-SCREEN PUSHBUTTON /1(30) pb_filme USER-COMMAND filme.
SELECTION-SCREEN PUSHBUTTON /1(30) pb_beleg USER-COMMAND beleg.
SELECTION-SCREEN END OF BLOCK b2.
*----------------------------------------------------------------------*
* GLOBALE DATEN
*----------------------------------------------------------------------*
DATA: go_kino TYPE REF TO zcl_ms_kino,
gv_aktuelles_datum TYPE sy-datum.
*----------------------------------------------------------------------*
* INITIALIZATION
*----------------------------------------------------------------------*
INITIALIZATION.
" Texte für Radiobuttons
%_rb_res_%_app_%-text = 'Reservierungen anzeigen'.
%_rb_filme_%_app_%-text = 'Aktuelle Filme anzeigen'.
%_rb_beide_%_app_%-text = 'Beides anzeigen'.
" Texte für Stammdaten-Buttons
pb_saal = 'Kinosäle pflegen'.
pb_filme = 'Filme pflegen'.
pb_beleg = 'Belegung pflegen'.
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
IF name IS INITIAL.
MESSAGE 'Bitte geben Sie Ihren Namen ein' TYPE 'E'.
ENDIF.
" Button-Events für Stammdatenpflege
CASE sy-ucomm.
WHEN 'SAAL'.
SET PARAMETER ID 'VTB' FIELD 'ZMS_T_KINO_SAAL'.
CALL TRANSACTION 'SM30' AND SKIP FIRST SCREEN.
WHEN 'FILME'.
SET PARAMETER ID 'VTB' FIELD 'ZMS_T_KINO_FILME'.
CALL TRANSACTION 'SM30' AND SKIP FIRST SCREEN.
WHEN 'BELEG'.
SET PARAMETER ID 'VTB' FIELD 'ZMS_T_KINO_BELEG'.
CALL TRANSACTION 'SM30' AND SKIP FIRST SCREEN.
ENDCASE.
*----------------------------------------------------------------------*
* START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.
CREATE OBJECT go_kino EXPORTING iv_name = name.
gv_aktuelles_datum = sy-datum.
" Navigation
CASE 'X'.
WHEN rb_res. PERFORM zeige_reservierungen USING go_kino.
WHEN rb_filme. PERFORM zeige_filme USING go_kino.
WHEN rb_beide. PERFORM zeige_beide USING go_kino.
ENDCASE.
*&---------------------------------------------------------------------*
*& Event Handler Klasse für CL_SALV_TABLE (MUSS VOR den FORMs stehen!)
*&---------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: handle_double_click
FOR EVENT double_click OF cl_salv_events_table
IMPORTING row column.
ENDCLASS.
CLASS lcl_event_handler IMPLEMENTATION.
METHOD handle_double_click.
DATA: lt_filme TYPE zcl_ms_kino=>tt_filme,
ls_film TYPE zcl_ms_kino=>ty_filme.
" Film aus der Zeile holen
go_kino->lade_filme( gv_aktuelles_datum ).
lt_filme = go_kino->get_filme( ).
READ TABLE lt_filme INTO ls_film INDEX row.
IF sy-subrc = 0.
" Reservierung durchführen
PERFORM reservierung_durchfuehren_salv USING ls_film.
ENDIF.
ENDMETHOD.
ENDCLASS.
*&---------------------------------------------------------------------*
*& Splitter ALV Klasse
*&---------------------------------------------------------------------*
CLASS lcl_splitter_alv DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
show_both.
PRIVATE SECTION.
CLASS-DATA:
co_splitter TYPE REF TO cl_gui_splitter_container,
co_reserv_alv TYPE REF TO cl_salv_table,
co_filme_alv TYPE REF TO cl_salv_table,
ct_reservierungen TYPE zcl_ms_kino=>tt_reservierung,
ct_filme TYPE zcl_ms_kino=>tt_filme,
co_kino TYPE REF TO zcl_ms_kino.
CLASS-METHODS:
init_data,
init_alvs.
ENDCLASS.
CLASS lcl_splitter_alv IMPLEMENTATION.
METHOD show_both.
" Kino-Objekt über globale Variable setzen
co_kino = go_kino.
init_data( ).
init_alvs( ).
ENDMETHOD.
METHOD init_data.
" Daten laden
co_kino->lade_reservierungen( ).
ct_reservierungen = co_kino->get_reservierungen( ).
co_kino->lade_filme( gv_aktuelles_datum ).
ct_filme = co_kino->get_filme( ).
" Sortierung
SORT ct_reservierungen BY datum DESCENDING.
ENDMETHOD.
METHOD init_alvs.
" Prüfen ob Daten vorhanden
IF lines( ct_reservierungen ) = 0 AND lines( ct_filme ) = 0.
MESSAGE 'Keine Daten für Anzeige vorhanden' TYPE 'I'.
RETURN.
ENDIF.
TRY.
" Splitter Container erstellen (SCREEN0 ist der Schlüssel!)
CREATE OBJECT co_splitter
EXPORTING
parent = cl_gui_container=>screen0
rows = 1
columns = 2.
" Linke Seite: Reservierungen
IF lines( ct_reservierungen ) > 0.
cl_salv_table=>factory(
EXPORTING r_container = co_splitter->get_container( row = 1 column = 1 )
IMPORTING r_salv_table = co_reserv_alv
CHANGING t_table = ct_reservierungen ).
co_reserv_alv->get_display_settings( )->set_list_header( 'Meine Reservierungen' ).
co_reserv_alv->get_columns( )->set_optimize( abap_true ).
co_reserv_alv->get_display_settings( )->set_striped_pattern( abap_true ).
co_reserv_alv->get_functions( )->set_all( abap_true ).
co_reserv_alv->display( ).
ENDIF.
" Rechte Seite: Filme
IF lines( ct_filme ) > 0.
cl_salv_table=>factory(
EXPORTING r_container = co_splitter->get_container( row = 1 column = 2 )
IMPORTING r_salv_table = co_filme_alv
CHANGING t_table = ct_filme ).
co_filme_alv->get_display_settings( )->set_list_header( 'Filme - Doppelklick für Reservierung' ).
co_filme_alv->get_columns( )->set_optimize( abap_true ).
co_filme_alv->get_display_settings( )->set_striped_pattern( abap_true ).
co_filme_alv->get_functions( )->set_all( abap_true ).
" Event Handler
SET HANDLER lcl_event_handler=>handle_double_click FOR co_filme_alv->get_event( ).
co_filme_alv->display( ).
ENDIF.
CATCH cx_root.
MESSAGE 'Fehler beim Erstellen der Splitter-Ansicht' TYPE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
*&---------------------------------------------------------------------*
*& Form zeige_reservierungen - CL_SALV_TABLE (Kompakt)
*&---------------------------------------------------------------------*
FORM zeige_reservierungen USING po_kino TYPE REF TO zcl_ms_kino.
DATA: lo_alv TYPE REF TO cl_salv_table,
lt_reservierungen TYPE zcl_ms_kino=>tt_reservierung,
lx_msg TYPE REF TO cx_salv_msg.
po_kino->lade_reservierungen( ).
lt_reservierungen = po_kino->get_reservierungen( ).
IF lines( lt_reservierungen ) = 0.
MESSAGE 'Keine Reservierungen vorhanden' TYPE 'I'.
RETURN.
ENDIF.
SORT lt_reservierungen BY datum DESCENDING.
TRY.
" ALV automatisch erstellen - KEIN Feldkatalog nötig!
cl_salv_table=>factory(
IMPORTING r_salv_table = lo_alv
CHANGING t_table = lt_reservierungen ).
" Titel setzen
lo_alv->get_display_settings( )->set_list_header( 'Meine Reservierungen' ).
" Spaltenoptimierung automatisch
lo_alv->get_columns( )->set_optimize( abap_true ).
" Toolbar aktivieren (Export, Filter, etc.)
lo_alv->get_functions( )->set_all( abap_true ).
" Zebrastreifen
lo_alv->get_display_settings( )->set_striped_pattern( abap_true ).
" Anzeigen
lo_alv->display( ).
CATCH cx_salv_msg INTO lx_msg.
MESSAGE lx_msg->get_text( ) TYPE 'E'.
ENDTRY.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form zeige_filme - CL_SALV_TABLE mit Event-Handler
*&---------------------------------------------------------------------*
FORM zeige_filme USING po_kino TYPE REF TO zcl_ms_kino.
DATA: lo_alv TYPE REF TO cl_salv_table,
lt_filme TYPE zcl_ms_kino=>tt_filme,
lo_events TYPE REF TO cl_salv_events_table,
lv_title TYPE c LENGTH 70,
lx_msg TYPE REF TO cx_salv_msg.
po_kino->lade_filme( gv_aktuelles_datum ).
lt_filme = po_kino->get_filme( ).
IF lines( lt_filme ) = 0.
MESSAGE 'Keine Filme für das gewählte Datum vorhanden' TYPE 'I'.
RETURN.
ENDIF.
TRY.
" ALV automatisch erstellen
cl_salv_table=>factory(
IMPORTING r_salv_table = lo_alv
CHANGING t_table = lt_filme ).
" Titel mit Datum (ohne String-Template für Kompatibilität)
CONCATENATE 'Filme am' gv_aktuelles_datum '- Doppelklick für Reservierung'
INTO lv_title SEPARATED BY space.
lo_alv->get_display_settings( )->set_list_header( lv_title ).
" Spalten optimieren
lo_alv->get_columns( )->set_optimize( abap_true ).
lo_alv->get_display_settings( )->set_striped_pattern( abap_true ).
" Toolbar aktivieren
lo_alv->get_functions( )->set_all( abap_true ).
" Doppelklick-Event aktivieren
lo_events = lo_alv->get_event( ).
SET HANDLER lcl_event_handler=>handle_double_click FOR lo_events.
" Anzeigen
lo_alv->display( ).
CATCH cx_salv_msg INTO lx_msg.
MESSAGE lx_msg->get_text( ) TYPE 'E'.
ENDTRY.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form zeige_beide
*&---------------------------------------------------------------------*
FORM zeige_beide USING po_kino TYPE REF TO zcl_ms_kino.
DATA: lx_msg TYPE REF TO cx_salv_msg.
TRY.
lcl_splitter_alv=>show_both( ).
CATCH cx_salv_msg INTO lx_msg.
MESSAGE lx_msg->get_text( ) TYPE 'E'.
ENDTRY.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form reservierung_durchfuehren_salv - Für CL_SALV_TABLE Events
*&---------------------------------------------------------------------*
FORM reservierung_durchfuehren_salv USING is_film TYPE zcl_ms_kino=>ty_filme.
DATA: lv_anzahl TYPE i,
lv_message TYPE string,
lv_anzahl_char TYPE c LENGTH 10.
" Popup für Ticket-Anzahl
PERFORM popup_ticket_anzahl USING is_film CHANGING lv_anzahl.
IF lv_anzahl <= 0.
RETURN.
ENDIF.
" Reservierung anlegen
IF go_kino->reservierung_anlegen( iv_saal_nr = is_film-saal_nr
iv_anzahl = lv_anzahl ) = abap_true.
" Erfolgsmeldung (Anzahl in Char konvertieren)
lv_anzahl_char = lv_anzahl.
CONCATENATE 'Erfolgreich!' lv_anzahl_char 'Tickets für' is_film-film_name 'reserviert'
INTO lv_message SEPARATED BY space.
MESSAGE lv_message TYPE 'S'.
" ALV automatisch neu laden
PERFORM zeige_filme USING go_kino.
ELSE.
MESSAGE 'Reservierung fehlgeschlagen' TYPE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form popup_ticket_anzahl - Popup für Ticket-Eingabe
*&---------------------------------------------------------------------*
FORM popup_ticket_anzahl USING is_film TYPE zcl_ms_kino=>ty_filme
CHANGING cv_anzahl TYPE i.
DATA: lt_fields TYPE TABLE OF sval,
ls_field TYPE sval,
lv_returncode TYPE c,
lv_message TYPE string,
ls_film_aktuell TYPE zcl_ms_kino=>ty_filme,
lv_plaetze_char TYPE c LENGTH 10.
cv_anzahl = 0.
" Popup-Schleife für Validierung
DO.
" Aktuelle Daten laden (lokale Kopie verwenden!)
go_kino->lade_filme( gv_aktuelles_datum ).
READ TABLE go_kino->get_filme( ) INTO ls_film_aktuell
WITH KEY saal_nr = is_film-saal_nr film_name = is_film-film_name.
" Popup-Feld vorbereiten
CLEAR: lt_fields.
ls_field-tabname = 'RSPARAMS'.
ls_field-fieldname = 'LOW'.
ls_field-fieldtext = 'Anzahl Tickets'.
ls_field-field_obl = 'X'.
ls_field-value = '1'.
APPEND ls_field TO lt_fields.
" Popup anzeigen (freie_plaetze in Char konvertieren)
lv_plaetze_char = ls_film_aktuell-freie_plaetze.
CONCATENATE ls_film_aktuell-film_name '(' lv_plaetze_char 'Plätze frei)'
INTO lv_message SEPARATED BY space.
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
popup_title = lv_message
IMPORTING
returncode = lv_returncode
TABLES
fields = lt_fields.
" Abbruch durch Benutzer
IF lv_returncode = 'A'.
RETURN.
ENDIF.
" Eingabe validieren
READ TABLE lt_fields INTO ls_field INDEX 1.
TRY.
cv_anzahl = ls_field-value.
IF cv_anzahl <= 0.
MESSAGE 'Die Anzahl muss größer als 0 sein' TYPE 'I'.
CONTINUE.
ELSEIF cv_anzahl > ls_film_aktuell-freie_plaetze.
lv_plaetze_char = ls_film_aktuell-freie_plaetze.
CONCATENATE 'Nur' lv_plaetze_char 'Plätze verfügbar!'
INTO lv_message SEPARATED BY space.
MESSAGE lv_message TYPE 'I'.
CONTINUE.
ENDIF.
EXIT. " Gültige Eingabe - Schleife verlassen
CATCH cx_sy_conversion_no_number.
MESSAGE 'Bitte geben Sie eine gültige Zahl ein' TYPE 'I'.
CONTINUE.
ENDTRY.
ENDDO.
ENDFORM.
Code: Alles auswählen.
WRITE space.
Code: Alles auswählen.
co_reserv_alv->display( ).