Funktionsbaustein WS DELIVERY UPDATE 2

Aus SAP-Wiki
Wechseln zu:Navigation, Suche

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

Problem: Nicht möglich Positionen hinzufügen

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.