Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ADO Problem mit SQL DISTINCT und DBEdit (https://www.delphipraxis.net/173019-ado-problem-mit-sql-distinct-und-dbedit.html)

Acubens61 3. Feb 2013 04:09

Datenbank: Firebird • Version: 2.5.2 • Zugriff über: ADO

ADO Problem mit SQL DISTINCT und DBEdit
 
Hallo an alle Forenmitglieder,
ich bin seit heute neu angemeldet und muss sagen, dass euer Forum eine große Hilfe ist!

Nun habe ich ein Problem, das ich trotz intensivem Googeln seit Tagen nicht lösen konnte:

Ich habe eine Datenbank zur Speicherung von Projekttätigkeiten. Dazu werden Projektnummer, Projektbezeichnung, Zeiten und Mitarbeiter gespeichert.

Ich nutze den Befehl DISTINCT um zu Filtern an welchen Projekten ein Mitarbeiter involviert ist:

SELECT DISTINCT PROJEKTNR FORM ARBEITEN WHERE MITAREBEITER = 'NAME'

Funktioniert auch.

Nun mein Problem:
Da ich Datensätze auf der Maske mit DBEdit anzeige, erhalte ich nach der Select immer Fehler "Das Feld 'Projektbezeichnung' wurde nicht gefunden".

Der Grund liegt daran, dass nach dem Filtern mit DISTINCT die Datenmenge nur noch eine Spalte mit PROJEKTNR hat, die anderen Spalten der Datensätze in den DBEdit-Feldern sich nach der Abfrage aktualisieren möchten und nicht angezeigt werden können (weil nicht da). Habe eine ganze Zeit dafür benötigt um den Feher zu finden und zu verstehen, warum das Programm immer meldete, dass Felder nicht gefunden wurden, auf die ich gar nicht zugreife...

Hat jemand das gleiche Problem schon einmal gehabt? Ich fände es sehr aufwändig, wenn ich für alle Datenfelder mit Exceptions die Meldung abfangen müsste bzw. Abfragen einbauen müsste, wie z.B. if DataSet.FindField ('Projektbezeichnung')<> Nil then ...

Eine Lösung wäre das DISTINCT mit anschließender Ausgabe aller Felder der Ergebnismenge. Das habe ich aber trotz intensivem Suchen nicht gefunden.

SELECT DISTINCT Feld1, Feld2, Feld3 ... FeldN FROM ARBEITEN

wäre falsch, denn es liefert das DISTINCT über alle Felder!

Ich hoffe, dass mir jemand weiter helfen kann und dass es nicht schon ein Thema mit der gleichen Frage gibt (hab keins gefunden).

Grüße
Jörg

Sir Rufo 3. Feb 2013 08:02

AW: ADO Problem mit SQL DISTINCT und DBEdit
 
Zeig doch mal deine gesamte Tabellenstruktur. Es riecht ein wenig nach fehlender Normalisierung ;)

Acubens61 3. Feb 2013 08:35

AW: ADO Problem mit SQL DISTINCT und DBEdit
 
Hallo Sir Rufo,
danke für die rasche Antwort. Hmmm, fehlende Normalisierung?

Die Datenbank besteht bereits und ist produktiv im Einsatz. Die Sturktur sieht wie folgt aus:

CREATE TABLE "ARBEITEN"
(
"ID" INT64 NOT NULL,
"DATUM" DATE,
"MITARBEITER" VARCHAR(30) CHARACTER SET ISO8859_1,
"PROJEKTNR" VARCHAR(14) CHARACTER SET ISO8859_1,
"PROJEKTBEZ" VARCHAR(80) CHARACTER SET ISO8859_1,
"TAETIGKEIT" VARCHAR(80) CHARACTER SET ISO8859_1,
"STARTZEIT" VARCHAR(5) CHARACTER SET ISO8859_1,
"ENDZEIT" VARCHAR(5) CHARACTER SET ISO8859_1,
"ZEIT" FLOAT,
"STUNDENSATZ" FLOAT,
"AUFWAND" FLOAT,
PRIMARY KEY ("ID")
);

In der Tabelle suche ich dann für einen Mitarbeiter die angefassen Projekte ...
also
SELECT DISTINCT PROJEKTNR FROM ARBEITEN WHERE MITARBEITER = 'NAME'.

Hoffe du kannst mir weiter helfen...

LG
Jörg

Bernhard Geyer 3. Feb 2013 08:53

AW: ADO Problem mit SQL DISTINCT und DBEdit
 
Dann ist es klar. Wenn du nur projektnr abfragst kommt auch keine Projektbezeichnung zurück:

Code:
SELECT DISTINCT PROJEKTNR, PROJEKTBEZ FROM ARBEITEN WHERE MITARBEITER = 'NAME'.
Und ja, die Tabelle ist nicht normalisiert.
Die Projektbezeichnung ist hier unnötig und ist vermutlich auch in der Projekttabelle auch vorhanden.

Acubens61 3. Feb 2013 09:03

AW: ADO Problem mit SQL DISTINCT und DBEdit
 
Ja, klar ist mir das eigentlich auch und die Normalisierung verstehe ich jetzt auch, was du meinst.

Aber das Problem ist nicht gelöst. Ich habe ja im Programm eine Maske, in der ziemlich alle Felder angezeigt werden. SELECT DISTINCT FELD1, FELD2 ... würde ein DISTINCT über alle Felder machen, was dann zu einer falschen Abfrage führen würde (zumindest nicht die, die ich wollte).

Mit
Code:
 SELECT DISTINCT PROJEKTNR, PROJEKTBEZ FROM ARBEITEN WHERE MITARBEITER = 'NAME'
kommen die Felder PROJEKTNR und PROJEKTBEZ raus, die anderen natürlich auch wieder nicht. Die Update-Events meiner DBEdit-Felder die dann in der Ergebnismenge nicht mehr vertreten sind, führen dann zum Fehler ...
Hmm, ich müsste vorher die Events abschalten? Geht das nicht einfacher?

Gibt es keinen DISTINCT, der neben der Ergebnismenge auch noch die Datenfelder (so wie SELECT * FROM ... WHERE... liefert?

Grüße
Jörg

Bernhard Geyer 3. Feb 2013 09:10

AW: ADO Problem mit SQL DISTINCT und DBEdit
 
Zitat:

Zitat von Acubens61 (Beitrag 1201864)
Gibt es keinen DISTINCT, der neben der Ergebnismenge auch noch die Datenfelder (so wie SELECT * FROM ... WHERE... liefert?

Alle anderen Felder werden auch benötigt? Dann ist aber auch kein Distinct mehr nötig/sinnvoll.

Was willst du den wirklich in deinem Formular sehen? Evtl. ist es nötig das du 2 Formulare hast. Einen für die Eingabe, einen für Auswertungstätigkeiten (Liste aller Zeitbuchungen einer Person, diese Liste ist eine Liste (Baum, falls nach Projekten gruppiert werden soll)

Sir Rufo 3. Feb 2013 09:11

AW: ADO Problem mit SQL DISTINCT und DBEdit
 
Eventuell wird hier auch nach GROUP BY gesucht ;)

Acubens61 3. Feb 2013 09:19

AW: ADO Problem mit SQL DISTINCT und DBEdit
 
:-D
Hmm. Hatte ich eigentlich auch schon mal gefunden, aber irgend wie nicht weiter gekommen. Probier ich nochmal...

DANKE fürs Erste!

Werde mich zurück melden, wenns klappt oder auch nicht...

wenn's das war, dann :oops:

p80286 3. Feb 2013 11:38

AW: ADO Problem mit SQL DISTINCT und DBEdit
 
DISTINCT und das editieren von Daten beißen sich!
Sollte es z.B. zwei Personen mit dem Namen "Fischer" geben und die Abfrage lautet
Code:
Select distinct Name from Tabelle
Dann bleibt die Frage welcher der zwei vorhandenen Datensätze soll den editiert werden.

Ein vernünftiges Pärchen wäre
Code:
Select NameID,Name from Tabelle
Code:
Update Tabelle Set Name='Irgendwas' where NameID=123456
Gruß
K-H

jobo 3. Feb 2013 11:48

AW: ADO Problem mit SQL DISTINCT und DBEdit
 
Das kommt mir so vor, als ob hier schlicht die selber Query für die DB Edits auch für andere Zwecke verwendet wird, also ungefähr:
- erstmal alle dbedits füllen
- dann weitere Aufgaben mit der selben Query (gleiche Instanz, anderer SQL.text)

Wenn das so ist:
Einfach für alles, was nichts mit den DBEdits zu tun hat, separate Queries verwenden. Kommt etwas darauf an, ob Du die Queries auf die Form gezogen hast oder dynamisch erzeugst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 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