Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Query liefert falsche Werte zürück -Abfrage anhand vom Datum (https://www.delphipraxis.net/67187-query-liefert-falsche-werte-zuerueck-abfrage-anhand-vom-datum.html)

mewlos26 10. Apr 2006 23:26

Datenbank: Access • Version: 2003 • Zugriff über: ADO

Query liefert falsche Werte zürück -Abfrage anhand vom Datum
 
Hallo,

ich habe das Problem das mit nachfolgender Abfrage alle Datensätze angezeigt werden aus der Tabelle test, obwohl ich in der Variable wid_book_zusatz eine bestimmte Zahl zuweise. Wo stimmt die Abfrage hier nicht und wie kann ich mir die SELECT ANWEISUNG zur Laufzeit ausgeben lassen?

Delphi-Quellcode:
 

var oid_book_zusatz, wid_book_zusatz : string;

  ADOQuery_TEST.Close;
  ADOQuery_TEST.SQL.Clear;
   with ADOQuery_TEST do
    begin                            
      SQL.Text:=
  'SELECT * FROM test'+#13#10+
  'WHERE (wid = :wohnung) '+#13#10+
  'AND (oid = :objekt) '+#13#10+
  'AND (:datevon1 BETWEEN anreise AND abreise) OR (:datebis1 BETWEEN anreise AND abreise)';
    with Parameters do
    begin
      ParamValues['datevon1']  :=PlannerDatePicker15.Date;
      ParamValues['datebis1']  :=PlannerDatePicker16.Date;
      ParamValues['objekt']    :=oid_book_zusatz;
      ParamValues['wohnung']   :=wid_book_zusatz;
    end;
     ADOQuery_TEST.Open;
    end; /

Sharky 11. Apr 2006 05:31

Re: Query liefert falsche Werte zürück -Abfrage anhand vom D
 
Hai mewlos26,

auf den ersten Blick würde ich sagen: Setzt um die beiden Datumsabfragen eine Klammer. Zur Zeit steht die letze Datumsabfrage alleine mit einem OR verknüpft in der WHERE-Klausel. Sobald also (:databis BETWEEN anreise and abreise) zutrifft trifft die gesamte Abfrage zu.

Code:
                           
   SQL.Text:=
  'SELECT * FROM test'+#13#10+
  'WHERE (wid = :wohnung) '+#13#10+
  'AND (oid = :objekt) '+#13#10+
  'AND [color=red][b]([/b][/color](:datevon1 BETWEEN anreise AND abreise) OR (:datebis1 BETWEEN anreise AND abreise)[color=red][b])[/b][/color]';

mewlos26 11. Apr 2006 13:41

Re: Query liefert falsche Werte zürück -Abfrage anhand vom D
 
Hallo Sharky,

das klappt schon mal super, danke. Die Select Abfrage liefert mir jetzt alle Datensätze die im Zeitraum 01.01.2006 bis 31.12.2006 liegen, aber wie muss die Select Abfrage komplett modifiziert werden, damit ich auch ne Buchung erhalte die z.B. vom 10.12.2006 bis 05.01.2007 geht, oder eine vom 15.12.2005 bis 04.01.2006?

Die Schwierigkeit besteht jetzt darin, die letzte Buchung im Dezember zu finden die in den Januar geht und die Buchung die vom Dezember in den Januar geht.

Hättest Du dafür auch eine Lösung?

marabu 11. Apr 2006 14:05

Re: Query liefert falsche Werte zürück -Abfrage anhand vom D
 
Hi.

Egal ob mit oder ohne Sharkys Klammern - deine Abfrage ist seltsam. Jeder Datensatz spezifiziert doch mit anreise und abreise ein geschlossenes Zeitintervall. Einige sinnvolle Abfragen aus mengentheoretischer Sicht wären dann - bei Angabe eines Suchintervalls:

SQL-Code:
/* Buchungsintervall im Suchintervall */
select ... where anreise >= :datumvon and abreise <= :datumbis

/* Buchungsintervall beginnt im Suchintervall */
select ... where anreise between :datumvon and :datumbis

/* Buchungsintervall endet im Suchintervall */
select ... where abreise between :datumvon and :datumbis
Grüße vom marabu

mewlos26 11. Apr 2006 19:00

Re: Query liefert falsche Werte zürück -Abfrage anhand vom D
 
Hallo,

das Problem ist hier das die Select Anweisung nur bis zum OR zwischen den beiden BETWEEN Abfragen ausgeführt wird. Die Abfrage hinter dem OR wird nicht berücksichtigt! Hat jemand eine Idee wie er beide Between Abfragen auch ausführt? Der Tip mit der runden Klammer am Anfang und am Ende war nicht die Lösung.

Kann man das vielleicht nur mit einem verschachtelten Select bekommen die beiden Between Zeiträume Abfragen? Wenn ja wie müsste ich das umstricken? Irgendwas stimmt doch unten an der Syntax nicht. :roll:

Gruß
Markos

Delphi-Quellcode:
SQL.Text:=
  'SELECT * FROM test'+#13#10+
  'WHERE (wid = :wohnung) '+#13#10+
  'AND (oid = :objekt) '+#13#10+
   'AND ((buchung.anreise BETWEEN :datevon1 AND :datebis1)'+#13#10+
   'OR (buchung.abreise BETWEEN :datevon1 AND :datebis1))'+#13#10+

GuenterS 11. Apr 2006 20:30

Re: Query liefert falsche Werte zürück -Abfrage anhand vom D
 
Zitat:

Zitat von mewlos26
Hallo,

das Problem ist hier das die Select Anweisung nur bis zum OR zwischen den beiden BETWEEN Abfragen ausgeführt wird. Die Abfrage hinter dem OR wird nicht berücksichtigt! Hat jemand eine Idee wie er beide Between Abfragen auch ausführt? Der Tip mit der runden Klammer am Anfang und am Ende war nicht die Lösung.

Kann man das vielleicht nur mit einem verschachtelten Select bekommen die beiden Between Zeiträume Abfragen? Wenn ja wie müsste ich das umstricken? Irgendwas stimmt doch unten an der Syntax nicht. :roll:

Gruß
Markos

Delphi-Quellcode:
SQL.Text:=
  'SELECT * FROM test'+#13#10+
  'WHERE (wid = :wohnung) '+#13#10+
  'AND (oid = :objekt) '+#13#10+
   'AND ((buchung.anreise BETWEEN :datevon1 AND :datebis1)'+#13#10+
   'OR (buchung.abreise BETWEEN :datevon1 AND :datebis1))'+#13#10+

Ja, er wird wohl nicht wissen was "buchung.anreise" und "buchung.abreise" sein soll. Ich gehe davon aus, dass Du
Delphi-Quellcode:
SQL.Text:=
  'SELECT * FROM test buchung'
  'WHERE (buchung.wid = :wohnung) '
  'AND (buchung.oid = :objekt) '
  'AND ((buchung.anreise BETWEEN :datevon1 AND :datebis1)'
    'OR (buchung.abreise BETWEEN :datevon1 AND :datebis1))'
gemeint hast. ?

mewlos26 11. Apr 2006 23:03

Re: Query liefert falsche Werte zürück -Abfrage anhand vom D
 
Hallo,

anbei mal die komplette Select Anweisung. Es muss an dem OR Liegen. Wo ist hier der Fehler? Muss ich die Abfrage vielleicht in 2 Select Anweisung verschachtelt aufbauen? Hat jemand eine Idee

Delphi-Quellcode:
 SQL.Text:=
  'SELECT buchung.oid, buchung.wid, buchung.anreise, buchung.abreise, buchung.GID, wohnungen.wid, wohnungen.wnr, wohnungen.wname, adressen.gid,'+#13#10+
  'objekte.oid, objekte.objname, objekte.objnr'+#13#10+
  'FROM buchung, adressen, wohnungen, objekte'+#13#10+
  'WHERE Buchung.gid = adressen.gid '+#13#10+
  'AND  Buchung.wid = wohnungen.wid'+#13#10+
  'AND  Buchung.oid = objekte.oid '+#13#10+
  'AND (buchung.wid = :wohnung1) AND (buchung.oid = :objekt1)'+#13#10+
  'AND ((buchung.anreise BETWEEN :datevon1 AND :datebis1)'+#13#10+
  'OR (buchung.abreise BETWEEN :datevon1 AND :datebis1))'+#13#10+
  'ORDER BY buchung.anreise, adressen.name';
    with Parameters do
    begin
      ParamValues['datevon1']  :=PlannerDatePicker21.Date;
      ParamValues['datebis1']  :=PlannerDatePicker22.Date;
      ParamValues['objekt1']   :=oid_zusatz;
      ParamValues['wohnung1']  :=wid_zusatz;
    end;

marabu 12. Apr 2006 08:04

Re: Query liefert falsche Werte zürück -Abfrage anhand vom D
 
Guten Morgen.

Prüfe dein Statement mal ohne Parameter:

Delphi-Quellcode:
begin
  SQL.Text
    := 'SELECT COUNT(*) FROM buchung '
    +  'WHERE (buchung.anreise BETWEEN #01/01/2006# AND #12/31/2006#) '
    +  'OR (buchung.abreise BETWEEN #01/01/2006# AND #12/31/2006#) '
    +  'ORDER BY buchung.anreise '
    ;
  // ...
end;
Wenn das Ergebnis für Count() größer als 0 ist, dann versuche mal folgendes:

Delphi-Quellcode:
begin
  SQL.Text
    := 'SELECT COUNT(*) FROM buchung '
    +  'WHERE (buchung.anreise BETWEEN :datevon1 AND :datebis1) '
    +  'OR (buchung.abreise BETWEEN :datevon2 AND :datebis2) '
    +  'ORDER BY buchung.anreise '
    ;
  with Parameters do
  begin
    ParamValues['datevon1'] := PlannerDatePicker21.Date;
    ParamValues['datebis1'] := PlannerDatePicker22.Date;
    ParamValues['datevon2'] := PlannerDatePicker21.Date;
    ParamValues['datebis2'] := PlannerDatePicker22.Date;
  end;
  // ...
end;
Grüße vom marabu

mewlos26 12. Apr 2006 11:40

Re: Query liefert falsche Werte zürück -Abfrage anhand vom D
 
Hallo Marabu, das funktioniert leider nicht, es fehlen ja auch noch die anderen Parameter :( Hast Du sonst noch ein Idee?

Delphi-Quellcode:
begin
  SQL.Text
    := 'SELECT COUNT(*) FROM buchung '
    +  'WHERE (buchung.anreise BETWEEN :datevon1 AND :datebis1) '
    +  'OR (buchung.abreise BETWEEN :datevon2 AND :datebis2) '
    +  'ORDER BY buchung.anreise '
    ;
  with Parameters do
  begin
    ParamValues['datevon1'] := PlannerDatePicker21.Date;
    ParamValues['datebis1'] := PlannerDatePicker22.Date;
    ParamValues['datevon2'] := PlannerDatePicker21.Date;
    ParamValues['datebis2'] := PlannerDatePicker22.Date;
  end;
  // ...
end;
Grüße vom marabu[/quote]

marabu 12. Apr 2006 12:49

Re: Query liefert falsche Werte zürück -Abfrage anhand vom D
 
Mich würde interessieren wieviele Datensätze mit jeweils dem ersten und dem zweiten von mir angegebenen Test ermittelt wurden. Störe dich nicht daran, dass das SQL-Statement nicht ganz deinem entspricht.

marabu


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