Verfallsabfrage Artikel

Saapmax

Neuer Benutzer
Beiträge
3
hallo zusammen,

SQL anfänger hier und bräuchte hilfe bei einer kleinen datenbank abfrage.

Ich möchte mit dieser Abfrage erfahren welchen Verfall mein Artikel im Aktuellen Bestand hat.

Beispiel:

Ich habe 3 Datenquellen:
Wareneingangs datenquelle (Eingangsdatum, Artikelnr., Menge, Verfalldatum)
Lieferdatum Artikelnr. Verfall Menge
03.07.2014 123456 30.04.2017 40
01.08.2014 123456 30.06.2017 20
Kommisionier datenquelle (Kommisionierdatum, Artikelnr., Menge)
Datum Artikelnr. Menge
31.07.2014 20:14 123456 -1
31.07.2014 20:30 123456 -35
03.08.2014 20:02 123456 -14
und den Aktuellen Bestand als datenquelle (Artikelnr., Bestand)
Bestand: 10


Die frage ist jetzt, reichen diese 3 datenquellen aus um herausfinden zu können welchen Verfalldatum mein aktueller Bestand hat( nach kommisionierung und eventuellen weiteren wareneingängen)
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
SQL anfangär hier und bräuchte hilfe bei einer kleinen datenbank abfrage.

Ich möchte mit dieser Abfrage erfahren welchen Verfall mein Artikel im Aktuellen Bestand hat.

Aus Deinem Text geht nicht wirklich hervor, wie Deine Tabellen aufgebaut sind. Ich denke aber, in Deinem Modell fehlen wichtige Dinge.
Wie willst Du nach z.B. 10 Lieferungen und 27 Kommisionierungen noch wissen, welche Charge (Verfallsdatum) wo ist?
 
Du brauchst definitiv noch eine ID Information in der Wareneingangstabelle die deinen Eingang eindeutig macht und die dann in den anderen Tabellen wie Bestand und Kommisionierung aufgegriffen wird. Dann könntest du bestimmen wo die welche Charge mit welchem Verfallsdatum gelandet ist.
 
hallo,
danke für die Antwort,

noch zur weiteren erklärung. Wir haben das FiFo prinzip und die Charge von den alten Wareneingang solte sollange bestehen bis der Bestand des alten WEs aufgebraucht wurde. ID info kann ich warscheinlich bekommen.

könnte man dafür eine Beispiel SQL Abfrage erstellen womit ich herumdoktoren könnte? :)
 
Also einen Ansatz habe ich wohl aber ohne Testdaten auch irgendwie schwer.
Code:
WITH t AS (
SELECT    ROW_NUMBER() OVER (ORDER BY Eingangsdatum) AS zeile,
        Artikelnr,
        Menge,
        Eingangsdatum,
        Verfallsdatum
FROM    wareneingang
)
SELECT    asdf.Artikelnr,
        asdf.Bestand,
        asdf.zeile,
        asdf.Menge,
        asdf.Eingangsdatum,
        asdf.Verfallsdatum,
        asdf.Menge_Summe
FROM    (

SELECT    b.Artikelnr,
        b.Bestand,
        e1.zeile,
        e1.Menge,
        e1.Eingangsdatum,
        e1.Verfallsdatum,
        (    SELECT    sum(e2.Menge)
            FROM    t e2
            WHERE    e2.Artikelnr = b.Artikelnr
            AND        e2.zeile <= z1.zeile ) AS Menge_Summe
FROM    bestand b
LEFT JOIN t e1
ON        b.Artikelnr = e1.Artikelnr

) asdf
WHERE    asdf.Bestand <= asdf.Menge_Summe
Meine Idee in Kürze: Joine auf deinen Bestand die letzten Wareneingänge bis deine Bestandsmenge gleich der Menge der eingegangen Waren ist. Dann kannst du ein oder mehrere Verfallsdaten haben, je nachdem wieiviele Eingägnge betroffen sind.
Probleme:
a) Gab es z.B. eine Lieferung von der nur ein Teil verkauft wurde müsste deiner Bestandsmenge eine Teillieferung zugeordnet werden weil Bestandsmenge immer <= Eingangsmenge sein muss. Das kann man sicher noch mathematisch lösen.
b) Wenn FiFo nicht immer exakt gilt, z.B. weil eine Palette weggeworfen wurde weil beschädigt oder verfallen. Das wird aber wohl irgendwie abgebildet sein, ich gehe mal davon aus dein Bestand ist immer real existent und in der Eingangstabelle stehen auch nur Waren die tatsächlich ins Lager gegangen sind.
 
Eine kleine Idee aus der Oracle-Ecke :)
Kann ich halt nicht testen... Da keine Testdaten vorhanden sind ^^

Code:
Select Min(we.verfallsdatum)
From   (Select artikelnr,
               verfallsdatum,
               menge
        From   wareneingang
        Order  By lieferdatum Desc) we
Group  By we.artikelnr
Having Sum(we.menge) >= (Select bestand
                         From   bestand
                         Where  artikelnr = we.artikelnr)

PS: Und dieses mal drücke ich nicht auf "Antwort erstellen", bevor ich fertig bin^^
 
@ukulelte:
Zu 1) Nein, wirft keinen Fehler... Syntaktisch auch vollkommen korrekt :) Da die Spalte ja vorhanden ist, wäre es viel unlogischer wenn ein Fehler verursacht würde ^^

Zu 2) Das mache ich damit ich in der richtigen Reihenfolge summiere... Ansonsten kann es passieren das zuerst die Mengen von vor 3 Jahren benutzt werden ;)

Allgemein kann man sagen:
Das ganze ist keine Lösung für das Problem, sondern nur eine "Idee aus der Oracle-Ecke". Wie schon beim ersten Post geschrieben :)
Und ob es mit den benötigten Tabellen auch wirklich laufen würde... Keine Ahnung, mache mir nicht die Mühe auch noch selbst Daten zu generieren ^^
Wenn es nur eine Tabelle ist vllt., aber nicht bei drei. Also habe ich das Statement auch noch nicht ausgeführt -> ist nur reine Theorie :)
 
Habe hier mal eine funktionsfähige Version gebastelt.
(zumindest funktionsfähig in Oracle :) )

Ausgangsdaten:
Code:
SQL> Select *
  2  From   t
  3  Order  By eingangsdatum;
EINGANGSDATUM ARTIKELNUMMER      MENGE VERFALLSDATUM
------------- ------------- ---------- -------------
21.09.2014    123456              5000 21.09.2019
26.09.2014    123456              3000 26.09.2019
30.09.2014    123456               100 30.09.2019
01.10.2014    123456               300 01.10.2019
21.10.2014    123456              5500 21.10.2019
31.10.2014    123456                10 31.10.2019
10.11.2014    123456              1000 10.11.2019
7 rows selected

Select:
Code:
SQL> Select Min(we.verfallsdatum) keep(dense_rank First Order By we.menge Asc)
  2  From   (Select Sum(menge) over(Order By eingangsdatum Desc Range Between unbounded preceding And Current Row) menge,
  3                 verfallsdatum
  4          From   (Select we.eingangsdatum,
  5                         we.menge,
  6                         we.verfallsdatum
  7                  From   t we
  8                  Where  we.artikelnummer = '123456')) we
  9  Where  we.menge >= 1001;
MIN(WE.VERFALLSDATUM)KEEP(DENS
------------------------------
31.10.2019
SQL>

Variablen sind hier in Zeile 8 die Artikelnummer (bei meinem Test 123456) und in Zeile 9 der Bestand (hier jetzt gerade 1001).
Diese einzufügen sollte aber nichtmehr so schwer sein ^^

P.S.: Kann es sein das man seinen letzten Beitrag nicht editieren kann ?
 
Werbung:
Zurück
Oben