Access-Fehler bei Verknüpfung zweier Unterabfragen
Kanne
Gesendet: 20.07.12 09:15
Betreff: Access-Fehler bei Verknüpfung zweier Unterabfragen


Hi,
muss etwas weiter ausholen, da die Problemanalyse auch entsprechend langwierig war ... fasse das möglichst kurz zusammen:
Wir wollen Differenzen aus zwei Buchungsdateien herausfinden.
Dazu pro Buchungsdatei eine Abfrage mit Mengen-Summe pro Auftrag/Artikel/Buchungstag gemacht und dann in einer neuen Abfrage beides miteinander verglichen ... funktioniert auch soweit.
Dann haben wir festgestellt, dass im Vergleichsfeld für den Buchungstag idR nur nur ein Tag steht, manchmal aber auch Tag und Uhrzeit (warum auch immer);
also mussten für den Vergleich ein berechnetes Feld geschaffen werden, der nur den Tagesanteil als Gruppierung nimmt - in Access ja prima über Abfrage-Funktione DATWERT: "cDatumFA: DatWert([DatumZeitStart])".
Nun zum Problem:
In der Vergelichsabfrage werden nun überhaupt keine Sätze mehr ausgewiesen, selbst wenn man (wie vorher) zur Verknüpfung nicht die berechneten Werte sondern direkt die Datumsfelder nimmt ?!?
Habe lange nach einen Fehler gesucht ... nichts gefunden. Die Daten selber liegen auf einem SQL2005 - dort habe ich mal die SQL-Statements geloogt ... auch sehr merkwürdig:
ohne die DATWERT-Felder laufen auf dem SQL zwei "normal" aussehende Abfragen, die dann anscheinend in Access verknüpft werden (hätte ja eigentlich gedacht, dass die Gesamtabfrage an den Server geht),
mit den DATWERT-Felder laufen auf dem SQL zwei "normal" aussehende Abfragen (ohne Summenbildung), die dann anscheinend in Access verknüpft werden (hätte ja eigentlich gedacht, dass die Gesamtabfrage an den Server geht).

Als Anlage habe ich die SQL-Tabellen mal in die MDB gezogen und die Abfragen modifiziert:
dort geht eine Verknüpfung über das notwendige Feld "Str([BelID]) AS b_Ref" gar nicht mehr ... scheint also ein Probloem im Access zu sein, eine Verknüpfung über das berechnete Feld zu machen !?
(in Variante 1 wurde das ja auf dem SQL-Server berechnet und als Feld zurückgeliefert ... das schafft Access dann wohl gerade)

Variante 1 - ohne berechnete Felder per DATWERT:

1. Abfrage
ACCESS:
SELECT dbo_KHKLagerplatzbuchungen.Referenz, dbo_KHKLagerplatzbuchungen.Bewegungsdatum, dbo_KHKLagerplatzbuchungen.Artikelnummer, dbo_KHKLagerplatzbuchungen.Bewegungsart, Sum(dbo_KHKLagerplatzbuchungen.MengeLager) AS SummevonMengeLager
FROM dbo_KHKLagerplatzbuchungen
WHERE (((dbo_KHKLagerplatzbuchungen.Intern)=0))
GROUP BY dbo_KHKLagerplatzbuchungen.Referenz, dbo_KHKLagerplatzbuchungen.Bewegungsdatum, dbo_KHKLagerplatzbuchungen.Artikelnummer, dbo_KHKLagerplatzbuchungen.Bewegungsart
HAVING (((dbo_KHKLagerplatzbuchungen.Referenz)="402412") AND ((dbo_KHKLagerplatzbuchungen.Bewegungsart)="ZF" Or (dbo_KHKLagerplatzbuchungen.Bewegungsart)="EF"))
ORDER BY dbo_KHKLagerplatzbuchungen.Bewegungsdatum DESC;
SQL-LOG:
SELECT "Referenz" ,"Bewegungsdatum" ,"Artikelnummer" ,"Bewegungsart" ,SUM("MengeLager" ) FROM "dbo"."KHKLagerplatzbuchungen" WHERE ((("Intern" = 0 ) AND ("Referenz" = '402412' ) ) AND ("Bewegungsart" IN ('ZF' ,'EF' ) ) ) GROUP BY "Referenz" ,"Bewegungsdatum" ,"Artikelnummer" ,"Bewegungsart" ORDER BY "dbo"."KHKLagerplatzbuchungen"."Bewegungsdatum" DESC

2. Abfrage
ACCESS:
SELECT Str([BelID]) AS b_Ref, dbo_KHKPpsRueckmeldungen.BelID, dbo_KHKPpsRueckmeldungen.Artikelnummer, Sum(dbo_KHKPpsRueckmeldungen.MengeGut) AS SummevonMengeGut, dbo_KHKPpsRueckmeldungen.Typ, dbo_KHKPpsRueckmeldungen.Status, dbo_KHKPpsRueckmeldungen.DatumZeitStart
FROM dbo_KHKPpsRueckmeldungen
GROUP BY Str([BelID]), dbo_KHKPpsRueckmeldungen.BelID, dbo_KHKPpsRueckmeldungen.Artikelnummer, dbo_KHKPpsRueckmeldungen.Typ, dbo_KHKPpsRueckmeldungen.Status, dbo_KHKPpsRueckmeldungen.DatumZeitStart
HAVING (((dbo_KHKPpsRueckmeldungen.BelID)=402412) AND ((dbo_KHKPpsRueckmeldungen.Status)=0));
SQL-LOG:
SELECT {fn convert("BelID" ,SQL_VARCHAR)},"BelID" ,"Artikelnummer" ,SUM("MengeGut" ) ,"Typ" ,"Status" ,"DatumZeitStart" FROM "dbo"."KHKPpsRueckmeldungen" WHERE (("BelID" = 402412 ) AND ("Status" = 0 ) ) GROUP BY {fn convert("BelID" ,SQL_VARCHAR)},"BelID" ,"Artikelnummer" ,"Typ" ,"Status" ,"DatumZeitStart"

3. Vergleich: Ergebnis richtig: 2 Datensätze, davon einer mit unterschiedlichen Summen des Tages
ACCESS:
SELECT [Q_tmp_Lagerbuchungen FA Summen].*, Q_tmp_PPSRueckmeldungen_Summen.*
FROM [Q_tmp_Lagerbuchungen FA Summen] INNER JOIN Q_tmp_PPSRueckmeldungen_Summen ON ([Q_tmp_Lagerbuchungen FA Summen].Artikelnummer = Q_tmp_PPSRueckmeldungen_Summen.Artikelnummer) AND ([Q_tmp_Lagerbuchungen FA Summen].Bewegungsdatum = Q_tmp_PPSRueckmeldungen_Summen.DatumZeitStart) AND ([Q_tmp_Lagerbuchungen FA Summen].Referenz = Q_tmp_PPSRueckmeldungen_Summen.b_Ref);
SQL-LOG: (auf SQL nur die beiden Unterabfragen !?! Zusammenführung in Access !!!)
SELECT "Referenz" ,"Bewegungsdatum" ,"Artikelnummer" ,"Bewegungsart" ,SUM("MengeLager" ) FROM "dbo"."KHKLagerplatzbuchungen" WHERE ((("Intern" = 0 ) AND ("Referenz" = '402412' ) ) AND ("Bewegungsart" IN ('ZF' ,'EF' ) ) ) GROUP BY "Referenz" ,"Bewegungsdatum" ,"Artikelnummer" ,"Bewegungsart"
SELECT {fn convert("BelID" ,SQL_VARCHAR)},"BelID" ,"Artikelnummer" ,SUM("MengeGut" ) ,"Typ" ,"Status" ,"DatumZeitStart" FROM "dbo"."KHKPpsRueckmeldungen" WHERE (("BelID" = 402412 ) AND ("Status" = 0 ) ) GROUP BY {fn convert("BelID" ,SQL_VARCHAR)},"BelID" ,"Artikelnummer" ,"Typ" ,"Status" ,"DatumZeitStart"

Variante 2 - mit berechnete Felder per DATWERT:

1. Abfrage
ACCESS:
SELECT dbo_KHKLagerplatzbuchungen.Referenz, dbo_KHKLagerplatzbuchungen.Bewegungsdatum, dbo_KHKLagerplatzbuchungen.Artikelnummer, dbo_KHKLagerplatzbuchungen.Bewegungsart, Sum(dbo_KHKLagerplatzbuchungen.MengeLager) AS SummevonMengeLager, DateValue([Bewegungsdatum]) AS cDatum, Int([Bewegungsdatum]) AS iDatum
FROM dbo_KHKLagerplatzbuchungen
WHERE (((dbo_KHKLagerplatzbuchungen.Intern)=0))
GROUP BY dbo_KHKLagerplatzbuchungen.Referenz, dbo_KHKLagerplatzbuchungen.Bewegungsdatum, dbo_KHKLagerplatzbuchungen.Artikelnummer, dbo_KHKLagerplatzbuchungen.Bewegungsart, DateValue([Bewegungsdatum]), Int([Bewegungsdatum])
HAVING (((dbo_KHKLagerplatzbuchungen.Referenz)="402412") AND ((dbo_KHKLagerplatzbuchungen.Bewegungsart)="ZF" Or (dbo_KHKLagerplatzbuchungen.Bewegungsart)="EF"))
ORDER BY dbo_KHKLagerplatzbuchungen.Bewegungsdatum DESC;
SQL-LOG: (keine Summenbildung - wird also durch Access vorgenommen !?! Anzeige in Access aber richtig)
SELECT "Artikelnummer" ,"Bewegungsart" ,"MengeLager" ,"Referenz" ,"Bewegungsdatum" FROM "dbo"."KHKLagerplatzbuchungen" WHERE ((("Intern" = 0 ) AND ("Referenz" = '402412' ) ) AND ("Bewegungsart" IN ('ZF' ,'EF' ) ) )

2. Abfrage
ACCESS:
SELECT Str([BelID]) AS b_Ref, dbo_KHKPpsRueckmeldungen.BelID, dbo_KHKPpsRueckmeldungen.Artikelnummer, Sum(dbo_KHKPpsRueckmeldungen.MengeGut) AS SummevonMengeGut, dbo_KHKPpsRueckmeldungen.Typ, dbo_KHKPpsRueckmeldungen.Status, DateValue([DatumZeitStart]) AS cDatumFA, Int([DatumZeitStart]) AS iDatumFA, dbo_KHKPpsRueckmeldungen.DatumZeitStart
FROM dbo_KHKPpsRueckmeldungen
GROUP BY Str([BelID]), dbo_KHKPpsRueckmeldungen.BelID, dbo_KHKPpsRueckmeldungen.Artikelnummer, dbo_KHKPpsRueckmeldungen.Typ, dbo_KHKPpsRueckmeldungen.Status, DateValue([DatumZeitStart]), Int([DatumZeitStart]), dbo_KHKPpsRueckmeldungen.DatumZeitStart
HAVING (((dbo_KHKPpsRueckmeldungen.BelID)=402412) AND ((dbo_KHKPpsRueckmeldungen.Status)=0));
SQL-LOG: (keine Summenbildung - wird also durch Access vorgenommen !?! Anzeige in Access aber richtig)
SELECT "Typ" ,"BelID" ,"Artikelnummer" ,"DatumZeitStart" ,"MengeGut" ,"Status" FROM "dbo"."KHKPpsRueckmeldungen" WHERE (("BelID" = 402412 ) AND ("Status" = 0 ) )

3. Vergleich: Ergebnis falsch: 0 Datensätze !!!
ACCESS: (Abfrage unverändert)
SELECT [Q_tmp_Lagerbuchungen FA Summen].*, Q_tmp_PPSRueckmeldungen_Summen.*
FROM [Q_tmp_Lagerbuchungen FA Summen] INNER JOIN Q_tmp_PPSRueckmeldungen_Summen ON ([Q_tmp_Lagerbuchungen FA Summen].Referenz = Q_tmp_PPSRueckmeldungen_Summen.b_Ref) AND ([Q_tmp_Lagerbuchungen FA Summen].Bewegungsdatum = Q_tmp_PPSRueckmeldungen_Summen.DatumZeitStart) AND ([Q_tmp_Lagerbuchungen FA Summen].Artikelnummer = Q_tmp_PPSRueckmeldungen_Summen.Artikelnummer);
SQL-LOG: (auf SQL nur die beiden Unterabfragen !?! Zusammenführung in Access !!!)
SELECT "Artikelnummer" ,"Bewegungsart" ,"MengeLager" ,"Referenz" ,"Bewegungsdatum" FROM "dbo"."KHKLagerplatzbuchungen" WHERE ((("Intern" = 0 ) AND ("Referenz" = '402412' ) ) AND ("Bewegungsart" IN ('ZF' ,'EF' ) ) )
SELECT "Typ" ,"BelID" ,"Artikelnummer" ,"DatumZeitStart" ,"MengeGut" ,"Status" FROM "dbo"."KHKPpsRueckmeldungen" WHERE (("BelID" = 402412 ) AND ("Status" = 0 ) )


Anhänge
----------------
Anhänge Access_TEST.zip (30KB - 1 downloads)
Top of the page Bottom of the page