Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem: Oracle+Delphi und Währungs- und Datumsfelder (https://www.delphipraxis.net/27264-problem-oracle-delphi-und-waehrungs-und-datumsfelder.html)

Hawkeye 6. Aug 2004 16:09


Problem: Oracle+Delphi und Währungs- und Datumsfelder
 
Hallo Forum,

ich verwende als DB Oracle 7 und Delphi 7 Enterprise und muß ein Modul zur Verwaltung von Wechselkursen erstellen.

Als Tabellenformat hatte ich zuerst ftCurr, jedoch hatte ich damit Schwierigkeiten bei den Konvertierungen in Delphi, ich konnte nicht per SQL in die ftCurr Felder schreiben, deshalb habe ich dafür im Moment ftString gewählt. Das wäre das erste, was muss ich dort allgemein beachten um ftCurr verwenden zu können?

Tabellenformat:
NAME:STRING
WERT:STRING
USER:STRING
DATE:DATE


Nun möchte ich vergleichen ob ein identischer Datensatz am selben Tag schon einmal angelegt wurde.
Die Abfrage mit COUNT funktioniert auch sehr gut, jedoch nur solange ich nicht das DATE Feld mit in die WHERE Bedingung miteinbeziehe: Dann kommt der Fehler "Missing expression". Was fehlt steht leider nicht da.

Meine Frage konkret: Wie müssten die Queries aussehen die einmal einen solchen Datensatz einfügen und
zum 2. eine Query die Feststellt ob der am selben Tag schon mal ein Datensatz mit gleichem Inhalt eingefügt wurde.

Ich bin inzwischen echt am verzeifeln, da ich mit der Fehlermeldung auch nicht wirklich was anfangen kann.

Besten Dank,
Hawkeye

Union 6. Aug 2004 16:19

Re: Problem: Oracle+Delphi und Währungs- und Datumsfelder
 
Poste doch bitte die Query und die tatsächliche Fehlermeldung. Außerdem wäre es interessant zu wissen, wie Du die Anbindung an die OraDB gemacht hast, z.B. ADO.

Robert_G 6. Aug 2004 16:44

Re: Problem: Oracle+Delphi und Währungs- und Datumsfelder
 
Ich fürchte, ich kann dir beim ersten nicht wirklich helfen. Da Ora7 so alt ist, dass ich es nur von Weitem zu meiner Schulzeit zu Gesicht bekam. (Diese Bugs sind mir in neueren Versionen nch nicht untergekommen) :oops:

Zitat:

Als Tabellenformat hatte ich zuerst ftCurr...
Klingt für mich nach einem Delphi-Typ, welchen Typen hat deine Spalte in Ora?

Zitat:

Meine Frage konkret: Wie müssten die Queries aussehen die einmal einen solchen Datensatz einfügen und
zum 2. eine Query die Feststellt ob der am selben Tag schon mal ein Datensatz mit gleichem Inhalt eingefügt wurde.
Da kann ich dir helfen ;)

Benötigt werden 100g Mehl, 4 Input- & 1 Output -Parameter (für den prim. Schlüssel)

SQL-Code:
begin
  begin
    SELECT DeinPrimKey
    INTO  :o_FoundPK
    FROM  DeineTable
    -- Diese Kombi von Werte darf nur einen DS finden
    -- Ansonsten wirst du einen ORA-01422 (too_many_rows) ernten ;)
    WHERE Name    = :i_Name and
           WERT    = :i_WERT and
           EditUser = :i_User and
           EditDate = :i_Date;
  Exception
    When NO_Data_Found then
      -- Wird nichts gefunden -> INSERT
      :o_FoundPK := 0;
  end;

  if :o_FoundPK = 0 then
    INSERT INTO DeineTabelle
      (Name
      ,WERT
      ,EditUser
      ,EditDate)
    VALUES
      (:i_Name
      ,:i_WERT
      ,:i_User
      ,:i_Date)
    -- Dein Programm wird den neuen PK brauchen ;)
    RETURNING DeinPrimKey
         INTO :o_PK;
  end if;
end;

Das ganze ist im Prinzip ein etwas hässliches Work around für den Befehl MERGE aus Ora9.

Hawkeye 6. Aug 2004 16:55

Re: Problem: Oracle+Delphi und Währungs- und Datumsfelder
 
Zitat:

Zitat von Union
Poste doch bitte die Query und die tatsächliche Fehlermeldung. Außerdem wäre es interessant zu wissen, wie Du die Anbindung an die OraDB gemacht hast, z.B. ADO.

Hallo,

ChkQ:
SQL-Code:
SELECT COUNT(*) FROM ER WHERE NAME='DOLLAR' AND WERT=:WERT AND DATE=trunc(sysdate)
Delphi-Quellcode:
with ChkQ do
begin
  ParamByName('WERT').AsString:=Edit.Text;
  Prepare;
  Open;
end;
Dann hätte ich über ChkQ.Fields[0] oder so (hab ich nicht mehr genau im Kopf) ob was da ist, so eine Abfrage verwende ich mehrmals in anderen Programmteilen, Ärger hab ich erst seit ich das Datum mitprüfen will.

Bringt mir bei anbindung über BDE 5 den Fehler "Missing Expression".

Any hints ?

MfG

Hawkeye 6. Aug 2004 16:59

Re: Problem: Oracle+Delphi und Währungs- und Datumsfelder
 
Hallo,

Zitat:

Zitat von Robert_G
Ich fürchte, ich kann dir beim ersten nicht wirklich helfen. Da Ora7 so alt ist, dass ich es nur von Weitem zu meiner Schulzeit zu Gesicht bekam. (Diese Bugs sind mir in neueren Versionen nch nicht untergekommen) :oops:

Ich kann sie mir leider nicht aussuchen.....

Zitat:

Als Tabellenformat hatte ich zuerst ftCurr...
Klingt für mich nach einem Delphi-Typ, welchen Typen hat deine Spalte in Ora?

stimmt. ist delphi, unter ORA wirs als NUMBER(xx,x) angelegt.

Zitat:

Meine Frage konkret: Wie müssten die Queries aussehen die einmal einen solchen Datensatz einfügen und
zum 2. eine Query die Feststellt ob der am selben Tag schon mal ein Datensatz mit gleichem Inhalt eingefügt wurde.
Da kann ich dir helfen ;)

Das ganze ist im Prinzip ein etwas hässliches Work around für den Befehl MERGE aus Ora9.

Geht das Ganze auch ohne den Primärkey ?

MfG

Robert_G 6. Aug 2004 17:09

Re: Problem: Oracle+Delphi und Währungs- und Datumsfelder
 
Zitat:

Zitat von Hawkeye
Geht das Ganze auch ohne den Primärkey ?

:gruebel: Was hast du gegen Primärschlüssel?

Hawkeye 6. Aug 2004 17:12

Re: Problem: Oracle+Delphi und Währungs- und Datumsfelder
 
Zitat:

Zitat von Robert_G
Zitat:

Zitat von Hawkeye
Geht das Ganze auch ohne den Primärkey ?

:gruebel: Was hast du gegen Primärschlüssel?

Ich habe nichts explizit dagegen, nur hat die Tablle keinen :-).
Ausserdem würde ich gerne wissen warum "meine" Query den Fehler produziert sobald das Datum ins Spiel kommt (hab ich oben gepostet).

MfG

Robert_G 6. Aug 2004 17:27

Re: Problem: Oracle+Delphi und Währungs- und Datumsfelder
 
Zitat:

Zitat von Hawkeye
Ausserdem würde ich gerne wissen warum "meine" Query den Fehler produziert sobald das Datum ins Spiel kommt (hab ich oben gepostet).

  • 1. "DATE" hat als DatenType Vorrang vor Variablen-/Spalten-/Tabellennamen -> boom.
    Du solltest also deine Spalten Date & User sofort umbenennen!
    Das sind reservierte Keywords, die dir anscheinend durch einen Bug in Ora7 nicht sofort um die Ohren gehauen wurden. (Darauf hatte ich vorhwer nicht geachtet. :oops:
  • 2. Setze am Besten ein Leerzeichen zwischen "=" und ":Value", es ist möglich, dass die DB den Parameter nicht erkennt.


Zitat:

Zitat von Hawkeye
Geht das Ganze auch ohne den Primärkey ?

Auch wenn es irgendwie komisch ist, hier: (DBAs ohne PK kommen nicht in den Himmel :angel: )
SQL-Code:
declare
  lFoundRec Integer;
begin
  begin
    SELECT 1
    INTO  lFoundRec
    FROM  DeineTable
    -- Diese Kombi von Werte darf nur einen DS finden
    -- Ansonsten wirst du einen ORA-01422 (too_many_rows) ernten ;)
    WHERE Name    = :i_Name and
           WERT    = :i_WERT and
           EditUser = :i_User and
           EditDate = :i_Date;
  Exception
    When NO_DATA_FOUND then
      -- Wird nichts gefunden -> INSERT
      lFoundRec := 0;
  end;

  if lFoundRec = 0 then
    INSERT INTO DeineTabelle
      (Name
      ,WERT
      ,EditUser
      ,EditDate)
    VALUES
      (:i_Name
      ,:i_WERT
      ,:i_User
      ,:i_Date);
  end if;
end;

Hawkeye 6. Aug 2004 19:10

Re: Problem: Oracle+Delphi und Währungs- und Datumsfelder
 
Zitat:

Zitat von Robert_G
Zitat:

Zitat von Hawkeye
Ausserdem würde ich gerne wissen warum "meine" Query den Fehler produziert sobald das Datum ins Spiel kommt (hab ich oben gepostet).

  • 1. "DATE" hat als DatenType Vorrang vor Variablen-/Spalten-/Tabellennamen -> boom.
    Du solltest also deine Spalten Date & User sofort umbenennen!
    Das sind reservierte Keywords, die dir anscheinend durch einen Bug in Ora7 nicht sofort um die Ohren gehauen wurden. (Darauf hatte ich vorhwer nicht geachtet. :oops:


  • Danke, das könnte natürlich gut möglich sein.

    Zitat:

  • 2. Setze am Besten ein Leerzeichen zwischen "=" und ":Value", es ist möglich, dass die DB den Parameter nicht erkennt.

Hmm, probier ich auch, auch wenn ich das nicht glaub, da es bisher auch so ging...



Zitat:

Zitat von Hawkeye
Geht das Ganze auch ohne den Primärkey ?

Auch wenn es irgendwie komisch ist, hier: (DBAs ohne PK kommen nicht in den Himmel :angel: )
SQL-Code:
declare
  lFoundRec Integer;
begin
  begin
    SELECT 1
    INTO  lFoundRec
    FROM  DeineTable
    -- Diese Kombi von Werte darf nur einen DS finden
    -- Ansonsten wirst du einen ORA-01422 (too_many_rows) ernten ;)
    WHERE Name    = :i_Name and
           WERT    = :i_WERT and
           EditUser = :i_User and
           EditDate = :i_Date;
  Exception
    When NO_DATA_FOUND then
      -- Wird nichts gefunden -> INSERT
      lFoundRec := 0;
  end;

  if lFoundRec = 0 then
    INSERT INTO DeineTabelle
      (Name
      ,WERT
      ,EditUser
      ,EditDate)
    VALUES
      (:i_Name
      ,:i_WERT
      ,:i_User
      ,:i_Date);
  end if;
end;
[/quote]

Danke, probier ich am Montag 8:00 gleich aus ! :-)

MfG

Union 6. Aug 2004 21:03

Re: Problem: Oracle+Delphi und Währungs- und Datumsfelder
 
Zitat:

Zitat von Robert_G
Ausserdem würde ich gerne wissen warum "meine" Query den Fehler produziert sobald das Datum ins Spiel kommt (hab ich oben gepostet).
1. "DATE" hat als DatenType Vorrang vor Variablen-/Spalten-/Tabellennamen -> boom.
Du solltest also deine Spalten Date & User sofort umbenennen!
Das sind reservierte Keywords, die dir anscheinend durch einen Bug in Ora7 nicht sofort um die Ohren gehauen wurden. (Darauf hatte ich vorhwer nicht geachtet.

Er hat bei USER recht:
Code:
USER returns the name of the session user (the user who logged on) with the datatype VARCHAR2. Oracle compares values of this function with blank-padded comparison semantics.

In a distributed SQL statement, the UID and USER functions identify the user on your local database. You cannot use these functions in the condition of a CHECK constraint.

Example
The following example returns the current user and the user's UID:

SELECT USER, UID FROM DUAL;
 
USER                                 UID
------------------------------ ----------
OE                                    33
aber Date kannst Du als Feldnamen verwenden. Solltest Du aber trotzdem nicht ;). Auszug aus den Oracle Beispielen:
Code:
For example, you can define a relational table to keep track of your contacts:

CREATE TABLE contacts (
  contact    external_person
  date       DATE );


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