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.