![]() |
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:
ich weiss aber nicht wo der Fehler ist. :wall:
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 PS.: Das Statement steht so in der SQL-Property eines Query-Objekts drin. |
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.
|
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:
|
Re: Fehler im SQL-Statement...aber wo?
Zitat:
ohne '.' vlt is es das vlt verträgt er den punkt nicht ???? |
Re: Fehler im SQL-Statement...aber wo?
Zitat:
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:
Das Feld K.NAME könnte ein reserviertes Wort sein.
Query1.SQL.SaveToFile('C:\SQL.txt'); // in Datei speichern
Query1.Open; Deshalb würde ich probeweise statt K.NAME z.B. K.ORT hinschreiben. |
Re: Fehler im SQL-Statement...aber wo?
Zitat:
|
Re: Fehler im SQL-Statement...aber wo?
Also zunächst wird Folgende Prozedure aufgerufen:
Delphi-Quellcode:
LoadFromDataSet sieht so aus:
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;
Delphi-Quellcode:
hoffe das hilft weiter
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; PS.: Das SQL-Statement ist direkt in der TQuery Komponete eingetragen (Also nicht mit 'Add()') |
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 |
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]); |
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 20:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz