![]() |
Datenbank: MyBase • Version: x • Zugriff über: x
MyBase: Datenlöschen
Moin,
entweder sehe ich den Wald vor lauter Bäumen nicht oder bin total auf dem Holzweg. Gebene ist folgender Code:
Code:
Der untere Teil funktioniert wie gewünscht, aber der obere Teil führt zur folgenden Fehlermeldung:
begin
BtDatensatzLoeschen.Caption:=IntToStr(ClientDataSet1.RecordCount); // Anzahl der Einträge in der Datenbank for I := 1 to ClientDataSet1.RecordCount do Begin If ClientDataSet1.Locate('Codenummer',lbledt1.text,[]) then // Datensatz finden begin ClientDataSet1.edit; // Datenbank zum Bearbeiten öffnen ClientDataSet1.delete; // Datensatz löschen ClientDataSet1.Post; // Datenbank aktualisieren end; End; end; procedure TForm1.BtStatusAendernClick(Sender: TObject); begin If ClientDataSet1.Locate('ID','3',[]) then // Datensatz finden if ClientDataSet1['Status'] ='0' then begin ClientDataSet1.edit; // Datenbank zum Bearbeiten öffnen ClientDataSet1['Status']:='1'; // Inhalt ändern ClientDataSet1.Post; // Datenbank aktualisieren end else begin ClientDataSet1.edit; // Datenbank zum Bearbeiten öffnen ClientDataSet1['Status']:='0'; // Inhalt ändern ClientDataSet1.Post; // Datenbank aktualisieren end; end; Zitat:
Code:
im Code.
ClientDataSet1.edit; // Datenbank zum Bearbeiten öffnen
Was mache ich falsch?? Gruß Heiko |
AW: MyBase: Datenlöschen
Benutze zukünftig den Debugger, damit du siehst, wo der Fehler passiert. Vielleicht wärest du dann selbst auf die richtige Idee gekommen.
Der Fehler dürfte durch dein "ClientDataSet1.Post" entstehen. Das ClientDataSet1.Edit ist völlig überflüssig. Du setzt damit den Datensatz, den du löschen willst in den Edit-Modus. Danach löscht du diesen dann. Ich wäre nicht mal auf die Idee gekommen, das so zu machen und hätte eher vermutet, dass dort eine Exception auftritt. Und für ClientDataSet1.Delete benötigst du kein ClientDataSet1.Post. Das Post ist nur für neue Datensätze oder Datensätze, die geändert werden. |
AW: MyBase: Datenlöschen
Hallo Jasocul,
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Danke. Gruß HEiko |
AW: MyBase: Datenlöschen
Ich verstehe nur nicht ganz, warum du für das Löschen eines Datensatzes in einer Schleife durch die ganze Datenmenge läufst? Dafür hast du doch Locate?
|
AW: MyBase: Datenlöschen
Moin,
Zitat:
Gruß HEiko |
AW: MyBase: Datenlöschen
Trotzdem kannst Du dich dann auf die Datensätze, die dem Suchmuster entsprechen, beschränken (Z.B. per Locate)
|
AW: MyBase: Datenlöschen
ok. Dann würde ich aber mit einer while Schleife arbeiten:
while ClientDataset1.Locate(...) do ClientDataset1.Delete oder so. Oder natürlich ein entsprechendes SQL-Statement absetzen (um alle entsprehcende Datensätze auf einmal zu löschen) und danach das ClientDataset aktualisieren. |
AW: MyBase: Datenlöschen
Das würde ich vielleicht eher so angehen (Pseudo-Code):
Delphi-Quellcode:
SQL o.ä. scheidet bei MyBase ja leider aus.
Dataset.First;
while not Dataset.EOF do begin if Dataset.FieldByName['Codenummer'] = DeinSuchbegriff then Dataset.Delete else Dataset.Next; end; |
AW: MyBase: Datenlöschen
Zitat:
|
AW: MyBase: Datenlöschen
Danke, für Eure Hilfe.
Die "Schleife " habe ich jetzt so gelöst:
Code:
Oder spricht was gehen "with"?
with ClientDataSet1 do
begin First; while not EOF do begin if FieldByName('Codenummer').AsString = lbledt1.text then Delete else Next; end; end; Gruß Heiko |
AW: MyBase: Datenlöschen
Wenn Du Dir ganz sicher bist, dass niemand jemals auf die Idee kommt, einem Formular First/Next/Delete Eigenschaften/Methoden zu spendieren.
|
AW: MyBase: Datenlöschen
Moin,
Zitat:
Selbst Wenn jemand dem Formular diese Eigenschaften zufügen würde, würde das "with" nicht dafür sorgen, das "first" und "next" sich auf das "ClientDataSet1" beziehen? Oder würden sich die Eigenschaften dann auf trotzdem auf das Formular beziehen? Gruß HEiko |
AW: MyBase: Datenlöschen
With nutzt immer den "innersten" Scope, d.h. in Deinem Fall sollte es keine Probleme geben. Trotzdem lauern da Fallstricke, die sich u.U. nur sehr schwer finden lassen, so dass einige User (mich eingeschlossen) von der Benutzung von with abraten.
|
AW: MyBase: Datenlöschen
Hallo,
Zitat:
Gruß Heiko |
AW: MyBase: Datenlöschen
Damit bist Du zumindest auf der sicheren Seite. Falls es Dir nur um Tipparbeit geht: da kann man auch mit einer Variablen (parallel zu einer vernünftigen Komponentenbenennung) einsparen, z.B.:
Delphi-Quellcode:
var
CDS: TClientDataset; begin CDS := ClientDataset1; CDS.First; //usw. |
AW: MyBase: Datenlöschen
Hallo,
Zitat:
Zitat:
Ich habe wieder was gelernt. Zitat:
Erstere ist noch unbenannt und zweitere hat seinen Namen durch das "CnPack" erhalten. Beide Namen sagen mir auch nicht zu, aber da es in diesem Fall nur um ein kleines Testprogramm ging, war mir das egal. Gruß HEiko |
AW: MyBase: Datenlöschen
Zitat:
|
AW: MyBase: Datenlöschen
Es gehört zwar nicht mehr zum Thema, aber mal ein ganz simples Beispiel:
Delphi-Quellcode:
type
TUsedClass = class strict private FProp1: integer; public property Prop1: integer read FProp1 write FProp1; end; TUserClass = class strict private FProp2: integer; public procedure DoSomeWork; property Prop2: integer read FProp2 write FProp2; end; { TUserClass } procedure TUserClass.DoSomeWork; var UsedClass: TUsedClass; begin UsedClass := TUsedClass.Create; try UsedClass.Prop1 := 42; with UsedClass do Prop2 := Prop1; ShowMessage(IntToStr(Prop2)); finally UsedClass.Free; end; end;
Delphi-Quellcode:
Ausgabe: 42, also wie erwartet. Nun stellen wir uns vor, die TUsedClass ist eine gekaufte Klasse/Komponente, und wir spielen uns ein Update ein:
procedure TFormTest.btnTestClick(Sender: TObject);
begin with TUserClass.Create do try DoSomeWork; finally Free; end; end;
Delphi-Quellcode:
Was wir denn jetzt ausgegeben, wenn wir den Button anklicken? Gut, man könnte überall, wo die eigene Instanz gemeint ist, vorsichtshalber ein "self." davorschreiben, aber dann ist der Hauptgrund für das with (weniger Tipparbeit) ja auch irgendwie wieder hinfällig.
type
TUsedClass = class strict private FProp1: integer; FProp2: integer; public property Prop1: integer read FProp1 write FProp1; property Prop2: integer read FProp2 write FProp2; end; |
AW: MyBase: Datenlöschen
Du könntest auch einen Filter auf das ClientDataSet legen. Dann würde sich die Schleife etwas verkürzen lassen:
Delphi-Quellcode:
cds.Filter := 'Codenummer = ' + QuotedStr(lbledt1.text); // Wenn Codenummer ein numerisches Feld ist, kann man die Quotes weglassen.
cds.Filtered := true; cds.First; while not cds.EOF do cds.Delete; cds.Filtered := false; |
AW: MyBase: Datenlöschen
@DeddyH: Man kann vieles konstruieren. Nach bald 35 Jahren programmieren und davon ca. 30 mit Pascal und 'WITH' hatte ich den Fall noch nie. Kann sein, das andere täglich damit zu kämpfen haben, aber ich eben noch nicht.
Mir ist das nur irgendwann zu blöd geworden, die WITH-Dinger nicht mehr so leicht debuggen zu können. Seiteneffekte, wie sie von den Delphi-Gurus immer wieder beschworen werden, hatte ich nicht ein einziges Mal. Gehirnkrämpfe, weil man irgendwann nicht mehr weiß, zu welcher Instanz die gewith'ste Property/Methode denn nun gehört, ständig. Aber seit dem ich die Clean-Code-Pillen nehme (ja, auch die mit den Mustern oben drauf :lol: ) passiert mir das nicht mehr. Zurück zum Thema: Ist beim Filtern eine Optimierung eingebaut oder wird die Tabelle nach dem 'Delete' komplett neu gefiltert (wäre ja eigentlich überflüssig)? Es wäre denkbar, das auch bei einem Locate ein 'DELETE' eine Positionierung des Datensatzzeigers auf den Anfang durchgeführt wird. Wenn dem so wäre, wäre die native Methode (1x durchrennen und alles Passende wegschmeißen) vielleicht doch die schnellste Variante? |
AW: MyBase: Datenlöschen
So konstruiert war das doch auch wieder nicht. Und ich wollte nur zeigen, dass man mit Effekten aus Richtungen rechnen muss, die man gar nicht auf dem Schirm hatte ;)
|
AW: MyBase: Datenlöschen
Zitat:
Delphi-Quellcode:
Tools wie der Pascal Analyzer von Peganza weisen einen aber dann doch auf solche Fälle hin.
with Rect do begin
Left := (Width - 100) div 2; Top := (Height - 100) div 2; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:51 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