AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Verknüpfung über IN-Operator mit ADO-Komponenten
Thema durchsuchen
Ansicht
Themen-Optionen

Verknüpfung über IN-Operator mit ADO-Komponenten

Ein Thema von Nico B. · begonnen am 26. Nov 2009 · letzter Beitrag vom 26. Nov 2009
Antwort Antwort
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#1

Verknüpfung über IN-Operator mit ADO-Komponenten

  Alt 26. Nov 2009, 08:33
Datenbank: MSSQL und Access • Zugriff über: ADO-Komponenten
Hallo Leute,

ich zerbreche mir schon seit 2 Tagen den Kopf über folgendem Problem:

Ich habe eine Access-DB und eine MSSQL-DB. In beiden DB´s gibt es Tabellen mit ähnlichen Inhalten.
In der Access-DB stehen mehr Datensätze als in der MSSQL-DB.
Ich möchte mir nun alle Datensätze der Access-DB anzeigen lassen, die noch nicht in der MSSQL-DB enthalten sind.
Wären das 2 Tabellen einer DB würde ich also folgendes SQL-Statement nehmen:
SELECT * FROM Tabelle1 WHERE Index1 NOT IN (SELECT Index2 FROM Tabelle2) Wie muss ich das nun mit 2 unterschiedlichen Datenbanken machen?

Momentan sieht mein Ansatz folgendermaßen aus.
Ich habe folgende Komponenten:
ADOConnectionAccess
ADODataSetAccess
ADODataSourceAccess
ADOConnectionMSSQL
ADODataSetMSSQL
ADODataSourceMSSQL
DBGrid

Die DataSet-Properties der DataSources stehen auf den jeweiligen ADODataSets.
Die Connection-Properties der DataSets stehen auf den jeweiligen ADOConnections.

Das ADODataSetAccess hat einen Parameter namens NameMSSQL.

Der CommandText des ADODataSetMSSQL lautet
SELECT NameMSSQL FROM TabelleMSSQL Der CommandText des ADODataSetAccess lautet
SELECT NameAccess FROM TabelleAccess WHERE NameAccess NOT IN (:NameMSSQL) Die DBGrid hat als DataSource die ADODataSourceAccess.

Ich dachte, ich kann das Problem über das Parameters-Property des DataSets lösen. Dazu müsste ich einen Parameter schaffen, der die ganze Ergebnismenge des ADODataSetMSSQL enthält (also das Feld NameMSSQL).
Mittlerweile weiß ich da aber nicht weiter. Es gibt für die Parameter zwar den DataType ftDataSet, aber den kann ich nicht ohne Fehlermeldung auswählen.

Ich habe jetzt auch schon überlegt, ob es vielleicht über das Filter-Property gelöst werden kann. Allerdings müsste ich auch da irgendwie auf die Ergebnismenge des ADODataSetMSSQL zugreifen können.

Bitte, bitte, bitte helft mir. Ich weiß einfach nicht mehr weiter.
Nico Bäger
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

Re: Verknüpfung über IN-Operator mit ADO-Komponenten

  Alt 26. Nov 2009, 09:07
Hallo,

glaube nicht, dass das geht, ein SQL und darin gleichzeitig auf Access und MSSQL zuzugreifen. Mir fiele hier nur ein: Für jede Datenbank die benötigten Daten in jeweils ein ClientDataSet zu holen und dann den Rest im Programm erledigen. Schau Dir dort dann mal die Attribute Mastersource und Masterfields an, eventuell kommst Du damit weiter.
Diese Attribute sind auch bei TADOTable vorhanden. TADODataset hat nur Masterfields, aber eventuell ist ja dahinter ein Lösungsansatz verborgen.

Sind jetzt nur Ideen, habe keine Ahnung, ob sie wirklich zielführend sind.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Verknüpfung über IN-Operator mit ADO-Komponenten

  Alt 26. Nov 2009, 09:15
Oder du versuchst die MS SQL Server Tabelle in Access einzubinden und dann in Access einen outer join durchzuführen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#4

Re: Verknüpfung über IN-Operator mit ADO-Komponenten

  Alt 26. Nov 2009, 09:56
@nahpets: Ich habe mir ja schon beide Datenmengen in DataSets geholt, nur schaffe ich es nicht die Datenmenge in dem einen DataSet so zu reduzieren, dass nur noch Datensätze enthalten sind, die nicht in der Datenmenge des anderen DataSets stehen.

MitMasterFields habe ich auch schon ein wenig experimentiert. Aber wenn ich als MasterFields die beiden Namen-Felder aus den beiden DataSets auswähle, ist das Ergebnis, dass nur noch der erste Datensatz angezeigt wird, der in beiden Tabellen enthalten ist.
Es werden also nicht einmal alle Datensätze angezeigt, die in beiden Tabellen enthalten sind.



@Bernhard: Falls du damit meinst, ich soll das Access öffnen und darin die Tabelle aus MSSQL als externe Daten mit der Access-Tabelle verknüpfen, dann funktioniert das leider nicht. Erstens habe ich kein Access und zweitens darf und will ich die Access-DB nicht verändern. Ich habe darauf nur Lese-Zugriff.



Andere Idee:
Ich habe nun beide Tabellen in 2 separaten DataSets jeweils mit allen in ihnen enthaltenen Datensätzen.
Wie soll ich aus dem Programm heraus die Datensätze, die nicht in beiden Tabellen stehen, in eine DBGrid oder ähnliches bringen?
Gibt es da eine günstigere Variante als eine Tabelle mit einer while-Schleife zu durchlaufen und für jeden Datensatz zu schauen, ob es in der anderen Tabelle ein Äquivalent gibt?
Nico Bäger
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Verknüpfung über IN-Operator mit ADO-Komponenten

  Alt 26. Nov 2009, 10:03
Zitat von Nico B.:
@Bernhard: Falls du damit meinst, ich soll das Access öffnen und darin die Tabelle aus MSSQL als externe Daten mit der Access-Tabelle verknüpfen, dann funktioniert das leider nicht. Erstens habe ich kein Access und zweitens darf und will ich die Access-DB nicht verändern. Ich habe darauf nur Lese-Zugriff.
Dann lege eine Temporäre weiter Access-DB in der du sowohl die Tabelle der ReadOnly Access DB verknüpft und die aus dem MS SQL Server. Sollte auch Programmtechnisch ohne installierten Access gehen. Frag mich aber nicht nach Code. Das war fast 10 Jahre her als ich das gemacht habe.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#6

Re: Verknüpfung über IN-Operator mit ADO-Komponenten

  Alt 26. Nov 2009, 10:15
@Bernhard: Ich habe ganz ehrlich keine Ahnung (nicht einmal ansatzweise) wie ich das machen soll. Mhm, und dich kann ich nicht fragen. Gibt es nicht vielleicht doch eine andere Lösung?
Nico Bäger
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

Re: Verknüpfung über IN-Operator mit ADO-Komponenten

  Alt 26. Nov 2009, 10:30
Hallo,

ein Versuch der Erklärung:

in Access neue Datenbank erstellen, Externe Daten, Weitere, ODBC-Datenbank, Erstellen Sie eine Verknüpfung zur Datenquelle, indem Sie eine verküpfte Tabelle erstellen. OK.

Dann einen passende Datei- oder Computerdatenquelle auswählen, dort die gewünschte Tabelle auswählen.

Danach sollte die Tabelle in Access verfügbar sein und von Access selbständig aktuell gehalten werden.

Wie jetzt der Zugriff innerhalb von Access zwischen den Tabellen funktioniert, weiß ich nicht, könnte mir aber vorstellen, dass es nun einfach per SQL funktioniert.
  Mit Zitat antworten Zitat
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#8

Re: Verknüpfung über IN-Operator mit ADO-Komponenten

  Alt 26. Nov 2009, 10:42
@nahpets: Da landen wir leider wieder bei dem Problem, dass ich kein Access habe.
Nico Bäger
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

Re: Verknüpfung über IN-Operator mit ADO-Komponenten

  Alt 26. Nov 2009, 10:50
Hallo,

dann wirst Du die Daten wohl oder übel im Arbeitsspeicher zusammensetzen müssen. Mit reinen SQL-Mitteln sehe ich da momentan keine Chance.
  Mit Zitat antworten Zitat
Nico B.

Registriert seit: 16. Okt 2006
Ort: Riesa
67 Beiträge
 
Delphi XE7 Enterprise
 
#10

Re: Verknüpfung über IN-Operator mit ADO-Komponenten

  Alt 26. Nov 2009, 13:04
Hallo Leute,

ich habe die direkte Verknüpfung über Datenbankenkomponenten nun aufgegeben.
Letztendlich habe ich das Problem folgendermaßen gelöst:

In einer Query habe ich alle Datensätze der Access-DB aufgerufen und in einer anderen alle Datensätze der MSSQL-DB.
Anschließend bin ich per while-Schleife alle Datensätze der Access-Query durchgegangen und habe geprüft

Delphi-Quellcode:
if not <Access-Querry>.Locate('Name',<MSSQL-Querry>.FieldByName('Name').AsString,[loCaseInSensitive,loPartialKey])
  then
    <Datensatz in eine StringGrid übertragen>
Glücklicherweise war es nicht ganz so langsam wie ich erwartet hatte.

Euch allen aber vielen Dank für eure Mühe.

@Borland: Ich schlage hiermit vor, eine Möglichkeit zu entwickeln, die mein Problem geschickter über Komponenten oder ähnliches löst.
Nico Bäger
  Mit Zitat antworten Zitat
Antwort Antwort


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