[ABAP] Fabrikkalender: Anzahl Arbeitstage zu Fabrikkalenderdatum hinzurechnen

* 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 '+'.
* Anzahl Arbeitstage, die zum Fabrikkalenderdatum dazugerechnet werden sollen
PARAMETERS: p_days TYPE i DEFAULT 3.

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: / 'Ursprgl. Datum:', p_date.
      WRITE: / 'Fabrikkalenderdatum:', lv_fabkldate.
      WRITE: / 'Nummer des Arbeitstags:', lv_factorydate.

* Anzahl Tage zu Fabrikkalenderdatum hinzuzurechnen
      lv_factorydate = lv_factorydate + p_days.

      WRITE: / 'Korrigierter Arbeitstag:', lv_factorydate.

      DATA: lv_new_date TYPE scal-date.

* Kalenderfunktion Datum zu einem Fabrikkalenderdatum geben
      CALL FUNCTION 'FACTORYDATE_CONVERT_TO_DATE'
        EXPORTING
          factorydate                  = lv_factorydate
          factory_calendar_id          = lv_t001w-fabkl
        IMPORTING
          date                         = lv_new_date
        EXCEPTIONS
          calendar_buffer_not_loadable = 1
          factorydate_after_range      = 2
          factorydate_before_range     = 3
          factorydate_invalid          = 4
          factory_calendar_id_missing  = 5
          factory_calendar_not_found   = 6
          OTHERS                       = 7.

      IF sy-subrc = 0.
        WRITE: / 'Neues Fabrikkalenderdatum:', lv_new_date.
      ENDIF.

    ENDIF.
  ELSE.
    WRITE: / |Kein Fabrikkalender zum Werk { p_werks } verfügbar.|.
  ENDIF.

[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.

[ABAP] Materialbelegliste (MB51) anzeigen

Variante 1 (CALL TRANSACTION)

PARAMETERS: p_werk TYPE werks DEFAULT '10'.
PARAMETERS: p_matnr TYPE matnr.
PARAMETERS: p_lgort TYPE lgort_d.
PARAMETERS: p_bwart TYPE bwart.
PARAMETERS: p_charg TYPE charg_d.
PARAMETERS: p_lifnr TYPE lifnr.
PARAMETERS: p_kunnr TYPE kunnr.
PARAMETERS: p_kdauf TYPE kdauf.

START-OF-SELECTION.

* Werk
  SET PARAMETER ID 'WRK' FIELD p_werk.
* Material
  SET PARAMETER ID 'MAT' FIELD p_matnr.
* Lagerort
  SET PARAMETER ID 'LAG' FIELD p_lgort.
* Bewegungsart
  SET PARAMETER ID 'BWA' FIELD p_bwart.
* Charge
  SET PARAMETER ID 'CHA' FIELD p_charg.
* Lieferant
  SET PARAMETER ID 'LIF' FIELD p_lifnr.
* Kunde
  SET PARAMETER ID 'KUN' FIELD p_kunnr.
* Kundenuftrag
  SET PARAMETER ID 'AUN' FIELD p_kdauf.

  CALL TRANSACTION 'MB51' AND SKIP FIRST SCREEN.

Variante 2 (SUBMIT)

* Werk
DATA(lv_werk) = VALUE werks( ).
SELECT-OPTIONS: so_werk FOR lv_werk.
* Warenbegleitscheinnummer
DATA(lv_xabln) = VALUE xabln( ).
SELECT-OPTIONS: so_xabln FOR lv_xabln.
* Referenz-Belegnummer
DATA(lv_xblnr) = VALUE xblnr1( ).
SELECT-OPTIONS: so_xblnr FOR lv_xblnr.

INITIALIZATION.
* Vorbelegung für Werk
  so_werk[] = VALUE #( ( sign = 'I' option = 'EQ' low = '10' high = '' ) ).
  
START-OF-SELECTION.

* MB51 ist eine Reporttransaktion, also kann auch der dahinter
* liegende Report RM07DOCS direkt mit Übergabewerten aufgerufen werden
  SUBMIT rm07docs
    WITH werks IN so_werk
    WITH xabln IN so_xabln
    WITH xblnr IN so_xblnr
    WITH rhier_l = abap_true  " Radiobutton "Hierarchische Liste" aktiv setzen
    WITH rflat_l = abap_false " Radiobutton "Flache Liste" deaktivieren
    AND RETURN.

[ABAP] MM: Aktuelle Bedarfs-/Bestandsliste / reservierte Bestände analog zur Transaktion MMBE

* http://letscodeabap.blogspot.com/2015/03/get-reservations-in-abap.html
TYPES: BEGIN OF ty_xtab1,
         werks LIKE resb-werks,
         lgort LIKE resb-lgort,
         charg LIKE resb-charg,
         matnr LIKE resb-matnr,
         bdmng LIKE resb-bdmng,
         bdmns LIKE resb-bdmng,
         erfme LIKE resb-erfme,
         erfmg LIKE resb-erfmg,
       END OF ty_xtab1.

PARAMETERS: p_matnr TYPE marc-matnr DEFAULT '1234567890'.
PARAMETERS: p_werks TYPE marc-werks DEFAULT '10'.

START-OF-SELECTION.

  DATA: lv_detail TYPE bapi_mrp_stock_detail.
  DATA: lv_ret TYPE bapiret2.

* Material - Aktuelle Bedarfs-/Bestandsliste
  CALL FUNCTION 'BAPI_MATERIAL_STOCK_REQ_LIST'
    EXPORTING
      material         = p_matnr
      plant            = p_werks
    IMPORTING
      mrp_stock_detail = lv_detail
      return           = lv_ret.

  DATA: xbdart TYPE RANGE OF resb-bdart.

* Range Bedarfsarten
  DATA(rg_resb_bdart) = VALUE rseloption( ( sign   = 'I'
                                            option = 'EQ'
                                            low    = 'AR'
                                            high   = '' )
                                          ( sign   = 'I'
                                            option = 'EQ'
                                            low    = 'MR'
                                            high   = '' ) ).

* Range Werke
  DATA(rg_werks) = VALUE rseloption( ( sign   = 'I'
                                       option = 'EQ'
                                       low    = p_werks
                                       high   = '' ) ).

* Rückgabetabelle mit Beständen
  DATA: it_xtab1 type STANDARD TABLE OF ty_xtab1 WITH DEFAULT KEY.

* Lesen u. addieren v. reservierten Beständen
  CALL FUNCTION 'MB_ADD_RESERVATION_QUANTITIES'
    EXPORTING
      x_kzear = space " Endausfassung der Reservierung
      x_matnr = p_matnr
      x_xloek = space " Position ist gelöscht
    TABLES
      xbdart  = rg_resb_bdart
      xtab1   = it_xtab1
      xwerks  = rg_werks.

  cl_demo_output=>write_data( lv_ret ).
  cl_demo_output=>write_data( lv_detail ).
  cl_demo_output=>write_data( it_xtab1 ).
  cl_demo_output=>display( ).