Datensatz löschen

Für Fragen von Einsteigern und Programmieranfängern...
MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Datensatz löschen

Beitrag von MmVisual »

Ich gehe mal davon aus, Du willst nur den einen aktuellen ausgewählten Datensatz löschen, dann mache das:

ZQuery1.Delete;

Ansonsten muss natürlich der Wert von DBEdit1 VOR dem schließen der Query in eine Stringvariable gespeichert werden, wenn man den NACH dem schließen verwenden möchte, ansonsten ist der nämlich einfach weg.

Oder nehme eine zweite TZQuery für das Löschen und mache nach dem Löschen ein Refresh auf die erste Query.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Danke!!!! Funktioniert!

Beitrag von Aliobaba »

Vielen Dank @ Antrepolit und @ MmVisual!!

Beide Lösungen funktionieren!
Sowohl die unten Angegebene von Antrepolit oder auch der (aktuell auskommentierte) Einzeiler von MmVisual!!
:D :D

Code: Alles auswählen

procedure TForm1.LoeschenClick(Sender: TObject);
Var
   x : string;
begin
 Label6.Caption:= DBEdit1.Text;   // Zur Kontrolle, ob der richtige String angewählt ist
 x :=DBEdit1.Text;
 
 with ZQuery1 do
  begin
//   ZQuery1.Delete;
     sql.Text := 'DELETE FROM `tabelle1` WHERE  Column1= :col1 ';
     ParamByName('Col1').AsString := x;
     ExecSQL;
   Close;
  end;
 
 Label7.Caption:= DBEdit1.Text;   // Zur Kontrolle, ob der richtige String angewählt ist
 
 ZQuery1.SQL.Text := Memo1.Lines.Text;  // alle Daten in der DBGrid nochmal anzeigen
 ZQuery1.Open;
end;
Was passiert da nur mit dem DBEdit.Text in dieser Routine:

Code: Alles auswählen

with ZQuery1 do
...
end
!!!?

.... jetzt mache ich mich 'mal an den Update-Befehl. .... und wenn's so weitergeht, wird's mir die nächsten zwei Tage nicht langweilig :?

Schönes Wochenende!!
Aliobaba
Zuletzt geändert von Lori am So 20. Mai 2012, 10:20, insgesamt 2-mal geändert.
Grund: Verwende bitte den Highlighter.
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Datensatz löschen

Beitrag von Aliobaba »

... wie schon vermutet: Es ist ein harter Nachmittag.

Eine definitiv (versprochen!) letzte Frage für heute. Die letzten 'Feinheiten' des Update-Statements machen noch Probleme:

Code: Alles auswählen

with ZQuery1 do
 begin
SQL.Clear;
sql.Text := 'Update tabelle1 set Column1 = :Coln1';
// sql.add ('AND Column2 = :Coln2');
// sql.add ('AND Column3 = :Coln3');
// sql.add ('AND Column4 = :Coln4');
sql.Add('WHERE Column1= :Colv1 AND Column2 = :Colv2 AND Column3 = :Colv3 AND Column4 = :Colv4');
sql.Add('LIMIT 1');
 
Params.ParamValues['Colv1'] := v1;
Params.ParamValues['Colv2'] := v2;
Params.ParamValues['Colv3'] := v3;
Params.ParamValues['Colv4'] := v4;
Params.ParamValues['Coln1'] := n1;
// Params.ParamValues['Coln2'] := n2;
// Params.ParamValues['Coln3'] := n3;
///Params.ParamValues['Coln4'] := n4;
 
ExecSQL;
Close;
end;
So wie hier, also mit den auskommentierten Zeilen funktioniert alles wunderbar.
Sobald ich aber nicht nur den Eintrag der ersten Tabellenspalte ändern möchte, kommt eine Fehlermeldung

zum Beispiel:

Code: Alles auswählen

with ZQuery1 do
 begin
SQL.Clear;
sql.Text := 'Update tabelle1 set Column1 = :Coln1';
[b]sql.add ('AND Column2 = :Coln2');[/b]
// sql.add ('AND Column3 = :Coln3');
// sql.add ('AND Column4 = :Coln4');
sql.Add('WHERE Column1= :Colv1 AND Column2 = :Colv2 AND Column3 = :Colv3 AND Column4 = :Colv4');
sql.Add('LIMIT 1');
 
Params.ParamValues['Colv1'] := v1;
Params.ParamValues['Colv2'] := v2;
Params.ParamValues['Colv3'] := v3;
Params.ParamValues['Colv4'] := v4;
Params.ParamValues['Coln1'] := n1;
Params.ParamValues['Coln2'] := n2;
// Params.ParamValues['Coln3'] := n3;
///Params.ParamValues['Coln4'] := n4;
 
ExecSQL;
Close;
end;
SQL Error : Truncated incorrect DOUBLE value: 'B2x'
'Bsx' ist der Wert in der ersten Spalte wie er nach dem Ändern sein sollte

Aliobaba
Zuletzt geändert von Lori am So 20. Mai 2012, 10:21, insgesamt 1-mal geändert.
Grund: Verwende bitte den Highlighter.
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Datensatz löschen

Beitrag von MmVisual »

Da darf kein AND rein, die SQL Syntax ist falsch.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Datensatz löschen

Beitrag von Aliobaba »

Hallo MmVisual,

Meinst Du so? :

Code: Alles auswählen

sql.Text := 'Update tabelle1 set Column1 = :Coln1';
sql.add ('Column2 = :Coln2');
sql.add ('Column3 = :Coln3');
sql.add ('Column4 = :Coln4');
sql.Add('WHERE Column1= :Colv1 AND Column2 = :Colv2 AND Column3 = :Colv3 AND Column4 = :Colv4');
sql.Add('LIMIT 1');
 
Params.ParamValues['Colv1'] := v1;
Params.ParamValues['Colv2'] := v2;
Params.ParamValues['Colv3'] := v3;
Params.ParamValues['Colv4'] := v4;
Params.ParamValues['Coln1'] := n1;
Params.ParamValues['Coln2'] := n2;
Params.ParamValues['Coln3'] := n3;
Params.ParamValues['Coln4'] := n4;
... funktioniert leider auch nicht.
Die Syntax ist schon ein Riesenproblem, wenn man ein SQL-Statement in die Form umwandlen möchte, wie sie Lazarus bzw. Pascal fordert. Man kann nämlich leider nicht die Variablen 1:1 in die "Lazarus-gefällige" Ausdrucksweise sozusagen "Stück für Stück" "umschreiben". ... und Regeln, wie diese Konvertierung zu bewerkstelligen ist, habe ich - trotz wirklich umfangreicher Suche - nirgendwo gefunden. :(

Eine Lösung hätte ich ja schon:
Die ursprünglichen Datensatzeinträge in Edit-Felder laden, dann verändern, dann den ursprnglichen Datensatz löschen und dann die veränderten Edit-felder wieder neu speichern.
.... aber elegant ist das nicht :|

Schönen abend!
Aliobaba
Zuletzt geändert von Lori am So 20. Mai 2012, 10:22, insgesamt 1-mal geändert.
Grund: Um Code hervorzuheben ist der Highlighter da, verwende ihn bitte auch.
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

MmVisual
Beiträge: 1582
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: Datensatz löschen

Beitrag von MmVisual »

Ich könnte Dir ja die Lösung aufschreiben, aber dann hast Du keinen Lernspaß mehr ;-)

Siehe hier:
http://www.sqlite.org/lang_update.html" onclick="window.open(this.href);return false;
EleLa - Elektronik Lagerverwaltung - www.elela.de

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Datensatz löschen

Beitrag von Aliobaba »

Hallo MmVisual,

Du bist nicht nur ein freundlicher Helfer und ein hervorragender Programmierer, sondern auch noch ein geschickter Pädagoge!! :D

Das kleine "," in dem kleinen Kreis hier http://www.sqlite.org/lang_update.html" onclick="window.open(this.href);return false; habe ich nicht gesehen!!

DANKE!!!

.. und einen schönen Sonntag noch!!

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Antworten