Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Gleiches Programm für 2 Tabellen, eines mit einem zusätzlichen Feld (https://www.delphipraxis.net/194567-gleiches-programm-fuer-2-tabellen-eines-mit-einem-zusaetzlichen-feld.html)

PIERREDENNLER 7. Dez 2017 17:26

Datenbank: DBF • Version: ? • Zugriff über: TTABLE

Gleiches Programm für 2 Tabellen, eines mit einem zusätzlichen Feld
 
Hallo,
Freizeitprogrammierer in Delphi 7 Ich musste ein zusätzliches Feld zu einer lokalen .dbf-Table hinzufügen.
Nach einigen Änderungen und insbesondere dem Hinzufügen eines siebte DataFiels zur TTable-Komponente (mit dem FieldDefs-Kollektionseditor beim Design) funktioniert alles korrekt.
Außer dass ich wünschte, ich könnte auch mit diesem Programm meine alten Table ausnutzen.
Beim Start meines Programms habe ich einen Test hinzugefügt, um die Anzahl der Felder zu ermitteln und somit die eine oder andere Version der Table laden zu können.
Aber nachdem wie kann ich es tun?
Ich hatte gedacht, das hinzugefügte Feld zu neutralisieren (Table1.Fields [6] .Visible: = False;) oder zu aktualisieren (Table1.Fields [6] .Visible: = True;), aber die Datensätze sind dann für die alten Datenbanken unsichtbar.
Oder gibt es andere Lösungen?
Wer kann mir helfen, danke im Voraus.

Delphi.Narium 7. Dez 2017 18:44

AW: Gleiches Programm für 2 Tabellen, eines mit einem zusätzlichen Feld
 
Vor dem Table.Open ein Table.Fields.Clear.
Die Feldliste wird automatisch beim Öffnen der Tabelle befüllt. Die Definition der Felder mit dem FieldDefs-Kollektionseditor ist nur erforderlich, wenn man die Tabelle mit Table.CreateTable erstellen will.

Hat man Felder im Quelltext definiert, z. B.:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
...
  public
    fID            : TField;
    fRootUrl       : TField;
    fPostUrl       : TField;
...
dann kann man Table ein BeforeClose-Ereignis zuordnen:
Delphi-Quellcode:
procedure TForm1.TableBeforeClose(DataSet: TDataSet);
begin
  fID := Nil;
  fRootUrl := Nil;
  fPostUrl := Nil;
...
und ein AfterOpen-Ereignis:
Delphi-Quellcode:
procedure TForm1.TableAfterOpen(DataSet: TDataSet);
begin
  fID            := Table.FindField('ID');
  fRootUrl       := Table.FindField('RootUrl');
  fPostUrl       := Table.FindField('PostUrl');
...
Greift man nun im Programm irgendwo auf so ein Feld zu, weiß aber nicht, ob man es überhaupt zur Verfügung hat (hier also bei der alten Tabelle), könnte man das in etwa so machen:
Delphi-Quellcode:
if Assigned(fID) then begin
  ShowMessage(fID.AsString);
end;

PIERREDENNLER 8. Dez 2017 10:04

AW: Gleiches Programm für 2 Tabellen, eines mit einem zusätzlichen Feld
 
Hallo,
Deine Antwort ist sehr interessant, kleines Problem hätte ich doch : mein gesamtes Programm schreiben müssen, weil ich folgendes benutzt habe:
Tabelle1TITRE: TStringField;
....
Tabelle 1INFO: TMemoField;
Tabelle1ICONE: TBlobField;
-
Table2TITRE: TStringField;
...
Tabelle2INFO: TMemoField;
Tabelle 2ICONE: TBlobField;
und jetzt in mehr
Tabelle1MAJDATE: TDateField;
Tabelle2MAJDATE: TDateField;

Und sogar Verfahren wie
Prozedur TF_SAISIE.Table1LOGICIELChange (Sender: TField);
Aber warum nicht, wenn es die einzige Lösung ist.

Ich dachte auch über eine andere Lösung des Typs nach: nachdem ich die Anzahl der Felder getestet habe, um das fehlende Feld hinzuzufügen, dann öffne ich es normal (das teste ich gerade)
danke

Delphi.Narium 8. Dez 2017 12:18

AW: Gleiches Programm für 2 Tabellen, eines mit einem zusätzlichen Feld
 
Jetzt hänge ich mich mal weit aus dem Fenster (weil ungetestet und nur geraten):

Bleib' bitte mal bei meinem vorherigen Ansatz und ändere das AfterOpen dahingehend ab:

Delphi-Quellcode:
Tabelle1TITRE := TStringField(Tabelle1.FindField('TITRE'));


Und im BeforeClose dann halt:

Delphi-Quellcode:
Tabelle1TITRE := Nil;


Bei der Benutzung dürfte es dann bei
Delphi-Quellcode:
if Assigned(Tabelle1TITRE) then begin
  ShowMessage(Tabelle1TITRE.AsString);
end;
bleiben.

Funktioniert das?

PIERREDENNLER 8. Dez 2017 12:51

AW: Gleiches Programm für 2 Tabellen, eines mit einem zusätzlichen Feld
 
Hallo,
Ich löste mein Problem, als ich die Anzahl der Felder prüfte, fügte ich einfach das fehlende Feld hinzu.
Danke für alles.


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