Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Mehrere Datensätze löschen (https://www.delphipraxis.net/103497-mehrere-datensaetze-loeschen.html)

Seppel 16. Nov 2007 13:51

Datenbank: MySql • Version: k.a. • Zugriff über: Zeoslib

Mehrere Datensätze löschen
 
Hi ich möchte nicht immer einzeln und mühsam die Datensätze löschen sondern alle auf einmal.
Ich verwende ein Listview und da gibt es ja Checkboxen, daher könnte man das ja hiermit recht einfach lösen.

Bislang musste man es anklicken, also die ID und dann auf löschen und gelöscht ist es.


Hier der aktuelle Code.
Delphi-Quellcode:
begin
    dbMain.Hostname:=edServer.Text;
  dbMain.User:=edLogin.Text;
  dbMain.Password:=edPasswort.Text;
  dbMain.Database:=edDB.Text;
   dbMain.Connected:=True;

  try

    qrMain.SQL.Text:='DELETE FROM adressbuch WHERE id='''+edID.Text+''';';
    qrMain.ExecSql;
    finally
        dbMain.Connected:=False;
        Button6.Click;
        Button7.Click;
        end;

end;
Es ist ja momentan so, dass wenn man auf die ID im Listview klickt, dass der Inahlt, also alles zugehörige zur ID in Edit felder geladen wird, das muss ja dann abgeschaltet werden und mit checkboxes gemacht werden, nur momentan weiß´ich echt nicht wie ich das anstellen soll.
Bestimmt mit ner schleife, wenn ihr mir helft wäre das echt gut.
Ich probiere auch ma was. Das Problem ist erst mal dass die ID aus dem Listview ausgelesen wird und nicht aus dem Edit, da ja sonst immer nur eins gelöscht werden kann.

mfg
Seppel

DeddyH 16. Nov 2007 13:56

Re: Mehrere Datensätze löschen
 
Nur ein Denkansatz: zunächst in einer Schleife die ListView.Items durchgehen und auf Checked prüfen. Wenn Checked, dann eine Stringvariable setzen bzw. ergänzen. Nun im SQL das Gleichheitszeichen durch IN ersetzen und den zusammengesetzten String mit den kommaseparierten IDs in Klammern dahinterstellen, so dass das etwa so aussieht:
SQL-Code:
DELETE FROM adressbuch WHERE ID IN (1,2,5,8,789);

Seppel 16. Nov 2007 14:12

Re: Mehrere Datensätze löschen
 
Zitat:

Zitat von DeddyH
Nur ein Denkansatz: zunächst in einer Schleife die ListView.Items durchgehen und auf Checked prüfen. Wenn Checked, dann eine Stringvariable setzen bzw. ergänzen. Nun im SQL das Gleichheitszeichen durch IN ersetzen und den zusammengesetzten String mit den kommaseparierten IDs in Klammern dahinterstellen, so dass das etwa so aussieht:
SQL-Code:
DELETE FROM adressbuch WHERE ID IN (1,2,5,8,789);

So habe ich mir das gedacht, das mit den IDs is ja eh selbst erklärend, aber ich weiß jettzt net wie ich die inhalte dann in eine Stringvariable speichern soll, insgesammt wie ich das den prüfen soll.

Delphi-Quellcode:
if test.Checkboxes := true
  then

  Add(test.Columns, i);
Hab keinen Plan wie ich das dann durchlaufen lassen soll, bzw. später in den SQL Befehl eingeben soll.

wicht 16. Nov 2007 14:21

Re: Mehrere Datensätze löschen
 
Ungetestet hingeklatscht:

Delphi-Quellcode:
var
  i: integer;
  s: string;
begin
  s := 'delete from table where id in (';
  for i := 0 to listview.items.count - 1 do
    if listview.items[i].checked then
      if i = listview.items.count - 1
        s := s + inttostr(i)
      else
        s := s + inttostr(i) + ',';
  s := s + ')';
 
  // s sollte hier deine lösch-Abfrage sein.
end;

DeddyH 16. Nov 2007 14:22

Re: Mehrere Datensätze löschen
 
Ein Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
    s: string;
    first: Boolean;
    SQL: string;
begin
  s := '';
  first := true;
  for i := 0 to ListView1.Items.Count - 1 do
    if ListView1.Items[i].Checked then
      begin
        if first then
          s := inttostr(i) //statt i hier eben die ID des Eintrags
        else
          s := s + Format(',%d',[i]); //s.o.
        first := false;
      end;
  if Length(s) > 0 then
    begin
      SQL := Format('DELETE FROM adressbuch WHERE ID IN(%s)',[s]);
      ShowMessage(SQL);
    end;
end;

Seppel 16. Nov 2007 14:23

Re: Mehrere Datensätze löschen
 
Zitat:

Zitat von wicht
Ungetestet hingeklatscht:

Delphi-Quellcode:
var
  i: integer;
  sql: string;
begin
  s := 'delete from table where id in (';
  for i := 0 to listview.items.count - 1 do
    if listview.items[i].checked then
      if i = listview.items.count - 1
        s := s + inttostr(i)
      else
        s := s + inttostr(i) + ',';
  s := s + ')';
 
  // s sollte hier deine lösch-Abfrage sein.
end;

Werds testen, verstanden hab ich es, aber s soll entweder sql heißen oder s ist nicht definiert.^^

wicht 16. Nov 2007 14:26

Re: Mehrere Datensätze löschen
 
Ja, richtig beobachtet. Habs zu spät gemerkt und jetzt sind eure Beiträge schon dagewesen.. :stupid:

Edit:
Das
Delphi-Quellcode:
//statt i hier eben die ID des Eintrags
ist natürlich auch zu beherzigen, sonst löscht du eventuell sachen, die du eigentlich nicht löschen wolltest.

Seppel 16. Nov 2007 14:30

Re: Mehrere Datensätze löschen
 
Zitat:

Zitat von wicht
Ja, richtig beobachtet. Habs zu spät gemerkt und jetzt sind eure Beiträge schon dagewesen.. :stupid:

Edit:
Das
Delphi-Quellcode:
//statt i hier eben die ID des Eintrags
ist natürlich auch zu beherzigen, sonst löscht du eventuell sachen, die du eigentlich nicht löschen wolltest.

ja genau, nur wie soll ich das dann machen, ID ist in der ersten Colum, denn du meinst es ja so, dass ja i momentan einfach nur aus der Reihenfolge hergeht, das heißt das 1. hat dann die id 1 nur eigentlich hats ja vielleicht 5.

DeddyH 16. Nov 2007 14:50

Re: Mehrere Datensätze löschen
 
Die ID ist die Beschriftung des ListItems? Dann ist das ja einfach.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
    s: string;
    first: Boolean;
    SQL: string;
begin
  s := '';
  first := true;
  for i := 0 to ListView1.Items.Count - 1 do
    if ListView1.Items[i].Checked then
      begin
        if first then
          s := ListView1.Items[i].Caption
        else
          s := s + Format(',%s',[ListView1.Items[i].Caption]);
        first := false;
      end;
  if Length(s) > 0 then
    begin
      SQL := Format('DELETE FROM adressbuch WHERE ID IN(%s)',[s]);
      ShowMessage(SQL); //hier dann halt ausführen
    end;
end;

Seppel 16. Nov 2007 15:47

Re: Mehrere Datensätze löschen
 
ok danke, habs verstanden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz