Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Advantage, SQL und BatchMove (https://www.delphipraxis.net/125005-advantage-sql-und-batchmove.html)

oldie 28. Nov 2008 20:32

Datenbank: Advantage • Version: 9 • Zugriff über: SQL

Advantage, SQL und BatchMove
 
Hallo Zusammen,

ich bin dabei ein Programm von Paradox/BDE auf Advantage umzustellen.

Ich habe über die Suchfunktion keine Hinweise auf das funktionieren von Batchmove in Verbindung mit einer SQL-Abfrage gefunden.

Ich möchte das Ergebnis einer SQL-Abfrage mit BatchMove+batAppendUpdate in eine Tabelle schreiben. Leider läßt sich der AdsBatchMove.Soure die AdsQuery nicht zuordnen. Unter der BDE hat das funktioniert. Es werden von AdsBatchMove.Soure nur TAdsTable akzeptiert.

Hat jemand einen Vorschlag?

mkinzler 28. Nov 2008 20:35

Re: Advantage, SQL und BatchMove
 
Kopiere die Daten manuell von einem DataSets in das andere

oldie 28. Nov 2008 21:18

Re: Advantage, SQL und BatchMove
 
daran habe ich auch schon gedacht.

Ich müßte aber vorher bei jedem Datensatz prüfen ob er schon in der Zieltabelle enthalten ist. Diesen dann löschen und den neuen eintragen.

Ich denke da ist die Datenbank etwas beschäftigt. Oder gibt es dafür einen SQL-Befehl der das erledigen kann?

mkinzler 28. Nov 2008 21:38

Re: Advantage, SQL und BatchMove
 
Statt zu Löschen, könntest du auch ändern

Leonard 28. Nov 2008 22:08

Re: Advantage, SQL und BatchMove
 
Hallo,

Zitat:

Zitat von oldie
Oder gibt es dafür einen SQL-Befehl der das erledigen kann?

da du ja scheinbar die Version 9 des ADS verwendest, könnte dir der neue SQL Befehl merge weiterhelfen.

Tobias

oldie 30. Nov 2008 16:55

Re: Advantage, SQL und BatchMove
 
jetzt habe ich mich mit dem Merge Befehl intensiv beschäftigt und auch im Internet nach Beispielen gesucht. Meiner Meinung nach müßte folgender Befehl funktionieren

Delphi-Quellcode:
MERGE AdsTabZiel AS ta USING AdsTabQuelle AS tb ON ( ta.Index = tb.Index)
WHEN NOT MATCHED THEN INSERT (Index , Name) VALUES (tb.Index+ tb.Name)
WHEN MATCHED THEN UPDATE SET ta.Index = tb.Index
tut er aber nicht. Der Fehler muß in der Definition von

WHEN NOT MATCHED THEN INSERT (Index , Name) VALUES (tb.Index+ tb.Name)

WHEN NOT MATCHED THEN INSERT VALUES (tb.Index+ tb.Name)

WHEN NOT MATCHED THEN INSERT (tb.Index+ tb.Name)

liegen. Alle drei Varianten gehen nicht

Was mache ich falsch?

Leonard 1. Dez 2008 08:54

Re: Advantage, SQL und BatchMove
 
Zitat:

Zitat von oldie

Delphi-Quellcode:
MERGE AdsTabZiel AS ta USING AdsTabQuelle AS tb ON ( ta.Index = tb.Index)
WHEN NOT MATCHED THEN INSERT (Index , Name) VALUES (tb.Index+ tb.Name)
WHEN MATCHED THEN UPDATE SET ta.Index = tb.Index

In der Insert Anweisung sprichst du die Felder Index und Name an
SQL-Code:
INSERT (Index , Name)
übergibst dann aber im Values Teil nur einen Wert
SQL-Code:
(tb.Index+ tb.Name)
Wenn Index und Name in 2 Felder sollen, dann müsste das so aussehen
SQL-Code:
(tb.Index, tb.Name)
und insgesamt dann so
SQL-Code:
MERGE AdsTabZiel AS ta USING AdsTabQuelle AS tb ON ( ta.Index = tb.Index)
WHEN NOT MATCHED THEN INSERT (Index , Name) VALUES (tb.Index, tb.Name)
WHEN MATCHED THEN UPDATE SET ta.Index = tb.Index
Wobei ich noch denke, dass die Update Anweisung
SQL-Code:
UPDATE SET ta.Name = tb.Name
heissen sollte oder? Das ist aber eine inhaltliche Sache und sollte mit der Ausführbarkeit der gesamten Anweisung nichts zu tun haben.

Tobias

oldie 1. Dez 2008 18:46

Re: Advantage, SQL und BatchMove
 
Hallo Tobias,

danke für Deine detaillierte Erklärung.

Mein Beispiel funktioniert leider trotzdem nicht. Bin fast verzweifelt. Ich wollte mein Beipiel einfach gestalten und habe die Feldnamen Index und Name verwendet. Dann bin ich darauf gekommen, dass man nie einen Feldnamen mit Index und Name verwenden darf. Nachdem ich die Felder umbenannt habe funktioniert Deine berichtigte Version.

joachimd 1. Dez 2008 20:05

Re: Advantage, SQL und BatchMove
 
Zitat:

Zitat von oldie
habe die Feldnamen Index und Name verwendet

Feldnamen, die reservierten Wörtern entsprechen, packt man in Quotes "Index" oder [Index]


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 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