Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   2. Dataset in dem Daten aus 1. Dataset ausgeschlossen sind (not in) (https://www.delphipraxis.net/190858-2-dataset-dem-daten-aus-1-dataset-ausgeschlossen-sind-not.html)

norwegen60 15. Nov 2016 02:51

Datenbank: MsSQL • Version: 2008 • Zugriff über: TAdo

2. Dataset in dem Daten aus 1. Dataset ausgeschlossen sind (not in)
 
Hallo,

ich habe in AdoQuery1 über
Delphi-Quellcode:
Select * from Tabel1
Daten aus Tabel1 abgefragt.

Jetzt möchte ich wissen, ob in Tabel1 neue Daten dazu gekommen sind und suche nach einer Möglichkeit, wie ich in AdoQuery2 nur die Daten abrufe, die in AdoQuery1 noch nicht enthalten sind. Die Möglichkeit, dass ich mir zum Zeitpunkt der Abfrage von AdoQuery1 MaxID oder Zeit merke scheidet aus, da die Tabelle über Replikation mit anderen Datenbanken verbunden ist und somit unterschiedliche ID-Bänder und Standort-Zeiten verwendet werden. Es müsste also etwas in der Art
Delphi-Quellcode:
Select * from Tabel1 where ID NOT IN (Select ID from AdoQuery1)
sein.

Wie aber kann ich die Daten aus AdoQuery1 in die NOT IN-Abfrage einbinden?
Ich habe auch daran gedacht, die ID der ersten Abfrage in einem Array abzuspeichern, weiß aber auch nicht, wie dann NOT IN mit dem Array zusammenbringe

Danke
Gerd

jaenicke 15. Nov 2016 04:39

AW: 2. Dataset in dem Daten aus 1. Dataset ausgeschlossen sind (not in)
 
Es geht um die Professional Edition aus deinem Profil? Hast du das FireDAC Addon?
Wenn ja, wäre FireDAC mit Local SQL Abfragen eine Möglichkeit. Damit kannst du Querys lokal in deiner Anwendung über nur im Speicher vorhandene Tabellen (TFDTable, TFDQuery, also wie deine AdoQuery1) durchführen. Im Grunde also genau was du willst.

Alternativ fiele mir nur ein die Daten mit select into zuerst in eine temporäre Tabelle zu kopieren und diese dann abzurufen. Dann könntest du die Vergleichsarbeit dem SQL Server überlassen und nur neue Datensätze hinzufügen. Dazu kannst du dann ein weiteres Feld hinzufügen, dass nach dem Abruf mit dem du die Daten jeweils als "abgerufen" markierst. So hast du dann nur eine Tabelle, die du neu abrufen musst und kannst über das Feld nachschauen was neue Daten sind und was nicht.

Uwe Raabe 15. Nov 2016 06:27

AW: 2. Dataset in dem Daten aus 1. Dataset ausgeschlossen sind (not in)
 
Eine weitere Alternative wäre, das zweite Dataset mit den neuen Daten zu filtern (Filter := true) und im OnFilterRecord zu püfen, ob der Datensatz im ersten Dataset vorkommt. Das sollte dann auch für jede Zugriffskomponente und jede Datenbank funktionieren und erfordert am wenigsten Code.

norwegen60 15. Nov 2016 06:45

AW: 2. Dataset in dem Daten aus 1. Dataset ausgeschlossen sind (not in)
 
Danke für die Tips.

Ich verwende die UniDac-Komponenten, bin aber nicht sicher, ob die die Daten lokal speichern können. Wie soll das denn gehen?
Mir ist aber nicht klar, wie dann eine Abfrage mit Bezug auf die zuvor geladene UniQuery1 lauten müsste.
Delphi-Quellcode:
Select * from Tabel1 where ID NOT IN (Select ID from UniQuery1)
geht ja nicht.
Ich weiß auch nicht, wie ich einen Filter festlege, der die Daten aus UniQuery1 ausschließt. Hier kommt noch das Problem dazu, dass dann UniQuery2 auch wieder alle Daten lädt, was ich eigentlich mit dem NOT IN vermeiden wollte.

Gerd

DeddyH 15. Nov 2016 06:56

AW: 2. Dataset in dem Daten aus 1. Dataset ausgeschlossen sind (not in)
 
Wie wäre es mit einem kleinen Umweg (ungetestet)?
Delphi-Quellcode:
Liste := TStringList.Create;
try
  UniQuery1.SQL.Text := 'SELECT ID FROM Tabelle';
  UniQuery1.Open;
  Feld := UniQuery1.FieldByName('ID');
  while not UniQuery1.Eof do
    begin
      Liste.Add(Feld.AsString);
      UniQuery1.Next;
    end;
  UniQuery1.Close;
  if Liste.Count > 0 then
    begin
      UniQuery2.SQL.Text := Format('SELECT * FROM Tabelle WHERE ID NOT IN(%s)',[Liste.CommaText]);
      UniQuery2.Open;
    end;
finally
  Liste.Free;
end;

jaenicke 15. Nov 2016 07:22

AW: 2. Dataset in dem Daten aus 1. Dataset ausgeschlossen sind (not in)
 
Zitat:

Zitat von norwegen60 (Beitrag 1353661)
Ich verwende die UniDac-Komponenten, bin aber nicht sicher, ob die die Daten lokal speichern können. Wie soll das denn gehen?

In FireDAC würde deine Abfrage gehen, ja. Sprich einfach auf dem Namen der Komponente als Tabelle.

Ob es so etwas bei UniDac auch gibt, weiß ich nicht. Es wäre allerdings enttäuschend und für uns ein NoGo, wenn nicht. Dazu müsste aber jemand anderes etwas sagen, der UniDac benutzt. Da gibt es ja im Forum einige, die das gegenüber FireDAC (was wir benutzen) in den Himmel loben. Wo seid ihr? ;-)

mikhal 15. Nov 2016 08:11

AW: 2. Dataset in dem Daten aus 1. Dataset ausgeschlossen sind (not in)
 
Ich nutze UniDAC, habe aber ein solches Konstrukt noch nie benötigt. Um festzustellen, ob neue Datensätze in einer Tabelle hinzugekommen sind, setze ich entweder eine VirtualTable ein (speicherintensiv und bei großen Datenmengen nicht gerade performant), eine temporäre Tabelle (Zeitaufwand bei der Erzeugung) oder besser einen Zeitstempel ein (wenig Speicherbedarf und performant). Einen solchen Zeitstempel kann ich unabhängig von der Datenquelle (Stichwort Replikation) mit einem Trigger erzeugen und der Zieltabelle mitgeben.

Grüße
Mikhal

PS: Ich weiß auch nicht, ob es überhaupt geht.

p80286 15. Nov 2016 10:28

AW: 2. Dataset in dem Daten aus 1. Dataset ausgeschlossen sind (not in)
 
Der "Umweg" aus #5 könnte aber beschränkt sein, da einige Datenbanken das
Delphi-Quellcode:
not in
auf einige hundert Einträge beschränken.

Wenn es interessiert, das es in einer DB "neue" Datensätze gibt, dann sollte auch eine Zeitinformation vorhanden sein. Ist dies nicht der Fall, ist das DB-Design nicht ganz optimal.

Gruß
K-H

Uwe Raabe 15. Nov 2016 10:32

AW: 2. Dataset in dem Daten aus 1. Dataset ausgeschlossen sind (not in)
 
Ich weiß, ist keine wirkliche Hilfe in diesem Fall, aber in Interbase würde man das mit Change Views lösen. Die werden auch von FireDAC direkt unterstützt.

norwegen60 15. Nov 2016 16:10

AW: 2. Dataset in dem Daten aus 1. Dataset ausgeschlossen sind (not in)
 
Zitat:

Zitat von DeddyH (Beitrag 1353662)
Wie wäre es mit einem kleinen Umweg (ungetestet)?

Es hat geklappt damit die Werte in die NOT IN Abfrage zu bekommen. Die Laufzeit der Abfrage lag dann aber im Minutenbereich => nicht praktikabel
Ich hatte bewusst verschwiegen dass es sich um ca. 1 Mio Daten handelt (nur drei Felder). Ich hatte den Aufschrei vermeiden wollen. :-)
Es ging und geht mir aber auch um die Technik selber.

Zitat:

Zitat von jaenicke (Beitrag 1353664)
Ob es so etwas bei UniDac auch gibt, weiß ich nicht. Es wäre allerdings enttäuschend und für uns ein NoGo, wenn nicht. Dazu müsste aber jemand anderes etwas sagen, der UniDac benutzt. Da gibt es ja im Forum einige, die das gegenüber FireDAC (was wir benutzen) in den Himmel loben. Wo seid ihr? ;-)

Wie würde die Abfrage in FireDac denn aussehen? Einfach
Delphi-Quellcode:
UniQuery2.SQL.Text := 'Select * from Table where ID NOT IN (select ID from UniQuery1)'
kann es ja nicht sein. Woher soll das SQL UniQuery1 kennen? Letztlich wird aber das Zeitverhalten ähnlich wie zuvor sein.

Zitat:

Zitat von mikhal (Beitrag 1353668)
Einen solchen Zeitstempel kann ich unabhängig von der Datenquelle (Stichwort Replikation) mit einem Trigger erzeugen und der Zieltabelle mitgeben.

Wie soll das gehen? Die Tabelle hat einen Zeitstempel. Da der aber vom Server abhängig ist kann es zu Zeitversätzen kommen.

Zitat:

Zitat von Uwe Raabe (Beitrag 1353708)
Ich weiß, ist keine wirkliche Hilfe in diesem Fall, aber in Interbase würde man das mit Change Views lösen. Die werden auch von FireDAC direkt unterstützt.

Da muss ich noch mal schauen ob es sowas bei UniDac gibt. Als ich es vor Jahren mal angefragt hatte, ging es nicht

Danke für die Feedbacks, auch wenn ich noch nicht die richtige Lösung habe.
Vielleicht bleib ich doch dabei, dass ich mir im zweiten Query alle Daten älter 24h lade und dann Satz für Satz vergleiche. Ich hatte gehofft es gibt einen besseren Weg.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:32 Uhr.
Seite 1 von 2  1 2      

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