AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Manuelles TField

Ein Thema von Blechwolf · begonnen am 4. Mär 2004 · letzter Beitrag vom 4. Mär 2004
Antwort Antwort
Blechwolf

Registriert seit: 9. Sep 2003
Ort: Aachen
126 Beiträge
 
Delphi 7 Professional
 
#1

Manuelles TField

  Alt 4. Mär 2004, 10:25
Salut,

ich habe mal 'ne Frage...

Ich darf zur Zeit ein Progrämmchen entwickeln, das mir die Daten aus einer Access-Datenbank in eine andere Access-Datenbank migriert.
Da die neue Datenbank eine andere Struktur hat als die alte, suche ich mir Daten aus der alten Tabelle mittels SELECT Statement raus und bastele mir dann ein INSERT INTO Statement zusammen.
Das Problem liegt jetzt im Aufbau des INSERT Strings. Dafür verwende ich die folgende Prozedur:

Tabelle nimmt den Namen der Tabelle in die ich einfügen will auf, FelderAlt sind die Typen und Daten der alten DB und FelderNeu die Namen der Neuen Felder.

Delphi-Quellcode:
BuildInsertString(Tabelle : String; FelderAlt : Array of TField; FelderNeu : Array of String):String;
var
  Min : Integer;
  Max : Integer;
  i : Integer;
  ResString : String;
begin
  Min := Low(FelderAlt);
  Max := High(FelderNeu);

  ResString := 'INSERT INTO '+Tabelle+' (';
  for i := Min to Max-1 do
    ResString := ResString + FelderNeu[i]+',';
  ResString := ResString + FelderNeu[Max]+')';

  ResString := ResString + ' VALUES (';

  for i := Min to Max do
    begin
      case FelderAlt[i].DataType of
        // String-Type und Datum/Zeit Felder werden in " eingefügt
        ftString, ftDate, ftTime, ftDateTime,
        ftMemo, ftFmtMemo, ftFixedChar, ftWideString :
          begin
            If FelderAlt[i].IsNull then
              ResString := ResString + 'NULL,'
            else
              ResString := ResString + '"' + FelderAlt[i].AsString+'",';
          end;
        // Zahlwerte ohne "
        ftSmallint, ftInteger, ftWord, ftFloat,
        ftBytes, ftVarBytes, ftAutoInc, ftLargeInt :
          begin
            if FelderAlt[i].IsNull then
              ResString := ResString + 'NULL,'
            else
              ResString := ResString + FelderAlt[i].AsString+',';
          end;
        // Bool-Werte werden intern umgewandelt und dann als String ohne " eingefügt
        ftBoolean :
          begin
            if FelderAlt[i].IsNull then
              ResString := ResString + 'NULL,'
            else
              ResString := ResString + BoolToStr(FelderAlt[i].AsBoolean)+',';
          end;
      else
        raise Exception.Create('Unbekannter Feldtyp '+FelderAlt[i].Name);
      end;
    end;

  Result := Copy(ResString,0,Length(ResString)-1);
  Result := ResString + ');';
end;
Da ich manche Felder aber nicht aus der alten DB rausbekomme (Verweise etc.), wollte ich mir nun eigene Felder erzeugen, die ich mit als Übergabe verwenden kann.

Delphi-Quellcode:
var
  IDField : TWordfield;

[...schnipp...]

IDField := TWordField.Create(Application);
IDField.AsInteger := Counter;

[...schnipp...]

BuildInsertString('T_Adressen',
  [IDField,FieldByName('SSTRASSE'),FieldByName('SPLZ'),FieldByName('SORT'),
   FieldByName('STELEFON'),FieldByName('SEMAIL'),FieldByName('SFAX'),
   FieldByName('HANDY'),FieldByName('HSTRASSE'),FieldByName('HPLZ'),
   FieldByName('HORT'),FieldByName('HTELEFON'),FieldByName('HFAX')],
  ['REF_PersonID','Strasse','PLZ','Ort','Telefon','EMail','Fax','Mobil',
   'HeimStrasse','HeimPLZ','HeimOrt','HeimTelefon','HeimFax']);
IDField ist ein von mir erzeugtes Feld, das eine laufenden Nummer abhängig von der Nr. des Datensatzes erhält.
Und genau hier liegt das Problem. Ich kann nicht einfach so ein T(*)Field erzeugen, da dieses einem DataSet zugeordnet sein muß.

Allerdings kann der Aufruf von BuildInsertString auch nur mit Feldern aus der DB erfolgen.

Meine Frage ist jetzt, wie kann ich mir manuell ein TField erzeugen, das möglichst nicht irgendwie an der DB dranhängt ?

Grüße

Wolf

[EDIT]Zeilenumbrüche eingefügt[/EDIT]
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (engl. Sprichwort)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

Re: Manuelles TField

  Alt 4. Mär 2004, 12:33
Hi,

nimm doch einfach ein ClientDataSet, pack einem Datensatz mit einem Feld rein, und übergeb das an deine Funktion.
Stefan
  Mit Zitat antworten Zitat
Blechwolf

Registriert seit: 9. Sep 2003
Ort: Aachen
126 Beiträge
 
Delphi 7 Professional
 
#3

Re: Manuelles TField

  Alt 4. Mär 2004, 12:41
Hm, das ist gar nicht so schlecht. Das könnte funktionieren.
Für jeden Typ genau ein Feld, das ich dann entsprechend belege...
Ja, ich glaube das geht. Danke...
Ein Schiff im Hafen ist sicher. Aber dafür werden Schiffe nicht gebaut. (engl. Sprichwort)
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:52 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