Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO verschachtelt (https://www.delphipraxis.net/34516-ado-verschachtelt.html)

BrinkschulteManfred 24. Nov 2004 08:07


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

Jelly 24. Nov 2004 08:18

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:
select count(*) as Anzahl, Feld1, Feld2
from MeineTabelle
where Feld3='Bla'
group by Feld1, Feld2
order by Feld4
Du siehst also, du kannst in einem Ruck gruppieren, filtern und sortieren.

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ß,

BrinkschulteManfred 24. Nov 2004 08:56

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:
SELECT COUNT(*) as Anzahl, MaschinenID, Typ
FROM WZBInst
WHERE Abteilung = 'Stanzerei'
GROUP BY MaschinenID
Leider kann ich nach dem beispielhaften Feld Typ weder grupieren, noch sortieren. Ich möchte es nur angezeigt bekommen.

Gruß
Manfred

Jelly 24. Nov 2004 09:24

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

shmia 24. Nov 2004 09:37

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:
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
Hier verwende ich LEFT OUTER JOIN; falls eine Maschine im MaschinenStamm gelöscht wäre,
würde sonst die Zeile(n) aus WZBInst unterdrückt werden.

BrinkschulteManfred 24. Nov 2004 09:55

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

BrinkschulteManfred 24. Nov 2004 09:57

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

shmia 24. Nov 2004 10:23

Re: ADO verschachtelt
 
Zitat:

Zitat von BrinkschulteManfred
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.

Das ist doch ebenfalls mit SQL möglich.
Du kannst zuerst eine komplizierte Abfrage mit Filterbedingungen (WHERE-Klausel) über diverse
Tabellen schreiben und diese Daten dann aggregieren und sortieren:
SQL-Code:
SELECT SubTab.MaschinenID, Count(*) as Anzahl FROM
(###) SubTab
### = Platzhalter für eine komplizierte (SELECT-)Abfrage
SubTab ist der Aliasname für die Unterabfrage.

Jelly 24. Nov 2004 16:11

Re: ADO verschachtelt
 
Zitat:

Zitat von shmia
Du kannst zuerst eine komplizierte Abfrage mit Filterbedingungen (WHERE-Klausel) über diverse
Tabellen schreiben und diese Daten dann aggregieren und sortieren:
SQL-Code:
SELECT SubTab.MaschinenID, Count(*) as Anzahl FROM
(###) SubTab

Vorsicht, das klappt leider nicht bei allen Datenbanksystemen. Access weiss ich nicht wie es sich verhält, aber MySQL z.B. streckt die Waffen, zumindest bei der Version 4.x

Gruß

BrinkschulteManfred 25. Nov 2004 07:37

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 14:18 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz