Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi To_Date wird nicht erkannt (https://www.delphipraxis.net/163576-to_date-wird-nicht-erkannt.html)

fanavity 5. Okt 2011 09:11

Datenbank: Oracle • Version: 9 • Zugriff über: BDE/ODBC

To_Date wird nicht erkannt
 
Hallo,

ich habe ein SQL-Statement, welches ich in Delphi ausführen will. Dort möchte ich ein Datum abgleichen. Doch ich bekomme eine Exception, die aussagt das die Funktion To_Date nicht bekannt sei.. Woran kann das liegen?

Delphi-Quellcode:
     Query.Close;
     Query.Sql.Clear;
     Query.Sql.Add('SELECT *');
     Query.Sql.Add('FROM DATA_Test');
     Query.Sql.Add('WHERE DATUM = TO_Date(":Datum", "DD-MM-YYYY") ');
     Query.Params.ParamByName('DATUM').Value := Datum;
     Query.open;
Vielleicht hat ja jemand eine Idee?

angos 5. Okt 2011 09:17

AW: To_Date wird nicht erkannt
 
Hallo,

habe eigentlich keine Erfahrung mit Orcale, aber ggf. könnte es sein, dass der FUnktionsname casesensitive ist? Nur so als Idee.

Gruß

Bernhard Geyer 5. Okt 2011 09:18

AW: To_Date wird nicht erkannt
 
Wieso so umständlich?
Es müsste doch gehen wenn du den Parameter schon auf Delphi-Ebene als Datumswert mittels
Delphi-Quellcode:
Query.Params.ParamByName('DATUM').AsDate := Datum;
übergibst.

Und was soll diese bescheuderte DD-MM-YYYY - Formatierung? Entweder ISO-Format (YYYY-MM-DD) oder "normales" Format (DD.MM.YYYY).

jobo 5. Okt 2011 09:18

AW: To_Date wird nicht erkannt
 
Ich glaube, Du sprichst an der Stelle mit der BDE/ODBC und kannst kein produktspzifisches, natives SQL absetzen.

fanavity 5. Okt 2011 09:25

AW: To_Date wird nicht erkannt
 
Delphi-Quellcode:
Query.Params.ParamByName('DATUM').AsDate := StrToDate(Datum);
Bei dieser Variante sagt er mir:

Zitat:

Im Projekt Test.EXE ist eine Exception der Klasse EConvertError aufgetreten. Meldung: "2011-10-04" ist kein Gültiges Datum.
Okay.. Wenn ich also mit BDE/ODBC kommuniziere, denke ich kaum das er die Befehle von Oracle kennt.. Also muss das vorher umgewandelt werden..

jaevencooler 5. Okt 2011 09:36

AW: To_Date wird nicht erkannt
 
Moin, Moin,


also wenn Du die BDE nutzt, dann kannst Du irgendwo einstellen wie die BDE das SQL behandeln soll, also auf dem Client ausführen oder auf dem Server ausführen. Ist schon lange !!!!!!!! her das ich mit BDE gearbeitet habe, aber ich bin mir sicher das Du die BDE auf sowas wie Pass Through stellen kannst, damit Dein SQL direkt auf dem Server ausgeführt wird.

Nutzt Du ODBC, dann ist die Frage welchen ODBC Treiber benutzt Du ? Grundsätzlich kannst Du aber auch hier natives PL/SQL absetzen.

Beide Alternativen sind eher schlecht, besser wären native Treiber wie von Allround Automation oder DevArt, die kosten Geld ich weiß, aber es gibt hier auch gute Freeware Komponenten (siehe mal bei Torry nach)

Was Deine letzte Fehlermeldung angibt, da sind die Literate falsch, würde ich mal sagen, sprich Dein Datumformat ist irgendwie nicht so wie es erwartet wird. Hierbei musst Du bedenken das auch die Einstellungen auf dem Oracle Server wichtig sind !


Beste Grüße
Michael

Sir Rufo 5. Okt 2011 09:46

AW: To_Date wird nicht erkannt
 
In welchem Format liegt dein Datum in selbiger Variablen denn jetzt vor?
Code:
YYYY-MM-DD
oder
Code:
DD-MM-YYYY
Dein Select erwartet auf jeden Fall
Code:
DD-MM-YYYY
Zitat:

Zitat von fanavity (Beitrag 1128504)
Delphi-Quellcode:
     Query.Close;
     Query.Sql.Clear;
     Query.Sql.Add('SELECT *');
     Query.Sql.Add('FROM DATA_Test');
     Query.Sql.Add('WHERE DATUM = TO_Date(":Datum", "DD-MM-YYYY") ');
     Query.Params.ParamByName('DATUM').Value := Datum;
     Query.open;

Zitat:

Zitat von fanavity (Beitrag 1128509)
Delphi-Quellcode:
Query.Params.ParamByName('DATUM').AsDate := StrToDate(Datum);
Bei dieser Variante sagt er mir:

Zitat:

Im Projekt Test.EXE ist eine Exception der Klasse EConvertError aufgetreten. Meldung: "2011-10-04" ist kein Gültiges Datum.
Okay.. Wenn ich also mit BDE/ODBC kommuniziere, denke ich kaum das er die Befehle von Oracle kennt.. Also muss das vorher umgewandelt werden..

Wie wäre es damit:
Delphi-Quellcode:
     Query.Close;
     Query.Sql.Clear;
     Query.Sql.Add('SELECT *');
     Query.Sql.Add('FROM DATA_Test');
     Query.Sql.Add('WHERE DATUM = TO_Date( :Datum, "YYYY-MM-DD") '); // Die " um :Datum müssten eigentlich überflüssig sein
     Query.Params.ParamByName('DATUM').Value := Datum;
     Query.open;

fanavity 5. Okt 2011 09:47

AW: To_Date wird nicht erkannt
 
Danke für die Antwort..

Leider muss ich vorrerst mit dieser Lösung weiter arbeiten.. Also muss ich sehen wie ich das Problem löse.

Auf der DB ist das Datum so abgespeichert: DD.MM.YYYY
Wenn ich mein Datum genauso Formatiere und übergeben will, bekomme ich keine Fehlermeldung. Aber auch keine Ausgabe.

Wenn ich den Parameter in Anführungszeichen setzte:

Delphi-Quellcode:
     Query.Close;
     Query.Sql.Clear;
     Query.Sql.Add('SELECT *');
     Query.Sql.Add('FROM DATA_Test');
     Query.Sql.Add('WHERE DATUM = ":Datum"');
     Query.Params.ParamByName('DATUM').Value := StrToDate(Datum);
     Query.open;
Dann sagt er mir, dass es den Parameter Datum nicht gibt.

DeddyH 5. Okt 2011 09:49

AW: To_Date wird nicht erkannt
 
Welchen Datentyp hat das Datum eigentlich in der DB? Date oder String?

fanavity 5. Okt 2011 09:51

AW: To_Date wird nicht erkannt
 
Zitat:

Zitat von DeddyH (Beitrag 1128515)
Welchen Datentyp hat das Datum eigentlich in der DB? Date oder String?

Das Feld Datum ist vom Typ Date

Bernhard Geyer 5. Okt 2011 09:51

AW: To_Date wird nicht erkannt
 
Zitat:

Zitat von fanavity (Beitrag 1128514)
Auf der DB ist das Datum so abgespeichert: DD.MM.YYYY

Dein erster Versuch geht davon aus das das Feld als Datumsfeld definiert ist. Dann wird das DB-Interne Format für die Speicherung verwendet und das Format "DD.MM.YYYY" ist nur ein (konfigurierbares) Anzeigeformat.

fanavity 5. Okt 2011 09:54

AW: To_Date wird nicht erkannt
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1128518)
Zitat:

Zitat von fanavity (Beitrag 1128514)
Auf der DB ist das Datum so abgespeichert: DD.MM.YYYY

Dein erster Versuch geht davon aus das das Feld als Datumsfeld definiert ist. Dann wird das DB-Interne Format für die Speicherung verwendet und das Format "DD.MM.YYYY" ist nur ein (konfigurierbares) Anzeigeformat.

Und was bedeutet das dann für mich? Verstehe deine Aussage nicht so ganz. Sorry

Union 5. Okt 2011 10:01

AW: To_Date wird nicht erkannt
 
Da ist Einiges überflüssig, wieso die vielen Umwandlungen? Wenn das ein Date-Feld ist dann doch wohl so:
Delphi-Quellcode:
Query.Close;
Query.Sql.Clear;
Query.Sql.Add('SELECT *');
Query.Sql.Add('FROM DATA_Test');
Query.Sql.Add('WHERE DATUM = :Datum');
Query.Params.ParamByName('DATUM').AsDateTime := StrToDate(Datum);
Query.open;
Aber da stellt sich mir auch die Frage, warum mit Stringdatum gearbeitet wird (also die var Datum)?

DeddyH 5. Okt 2011 10:02

AW: To_Date wird nicht erkannt
 
Genau darauf zielte meine Frage ab. Ein Datum ist ein Datum, da muss man doch nichts in String konvertieren und andersherum.

Sir Rufo 5. Okt 2011 10:06

AW: To_Date wird nicht erkannt
 
Er scheitert ja an der Umwandlung von dem Datum ("2011-10-05" Datum im Code ist eine String-Variable) in einen Date-Wert.

Hier sollte man der Funktion Delphi-Referenz durchsuchenStrToDate entsprechend angepasste FormatSettings mitgeben!

DeddyH 5. Okt 2011 10:15

AW: To_Date wird nicht erkannt
 
Es ist nur eine Vermutung, aber ich glaube, die Variable ist eher aus Verlegenheit als String deklariert. Sofern die Daten aus der DB ausgelesen werden, kann man sie doch auch gleich als TDate verarbeiten.

p80286 5. Okt 2011 10:20

AW: To_Date wird nicht erkannt
 
ich denke es klemmt an der Hochkommateritis:
Code:
WHERE DATUM = TO_Date( :Datum, "YYYY-MM-DD")
wird von Oracle nicht akzeptiert, es müsste so lauten:
Code:
WHERE DATUM = TO_Date( :Datum, 'YYYY-MM-DD')
oder legt die BDE hier noch einen Vereinfachungsschleier drüber?

Gruß
K-H

fanavity 5. Okt 2011 10:40

AW: To_Date wird nicht erkannt
 
Ich denke mal, dass der Fehler nun behoben ist. Nur leider ist mir aufgefallen, dass ich viel früher schon einen habe. Und zwar beim speichern der Daten.

Vielleicht könnr ihr ja mal rüber sehen!

Delphi-Quellcode:
     Query.Close;
     Query.Sql.Clear;
     Query.Sql.Add('CREATE TABLE '+Tabelle+' ( Nummer real, IDNR real, IDNR2 real) ');

     Database.StartTransaction;

     try
         Query.ExecSQL;
         Database.Commit;
         except
          on E: Exception do
         begin
              Database.Rollback;
              ShowMessage(E.Message);
         end;
     end;


     Query.Close;
     Query.Sql.Clear;
     Query.Sql.Add('INSERT INTO '+Tabelle+' ( Nummer, IDNR, IDNR2) ');
     Query.Sql.Add('SELECT a.TEST1, a.TEST2, b.TEST2');
     Query.Sql.Add('FROM DATA_TEST2 a, DATA_TEST2 b ');
     Query.Sql.Add('WHERE a.IDNR= 4 ');
     Query.Sql.Add('AND b.IDNR= 5');
     Query.Sql.Add('AND a.IDNR LIKE "%'+Variable+'" ');
     Query.Sql.Add('AND a.IDNR2 = b.IDNR');
     Database.StartTransaction;

     try
         Query.ExecSQL;
         Database.Commit;
         except
          on E: Exception do
         begin
              Database.Rollback;
              ShowMessage(E.Message);
         end;
     end;

     Query.Close;
     Query.SQL.Clear;
     Query.SQL.Add('SELECT * FROM '+Tabelle+'');
     Query.Open;
Die Daten werden nicht in die neue Tabelle übertragen. Mit Toad for Oracle funktioniert die Abfrage tadellos.

Sir Rufo 5. Okt 2011 10:59

AW: To_Date wird nicht erkannt
 
Delphi-Quellcode:

     Query.Close;
     Query.Sql.Clear;
     Query.Sql.Add('CREATE TABLE '+Tabelle+' ' );
     Query.Sql.Add('SELECT a.TEST1 Nummer, a.TEST2 IDNR, b.TEST2 IDNR2 ');
     Query.Sql.Add('FROM DATA_TEST2 a, DATA_TEST2 b ');
     Query.Sql.Add('WHERE a.IDNR= 4 ');
     Query.Sql.Add('AND b.IDNR= 5');
     Query.Sql.Add('AND a.IDNR LIKE "%'+Variable+'" ');
     Query.Sql.Add('AND a.IDNR2 = b.IDNR');
     Database.StartTransaction;

     try
         Query.ExecSQL;
         Database.Commit;
     except
          on E: Exception do
         begin
              Database.Rollback;
              ShowMessage(E.Message);
         end;
     end;

     Query.Close;
     Query.SQL.Clear;
     Query.SQL.Add('SELECT * FROM '+Tabelle+'');
     Query.Open;

fanavity 5. Okt 2011 11:14

AW: To_Date wird nicht erkannt
 
Funktioniert leider auch nicht :(

Die tabelle ist halt einfach leer.. Bekomme auch keine Fehlermeldung oder so..

jobo 5. Okt 2011 11:32

AW: To_Date wird nicht erkannt
 
Im Letzten Versuch fehlt nach dem Create [tablename] ein "as" vor dem Select.
Ansonsten scheint mir die Like Operation mit Doppelhochkomma verkehrt. Doppelhochkomma ist Delimiter für spezielle Spaltennamen in ORacle. Da es aber um einen String Wert geht, muss mit einfachen Hochkomma plus QuotedStr gearbeitet werden oder mit doppelten einfachen Hochkommata.

p80286 5. Okt 2011 11:35

AW: To_Date wird nicht erkannt
 
so ohne Handbuch, muß es nicht so sein:
Code:
Insert Into Tabelle (Feld1,Feld2...) Values(Wert1,Wert2...)
Gruß
K-H

jobo 5. Okt 2011 11:38

AW: To_Date wird nicht erkannt
 
Man kann entweder ein Create Table mit Select kombinieren
Create table [tablename] as [Select..]
oder wie Du geschrieben hast
oder insert into [tablename] ([Columns]) mit Select kombinieren.
Im letzten Fall gehören glaub ich runde Klammern um das Select

Edit: Geht mit und ohne Klammern, glaub das hab ich mit Update plus Select verwechselt.

p80286 5. Okt 2011 11:43

AW: To_Date wird nicht erkannt
 
Zitat:

Zitat von jobo (Beitrag 1128550)
Im letzten Fall gehören glaub ich runde Klammern um das Select

Das Handbuch sagt, so isses!

Gruß
K-H

fanavity 5. Okt 2011 11:46

AW: To_Date wird nicht erkannt
 
Also..

Weder QuotedStr, noch
Delphi-Quellcode:
Query.Sql.Add('AND a.IDNR LIKE ''%'+Variable+''' ');
hat geklappt. Wenn ich bei Oracle ein AS benutze, sagt er mir das ich Syntaxfehler vorliegt. Irgendwie finde ich das ganze seltsam :/

PS:

Momentane Version:

Delphi-Quellcode:

 Query.Sql.Add('CREATE TABLE '+Tabelle+' ( Nummer real, IDNR real, IDNR2 real) ');
 Query.Sql.Add('SELECT a.TEST1, a.TEST2, b.TEST2');
 Query.Sql.Add('FROM DATA_TEST2 a, DATA_TEST2 b ');
 Query.Sql.Add('WHERE a.IDNR= 4 ');
 Query.Sql.Add('AND b.IDNR= 5');
 Query.Sql.Add('AND a.IDNR LIKE ''%'+Variable+''' ');
 Query.Sql.Add('AND a.IDNR2 = b.IDNR');
 Database.StartTransaction;

     try
         Query.ExecSQL;
         Database.Commit;
         except
          on E: Exception do
         begin
              Database.Rollback;
              ShowMessage(E.Message);
         end;
     end;

jobo 5. Okt 2011 13:07

AW: To_Date wird nicht erkannt
 
Entweder so
Query.Sql.Add('AND a.IDNR LIKE '+QuotedStr('%'+Variable) );
oder so glaub ich
Query.Sql.Add('AND a.IDNR LIKE ''''+'%'+Variable+'''' );
(ungetestet)

Du solltest aber mal das "PassThrough Thema" klären,
"Create Table Tablename as Select"
geht mit Sicherheit -in Oracle.

Ich kann mich nicht mehr erinnern, ob man BDE auf native Betrieb umstellen kann. Aber es wurde ja hier irgendwo gesagt.
Wenn dann wäre noch die Frage, ob das per Query oder per Connection geht. Falls Du schon viel BDE -kompatibel
entwickelt hast und nun die ganze Verbindung auf Native umstellst, fliegt Dir evtl. auch was um die Ohren.

fanavity 5. Okt 2011 13:30

AW: To_Date wird nicht erkannt
 
Leider finde ich zum Thema PassThrough nicht wirklich viel Brauchbares.. :/

Jumpy 5. Okt 2011 13:44

AW: To_Date wird nicht erkannt
 
Kurze Frage: Was ist real in Oracle für ein Datentyp? Ne Zahl, oder?
Dann kann man doch nicht mit "like" irgendwas vergleichen.

fanavity 5. Okt 2011 13:49

AW: To_Date wird nicht erkannt
 
Ich habe es nun mit Integer gemacht. Und wie gesagt.. Alle Statements funktionieren im Toad for Oracle einwandfrei.

Das Like % steht lediglich dafür, dass davor noch beliebig viele (unbekannte) zeichen stehen können.. Da es sich immer nur um die letzten 4 handelt ;)

DeddyH 5. Okt 2011 13:55

AW: To_Date wird nicht erkannt
 
Trotzdem ist der Einwand äußerst berechtigt. LIKE ist lediglich für alphanumerische Felder zu gebrauchen (VARCHAR2 z.B.). Willst Du unbedingt LIKE auf Zahlen loslassen, dann solltest Du diese vorher casten.

fanavity 5. Okt 2011 14:21

AW: To_Date wird nicht erkannt
 
Okay,

ich weiß nur nich wie man es ohne like schreibt.. Denn
Delphi-Quellcode:
Where Test = %Variable
geht nicht.. Da mekert er, dass er ein Like will. Genauso wie bei
Delphi-Quellcode:
Where Test = _Variable

DeddyH 5. Okt 2011 14:25

AW: To_Date wird nicht erkannt
 
Sag doch erstmal, was genau Du eigentlich vorhast.

Jumpy 5. Okt 2011 14:28

AW: To_Date wird nicht erkannt
 
Die Frage ist halt: Ist in dem Feld der Tabelle eine Zeichenkette oder eine Zahl.
Zeichenkette: test like '%1234'
Zahl: test-Trunc(test/10000)*10000 = 1234

Die Variante Zahl geht auch bestimmt einfacher aber hab gerade keine Lust die OracleReferenz zu suchen...

fanavity 5. Okt 2011 14:39

AW: To_Date wird nicht erkannt
 
Was ich vorhabe..

Ich möchte eine Datenbankabfrage anhand von 2 Vorgaben machen.

Artikelnummer, Auftragsnummer. Er soll mir dann alle Artikelnummern zu der jeweiligen Auftragsnummer anzeigen. Da die Artikelnummer aber aus einer Datei ausgelesen wird, ist sie max 4Stellen lang. Dabei wird von hinten gezählt. Aus: 123456 wird dann 6543. Und 1234 bleibt einfach 1234.

Ich hoffe das ist verständlich. Aber viel wichtiger wäre es mir ersteinmal, dass mein Insert Into bzw Create Table Select befehl klappt. Ob ich dazu nun eine Abfrage mehr oder weniger mache ist mir eigentlich egal. Hauptsache die Daten landen in einer Tabelle :)

DeddyH 5. Okt 2011 14:47

AW: To_Date wird nicht erkannt
 
Und welchen Datentyp hat IDNR? Wenn es eine ganze Zahl ist, dann kannst Du doch MOD benutzen.

fanavity 5. Okt 2011 14:54

AW: To_Date wird nicht erkannt
 
Ist vom Typ Number(10).. Dann werde ich mir die MOD funktion mal genauer ansehen.

Mein Problem ist nur, selbst wenn ich dort eine feste Zahl eingebe funktioniert es nicht. Da ich um Toad for Oracle eine Klammer um das Select machen muss. Wenn ich das in Delphi mache, sagt er mir Syntaxfehler!

jobo 5. Okt 2011 15:05

AW: To_Date wird nicht erkannt
 
Genau das funktioniert in native SQL und via BDE>ODBC:
Code:
Connected to Oracle Database 11g Release 11.2.0.1.0 
Connected as jobo
 
SQL> desc mytable
Name      Type      Nullable Default Comments
---------- ---------- -------- ------- -------- 
MYVALUE   CHAR(4)   Y                        
WHEN      DATE      Y                        
ZAHLENWERT NUMBER(10) Y                        
 
SQL> select * from myTable;
 
MYVALUE WHEN        ZAHLENWERT
------- ----------- -----------
Wert   18.10.2011 
 
SQL> update mytable set zahlenwert = 12345;
 
1 row updated
 
SQL> commit;
 
Commit complete
 
SQL> select * from myTable;
 
MYVALUE WHEN        ZAHLENWERT
------- ----------- -----------
Wert   18.10.2011        12345
 
SQL>
SQL> create table myNewTable as
  2  select 'Wert' as myValue , when, zahlenwert from myTable t
  3  where zahlenwert like '%2345'
  4  and to_date('19.10.2011','DD.MM.YYYY') > t.when
  5  ;
 
Table created
 
SQL> select * from myNewTable;
 
MYVALUE WHEN        ZAHLENWERT
------- ----------- -----------
Wert   18.10.2011        12345
 
SQL>
Das bedeutet nicht, dass es optimal umgesetzt ist, aber es geht. Also musst Du mal Deinen Fehler suchen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf