Mehrere Datensätze löschen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Luckner
Beiträge: 50
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Mehrere Datensätze löschen

Beitrag von Luckner »

Hallo,

ich versuche einige Datensätze aus einer Tabelle zu lösche. mit den Zeilen darunter funktioniert es auch abe bekomme sofort eine Fehlermeldung, mit der ich nichts anfangen kann. Bitte um Hilfe.

Code: Alles auswählen

  DataModuleArtikel.ZQueryNummerierung.Close;
  DataModuleArtikel.ZQueryNummerierung.SQL.Clear;
  DataModuleArtikel.ZQueryNummerierung.SQL.Add('delete From NUMMERIERUNG WHERE ARTIKELNR = ' + EditArtikelNr.Text);
  DataModuleArtikel.ZQueryNummerierung.Open;

  if DataModuleArtikel.ZQueryNummerierung.RecordCount > 0 then
  begin
      DataModuleArtikel.ZQueryNummerierung.FetchAll;  //Es könnten schon einige Datensätze sein
      DataModuleArtikel.ZQueryNummerierung.First;

     while not DataModuleArtikel.ZQueryNummerierung.EOF do
     begin
         DataModuleArtikel.ZQueryNummerierung.ExecSQL;
     end;
  end;             
Fehlerausgabe: Projekt Etikbase hat Exception-Klasse "Exception" ausgelöst mit der Meldung "Can not open a Resultset in Datei "ZAbstract RODataset.pas in Zeile3528

Habe es schon mit einer For-Schleife versucht, aber mit dem gleichen Ergebnis. Meine Vermutung ist, dass ich irgendwelche Parameter in der TQuery ´deaktivieren muß?

Gruß, Luckner

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5884
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Mehrere Datensätze löschen

Beitrag von af0815 »

Was willst du in der Query ?

Entweder Daten anzeigen -> Dann mit SELECT -> und Open
oder Daten löschen -> dann mit DELETE -> und ExecSQL (oder wie der Befehl bei deinem System heisst)

Du löscht zuerst deiner Query die vermutlich ein SELECT Statement beinhaltet hat, einfach das Statment, fügst statt dessen ein Delete ein und machst dann ein Fetchall, als wäre ein SELECT vorhanden.

Bitte entweder die Query ordentlich konfigurieren (mit Insert, Update und delete Statements) und damit arbeiten oder das ganze richtig aufteilen und nicht alles vermischen. Beim Auto würde ich sagen, du mischt Benzin, Diesel und Salatöl und wunderst dich, warum die Motorkontrolle angeht und der Motor nicht läuft.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
gladio
Beiträge: 199
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: Mehrere Datensätze löschen

Beitrag von gladio »

Das Löschen mit Delete in einem SQL-Statemant muß nicht in einer Schleife durchgeführt werden.
Es werden alle Datensätze gelöscht, auf die die Bedingung zutrifft.

f ür

Code: Alles auswählen

..ARTIKELNR = ' + EditArtikelNr.Text);
nutze bitte einen Parameter

Code: Alles auswählen

  DataModuleArtikel.ZQueryNummerierung.Close;
  DataModuleArtikel.ZQueryNummerierung.SQL.Clear;
  DataModuleArtikel.ZQueryNummerierung.SQL.Add('delete From NUMMERIERUNG WHERE ARTIKELNR = :ArtikelNummer);
  
  DataModuleArtikel.ZQueryNummerierung.ParamByName('Artikelnummer').AsString:=EditArtikelNr.Text;
  
  DataModuleArtikel.ZQueryNummerierung.ExecSQL;

Luckner
Beiträge: 50
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: Mehrere Datensätze löschen

Beitrag von Luckner »

Hallo gladio,

danke Dir für den Hinweis. Hat sofort funktioniert. Habe die Zeilen:

Code: Alles auswählen

  DataModuleArtikel.ZQueryNummerierung.SQL.Add('delete From NUMMERIERUNG WHERE ARTIKELNR = :ArtikelNummer);
  
   DataModuleArtikel.ZQueryNummerierung.ParamByName('Artikelnummer').AsString:=EditArtikelNr.Text;
durch

Code: Alles auswählen

  DataModuleArtikel.ZQueryNummerierung.SQL.Add('delete From NUMMERIERUNG WHERE ARTIKELNR = ' + QuotedStr(EditArtikelNr.Text)); 
und es funktioniert auch. Sind die beiden Varianten identisch?

Gruß, Andreas

Benutzeravatar
gladio
Beiträge: 199
Registriert: Sa 21. Jun 2014, 06:15
OS, Lazarus, FPC: Win10-64 - aktuelle Lazarus/FPC Standard-Edition
CPU-Target: 64Bit
Wohnort: Rügen

Re: Mehrere Datensätze löschen

Beitrag von gladio »

Wenn in der Artikelnummer keine Anführungszeichen enthalten sind, sollte QuotedStr eigentlich überflüssig sein.
Auch wenn es jetzt so funktioniert, würde ich die Nutzung mit Parameterübergabe bevorzugen.
Und beim Rumprobieren immer schön mit einer Kopie der Datenbank arbeiten.

Antworten