Hmmm, also hier mal der Aufbau einer der Tabellen (auf die wichtigsten Felder gekürzt=, damit es klarer wird:
Code:
CREATE TABLE TAB_TAGE (
ID INTEGER NOT NULL,
DATUM DATE NOT NULL,
FEIERTAG SMALLINT DEFAULT 0 NOT NULL,
FARBEBEREITSCHAFT INTEGER,
FARBENOTARZT INTEGER,
FARBERUFDIENST INTEGER);
Erklärung (wie gesagt, ist nur ein Beispiel!). Bei dieser Tabelle handelt es sich letztlich um nichts anderes als ein Monatskalendar. Nun gibt es - wie gesagt - 3 Dienstarten. Diesen kann der Benutzer im Kalendar zur Markierung eine Hintergrundfarbe verpassen. Diese Farbe wird in dieser Tabelle hinterlegt (Ein Tag = 1 Zeile). Die eigentlichen Dienste werden in einer separaten Tabelle über einen FK gespeichert (zwecks Normalisierung). Möchte ich nun EINE Klasse haben, um die jeweilige Hintergrundfarbe auszulesen, hätte ich ja - bei JEDER Abfrage, welche sich auf dienstspezifische Felder bezieht - folgendes oder ähnliches Konstrukt:
Delphi-Quellcode:
case DienstTyp of
1 : FeldName := 'FARBEBEREITSCHAFT';
2 : FeldName := 'FARBERUFDIENST';
3 : FeldName := 'FARBENOTARZT';
end;
FQuery.SQL.Clear;
FQuery.SQL.Add('UPDATE tab_tage');
FQuery.SQL.Add('SET %FeldName% = :FARBE');
FQuery.SQL.Add('WHERE id = :DBID;');
FQuery.SQL.Text := StringReplace(FQuery.SQL.Text, '%FeldName%', FeldName, []);
Teile ich es jedoch in 3 Klassen auf, kann ich mir die CASE-Abfrage sparen (hier exemplarisch für Dienst 2), hätte aber wegen der abstrakten Methoden in der Basisklasse haufenweise redundanten Quellcode:
Delphi-Quellcode:
FQuery.SQL.Clear;
FQuery.SQL.Add('UPDATE tab_tage');
FQuery.SQL.Add('SET FARBERUFDIENST = :FARBE');
FQuery.SQL.Add('WHERE id = :DBID;');
P.S.: Ich denke nicht, dass es in diesem Fall sinnvoll ist, eine weitere Tabelle für die 3 Farben zu erstellen und über einen FK zu referenzieren, oder?!?