Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Fehler im SQL-Statement...aber wo? (https://www.delphipraxis.net/50407-fehler-im-sql-statement-aber-wo.html)

Silbar 25. Jul 2005 11:15

Datenbank: Oracle • Version: 8 • Zugriff über: BDE

Fehler im SQL-Statement...aber wo?
 
Hallo Leute, :hi:
ich habe hier ein SQL-Statement bei dem mir Delphi sagt das es nicht richtig beendet ist. :(

Delphi-Quellcode:
SELECT Q.*, K.NAME
FROM QUICKCLC Q
     LEFT OUTER JOIN KUNDEN K ON(Q.KDNR = K.KDNR)
WHERE Q.DATUM >= :VOM AND
      Q.DATUM <= :BIS
ich weiss aber nicht wo der Fehler ist. :wall:

PS.: Das Statement steht so in der SQL-Property eines Query-Objekts drin.

Jelly 25. Jul 2005 11:17

Re: Fehler im SQL-Statement...aber wo?
 
:VOM und :BIS sind Parameter, die du noch mit Werten füllen musst, bevor du die Query ausführen kannst. Kuck dir dazu mal die Eigenschaft Params deiner Query an.

Silbar 25. Jul 2005 11:27

Re: Fehler im SQL-Statement...aber wo?
 
Das sind Parameter vom DataType = ftDateTime. Standartmässig haben die kein Value werden aber definitiv 'gefüllt' bevor die Query aktivert wird. Das Problem ist wie gesagt das ich die Meldung bekomme:
Zitat:

General SQL error
ORA-00933: SQL-Befehl wurde nicht korrekt beendet
PS.:Auch wenn ich die Parameter von vornherein fülle kommt der Fehler :|

cell 25. Jul 2005 12:26

Re: Fehler im SQL-Statement...aber wo?
 
Zitat:

SELECT Q.*, K.NAME
FROM QUICKCLC Q
LEFT OUTER JOIN KUNDEN K ON(Q.KDNR = K.KDNR)
WHERE Q.DATUM >= :VOM AND
Q.DATUM <= :BIS
normalerweise heißt es doch SELECT * FROM ....
ohne '.' vlt is es das
vlt verträgt er den punkt nicht ????

shmia 25. Jul 2005 12:34

Re: Fehler im SQL-Statement...aber wo?
 
Zitat:

Zitat von Silbar
ich habe hier ein SQL-Statement bei dem mir Delphi sagt das es nicht richtig beendet ist. :(
PS.: Das Statement steht so in der SQL-Property eines Query-Objekts drin.

Dein SQL-Statement ist syntaktisch korrekt, aber vielleicht hast du den "menschlichen Faktor" übersehen.
Du denkst zwar, es stünde dein SQL-Statement drin, in Wirklichkeit steht das aber etwas andereres.
(Häufiger Fehler: es wird immer nur mit SQL.Add() gearbeitet ohne jemals SQL.Clear aufgerufen zu haben)
Du musst dir selbst beweisen, dass das Richtige drinsteht.
Delphi-Quellcode:
Query1.SQL.SaveToFile('C:\SQL.txt'); // in Datei speichern
Query1.Open;
Das Feld K.NAME könnte ein reserviertes Wort sein.
Deshalb würde ich probeweise statt K.NAME z.B. K.ORT hinschreiben.

r_kerber 25. Jul 2005 12:56

Re: Fehler im SQL-Statement...aber wo?
 
Zitat:

Zitat von Silbar
ich habe hier ein SQL-Statement bei dem mir Delphi sagt das es nicht richtig beendet ist.

Delphi kann zu einem SQL-Statement eigentlich überhaupt nichts sagen. Diese Fehlermeldungen kommen vom DB-Server und werden durch Dein Programm nur angezeigt. Teile doch mal den kompletten Fehlertext mit.

Silbar 25. Jul 2005 13:28

Re: Fehler im SQL-Statement...aber wo?
 
Also zunächst wird Folgende Prozedure aufgerufen:
Delphi-Quellcode:
procedure TQrySchnellkalkulationen.AktualisierenExecute(Sender: TObject);
var
   vom, bis: TDateTime;
begin
   try
      vom := StrToDate( Edit_Vom.Text );
   except
      On E: Exception do begin
         TryErrorBox(E.Message,'Ungültiges Startdatum');
         Edit_Vom.SetFocus;
         Exit;
      end;
   end;

   try
      bis := StrToDate( Edit_Bis.Text );
   except
      On E: Exception do begin
         TryErrorBox(E.Message,'Ungültiges Enddatum');
         Edit_Bis.SetFocus;
         Exit;
      end;
   end;

   Query.ParamByName('VOM').AsDate := vom;
   Query.ParamByName('BIS').AsDate := bis;

   LoadFromDataSet(ClientDataSet,Query,'DATUM');
   Calculate;
end;
LoadFromDataSet sieht so aus:
Delphi-Quellcode:
procedure LoadFromDataSet( Destination: TClientDataSet; Source: TDataSet; InitialSort: String = ''; CheckNotNull: String = '' );
var
   fieldNo, indexNo: Integer;
   field: TField;
   fieldName: String;
   CopyData: Boolean;
begin
   with Destination do begin
      Screen.Cursor := crHourGlass;
      DisableControls;

      //-- Vorhandene Indexes löschen --//
      if ( FieldDefs.Count > 0 ) then begin
         IndexDefs.Update;
         Close;
         Open;
         while( IndexDefs.Count > 2 ) do begin
            try
               DeleteIndex(IndexDefs.Items[2].Name);
            except
               Break;
            end;
            IndexDefs.Update;
         end;
      end;

      //-------------------------------------//
      //-- Struktur des DataSet übernehmen --//
      //-------------------------------------//
      Close;
      try
         Source.Open;
      except
      end;
      if ( Source.FieldDefs.Count < 1 ) then
         raise Exception.Create('Fehler beim öffnen der Abfrage.');

      //-- Clientdataset erstellen --//   
      FieldDefs.Assign(Source.FieldDefs);
      CreateDataSet;

      //-- Währungsfelder setzen --//
      for fieldNo := 0 to Fields.Count - 1 do begin
         field := Fields[fieldNo];
         if ( field is TFloatField ) then begin
            fieldName := field.FieldName;
            if ( Copy(fieldName,Length(fieldName)-3,4) = '_EUR' ) then begin
               (FieldByName(fieldName) as TFloatField).Currency := True;
               System.Delete(fieldName,Length(fieldName)-3,4);
               (FieldByName(fieldName) as TFloatField).Currency := True;
            end;
         end;
      end;

      CopyData := True;

      //-- Alle Datensätze kopieren --//
      if ( CheckNotNull <> '' ) then
         CopyData := not Source.FieldByName(CheckNotNull).IsNull;

      if ( CopyData ) then begin
         while ( not Source.Eof ) do begin

            //-- Datensatz anlegen und alle Felder kopieren --//
            Append;
            for fieldNo := 0 to Fields.Count - 1 do
               Fields[fieldNo].Value := Source.Fields[fieldNo].Value;
            Post;

            Source.Next;
         end;

         //-- Einen Index anlegen --//
         if ( (InitialSort <> '') and (not (Bof and Eof)) ) then begin
            AddIndex('IDX_'+InitialSort,InitialSort,[]);
            IndexName := 'IDX_'+InitialSort;
         end;
      end;
      Source.Close;

      First;
      EnableControls;
      Screen.Cursor := crDefault;
   end;
end;
hoffe das hilft weiter
PS.: Das SQL-Statement ist direkt in der TQuery Komponete eingetragen (Also nicht mit 'Add()')

marabu 25. Jul 2005 13:52

Re: Fehler im SQL-Statement...aber wo?
 
Laut Oracle bedeutet Fehler 00933, dass die terminierende Klausel deines SQL-Statements unzulässig ist. Das wäre bei dir die WHERE Klausel...

Grüße vom marabu

Tyrael Y. 25. Jul 2005 13:58

Re: Fehler im SQL-Statement...aber wo?
 
Delphi-Quellcode:
 

LQuery.SQL.Add(Format('SELECT Q.*, K.NAME
                FROM QUICKCLC Q
                LEFT OUTER JOIN KUNDEN K ON(Q.KDNR = K.KDNR)
                WHERE Q.DATUM >= ''%s'' AND
                Q.DATUM <= ''%s''', [:VOM, :BIS]);

Silbar 25. Jul 2005 14:17

Re: Fehler im SQL-Statement...aber wo?
 
Okay Leute vorne Weg: Es war eindeutig mein Fehler :oops:

Das Programm an dem ich arbeite soll unteranderem mit Paradox(lokale DB) sowie Oracle (auf einem Server liegende DB) funktionieren. Hab am Anfang der Unit die Abfragen vertauscht und somit versucht die Paradox spezifischen Aspekt bei Oracle zu verwenden und umgekehrt. :wall:

Ein weiteres Beispiel für die Macht des NOT :wall: :oops: :wall: :oops:

Danke das ihr euch trotzdem die Mühe gemacht habt und versucht habt mir zu helfen :thumb: (ob das aber manchmal bei mir noch möglich ist wage ich gerade ernsthaft zu bezweifeln :pale: :mrgreen: )


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