Entwickler-Ecke

Datenbanken - SQL-Text aus Textdatei (mit Variablen)


peppi - Do 26.08.04 12:11
Titel: SQL-Text aus Textdatei (mit Variablen)
Hallo,

hab ein kleines Problem mit meiner SQL Abfrage.

Benutze Delphi 7 und muß ein Programm, welches mit Delphi 4 geschrieben wurde, wieder nutzbar machen :wink:

Habe nun mehrere Abfragen in mehreren textdateien gespeicher und lade diese dann mit loadfromfile. Hier einmal ein Beispiel:

datei: query1.sql


Quelltext
1:
2:
3:
4:
select * from tabelle
where feld1 = ' + QuotedStr(DBText1.Field.Text + '%')'
and feld2 like 'QuotedStr(Edit2.Text + '%')'
order by feld1, feld2


im delphi-code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Edit1Enter(Sender: TObject);
begin
with query1 do
sql.clear;
sql.LoadFromFile('C.\....');
Open;
end;
end;


Nun bekomme ich immer die Fehlermeldung:

Allgemeiner SQL-Fehler. Ungültiger Operator für Datentyp MODULO Typ VARCHAR.

Liegt sicher am Prozentzeichen. Aber liegt das an meiner falschen Abfrage oder kann man sowas nicht aus einer Textdatei auslesen??

Puhm, hoffe das war einigermaßen verständlich und mir kann hier jemand helfen :(

Moderiert von user profile iconKlabautermann: Code durch Delphi-Tags ersetzt.


MrCoder - Do 26.08.04 12:40

Moin,

Dein Fehler ist offensichtlich und ziemlich dumm (sorry ist so).
So wies aussieht hast du einfach Delphi-Code in eine SQL-Datei getan.
Wie soll das auch funktionieren? (SQL denkt es wäre SQL-Code)

Ich würds so machen:



SQL-Datei
1:
2:
3:
4:
select * from tabelle  
where feld1 = '%s'  
and feld2 like '%s'
order by feld1, feld2




Delphi-Code
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Edit1Enter(Sender: TObject);  
begin  
  with query1 do  
  begin
    sql.clear;  
    sql.LoadFromFile('C.\....');  
    sql.Text := Format(sql.Text,
      [QuotedStr(DBText1.Field.Text + '%'), QuotedStr(Edit2.Text + '%')]);
    Open;  
  end;  
end;


Viel Spass beim Coden! :D

MfG,
MrCoder

Moderiert von user profile iconKlabautermann: Code durch Delphi-Tags ersetzt.


peppi - Do 26.08.04 14:11
Titel: Haut nich hin ...
Hey MrCoder,

hab's jetzt mal so versucht wie du geschrieben hast, aber das haut nicht hin. Bekomme den selben fehler wieder (Ungültiger Operator für Datentyp MODULO) :evil:

Hab's jetzt so abgeschrieben wie's bei dir stand. Muß ja immernoch an diesem %-zeichen liegen. Irgend ne Idee??

P.S.: Als DUMM würd ich mich nicht unbedingt bezeichnen, hat doch jeder mal angefangen oder?? :wink:


grayfox - Do 26.08.04 23:34

seas peppi! ;)

versuch es mal so:


Delphi-Quelltext
1:
2:
3:
SELECT * FROM Tabelle  
WHERE (Feld1 LIKE "%s") AND (Feld2 LIKE "%s") 
ORDER BY Feld1



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TMainDlg.Abfrage1Click(Sender: TObject);
var
  aFilename: TFileName;
begin
  aFilename:= aDatenDir + '\SQLText.TXT';
  Label3.Caption:= aFilename;
  Label3.Update;

  with Query1 do begin
    SQL.clear;
    SQL.LoadFromFile(aFilename);
    SQL.Text:= Format(SQL.Text,[Edit1.Text,Edit2.Text]);
    SQL.SaveToFile(aDatenDir + '\Abfrage.txt');
    Open
  end;
end;


hängen die DBEdit-felder in deinem beispiel an der gleichen datasource wie deine query?
falls ja, dann verwende Edit-felder, sonst kann es zu problemem kommen.

du könntest mir noch erklären, wo der vorteil bei deinem vorgehen liegt - ich konnte darin keinen sehen. Da du die parameter ohnehin erst zur laufzeit übergibst, kannst auch gleich den ganzen SQL-string erzeugen, oder hab ich dabei etwas wesentliches übersehen? user defined image

mfg, stefan


peppi - Di 31.08.04 11:23

Hey Stefan,

also ich hab jetzt noch eine Kleinigkeit verändert:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
with Query1 do begin
SQL.clear;
SQL.LoadFromFile(aFilename);
SQL.Text:= Format(SQL.Text,[Edit1.Text +'%', Edit2.Text +'%']);
SQL.SaveToFile(aDatenDir + '\Abfrage.txt');
Open
end;


Die Prozentzeichen am Ende waren noch wichtig für's "like". Bin ich durch deinen Tipp mit "SaveToFile" gekommen :D

Was ich damit erreichen will: es handelt sich hierbei um ein Suchformular (nach verschiedenen Nummern) und mit jeder weiteren eingebene Nummer werden die Datensätze weiter eingeschränkt. Die Abfrage hab ich in meinem Script allerdings mehrmals enthalten (habe noch einige weitere Suchkriterien). Wenn sich an der Abfrage was ändert muss ich aufpassen das ich auch alle Abfragen im Skript ändere. Daher ist es besser, sie nur einmal in einer Datei zu halten. Mein Skript ist ohnehin noch nicht wirklich optimal aber für den Anfang reicht's.

Dank dir auf alle Fälle für deine Hilfe, läuft jetzt super :wink:

Bis dann, Jana!!