Zuordnen einer HU zu einer Lieferung

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

Zuordnen einer HU zu einer Lieferung

Beitrag von Barney (Specialist / 104 / 20 / 9 ) » 23.03.2016 16:13
Ich habe mal wieder eine kleine Herausforderung: bei einigen Packmaterialien wird in der Lieferung beim Verpacken einer Lieferposition eine Unterposition erzeugt . Das versuche ich für eine Scannertransaktion nachzubauen. Erst erzeuge ich eine frei HU mit BAPI_HU_CREATE.

Dann versuche ich diese HU der Lieferung zuzuordnen. Ich habe ein Testprogramm, dass den Vorgang machen soll:

Code: Alles auswählen.

REPORT z_testdp.

DATA  ls_object TYPE hum_object.
DATA: ls_hum TYPE hum_rehang_hu,
      lt_hum TYPE TABLE OF hum_rehang_hu.
DATA  lf_exidv TYPE exidv VALUE 'HU_NUMMER'.
DATA  lt_messages  TYPE huitem_messages_t.
DATA: ls_hum_exidv TYPE hum_exidv,
      lt_hum_exidv TYPE hum_exidv_t.

ls_object-object = '01'.
ls_object-objkey = 'LIEFERNUMMER'.

lf_exidv = |{ lf_exidv ALPHA = IN }|.

ls_hum_exidv-exidv = lf_exidv.
APPEND ls_hum_exidv TO lt_hum_exidv.

CALL FUNCTION 'HU_GET_HUS'
  EXPORTING
    it_hus      = lt_hum_exidv
  IMPORTING
*   ET_HEADER   =
    et_messages = lt_messages
  EXCEPTIONS
    hus_locked  = 1
    no_hu_found = 2
    fatal_error = 3
    OTHERS      = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

SELECT SINGLE * FROM vekp
                INTO @DATA(ls_vekp)
                WHERE exidv EQ @lf_exidv.

ls_hum-venum = ls_vekp-venum.
ls_hum-top_hu_internal = ls_vekp-venum.
APPEND ls_hum TO lt_hum.

CALL FUNCTION 'HU_ASSIGN_HUS_TO_OBJECT'
  EXPORTING
    is_object         = ls_object
*   IS_HEADER51       =
    it_handling_units = lt_hum
*   IT_HUM_QM         =
  IMPORTING
    et_messages       = lt_messages
  EXCEPTIONS
    error             = 1
    OTHERS            = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

*       Update HU data:
CALL FUNCTION 'HU_PACKING_UPDATE'
  EXPORTING
    if_synchron = 'X'.

DATA lt_prott          TYPE TABLE OF prott.
DATA ls_prott          TYPE prott.
DATA ls_vbkok     TYPE vbkok.
DATA:  lv_error_any TYPE xfeld,
       lv_error_inf TYPE xfeld,
       lv_error_fch TYPE xfeld.

*       Update delivery:
ls_vbkok-vbeln_vl = ls_object-objkey.
ls_vbkok-vbeln = ls_object-objkey.
ls_vbkok-packing_final = 'X'.
CALL FUNCTION 'WS_DELIVERY_UPDATE'
  EXPORTING
    vbkok_wa                  = ls_vbkok
    delivery                  = ls_vbkok-vbeln
  IMPORTING
    ef_error_any_0            = lv_error_any
    ef_error_in_interface_0   = lv_error_inf
    ef_error_in_final_check_0 = lv_error_fch
  TABLES
    it_handling_units         = lt_hum
    prot                      = lt_prott
  EXCEPTIONS
    error_message             = 1
    OTHERS                    = 2.

COMMIT WORK AND WAIT.
Den Ablauf habe ich aus dem FuBa /ISDFPS/MM_ASSIGN_HU_TO_DLV entnommen. Auf diesen bin ich gestoßen, weil ich geschaut habe, wo HU_ASSIGN_HUS_TO_OBJECT verwendet wird.

Wenn ich das Testprogramm laufen lasse, dann funktioniert oberflächlich betrachtet: die HU wird der Lieferung zugeordnet. Aber es wird später keine Packunterposition in der Lieferung erzeugt, wenn ich das Material verpacke. Wenn ich mir meine HU anschaue, fällt mir auf, dass die Felder VSTEL, VKORG und VTWEG nicht gefüllt sind. Wenn ich die HU direkt in der Lieferung erzeuge, sind diese Felder aber gepflegt. Ich vermute, dass die Lieferung bei meinem Vorgehen noch nicht wirklich die Zuordnung mitbekommt und deswegen die HU nicht richtig in der Lieferung ist.

Hat jemand einen Hinweis, woran das liegen könnte oder was ich aufrufen muss, dass damit der Verpackungsvorgang richtig läuft?

Danke im Voraus.

Tot ziens


Re: Zuordnen einer HU zu einer Lieferung

Beitrag von IHe (ForumUser / 53 / 17 / 18 ) » 23.03.2016 17:00
Moin,

mir fällt auf, dass in der Tabelle lt_hum der Bezug zur Lieferung fehlt. Hier müssten wie in der FUBA-Doku zu HU_ASSIGN_HUS_TO_OBJECT die Felder RFBEL + RFPOS gefüllt werden.

Grüße, Ingo

Re: Zuordnen einer HU zu einer Lieferung

Beitrag von JHM (Top Expert / 1139 / 1 / 179 ) » 23.03.2016 17:05
Barney hat geschrieben:Wenn ich mir meine HU anschaue, fällt mir auf, dass die Felder VSTEL, VKORG und VTWEG nicht gefüllt sind. Wenn ich die HU direkt in der Lieferung erzeuge, sind diese Felder aber gepflegt. Ich vermute, dass die Lieferung bei meinem Vorgehen noch nicht wirklich die Zuordnung mitbekommt und deswegen die HU nicht richtig in der Lieferung ist.

Hat jemand einen Hinweis, woran das liegen könnte oder was ich aufrufen muss, dass damit der Verpackungsvorgang richtig läuft?
Hatte auch schon so meine Späße mit den HUs, du scheinst dich da ja richtig auszutoben ;-)

Hast du mal versucht IS_HEADER51 mit zugeben?
HU_ASSIGN_HUS_TO_OBJECT ruft damit den FuBa HU_DELIVERY_ATTRIBUTES_ADD auf. Darin werden dann auch VSTEL, VKORG, VTWEG für die HU gefüllt.
Gruß Hendrik

Re: Zuordnen einer HU zu einer Lieferung

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) » 23.03.2016 17:49
Auch, oder gerade weil es sich 'nur' um ein Testprogramm handelt, verstehe ich das Errorhandling bei Deinen FuBa Aufrufen nicht.

Code: Alles auswählen.

CALL FUNCTION 'HU_GET_HUS'
  EXPORTING
    it_hus      = lt_hum_exidv
  IMPORTING
*   ET_HEADER   =
    et_messages = lt_messages
  EXCEPTIONS
    hus_locked  = 1
    no_hu_found = 2
    fatal_error = 3
    OTHERS      = 4.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
Warum nicht einfach:

Code: Alles auswählen.

CALL FUNCTION 'HU_GET_HUS'
  EXPORTING
    it_hus      = lt_hum_exidv
  IMPORTING
*   ET_HEADER   =
    et_messages = lt_messages.
*  EXCEPTIONS
*    hus_locked  = 1
*    no_hu_found = 2
*    fatal_error = 3
*    OTHERS      = 4.
*IF sy-subrc <> 0.
** Implement suitable error handling here
*ENDIF.
Damit bist Du doch auf der sicheren Seite, dass kein Fehler aufgetreten ist. Bei einem Fehler kommt es dann eben zu einem Kurzdump.


Uebrigens, solche Codings gehen 'hier' in ins Produktivsystem.
Und das Ergebnis kann dann auch sein: "Wenn ich das .....programm laufen lasse, dann funktioniert oberflächlich betrachtet: die HU wird der Lieferung zugeordnet."

Re: Zuordnen einer HU zu einer Lieferung

Beitrag von Barney (Specialist / 104 / 20 / 9 ) » 24.03.2016 15:33
Hallo,

die Hinweise von Ingo und Hendrik haben leider nicht direkt weitergeholfen. Aber ich habe noch ein wenig rechecheriert und der Zwischenstand ist folgender:

Mein Testprogramm hat sich wie folgt vereinfacht:

Code: Alles auswählen.

DATA  ls_object TYPE hum_object.
DATA: ls_hum TYPE hum_rehang_hu,
      lt_hum TYPE TABLE OF hum_rehang_hu.
DATA  lf_exidv TYPE exidv VALUE 'HU_NUMMER'.
DATA  lt_messages  TYPE huitem_messages_t.
DATA: ls_hum_exidv TYPE hum_exidv,
      lt_hum_exidv TYPE hum_exidv_t.
DATA  ls_header51  TYPE header51.
DATA  lf_vbeln     TYPE vbeln.
data ls_likp2     type likpvb.

ls_object-object = '01'.
ls_object-objkey = 'LIEFERNUMMER'.

lf_exidv = |{ lf_exidv ALPHA = IN }|.
lf_vbeln = ls_object-objkey.

SELECT SINGLE * FROM vekp
                INTO @DATA(ls_vekp)
                WHERE exidv EQ @lf_exidv.

ls_hum-venum = ls_vekp-venum.
ls_hum-top_hu_internal = ls_vekp-venum.
ls_hum-top_hu_external = lf_exidv.
ls_hum-rfbel = ls_object-objkey.
ls_hum-rfpos = 'POS_NUMMER'.
APPEND ls_hum TO lt_hum.

SELECT SINGLE * FROM likp
                INTO @DATA(ls_likp)
               WHERE vbeln EQ @lf_vbeln.

MOVE-CORRESPONDING ls_likp to ls_likp2.

 PERFORM assign_hu_to_delivery(sapmv50a)
                                 USING ls_likp2 lt_hum[].

COMMIT WORK AND WAIT.
Danach sah die HU genauso aus, als hätte ich sie mit der VL02N hinzugefügt. Nach Ostern werde ich schauen, ob beim Verpacken dann auch wie gewünscht die Packunterposition in der Lieferung erzeugt wird.

Tot ziens

Re: Zuordnen einer HU zu einer Lieferung

Beitrag von Barney (Specialist / 104 / 20 / 9 ) » 24.03.2016 15:36
Unit605 hat geschrieben:Auch, oder gerade weil es sich 'nur' um ein Testprogramm handelt, verstehe ich das Errorhandling bei Deinen FuBa Aufrufen nicht.

...snip...
Also in dem Testprogramm habe ich mir überhaupt keine Gedanken über das Fehlerhandling gemacht. Trotzdem muss ich fragen, wo denn der Vorteil Deines Vorschlages ist, denn bei einigen Bausteinen brechen diese mit RAISE ab, aber die Protokolltabelle ist leer. Wenn ich dann später in meinem Programm ein vernünftiges Fehlerhandling machen will, dann muss ich die SY auslesen, um dem Nutzer ein passendes Feedback zu geben.

Tot ziens.

Re: Zuordnen einer HU zu einer Lieferung

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) » 24.03.2016 16:36
Barney hat geschrieben:
Unit605 hat geschrieben:Auch, oder gerade weil es sich 'nur' um ein Testprogramm handelt, verstehe ich das Errorhandling bei Deinen FuBa Aufrufen nicht.

...snip...
Also in dem Testprogramm habe ich mir überhaupt keine Gedanken über das Fehlerhandling gemacht. Trotzdem muss ich fragen, wo denn der Vorteil Deines Vorschlages ist, denn bei einigen Bausteinen brechen diese mit RAISE ab, aber die Protokolltabelle ist leer. Wenn ich dann später in meinem Programm ein vernünftiges Fehlerhandling machen will, dann muss ich die SY auslesen, um dem Nutzer ein passendes Feedback zu geben.

Tot ziens.
In einem Testprogramm mache ich mir auch keine grossen Gedanken ueber das Fehlerhandling. In einem fertigen Programm sieht das Fehlerhandling auch gaaaanz anders aus, als in einem Testprogramm, fuer Entwickler.
Genau deshalb ueberlasse ich es ja auch dem System (bei Testprogrammen) und erwarte bei einem Fehler einen Kurzdump. In dem Moment weiss ich, als Entwickler, aber, dass irgendetwas nicht richtig laeuft.

Und genau dieses Aussage: "denn bei einigen Bausteinen brechen diese mit RAISE ab," ist der Grund dafuer.
Dort ist ein Fehler aufgetreten und das kann/ist der Grund fuer Folgefehler oder das Programm liefert nicht das, was der Entwickler/User erwartet.


In Deinem bisherigen Programm laeuft es so ab, dass jeder Fehler der auftritt einfach nicht bemerkt wird. Du sagst dem System, WENN ein Fehler auftritt, mache nichts, ich werde mich darum kuemmern.
ABER, genau das machst Du nicht.
Du sagst mit Deinen Aufrufen, dass das System JEDEN Fehler im FuBa zurueckgeben soll, damit Du diesen Fehler behandeln kannst.
Das System sagt: Hier im FuBa ist ein Fehler aufgetreten. z.B. "Die HU ist von einem anderen User (beim Testen meisten sogar von einem selber) geblockt "

Deine Reaktion hinter den FuBa Aufrufen ist allerdings: "OK, System, Du meldest mir einen Fehler zurueck. Ist mir aber voellig egal, ich arbeite mit diesem Fehler in meinem Programm weiter, egal ob sinnvoll oder nicht".

Also wenn die HU wirklich geblockt ist, ist Dir das im Programm egal. Du arbeitest im Programm einfach so weiter, als ob die HU verfuegbar ist.
Dann kann es gut moeglich sein, dass die naechsten 10 Schritte im Programm ausgefuehrt werden, dann aber im 11. Schritt wieder ein Fehler auftritt (Beispiel: Jetzt verbuche die Aenderungen in der HU).
Und dort sagst Du aber wieder, um bei Deinem Testprogramm zu bleiben, "OK, die Verbuchung ging in die Hose, aber egal, mach einfach weiter".

Es gibt Fehler, die der FuBa zurueck gibt, oder ein Select, die voellig egal sind und auch den Programmablauf nicht stoeren oder das Ergebnis verfaelschen.
Diese Fehler laesst man sich dann einfach zurueckgeben, behandelt diese dann aber eben nicht wie eine Fehler.

==================================================

Z.B. selektiere die FAX nummer einer Person. Nicht jeder Person hat ein Fax, also ist eine fehlende FAX Nr. kein Fehler, sondern nur ein Ergebnis.
MUSS die Person eine Faxnummer haben, dann ginge das Richtung Datenfehler.


Z.B. schreibe ich hinter jedem SELECT-Befehl, wo ich 100%ig keinen Fehler erwarte einfach immer nur:
Beispiel: SELECT SINGLE * FROM MAKT WHERE MATNR = MARA-MATNR. "die Matnr wurde vorher aus der MARA selektiert.

Code: Alles auswählen.

   
IF SY-SUBRC NE 0.         " Materialkurztext fehlt!
* System error in program & (&) -> F1 
   MESSAGE X895(CJ) WITH sy-repid.
ENDIF.
Theoretisch darf und kann es kein Material ohne Materialkurztext geben.
ABER, ich habe es schon erlebt und durch dieses permanente Abfangen von "SY-SUBRC NE 0." finde man ab und zu (selten), findet man auch solche Fehler, die es nicht geben darf.

Im Falle einer Faxnummer, die nicht jeder habe muss, saehe es einfach so aus:

Code: Alles auswählen.

   
*IF SY-SUBRC NE 0.
*** Person hat keine Faxnummer, ist aber auch egal, da nicht mandatory
*ENDIF.
Diese ausdokummentierte Coding, soll einfach nur anderen Programmerier zeigen, dass ich dort (k)ein Fehlerhandling eingefuegt habe, weil es kein "richtiger" Fehler ist.

Re: Zuordnen einer HU zu einer Lieferung

Beitrag von SayAndre (ForumUser / 1 / 0 / 0 ) » 25.09.2020 16:41
Barney hat geschrieben:
24.03.2016 15:33
Hallo,

die Hinweise von Ingo und Hendrik haben leider nicht direkt weitergeholfen. Aber ich habe noch ein wenig rechecheriert und der Zwischenstand ist folgender:

Mein Testprogramm hat sich wie folgt vereinfacht:

Code: Alles auswählen.

DATA  ls_object TYPE hum_object.
DATA: ls_hum TYPE hum_rehang_hu,
      lt_hum TYPE TABLE OF hum_rehang_hu.
DATA  lf_exidv TYPE exidv VALUE 'HU_NUMMER'.
DATA  lt_messages  TYPE huitem_messages_t.
DATA: ls_hum_exidv TYPE hum_exidv,
      lt_hum_exidv TYPE hum_exidv_t.
DATA  ls_header51  TYPE header51.
DATA  lf_vbeln     TYPE vbeln.
data ls_likp2     type likpvb.

ls_object-object = '01'.
ls_object-objkey = 'LIEFERNUMMER'.

lf_exidv = |{ lf_exidv ALPHA = IN }|.
lf_vbeln = ls_object-objkey.

SELECT SINGLE * FROM vekp
                INTO @DATA(ls_vekp)
                WHERE exidv EQ @lf_exidv.

ls_hum-venum = ls_vekp-venum.
ls_hum-top_hu_internal = ls_vekp-venum.
ls_hum-top_hu_external = lf_exidv.
ls_hum-rfbel = ls_object-objkey.
ls_hum-rfpos = 'POS_NUMMER'.
APPEND ls_hum TO lt_hum.

SELECT SINGLE * FROM likp
                INTO @DATA(ls_likp)
               WHERE vbeln EQ @lf_vbeln.

MOVE-CORRESPONDING ls_likp to ls_likp2.

 PERFORM assign_hu_to_delivery(sapmv50a)
                                 USING ls_likp2 lt_hum[].

COMMIT WORK AND WAIT.
Danach sah die HU genauso aus, als hätte ich sie mit der VL02N hinzugefügt. Nach Ostern werde ich schauen, ob beim Verpacken dann auch wie gewünscht die Packunterposition in der Lieferung erzeugt wird.

Tot ziens
Hey,
stehe vor dem selben Problem.
Mit dem Coding passiert bei mir allerdings leider nichts :-( Beim debuggen sehe ich, dass die GT_V51VP leer ist. Beim VL02N manuellen zuweisen der HU ist diese gefüllt bei dem selben schritt.

Wie funktioniert das bei dir?
Ich bekomme mit folgendem Coding:

Ist nur ein Testprogramm. Data Dictionary darf daher gerne ignoriert werden ;-)

Code: Alles auswählen.

DATA  ls_object TYPE hum_object.
DATA: ls_hum TYPE hum_rehang_hu,
      lt_hum TYPE TABLE OF hum_rehang_hu.
DATA  lf_exidv TYPE exidv VALUE '00000000000113023787'.
DATA  lt_messages  TYPE huitem_messages_t.
DATA: ls_hum_exidv TYPE hum_exidv,
      lt_hum_exidv TYPE hum_exidv_t.
DATA  ls_header51  TYPE header51.
DATA  lf_vbeln     TYPE vbeln.
DATA  ls_likp2     TYPE likpvb.
DATA: lt_huchanged TYPE TABLE OF bapihuheader,
      ls_huchanged TYPE bapihuheader,
      lv_switch(1) TYPE c VALUE 'A',
      lt_return    TYPE TABLE OF bapiret2.
DATA ls_flags TYPE v51p_select_flags.
DATA lt_hus TYPE hum_exidv_t.
DATA ls_hu LIKE LINE OF lt_hus.
DATA lt_items TYPE TABLE OF vepovb.
DATA lt_history TYPE TABLE OF vevwvb.
DATA lt_high TYPE hum_venum_t.
DATA lt_new_values TYPE hum_update_header_t.
DATA ls_new_values LIKE LINE OF lt_new_values.
DATA lt_objects TYPE hum_object_t.
DATA lv_rcode TYPE sysubrc.

ls_object-object = '01'.
ls_object-objkey = '0011543649'.
lf_exidv = |{ lf_exidv ALPHA = IN }|.

SELECT SINGLE * FROM vekp
                INTO @DATA(ls_vekp)
                WHERE exidv EQ @lf_exidv.

lf_vbeln = ls_object-objkey.

SELECT SINGLE * FROM vekp
                INTO ls_vekp
                WHERE exidv EQ lf_exidv.

ls_hum-venum = ls_vekp-venum.
ls_hum-top_hu_internal = ls_vekp-venum.
ls_hum-top_hu_external = lf_exidv.
ls_hum-rfbel = ls_object-objkey.
ls_hum-rfpos = '000001'.
APPEND ls_hum TO lt_hum.

SELECT SINGLE * FROM likp
                INTO @DATA(ls_likp)
               WHERE vbeln EQ @lf_vbeln.

MOVE-CORRESPONDING ls_likp TO ls_likp2.

CALL FUNCTION 'HU_PACKING_REFRESH'.

CALL FUNCTION 'HU_READ_DELIVERY_AND_INIT'
  EXPORTING
    if_delivery       = ls_likp-vbeln
  EXCEPTIONS
    no_delivery_found = 1
    posted            = 2
    display_only      = 3
    error_message     = 100
    OTHERS            = 4.

IF sy-subrc <> 0.

* Implement suitable error handling here

ENDIF.

COMMIT WORK AND WAIT.

PERFORM assign_hu_to_delivery(sapmv50a)
                                USING ls_likp2 lt_hum[].



COMMIT WORK AND WAIT.

Diese Fehlermeldung:
Handling Unit 113023787 enthält eine Position, die nicht zugeordnet werden kann

Seite 1 von 1

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und besseren Inhalt:

Vergleichbare Themen

Handling Unit's via IDOC einer Lieferung zuordnen
von Mariana » 10.10.2004 11:02
OM - Verknüpfung zuordnen Popup
von Pyro » 05.03.2014 09:57
Sachbearbeiter zu Mahnbereich zuordnen
von hbr » 02.11.2011 16:20
Sachbearbeiter zu Mahnbereich zuordnen
von hbr » 02.11.2011 16:50
Debitor zum Vertiebsbereich zuordnen?
von bohne » 21.10.2006 11:39