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?
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.
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:
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...
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
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.
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
vielen lieben Dank für Deine Hilfe!!!
Der Funktionsbaustein hat mir sehr weitergeholfen.
Für alle, die das gleiche Problem haben:
Ein Beispielprogramm zum Aufruf des FB:
DATA: lv_vbeln TYPE vbak-vbeln,
lv_vbelp TYPE vbap-posnr.
DATA: lt_vbap TYPE TABLE OF vbapvb,
lt_vbup TYPE TABLE OF vbupvb,
lt_vbep TYPE TABLE OF vbepvb,
lt_vbfa TYPE TABLE OF vbfavb.
lv_vbeln = '0030000103'.
lv_vbelp = '20'.
SELECT * FROM vbap INTO TABLE lt_vbap WHERE vbeln = lv_vbeln
AND posnr = lv_vbelp.
SELECT * FROM vbup INTO TABLE lt_vbup WHERE vbeln = lv_vbeln.
SELECT * FROM vbfa INTO TABLE lt_vbfa WHERE vbelv = lv_vbeln
ORDER BY PRIMARY KEY.
SORT lt_vbfa BY mandt vbelv posnv vbeln posnn vbtyp_n.
SELECT * FROM vbep INTO TABLE lt_vbep WHERE vbeln = lv_vbeln
AND posnr = lv_vbelp.
CALL FUNCTION 'RV_SCHEDULE_CHECK_DELIVERIES'
EXPORTING
fbeleg = lv_vbeln
fposnr = lv_vbelp
TABLES
fvbfa = lt_vbfa
fvbup = lt_vbup
fxvbep = lt_vbep
fvbap = lt_vbap
EXCEPTIONS
OTHERS = 3.
Die offene Menge steht anschließend in der Tabelle lt_vbep im Feld OLFMNG.
Folgende Benutzer bedankten sich beim Autor martin für den Beitrag: Legxis