![]() |
Datenbankabfrage in Array speichern
Hallo Freunde des Programmierens,
ich komme gleich zum Punkt. Wie bekomme ich unterschiedliche Werte einer Tabelle, die jedoch die selbe ID haben, in ein Array gespeichert? Es geht mir um das gleichzeitige Löschen mehrerer Werte. Als Beispiel: Tabelle 1: id: 1 | kat_id: 1 id: 2 | kat_id: 2 id: 3 | kat_id: 1 id: 4 | kat_id: 1 id: 5 | kat_id: 3 id: 6 | kat_id: 1 Kat_id ist eine Zuordnungs-ID für eine andere Tabelle. Das Ausgeben dieser IDs ist für mich kein Problem. Das Speichern in ein Array jedoch sehr. In diesem Beispiel sollen nun alle ID's mit der kat_id 1 gelöscht werdenn. Meine Vorüberlegung war es, die DELETE-Funktion während des SELECTes durchzuführen. Nun ja, es kommt die Meldung, dass es Probleme mit der Perfomance gibt. Nun war meine zweite Idee, die zu löschenden IDs in ein Array zu speichern, welche dann gelöscht werden können. Nun meine Fragen. 1. Wie bekomme ich die unterschiedlichen IDs in ein Array? 2. Welches Array wäre besser, ein dynamisches oder statisches Array? 3. Wäre eine for-each-Schreife (wie in php) möglich? Wenn ja, wie? Hier mir Quellcode:
Code:
Weitere Informationen:
procedure TFormMain.PopupMenuItemRechnungLoeschenClick(Sender: TObject);
var id, InfoTitel, InfoText : String; i : String; begin InfoTitel:='Rechnung löschen?'; InfoText:='Soll die ausgewählte Rechnung wirklich gelöscht werden?'; if LVRechnungen.SelCount >= 1 then begin if QuestionDlg(InfoTitel, InfoText, mtWarning, [mrYes, 'Ja', mrNo, 'Nein'], 0) = mrYes then begin id:=LVRechnungen.Selected.Caption; ZQuery.SQL.Clear; ZQuery.Params.Clear; ZQuery.SQL.Text:='SELECT ReKatID, ReInhID FROM rechnungen_inhalt WHERE ReKatID='+#39+id+#39+' ORDER BY ReInhID DESC'; ZQuery.Open; while not ZQuery.EOF do begin i:=ZQuery.FieldByName('ReInhID').AsString; ShowMessage(i); ZQuery.Next; end; ZQuery.Close; //ZQuery.SQL.Text:='DELETE FROM rechnungen_inhalt WHERE ReKatID='+#39+id+#39; //ZQuery.ExecSQL; //LVRechnungen.Selected.Delete; end; end; end; Datenbank-Protokoll: sqlite3 Datenbank-Schnittstelle: ZeosDB (sofern man das als Schnittstelle bezeichnen kann) Programm: Lazarus IDE v1.6.2 Leider sind meine Kenntnisse noch auf einem relativ geringem Niveau, sodass ich um Hilfe bitten muss. Über postive Rückmeldungen würde ich mich sehr freuen. Liebe Grüße BerlinerBaer |
AW: Datenbankabfrage in Array speichern
Hallo BerlinerBaer,
willkommen in der Delphi-Praxis. 1) Wenn Du die ReInhId als String zurück gibst empfehle ich Dir eine Stringlist zu nutzen. 2)Wenn Du
Delphi-Quellcode:
ReKatID übergibst um die Daten abzufragen, dann kannst Du auch gleich ein Delete Durchführen.
ZQuery.SQL.Text:='SELECT ReKatID, ReInhID FROM rechnungen_inhalt WHERE ReKatID='+#39+id+#39+' ORDER BY ReInhID DESC';
... ZQuery.SQL.Text:='DELETE FROM rechnungen_inhalt WHERE ReKatID='+#39+id+#39; 3) Du solltest Dir gleich angewöhnen Parameter zu nutzen:
Delphi-Quellcode:
(ich kenne die genaue Syntax bei Zeos nicht, bitte überprüfen)
ZQuery.SQL.Text:='SELECT ReKatID, ReInhID FROM rechnungen_inhalt WHERE ReKatID=:rekatid ORDER BY ReInhID DESC';
ZQuery.SQL.Parameters.ParameterbyName('rekatid').asString:=id; Gruß K-H |
AW: Datenbankabfrage in Array speichern
Hallöle...:P
Zitat:
![]() Ergänzung:
Delphi-Quellcode:
...bei Zeos ist es auch so korrekt. (kürzer) 8-)
ZQuery.SQL.ParamByName('rekatid').asString := id;
Nachtrag:
Delphi-Quellcode:
//ZQuery.SQL.Clear; //nicht nötig
//ZQuery.Params.Clear; //nicht nötig ZQuery.SQL.Text:='SELECT ReKatID, ReInhID FROM rechnungen_inhalt WHERE ReKatID=:id ORDER BY ReInhID DESC'; ZQuery.SQL.ParamByName('rekatid').asString := id; ZQuery.Open; |
AW: Datenbankabfrage in Array speichern
Zitat:
vielen Dank für die Begrüßung. :) Das Problem jedoch ist folgender, dass ich nicht nur eine, sondern alle mit der selbigen ReKatID löschen möchte. Dazu war mein Beispiel oben etwas verwirrend. So sollte es aussehen: Tabelle 1: ReInhID (auto_inc + Primärer Schlüssel) | ReKatID (Verweis auf eine andere Tabelle 2) ReInhID: 1 | ReKatID: 1 ReInhID: 2 | ReKatID: 2 ReInhID: 3 | ReKatID: 1 ReInhID: 4 | ReKatID: 1 ReInhID: 5 | ReKatID: 3 ReInhID: 6 | ReKatID: 1 Tabelle 2: ReKatID: 1 ReKatID: 2 ReKatID: 3 ...fortlaufend Die 2. Tabelle interessiert mich momentan eher weniger, da ich dort nur ein Datensatz löschen muss. Die entsprechende ReKatID hole ich mir aus einer TListView. Zitat:
Zitat:
Code:
gelöscht werden können. Nur daran verzweifel ich irgendwie.
ZQuery.SQL.Text:='DELETE FROM rechnungen_inhalt WHERE ReInhID IN (1, 3, 4, 6)';
Zitat:
Zitat:
wieso ist das nicht nötig? Es geht doch hierbei um die Vermeidung eventueller Fehler. Ich benutze SQL.Text und Params nicht nur ein mal im kompletten Quelltext. Mir wurde erklärt, dass das immer eine Prävention zu eventuell auftretenden Fehlern ist. Liebe Grüße BerlinerBaer |
AW: Datenbankabfrage in Array speichern
Hallöle...:P
Zitat:
Delphi-Quellcode:
...weil mit SQL.Text eine neue Zuweisung gemacht wird. Das SQL wird eh gelöscht...also doppelt gemoppelt. Anders sieht es ausschließlich mit SQL.Add aus. Da mußt du das zurücksetzen.
ZQuery.SQL.Clear
Delphi-Quellcode:
...weil mit SQL.Text die Parameter automatisch geleert werden...also doppelt gemoppelt.
ZQuery.Params.Clear
Zitat:
![]() ![]() Zitat:
|
AW: Datenbankabfrage in Array speichern
Zitat:
SQL-Code:
werden alle Einträge aus Tabelle1 entfernt, wo der Inhalt von Feld1 Meinwert ist.
delete from tabelle1 where feld1=meinwert;
Es sei denn irgendwelche Constraints oder Trigger sind der Meinung, das darf man so nicht. Wo genau taucht die Fehlermeldung auf? in Deinem Sourcecode wird nirgendwo eine Löschung durchgeführt. Zitat:
In diesem Falle wird mit
Delphi-Quellcode:
genau dieses erreicht.
.SQL.Text:='blabla'
Dein Vorgehen ist kein schwerer Fehler aber überflüssig und bevor sich da eine schlechte Angewohnheit breit macht. (meiner Meinung nach fällt das weit verbreitete
Delphi-Quellcode:
in die gleiche Kategorie. Da lieber gleich
.SQL.Lines.Clear;
.SQL.Lines.Add('blabla'); .SQL.Lines.Add('blubblub');
Delphi-Quellcode:
.SQL.Text:='blabla'+
'blubblub'; Gruß K-H |
AW: Datenbankabfrage in Array speichern
Hallo p80286,
ich danke dir für deine Hilfe. Manchmal übersieht man doch das ein oder andere. Wieso ich nicht selbst auf die Idee gekommen bin, anhand der KategorieID (ReKatID) zu löschen, frage ich mich. Die Fehlermeldung tauchte auf, als ich den DELETE-Befehl in die Abfrage gesetzt habe. Das Problem hat sich damit erledigt. Liebe Grüße BerlinerBaer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 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-2025 by Thomas Breitkreuz