[ABAP] Fabbrikkalender zum Werk lesen

* Transaktion: SCAL (Fabrikkalender mit CUA-Oberfläche)
* Tabelle: TFACD (Fabrikkalenderdefinitionen)

* Werk
PARAMETERS: p_werks TYPE t001w-werks DEFAULT '10'.
* zu prüfendes Datum
PARAMETERS: p_date TYPE scal-date DEFAULT '20190101'.
* Kennzeichen, wie Arbeitstag berechnet werden soll:
* '+' nächster Arbeitstag
* '-' vorheriger Arbeitstag
PARAMETERS: p_corr TYPE scal-indicator DEFAULT '+'.

START-OF-SELECTION.

* Fabrikkalender zum Werk ermitteln
  SELECT SINGLE *
    INTO @DATA(lv_t001w)
    FROM t001w WHERE werks = @p_werks.

  IF sy-subrc = 0.
    DATA: lv_fabkldate TYPE scal-date.
    DATA: lv_factorydate TYPE scal-facdate.
    DATA: lv_workingday_indicator TYPE scal-indicator.

* Kalenderfunktion Fabrikkalenderdatum zu einem Datum geben
    CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE'
      EXPORTING
        factory_calendar_id          = lv_t001w-fabkl " Schlüssel des Fabrikkalenders
        correct_option               = p_corr         " Kennzeichen, wie Arbeitstag berechnet werden soll
        date                         = p_date         " Datum, das in Fabrikkalenderdatum umzuwandeln ist
      IMPORTING
        date                         = lv_fabkldate            " Fabrikkalenderdatum
        factorydate                  = lv_factorydate          " Nummer des Arbeitstags im angegebenen Kalender
        workingday_indicator         = lv_workingday_indicator " Kennzeichen, ob Datum ein Arbeitstag ist
      EXCEPTIONS
        calendar_buffer_not_loadable = 1
        correct_option_invalid       = 2
        date_after_range             = 3
        date_before_range            = 4
        date_invalid                 = 5
        factory_calendar_not_found   = 6
        OTHERS                       = 7.

    IF sy-subrc = 0.
      WRITE: / 'Werk:', p_werks.
      WRITE: / 'ID Fabrikkalender:', lv_t001w-fabkl.
      WRITE: / 'Datum:', p_date.
      WRITE: / 'Fabrikkalenderdatum:', lv_fabkldate.
      WRITE: / 'Nummer des Arbeitstags:', lv_factorydate.
      WRITE: / 'Datum ist Arbeitstag:', lv_workingday_indicator.
    ENDIF.
  ELSE.
    WRITE: / |Kein Fabrikkalender zum Werk { p_werks } verfügbar.|.
  ENDIF.