Einzelnen Beitrag anzeigen

Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#5

Re: Field-Struktur/Namen zur Laufzeit ändern

  Alt 9. Feb 2006, 10:23
Hallo Deep Blue,

mit AppFld habe ich dieses Problem ohne SQL-Nutzung gelöst. Man kann natürlich auch vor der Schleife "Tabellenstruktur übernehmen" Felder einfügen. Das macht aber nur Sinn, wenn man den Primärindex ändern will. Bei mir beginnt jede Datenbank mit einem Feld ID vom Typ ftAutoInc, der als Primärindex dient.

Delphi-Quellcode:

  // Strukturanpassung von Adressen.DB (Freifeld1..4)
  UP_DBActiv(Tab2, SessN, DataPath, fnAdr); // TTable Tab2 öffnen
  if Tab2.FindField('Freifeld1') = nil then begin // wenn Feld Freifeld1 nicht gefunden
    AppFld(Tab2, 'Freifeld1', ftString, 60); // DB-Struktur mit neuen Namen ergänzen
    AppFld(Tab2, 'Freifeld2', ftString, 60);
    AppFld(Tab2, 'Freifeld3', ftString, 60);
    AppFld(Tab2, 'Freifeld4', ftString, 60);
    // danach Index für DB neue aufbauen
    UP_DBActiv(Tab1, SessN, SysPath, fnDBIdx);
    FAllgUP2.UP_GenIdx(Tab1, Tab2, ChangeFileExt(fnAdr, ''));
    Tab1.Close;
  end;
  Tab2.Close;



procedure TFUPK.AppFld(tab : TTable; fldname : string; fldtyp : TFieldType; fldsize : integer);
var i:Integer;
    alterTabellenName:String;
    ztab, qtab : TTable;
begin
  tab.Active := false;
  qtab := TTable.Create(self);
  ztab := TTable.Create(self);
  try
    qtab.DatabaseName := tab.DatabaseName;
    qtab.TableName := tab.TableName;
    qtab.SessionName := SessN;
    qtab.Active := true;
    FInput.lblRecNo.Caption := IntToStr(qtab.RecordCount) +cblk+ FU(cdatensaetze);

    ztab.DatabaseName := tab.DatabaseName;
    ztab.SessionName := SessN;
    ztab.TableType := ttParadox;
    ztab.TableName := 'tmp_' + tab.TableName;

    ztab.FieldDefs.Clear;
    //Tabellenstruktur übernehmen
    for i:=0 to qTab.Fields.Count-1 do
      ztab.FieldDefs.Add( qTab.Fields[i].FullName,
                          qTab.Fields[i].DataType,
                          qTab.Fields[i].Size,
                          qTab.Fields[i].Required);
    try
      //neue Felder hinzufügen
      ztab.FieldDefs.Add(fldname, fldtyp, fldsize, false);
      ztab.CreateTable;

      qtab.Active:=false;
      ztab.Active:=false;

      // FInput nur für Anzeige eines Textes
      FInput.Tag := 102;
      FInput.lblHinw102.Caption := FU(cdaten)+cstruktur +cblk+ cvon +cblk+ qtab.TableName +cblk+ cwird +cblk+ cangepasst;
      FInput.lblRecNoText.Caption := FU(cbitte) +cblk+ cwarten +cblk+ c4pkt+c4pkt;
      FInput.Show;

      Batchmove1.Mode:=batAppend;
      i := Batchmove1.RecordCount;
      Batchmove1.Source := qtab;
      Batchmove1.Destination := ztab;
      Batchmove1.Execute;
      FInput.Hide;

    // Showmessage('ztab : ' + ztab.TableName); // nur für Test
    // Showmessage('qtab: ' + qtab.TableName);
      alterTabellenName:=qTab.TableName;

      qTab.Active:=false;
      qTab.DeleteTable;
      ztab.RenameTable(alterTabellenName);
      ztab.Active:=False;
    except
      qtab.Active:=false;
      ztab.Active:=false;
    end;
  finally; //wird auf jeden Fall ausgeführt, auch bei exit
    qtab.Close;
    ztab.Close;
    qtab.Destroy;
    ztab.Destroy;
  end;
end;
Variante ist getestet und hat sich bewährt, insbesondere zur automatischen Strukturanpassung beim Nutzer.

Vielleicht hilfts Dir weiter.

mfg
eddy
  Mit Zitat antworten Zitat