AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Feldtyp von float zu Numeric ändern
Thema durchsuchen
Ansicht
Themen-Optionen

Feldtyp von float zu Numeric ändern

Ein Thema von raphaelm · begonnen am 6. Aug 2010 · letzter Beitrag vom 9. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2      
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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: Feldtyp von float zu Numeric ändern

  Alt 6. Aug 2010, 15:20
Zitat:
Leider funktioniert das nicht über "alter table <table> alter <field> type <newtype>".
Und warum funktioniert das nicht ... gibt's eventuell irgendwelche hilfreichen Fehlermeldungen?


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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Feldtyp von float zu Numeric ändern

  Alt 6. Aug 2010, 15:22
Hallo,

warum soll es bei Numeric keinen Rundungsdifferenzen geben ???


Heiko
Heiko
  Mit Zitat antworten Zitat
raphaelm

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

AW: Feldtyp von float zu Numeric ändern

  Alt 6. Aug 2010, 22:20
Hallo,

warum soll es bei Numeric keinen Rundungsdifferenzen geben ???


Heiko

Zitat:
... the NUMERIC definition means exactly the precision requested (total number of digits)
Quelle: http://www.firebirdsql.org/manual/mi...ata-types.html

Beim Versuch mit dem alter Befehl kam ein conversion error. Die genaue Meldung poste ich noch mal.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Feldtyp von float zu Numeric ändern

  Alt 6. Aug 2010, 22:26
Wenn man eine Zahl auf 5 Stellen hintern Komma rundet ist diese genauer als eine Genauigkeit auf 7 oder 15 Stellen?
Markus Kinzler
  Mit Zitat antworten Zitat
raphaelm

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

AW: Feldtyp von float zu Numeric ändern

  Alt 9. Aug 2010, 08:40
Wenn man eine Zahl auf 5 Stellen hintern Komma rundet ist diese genauer als eine Genauigkeit auf 7 oder 15 Stellen?
Mir geht es darum:

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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Feldtyp von float zu Numeric ändern

  Alt 9. Aug 2010, 08:47
Da ist der Weg über das neue Feld der richtige.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

AW: Feldtyp von float zu Numeric ändern

  Alt 9. Aug 2010, 08:59
Und wenn du es direkt versuchst, also irgendwie so?
q.SQL.Text := 'ALTER TABLE '+tables[i]+' CHANGE '+fields[j]+' '+fields[j]+' NUMERIC(10,5)';
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Feldtyp von float zu Numeric ändern

  Alt 9. Aug 2010, 09:06
Dann kommt ja der von ihm genannte Fehler
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#10

AW: Feldtyp von float zu Numeric ändern

  Alt 9. Aug 2010, 09:10
ups, das im Text hatte ich grade nicht nochmal mitbekommen
und in dem Quellcode macht er's ja anders.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Aug 2010 um 09:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz