Einzelnen Beitrag anzeigen

Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#12

Re: [SQL] Datensatz kopieren

  Alt 3. Dez 2008, 14:46
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
Jens
  Mit Zitat antworten Zitat