Funktionsbaustein WS DELIVERY UPDATE 2

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Siehe Kategorie: TP Funktionsbausteine.

Mit dem Funktionsbaustein WS_DELIVERY_UPDATE_2 lassen sich Anlieferungen und Auslieferungen ändern.

Problem: Nicht möglich Positionen hinzufügen

Problem: Error-Meldung im Funktionsbaustein

  • Es ist im Projekt das Problem aufgetreten, dass manchmal im Funktionsbaustein eine Error-Message ausgegeben wurde und daher der aufrufende Report/Job abgebrochen ist.
  • Das Problem konnte durch die genaue Bezeichnung einer Exceptions "ERROR_MESSAGE" gelöst werden. Diese Ausnahme steht NICHT im FUnktionsbaustein unter den Ausnahmen da sind keine Ausnahmen definiert. Hier halb nur die Google-Reche und der der nachfolgende Blog-Eintrag. Vielen Dank für den Hinweis !!! Ich habe beim Debuggen nicht herausfinden können, wo diese Ausnahme ausgelöst wurde.
  • Siehe https://answers.sap.com/questions/2026213/handle-errorsexceptions-in-wsdeliveryupdate2.html

WS DELIVERY UPDATE 2 1.jpg

CALL FUNCTION 'WS_DELIVERY_UPDATE_2'
  EXPORTING
    vbkok_wa                  = ls_vbkok
    synchron                  = abap_true
    commit                    = abap_false      "Hier kein Commit Wor
    delivery                  = <fs_itab>-vbeln "und die Bestellung a
    if_database_update_1      = '1'             "Prüfen und sichern
    if_no_read_1              = lv_no_read_1    "abap_true, *005, EXT
    if_error_messages_send    = abap_false      "abap_true, *005, EXT
    "im Funktionsbaustein durch Parameterübergabe. Sonst bricht Repor
  IMPORTING
    ef_error_any              = lv_ef_error_any
    ef_error_in_item_deletion = lv_ef_error_in_item_deletion
    ef_error_in_pod_update    = lv_ef_error_in_pod_update
    ef_error_in_interface     = lv_ef_error_in_interface
    ef_error_in_goods_issue   = lv_ef_error_in_goods_issue
    ef_error_in_final_check   = lv_ef_error_in_final_check
    ef_error_partner_update   = lv_ef_error_partner_update
    ef_error_sernr_update     = lv_ef_error_sernr_update
  TABLES
    vbpok_tab                 = lt_vbpok
    prot                      = lt_prot
  EXCEPTIONS
    error_message             = 1                "005, EXT_REBERSTE, 
    OTHERS                    = 2.               "initial if no error

IF sy-subrc <> 0.

  Die Fehlermeldung steht in den System-Feldern und wird ausgegeben a
  MESSAGE ID sy-msgid
          TYPE 'I'
          NUMBER sy-msgno
          WITH sy-msgv1
               sy-msgv2
               sy-msgv3
               sy-msgv4.
endif.

Projektbeispiel

  • Hier werden für N Anlieferungen das Lieferdatum geändert.
  • Obwohl keine Positionen geändert werden, müssen die Positionen der Anlieferung dem Funktionsbaustein trotzdem übergeben werden.
*&---------------------------------------------------------------------*
*& Form UPDATE_LFDAT_ANLIEF
*&---------------------------------------------------------------------*
*& Update Anlieferung mit Lieferdatum
*& Anderes Beispiel: Report = ZSD_MASS_ANLIEFERG
*&---------------------------------------------------------------------*
FORM update_lfdat_anlief
  USING it_itab TYPE tty_itab.

  DATA: lt_vbpok   TYPE STANDARD TABLE OF vbpok,
        lt_prot    TYPE STANDARD TABLE OF prott,
        lv_counter TYPE i.

  CONSTANTS: lc_vbtyp_7 TYPE likp-vbtyp VALUE '7'.  "Anlieferung

* Schleife über Anlieferungen
  LOOP AT it_itab ASSIGNING FIELD-SYMBOL(<fs_itab>).

*   Lesen aller Positionen der Anlieferung
    SELECT
      vbeln,
      posnr,
      lfimg
      FROM lips
      WHERE matnr <> 'HANDLING_UNIT'
        AND vbeln = @<fs_itab>-vbeln
      INTO TABLE @DATA(lt_pos).

*   Füllen der nötigen Anlieferpositionen
    lt_vbpok = VALUE #( FOR wa_pos IN lt_pos ( vbeln_vl = wa_pos-vbeln      "Anlieferung
                                               posnr_vl = wa_pos-posnr      "Anlieferposition
                                               vbeln    = wa_pos-vbeln      "Folgevertriebsbeleg (gleich)
                                               posnn    = wa_pos-posnr      "Folgevertriebsbeleg-Position (gleich)
                                               pikmg    = wa_pos-lfimg ) ). "Menge (unverändert)
    CLEAR lt_pos.

*   Ein Update einer Anlieferung ohne Positionen ist nicht möglich. Da gibt es einen Shortdump. Auch
*   wenn man dies über die Transaktion VL32N durchführt.
    IF lt_vbpok IS INITIAL.
      MESSAGE i503(borgr) WITH <fs_itab>-vbeln. "'Anlieferung & enthält keine Positionen'
      ROLLBACK WORK.
      RETURN.
    ENDIF.

    CALL FUNCTION 'WS_DELIVERY_UPDATE_2'
      EXPORTING
        vbkok_wa               = VALUE vbkok( vbeln_vl = <fs_itab>-vbeln
                                              kzlfd    = abap_true       "Kennzeichen für Update Liefertermin
                                              lfdat    = <fs_itab>-lfdat "Anlieferdatum
                                              vbtyp_vl = lc_vbtyp_7 )    "Anlieferung
        commit                 = abap_false      "Hier kein Commit Work, da mehrere Anlieferungen auf gleiche Bestellung referenzieren können
        delivery               = <fs_itab>-vbeln "und die Bestellung auch geändert wird bei Änderung Liefertermin. Hier würde ohne ein Commit Work eine Sperrung erfolgen
        if_database_update_1   = '1'             "Prüfen und sichern
        if_error_messages_send = abap_true
      TABLES
        vbpok_tab              = lt_vbpok
        prot                   = lt_prot
      EXCEPTIONS
        others                 = 1.               "initial if no errors

    IF sy-subrc <> 0.
      MESSAGE i532(0u) WITH 'Fehler beim Update der Anlieferung'(002)
                            <fs_itab>-vbeln.

      ROLLBACK WORK.

      RETURN.
    ELSE.
      IF line_exists( lt_prot[ msgty = 'E' ] ).
        DATA(ls_prot) = lt_prot[ 1 ].

        MESSAGE ID ls_prot-msgid   "Nachrichtenklasse
              TYPE 'I'             "Typ (E = Error, S = Success, I = Info, A = Abbruch)
            NUMBER ls_prot-msgno   "Nachrichtennummer
              WITH ls_prot-msgv1   "Platzhaltervariable1
                   ls_prot-msgv2   "Platzhaltervariable2
                   ls_prot-msgv3   "Platzhaltervariable3
                   ls_prot-msgv4.  "Platzhaltervariable4

        ROLLBACK WORK.
        RETURN.
      ELSE.
        ADD 1 TO lv_counter.

      ENDIF.
    ENDIF.

  ENDLOOP.

* Datenbankupdate für alle Anlieferungen
  COMMIT WORK AND WAIT.

  message i011(zsd) with lv_counter. "'Es wurden &1 Anlieferungen mit Lieferdatum aktualisiert'

ENDFORM.