Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datumseinschränkung wird nicht akzeptiert (https://www.delphipraxis.net/87714-datumseinschraenkung-wird-nicht-akzeptiert.html)

Cyberbob_at_tot 5. Mär 2007 08:31

Datenbank: Oracle • Version: 8i • Zugriff über: TADOquery

Datumseinschränkung wird nicht akzeptiert
 
Hallo zusammem,
habe bei Delphi und der TADO Query Komponente das Problem, dass eine Datumseinschrängun, nicht greift. Die Abfragen funktionieren tatellos im Query Reporter aber wenn ich in Delphi den String eingebe, bekomme ich keine oder Falsche Daten.

Delphi-Quellcode:
SELECT Date_Completed from DELIVERIES d where d.Firm_ID='32770' and d.Status <>'--' and d.date_completed>='01.01.2007' and d.date_completed<='20.01.2007'
Gibt keine Daten aus(Im Query Reporter aber schon)

Delphi-Quellcode:
SELECT Date_Completed from DELIVERIES d where d.Firm_ID='32770' and d.Status <>'--' and d.date_completed>='01.01.2007'
Gibt alle verfügbaren Daten aus. Nicht die ab dem 01.01.07


Ich bause mir daran echt die Zähne aus, könnt ihr mir dabei helfen? Habe schon mit Trunc versucht, oder mit to_Char und wieder in to_date. Alles geht irgentwie nicht.

BIG THX

Cyberbob

marabu 5. Mär 2007 08:53

Re: Datumseinschränkung wird nicht akzeptiert
 
Hallo,

stelle dein Statement bitte mal auf Parameterversorgung um, damit ausgeschlossen werden kann, dass du eine falsche Darstellung für das Datum verwendest.

Grüße vom marabu

mkinzler 5. Mär 2007 08:53

Re: Datumseinschränkung wird nicht akzeptiert
 
Versuch mal den Einsatz der von Parametern:

Cyberbob_at_tot 5. Mär 2007 08:58

Re: Datumseinschränkung wird nicht akzeptiert
 
Sorry, Parameterversorgung ? sagt mir gerade nichts.

Könnt ihr mir dazu ein Beispiel geben ?

mkinzler 5. Mär 2007 09:01

Re: Datumseinschränkung wird nicht akzeptiert
 
Delphi-Quellcode:
query.SQL.Text := 'SELECT Date_Completed from DELIVERIES d where d.Firm_ID=:ID and d.Status <> :Status and d.date_completed between :dat and :dat2';
...
query1.ParamByName('ID').Value := ...
...

Catbytes 5. Mär 2007 09:18

Re: Datumseinschränkung wird nicht akzeptiert
 
Kann es sein, daß das kein Date-Feld, sondern ein DateTime-Feld ist (also die Uhrzeit noch mitgespeichert wird)?

Damit habe ich in Access auch immer etwas Probleme. Gibt es bei Oracle-SQL keinen Between-Befehl?

Cyberbob_at_tot 5. Mär 2007 09:30

Re: Datumseinschränkung wird nicht akzeptiert
 
Hallo nochmal,
habe beim query 2 Parameter...Datum_von und Datum_bis eingetragen. Wenn ich aber nun mit...

Delphi-Quellcode:
 Bericht_query.Parameters.ParamByName('Datum_bis').Value:='01.03.2007';
...den Wert Setze, dann bekomme ich den Fehler, das der Parameter nicht vorhanden ist.

Habe auch bei der eingabe des Datums im String selber, das Format berücksichtigt, so wie es auf der DB angeben ist. Aber irgentwie gehts trotzdem nicht.

@Catbytes
Es ist ein DateTimeFeld, aber das wollte ich mit Trunc umgehen. Doch es gibt den Befehl Between, werd ich nun auch nehmen, geht aber trotzdem nicht.

mkinzler 5. Mär 2007 09:32

Re: Datumseinschränkung wird nicht akzeptiert
 
Im Query oder innerhalb des Select-Statements?

Cyberbob_at_tot 5. Mär 2007 09:34

Re: Datumseinschränkung wird nicht akzeptiert
 
Der Fehler kommt beim zuweisen des Wertes zum Parameter!

mkinzler 5. Mär 2007 09:37

Re: Datumseinschränkung wird nicht akzeptiert
 
Nein, hast du parameter im SQL-Statement angelegt oder in der Query-Komponente?

Cyberbob_at_tot 5. Mär 2007 09:41

Re: Datumseinschränkung wird nicht akzeptiert
 
Ach so, dann denke ich beides, wenn man mit :Datum_von einen Parameter anlegt, habe ich es im Statment und im query gemacht!

mikhal 5. Mär 2007 09:54

Re: Datumseinschränkung wird nicht akzeptiert
 
Bevor du die Query mit der Methode Open öffnest, musst du noch der Datenbank mitteilen, dass du mehrere Parameter verwendest. Das erfolgt über die Eigenschaft Prepared, die auf True gesetzt wird.

Es ist eine Eigenart der TAdoQuery (zumindest im Zusammenspiel mit Oracle), dass sie nur dann mit mehreren Parametern etwas anfangen kann.

Also das Ganze etwa so:
Delphi-Quellcode:
 

...
Bericht_query.Parameters.ParamByName('Datum_bis').Value:='01.03.2007';
...
Bericht_query.Prepared := True;
Bericht_query.Open;
...
Grüße
Mikhal

PS: Solltest du den von Microsoft zur Verfügung gestellten OLEDB-Provider verwenden, dann solltest du ganz schnell mal bei Oracle nachschauen und dort den von Oracle zur Verfügung gestellten runterladen, das erspart dir eine Menge Ärger!

PPS: Oben wurde bereits darauf hingewiesen: Oracle verwendet DateTime, ein Trunc um das Datumsfeld zeigt dir immer das Datum mit 0 Uhr! Wenn du also ein Datum vergleichst, solltest du immer die Funktion Trunc verwenden.

Cyberbob_at_tot 5. Mär 2007 10:29

Re: Datumseinschränkung wird nicht akzeptiert
 
Ne ist schon der Oralce Provider.

Aber das mit den Parametern funktioniert trotzdem nicht. Habe Prepare schon dauerhaft auf true gesetzt,

Delphi-Quellcode:
Bericht_query.SQL.Text := 'SELECT trunc(Date_Completed) from qguaradm.DELIVERIES d where d.Firm_ID=''32770'' and d.Status <>''--'' and trunc(d.date_completed) between '':Datum_von'' and '':Datum_bis''';
  Bericht_query.Parameters.parambyname('Datum_von').Value:='01.01.2007';
  Bericht_query.Parameters.ParamByName('Datum_bis').Value:='01.03.2007';
Bei Datum_von bekomme ich schon die Fehlermeldung, das der Parameter nicht da ist.

mkinzler 5. Mär 2007 10:35

Re: Datumseinschränkung wird nicht akzeptiert
 
Du mußt/darfst Parameter nicht Quoten:
Delphi-Quellcode:
Bericht_query.SQL.Text := 'SELECT trunc(Date_Completed) from qguaradm.DELIVERIES d where d.Firm_ID=''32770'' and d.Status <>''--'' and trunc(d.date_completed) between :Datum_von and :Datum_bis';

Cyberbob_at_tot 5. Mär 2007 10:37

Re: Datumseinschränkung wird nicht akzeptiert
 
Ups, OK gemacht. Funktioniert. Aber die Daten werden immer noch falsch ausgeben, also sind wir, was dem Fehler angeht nicht viel weiter. Versteh das auch nicht wirklich, da das Format mit Trunc doch auf mm.dd.yyyy ist, und so gebe ich es auch ein! Trotzdem will er es irgentwie nicht!

mkinzler 5. Mär 2007 10:41

Re: Datumseinschränkung wird nicht akzeptiert
 
Versuch mal
SQL-Code:
...and cast(d.date_completed as Date) ...

Peinhard 5. Mär 2007 10:43

Re: Datumseinschränkung wird nicht akzeptiert
 
Zitat:

Zitat von Cyberbob_at_tot
[...] da das Format mit Trunc doch auf mm.dd.yyyy ist, [...]

??? Übergib den Parametern mal explizit einen TDateTime und keinen String.

Cyberbob_at_tot 5. Mär 2007 11:01

Re: Datumseinschränkung wird nicht akzeptiert
 
@Peinhard
endlich strtoDatetime bei der Parameterübergabe hat geholfen, scheint so zu funktionieren, besten dank.

@mkinzler
habe Cast auch mal vesucht, kamen aber auch keine Daten raus :(

Cyberbob_at_tot 5. Mär 2007 11:14

Re: Datumseinschränkung wird nicht akzeptiert
 
Ich bins nochmal, irgentwie klappt es falsch, bekomme wohl daten aber nicht alle.

Delphi-Quellcode:
SELECT trunc(Date_Completed) as Datum from qguaradm.DELIVERIES d where d.Firm_ID='32770' and d.Status <>'--' and trunc(d.date_completed) between '01.01.2007' and '05.03.2007'
Bei der Abfrage in Delphi bekomme ich 4 Einträge, im QueryReporter 12 Einträge. Irgentwas stimmt da nicht!

Catbytes 5. Mär 2007 11:20

Re: Datumseinschränkung wird nicht akzeptiert
 
Zitat:

Zitat von Cyberbob_at_tot
Bei der Abfrage in Delphi bekomme ich 4 Einträge, im QueryReporter 12 Einträge. Irgentwas stimmt da nicht!

Gibt es bei den acht wo fehlen irgendwelche Übereinstimmungen?

Was passiert, wenn Du mal mit TTable und Filtern arbeitest (Filter einfach auf Datum setzen).

mikhal 5. Mär 2007 11:32

Re: Datumseinschränkung wird nicht akzeptiert
 
Versuch's mal so:

SQL-Code:
SELECT trunc(Date_Completed) as Datum from qguaradm.DELIVERIES d where d.Firm_ID='32770' and d.Status <>'--' and trunc(d.date_completed) between TO_DATE('01.01.2007', 'DD.MM.RRRR') and TO_DATE('05.03.2007', 'DD.MM.RRRR')
Grüße
Mikhal

Cyberbob_at_tot 5. Mär 2007 11:38

Re: Datumseinschränkung wird nicht akzeptiert
 
Nein, mir fällt nichts auf! Sind einfach nur Datums angaben.
Irgentwie zeigt er nur diese 4. Wenn ich andere aufrufe kommen keine Daten!

@mikhal
auch so, bekomme ich nur 4 Datensätze. Im Query Reporter aber alle, also dürfte es nicht am String liegen!

mikhal 5. Mär 2007 11:42

Re: Datumseinschränkung wird nicht akzeptiert
 
Mein Fehler: ich habe selbst das Trunc vergessen:

SQL-Code:
SELECT trunc(Date_Completed) as Datum from qguaradm.DELIVERIES d where d.Firm_ID='32770' and d.Status <>'--' and trunc(d.date_completed) between TRUNC(TO_DATE('01.01.2007', 'DD.MM.RRRR')) and TRUNC(TO_DATE('05.03.2007', 'DD.MM.RRRR'))

Cyberbob_at_tot 5. Mär 2007 11:48

Re: Datumseinschränkung wird nicht akzeptiert
 
@mikhal
Auch mit dem Trunc funkioniert es in Delphi nicht.

Ist doch ziemlich komisch, liegt das an mir oder an Delphi, habe doch alles so übergeben, das es funktionieren sollte, auch der String geht! MIST!

mikhal 5. Mär 2007 12:04

Re: Datumseinschränkung wird nicht akzeptiert
 
Ohne weiteren Quelltext wird dir dann kaum jemand weiterhelfen können. Laß mal die entsprechende Procedure sehen, in der du dieses Statement zusammenbaust und aufrufst.

Grüße
Mikhal

mkinzler 5. Mär 2007 12:06

Re: Datumseinschränkung wird nicht akzeptiert
 
Kombinier mal den Cast mit dem TO_DATE.

Cyberbob_at_tot 5. Mär 2007 12:30

Re: Datumseinschränkung wird nicht akzeptiert
 
OK Hier mal der Quelltext....
Delphi-Quellcode:
 Bericht_query.close;
  bericht_project.Open;
  //Qguar_Abfragen();
  Bericht_query.SQL.Clear;
  Bericht_query.SQL.Text := 'SELECT trunc(Date_Completed) as Datum from qguaradm.DELIVERIES d where d.Firm_ID=''32770'' and d.Status <>''--'' and trunc(d.date_completed) between trunc(TO_DATE(:Datum_von, ''DD.MM.RRRR'')) and trunc(TO_DATE(:Datum_bis, ''DD.MM.RRRR''))';
  //Bericht_query.SQL.Text := Bericht_SQL_String;
  Bericht_query.Parameters.parambyname('Datum_von').Value:=strtodatetime('01.01.2007');
  Bericht_query.Parameters.ParamByName('Datum_bis').Value:=strtodatetime('05.03.2007');
  Bericht_query.SQL.SaveToFile('c:\a.txt');
  Bericht_query.Open;
  Bericht_query.First;
  While not Bericht_query.Eof do
  Begin
     Showmessage(Bericht_query.FieldByName('Datum').AsString);
     Bericht_query.Next
  End;
Das durchlaufen der Einträge ist nur zum test. Eigentlich übergebe ich án der Stelle an RaveReport.

mkinzler 5. Mär 2007 12:35

Re: Datumseinschränkung wird nicht akzeptiert
 
SQL-Code:
SELECT Cast(Date_Completed as Date) as Datum from qguaradm.DELIVERIES d where d.Firm_ID=''32770'' and d.Status <>''--'' and trunc(d.date_completed) between TO_DATE(:Datum_von, ''DD.MM.RRRR'') and TO_DATE(:Datum_bis, ''DD.MM.RRRR'')';

Cyberbob_at_tot 5. Mär 2007 12:39

Re: Datumseinschränkung wird nicht akzeptiert
 
"Literal stimmt nicht mit dem Format der Zeichenfolge überein"

:(

mikhal 5. Mär 2007 13:17

Re: Datumseinschränkung wird nicht akzeptiert
 
Warum wandelst du die beiden DateTime-Werte für deine Datumsparameter in deinem SELECT-Statement noch einmal in ein DateTime?

Die Eigenschaft Prepared musst du jedesmal auf True setzen, wenn du Parameter geändert hast!

Delphi-Quellcode:
Bericht_query.close;
  bericht_project.Open;
  //Qguar_Abfragen();
  Bericht_query.SQL.Clear;

  // Warum willst du ein DateTime in ein DateTime casten???
  Bericht_query.SQL.Text := 'SELECT trunc(Date_Completed) as Datum from qguaradm.DELIVERIES d where d.Firm_ID=''32770'' and d.Status <>''--'' and trunc(d.date_completed) between trunc(:Datum_von) and trunc(:Datum_bis)';

  //Bericht_query.SQL.Text := Bericht_SQL_String;
  Bericht_query.Parameters.parambyname('Datum_von').Value:=strtodatetime('01.01.2007');
  Bericht_query.Parameters.ParamByName('Datum_bis').Value:=strtodatetime('05.03.2007');
  Bericht_query.SQL.SaveToFile('c:\a.txt');

  Bericht_query.Prepared := True; // => du übergibst hier zwei neue Parameter !

  Bericht_query.Open;
  Bericht_query.First;
  While not Bericht_query.Eof do
  Begin
     Showmessage(Bericht_query.FieldByName('Datum').AsString);
     Bericht_query.Next
  End;
Das oben kann nur funktionieren, wenn die Parameter auch tatsächlich als Typ TDate oder TDateTime haben.

Grüße
Mikhal

marabu 5. Mär 2007 13:42

Re: Datumseinschränkung wird nicht akzeptiert
 
Hallo Michael,

schau nochmal in die ADO-Referenz. Wenn ich die richtig interpretiere, dann muss die property Prepared nur einmal gesetzt werden. Der Provider merkt sich diese Einstellung und übersetzt das Statement zum richtigen Zeitpunkt. Im OI genügt die Einstellung zur Entwurfszeit, da der Provider die property auch dann auswertet, wenn sich der Command Text ändert. Bei dynamisch erzeugten Command Objects muss man daran denken, dass die Standardvorgabe False ist.

Freundliche Grüße

PS: Da ich bereits in Beitrag #2 auf die vermutlich fehlerhafte Schreibweise des Datum-Literals hingewiesen habe, lassen mich mittlerweile über 30 Beiträge in diesem thread an meiner sprachlichen Ausdrucksfähigkeit zweifeln.

mikhal 5. Mär 2007 13:50

Re: Datumseinschränkung wird nicht akzeptiert
 
Hallo Achim,

du magst Recht haben, dass es normalerweise einmal reicht, Prepared auf True zu setzen. Leider habe ich im Zusammenhang mit Oracle häufig Probleme gehabt, wenn ich es nicht erneut gesetzt habe. Wohlgemerkt, nur, wenn mehrere Parameter im Spiel waren.

Grüße
Mikhal

marabu 5. Mär 2007 14:16

Re: Datumseinschränkung wird nicht akzeptiert
 
Hallo Michael,

das kann gut sein, ist dann aber eine fehlerhafte Implementierung der Spezifikation. Da ich keine Projekt-Erfahrung im Umgang mit Oracle habe, klinke ich mich mal wieder aus.

Freundliche Grüße

Cyberbob_at_tot 5. Mär 2007 14:33

Re: Datumseinschränkung wird nicht akzeptiert
 
Hallo nochmal,
das Thema scheint ja doch mehrer zu beschäftigen, habe nun mal dne Qualltext angepasst. Ich bekomme auch Daten, aber eben nur 4 und im Query Reporter, selbe Abfrage, 12.

Delphi-Quellcode:
Bericht_query.close;
  bericht_project.Open;
  //Qguar_Abfragen();
  Bericht_query.SQL.Clear;
  Bericht_query.SQL.Text := 'SELECT trunc(Date_Completed) as Datum from qguaradm.DELIVERIES d where d.Firm_ID=''32770'' and d.Status <>''--'' and trunc(d.date_completed) between :Datum_von and :Datum_bis';
  //Bericht_query.SQL.Text := Bericht_SQL_String;
  Bericht_query.Parameters.parambyname('Datum_von').Value:=strtodate('01.01.2007');
  Bericht_query.Parameters.ParamByName('Datum_bis').Value:=strtodate('05.03.2007');
  Bericht_query.Prepared := True;
  Bericht_query.SQL.SaveToFile('c:\a.txt');
  Bericht_query.Open;
  Bericht_query.First;
  While not Bericht_query.Eof do
  Begin
     Showmessage(Bericht_query.FieldByName('Datum').AsString);
     Bericht_query.Next
  End;
Ich finde dies sowieso ziemlich komisch, aber ich doctor schon so lange dran rum, kann doch nicht so schwer sein, in Delphi die Abfrage zu implementieren!

Danke für eure Hilfe, ich hoffe wir finden eine Lösung!

marabu 5. Mär 2007 14:39

Re: Datumseinschränkung wird nicht akzeptiert
 
Nochmal im Klartext:

Delphi-Quellcode:
//...
  Bericht_query.Parameters.parambyname('Datum_von').Value := EncodeDate(2007, 1, 1);
  Bericht_query.Parameters.ParamByName('Datum_bis').Value := EncodeDate(2007, 3, 5);
//...
So würde ich es probieren...

Cyberbob_at_tot 5. Mär 2007 14:46

Re: Datumseinschränkung wird nicht akzeptiert
 
Jo habe ich so probiert. So macht er die Abfrage auch, aber auch mit zu wenig Daten im Output. es Fehlen einfach welche!

mkinzler 5. Mär 2007 14:47

Re: Datumseinschränkung wird nicht akzeptiert
 
Haben die fehlenden, etwas Gemeinsames?

Cyberbob_at_tot 5. Mär 2007 14:51

Re: Datumseinschränkung wird nicht akzeptiert
 
Nur eins, die Daten fehlen nach dem 16.01.07, die Daten sind noch da, aber z.B die vom 19.01.07 fehlen und folgende auch!

Catbytes 5. Mär 2007 14:55

Re: Datumseinschränkung wird nicht akzeptiert
 
Zitat:

Zitat von Cyberbob_at_tot
Nur eins, die Daten fehlen nach dem 16.01.07, die Daten sind noch da, aber z.B die vom 19.01.07 fehlen und folgende auch!

Und wenn Du mal between weg läßt? Also Abfrage nach allem was >=01.01.2007 ist?

Hier mal am Beispiel deiner Grundabfrage vom 1. Posting:
SQL-Code:
SELECT Date_Completed from DELIVERIES d where d.Firm_ID='32770' and d.Status <>'--' and d.date_completed>='01.01.2007'

Cyberbob_at_tot 5. Mär 2007 15:06

Re: Datumseinschränkung wird nicht akzeptiert
 
Delphi-Quellcode:
Bericht_query.SQL.Text := 'SELECT trunc(Date_Completed) as Datum from qguaradm.DELIVERIES d where d.Firm_ID=''32770'' and d.Status <>''--'' and d.date_completed>=''01.01.2007''';
Dann kommen 8 Datensätze, wohei 4 Davon aus 2006 sind. Aber das sind auch nicht alle!

Aber auch, wenn ich die Eingrenung komplett weglasse, werden 8 Datensätze von 15 angezeigt. IM Query Reporter hingeben, selbe Abfrage, alle 15 da!

Was soll das denn wieder. So langsamm denke ich, das an der Datenbank was nicht stimmt. Also wie die Daten abgelegt worden sind.

[Edit]
Auch wenn ich die Abfrage aus dem Query Reporter kopiere, und direkt in den Wide-Stringlisten-Editor einfüge, kommen auch nur 8 Datensätze!


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