Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Tabellenfelder 2 versch. Datenbanken vergleichen (https://www.delphipraxis.net/195877-tabellenfelder-2-versch-datenbanken-vergleichen.html)

Luckner 3. Apr 2018 13:26

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:
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;
Leider mit einer Fehlermeldung des SQL-Servers. Könnte mir Jemand helfen?
Danke und Gruß,
Luckner

DeddyH 3. Apr 2018 13:34

AW: Tabellenfelder 2 versch. Datenbanken vergleichen
 
Wer bringt welchen Fehler?

Luckner 3. Apr 2018 13:54

AW: Tabellenfelder 2 versch. Datenbanken vergleichen
 
Beim "JvHTButton1Click" kommt: "Syntaxfehler in JOIN-Operation"

Luckner

DeddyH 3. Apr 2018 13:56

AW: Tabellenfelder 2 versch. Datenbanken vergleichen
 
In der letzten SQL-Anweisung fehlt ja auch der JOIN (T2 ist gar nicht definiert).

Frickler 3. Apr 2018 13:59

AW: Tabellenfelder 2 versch. Datenbanken vergleichen
 
Zitat:

Zitat von Luckner (Beitrag 1398014)
Beim "JvHTButton1Click" kommt: "Syntaxfehler in JOIN-Operation"

Luckner

Unterstützt Firebird denn die Angabe von Feldnamen in eckigen Klammern? Ich dache, das wäre eine Access-Spezialität, die keine andere Datenbank hat.

Luckner 3. Apr 2018 14:08

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;

Luckner 3. Apr 2018 14:13

AW: Tabellenfelder 2 versch. Datenbanken vergleichen
 
Hallo Frickler,
Delphi-Quellcode:
  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;
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.

Luckner

p80286 3. Apr 2018 14:15

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

Jasocul 3. Apr 2018 14:17

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:
select Art-Nr
Das müsste mMn in eckigen Klammern stehen.

Delphi.Narium 3. Apr 2018 14:22

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');


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:38 Uhr.
Seite 1 von 3  1 23      

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