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
 
raphaelm

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

Feldtyp von float zu Numeric ändern

  Alt 6. Aug 2010, 14: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
 


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 03:13 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