Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem bei Abfrage (https://www.delphipraxis.net/81362-problem-bei-abfrage.html)

CG2003 25. Nov 2006 19:46

Datenbank: MySQL • Version: 4.1 • Zugriff über: ZeosDBO 6.5.1

Problem bei Abfrage
 
Hallo,

ich habe folgendes Problem:

Ich habe eine Tabelle mit "Reparaturen".
Folgende 3 Möglichkeiten können vorkommen:

casRepFolgefehler: Y
casRepTechniker: 37


casRepFolgefehler: Y
casRepStatus62Techniker: 37


casRepFolgefehler: Y
casRepKVATechniker: 37



Die Technikernummer kann dabei jeweils variieren.

Also ich möchte mittels RecordCount die Anzahl jeder "Folgefehler-Reparatur" in einem Zeitraum eines jeweiligen Technikers auslesen. Vorgegeben dafür habe ich die Technikernummer.

Ich habe es so probiert:

SQL-Code:
SELECT * FROM casiorepair WHERE casRepFertigstellung BETWEEN '2006-11-24' AND '2006-11-26' AND casRepFolgefehler = 'Y' AND casRepTechniker = '37' OR casRepStatus62Techniker = '37' OR casRepKVATechniker = '37';
Das Problem ist, das es nicht funktioniert. Ich bekomme eine AV.

Ich weiß nicht, wie ich es besser erklären soll. Wenn irgendwas fehlt, bzw. ihr nähere Informationen braucht, fragt einfach.

Ich hoffe Ihr könnt mir helfen und ich bedanke mich hiermit im Voraus.

Jürgen Thomas 26. Nov 2006 10:34

Re: Problem bei Abfrage
 
Hallo,
ich werde Dir keine Lösung bieten (kein MySQL, kein ZEOS); aber ein paar Tipps sollten Dir helfen, selbst den Fehler zu finden oder das Problem genauer zu beschreiben:

1. Wenn Du RecordCount suchst, solltest Du auch einen Zähler suchen, z.B.:
SQL-Code:
SELECT COUNT(DISTINCT casRepFolgefehler)...
2. Du sprichst von einer AV. Bei welchem Befehl wird diese ausgelöst? Kaum von einem Select, sondern von einer Zeos-Prozedur oder einem eigenen Befehl. Diese musst Du angeben, wenn Du Hilfe erwartest.

3. Ergänzend werden natürlich Quelltext und die genaue Fehlermeldung benötigt. Wir haben keine Glaskugeln...

4. Für die eigene Fehlersuche gibt es try-except-Verfahren und den Debugger. Bitte benutzen!

5. An Deinem Select-Befehl vermisse ich als erstes Klammern (bei AND-OR-Kombinationen eigentlich unumgänglich). Ohne diese wird keiner wissen, was genau Du prüfen willst, und fast niemand wird sich die Mühe machen, diesen Befehl auf seine Richtigkeit zu kontrollieren.

6. Wenn Du RecordCount suchst, dürfte schließlich GROUP BY sinnvoll sein.

Also bitte zuerst sinnvoll selber suchen und dann genauer fragen. Jürgen

hoika 26. Nov 2006 10:51

Re: Problem bei Abfrage
 
Hallo,

wie heisst die Fehlermeldung.
Datumswerte direkt als String ist nicht gut.
Schaue mal hier in der Suche,
da war auch Parameter für MYSQL mal dran.


Heiko

bundy 26. Nov 2006 12:11

Re: Problem bei Abfrage
 
hy :hi:

wenn ich Datumswerte in den SQL String übertrage, mach ich das immer so

Delphi-Quellcode:
SQLString:='select * from Table where aDateField='+QuotedStr(FormatDateTime('YYYY-MM-DD',DateTimePicker1.date));
lg Bundy

CG2003 26. Nov 2006 13:11

Re: Problem bei Abfrage
 
Also, wenn ich z.B. nur folgendes ausführe:

SQL-Code:
SELECT * FROM casiorepair WHERE casRepFertigstellung BETWEEN '2006-11-24' AND '2006-11-26' AND casRepFolgefehler = 'Y' AND casRepTechniker = '37';
funktioniert alles wunderbar.


Füge ich an o.g. Befehl aber noch zwei Bedingungen an, so wie hier:

SQL-Code:
SELECT * FROM casiorepair WHERE casRepFertigstellung BETWEEN '2006-11-24' AND '2006-11-26' AND casRepFolgefehler = 'Y' AND casRepTechniker = '37' OR casRepStatus62Techniker = '37' OR casRepKVATechniker = '37';
kommt ein haushoher Wert raus, der irgendwie nicht stimmen kann.
Ich hatte zum Test einen Eintrag mit

SQL-Code:
casRepFolgefehler = 'Y'
eingefügt, und so müsste er theoretisch auch nur diesen Eintrag im RecordCount haben, oder?

mkinzler 26. Nov 2006 18:26

Re: Problem bei Abfrage
 
Du mußt deine Bedingung so kalmmern das auch immer das miteinander verglichen wird was du willst.
(was muß jeweils gleichzeitig gelten und was alternativ)

CG2003 27. Nov 2006 07:33

Re: Problem bei Abfrage
 
Zitat:

Zitat von mkinzler
Du mußt deine Bedingung so kalmmern das auch immer das miteinander verglichen wird was du willst.
(was muß jeweils gleichzeitig gelten und was alternativ)

Sorry, aber das verstehe ich nicht ganz. Kannst Du mir ein Beispiel nennen?

Mumpe 27. Nov 2006 08:41

Re: Problem bei Abfrage
 
Deine Abfrage
SQL-Code:
SELECT * FROM casiorepair WHERE casRepFertigstellung BETWEEN '2006-11-24' AND '2006-11-26' AND casRepFolgefehler = 'Y' AND casRepTechniker = '37' OR casRepStatus62Techniker = '37' OR casRepKVATechniker = '37';
liefert alle Sätze, bei denen "casRepKVATechniker"=37 ist plus alle, bei denen "casRepStatus62Techniker"=37 ist plus alle, die im Datumsbereich liegen und "casRepTechniker"=37 und "casRepFolgefehler"=Y ist, weil AND vor OR geht, ähnlich wie Punktrechnung vor Strichrechnung geht.

Was [edit]mkinzler[/edit] meint ist, dass Du das Statement folgendermaßen umbaust:
SQL-Code:
SELECT * FROM casiorepair WHERE casRepFertigstellung BETWEEN '2006-11-24' AND '2006-11-26' AND casRepFolgefehler = 'Y' AND (casRepTechniker = '37' OR casRepStatus62Techniker = '37' OR casRepKVATechniker = '37');
Hth,
M.

Jürgen Thomas 27. Nov 2006 08:46

Re: Problem bei Abfrage
 
Zitat:

Zitat von CG2003
Zitat:

Zitat von mkinzler
Du mußt deine Bedingung so kalmmern das auch immer das miteinander verglichen wird was du willst.
(was muß jeweils gleichzeitig gelten und was alternativ)

Sorry, aber das verstehe ich nicht ganz. Kannst Du mir ein Beispiel nennen?

Schon in meiner ersten Antwort habe ich auf Klammern hingewiesen. Ich dachte bisher, dass das zum Basiswissen bei logischen Variablen/Abfragen/Verknüpfungen gehört. Suche in der Delphi-Referenz durchsuchenDelphi-Hilfe nach "Klammern" und lies das Thema "Ausdrücke" durch; dort steht u.a.:
Zitat:

Mit Hilfe von runden Klammern lassen sich die Rangfolgeregeln außer Kraft setzen. Ein Ausdruck in runden Klammern wird immer zuerst ausgewertet und danach wie ein einzelner Operand behandelt.
Nach meiner Kenntnis wird das auch im Mathematik-Unterricht etwa ab 6. Klasse so gemacht.

Dein Anfangsbeispiel liefert unterschiedliche Antworten bei unterschiedlicher Klammerung:
SQL-Code:
SELECT * FROM casiorepair WHERE casRepFertigstellung BETWEEN '2006-11-24' AND '2006-11-26' AND casRepFolgefehler = 'Y' AND (casRepTechniker = '37' OR casRepStatus62Techniker = '37' OR casRepKVATechniker = '37');
//  oder
SELECT * FROM casiorepair WHERE (casRepFertigstellung BETWEEN '2006-11-24' AND '2006-11-26' AND casRepFolgefehler = 'Y' AND casRepTechniker = '37') OR casRepStatus62Techniker = '37' OR casRepKVATechniker = '37';
Und wir sollen raten, was Du willst. Jürgen

CG2003 27. Nov 2006 19:24

Re: Problem bei Abfrage
 
Zitat:

Zitat von Mumpe
Deine Abfrage
SQL-Code:
SELECT * FROM casiorepair WHERE casRepFertigstellung BETWEEN '2006-11-24' AND '2006-11-26' AND casRepFolgefehler = 'Y' AND casRepTechniker = '37' OR casRepStatus62Techniker = '37' OR casRepKVATechniker = '37';
liefert alle Sätze, bei denen "casRepKVATechniker"=37 ist plus alle, bei denen "casRepStatus62Techniker"=37 ist plus alle, die im Datumsbereich liegen und "casRepTechniker"=37 und "casRepFolgefehler"=Y ist, weil AND vor OR geht, ähnlich wie Punktrechnung vor Strichrechnung geht.

Was [edit]mkinzler[/edit] meint ist, dass Du das Statement folgendermaßen umbaust:
SQL-Code:
SELECT * FROM casiorepair WHERE casRepFertigstellung BETWEEN '2006-11-24' AND '2006-11-26' AND casRepFolgefehler = 'Y' AND (casRepTechniker = '37' OR casRepStatus62Techniker = '37' OR casRepKVATechniker = '37');
Hth,
M.

Dankeschön, das funktioniert genau so, wie ich es will. Vielen Dank!


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