Einzelnen Beitrag anzeigen

hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#1

Object Daten-Layer

  Alt 14. Feb 2011, 09:33
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Hallo,
für ein größeres Projekt halte ich die Daten in einem Object und bräuchte hier mal einen Denkanstoß.
Beispiel eine Kundenadresse.
Delphi-Quellcode:
TKunde=class
private
  fid : integer;
  fplz : string;
  fort : string;
public
  procedure Load(ID: Integer);
  procedure Save;
  property id : integer read fid write fid;
  property plz: string read fplz write fplz;
  property ort: string read fort write fort;
end;
Load läd eine Adresse aus der Datenbank.
Save soll nur Änderungen speichern.
Also z.B.
Delphi-Quellcode:
Kunde.Load(1234);
Kunde.Plz := 1234;
Kunde.Save
;

Mir geht es jetzt darum, wie löse ich am elegantesten (und schnellsten) das Problem festzustellen ob und welche Felder geändert wurden.
Mir fallen hier zwei Methoden ein.

1. Setter für jeden Property.
Delphi-Quellcode:
procedure TKunde.SetPlz(Val: String);
begin
  if Val <> fPLZ then plzChange := true;
  fPLZ := Val;
end;
Da hat den Nachteil, das ich für jede property einen eigenen Setter schreiben muss.

2. Orginalwerte aus der Datenbank speichern und jedes Feld doppelt halten.
In der Procedure Save dann die Feldinhalte vergleichen.

if fPLZ <> OrgPLZ then ...

Eine weitere Überlegung ist das Füllen dieses Objektes mit Daten aus der Datenbanktabelle.
Ist nachfolgender Weg praktikabel?

Alle lokalen Felder haben den gleichen Namen wie die Datenbankfelder und bekommen einen Präfix (z.B. "f")
Mit "Select * from Tabelle WHERE ID=:ID wird der gewünschte Satz selektiert. Die Wertzuordnung erfolgt über RTTI zur Laufzeit.

Hat wer noch einen anderen Vorschlag?

Ich möchte mir einen kleinen Geerator schreiben, der die lokale Feldliste und die Propertys aus der Select-Anweisung generiert.
Die Klasse erledigt noch andere Aufgaben.
Funktionsfähig ist bereits das Füllen und Auslesen der Daten in einer Bildschirmmaske.

Für ein paar Ideen oder Denkanstöße wäre ich dankbar.

Gruß
Peter
  Mit Zitat antworten Zitat