[ABAP] Verwendung des GUI-Controls cl_gui_calendar

* SAPCALENDAR_DEMO1
* SAPCALENDAR_DRAG_DROP
* RSDEMO_CALENDAR_CONTROL
DATA: o_cnt TYPE REF TO cl_gui_dialogbox_container.
DATA: o_cal TYPE REF TO cl_gui_calendar.

* Dummyparameter für Selektion im Kalender
PARAMETERS: p_week TYPE string.
PARAMETERS: p_date TYPE string.

CLASS lcl_events DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS on_close FOR EVENT close OF cl_gui_dialogbox_container
      IMPORTING
          sender.
    CLASS-METHODS on_date_selected FOR EVENT date_selected OF cl_gui_calendar
      IMPORTING
          date_begin
          date_end
          sender.
ENDCLASS.

CLASS lcl_events IMPLEMENTATION.
* Event, wenn auf das Schließen-Kreuz geklickt wird
  METHOD on_close.
    sender->free( ).
  ENDMETHOD.

* Event für Datumsselektion im Kalender
  METHOD on_date_selected.
    DATA: lv_date_begin TYPE cnca_utc_date.

    TRY.
        sender->get_selection( IMPORTING date_begin = lv_date_begin ).

        p_week = cl_bs_period_toolset_basics=>get_calendar_week( CONV #( lv_date_begin ) ).
        p_date = lv_date_begin.
      CATCH cx_root INTO DATA(e_txt).
    ENDTRY.

  ENDMETHOD.

ENDCLASS.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_week.
* Popupfenster
  o_cnt = NEW #( no_autodef_progid_dynnr = abap_true
                 caption = 'Kalender'
                 top = 100
                 left = 200
                 width = 640
                 height = 120 ).

* on_close Handler für Popup setzen
  SET HANDLER lcl_events=>on_close FOR o_cnt.

* neues Kalenderobjekt erzeugen (überschreibt vorherige Referenz!)
  o_cal = NEW #( parent          = o_cnt
                 selection_style = cnca_sel_week
                 view_style      = cnca_style_h_navigator ).

  DATA: it_events TYPE cntl_simple_events.

  it_events = VALUE #( ( eventid = cl_gui_calendar=>m_id_date_selected
                         appl_event = abap_true ) ).

  o_cal->set_registered_events( events = it_events ).

  SET HANDLER lcl_events=>on_date_selected FOR o_cal.

START-OF-SELECTION.
  WRITE / p_week.
  WRITE / p_date.

[ABAP] Mit Zeitstempel rechnen

Variante 1 (cl_abap_tstmp)

DATA: l_ts TYPE timestamp.
DATA: l_ts_out TYPE timestamp.

GET TIME STAMP FIELD l_ts.

* 3600s zum Zeitstempel hinzurechnen
l_ts_out = cl_abap_tstmp=>add( tstmp = l_ts
                               secs = 3600 ).

WRITE: / l_ts TIME ZONE sy-zonlo.
WRITE: / l_ts_out TIME ZONE sy-zonlo.

Variante 2 (cl_hrpad_date_computations)

* add_weeks_to_date             -> Addiert Anzahl Wochen zum Datum
* add_months_to_date            -> Addiert Anzahl Monate zum Datum
* add_years_to_date             -> Addiert Anzahl Jahre zum Datum
* subtract_weeks_from_date      -> Subtrahiert Anzahl Wochen vom Datum
* subtract_months_from_date     -> Subtrahiert Anzahl Monate vom Datum
* subtract_years_from_date      -> Subtrahiert Anzahl Jahre vom Datum
* get_weekday_number            -> Ermittelt Nummer des Wochentags
* get_weekday_number_shifted    -> Ermittelt Nummer des Wochentags (verschoben)
* get_first_day_calendar_week   -> Ermittelt den ersten Tag einer Kalenderwoche für best. Jahr
* get_last_weekday_number       -> Bestimmt Nummer des letzten Wochentags
* get_first_day_in_week         -> Ermittelt den ersten Tag einer Woche
* get_first_day_in_shifted_week -> Ermittelt den ersten Tag einer Woche (verschoben)
* get_first_day_previous_month  -> Ermittelt den ersten Tag im davorliegenden Monat
* get_week                      -> Ermittelt die Woche in der das Datum liegt (verschoben)
* get_shifted_week              -> Ermittelt die Woche in der das Datum liegt (verschoben)
* get_last_day_in_month         -> Berechnet den letzten Tag des laufenden Monats
* get_last_day_previous_month   -> Ermittelt den letzten Tag des davorliegenden Monats
* get_days_per_year             -> Ermittelt Anzahl der Tage pro Jahr

Variante 3 (cl_bs_period_toolset_basics)

* erster Tag des aktuellen Monats
DATA(lv_first_day) = cl_bs_period_toolset_basics=>get_first_day_in_month( iv_date = sy-datum ).
WRITE: / lv_first_day.

* erster Tag des vorherigen Monats
DATA(lv_first_day) = cl_bs_period_toolset_basics=>get_first_day_prev_month( iv_date = sy-datum ).
WRITE: / lv_first_day.

* letzter Tag des vorherigen Monats
DATA(lv_last_day) = cl_bs_period_toolset_basics=>get_last_day_prev_month( iv_date = sy-datum ).
WRITE: / lv_last_day.

* letzter Tag des aktuellen Monats
DATA(lv_last_day) = cl_bs_period_toolset_basics=>get_last_day_in_month( iv_date = sy-datum ).
WRITE: / lv_last_day.

* 60 Minuten zu Zeit und Datum hinzurechnen
cl_bs_period_toolset_basics=>add_minutes_to_date( EXPORTING
                                                    iv_date    = sy-datum
                                                    iv_time    = sy-uzeit
                                                    iv_minutes = 60
                                                  IMPORTING
                                                    ev_date    = DATA(lv_date_new)
                                                    ev_time    = DATA(lv_time_new) ).

WRITE: / lv_date_new, lv_time_new.