Autor |
Beitrag |
D. Annies
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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:
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 * 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); tntstringgrid1.Hint := fname; end else showmessage('keine Daten für diese Abfrage vorhanden'); qSchuelerSort(self); except 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:
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 * 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); tntstringgrid1.Hint := fname; end else showmessage('keine Daten für diese Abfrage vorhanden'); qSchuelerSort(self); qLksort(self); except showmessage('mindestens ein Feld ist nicht in der Tabelle vorhanden oder ...'); end end else showmessage('SQL Personen abgebrochen'); form5.Hide; end; |
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
_________________ ut vires desint, tamen est laudanda voluntas
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 29.07.11 19:43
Naja, das solltest du mit dem Debugger doch eigentlich ziemlich schnell finden können, oder?
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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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; |
_________________ ut vires desint, tamen est laudanda voluntas
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 29.07.11 22:11
D. Annies hat folgendes geschrieben : | 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 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: 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
_________________ ut vires desint, tamen est laudanda voluntas
|
|
|