[ABAP] Datumskonvertierung: String zu internem SAP-Datums-Format

* DD.MM.YYYY
* MM/DD/YYYY
* MM-DD-YYYY
* YYYY.MM.DD
* YYYY/MM/DD
* YYYY-MM-DD
DATA(lv_date_in) = |12-01-2025|.
DATA(lv_date_out) = ||.

* Convert Date to Internal Format
CALL FUNCTION 'CONVERSION_EXIT_RSDAT_INPUT'
  EXPORTING
    input        = lv_date_in
  IMPORTING
    output       = lv_date_out
  EXCEPTIONS
    invalid_date = 1
    OTHERS       = 2.

IF sy-subrc = 0.
  WRITE: / lv_date_out.
ELSE.
  WRITE: / 'Fehler'.
ENDIF.

[ABAP] Unix-Timestamp erzeugen

* akt. UNIX Timestamp
DATA(lv_ut) = xco_cp=>sy->unix_timestamp( )->value.

WRITE: / lv_ut.

* akt. UNIX Timestamp aus Datums-Vorgabe
DATA(lv_ut_cust) = xco_cp_time=>moment( iv_year   = '2025'
                                        iv_month  = '05'
                                        iv_day    = '25'
                                        iv_hour   = '07'
                                        iv_minute = '00'
                                        iv_second = '00'
                                      )->get_unix_timestamp( )->value.

WRITE: / lv_ut_cust.

[ABAP] UTC-long-Zeitstempel nach POSIX-Standard in Datum und Zeit splitten

TRY.
* UTC-Zeitstempel nach POSIX-Standard
* z.B. 01.01.2025 06:30:10,1234567
    DATA(lv_utc_long) = utclong_current( ).

    WRITE: / 'UTC long: ', lv_utc_long.

* UTC-Long in Datum, Zeit splitten
    CONVERT UTCLONG lv_utc_long
      TIME ZONE cl_abap_context_info=>get_user_time_zone( )
      INTO DATE DATA(lv_date)               " d
      TIME DATA(lv_time)                    " t
      FRACTIONAL SECONDS DATA(lv_frac_sec)  " decfloat34
      DAYLIGHT SAVING TIME DATA(lv_is_dst). " abap_bool

    WRITE: / 'Date: ', lv_date.
    WRITE: / 'Time: ', lv_time.
    WRITE: / 'Fractionl seconds: ', lv_frac_sec.
    WRITE: / 'Daylight saving time: ', lv_is_dst.

  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] UTC-Zeitstempel nach POSIX-Standard

* UTC-Zeitstempel nach POSIX-Standard
DATA(lv_utc_long) = utclong_current( ).

* addiert die übergebenen Werte zu UTC-Zeitstempel
DATA(lv_utc_long_add) = utclong_add( val     = lv_utc_long
                                     days    = 1000
                                     hours   = 100
                                     minutes = 10 ).

* berechnet die Zeitdifferenz zwischen zwei UTC-Zeitstempeln
DATA(lv_utc_long_diff) = utclong_diff( high = lv_utc_long_add
                                       low  = lv_utc_long ).

* Zeitdauer zwischen zwei Zeitstempelwerten bestimmen
cl_abap_utclong=>diff( EXPORTING high    = lv_utc_long_add
                                 low     = lv_utc_long
                       IMPORTING days    = DATA(lv_days)
                                 hours   = DATA(lv_hours)
                                 minutes = DATA(lv_minutes)
                                 seconds = DATA(lv_seconds) ).

* UTL-Zeitstempel aus Text
DATA(lv_utc_long_txt) = CONV utclong( '2025-05-01 12:00:00,123' ).

WRITE: / lv_utc_long.
WRITE: / lv_utc_long_txt.
WRITE: / lv_utc_long_add.
WRITE: / lv_utc_long_diff.

WRITE: / lv_days.
WRITE: / lv_hours.
WRITE: / lv_minutes.
WRITE: / lv_seconds.

[ABAP] SAP: Terminverwaltung

Klassen

CL_APPOINTMENT (Termin der R/3 Terminverwaltung)
CL_ORGANIZER (Terminverwaltung: Oberfläche für die Terminanzeige)
CL_PLANNER (Terminverwaltung: Planungsoberfläche)
CL_RECA_WB_ORGANIZER (Terminkalender innerhalb der Workbench)
CL_CRM_DATES_ORGANIZER_UI (CRM Scheduler (Kalender und Taskliste))

Tabellen

SCAPPTTYPE (Terminart)
SCAPPT (benutzerspezifische Termine)
SCGENAPPT (generierte Termine (regelmäßige bzw. Gruppentermine))

Typgruppen

SCCON (Terminkalender: Definition von Konstanten)

Programme

RSSC_DEMO_CL_APPOINTMENT_SIMPL
RSSC_DEMO_CL_APPOINTMENT_PERIO
RSSC_DEMO_CL_APPOINTMENT_APPL
RSSC_DEMO_CL_APPOINTMENT
RSSC_DEMO_ICAL
RSSC_TEST_CL_APPOINTMENT_REPLY

Beispiel 1 (cl_reca_wb_organizer)

TRY.
    cl_reca_wb_organizer=>initialize( io_custom_control = cl_gui_container=>default_screen ).
    WRITE: / space.
  CATCH cx_root INTO DATA(e_ext).
ENDTRY.

Beispiel 2 (cl_appointment)

TRY.
    DATA(o_app) = NEW cl_appointment( ).

* Terminart
* siehe Tabelle SCAPPTTYPE (Terminart)
    o_app->set_type( 'MEETING' ).

* Organisator
    o_app->set_organizer( organizer = sy-uname ).

* Teilnehmer hinzufügen
    DATA: lv_part TYPE scspart.
    DATA: lv_address TYPE obj_record.
    lv_address-header = 'OBJH'.
    lv_address-type = 'SWO'.

    DATA: lv_err_msg TYPE swotreturn.

    CALL FUNCTION 'SWO_CREATE'
      EXPORTING
        objtype = 'ADDRESS'
        objkey  = space
      IMPORTING
        object  = lv_address-handle
        return  = lv_err_msg.

    DATA: lv_mail TYPE ad_smtpadr VALUE 'test@test.de'.
    DATA: it_address_container TYPE STANDARD TABLE OF swcont.

* Schreiben eines ABAP/4-Feldes in einen Container
    CALL FUNCTION 'SWC_ELEMENT_SET'
      EXPORTING
        element   = 'AddressString'
        field     = lv_mail
      TABLES
        container = it_address_container.

* Schreiben eines ABAP/4-Feldes in einen Container
    CALL FUNCTION 'SWC_ELEMENT_SET'
      EXPORTING
        element   = 'TypeId'
        field     = 'U'
      TABLES
        container = it_address_container.

* Buisness Objekt Metode aufrufen / Attribute setzen
    CALL FUNCTION 'SWO_INVOKE'
      EXPORTING
        access     = 'C'
        object     = lv_address-handle
        verb       = 'Create'
        persistent = ' '
      TABLES
        container  = it_address_container.

    DATA: lv_objkey TYPE swotobjid.
* Buisiness Objekt Superobjekttyp lesen
    CALL FUNCTION 'SWO_OBJECT_ID_GET'
      EXPORTING
        object = lv_address-handle
      IMPORTING
        objid  = lv_objkey.

    lv_part-objkey = lv_objkey-objkey.
    lv_part-objtype = lv_objkey-objtype.
    lv_part-comm_mode = 'INT'.
    lv_part-send_mail = sccon_part_sndmail_with_ans.

    o_app->add_participant( participant = lv_part ).

* Terminüberschrift / Subject
    DATA: lv_title TYPE sc_txtshor VALUE 'wichtiger Termin'.
    o_app->set_title( lv_title ).

* Ort / Locaton (max. 12 Zeichen --> ggf. noch im iCal-Text unter LOCATION: ersetzen)
    DATA: lv_loc TYPE sc_room VALUE 'Raum 100'.
    o_app->set_location( lv_loc ).
*    o_app->set_location_string( ).

* Zeitpunkt
    DATA(lv_date_from) = CONV sc_datefro( sy-datum ).
    DATA(lv_time_from) = sccon_00.
    DATA(lv_date_to) = CONV sc_dateto( '311299' ).
    DATA(lv_time_to) = sccon_235959.

    o_app->set_date( date_from = lv_date_from
                     date_to   = lv_date_to
                     time_from = lv_time_from
                     time_to   = lv_time_to ).

* Priorität
    o_app->set_priority( sccon_prio_very_high ).

* Status
    o_app->set_status( sccon_status_planned ).

* Anzeigeattribute
    o_app->set_view_attributes( show_on_top = abap_true ).

* Busy-Wert (frei, belegt, ...)
    o_app->set_busy_value( sccon_busy_busy ).

* Klassification (1=öffentlich, 2=privat, 3=geheim)
    o_app->set_classification( sccon_public ).

* Beschreibung
    DATA(it_body_text) = VALUE so_txttab( ( line = 'Text1' ) ( line = cl_abap_char_utilities=>cr_lf )
                                          ( line = 'Text2' ) ( line = cl_abap_char_utilities=>cr_lf )
                                          ( line = 'Text3' ) ).

    o_app->set_text( it_body_text ).

* Änderbarkeit (Berechtigung: 1= alle , 2 = nur Organisator)
    o_app->set_text_authority( '2' ).

* Termin auf der DB sichern
* Note:2413122-- save should only be done after BADI call.
    o_app->save( send_invitation = abap_false ). " Important to set this one to space. Otherwise SAP will send a not user-friendly e-mail

* Mailversand
    DATA(o_req) = o_app->create_send_request( ).
    DATA(o_rec) = cl_cam_address_bcs=>create_internet_address( lv_mail ).
    o_req->add_recipient( i_recipient = o_rec ).

    o_req->set_status_attributes( EXPORTING i_requested_status = 'N'    " Requested Status: N - Never
                                            i_status_mail      = 'N'    " Setting for Which Statuses Are Reported by Mail: N - Never
                                           ).

    o_req->set_send_immediately( abap_true ).

*    IF o_req->send( ) = abap_true.
*      COMMIT WORK AND WAIT.
*    ENDIF.

* iCal-Object holen
* hier ggf. 'METHOD:REQUEST' durch 'METHOD:PUBLISH' ersetzen
* hier ggf. 'LOCATION:' ersetzen mit längerem Raumnamen
    DATA(it_ical_soli_tab) = o_app->as_ical_object( ).

    cl_demo_output=>write_data( it_ical_soli_tab ).
    cl_demo_output=>display( ).

  CATCH cx_root INTO DATA(e_ext).
ENDTRY.

Links

[ABAP] Datumsfeld auf Gültigkeit prüfen

Variante 1 (cl_reca_date)

TRY.
    cl_reca_date=>check_date( CONV d( '01.01.1999' ) ).

  CATCH cx_root INTO DATA(e1).
    WRITE: / e1->get_text( ).
ENDTRY.

TRY.
    cl_reca_date=>check_date( CONV d( '19990101' ) ).

  CATCH cx_root INTO DATA(e2).
    WRITE: / e2->get_text( ).
ENDTRY.

TRY.
    cl_reca_date=>check_date( CONV d( '1234' ) ).

  CATCH cx_root INTO DATA(e3).
    WRITE: / e3->get_text( ).
ENDTRY.

Variante 2 (cl_reca_date)

IF abap_true = cl_reca_date=>is_date_ok( id_date = sy-datum ).
  WRITE: / 'Ok.'.
ELSE.
  WRITE: / 'Fehlerhaft.'.
ENDIF.

Variante 3 (cl_rs_time_service)

IF abap_true = cl_rs_time_service=>is_valid_date( '20250131' ).
  WRITE: / 'Datum ok.'.
ELSE.
  WRITE: / 'Datum fehlerhaft.'.
ENDIF.

[ABAP] Zeit zwischen zwei Terminen

* Anzahl Tage
DATA(lv_days) = cl_reca_date=>get_days_between_two_dates( EXPORTING
                                                            id_datefrom = '20190101'
                                                            id_dateto   = '20190201' ).

WRITE: / lv_days.

* Anzahl Monate
DATA(lv_months) = cl_reca_date=>months_between_two_dates( EXPORTING
                                                            id_date_from = '20190101'
                                                            id_date_to   = '20190201' ).

WRITE: / lv_months.

* Anzahl Jahre, Monate, Tage
DATA: lv_years TYPE i.
DATA: lv_months TYPE i.
DATA: lv_days TYPE i.

cl_reca_date=>get_date_diff( EXPORTING
                               id_date_from     = '20190101'
                               id_date_to       = '20190201'
                             IMPORTING
                               ed_years         = lv_years
                               ed_months        = lv_months
                               ed_calendar_days = lv_days
                           ).

WRITE: / lv_years.
WRITE: / lv_months.
WRITE: / lv_days.