Einzelnen Beitrag anzeigen

raphaelm

Registriert seit: 11. Okt 2006
23 Beiträge
 
#1

Feldtyp von float zu Numeric ändern

  Alt 6. Aug 2010, 15:07
Datenbank: Firebird • Version: 1.5.6 • Zugriff über: IBX
Hallo,

ich will die Datenfelder einer Datenbank von Float zu Numeric aufgrund der Rundungsdifferenzen ändern.
Leider funktioniert das nicht über "alter table <table> alter <field> type <newtype>".


Deshalb hier mein Versuch:

Delphi-Quellcode:
var q,q1 : TIBQuery;
    i,j : integer;
    tables : TStringlist;
    fields : Tstringlist;
begin
  q := TIBQuery.Create(nil);
  q1 := TIBQuery.Create(nil);

  tables := TStringlist.Create;
  fields := TStringlist.Create;
  try
    q1.Database := IBDatabase1;
    q.Database := IBDatabase1;
    IBDatabase1.GetTableNames(tables);
    for i := 0 to tables.Count-1 do begin
      IBDatabase1.GetFieldNames(tables[i],fields);
      q1.close;
      q1.SQL.Text := 'select * from '+tables[i];
      q1.open;
      memo1.Lines.Add('Table :'+tables[i]+' - '+inttostr(i+1)+'/'+inttostr(tables.Count-1));
      for j := 0 to fields.Count-1 do begin
        if q1.FieldByName(fields[j]).DataType = ftFloat then begin
          memo1.Lines.Add('Field :'+fields[j]+' - '+inttostr(j+1)+'/'+inttostr(fields.Count-1));
          //try

            q.SQL.Text := 'alter table '+tables[i]+' alter '+fields[j]+' to '+fields[j]+'tmp';
            memo1.Lines.Add(q.sql.text);
            q.ExecSQL;

            q.SQL.Text := 'alter table '+tables[i]+' add '+fields[j]+' NUMERIC(10,5)';
            memo1.Lines.Add(q.sql.text);
            q.ExecSQL;

            q.SQL.Text := 'update '+tables[i]+' set '+fields[j]+' = '+fields[j]+'tmp';
            memo1.Lines.Add(q.sql.text);
            q.ExecSQL;

          //except
          //end;
        end;
      end;
    end;
  finally
    q1.Free;
    q.free;
    fields.Free;
    tables.Free;
  end;
  IBTransaction1.Commit;
end;

Das ganze sieht laut der Ausgabe im Memofeld auch ganz gut aus (die Eingabe der Statements funktioniert über Flame Robbin), allerdings schreibt er die Werte in der Datenbank in andere Felder (anscheinend alphabetisch darauf folgende Felder).

Datenbank: Firebird 1.5.6
Zugriff über: IBX
Delphi 6

Gegenüber einem anderen Ansatz wäre ich auch nicht abgeneigt.
  Mit Zitat antworten Zitat