![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: Dataset
Tabellenfelder 2 versch. Datenbanken vergleichen
Hallo,
ich möchte bestimmte Felder einer Tabelle aus Firebird und einer aus MS-Access miteinander vergleichen und die Unterschiede in einem DBGrid anzeigen. Mein Versuch (mit Fehlermeldung) ist folgender:
Delphi-Quellcode:
Leider mit einer Fehlermeldung des SQL-Servers. Könnte mir Jemand helfen?
procedure TFrameRohwareLager.JvHTButton1Click(Sender: TObject);
begin DatamoduleAuftrag.DataModule2.ADOConnection1.Connected := false; DatamoduleAuftrag.DataModule2.ADOConnection1.connectionstring := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source = ' + ADOConnection + ' ; Persist Security Info=False;'; DatamoduleAuftrag.DataModule2.ADOConnection1.Connected := true; DatamoduleAuftrag.DataModule2.ADOQueryEtikbase.Active := False; DatamoduleAuftrag.DataModule2.ADOQueryEtikbase.SQL.Clear; DatamoduleAuftrag.DataModule2.ADOQueryEtikbase.SQL.Add('select Art-Nr, Format, Numerierung from Artikel T2 INNER JOIN [Material-Stamm] on Artikel.[Mat-Nr] = [Material-Stamm].[Mat-Nr] ORDER BY Artikel.[Mat-Nr]'); DatamoduleAuftrag.DataModule2.ADOQueryEtikbase.Open; DatamoduleRohwareLager.DataModule9.IBDatabaseRohwareBewegung.Connected := true; DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.Close; DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.SelectSQL.Clear; DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.SelectSQL.Add('select ROHWARENR, FORMAT, OBERMATERIAL from ROHWARESTAND T1 on T1.ROHWARENR = T2.[Art-Nr] where T1.FORMAT <> T2.[Format] OR T1.OBERMATERIAL <> T2.[Numerierung] order by ROHWARENR'); DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.Open; end; Danke und Gruß, Luckner |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Wer bringt welchen Fehler?
|
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Beim "JvHTButton1Click" kommt: "Syntaxfehler in JOIN-Operation"
Luckner |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
In der letzten SQL-Anweisung fehlt ja auch der JOIN (T2 ist gar nicht definiert).
|
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Zitat:
|
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Stimmt. Habe es jetzt geändert, aber mit selben Meldung.
Delphi-Quellcode:
procedure TFrameRohwareLager.JvHTButton1Click(Sender: TObject);
begin DatamoduleAuftrag.DataModule2.ADOConnection1.Connected := false; DatamoduleAuftrag.DataModule2.ADOConnection1.connectionstring := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source = ' + ADOConnection + ' ; Persist Security Info=False;'; DatamoduleAuftrag.DataModule2.ADOConnection1.Connected := true; DatamoduleAuftrag.DataModule2.ADOQueryEtikbase.Active := False; DatamoduleAuftrag.DataModule2.ADOQueryEtikbase.SQL.Clear; DatamoduleAuftrag.DataModule2.ADOQueryEtikbase.SQL.Add('select Art-Nr, Format, Numerierung from Artikel T2 INNER JOIN [Material-Stamm] on Artikel.[Mat-Nr] = [Material-Stamm].[Mat-Nr] ORDER BY Artikel.[Mat-Nr]'); DatamoduleAuftrag.DataModule2.ADOQueryEtikbase.Open; DatamoduleRohwareLager.DataModule9.IBDatabaseRohwareBewegung.Connected := true; DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.Close; DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.SelectSQL.Clear; DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.SelectSQL.Add('select ROHWARENR, FORMAT, OBERMATERIAL from ROHWARESTAND T1 LEFT JOIN T2 on T1.ROHWARENR = T2.Art-Nr where T1.FORMAT <> T2.Format OR T1.OBERMATERIAL <> T2.Numerierung order by ROHWARENR'); DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.Open; end; |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Hallo Frickler,
Delphi-Quellcode:
funktioniert. Benutze schon für andere Abfragen und greife mit der ADO-Komponnente direkt auf eine ACCESS-Datenbank. Für die JOIN-Anweisung habe ich die eckigen Klammern auch ausgelassen.
DatamoduleAuftrag.DataModule2.ADOQueryEtikbase.Active := False;
DatamoduleAuftrag.DataModule2.ADOQueryEtikbase.SQL.Clear; DatamoduleAuftrag.DataModule2.ADOQueryEtikbase.SQL.Add('select Art-Nr, Format, Numerierung from Artikel T2 INNER JOIN [Material-Stamm] on Artikel.[Mat-Nr] = [Material-Stamm].[Mat-Nr] ORDER BY Artikel.[Mat-Nr]'); DatamoduleAuftrag.DataModule2.ADOQueryEtikbase.Open; Luckner |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
(hab ich eigentlich schon mal gesagt, was ich von diesen Einzeilern halte?)
Hab ich es übersehen? Das Datamodule9 hat gar keine DB mit dem es sich verbindet? Und diese eckigen Klammern sind eine access-Spezialität. Aber wemm MS und DBs auf einander treffen gibt es die eine oder andere Eigenheit. Sonst könnte man ja die DB problemlos austauschen. Wie wäre es wenn Du erst versuchst die Verbindung zu einer Datenbank auzubauen, und dann die zu der anderen? Dann ist unter Umständen die Fehlersuche etwas einfacher? Gruß K-H |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Hast du die SQL-Statements schon ohne Delphi geprüft?
Es wäre auch gut zu wissen, welches SQL-Statement den Fehler bringt. Was mit auffällt:
Code:
Das müsste mMn in eckigen Klammern stehen.
select Art-Nr
|
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Dazwischen JOIN T2 fehlt der Tabellenname.
Das muss irgendwie so aussehen: JOIN Tabellenname T2 Wenn die Tabellen in beiden Datenbanken den gleichen Namen haben, wird's wohl Join Artikel T2 heißen müssen. Wahrscheinlich wäre es dann dashier:
Delphi-Quellcode:
DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.SelectSQL.Add('select ROHWARENR, FORMAT, OBERMATERIAL');
DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.SelectSQL.Add('from ROHWARESTAND T1'); DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.SelectSQL.Add('LEFT JOIN Artikel T2'); DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.SelectSQL.Add('on T1.ROHWARENR = T2.Art-Nr'); DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.SelectSQL.Add('where T1.FORMAT <> T2.Format'); DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.SelectSQL.Add('OR T1.OBERMATERIAL <> T2.Numerierung'); DatamoduleRohwareLager.DataModule9.IBDataSetRohwareBestand.SelectSQL.Add('order by ROHWARENR'); |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Das grosse Problem ist, dass ich auf die Firebird-Tabelle mit TDataset zugreife und auf die ACCESS mit einer ADO-Komponnente. Die Verknüpfung bekommen ich nicht hin.
Verbindung zu Firebird-Datenbank geht über "DatamoduleRohwareLager.DataModule9.IBDatabaseRohw areBewegung.Connected := true;" Die einzelnen SQL-Statemens funktionieren für sich alleine gut. Luckner. |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
In der Regel dürfte es nicht funktionieren, über zwei verschiedene Datenbanken hinweg eine SQL-Abfrage zu machen. Die beiden wissen ja nichts voneinander.
|
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Zitat:
Die Statements aus dem Eröffnungsthread sehen jedenfalls unvollständig aus, ein Gemisch aus Join und Where Syntax. Falls wirklich Access mit Firebird gejoined werden soll, dann würde ich das (wenn es leider nun mal da ist) in Access selbst machen: - FB Tabelle oder Viewe in Access verlinken per ODBC - Abfrage in Access aus Access Tabelle und Firebird Link erzeugen. - Abfrage in der Anwendung öffnen (oder eben zur Probe gleich in Access) |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Bitte erkläre mal, was Du genau vorhast, irgendwie scheine ich das noch nicht so recht begriffen zu haben.
Willst Du quasi sowas machen?
SQL-Code:
Wenn ja, dann führe Dir mal diese Anleitung zu Gemüte:
select t1.ROHWARENR, t1.FORMAT, t1.OBERMATERIAL
from Accessdatenbank.ROHWARESTAND t1 LEFT JOIN Firebirddatenbank.Artikel t2 on t1.ROHWARENR = t2.Art-Nr where t1.FORMAT <> t2.Format'); OR t1.OBERMATERIAL <> t2.Numerierung order by ROHWARENR ![]() Beim Zugriff über ADO / ODBC könnte das, sofern ein entsprechender Treiber für Firebird eingerichtet ist, funktionieren. Jobo beschreibt ja, wie es gehen sollte. |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Zitat:
z.B. Cross-Server-Tabelle > Foreign Data Wrappers (permanent DB Link) ![]() ![]() Cross-Server-Link > DB Link (temporär, old style) ![]() |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Zitat:
|
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Zitat:
FireDAC kann es ![]() ![]() Aber wie gesagt, mindestens eine der beiden DBMS kann sowas bestimmt auch serverseitig. z.B. in MS-Access eine Verbindung zu Firebird aufbauen und dann im MS-Access die SELECTs zu beiden Datenbanken ausführen. Bei den Foreign Data Wrappers in Postgres kannst du sogar beide SELECTs zusammen in einem JOIN ausführen und den "Vergleich" direkt im SQL und nicht erst clientseitig manuell erledigen. |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Oh! Ich bin überrascht!
Ist aber dann dennoch nicht die von Dir genannte Technik einer heterogenen Datenbankverbindung zwischen verschiedenden DBMS. |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Mein Problem ist folgendes:
Es gibt 2 Programme. Das 1. basiert auf Access und es werden bestimmte Artikel in einer Tabelle eingetragen. Das 2. Programm ist auf Firebird aufgebaut. Es werden einige Artikel aus Programm 1 in 2 übernommen und gegebenfalls ergänzt. Obwohl sich die Artikel in Programm 1 nicht mehr ändern sollte, passiert es doch mal. Jetzt wäre es hilfreich, wenn man in bestimmten Abständen, eine Überprüfung starten könnte um die beiden Tabellen miteinander zu überprüfen, ob Artikel 1 immer noch die alten Eigenschaften hat. Möglicherweise werde ich die Tabelle aus Access erst in eine temporäre Firebird-Tabelle kopieren und dann die Überprüfung starten. Dann kann ich immer noch die Tabelle leeren. Gruß, Luckner |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Access kann von Haus aus andere Datenbanken importieren bzw. verknüpfen. Das richtet man sich einmal ein.
Dann kann man auf alle so verfügbaren Tabellen (egal aus welcher DB sie stammen) per SQL (gemeinsam) zugreifen. Sinnvoll hielte ich es für Deine Situation: In Access Verknüpfung zur Firebird-Datenbank aufbauen und Konfiguration speichern. In Access 'ne View einrichten, die die von Dir gewünschte Datenprüfung enthält. Im Programm dann "nur noch" ein select * from View_zur_Pruefung und "fertig ist die Laube". |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Du scheinst ja den Zugriff eher aus dem Firebird heraus zu benötigen.
Aber Firebird scheint da (standardmäßig) nur mit anderen Firebirds reden zu können und mag keine fremden DBMS. ![]() Die andere Richtung geht wohl (laut Delphi.Narium). Und LocalSQL wäre wohl auch nichts für dich. |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Access ist ein recht schönes Frontend für Datenbanken, wenn man nicht mehr als 64k Datensätze betrachtet. Einmalige oder seltene Aktionen sind dort recht gut aufgehoben.
Gruß K-H |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Vor allem auch für den Nichtprofi recht gut zu handhaben.
Und man muss damit ja nichtmal Accessdatenbanken nutzen. Man kann auf alles an Datenbanken zugreifen, auf das man via ADO / ODBC irgendwie zugreifen kann. |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Ich bin kein Freund von Access, aber verschiedene Systeme anzapfen kann es wirklich einfach in MS Manier. Mit einigen Klicks ist die Verknüpfung erledigt, keine Zeile Code nötig.
Noch ein paar Klicks und man hat seine Vergleichsabfrage, wahlweise die positiven oder negativen Fälle ausgegeben. Noch ein paar Klicks und man hat es vielleicht sogar sinnvoll in einem Makro verpackt, ohne eine einzige Variable zu deklarieren oder sonst irgendwelchen Code zu schreiben. (und wenn man mag, kann man es auch per COM Server alles programmieren) - lege eine ODBC Verknüpfung zu meiner Firebird Tabelle xy an (wahlweise vielleicht lieber vorgefilterter view) - Erzeuge eine Abfrage mit SQL = ... - Starte die Abfrage und exportiere das Ergebnis oder was auch immer Programmieren wäre eigentlich erst nötig, wenn es tatsächlich variable Parameter gibt wie wählbarer Datumsbereich, wechselnde Datenquellen oder Ergebnis Export Ziele, fallweise Sonderprüfung bei Fehlern, Plausibilitätsauffälligkeiten, ... Ich denke ähnlich wie p80286 schrieb, Probleme gibt es erst in speziellen Situationen, die 64k war aber Excel früher mal oder? M.E. ist die Schwäche (oder besser eine der Schwächen ) von Access nicht die Datenmenge, sondern (ausgeprägter) Mehrbenutzerbetrieb. Es dürfen ruhig ein paar Millionen Records sein, aber bitte nicht alle dran rumfummeln. Vielleicht täusche ich mich auch. Vielleicht ist es auch eine strategische Sache. Wenn das Ende der Access Anwendung sowieso absehbar ist, macht man die Sache lieber in Firebird. |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Zitat:
Gruß K-H |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Zitat:
In solchen Zusammenhängen kann ich mir gut vorstellen, dass Abfragen einfach nur die halbe Wahrheit liefern, also im Prinzip unbrauchbar sind. Ich hatte dann vielleicht Glück, dass auch ohne echten PK immer alles glatt lief. Feldnamen ohne die doofen eckigen Klammern sind in dem Zusammenhang auch ein Problem, also innerhalb der Access Abfrage. * Alles ohne Gewähr und ggF. veraltet. |
AW: Tabellenfelder 2 versch. Datenbanken vergleichen
Das Programm mit der ACCESS-Datenbank wird langsam eingestampft. Deshalb sollte dieser Vergleich schon von der Seite der Firebird-Datenbank sein. Ich denke, dass mit einer Temp-Tabelle in Firebird das einfacher zu machen ist. Es sind nur 3-4 Felder, die ich übertragen muss.
Gruß, Luckner |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 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-2025 by Thomas Breitkreuz