Access Abfrage über 3 Tabellen

tombe

Erfahrenes Mitglied
Hallo,

da wir auf ein neues Warensystem umstellen, muss ich per ODBC aus unserer jetzigen Datenbank u.a. die Lagerbestände unserer Artikel auslesen.

Ich muss aus der Tabelle "Artikelposten" den Bestand je Lagerort ermitteln, aus der Tabelle "Artikel" muss ich den gültigen Durschnittspreis ermitteln und aus der Tabelle "Regalplatz" muss ich den Regalplatz für den jeweiligen Artikel in Verbindung mit den jeweiligen Lagerort ermitteln.

Die unten stehende Abfrage läuft zwar recht lange, liefert mir aber fast das gewünschte Ergebnis. Einziges Problem ist das es Artikel gibt die einen Bestand in einem bestimmten Lager haben, für die es aber keinen Regalplatz gibt. Alle diese Werte gehen verloren.

Ich probiere jetzt schon fast den ganzen Tag in Access herum und versuche die Abfrage so zu ändern das er mir wirklich alle Daten berechnet, doch leider ohne Erfolg.

Kann mir einer von euch einen Tipp geben wo ich ansetzen muss?

Danke vielmals Thomas

Code sql:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT
Artikelposten.Artikelnr_,
Artikelposten.Lagerortcode,
Regalplatz.Regalplatz,
Now() AS Buchungsdatum,
"Übernahme" AS Belegnr_,
"" AS Beschreibung,
SUM(Format([Menge],"0.00")) AS Bestand,
Avg(Artikel.Einstandspreis__durchschn__) AS Preis
FROM
Regalplatz
INNER JOIN
(Artikelposten INNER JOIN Artikel ON Artikelposten.Artikelnr_ = Artikel.Nr_)
ON
(Regalplatz.ArtikelNr_ = Artikelposten.Artikelnr_) AND (Regalplatz.Lagerort = Artikelposten.Lagerortcode)
GROUP BY
Artikelposten.Artikelnr_,
Artikelposten.Lagerortcode,
Regalplatz.Regalplatz
HAVING (((SUM(Artikelposten.Menge))<>0));
 
Tipp am Rande: FORMAT() nach dem SUM(), nicht davor - gibt genauere Zahlen

Zum Thema
a) LEFT JOIN
b) den Artikel als Master nehmen
SQL:
FROM 
    (
        artikel
        LEFT JOIN artikelposten
            ON artikelposten.artikelnr_ = artikel.nr_
    ) LEFT JOIN regalplatz
        ON regalplatz.artikelnr_ = artikelposten.artikelnr_
        AND regalplatz.lagerort = artikelposten.lagerortcode

c) Bei der Ausgabe den Regalplatz.Regalplatz prüfen (NZ() enstspricht NVL() aus Oracle)
SQL:
    NZ(Regalplatz.Regalplatz, 'NA') AS Regalplatz
 
Zuletzt bearbeitet von einem Moderator:
Hallo Yaslaw,

ich geb zu ich habe gehofft das du über den Beitrag "stolperst".

Habe die Abfrage so wie du es beschrieben hast geändert, doch jetzt bekomme ich gar keinen Regalplatz zurück! Hast du vielleicht noch eine Idee woran das liegen könnte.

Danke Thomas
 
Fehlen nur die Angaben des Ragalplatzes oder kommen gar keine Zeilen mehr?

Zeig doch mal deine Umsetzung
 
So ich habe jetzt einige Tests gemacht und die Abfrage zig Mal neu erstellt.

Hier fehlen jetzt zwar ein paar Felder (die nicht relevant sind) aber das Ergebnis ist theoretisch richtig.

SQL:
SELECT
    Artikel.Nr_,
    Artikelposten.Lagerortcode,
    Sum(Artikelposten.Menge) AS Anzahl,
    Regalplatz.Regalplatz
FROM
    Regalplatz
RIGHT JOIN
    (Artikel LEFT JOIN Artikelposten ON Artikel.Nr_ = Artikelposten.Artikelnr_)
ON
    (Regalplatz.ArtikelNr_ = Artikelposten.Artikelnr_) AND (Regalplatz.Lagerort = Artikelposten.Lagerortcode)
WHERE
    (((Artikelposten.Artikelnr_)<>''))
GROUP BY
    Artikel.Nr_, Artikelposten.Lagerortcode, Regalplatz.Regalplatz
HAVING
    (((Sum(Artikelposten.Menge))<>0));

Theoretisch deshalb weil:
Ich habe bisher in Access nur eine Verknüpfung zu den Originaltabellen zum Arbeiten gehabt.
Da ich gestern noch von zu Hause aus getestet habe, habe ich mir Kopien der Tabellen "Artikel", "Artikelposten" und "Regalplatz" gezogen und mit diesen gearbeitet.

Wenn ich obige Abfrage in dieser Datenbank/mit diesen Tabellen ausführe, bekomme ich das gewünschte Ergebnis mit 3.801 Datensätzen zurück.

Wenn ich aber genau die gleiche Abfrage per ODBC ausführe und auf die verknüpften Tabellen zugreife, erhalte ich nur ~260 Datensätze zurück.

Es kommt kein Timeout oder eine andere Fehlermeldung und das bereitet mir jetzt Kopfzerbrechen.

Ich weiß die Frage ist so eigentlich nicht zu beantworten: Habt ihr eine Idee woran das jetzt liegen könnte?
 
Zurück