![]() |
Datenbank: ADS • Version: 8.1 • Zugriff über: ADSTable, ADSQuery
SQL - Löschen aus der Ergebnismenge nicht aus der Datenbank
Hallo zusammen,
ich stehe hier gerad mal wieder auf der Leitung. Ich führe eine SQL aus und möchte nun aus der Ergebnismenge gezielt einige Sätze löschen. Aber nur aus der Ergebnismenge und nicht aus der Datenbank selbst. Wie stelle ich sowas an..... irgendwie komm ich da heute nicht drauf?!?! Gruß Polarwar |
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
Durch Ausschluss ?
SQL-Code:
... where ... and not in ( ...)
|
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
Zitat:
Du musst also das SQL-Statement entsprechend aufbauen. |
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
Durch Ausschluss???
Ich kann die Daten nicht vorher eindeutig selektieren!!! Ich habe eine Datenmenge mit z.B. 2500 ausgewerteten Datensätzen ( In diesem Fall Rechnungen). Nun möchte ich vor der Weiterverarbeitung spezielle Sätze, die nicht unbedingt einer Regel entsprechen, löschen....aber natürlcih nicht aus der Datenbank, sondern nur aus der Ergebnismenge. In nem Grid und löschen halt. Danach möchte ich mit den übrigen Sätzen noch weiter arbeiten. Gruß Polarwar |
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
Ich glaube nicht das die ADS-Komponenten disconnected Datasets unterstützen und das über Transaktionen zu "simulieren" ist keine gute Idee.
|
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
wenn die Tabelle eine PK hat (Annahme Name ID):
SQL-Code:
dann sind diese aus der Ergebnismenge verschwunden.
... and ID not in (12345, 12346, 12349, ...);
|
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
Hallo,
das die ADS Kompos soetwas nicht unterstützen, habe ich mir fast gedacht. Wollte nur zur Sicherheit nochmal schauen, ob ich nicht doch auf der Leitung stehe. Ich werde mir die Ergebnismenge nun in eine Temptable moven, in der ich dann auch löschen kann. Ist zwar unschön, aber es geht. (drop temptable....select * into temptable from ***) Danke trotzdem für die schnellen Antworten! |
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
Oder Du nimmst eine MemoryTable. Das ist z.B. bei den RxKomponenten dabei.
Die kannst Du aus einer Query füllen und dann damit machen, was Du willst. Aber der bessere Weg ist schon, sich nur von der DB zu geben lassen, was man wirklich haben möchte. |
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
Zitat:
Oder VirtualTable von DevArt (CoreLabs) oder kbMemTable |
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
Du könntest auch ein weiteres Feld (ich nenne es mal Prio) aufnehmen.
Der Benutzer setzt die Prio seiner Rechnungen von -3 bis +3 (default Wert ist 0) Und dann kannst du einfach eine Where-Bedingung (WHERE ... AND (Prio>=0)) ansetzen oder auch das Filter-Property benützen. Damit der Benutzer die Prio von vielen Datensätzen leicht ändern kann, könntest du im DBGrid die Option dgMultiSelect aktivieren. Der Benutzer selektiert beliebig viele Datensätze und kann dann die Priorität auf einen Rutsch anpassen. |
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
Hallo...
ich arbeite zwar mit Zeos aber da haben die Querys eine property CachedUpdates. - ist CachedUpdates = False werden Änderungen an der Query in die Datenbank übertragen. - ist CachedUpdates = True können Änderungen an der Query vorgenommen werden ohne daß der Datenbank was passiert ...möchte man die Änderungen schreiben - ApplyUpdates ansonsten CancelUpdates. vieleicht kennt das deine Query auch ? :gruebel: |
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
Mit Delphi-Bordmitteln;
1. mit ADO und LockType 'ltBatchOptimistic'. Dann nur kein 'ApplyUpdates' aufrufen. 2. mit einem TDataProvider und dem TClientDataset. |
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
Hallo,
ich hab nun nicht ganz so die Ahnung, aber wenn die Abfrage häufiger benötigt wird muss ich mich meinen Vorrednern anschließen, die anregten, dass Tabellen Design zu überdenken. Mir ist nicht ganz klar, wird die Lösung in dem DBMS über SQL benötigt oder wäre Delphi einsetzbar? Bei letzerem könnte man 2 Funktionen unter Einsatz einer Query einsetzen, unter dem Ansatz, die nicht benötigten Datensätze vorab schon zu filtern: 1.) in der ersten Funktion werden deine Regeln festgelegt (Rückgabewert in meinem Beispiel = Integer) 2.)
Delphi-Quellcode:
3.) evtl. Datenausgabe:
function TForm1.Feldwert(index: integer): string;
//diese Funktion wendet die vorherige "Regel-Funktion auf deine Tabellenspalte "xyz" an begin if (UPPERCASE(Query1.Fields[index].fieldname) = 'XYZ')then begin Result := deine 1. Funktion(Query1.Fields[index].asinteger);//nur deine gültigen Datensätze end; end;
Delphi-Quellcode:
...
var lsCell: string; liFldCnt, liDS: Integer; begin liFldCnt := Query1.FieldCount; if (liFldCnt > 0) then while not (Query1.eof) do begin lsCell := Feldwert(0); for liDS := 1 to liFldCnt - 1 do begin lsCell := lsCell + ';' + Feldwert(liDS); //beispielhafte Ausgabe end; end; end; Ich hoffe ich habe das jetzt auch richtig verstanden... |
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
nimm Temp Tables, dafür sind die perfekt:
SQL-Code:
Der Vorteil gegenüber clientseitigen Lösungen: Du kannst die Ergebnistabelle mit anderen joinen, Änderungen serverseitig zurückschreiben u.ä. - und Du ersparst Dir bei großen Ergebnismengen den kompletten Transfer zum Client.
SELECT ... INTO #erg FROM ... WHERE ...
|
Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
So wie ich das verstanden habe, will der Fragesteller Folgendes:
1. Tabelle laden 2. Die Daten in einem Datengitter anzeigen 3. Aus diesem Gitter (und nur hier) einzelne Datensätze entfernen 4. nur die Daten, die man im Grid sieht weiterverarbeiten, z.B. sequentiell drucken Das mit SQL zu lösen ist doch dann suboptimal. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 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