AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
11 Beiträge • Seite 1 von 1
11 Beiträge Seite 1 von 1

AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von Barney (Specialist / 104 / 20 / 9 ) »
Hallo zusammen,

ich verzweifle, weil ich seit Tagen nicht wirklich weiterkomme und auch eine ausgiebige Recherche nicht final alle Fragen klären konnte.

Also: ich schreibe eine Scanner-Transaktion, mit denen die User im Lager eine Lieferung picken und packen kann. Wichtig ist, dass das betreffende Lager kein WM hat. D.h. die HU von denen ich spreche sind nicht bestandsgeführt. Nun soll der Mitarbeiter die Kommimenge pflegen und diese auf entweder eine neue HU oder eine bestehe verpacken. Das klappt mit WS_DELIVERY_UPDATE nach einigem K(r)ampf nun stabil. Auch der User mittlerweile die kommissionierte Menge sogar direkt im Transport verpacken (HU_PACKING_AND_UNPACKING).

So weit, so gut: Jetzt sollte der User auch in der Lieferung auspacken können (nicht umpacken, sondern explizit auspacken!).

Was habe ich schon ausprobiert:

HU_PACKING_AND_UNPACKING --> funzt, aber der Packstatus der Lieferposition wird nicht aktualisiert
HU_UNPACK --> funzt, aber der Packstatus der Lieferposition wird nicht aktualisiert

Mittlerweile habe ich auch einen OSS-Hinweis gefunden, der mit das bestätigt. Die Quintessenz ist, dass man eigentlich nur den WS_DELIVERY_UPDATE nutzen kann. Nur über den bekomme ich das zum Verrecken nicht hin. Ich habe es über die Tabelle IT_REPACK versucht.

Mir ist irgendwie nicht klar, wie ich dem FuBa beibringen, dass ich AUS- und nicht UMpacken will.

Hat da jemand Erfahrung oder Ideen, wie ich die Herausforderung lösen kann?

Danke im Voraus.

Tot ziens

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von larsi (ForumUser / 47 / 2 / 11 ) »
Hallo Barney,

ich denke das funktioniert nur, wenn Du folgende Schritte machst:

1. HU_GET_HUS um HU zu lesen und zu sperren
2. HU_UNPACK um die Mengen auszupacken
3. anschließend erst WS_DELIVERY_UPDATE aufrufen - hier musst Du bestimmt dafür sorgen, dass er Dir ggf. bereits gepufferte Daten nicht wieder initialisiert (ggf. über Parameter IF_NO_INIT_1 etc.). Außerdem musst Du hier den Parameter VBKOK_WA-PACKING_FINAL = 'X' setzen. Denn dann geht er ja in der Formroutine DELIVERY_UPDATE_PACKING in die Routinen create_xpackvbfa_ypackvbfa(sapmv50a) und init_complete_packing(sapmv50a), die eigentlich dafür sorgen, dass auch die Lieferung sauber aktualisiert wird. Tricky an der Stelle dürfte sein, den Aufruf des WS_DELIVERY_UPDATE so hinzubekommen, dass er im Prinzip keine weiteren Aktionen unternimmt. Die IT_REPACK würde ich dann bei diesem Aufruf auch nicht mehr füllen.

So ähnlich wäre ja auch der Ablauf, wenn Du manuell in der VL02N die Mengen aus einer HU wieder auspackst. Da der WS_DELIVERY_UPDATE wirklich ein Monster ist, kann man hier in der Tat locker mal ein paar Tage für brauchen (aus eigener leidvoller Erfahrung...)

Viele Grüße,
Lars

Folgende Benutzer bedankten sich beim Autor larsi für den Beitrag:
Barney



Re: AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von Barney (Specialist / 104 / 20 / 9 ) »
wreichelt hat geschrieben:Hallo,

auf der Seite http://www.tricktresor.de
http://www.tricktresor.de/blog/auspacken-von-hus/

gibt's Beispiele dazu.

Gruß
Wolfgang
Danke für den Hinweis, aber das war genau das, was ich schon versucht hatte. Das Ergebnis war, dass die HU ausgepackt war, aber der Packstatus der ausgepackten Lieferposition war noch "C". Damit würde im Packdialog keine zu verpackende Menge mehr angezeigt werden und man könnte die Lieferposition nicht neu verpacken. Das ist auch im OSS-Hinweis 581282 - Verpacken von Lieferungen ueber BAPI oder Funktionsbaustein beschrieben:
Es sollen Handling Units zu einer Lieferung erzeugt oder veraendert werden. Es ist geplant, dies ueber die BAPIs zum Business Objekt "Handling Units" zu realisieren. (Z.B. BAPI_HU_CREATE, BAPI_HU_DELETE, BAPI_HU_PACK, BAPI_HU_REPACK, BAPI_HU_UNPACK). Da diese Bausteine kein update auf die Lieferung machen, koennen diese nicht fuer das Verpacken in der Lieferung genutzt werden.
Ebenso ist es nicht moeglich, Lieferungen mit den Funktionsbausteinen der Funktionsgruppe V51E zu verpacken (HU_CREATE_ITEM, HU_CREATE_ONE_HU, HU_DELETE_HU, HU_REPACK, HU_UNPACK).
Ich werde mal Lars Empfehlung, obwohl es mir vor dem erneuten K(r)ampf mit dem WS_DELIVERY_UPDATE graut. :mrgreen:

Re: AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von Barney (Specialist / 104 / 20 / 9 ) »
Nachtrag:

Lars' Hinweis scheint valide. Ich habe eine Methode (EMPTY_HU_NEW aus der Klasse /SPE/CL_CONSOLIDATOR) gefunden, der genau die vorgeschlagene Vorgehensweise umsetzt:

Code: Alles auswählen.

  append iv_hu to gt_exidv.
  CALL FUNCTION 'HU_GET_HUS'
   EXPORTING
*   IF_OBJECT               =
      IF_LOCK_HUS             = 'X'
      IF_MORE_HUS             = 'X'
      if_no_loop              = /spe/if_consolidator_constants=>c_no
      IT_HUS                  = gt_exidv
   IMPORTING
      ET_HEADER               = gt_header
      ET_ITEMS                = gt_item
      ET_ITEM_SERIALNO        = it_serial_no
*    ET_HIGHEST_LEVELS       = gt_high
   EXCEPTIONS
      HUS_LOCKED              = 1
      NO_HU_FOUND             = 2
      FATAL_ERROR             = 3
      OTHERS                  = 4 .
* Check for exceptions
  et_messages = create_messages( iv_subrc = sy-subrc ).
  if et_messages[] is not initial.
    exit.
  endif.

* Prepare the parameter to call HU_Unpack method
  loop at gt_item assigning <item>.

    ls_from-exidv = iv_hu.
    LS_ITEM-ITEM_NUMBER = <item>-vepos.
    LS_ITEM-VELIN  = '1'. "Material item
    LS_ITEM-QUANTITY = <item>-vemng.
    LS_ITEM-MEINS = <item>-vemeh.

* Get the serial numbers into it_hu_ser_no for the item in the HU for
* the same VENUM and VEPOS as the <item>

   loop at it_serial_no into ls_serial_no.
     if ls_serial_no-venum = <item>-venum and
                     ls_serial_no-vepos = <item>-vepos.
        move ls_serial_no-sernr to ls_hu_ser_no-sernr.
        append ls_hu_ser_no to lt_hu_ser_no.
     endif.
   endloop.

* Call the unpack method to delete the HU; pass the serial number
* IT_HU_SERIAL_NO as an exporting parameter

    CALL METHOD me->HU_UNPACK
      EXPORTING
        IS_FROM       = ls_from
        IT_SERIAL_NR  = lt_hu_ser_no
*  IMPORTING
*    ES_HEADER     =
      CHANGING
        IS_ITEM       = ls_item
      EXCEPTIONS
        INPUT_MISSING = 1
        INPUT_ERROR   = 2
        NOT_POSSIBLE  = 3
        NOT_PACKED    = 4
        FATAL_ERROR   = 5
        others        = 6
            .
* Check for exceptions
    et_messages = create_messages( iv_subrc = sy-subrc ).
    if et_messages[] is not initial.
      exit.
    endif.

  endloop.

******************************
* end of change delivery-HUs *
******************************
****************************************
*  STEP 3
****************************************

  ls_vbkok_wa-vbeln = iv_dn.
  ls_vbkok_wa-packing_final = 'X'.
  ls_vbkok_wa-vbeln_vl = iv_dn.

  CALL FUNCTION 'WS_DELIVERY_UPDATE'
    EXPORTING
      vbkok_wa                     = ls_vbkok_wa
      delivery                     = iv_dn
      nicht_sperren                = 'X'
      if_get_delivery_buffered     = 'X'
      if_no_generic_system_service = 'X'
    TABLES
      prot                         = lt_prot.

  commit work and wait.
Ich hoffe, damit eine Vorlage zu habe, wie man den WS_DELIVERY_UPDATE korrekt zum Update des Packstatus ausruft.

[Nachtrag]
HU_UNPACK weigert sich auszupacken, weil die HU einer Lieferung zugeordnet ist. Irgendwie verstehe ich das nicht, denn wieso gibt es sonst einen FuBa wie UNPACK_HANDLING_UNIT, wo nach dem Auspacken der WS_DELIVERY_UPDATE aufgerufen wird. Ich versuche es mal mit HU_EMPTY_HU. Der war gestern jedenfalls nicht so empfindlich.

Re: AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von Barney (Specialist / 104 / 20 / 9 ) »
So, ich habe es nach einem harten Kampf hinbekommen. Und da es mich immer annervt, dass - wenn ich in Foren nach Lösungen suche - der Fragesteller immer nur zurückmeldet, dass er es hinbekommen hat, aber nie erklärt wie, hier mein Lösungsweg:

1. Aufruf des FuBa "HU_GET_HUS" mit der Liefernummer, um ALLE HU's der Lieferung zu bekommen.
2. Aufruf des Fuba "V51P_FILL_GT" mit allen HU's, um die globalen Tabellen zu befüllen
3. Aufruf des Fuba "V51P_FILL_GT" mit allen Lieferpositionen, um die globalen Tabellen zu befüllen
4. Aufruf des Fuba "HU_EMPTY_HU"
5. Aufruf des Fuba "WS_DELIVERY_UPDATE" wie folgt:

Code: Alles auswählen.

 CALL FUNCTION 'WS_DELIVERY_UPDATE'
      EXPORTING
        vbkok_wa                     = ls_vbkok_wa
        delivery                     = i_vbeln
        nicht_sperren                = 'X'
        if_get_delivery_buffered     = 'X'
        if_no_generic_system_service = 'X'
      TABLES
        vbpok_tab                    = lt_vbpok
        prot                         = lt_prot.
Warum brauchte ich nun zweimal den V51P_FILL_GT? Wie Lars in seinem Posting richtig erwähnte, geht der FuBa WS_DELIVERY_UPDATE am Ende in die Routinen create_xpackvbfa_ypackvbfa(sapmv50a) und init_complete_packing(sapmv50a). Dort wird dann der Belegfluß und die VBUP entsprechend aktualisiert. Dabei zieht er aber Daten aus den globalen Tabellen. Und wenn die nicht alle richtig gefüllt sind, dann wirft der Fuba einfach alle Lieferpositionen aus dem Belegfluß und setzt bei allen Positionen den Packstatus auf " " - obwohl ich nur eine Position auspacke. Beim erneuten Aufruf des Packdialogs in der Lieferung werden Materialien als zu verpacken angezeigt, die eigentlich noch verpackt sind. Deswegen müssen die globalen Tabellen unbedingt gefüllt sein.

Viel Erfolg, falls Ihr auch mal mit der WS_DELIVERY_UPDATE kämpfen dürft. ;-)

Tot ziens

Folgende Benutzer bedankten sich beim Autor Barney für den Beitrag (Insgesamt 4):
larsiMICBVewxqyurryus


Re: AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von larsi (ForumUser / 47 / 2 / 11 ) »
Hallo Barney,

das freut mich, dass es geklappt hat :-) Viel besser finde ich aber, dass Du hier Deine Lösung noch mal gepostest hast :up: - das machen ja in der Tat leider nicht sehr viele Leute…

Viele Grüße,
Lars

Re: AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
Ich musste auch mal HU's aus-/einpacken und habe mir folgendes Hilfe erstellt. Das Hilfsprogramm ist schon ein paar Jahre alt.... Ich habe aber z.B. den FuBa 'WS_DELIVERY_UPDATE_2' benutzt.

Gegeben ist:

Auslieferung 0080000010
Pos. 20
Verpacktes Material „TEST1“ mit 100 Stück.

Aus dieser Position 20 sollen nun 25 Stück von dem Material „TEST1“ ausgepackt werden:

UND die ausgepackte Menge 25 Stück, müssen wieder als zu verpackendes Material zur Verfügung stehen.

Dieser TESTreport beinhaltet nur das absolut unbedingt nötigste! Es werden keinerlei Fehler-/Meldungen abgefragt/ausgewertet.

Code: Alles auswählen.

REPORT  zz_hu_auspacken                        .

TYPE-POOLS: vsep.

DATA: lt_header TYPE hum_hu_header_t,
      lt_items TYPE hum_hu_item_t.

DATA: lwa_items LIKE LINE OF lt_items,
      lwa_header LIKE LINE OF lt_header.

DATA: h_is_objects TYPE  hum_object,
      lwa_vbkok_wa LIKE vbkok,
      lt_verko TYPE TABLE OF verko,
      lwa_verko LIKE LINE OF lt_verko.

DATA: cs_p_r TYPE vsep_s_pithu.

PARAMETER: p_belnr TYPE likp-vbeln DEFAULT '80000010',
           p_posnr TYPE lips-posnr DEFAULT '00020',
           p_auspac TYPE ltap_ndifa DEFAULT '-10.000'.

START-OF-SELECTION.

  h_is_objects-object = '01'.
  h_is_objects-objkey = p_belnr.
*1. ** Globale Tabellen füllen
  CALL FUNCTION 'HU_GET_HUS'
   EXPORTING
     if_lock_hus              = 'X'
     is_objects               = h_is_objects
   IMPORTING
     et_header                = lt_header
     et_items                 = lt_items.
  READ TABLE lt_items INTO lwa_items WITH KEY vbeln = p_belnr
                                              posnr = p_posnr.
  READ TABLE lt_header INTO lwa_header WITH KEY venum = lwa_items-venum.

  MOVE-CORRESPONDING lwa_items TO cs_p_r.

  cs_p_r-belnr = lwa_items-vbeln.
  cs_p_r-quantity = p_auspac.

*2. ** Auspacken des HU's
  CALL FUNCTION 'HU_PACKING_AND_UNPACKING'
    EXPORTING
      is_packing_request       = cs_p_r
   IMPORTING
     es_p_request             = cs_p_r.
*3. **Verbuchen der HUs nach erfolgreicher letzter Prüfung
  CALL FUNCTION 'HU_POST'
    EXPORTING
      if_synchron = 'X'
      if_commit   = 'X'
   is_object            = h_is_objects.

  LOOP AT lt_header INTO lwa_header. ":  where venum <> p_venum.
    MOVE-CORRESPONDING lwa_header TO lwa_verko.
    APPEND lwa_verko TO lt_verko.
  ENDLOOP.

  lwa_vbkok_wa-vbeln_vl = p_belnr.
  lwa_vbkok_wa-vbtyp_vl = 'J'.
*4. ** Update: Änderungen von Lieferungen
  CALL FUNCTION 'WS_DELIVERY_UPDATE_2'
    EXPORTING
      vbkok_wa                           = lwa_vbkok_wa
      delivery                           = p_belnr
   TABLES
     verko_tab                          = lt_verko.
*5. ** und WICHTIG!!!
  COMMIT WORK.

Re: AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von MICBV (ForumUser / 3 / 1 / 0 ) »
Hallo Barney,
weil man es so leicht vergißt...
Barney hat geschrieben:
27.01.2016 15:11
4. Aufruf des Fuba "HU_EMPTY_HU"
4b. Aufruf des FuBa "HU_POST" mit if_Synchron und if_Commit jeweils 'X'
5. Aufruf des Fuba "WS_DELIVERY_UPDATE" wie folgt:
ook tot ziens

Re: AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von MICBV (ForumUser / 3 / 1 / 0 ) »
wreichelt hat geschrieben:
26.01.2016 17:04
Hallo,

auf der Seite www.tricktresor.de
http://www.tricktresor.de/blog/auspacken-von-hus/

gibt's Beispiele dazu.

Gruß
Wolfgang
Das Tricktresor-Programm funktioniert leider wegen der Einschränkung im HU_Unpack auf Verpackungsobjekte leider nicht mit Lieferung bzw. Transporten (Shipments)

Code: Alles auswählen.

  if ( ls_header-vpobj = gc_obj_01 or ls_header-vpobj = gc_obj_02 or
     ls_header-vpobj = gc_obj_03 or ls_header-vpobj = gc_obj_04 or
     ( ls_header-vpobj = gc_obj_08 and gs_object-object ne gc_obj_08 ) )
     and gs_general-object ne '14'.

Re: AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von rob_abc (ForumUser / 55 / 11 / 18 ) »
Hallo zusammen

Da ich per google nichts gefunden hatte, was für meinen Fall auf Anhieb funktionierte, hier meine erstellten Code Snippets. Der Thread hat dabei gut geholfen.

Ausgangslage
Bestehende HUs liegen auf einem HU-geführten Lagerort (nicht WM) und sollen einer Auslieferung zugeordnet werden, wie das einfach über die VL02N geht. Auch soll die Zuordnung zwischen HU und Auslieferung wieder aufgelöst werden können. Es soll nicht nur die Referenz in der HU aktualisiert werden, sondern auch der Packstatus und Belegfluss der Lieferung. System S4/HANA 2020 FPS 2.

HU Auslieferung hinzufügen

Code: Alles auswählen.

DATA:
  g_venum TYPE venum VALUE '',
  g_vbeln TYPE vbeln_vl VALUE ''.

DATA(g_rehang_hu) = VALUE hum_rehang_hu_t( (
  top_hu_internal =  g_venum
  venum =  g_venum
  vepos = ''
  rfbel = g_vbeln
  rfpos = ''
) ).

CALL FUNCTION 'WS_DELIVERY_UPDATE_2'
  EXPORTING
    vbkok_wa            = VALUE vbkok( vbeln = g_vbeln )
    synchron            = abap_true
    commit              = abap_true
    delivery            = g_vbeln
  TABLES
    it_handling_units_1 = g_rehang_hu.
HU aus Auflieferung entfernen

Code: Alles auswählen.

DATA:
  g_vbeln  TYPE vbeln_vl VALUE '',
  g_venum  TYPE venum VALUE '',

  g_verko  TYPE TABLE OF verko,
  g_venums TYPE hum_venum_t,
  g_header TYPE hum_hu_header_t.

CALL FUNCTION 'HU_GET_HUS'
  EXPORTING
    is_objects = VALUE hum_object( object = '01' objkey = g_vbeln )
  IMPORTING
    et_header  = g_header.

g_venums = VALUE #( ( venum = g_venum ) ).

CALL FUNCTION 'V51P_DELETE_RELATIONSHIP'
  EXPORTING
    it_hus = g_venums.

IF lines( g_header ) EQ 1.
  g_verko = VALUE #( (  ) ).
ELSE.
  g_verko = VALUE #(
    FOR x IN g_header WHERE ( venum NE g_venum )
      ( exidv = x-exidv )
  ).
ENDIF.

CALL FUNCTION 'WS_DELIVERY_UPDATE_2'
  EXPORTING
    vbkok_wa  = VALUE vbkok( vbeln = g_vbeln )
    synchron  = abap_true
    commit    = abap_true
    delivery  = g_vbeln
  TABLES
    verko_tab = g_verko.

Seite 1 von 1

Vergleichbare Themen

0
Antw.
835
Views
Auspacken von Handling Units im Transport
von Bastian.Reitz » 20.01.2020 16:42 • Verfasst in ABAP® Core
9
Antw.
8594
Views
DBTab Update from Table oder in Loop mit "Update Set" Oder ?
von RIG » 09.03.2018 11:27 • Verfasst in ABAP® Core
3
Antw.
3540
Views
WA aus Sperrbestand mit Lieferung
von GERDLA » 27.12.2004 18:17 • Verfasst in Sales and Distribution
1
Antw.
2134
Views
Frachtkosten in Lieferung
von Gast » 18.08.2005 13:42 • Verfasst in Sales and Distribution
1
Antw.
2757
Views
Präferenzkennzeichen in Lieferung
von SAP_ENTWICKLER » 18.12.2015 15:52 • Verfasst in ABAP® Core

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.