Autor Beitrag
LuckyStrike4life
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 196

Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
BeitragVerfasst: Do 11.12.03 11:38 
Morgen,
schaut nun so aus,
die Ausgabe eine Datenbank ist immer im Form zu sehen, als DBGrid.

Nun kann der Anwender sich einen Datensatz aussuchen und diesen z.B. löschen. Das ging bisher immer mit
ausblenden Delphi-Quelltext
1:
tabellenname.delete;					

sehr gut. Es wurde dann der ausgewählte Datensatz gelöscht.
Nun, da ja der Grid eine geordnete Tabelle ausgiebt, nach Datum (ihr erinnert euch), funktioniert das nicht mehr.
Wenn ich jetzt einen Datensatz auswähle und auf löschen klicke, wird ein Datensatz gelöscht, aber nicht der - den ich wollte. Vermutlich gehts nach der Struktur der Datenbank.

Um ein Datensatz weiter, bzw. zurück zu springen hat es gereicht den Code so anzupassen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
//alt:
tabellenname.next;
//neu:
Querysort.next;
Das funktioniert. Ich verweise nun also auf den Query, auf den der Grid auch liegt.
Nun bringt es aber nichts
Querysort.delete; zu schreiben. Auf die Funktion kann aber nicht verzichtet werden, was könnte man da machen?

_________________
... ich kann doch nichts ...
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 11.12.03 13:01 
Hallo,

du könntest das z.B. mit einem eigenen lösch Query machen.

Nimm einfach ein zweites Query Objekt, beispielsweise q_delete.

Jetzt musst du diesem erzählen, das es den aktuellen Datensatz des Sort Querys löschen soll.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  q_Delete.SQL.Clear;
  q_Delete.SQL.Add('DELETE FROM tabellenname WHERE ID=:Id');
  q_Delete.ParamByName('Id').AsInteger := querysort.FieldByName('Id').AsInteger;
  q_Delete.ExecSQL; // Wichtig, hier kein Open
  querySort.Refresh; // Anzeige aktualisieren.


alternativ kannst du auch die selektierte Zeile über das Tabellenobjekt suchen (Locate oder Filter) und dann bei diesem wieder Delete aufrufen.

Gruß
Klabautermann


Zuletzt bearbeitet von Klabautermann am Do 11.12.03 16:44, insgesamt 1-mal bearbeitet
LuckyStrike4life Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 196

Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
BeitragVerfasst: Do 11.12.03 14:38 
Danke,
allerdings mag der Code so noch nicht ganz.
Wofür steht "ID" in deinem Code? Ich muss auf eine dBase Datenbank zugreifen, die Einträge werden zwar nummeriert, aber die Spalte läßt sich nicht abgreifen. Wie könnte ich das Problem umgehen?

_________________
... ich kann doch nichts ...
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 11.12.03 16:43 
Hallo,

ID war ein Beispiel. Es sollte möglich sein, jeden Datensatz einzeln zu identifizieren. Häufig wird dies durch ein ID Feld (kundennummer oder was auch immer) gemacht.
Du musst dir nun überlegen wie der gewählte Datensatz eindeuttig identifiziert werden kann und den WHERE Teil des Querys entsprechend anpassen.

Gruß
Klabautermann
LuckyStrike4life Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 196

Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
BeitragVerfasst: Do 11.12.03 17:19 
Okay,
die Spalte in der dBase immer eine laufende Zahl einträgt, hat den Namen der DB.
In meinem Fall, mainDB.

Soweit alles klar,
wenn ich nun für 'ID' 'mainDB' einsetze, kompiliere und den Button presse, dann bekomme ich eine Fehlermeldung:
Zitat:
Im Projek soundso.exe ist ein Exception der Klasse EDatabaseError aufgetreten. Meldung: 'Querysort: Das Feld 'MainDB' wurde nicht gefunden'. Prozeß wurde angehalten [...]

Der Query an sich hat ja auch keine Felder, kann das Feld MainDB also gar nicht beinhalten. Oder sollte automatisch auf die DB geschaut werden, auf die der Query verweißt?
Ansonsten
  q_Delete.ParamByName('MainDB').AsInteger := querysort.FieldByName('MainDB').AsInteger; muss hier was anderes geschrieben stehen als: querysort.FieldByName('MainDB'), oder?

_________________
... ich kann doch nichts ...
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 11.12.03 17:42 
Hallo,

stellen wir das ganze mal auf Maindb um:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  q_Delete.SQL.Clear; 
  q_Delete.SQL.Add('DELETE FROM mainDB WHERE MainDB=:Id'); 
  q_Delete.ParamByName('Id').AsInteger := querysort.FieldByName('mainDb').AsInteger; 
  q_Delete.ExecSQL; // Wichtig, hier kein Open 
  querySort.Refresh; // Anzeige aktualisieren.

Der Parametername :ID ist frei wählbar und könnte auch Otto heißen, daher müssen wir ihn hier nicht anpassen. Da wenn ich dich richtig verstehe auch die Tabelle mainDB heißt konnte ich den namen auch einsetzen. Das Delete Query muss natürlich in die Tabelle gucken um sicher zu stellen was es löscht. Die Where Klausel gibt an welche zeilen zu löscht, lässt du WHERE weg müsst die komplette Tabelle geleert werden.
Wichtig für das Funktionieren ist das querySort auch MaindDB enhällt, indem du z.B. SELECT * drin verwendet hast.

Gruß
Klabautermann
LuckyStrike4life Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 196

Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
BeitragVerfasst: Fr 12.12.03 11:24 
Danke dir,
ich bekomme immer noch die Meldung das der querysort nicht das Feld MainDB beinhaltet.
Eine Selectanweisung für die Datenbank besteht bereits im Code, mit dem querysort. Allerdings wird SQL ja wieder gelöscht, bevor der neue SQL Code ausgeführt wird.
Ich glaub da liegt das Problem, kann ich in den querysort nochmals die Datenbank MainDB reinladen?

_________________
... ich kann doch nichts ...
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 12.12.03 12:55 
Hallo,

wenn du den Inhalt des Querys in einem DBGrid dastellst, dann ist er auch noch vorhanden. Solange du also nicht querysort.close aufrufst, kannst du die Daten auch nutzen.

Wie sieht denn das Query von querysort aus? Selektierst du das Feld überhaupt?

Gruß
Klabautermann
LuckyStrike4life Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 196

Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
BeitragVerfasst: Fr 12.12.03 13:13 
Ja,
ausblenden Delphi-Quelltext
1:
Querysort.SQL.Add('select * from "t:eDienstreisebuch\mainDB.dbf" ORDER BY DATUM');					

Alle Felder werden selectiert.
Vielleicht versuch ich mal n anderes Feld, eventuell läßt dBase den Zugriff auf die bestimmte Spalte nicht zu.

_________________
... ich kann doch nichts ...