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
- Es ist nicht vorgesehen, dass bei bestehenden Anlieferungen durch diesen Funktionsbaustein Positionen hinzugefügt werden.
- Siehe OSS: 577453
- Siehe https://answers.sap.com/questions/322688/how-to-add-new-position-to-outbound-delivery.html oder https://www.dv-treff-community.de/sap-hilfe/Lieferung-erweitern-per-Programm-t5195.
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
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.