Mkinzler meint folgendes : Du sollst erst mal die Trigger benutzen. Damit sind die Fälle Insert / Update / Delete bereits erledigt. Was fehlt, das sind die Selects. Allerdings ist jetzt die Frage, wo diese zusammengebaut werden. Und
IMHO geht der Vorschlag von MKinzler mit SP an der Stelle etwas zu weit. Bzw. geht das meistens auch einfacher. Man stelle sich einmal folgendes vor : brauche Artikel-Liste von / bis Art.Nr. Sortierung nach Bez. usw. Jetzt gibt es dazu 2 Möglichkeiten : ich baue das Select im Programm zusammen. Das würde bei der Sortierung folgendes bedeuten :
Delphi-Quellcode:
if ckbAlpha = checked then
DS.SelectSQL.Add ('ORDER BY BEZ')
else
DS.SelectSQL.Add ('ORDER BY NR');
Über SP ginge es eben so :
Delphi-Quellcode:
if ckbAlpha = checked then
ArtSP.ParamByName ('SORTIERUNG') := 1
else
ArtSP.ParamByName ('SORTIERUNG') := 0;
In diesem Falle müßte ich noch in der SP die 0/1 auswerten usw. Man bedenke, daß das Bsp. dazu noch sehr einfach ist !
Habe ich nun folgende Konstruktion :
Delphi-Quellcode:
procedure SchreibeLog (st : string);
begin
LogMod.LogSP.ParamByName('ID_STATION').AsInteger := ID_StationNr;
LogMod.LogSP.ParamByName('ZEIT').AsDateTime := now;
LogMod.LogSP.ParamByName('ST').AsString := st;
if not CDStart then begin
LogMod.LogSP.ExecProc;
LogMod.LogTransaction.Commit; // zu oft ?
LogMod.LogTransaction.StartTransaction;
end;
end;
dann kann ich an allen Stellen etwas in ein Log schreiben. Egal was ! z.B.:
Delphi-Quellcode:
SchreibeLog ('Programmstart '+DateTimeToStr (now));
...
// ACHTUNG ! nur Pseudocode, string <> TStrings !
SchreibeLog (DS.SelectSQL.Text); // festhalten welche Sortierung per Dataset
SchreibeLog (ArtSP.SQL.Text); // festhalten welche Sortierung per SP
Aber egal wie, fällt mir gerade ein, was ist mit Parametern ?
"ORDER BY BEZ" würde ja in dem Log stehen, aber ":VONARTNR" auch und nicht der Wert. 8) Na ja, die selects sind mir ziemlich egal, ich will eigentlich nur wissen, wann wer an welchem Datensatz rumfummelt.
Und noch ein Trick : oben steht die Zeit der Aktion mit drin (bei Programmstart). Das kann man sich auch sparen. In das Log wird ja wohl nur inserted. Also genügt es, dem Insert Trigger zu sagen, daß er gleich noch die Zeit automatisch mitspeichert. Obige Prozedur ist fast unverzichtbar, bei dem Einkreisen schwierig zu findender Fehler. Ich kann ja auch reinschreiben "Menüpunkt x angewählt" oder "Menüpunkt x verlassen" In dem Log sehe ich dann ganz genau in zeitlicher Abfolge wo wann was dazwischen gemacht wurde. Welche Tabellen angesprochen wurden, welche Records betroffen waren usw. Wenn nun z.B. der Logeintrag "Menüpunkt x verlassen" nicht vorhanden ist, dann ist völlig klar, das ein schwerer Fehler passiert ist und wenns nur der gezogene Stecker war.
Auf jeden Fall aber sehe ich noch die letzte Aktion davor. Deshalb auch das Commit innerhalb der Prozedur.