So, nun geht es.
Ich habe folgendes gemacht:
1. Eine Funktion, die mir eine Liste der Tabellenfelder zurückliefert. Dabei kann die Funktion auch Feldnamen durch etwas anderes ersetzen:
Delphi-Quellcode:
function xxx.GetFieldList(strTable:
String; trans : FBTransaction; ReplaceFields, Replace :
Array Of String):
string;
var c : FBCommand;
dr : FBDataReader;
i : Integer;
bReplaced : Boolean;
strField :
String;
begin
{Gibt eine Liste der Felder der Tabelle zurück und ersetzt dabei
ggf. die angegebenen String.}
if length(ReplaceFields) <> length(Replace)
then
raise(
Exception.Create('
Die Anzahl der Elemente in ReplaceFields und Replace muss gleich sein!'));
result := '
';
c := FBCommand.Create('
SELECT TRIM(RDB$FIELD_NAME) FROM RDB$RELATION_FIELDS WHERE UPPER(RDB$RELATION_NAME) = UPPER(@TABELLE) ORDER BY RDB$FIELD_POSITION', fbCon);
try
c.Transaction := trans;
c.Prepare;
c.Parameters.add('
@TABELLE', fbdbtype.VarChar).Value := strTable;
dr := c.ExecuteReader;
while dr.
Read do
begin
strField := dr.GetString(0);
bReplaced := False;
i := Low(ReplaceFields);
while (
not bReplaced)
and (i <= high(ReplaceFields))
do
begin
if ReplaceFields[i] = strField
then
begin
strField := Replace[i];
bReplaced := True;
end;
inc(i);
end;
if result <> '
'
then
result := result + '
,';
result := result + strField;
end;
{while dr.read}
dr.Close;
finally
c.Free;
dr.Free;
end;
end;
Meine Routine zum kopieren sieht jetzt so aus (Auszug):
Delphi-Quellcode:
strFields := GetFieldList('Buchungen', trans, [], []);
strFields2 := GetFieldList('Buchungen', trans, ['ID', 'DATUM'], ['CAST(@IDZIEL AS INTEGER) AS ID', 'CAST(@DATUM AS DATE) AS DATUM']);
c.CommandText := 'INSERT INTO BUCHUNGEN ' +
'(' + strFields + ') ' +
' SELECT ' + strFields2 +
' FROM BUCHUNGEN WHERE ID = @IDQUELL';
c.Prepare;
c.Parameters.Add('@IDZIEL', fbdbtype.Integer).Value := TObject(iID);
c.Parameters.add('@IDQUELL', fbdbtype.Integer).Value := TObject(iBuchungID);
c.Parameters.add('@DATUM', fbdbtype.Date).Value := TObject(dDatum);
c.ExecuteNonQuery;
trans.Commit;
Kritik ist willkommen.
Gruß,
Jens