Umsetzung Scatter Gather und FoxPro Memvar in Delphi

Kann 10, 2016 Admin Computer 0 3
FONT SIZE:
fontsize_dec
fontsize_inc

Umsetzung Scatter Gather und FoxPro Memvar in Delphi.

Delphi Entwickler Februar 2001

Urheberrecht Pinnacle Publishing, Inc. Alle Rechte vorbehalten.



Umsetzung Scatter Gather und FoxPro Memvar in Delphi

Steve Zimmelman



Technologie ist immer in Bewegung nach vorne, in der Regel zu einer Entwicklung produktiver führt. Es gibt jedoch Zeiten, in denen es in der Vergangenheit erreicht nützlich sein kann, zu. Replikation oder den Vergleich der Daten der Tabelle in FoxPro war eine ziemlich einfache Aufgabe. Steve Zimmelman argumentiert, dass diese Technologie vielleicht lohnt sich auf.





Streu FoxPro und sammeln Befehle waren immer sinnvoll, die Datensätze aus einer Tabelle in eine andere zu kopieren, den Vergleich der Daten oder die Replik Rekord über mehrere Tabellen. Für diejenigen unter Ihnen, die nicht die Freude an der Arbeit mit FoxPro, Dispersion hatte und sammeln Befehle funktionieren auf diese Weise haben.



Angenommen, Sie möchten einen Datensatz aus einer Tabelle in eine andere kopieren. Sie würden so etwas wie dies zu tun:



Wählen Sie Tabelle 1

Streu Memvar

Wählen Table2

Sammeln Memvar




Der Befehl Scatter liest alle Felder für

Rekord und fügt sie in den Speicher Variablen. Jede Variable, die ist

Streu mit demselben Namen des Feldes, von dem es

Herkunft. Sammeln Sie mit dem Befehl aktualisiert den aktuellen Datensatz mit Memory-Variablen, die Namen, die auf die Felder entsprechen haben. Also, wenn Tabelle 1 hat die Felder Name, Adresse und Telefon, und es gibt Variablen Name, Adresse, Telefonnummer und, dann, wenn der Befehl ausgeführt wird Collect aktualisiert den Datensatz mit dem in dieser Variablen gespeichert ist.



Es gibt viele Möglichkeiten, dies mit Delphi erreichen, aber es gibt nichts, die nativ in der VCL TDataSet Ebene vorgesehen funktioniert. In meiner letzten Arbeit Anwendung, hatte ich eine Notwendigkeit für die alten und Scatter sammeln Funktion. So landete ich schreibe meine eigenen Methoden und ScatterMemvar GatherMemvar.





Erstellen eines Scatter Gather und Funktionen


Beide Methoden sind Wrapper für ein Objekt namens TMemvar. TMemvar hält ein dynamisches Array eines Datensatzes genannt TMemVarFields. Jedes Element des Arrays enthält die Fieldname MemVarFields, Datentyp und den Wert eines entsprechenden Feldes in einem DataSet. Also jede Instanz TMemvar enthält Daten von einem einzelnen Datensatz in der Tabelle.





So'ne Art

MemVarField = packed record

Fieldname: String;

Wert: Variante;

Datentyp: TFieldType;

Ende;



TMemVarFields = Array Of TMemVarField;




Wenn die Funktion aufgerufen wird ScatterMemvar, instanziiert und gibt einen Zeiger auf diese Instanz TMemvar. Wenn Sie TMemvar erstellen, berechnet die Felder der in der Matrix bezeichnet DataSet. Um Doppel DataSet zu vermeiden, wird jede Instanz TMemvar von der DataSet-Eigenschaft identifiziert. Bevor Sie eine neue Instanz der TMemvar erstellen, wird eine Suche nach einem DataSet entsprechend in allen bestehenden Instanzen TMemvar gemacht. Wenn eine gefunden wird, wird die entsprechende Instanz verwendet. Andernfalls wird eine neue Instanz erstellt.



Funktion ScatterMemvar (DataSet: TDataSet): TMemVar;

Start

If (DataSet = null) Dann

Heben Exception.Create ('DataSet kann nicht null sein ");

// Reuse das Objekt, wenn es bereits vorhanden ist.

Ergebnis: = FindMemvarObject (DataSet);

If (Ergebnis = null) dann beginnen

Ergebnis: = TMemvar.Create (DataSet);

Ende Else Begin

Result.LoadFieldData;

Ende;

Ende;



Hersteller TMemVar.Create (DataSet: TDataSet);

Start

FFlds: = nil;

FDataSet: = DataSet;

If (FDataSet = null) dann beginnen

Heben Exception.Create ('DataSet kann nicht null sein ");

Ende;

If (FScatterList = null) Dann

FScatterList: = TList.Create;

FScatterList.Add (Self);

LoadFieldData;

Ende;



TMemVar.LoadFieldData Verfahren;

Var

i: Integer;

Start

Wenn Sie nicht DataSet.Active Dann DataSet.Open tun;

FFlds: = nil;

// Die Satzlänge für das Array ein.

Setlength (FFlds, Fieldcount);

Für i: = 0 bis (DataSet.FieldCount-1) do begin

Mit DataSet.Fields [I] Sie beginnen

FFlds [i] .FieldName: = Feldname;

FFlds [i] .Value: = Value;

FFlds [i] .DataType: = Datentyp;

Ende;

Ende;

Ende;




Normalerweise, wenn Sie ein Objekt erstellen, müssen Sie das Objekt freizugeben, wenn es nicht mehr notwendig ist. Aber das Laufwerk, das den Code für dieses Objekts unterhält eine eigene interne Liste der Instanzen TMemvar und zerstört sie automatisch, wenn die Anwendung geschlossen wird. So können Sie Objekte freizugeben, wenn sie nicht benötigt werden, oder sie ignorieren und lassen Sie das Gerät für sich selbst sorgen.



TMemvar Objekte zu verwalten, die für jedes erstellt werden, ScatterMemvar, ich jede neue Instanz einer TMemvar FScatterList, eine Art von TList hinzuzufügen. Das Gerät verarbeitet alle dieser Code enthält die Initialisierung und Finalisierung Abschnitte. Initialisierung gewährleistet FScatterList auf Null gesetzt. Dies geschieht so, dass die Methode Create TMemvar können den Wert FScatterList abzufragen und eine Instanz davon nur bei Bedarf. Dies hält die Ressourcen, die der Einheit erfordert ein Minimum. Der Abschluss

Abschnitt geht durch die Liste und gibt keine Gegenstände TMemvar bezieht.



FreeScatterList Verfahren;

Var i: Integer;

Start

If (FScatterList = null) Then Exit;

Versuchen

Für i: = (FScatterList.Count-1) downto 0 do begin

Versuchen

TMemVar (FScatterList.Items [i]) Freie.

Außer

Ende;

Ende;



Endlich

FScatterList.Free;

FScatterList: = nil;

Ende;

Ende;



Initialisierung

FScatterList: = nil;

Finalisieren

FreeScatterList;




Um mögliche Ausnahmen für den Zugang zu vermeiden, wird von TMemvar FScatterList entfernt, wenn es freigegeben wird. Sie werden auch bemerken, dass, wenn alle Elemente wurden von FScatterList beseitigt, wird die Liste veröffentlicht. Auch dies geschieht, um die Nutzung der Ressourcen nach unten zu halten.



Destructor TMemVar.Destroy;

Var i: Integer;

Start

// Die Array-Elemente löschen.

FFlds: = nil;

Für i: = 0 bis (FScatterList.Count-1) do begin

Versuchen

If (TMemvar (FScatterList.Items [i]). DataSet = FDataSet), dann beginnen

FScatterList.Delete (s);

Ende;

Außer

Ende;

Ende;

If (FScatterList.Count = 0) Then Begin

FScatterList.Free;

FScatterList: = nil;

Ende;

Geerbt;

Ende;




Nach ScatterMemvar wurde verwendet, um ein DataSet im Speicher einlegen, kann das Objekt TMemvar spezifischen von jedem Gerät in Frage zugegriffen werden. Da jede Instanz TMemvar in FScatterList gespeichert ist, kann als ein globales Objekt, die von jedem Gerät, das eine Referenzeinheit in ihrer Erklärung Memvar Gebrauch hat zugegriffen werden kann.



GatherMemvar Das Verfahren wird verwendet, um Daten in der gleichen Tabelle einzufügen, von denen das Original oder, falls erforderlich, eine andere Tabelle. GatherMemvar läuft durch die in dem Objekt gespeichert TMemvar Felder und aktualisiert die Zieldatensatz mit Feldern, die der Feldname und Datentyp entsprechen. So dass die Felder in der Objekt TMemvar sollte nicht eine genaue Übereinstimmung an die Zielstruktur sein. Die Felder, die nicht der Feldname und der Art der Daten nicht entsprechen, werden ignoriert. Weiterhin können die Werte der Felder von TMemvar vor Verwendung GatherMemvar, um im Falle der Notwendigkeit von verschiedenen Daten leicht replizieren modifiziert werden.



GatherMemvar wird in zwei Versionen implementiert, mit der Überlast-Direktive in der Methodendeklaration:



Verfahren GatherMemVar (Quelle: TMemVar; Ziel: TDataSet;

Optionen: TGatherOptions); Überlast;



Verfahren GatherMemVar (Quelle, Ziel: TDataSet;

Optionen: TGatherOptions); Überlast;




Der einzige Unterschied zwischen diesen beiden Verfahren ist der erste Parameter. Die erste Implementierung verwendet die tatsächlichen Referenzobjekt TMemvar. Die zweite benutzt DataSet, das verwendet wurde, um die Instanz von TMemvar erstellen. Darüber hinaus sind beide identisch. In der Tat, die erste Umsetzung tatsächlich ruft die zweite. Es gibt auch einige Optionen, die Sie steuern, wie die Methode GatherMemvar sammelt Daten zu ermöglichen. Sie ändern oder fügen Sie Daten, eine Meldung ausgibt, oder öffnen Sie das Objekt einmal die Sammlung komplett ist. Wenn keine

Optionen im Parameter vorhanden sind, ist der Standard, um die zu ersetzen

Rekord von Ziel-Dataset und lassen Sie sich in einem Zustand des Wandels nach der Änderung von Daten in die Felder ein.



TGatherOption = (goReplace, goAppend, goPost, Gofree);

TGatherOptions = Set TGatherOption;



Verfahren GatherMemVar (Quelle: TMemVar; Ziel: TDataSet;

Optionen: TGatherOptions);

Start

If (Source = null) Dann

Heben Exception.Create ('Source TMemVar Objekt kann nicht NIL sein');



GatherMemVar (Source.DataSet, Target, Optionen);

Ende;



GatherMemVar Verfahren (Herkunft, Ziel: TDataSet; Optionen: TGatherOptions);

Var

i: Integer;

iIndex: Integer;

MemObj: TMemvar;

FR: TMemvarField;

Start

MemObj: = FindMemvarObject (Quelle);

If (MemObj = null) dann beginnen

Heben Exception.Create ('Source DataSet (' +

Source.Name + ') hat nicht gestreut worden!');

Ende;

If (goAppend in Optionen), dann beginnen

Target.Append;

Ende Else Begin

Wenn nicht (Target.State In [dsEdit, dsInsert]) Dann

Target.Edit;

Ende;



Für i: = 0 bis (Target.FieldCount-1) do begin

iIndex: = MemObj.FindFieldIndex (Target.Fields [i] .FieldName);

Wenn iIndex> = 0 Then Begin

If (Target.Fields [i] = .DataType MemObj.Fields [iIndex] .DataType) Dann

Target.Fields [i] .Value: = MemObj.Fields [iIndex] .Value;

Ende;

Ende;

If (goPost in Optionen), dann

Target.Post;



If (Gofree in Optionen), dann

MemObj.Free;

Ende;





Setzen Sie die neuen Funktionen zu verwenden

Hier sind einige Beispiele dafür, wie diese Verfahren verwendet werden.



Verfahren MyExample1 Felddaten kopiert Tabelle1 und Tabelle2, um einen Datensatz mit den Daten der Tabelle 1 hinzuzufügen: Die Parameteroptionen goPost und Gofree dass die Methode, um eine Nachricht zu übermitteln Tabelle2, dann lassen Sie das Objekt TMemvar.



MyExample1 Verfahren;

Var

MemObj: TMemvar;

Start

MemObj: = ScatterMemvar (Tabelle 1);

//



// Hinzufügen einen Datensatz in Tabelle 2, Post it,

// Dann lassen Sie das Objekt TMemvar.

GatherMemvar (MemObj, Tabelle2 [goAppend, goPost, Gofree]);

Ende;




Verfahren MyExample2 Felddaten Kopien von Tabelle 1, Tabelle 2, um einen Datensatz mit Daten aus Tabelle 1 hinzufügen, dann ändern Sie das Feld Name, bevor Sie einen Datensatz in Tabelle 3 GatherMemvar hinzufügen In beiden Fällen wird der Datensatz registriert. Die letzte befreit das Objekt auch TMemvar.



MyExample2 Verfahren;

Var

MemObj: TMemvar

Start

MemObj: = ScatterMemvar (Tabelle 1);

//



// Hinzufügen einen Datensatz in Tabelle 2 & Tabelle 3, Post it,

// Dann lassen Sie das Objekt TMemvar.

GatherMemvar (Tabelle1, Tabelle2 [goAppend, goPost]);



// Einen Feldwert vor der Zugabe Memvar ändern

// Ein Datensatz der Tabelle 3.

MemObj.FieldValue ['name'] = 'Steve Zimmelman';



GatherMemvar (Tabelle 1, Tabelle 3, [goAppend, goPost, Gofree]);



Ende;







(0)
(0)

Kommentare - 0

Keine Kommentare

Fügen Sie einen Kommentar

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Zeichen übrig: 3000
captcha