![]() |
Datenbank: MSSQL und Access • Zugriff über: ADO-Komponenten
Verknüpfung über IN-Operator mit 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:
SQL-Code:
Wie muss ich das nun mit 2 unterschiedlichen Datenbanken machen?
SELECT * FROM Tabelle1 WHERE Index1 NOT IN (SELECT Index2 FROM Tabelle2)
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
SQL-Code:
Der CommandText des ADODataSetAccess lautet
SELECT NameMSSQL FROM TabelleMSSQL
SQL-Code:
Die DBGrid hat als DataSource die ADODataSourceAccess.
SELECT NameAccess FROM TabelleAccess WHERE NameAccess NOT IN (:NameMSSQL)
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. |
Re: Verknüpfung über IN-Operator mit ADO-Komponenten
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. |
Re: Verknüpfung über IN-Operator mit ADO-Komponenten
Oder du versuchst die MS SQL Server Tabelle in Access einzubinden und dann in Access einen outer join durchzuführen.
|
Re: Verknüpfung über IN-Operator mit ADO-Komponenten
@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? |
Re: Verknüpfung über IN-Operator mit ADO-Komponenten
Zitat:
|
Re: Verknüpfung über IN-Operator mit ADO-Komponenten
@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?
|
Re: Verknüpfung über IN-Operator mit ADO-Komponenten
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. |
Re: Verknüpfung über IN-Operator mit ADO-Komponenten
@nahpets: Da landen wir leider wieder bei dem Problem, dass ich kein Access habe.
|
Re: Verknüpfung über IN-Operator mit ADO-Komponenten
Hallo,
dann wirst Du die Daten wohl oder übel im Arbeitsspeicher zusammensetzen müssen. Mit reinen SQL-Mitteln sehe ich da momentan keine Chance. |
Re: Verknüpfung über IN-Operator mit ADO-Komponenten
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:
Glücklicherweise war es nicht ganz so langsam wie ich erwartet hatte.
if not <Access-Querry>.Locate('Name',<MSSQL-Querry>.FieldByName('Name').AsString,[loCaseInSensitive,loPartialKey])
then <Datensatz in eine StringGrid übertragen> 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 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