![]() |
ADO verschachtelt
Hallo zusammen,
habe gerade mal folgende Problematik und denke, dass ich wahrscheinlich auf dem Holzweg bin. Gegeben sind Daten in einer Tabelle einer Access2000-Datenbank. Diese möchte ich innerhalb von DELPHI filtern und anschließend eine Aggregatsabfrage (in diesem Fall Datensätze zählen) ausführen. Leider ist es mir nicht gelungen, dies innerhalb einer AGOQuery zu realisieren, da ich zwar wunderschön die Aggregatsfunktion als SQL-Auftruf definieren kann, dann aber der Komponente einen Filter unterschieben muss. Nun ist es so, dass ich ja nur nach Felden Filtern kann, die auch in der SQL-Anweisung genannt sind. Da da aber nicht alle Felder auftauchen dürfen, ich aber nach allen Feldern dynamisch Filtern möchte habe ich mir überlegt, dass eine zweistufige ADOQuery funktionieren müßte. In der ersten Stufe würde ich dann filtern und in der Zweiten dann nur noch SELECT COUNT .... Wie muss dann aber in der zweiten Stufe die Angabe der Connection lauten? Oder gibt es für so einen Fall andere, bessere Komponenten? Gruß Manfred |
Re: ADO verschachtelt
Na dann will ich dir mal auf den richtigen Pfad helfen :-)
Ein "zweistufiges" filtern, wie du es nennst, gibts nicht. Du erhälts das Gewünschte aber auch, indem du dein SQL Befehl entsprechend formulierst, etwa:
SQL-Code:
Du siehst also, du kannst in einem Ruck gruppieren, filtern und sortieren.
select count(*) as Anzahl, Feld1, Feld2
from MeineTabelle where Feld3='Bla' group by Feld1, Feld2 order by Feld4 Dieser Weg ist imho eh der bessere, statt das Filtern in Delphi zu übernehmen, da somit auch nur die gewünschten Datensätze zum Client wandern. Bei großen Datenmengen übers Netzt wirds sonst grottenlahm. Gruß, |
Re: ADO verschachtelt
So weit war ich dann auch, aber bekam dann die Fehlermeldung:
Sie wollten eine Abfrage ausführen, die den angegebenen Ausdruck 'Typ' nicht als Teil der Aggregatfunktion einschließt. Diese Fehlermeldung kommt dann, wenn man die Eigenschaft Active auf TRUE setzen möchte. Der Original-SQL-String ist:
SQL-Code:
Leider kann ich nach dem beispielhaften Feld Typ weder grupieren, noch sortieren. Ich möchte es nur angezeigt bekommen.
SELECT COUNT(*) as Anzahl, MaschinenID, Typ
FROM WZBInst WHERE Abteilung = 'Stanzerei' GROUP BY MaschinenID Gruß Manfred |
Re: ADO verschachtelt
Wenn du Typ mit in die Ergebismenge einbeziehst, muss du auch nach dieser Spalte gruppieren, also so:
SQL-Code:
SELECT COUNT(*) as Anzahl, MaschinenID, Typ
FROM WZBInst WHERE Abteilung = 'Stanzerei' GROUP BY MaschinenID, Typ |
Re: ADO verschachtelt
Mit SQL kann man auch JOINs auf Abfragen durchführen.
Folgendes Beispiel zeigt, wie man nach MaschinenID gruppiert und anschliesend für die MaschinenID einen lesbaren Namen erhält. Dazu erhält die eingebettete SELECT-Abfrage einen Aliasnamen (hier: DevTbl)
SQL-Code:
Hier verwende ich LEFT OUTER JOIN; falls eine Maschine im MaschinenStamm gelöscht wäre,
SELECT DevTbl.*, MaschinenStamm.MaschinenName, MaschinenStamm.Beschreibung
FROM (SELECT COUNT(*) as Anzahl, MaschinenID FROM WZBInst WHERE Abteilung = 'Stanzerei' GROUP BY MaschinenID) DevTbl LEFT OUTER JOIN MaschinenStamm ON DevTbl.MaschinenID=MaschinenStamm.MaschinenID würde sonst die Zeile(n) aus WZBInst unterdrückt werden. |
Re: ADO verschachtelt
Hallo Jelly,
vielen Dank für den Hinweis dass man in der Anzeige benötigt, unter 'Group By' angeben muss. Bei einem Maschinentyp ist das auch kein Problem, da dieser immer eindeutig auf eine Maschine zeigt. Bei einem Datumsbereich sieht dies schon anders aus. Daher dachte ich an eine zweistufige Version (so wie in einer reinen ACCESS-Umgebung: erste Abfrag kümmert sich um die Filertung und die darauf aufbauende Abfrag um die Aggregate o.ä.). Trotzdem einen herzlichen Dank Gruß Manfred |
Re: ADO verschachtelt
Hallo shmia,
leider hilft mir Dein gut gemeinter Rat mit Joins auch nicht weiter, da es sich ehr um ein Filterproblem mit gleichzeitiger Aggregatbildung handelt, bei dem ich nach vielen Feldern filtern, aber nur wenige in der Ausgabe haben möchte. Gruß Manfred |
Re: ADO verschachtelt
Zitat:
Du kannst zuerst eine komplizierte Abfrage mit Filterbedingungen (WHERE-Klausel) über diverse Tabellen schreiben und diese Daten dann aggregieren und sortieren:
SQL-Code:
### = Platzhalter für eine komplizierte (SELECT-)Abfrage
SELECT SubTab.MaschinenID, Count(*) as Anzahl FROM
(###) SubTab SubTab ist der Aliasname für die Unterabfrage. |
Re: ADO verschachtelt
Zitat:
Gruß |
Re: ADO verschachtelt
Herzlichen Dank an Alle!
Ich war einfach zu blind. Meine erste Version der SQL-Abfrage hat nihct COUNT(*) sondern COUNT(Feld1) beinhaltet. Dadurch konnte ich natürlich nicht auf die anderen Felder zugreifen. Nun funktioniert es. Vielen Dank Manfred :bounce2: :hello: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz