Entwickler-Ecke

Datenbanken - Syntaxfehler in From-Klausel


D. Annies - Mo 25.10.10 08:16
Titel: Syntaxfehler in From-Klausel
Hi, Delpher,
ich bekomme bei dem folgenden Code die obige Fehlermeldung.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TForm1.BtGesAuswertgClick(Sender: TObject);
begin
  //if form2.GroupBox1.Parent = form1  then form2.GroupBox1.Parent := form2;
  opendialog1.Filter := 'DBDateien (*.dbf)|merge*.dbf';
  if opendialog1.Execute then
  begin
    DaMod1.ADOTbMerge.Connection := DaMod1.ADOConnection1;
    DaMod1.ADOTbMerge.Close;
      DaMod1.ADOTbMerge.TableName := opendialog1.FileName;
    DaMod1.ADOTbMerge.Open;
    //q1sort(self);

    DaMod1.ADOQyKlaPers.close;
      DaMod1.ADOQyKlaPers.sql.text :=          // alle anderen 7, 8, 9, 10, DaZ
        format('select * from "%s" ', [DaMod1.ADOTbMerge.TableName]) +
        ' where not klasse like ''5%'' and not klasse like ''6%'' ' +
        'order by klasse, name, vorname';
    DaMod1.ADOQyKlaPers.open;
    showmessage('Schülerauswahl 78910DaZ ist getroffen');


    //Bestimme_Klassen_und_SAnzahlen(self);
    //fuelle_listbox1Kla(self);
    form2.Button1.Enabled := false;
    form2.Show;
  end;
end;

Es wird klaglos kompiliert, der Fehler ist zur Laufzeit.
Wer kann mir da heraushelfen?
Danke, Detlef


zuma - Mo 25.10.10 10:13

Schau dir deinen Code mal genauer an :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  DaMod1.ADOQyKlaPers.sql.text :=          // alle anderen 7, 8, 9, 10, DaZ
  format('select * from "%s" ', [DaMod1.ADOTbMerge.TableName]) +  // <<< Formatbefehl
         ' where not klasse like ''5%'' and not klasse like ''6%'' ' + // <<< KEIN Formatbefehl 
         'order by klasse, name, vorname';
  end;
end;


iKilledKenny - Mo 25.10.10 10:29

Ich denke es liegt an den doppelten Anführungszeichen (").


D. Annies - Mo 25.10.10 16:06

Hi,
nein leider nichts von beidem, habe eben noch einmal ca. 10 verschiedene andere
Versionen dieses Befehls ausprobiert - geht einfach nicht!
Danke für's Hingucken, aber was ist da los?
Gruß, Detlef


bummi - Mo 25.10.10 19:42

Hast Du Dir den erzeugten SQL mal anzeigen lassen?


D. Annies - Mo 25.10.10 22:10

Hi Bummi,
dieser Code funktioniert an einer anderen PrgStelle einwandfrei, das wundert mich ja so.
Gruß, Detlef


Xion - Mo 25.10.10 22:50

Enthält DaMod1.ADOTbMerge.TableName eventuell Leerzeichen?

Gib mal den SQL-Befehl an, wenn die Fehlermeldung kommt (also try, except ausenrum und SQL-String ausgeben lassen).

Wenn wir den SQL-String haben, der den Fehler verursacht, können wir bestimmt eher helfen.


D. Annies - Di 26.10.10 08:47

Jetzt Funktioniert es:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
procedure TForm1.BtGesAuswertgClick(Sender: TObject);
var StripFn : string;
begin
  //if form2.GroupBox1.Parent = form1  then form2.GroupBox1.Parent := form2;
  opendialog1.Filter := 'DBDateien (*.dbf)|merge*.dbf';
  if opendialog1.Execute then
  begin
    StripFn := extractfilename(opendialog1.FileName);
    delete(StripFn, length(stripfn)-34);
    DaMod1.ADOTbMerge.Connection := DaMod1.ADOConnection1;
    DaMod1.ADOTbMerge.Close;
      DaMod1.ADOTbMerge.TableName := stripfn;
    DaMod1.ADOTbMerge.Open;

  try
    showmessage(DaMod1.ADOTbMerge.TableName);
    DaMod1.ADOQyKlaPers.close;
      DaMod1.ADOQyKlaPers.sql.text :=          // alle anderen 7, 8, 9, 10, DaZ
        'select * from ' + DaMod1.ADOTbMerge.TableName +
        ' where not (klasse like ''5%'') and not (klasse like ''6%'') ' +
        ' order by klasse, name, vorname';
    DaMod1.ADOQyKlaPers.open;
    showmessage('Schülerauswahl 78910DaZ ist getroffen');
  except
    showmessage(DaMod1.ADOQyKlaPers.sql.text);
  end;
    form2.DBGrid1.DataSource := DaMod1.DataSource2;
    form2.DBGrid1.DataSource.DataSet := DaMod1.ADOTbMerge;   //   DaMod1.Datasource2;
    form2.DBGrid1.ReadOnly := true;
    form2.DBGrid1.PopupMenu := form2.PopupMenu1;
    form2.DBNavigator1.DataSource := form2.DBGrid1.DataSource;
    form2.DBNavigator1.VisibleButtons := [nbFirst,nbPrior,nbNext,nbLast];

    showmessage('form2.DBGrid1 hat Daten');

    //Bestimme_Klassen_und_SAnzahlen(self);
    //fuelle_listbox1Kla(self);
    form2.Button1.Enabled := false;
    form2.Show;
  end;
end;

Der Fehler lag also höher im Code.
Wahrscheinlich kann ich try .. except wieder rausnehmen.
LG, Detlef