Seite 1 von 1

Satz duplizieren

Verfasst: Fr, 25. Mär 2022 10:00
von Manfred
ich möchte gerne einen Satz duplizieren in einer Tabelle.
Es sollen aber nicht alle Inhalte im Ziel bleiben, einige sollen geleert werden, ein anderes einen neuen Inhalt bekommen.
Einen Satz von eienr Tabelle in eine andere Tabelle kopieren habe ich schon gemacht, aber wie dupliziert man einen Satz, wenn einige Felder im Ziel anders sein müssen?
Ich möchte aus Übersicht nicht alle Felder einzeln angeben müssen, die kopiert werden sollen. Das wären zu viele die angegeben werden müssen. Geht das auch ohne?

Re: Satz duplizieren

Verfasst: Fr, 25. Mär 2022 10:09
von nightcrawler
SQL?

Code: Alles auswählen

INSERT INTO meinetabelle (ID, Feld1, Feld2, Feld3, Feld4)
SELECT newid(), Feld1, 'hallo welt', Feld3, Feld4 FROM meinetabelle
WHERE ID=42

Re: Satz duplizieren

Verfasst: Fr, 25. Mär 2022 10:11
von Manfred
das ist ja das, was ich versuche zu verhindern. Alle Felder anzugeben. So kannte ich das auch.

Re: Satz duplizieren

Verfasst: Fr, 25. Mär 2022 10:25
von Manfred
ich hätte auch kein Problem den Satz vorher in eine temporär Tabelle zu schreiben, umzuändern und dann in die Zieldatei anzuhängen. Aber ich bekomme das unter dem ADS nicht hin. Wie sieht der Befehl aus, der in eine temporäre Tabelle schreibe?

Re: Satz duplizieren

Verfasst: Fr, 25. Mär 2022 10:34
von Jan
Manfred,

und wenn Du den Originalsatz in ein DataObject schreibst? Eine Zeile Code. Und manipulieren kannst Du die Werte dann, bevor Du die mit einer weiteren Zeile Code in den neuen Satz schreibst.

Jan

Re: Satz duplizieren

Verfasst: Fr, 25. Mär 2022 10:47
von Manfred
OK,
mir fehlte der Hinweis das man beim ADS mit dem # arbeiten muß um eine temporäre Tabelle zu erzeugen.
Jetzt komme ich zumindest weiter. Bin aber trotzdem noch offen für weitere Vorschläge dazu.

Re: Satz duplizieren

Verfasst: Fr, 25. Mär 2022 11:03
von Tom
Du kannst doch das INSERT-Statement in einer kleinen Loop zusammensetzen, die FCount-mäßig die Feldnamen verwendet, außer in den Fällen, wo ein Feld mit einem bestimmten anderen Wert besetzt werden muss.

Re: Satz duplizieren

Verfasst: Fr, 25. Mär 2022 11:30
von Marcus Herz
Falls du ein ADD hast, da hab ich neine SQL Funktion geschrieben, welche das abdeckt, was du brauchst:
Der AUfruf erfolgt so:

Code: Alles auswählen

declare @str string;
@str = 'insert into ziel ( '+ CopyFieldsByName('ziel', 'source', 'exclude field list') + ')
	select '+ CopyFieldsByName('ziel', 'source','exclude field list') + '
	from source  
	where ....   ;';
	
execute immediate @str;	
Ziel und Source können ident sein, müssen aber nicht, Es werden nur Felder gelistet, deren Namen in beiden Tabellen vorkommen. Eine Typprüfung erfolgt nicht.
die Exclue Fieldlist muss kommasepariert sein UND mit EINEM Komma beginnen und enden, z.B. ',NAME,'
Die Fieldlist kann auch NULL sein

Code: Alles auswählen

CREATE FUNCTION CopyFieldsByName 
   ( 
   ziel CHAR ( 20 ),
    quelle CHAR ( 20 ),
    exclude CICHAR ( 100 )
   )
   RETURNS STRING
BEGIN
declare @table cursor;
declare @str string;

open @table as
select name from system.columns
  where parent = ziel
  and name in (select name from system.columns where parent = quelle )
  and not name like  '@_@_%' ESCAPE '@'
  and not name in ( '_pRID', 'RID' )
  and (exclude is null or position(','+trim(name)+',' in exclude ) = 0)
 ;

@str = '';
while fetch @table do
  @str = @str +','+ alltrim(@table.name);
end while;
close @table;
return @str;

END;

Re: Satz duplizieren

Verfasst: Sa, 26. Mär 2022 9:35
von Manfred
da es jetzt speziell um den ADS geht, geht es hier weiter.
https://www.xbaseforum.de/viewtopic.php ... 44#preview