![]() |
Datenbank: Firebird • Version: 1.5.6 • Zugriff über: IBX
Feldtyp von float zu Numeric ändern
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. |
AW: Feldtyp von float zu Numeric ändern
Zitat:
Muß das nur einmal passieren? - Tabellendaten exportieren - die Tabelle leeren - den Typ ändern (notfalls kann man immernoch das Feld löschen und neu erstellen) - die alten Daten wieder importieren |
AW: Feldtyp von float zu Numeric ändern
Hallo,
warum soll es bei Numeric keinen Rundungsdifferenzen geben ??? Heiko |
AW: Feldtyp von float zu Numeric ändern
Zitat:
Zitat:
![]() Beim Versuch mit dem alter Befehl kam ein conversion error. Die genaue Meldung poste ich noch mal. |
AW: Feldtyp von float zu Numeric ändern
Wenn man eine Zahl auf 5 Stellen hintern Komma rundet ist diese genauer als eine Genauigkeit auf 7 oder 15 Stellen?
|
AW: Feldtyp von float zu Numeric ändern
Zitat:
Wenn ich in ein Float Feld z.B 4711.90 schreibe steht nachher 4711.899902 drin (aufgrund der binären Representation) Wenn ich das ganze in ein Numeric(10,5) Feld schreibe, stehen nachher auch exakt die 4711.90 in dem Feld. Hier noch die Meldung für den alter Befehl: Conversion from base type FLOAT to BIGINT is not supported |
AW: Feldtyp von float zu Numeric ändern
Da ist der Weg über das neue Feld der richtige.
|
AW: Feldtyp von float zu Numeric ändern
Und wenn du es direkt versuchst, also irgendwie so?
Delphi-Quellcode:
q.SQL.Text := 'ALTER TABLE '+tables[i]+' CHANGE '+fields[j]+' '+fields[j]+' NUMERIC(10,5)';
|
AW: Feldtyp von float zu Numeric ändern
Dann kommt ja der von ihm genannte Fehler
|
AW: Feldtyp von float zu Numeric ändern
ups, das im Text hatte ich grade nicht nochmal mitbekommen
und in dem Quellcode macht er's ja anders. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz