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:
Gibt keine Daten aus(Im Query Reporter aber schon)
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'
Delphi-Quellcode:
Gibt alle verfügbaren Daten aus. Nicht die ab dem 01.01.07
SELECT Date_Completed from DELIVERIES d where d.Firm_ID='32770' and d.Status <>'--' and d.date_completed>='01.01.2007'
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 |
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 |
Re: Datumseinschränkung wird nicht akzeptiert
Versuch mal den Einsatz der von Parametern:
|
Re: Datumseinschränkung wird nicht akzeptiert
Sorry, Parameterversorgung ? sagt mir gerade nichts.
Könnt ihr mir dazu ein Beispiel geben ? |
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 := ... ... |
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? |
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:
...den Wert Setze, dann bekomme ich den Fehler, das der Parameter nicht vorhanden ist.
Bericht_query.Parameters.ParamByName('Datum_bis').Value:='01.03.2007';
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. |
Re: Datumseinschränkung wird nicht akzeptiert
Im Query oder innerhalb des Select-Statements?
|
Re: Datumseinschränkung wird nicht akzeptiert
Der Fehler kommt beim zuweisen des Wertes zum Parameter!
|
Re: Datumseinschränkung wird nicht akzeptiert
Nein, hast du parameter im SQL-Statement angelegt oder in der Query-Komponente?
|
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!
|
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:
Grüße... Bericht_query.Parameters.ParamByName('Datum_bis').Value:='01.03.2007'; ... Bericht_query.Prepared := True; Bericht_query.Open; ... 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. |
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:
Bei Datum_von bekomme ich schon die Fehlermeldung, das der Parameter nicht da ist.
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'; |
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';
|
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!
|
Re: Datumseinschränkung wird nicht akzeptiert
Versuch mal
SQL-Code:
...and cast(d.date_completed as Date) ...
|
Re: Datumseinschränkung wird nicht akzeptiert
Zitat:
|
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 :( |
Re: Datumseinschränkung wird nicht akzeptiert
Ich bins nochmal, irgentwie klappt es falsch, bekomme wohl daten aber nicht alle.
Delphi-Quellcode:
Bei der Abfrage in Delphi bekomme ich 4 Einträge, im QueryReporter 12 Einträge. Irgentwas stimmt da nicht!
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'
|
Re: Datumseinschränkung wird nicht akzeptiert
Zitat:
Was passiert, wenn Du mal mit TTable und Filtern arbeitest (Filter einfach auf Datum setzen). |
Re: Datumseinschränkung wird nicht akzeptiert
Versuch's mal so:
SQL-Code:
Grüße
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')
Mikhal |
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! |
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'))
|
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! |
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 |
Re: Datumseinschränkung wird nicht akzeptiert
Kombinier mal den Cast mit dem TO_DATE.
|
Re: Datumseinschränkung wird nicht akzeptiert
OK Hier mal der Quelltext....
Delphi-Quellcode:
Das durchlaufen der Einträge ist nur zum test. Eigentlich übergebe ich án der Stelle an RaveReport.
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; |
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'')';
|
Re: Datumseinschränkung wird nicht akzeptiert
"Literal stimmt nicht mit dem Format der Zeichenfolge überein"
:( |
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:
Das oben kann nur funktionieren, wenn die Parameter auch tatsächlich als Typ TDate oder TDateTime haben.
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; Grüße Mikhal |
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. |
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 |
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 |
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:
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!
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; Danke für eure Hilfe, ich hoffe wir finden eine Lösung! |
Re: Datumseinschränkung wird nicht akzeptiert
Nochmal im Klartext:
Delphi-Quellcode:
So würde ich es probieren...
//...
Bericht_query.Parameters.parambyname('Datum_von').Value := EncodeDate(2007, 1, 1); Bericht_query.Parameters.ParamByName('Datum_bis').Value := EncodeDate(2007, 3, 5); //... |
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!
|
Re: Datumseinschränkung wird nicht akzeptiert
Haben die fehlenden, etwas Gemeinsames?
|
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!
|
Re: Datumseinschränkung wird nicht akzeptiert
Zitat:
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'
|
Re: Datumseinschränkung wird nicht akzeptiert
Delphi-Quellcode:
Dann kommen 8 Datensätze, wohei 4 Davon aus 2006 sind. Aber das sind auch nicht alle!
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''';
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. |
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