AUSpacken einer Lieferung - WS_DELIVERY_UPDATE Thema ist als GELÖST markiert

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

AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von Barney (Specialist / 104 / 20 / 9 ) » 26. Jan 2016 14:34

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


Re: AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von larsi (ForumUser / 47 / 2 / 11 ) » 26. Jan 2016 16:27

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 ) » 27. Jan 2016 07:52

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 ) » 27. Jan 2016 08:02

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 ) » 27. Jan 2016 15:11

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):
larsiMICBV (18. Nov 2019 09:37) • ewx (18. Nov 2019 11:14) • qyurryus (22. Nov 2019 15:14)


Re: AUSpacken einer Lieferung - WS_DELIVERY_UPDATE

Beitrag von larsi (ForumUser / 47 / 2 / 11 ) » 27. Jan 2016 22:03

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 ) » 2. Feb 2016 23:21

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 ) » 18. Nov 2019 10:36

Hallo Barney,
weil man es so leicht vergißt...
Barney hat geschrieben:
27. Jan 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 ) » 18. Nov 2019 16:02

wreichelt hat geschrieben:
26. Jan 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'.

Seite 1 von 1

Aktuelle Forenbeiträge

Generierte Datei auf bestimmte Email Adresse versenden
vor 12 Stunden von M@atze! 4 / 65
Zweite Zeile vorhanden, dann überprüfen auf Feld Gleichheit
vor 16 Stunden von a-dead-trousers 5 / 112
benutzerdefinierter CSV Ausgabepfad
Gestern von a-dead-trousers 8 / 147
Mehrere Funktionsbausteine verwenden
Gestern von a-dead-trousers 2 / 100

Unbeantwortete Forenbeiträge

Transaktionen MEIS / VE01
Gestern von SAP_ENTWICKLER 1 / 51
Cl_gui_html_viewer Problem
vor 5 Tagen von YoeBoy 1 / 24
Namensänderung von PSP Elementen
vor einer Woche von jamyr 1 / 46
Generische Objekte in der Massenverarbeitung
vor einer Woche von TravellingEntwickler 1 / 116
Virtuelles System anlegen
vor einer Woche von ichse18577 1 / 92