Autor Beitrag
D. Annies
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Fr 29.07.11 16:42 
Hi, Delpher,

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

ausblenden volle Höhe 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:

ausblenden volle Höhe 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:
ausblenden 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

_________________
ut vires desint, tamen est laudanda voluntas
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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:
ausblenden 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;

_________________
ut vires desint, tamen est laudanda voluntas
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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?

Für diesen Beitrag haben gedankt: D. Annies
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Sa 30.07.11 06:01 
Nun, es fehlten diese beiden Zeilen:


ausblenden 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

_________________
ut vires desint, tamen est laudanda voluntas