AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken 2. Dataset in dem Daten aus 1. Dataset ausgeschlossen sind (not in)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von norwegen60 · begonnen am 15. Nov 2016 · letzter Beitrag vom 16. Nov 2016
Antwort Antwort
Seite 1 von 2  1 2      
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#1

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

  Alt 15. Nov 2016, 03:51
Datenbank: MsSQL • Version: 2008 • Zugriff über: TAdo
Hallo,

ich habe in AdoQuery1 über
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
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 15. Nov 2016, 05:39
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.
Sebastian Jänicke
AppCentral

Geändert von jaenicke (15. Nov 2016 um 05:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 15. Nov 2016, 07:27
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 15. Nov 2016, 07:45
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.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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 15. Nov 2016, 07:56
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 15. Nov 2016, 08:22
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?
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 15. Nov 2016, 09:11
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.
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

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

  Alt 15. Nov 2016, 11:28
Der "Umweg" aus #5 könnte aber beschränkt sein, da einige Datenbanken das 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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 15. Nov 2016, 11:32
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 15. Nov 2016, 17:10
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.

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 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.

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.

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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 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