AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ADO verschachtelt

Ein Thema von BrinkschulteManfred · begonnen am 24. Nov 2004 · letzter Beitrag vom 25. Nov 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von BrinkschulteManfred
BrinkschulteManfred

Registriert seit: 23. Sep 2003
Ort: Menden
97 Beiträge
 
Delphi 7 Enterprise
 
#1

ADO verschachtelt

  Alt 24. Nov 2004, 09:07
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
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: ADO verschachtelt

  Alt 24. Nov 2004, 09:18
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ß,
  Mit Zitat antworten Zitat
Benutzerbild von BrinkschulteManfred
BrinkschulteManfred

Registriert seit: 23. Sep 2003
Ort: Menden
97 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: ADO verschachtelt

  Alt 24. Nov 2004, 09:56
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
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#4

Re: ADO verschachtelt

  Alt 24. Nov 2004, 10:24
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: ADO verschachtelt

  Alt 24. Nov 2004, 10:37
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von BrinkschulteManfred
BrinkschulteManfred

Registriert seit: 23. Sep 2003
Ort: Menden
97 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: ADO verschachtelt

  Alt 24. Nov 2004, 10:55
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
  Mit Zitat antworten Zitat
Benutzerbild von BrinkschulteManfred
BrinkschulteManfred

Registriert seit: 23. Sep 2003
Ort: Menden
97 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: ADO verschachtelt

  Alt 24. Nov 2004, 10:57
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: ADO verschachtelt

  Alt 24. Nov 2004, 11:23
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#9

Re: ADO verschachtelt

  Alt 24. Nov 2004, 17:11
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ß
  Mit Zitat antworten Zitat
Benutzerbild von BrinkschulteManfred
BrinkschulteManfred

Registriert seit: 23. Sep 2003
Ort: Menden
97 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: ADO verschachtelt

  Alt 25. Nov 2004, 08:37
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:58 Uhr.
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