Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Manuelles TField (https://www.delphipraxis.net/17378-manuelles-tfield.html)

Blechwolf 4. Mär 2004 09:25


Manuelles TField
 
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]

Stevie 4. Mär 2004 11:33

Re: Manuelles TField
 
Hi,

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

Blechwolf 4. Mär 2004 11:41

Re: Manuelles TField
 
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...


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 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