Entwickler-Ecke

Datenbanken - Fehler in Proc ..


D. Annies - Fr 29.07.11 16:42
Titel: Fehler in Proc ..
Hi, Delpher,

ich hatte bisher zwei sehr ähnliche Procs für Lehrer und Schüler, hier die SchülerProc:


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:
procedure TBuchMain.SQLeingeben1Click(Sender: TObject);
begin
  if SQL_Wunsch = '' then
    InputString :=
    //format('select IDENT_NR, NAME, VORNAME, KLASSE, FSPRACHE1, FSPRACHE2, '+
    //       ' WPK1NAME, WPK2NAME, WPK3NAME, WPK4NAME, GESCHLECHT, GEBDAT, TELEFON from "%s" S '+
    //       ' order by NAME, VORNAME, KLASSE', [TbSchueler.tablename])
      format ('select * from "%s" order by NAME, VORNAME, KLASSE', [TbSchueler.tablename])
  else Inputstring := SQL_Wunsch;
  ClickedOK := InputQuery('SQL-Eingabedialog''Eingabe:', Inputstring);
  If ClickedOK then
  begin
    QSchueler.Close;
    Tb_muster(self);
    QSchueler.SQL.Text := inputstring;
    if pos(':Aktklasse', inputstring) > 0 then
    begin
      QSchueler.Params[0].DataType := ftString;
      QSchueler.ParamByName('AktKlasse').AsString := listbox1.items[listbox1.itemindex];
    end;
    showmessage(inputstring);
    try
      QSchueler.Open;
      if QSchueler.RecordCount > 0 then
      begin
        fname := concat(label30.caption, 'OUTXLS\SQL_Schüler.xls');
        TeilMengenausgabeSG(QSchueler);  //   abelleverbergen1Click(Self);
        tntstringgrid1.Hint := fname;
      end
      else showmessage('keine Daten für diese Abfrage vorhanden');
      qSchuelerSort(self);
    except   //on EDbengineError do raise;   //on EDatabaseError do abort
      showmessage('mindestens ein Feld ist nicht in der Tabelle vorhanden oder ...');
    end
  end
  else showmessage('SQL Personen abgebrochen');
  form5.Hide;
end;


Nun dachte ich, beide zusammenzufassen inn der folgenden Proc:


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:
procedure TBuchMain.SQL_Personen(T_x: TTable);
begin
  if SQL_Wunsch = '' then
    InputString :=
    //format('select IDENT_NR, NAME, VORNAME, KLASSE, FSPRACHE1, FSPRACHE2, '+
    //       ' WPK1NAME, WPK2NAME, WPK3NAME, WPK4NAME, GESCHLECHT, GEBDAT, TELEFON from "%s" S '+
    //       ' order by NAME, VORNAME, KLASSE', [TbSchueler.tablename])
      format ('select * from "%s" order by NAME, VORNAME, KLASSE', [T_x.tablename])
  else Inputstring := SQL_Wunsch;
  ClickedOK := InputQuery('SQL-Eingabedialog''Eingabe:', Inputstring);
  If ClickedOK then
  begin
    Qsl.Close;
    Tb_muster(self);
    Qsl.SQL.Text := inputstring;
    if pos(':Aktklasse', inputstring) > 0 then
    begin
      Qsl.Params[0].DataType := ftString;
      Qsl.ParamByName('AktKlasse').AsString := listbox1.items[listbox1.itemindex];
    end;
    showmessage(inputstring);
    try
      Qsl.Open;
      if Qsl.RecordCount > 0 then
      begin
        fname := concat(label30.caption, 'OUTXLS\SQL_Personen.xls');
        TeilMengenausgabeSG(Qsl);  //   abelleverbergen1Click(Self);
        tntstringgrid1.Hint := fname;
      end
      else showmessage('keine Daten für diese Abfrage vorhanden');
      qSchuelerSort(self); qLksort(self);
    except   //on EDbengineError do raise;   //on EDatabaseError do abort
      showmessage('mindestens ein Feld ist nicht in der Tabelle vorhanden oder ...');
    end
  end
  else showmessage('SQL Personen abgebrochen');
  form5.Hide;
end;
//Qsl ist in form1 (BuchMain) deklariert


Der Aufruf in form5 ist:

Delphi-Quelltext
1:
2:
if BuchMain.DBGrid1.Visible then BuchMain.SQL_Personen(BuchMain.TbSchueler); 
if BuchMain.DBGrid6.Visible then BuchMain.SQL_Personen(BuchMain.TbLK);



Es wird auch klaglos kompiliert, aber zur Laufzeit gibt es einen Error bei Adresse 00000000
Was mache ich falsch, wer kann da helfen?

Vielen Dank, Detlef


jaenicke - Fr 29.07.11 19:43

Naja, das solltest du mit dem Debugger doch eigentlich ziemlich schnell finden können, oder? :gruebel:

Mit schrittweise durchgehen findest du die Zeile und wenn du dann beim nächsten Versuch in dieser Zeile ankommst, kannst du ja schauen was da nil ist...


D. Annies - Fr 29.07.11 20:49

Danke, Sebastian,

nun, es lag [erstmal] in der Proc Tb_Muster(), weil die Tabelle wohl nicht gefunden wurde = NIL.
Jetzt habe ich den Fehler: Format '%p' ungültig oder nicht kompatibel mit Argument.

Kannst du da auch noch einmal helfen?

Detlef

PS:
Der Code von TbMuster:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TBuchMain.Tb_muster(sender: Tobject);
begin
  if pos('"%s" L', inputstring) > 0 then
  inputstring := stringreplace(inputstring, '"%s" L''"'+ BuchMain.TbLK.tablename+ '" L', []);
  if pos('"%s" S', inputstring) > 0 then
  inputstring := stringreplace(inputstring, '"%s" S''"'+ BuchMain.TbSchueler.tablename+ '" S', []);
  if pos('"%s" B', inputstring) > 0 then
  inputstring := stringreplace(inputstring, '"%s" B''"'+ BuchMain.TbArtikel.tablename+ '" B', []);
  if pos('"%s" A', inputstring) > 0 then
  inputstring := stringreplace(inputstring, '"%s" A''"'+ BuchMain.TbAusleihsatz.tablename+ '" A', []);
  if pos('"%s" U', inputstring) > 0 then
  inputstring := stringreplace(inputstring, '"%s" U''"'+ BuchMain.TbBuchstamm.tablename+ '" U', []);
  if pos('"%s" K', inputstring) > 0 then
  inputstring := stringreplace(inputstring, '"%s" K''"'+ BuchMain.TbLektstamm.tablename+ '" K', []);
end;


jaenicke - Fr 29.07.11 22:11

user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt habe ich den Fehler: Format '%p' ungültig oder nicht kompatibel mit Argument.
Naja, %p ist ja ein Pointer. Das heißt du musst an Format auch einen Pointer an der Stelle übergeben...

Hast du dich vielleicht verschrieben? Also %p statt %s?


D. Annies - Sa 30.07.11 06:01

Nun, es fehlten diese beiden Zeilen:



Delphi-Quelltext
1:
2:
  qSL := TQuery.create(self);
  qSL.Databasename  := listbox11.items[listbox11.itemindex];


sie müssen vor der eigentlichen Abfrage eingesetzt werden.
Gruß, Detlef