Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL - Löschen aus der Ergebnismenge nicht aus der Datenbank (https://www.delphipraxis.net/116098-sql-loeschen-aus-der-ergebnismenge-nicht-aus-der-datenbank.html)

Polarwar 23. Jun 2008 13:46

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

mkinzler 23. Jun 2008 13:51

Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
 
Durch Ausschluss ?
SQL-Code:
 ... where ... and not in ( ...)

RavenIV 23. Jun 2008 14:16

Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
 
Zitat:

Zitat von Polarwar
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.

Indem Du Dir nur Daten aus der DB geben lässt, die Dich interessieren.
Du musst also das SQL-Statement entsprechend aufbauen.

Polarwar 23. Jun 2008 14:20

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

Bernhard Geyer 23. Jun 2008 14:23

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.

mkinzler 23. Jun 2008 14:24

Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
 
wenn die Tabelle eine PK hat (Annahme Name ID):

SQL-Code:
... and ID not in (12345, 12346, 12349, ...);
dann sind diese aus der Ergebnismenge verschwunden.

Polarwar 23. Jun 2008 14:30

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!

RavenIV 23. Jun 2008 14:32

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.

mkinzler 23. Jun 2008 17:09

Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
 
Zitat:

Oder Du nimmst eine MemoryTable. Das ist z.B. bei den RxKomponenten dabei.
Ist nun Teil der JVCL, unterstützt allerdings kein SQL.
Oder VirtualTable von DevArt (CoreLabs) oder kbMemTable

shmia 23. Jun 2008 17:19

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.

haentschman 23. Jun 2008 19:00

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:

alzaimar 23. Jun 2008 19:07

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.

juergen 23. Jun 2008 20:07

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:
 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;
3.) evtl. Datenausgabe:
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...

joachimd 24. Jun 2008 09:14

Re: SQL - Löschen aus der Ergebnismenge nicht aus der Datenb
 
nimm Temp Tables, dafür sind die perfekt:
SQL-Code:
SELECT ... INTO #erg FROM ... WHERE ...
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.

alzaimar 24. Jun 2008 09:19

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 09:42 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