AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi brauche hilfe beim loeschen eines datensatzes
Thema durchsuchen
Ansicht
Themen-Optionen

brauche hilfe beim loeschen eines datensatzes

Ein Thema von Grumble · begonnen am 19. Mär 2003 · letzter Beitrag vom 20. Mär 2003
 
Benutzerbild von harrybo
harrybo

Registriert seit: 26. Nov 2002
Ort: Aachen
87 Beiträge
 
Delphi 6 Enterprise
 
#9
  Alt 19. Mär 2003, 21:05
Hallo Grumble,

Der Code, den Du da zu bearbeiten hast, bedarf einer Generalüberholung. Ich glaube, Du hast keinen leichten Job, wenn der Rest des Programms von ähnlicher Qualität ist. Ich gehe mal durch:

1. ob eine Verbindung zur Datenbank existiert, sollte auf der Ebene "Löschen" nicht gecheckt werden, das sollte weiter oben passieren, und Buttons entsprechend aktiviert, bzw, deaktiviert werden.

2. Eine Transaktion einfach starten ist dagegen unsicher. Es sollte also zunächst geprüft werden, ob die Transaktion bereits läuft.

3. Zur Verbesserung der Übersicht und zur Erleichterung des Debuggens kann man die ID, nach der gesucht werden soll, in eine lokale Variable einlesen.

4. Um Programmablauffehler zu vermeiden, ist es besser, bei Parametern (und auch bei Feldnamen über FieldByName) mit der entsprechenden Umformung (z.B. AsInteger, AsString etc.) zu arbeiten als mit "Value", also: ParamByName('ID').AsInteger.

5. Das Löschen eines Datensatzes mit einer bestimmten ID lässt sich wesentlich schneller über SQL realisieren, wenn nicht bereits der Cursor einer geöffneten Datensatzmenge direkt darauf steht (das ist bei Dir anscheinend nicht der Fall). Man könnte zum Beispiel eine eigene Routine schreiben, die einen SQL Befehl ausführt:
Delphi-Quellcode:
procedure TDM.ExecIBSQL(ASQL: String);
begin
  with IBSQL1 do try
    if not Transaction.InTransaction then Transaction.StartTransaction
    else if Open then Close;
    SQL.Clear;
    SQL.Add(ASQL);
    ExecQuery;
    Transaction.Commit;
  except
    Transaction.Rollback;
  end;
end;
IBSQL1 ist dabei eine TIBSQL Komponente, deren Transaktion die selbe ist, mit der auch die genutzte Datenmenge arbeitet. Die Löschen Routine sähe dann so aus:
Delphi-Quellcode:
procedure DeleteDataset;
var
  vID : longint;
  vSQL : string;
begin
  vID := Option[ListBoxOptions.ItemIndex].ID;
  vSQL := 'DELETE FROM <Tabelle> WHERE <Feldname>=' + IntToStr(vID);
  ExecIBSQL(vSQL);
end;
<Tabelle> ist dabei Dein Tabellenname, <Feldname> der Feldname, der Deine ID enthält. Ach ja: falls Du doch datensensitive Komponenten auf der aktuellen Form hast, deren Datenmengen auf oben genannter Transaktion stehen, sind diese nach dem Löschen natürlich leer, da die Transaktion mit Commit geschlossen wurde. Die entsprechenden Datenmengen musst Du dann neu öffnen. Alternativ kann für IBSQL1 auch eine eigene Transaktion definiert werden, die angezeigten Datenmengen bleiben dann bestehen, bekommen aber von dem Löschvorgang erst nach dem nächsten Commit bzw. Rollback etwas mit.

Ich hoffe, das hilft Dir weiter

gruß, harrybo
Harry Boldt
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz