Thema: Delphi Manuelles TField

Einzelnen Beitrag anzeigen

Blechwolf

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

Manuelles TField

  Alt 4. Mär 2004, 09: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