Hallo,
Auf Basis von Franz' Lösungsvorschlag in diesem Thread
http://www.access-o-mania.de/forum/index.php?topic=14444.0 (http://www.access-o-mania.de/forum/index.php?topic=14444.0)
habe ich folgendes zusammengestrickt. Wen's interessiert, bitte auch meinen Post in dem Thread lesen, da dort schon einiges erklärt wird.
Im Bild "Beziehungen.jpg" sind die beteiligten Tabellen abgebildet.
Die Tabelle "Lagerbewegungen" ist dabei die Zentrale.
Das markierte Feld "Bestandsart" in der Tabelle "Lagerbewegungsarten" ist das Kennzeichen für die verschiedenen Bestände (siehe o.a. Post). Dafür habe ich keine extra Tabelle angelegt, da das ja Werte sind, die der Anwender nie zu Gesicht bekommt, also auch nicht auswählen muss und damit auch keinen Klartext benötigt. Im Code wollte ich die in einer Public Enumeration festhalten, um einfach darauf zugreifen zu können.
Die Felder "BestandMindest" und "BestandInventur" in der Tabelle "ArtikelLagerbestaende" sind IMO Werte, die nicht berechnet werden (können).
Auf dieser Basis habe ich jetzt zwei Abfragen gebastelt, die auch genau das anzeigen, was gewünscht ist.
Abfrage "LagerBestaende" (damit wird dann das Form gefüllt)
SELECT LBS.ArtikelNr,
LBS.[1],
LBS.[2],
LBS.[3],
LBS.[4],
LBA.Abgaenge,
LBA.LetzterAbgang,
LBZ.Zugaenge,
LBZ.LetzterZugang,
LBI.Mindest, LBI.Inventur
FROM (
(
LagerBewSummiert AS LBS
INNER JOIN (
SELECT LB.ArtikelNr,
Sum(LB.RechenWert) AS Abgaenge,
Max(LB.BuchDatum) AS LetzterAbgang
FROM (
SELECT LB.ArtikelNr,
LBA.Bestandsart,
[Menge]*[Multiplikator] AS RechenWert,
LO.LagerortNr,
LO.LagerNr,
LB.BuchDatum
FROM Lagerorte AS LO
INNER JOIN (
Lagerbewegungsarten AS LBA
INNER JOIN Lagerbewegungen AS LB
ON LBA.BewegungsartNr =
LB.BewegungsartNr
)
ON LO.edKey = LB.LagerortNr
) AS LB
WHERE LB.Bestandsart=1 AND LB.RechenWert<0
GROUP BY LB.ArtikelNr
) AS LBA
ON LBS.ArtikelNr = LBA.ArtikelNr
)
INNER JOIN (
SELECT LB.ArtikelNr,
Sum(LB.RechenWert) AS Zugaenge,
Max(LB.BuchDatum) AS LetzterZugang
FROM (
SELECT LB.ArtikelNr,
LBA.Bestandsart,
[Menge]*[Multiplikator] AS RechenWert,
LO.LagerortNr,
LO.LagerNr,
LB.BuchDatum
FROM Lagerorte AS LO
INNER JOIN (
Lagerbewegungsarten AS LBA
INNER JOIN Lagerbewegungen AS LB
ON LBA.BewegungsartNr =
LB.BewegungsartNr
)
ON LO.edKey = LB.LagerortNr
) AS LB
WHERE LB.Bestandsart=1 AND LB.RechenWert>0
GROUP BY LB.ArtikelNr
) AS LBZ
ON LBS.ArtikelNr = LBZ.ArtikelNr
)
INNER JOIN (
SELECT ALB.ArtikelNr,
ALB.LagerortNr,
Sum(ALB.BestandMindest) AS Mindest,
Sum(ALB.BestandInventur) AS Inventur
FROM ArtikelLagerbestaende AS ALB
GROUP BY ALB.ArtikelNr, ALB.LagerortNr
HAVING ALB.LagerortNr=1
) AS LBI
ON LBS.ArtikelNr = LBI.ArtikelNr
Abfrage "LagerBewSummiert" (summiert die Bestände)
TRANSFORM Sum(LBB.RechenWert) AS Bestand
SELECT LBB.ArtikelNr
FROM (
SELECT LB.ArtikelNr,
LBA.Bestandsart,
[Menge]*[Multiplikator] AS RechenWert,
LO.LagerortNr,
LO.LagerNr,
LB.BuchDatum
FROM Lagerorte AS LO
INNER JOIN (
Lagerbewegungsarten AS LBA
INNER JOIN Lagerbewegungen AS LB
ON LBA.BewegungsartNr = LB.BewegungsartNr
)
ON LO.edKey = LB.LagerortNr
) AS LBB
GROUP BY LBB.ArtikelNr
PIVOT LBB.Bestandsart In (1,2,3,4)
Wobei 1, 2, 3, 4 die Bestandsarten sind.
Ich hoffe, dass das jetzt erstmal genug Informationen sind, um meine Fragen zu beantworten. Falls nicht, bei Interesse bitte nachfragen.
Meine Fragen sind:
1. Kann man die Abfrage auch einfacher formulieren? Die Subselects für Ab- und Zugänge sind ja eigentlich doppelt und unterscheiden sich nur in der WHERE-Klausel (WHERE LB.Bestandsart=1 AND LB.RechenWert<0 bzw. ... >0). Oder ist es besser die Subselects in einzelne Abfragen auszulagern? So hatte ich es zuerst, um dann diese Abfrage daraus zusammen zu stellen. Auch die Gruppierung ist da ja mehrfach drin. Ich haben es aber nicht hinbekommen, die (evtl.) unnötigen da heraus zu bekommen.
2. Wie kann ich später auf ein ganzes Lager (alle Lagerorte) gruppieren? Z.Zt. wird ja nach nur nach einem LagerORT gruppiert (da im Moment nur ein Lager/Lagerort vorhanden auch noch fest verdrahtet); - das wird später durch einen Formularbezug ersetzt.
Muss ich dazu in die Tabelle "Lagerbewegungen" noch einen FK auf die LagerNr einfügen?
Bin für alle Hinweise dankbar, und freue mich auf Eure Tipps.
gruss ekkehard
(jetzt ist aber Feierabend)
Hallo,
Nun hab' ich doch das Bild vergessen anzuhängen.
Hier ist es.
gruss ingrid
[Anhang gelöscht durch Administrator]
Hallo,
Hm, - was habe ich falsch gemacht?
Betreff zu unseriös, falsch gefragt, oder zu wenig Infos?
Oder fällt wirklich keinem was dazu ein?
gruss ekkehard
Hallo,
mir hat der Gruß von "ingrid" so zu schaffen gemacht, dass ich auch gleich Feierabend gemacht habe... ;D ;) 8)
Wobei ich zu 1) nicht viel wegen mangelndem Durchblick aktuell sagen kann (außer, dass ich das eher als Bericht darstellen würde)
und zu 2): halt auch nach dem Lager selber zusätzlich gruppieren..
Hallo Franz,
Zitatmir hat der Gruß von "ingrid" so zu schaffen gemacht,
Du kennst das aber schon, - oder?
ZitatWobei ich zu 1) nicht viel wegen mangelndem Durchblick aktuell sagen kann (außer, dass ich das eher als Bericht darstellen würde)
Was kann ich tun um das transparenter zu machen? Beruht ja auf einem Lösungsvorschalg von DIR.
Als Bericht brauche ich die Daten nicht, sondern als DS-Herkunft für ein UFo im Artikelstamm.
Zitathalt auch nach dem Lager selber zusätzlich gruppieren..
Ja, stimmt, habe das Lager ja schon drin im Subselect. Muss ich mal noch ein bisschen basteln.
Danke erstmal für Deine Rückmeldung.
gruss ekkehard
(der jetzt erstmal wieder noch ein bisschen arbeiten muss. Schaue später wiede vorbei)