Offene Menge in Lieferplan / Lieferabruf

Offene Menge in Lieferplan / Lieferabruf

Postby Udo2975 » Tue Dec 07, 2004 1:52 pm

Hallo,

ich habe folgendes Problem:

Im Lieferabruf wird das Feld "offene Menge" von SAP berechnet und soweit ich weiß nicht in einer Tabelle gespeichert. Die offene Menge wird anhand der "bereits gelieferten Menge", der "tatsächlich beim Kunden eingegangenen und rückgemeldeten Menge" und "vom Kunden im aktuellen Lieferabruf gewünschten Menge" errechnet. Da ich die offene Menge in einem ALV anzeigen will und zusätzlich für die Verarbeitung in meinem Programm benötige und diese nicht manuell berechnen will, suche ich nach einem FB / BAPI oder ähnlichem. Könnt ihr mir da weiterhelfen?

THXS Martin :)
Udo2975
.
.
 
Posts: 3
Joined: Tue Dec 07, 2004 1:52 pm

Postby Muriel4178 » Tue Dec 07, 2004 2:00 pm

Hallo, habe diese Anforderung bei uns mit einem FuBau lösen können:



function z_offene_menge_eintlg.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(VBELV) LIKE VBFA-VBELV
*" VALUE(POSNV) LIKE VBFA-POSNV
*" VALUE(ETENR) LIKE VBEP-ETENR OPTIONAL
*" EXPORTING
*" VALUE(OMENG) LIKE VBEPD-VSMNG
*" VALUE(KZ_NIXOFFEN) TYPE C
*" EXCEPTIONS
*" EINTLG_UNGUELTIG
*" BELEG_UNGUELTIG
*"----------------------------------------------------------------------
************************************************************************
tables: vbap, vbep, vblb.

data: begin of r_vbfa,
vbelv like vbfa-vbelv,
posnv like vbfa-posnv,
vbeln like vbfa-vbeln,
vbtyp_n like vbfa-vbtyp_n,
rfmng like vbfa-rfmng,
erdat like vbfa-erdat,
end of r_vbfa.

data: i_vbfa like r_vbfa occurs 0 with header line.

data: begin of r_vbep,
vbeln like vbep-vbeln,
posnr like vbep-posnr,
etenr like vbep-etenr,
edatu like vbep-edatu,
wmeng like vbep-wmeng,
bmeng like vbep-bmeng,
end of r_vbep.

data: lfmng like vbfa-rfmng,
kwmeng like vbap-kwmeng,
index type i,
summe type p decimals 2,
edatu_eintlg type d,
lfnkd like vblb-lfnkd,
lfdkd like vblb-lfdkd.

************************************************************************

* Kontrolle auf Belegnummer
select single * from vbak
where vbeln = vbelv.
if sy-subrc <> 0.
raise beleg_ungueltig.
exit.
endif.

* gibt es gewählte Eintlg. überhaupt ?
if not etenr is initial.
select single * from vbep
where vbeln = vbelv
and posnr = posnv
and etenr = etenr.
if sy-subrc <> 0.
raise eintlg_ungueltig.
exit.
endif.
endif.

clear: lfnkd, lfdkd.
case vbak-vbtyp.
when 'E'.
clear: vblb, lfnkd.
select * from vblb
where vbeln = vbak-vbeln
order by abrdt ascending.
endselect.
lfnkd = vblb-lfnkd.
lfdkd = vblb-lfdkd.
endcase.

clear: lfmng, kz_nixoffen.
select vbelv posnv vbeln vbtyp_n rfmng erdat
from vbfa into r_vbfa
where vbelv = vbelv
and posnv = posnv.
case r_vbfa-vbtyp_n.
when 'J'.
if vbak-vbtyp = 'E' and r_vbfa-vbeln > lfnkd.
* wenn Korrekturlieferung --> keine Liefermenge, Gautsch, am: 01.07.02
select single * from likp where vbeln = r_vbfa-vbeln.
if sy-subrc <> 0. clear likp. endif.
if likp-lfart <> 'ZLKO'.
add r_vbfa-rfmng to lfmng.
endif.
endif.
if vbak-vbtyp = 'C'.
add r_vbfa-rfmng to lfmng.
endif.
* WHEN 'H' OR 'T'.
* IF vbak-vbtyp = 'E' AND r_vbfa-erdat > lfdkd.
* SUBTRACT r_vbfa-rfmng FROM lfmng.
* ENDIF.
* IF vbak-vbtyp = 'C'.
* SUBTRACT r_vbfa-rfmng FROM lfmng.
* ENDIF.
endcase.
endselect.


* handelt es sich um einen SD-Lieferplan oder Kauftr. ?
case vbak-vbtyp.
when 'E'.
clear kwmeng.
if etenr is initial.
* bilde KW-Meng zu allen Einteilungen
select vbeln posnr etenr edatu wmeng bmeng
from vbep into r_vbep
where vbeln = vbelv
and posnr = posnv.
add r_vbep-wmeng to kwmeng.
endselect.
else.
* hole Einteilungsdatum
select single * from vbep
where vbeln = vbelv
and posnr = posnv
and etenr = etenr.
if sy-subrc = 0.
clear edatu_eintlg.
edatu_eintlg = vbep-edatu.
* bilde KW-Meng bis zu Einteilung
select vbeln posnr etenr edatu wmeng bmeng
from vbep into r_vbep
where vbeln = vbelv
and posnr = posnv
order by edatu ascending.
if r_vbep-edatu > edatu_eintlg.
exit.
endif.
add r_vbep-wmeng to kwmeng.
endselect.
endif.
endif.
***********
when 'C'.
clear kwmeng.
if etenr is initial.
* bilde KW-Meng zu allen Einteilungen
select vbeln posnr etenr edatu wmeng bmeng
from vbep into r_vbep
where vbeln = vbelv
and posnr = posnv.
add r_vbep-bmeng to kwmeng.
endselect.
else.
* hole Einteilungsdatum
select single * from vbep
where vbeln = vbelv
and posnr = posnv
and etenr = etenr.
if sy-subrc = 0.
clear edatu_eintlg.
edatu_eintlg = vbep-edatu.
* bilde KW-Meng bis zu Einteilung
select vbeln posnr etenr edatu wmeng bmeng
from vbep into r_vbep
where vbeln = vbelv
and posnr = posnv
order by edatu ascending.
if r_vbep-edatu > edatu_eintlg.
exit.
endif.
add r_vbep-bmeng to kwmeng.
endselect.
endif.
endif.
endcase.

clear: omeng.
* berechne offene Menge zur Einteilung
omeng = kwmeng - lfmng.

if omeng <= 0.
omeng = 0.
kz_nixoffen = 'X'.
endif.

endfunction.

lG Harald
Muriel4178
.
.
 
Posts: 3
Joined: Mon Nov 15, 2004 2:03 pm

Postby Udo2975 » Tue Dec 07, 2004 9:52 pm

Hallo Harald,

vielen Dank für Deine schnelle Antwort und Deinen FB. Leider konnte ich mit diesem Funktionsbaustein nicht auf die offenen Mengen meines Lieferplanes kommen. Die offene Menge im Lieferplan (LAB / FAB) errechnet sich folgendermaßen:

Abruf-FZ = EFZ + Auftragsmenge
Offene Menge = Abruf-FZ - Liefer-FZ

Du nimmst in Deinem FB z. B. Alle Auftragsmengen her, obwohl diese nicht Disporelevant (?) sind und somit nicht in die Berechnung mit einfließen (oder?). D. h. bei Dir werden bei kwmeng alle Auftragsmengen der entsprechenden LP-Position zusammengezählt. Außerdem bekomme ich bei der lfmng mit Deinem FB alle Mengen, die im Belegfluß auftauchen, und nicht die tatsächlich im LP vorkommenden Mengen?

Kannst Du mir vielleicht noch ein paar Worte zu dem FB sagen, d. h. wofür dieser genau eingesetzt wird und ob dieser bei Dir die "richtigen" offenen Mengen berechnet. Anbei ein Screenshot von meinem Bsp.-LP mit den offenen Mengen, alle Positionen sind Dispo- und Lieferrelevant.

THXS Martin

P. S. gibt's nicht vielleicht einen SAP-Standard-FB für diese Problematik? Ich hab bisher leider keinen adäquaten gefunden...
Udo2975
.
.
 
Posts: 3
Joined: Tue Dec 07, 2004 1:52 pm

Postby Muriel4178 » Thu Dec 09, 2004 12:05 pm

Hallo, bei uns klappt dieser FuBau, wichtig bei SD-LPA´s ist die VBLB und aus der den letzten Abruf zu ermitteln.

Danach wird die Sollmenge bis zu einer Einteilung gebildet und die Liefermengen nach dem letzten Abruf bestimmt.

Ist diese gesamt grösser als die Sollmenge dann ist auch nichts mehr offen, wurde eine Einteilung erst teilgeliefert so wird die offene Menge wie in der SAP-Sicht ermittelt.

Bei uns gibt es auch noch Korrekturlieferungen die entsprechend behandelt werden müssen.

Hatte hier keinen FuBau finden können, es gibt vielleicht eine Möglichkeit über den Belegfluss zu gehen, hier gibt es allerdings FuBau wo zuvor einige Strukturen über andere FuBau versorgt werden müssen.

MfG Harald
Muriel4178
.
.
 
Posts: 3
Joined: Mon Nov 15, 2004 2:03 pm

Offene Menge wir dynamisch errechent

Postby Petra2739 » Mon Dec 13, 2004 5:45 pm

Hallo,
die offene Menge wird zum Zeitpunkt des Ausführens einer Transaktion (z.B. VL10E) dynamisch errechnet....die SAP benutzt den FB RV_SCHEDULE_CHECK_DELIVERIES.....und dann klappt auch mit den offenen Mengen
Mit freundlichen Grüßen
Der LogistikProfessor
Petra2739
.
.
 
Posts: 2
Joined: Mon Dec 13, 2004 5:45 pm

Postby Udo2975 » Mon Jan 03, 2005 3:13 pm

Hallo LogistikProfessor,

vielen lieben Dank für Deine Hilfe!!! :D
Der Funktionsbaustein hat mir sehr weitergeholfen.
Für alle, die das gleiche Problem haben:
Ein Beispielprogramm zum Aufruf des FB:


Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.   DATA: lv_vbeln TYPE vbak-vbeln,
  2.         lv_vbelp TYPE vbap-posnr.
  3.  
  4.   DATA: lt_vbap TYPE TABLE OF vbapvb,
  5.         lt_vbup TYPE TABLE OF vbupvb,
  6.         lt_vbep TYPE TABLE OF vbepvb,
  7.         lt_vbfa TYPE TABLE OF vbfavb.
  8.  
  9.   lv_vbeln = '0030000103'.
  10.   lv_vbelp = '20'.
  11.  
  12.   SELECT * FROM vbap INTO TABLE lt_vbap WHERE vbeln = lv_vbeln
  13.                                         AND   posnr = lv_vbelp.
  14.   SELECT * FROM vbup INTO TABLE lt_vbup WHERE vbeln = lv_vbeln.
  15.   SELECT * FROM vbfa INTO TABLE lt_vbfa WHERE vbelv = lv_vbeln
  16.                                          ORDER BY PRIMARY KEY.
  17.   SORT lt_vbfa BY mandt vbelv posnv vbeln posnn vbtyp_n.
  18.   SELECT * FROM vbep INTO TABLE lt_vbep WHERE vbeln = lv_vbeln
  19.                                         AND   posnr = lv_vbelp.
  20.  
  21.   CALL FUNCTION 'RV_SCHEDULE_CHECK_DELIVERIES'
  22.        EXPORTING
  23.             fbeleg = lv_vbeln
  24.             fposnr = lv_vbelp
  25.        TABLES
  26.             fvbfa  = lt_vbfa
  27.             fvbup  = lt_vbup
  28.             fxvbep = lt_vbep
  29.             fvbap  = lt_vbap
  30.        EXCEPTIONS
  31.             OTHERS = 3.  
  32.  
GeSHi ©



Die offene Menge steht anschließend in der Tabelle lt_vbep im Feld OLFMNG.
Udo2975
.
.
 
Posts: 3
Joined: Tue Dec 07, 2004 1:52 pm


Return to Sales and Distribution

Who is online

Users browsing this forum: No registered users and 14 guests