Einzelnen Beitrag anzeigen

mace

Registriert seit: 13. Jan 2006
27 Beiträge
 
Delphi 7 Personal
 
#6

Re: Protokoll Trigger mit > 1 Datensätze

  Alt 19. Apr 2007, 17:28
HILFE!

Der Trigger (im Anhang) funktioniert immernoch nicht!
An dieser Stelle:

Delphi-Quellcode:
DataSetSerienbriefeDokumente.Insert;
DataSetSerienbriefeDokumente.FieldByName('SerienbriefNameExtern').AsString:= cxTextEditName.Text;
DataSetSerienbriefeDokumente.FieldByName('AngelegtAm').AsDateTime:= Date();
...
DataSetSerienbriefeDokumente.Post;
briefID:= DataSetSerienbriefeDokumente.FieldByName('ID').AsInteger; // => *1

DataSetSerienbriefeDokumente.Edit;
DataSetSerienbriefeDokumente.FieldByName('SerienbriefNameIntern').AsInteger:= briefID; // Verküpfungsfeld zur Detailtabelle
DataSetSerienbriefeDokumente.Post;

leg also einen neuen Datensatz an und will an Punkt *1 die ID des aktuell angelegten Datensatzes ziehen, um diese an die Detailtabelle weiterzugeben. In dieser briefID steht aber die ID des letzten angelegten Datensatzes aus der Protokollierungstabelle.
Wenn ich in der Tabelle nachschau hab ich garkeine Eingabe in diesem Feld stehen also NULL.
In dem DataSet ist nur ein SELECT * FROM tabSerienbriefe .
Und bei jedem Post greift unten angehängter Trigger, mit dem es etwas zu tun haben muss!


Code:
Tabellenausschnitt:
ID______SerienbriefnameIntern__SerienbriefNameExtern
218......NULL..................TRIGGERTEST
219......NULL..................TRIGGERtest2
222......NULL..................TRIGGERTEST5
Meine Frage also: Warum wird da nicht der Wert dieser ID gespeichert von dem aktuell angelegten Datensatz?
Anmerkung: Als der Trigger in diesem Programmcode noch nicht existiert hat, hat es so immer fehlerfrei funktioniert!



// Anhang
SQL-Code:
CREATE TRIGGER [TR_LogtabSerienbriefe] ON [dbo].[tabSerienbriefe]
FOR INSERT, UPDATE, DELETE AS
Declare @Username nvarchar(40)
Declare @UpdateDate datetime
Declare @TableName nvarchar(255)
Declare @Fieldname nvarchar(150)
Declare @PersNr int
Declare @ObjSchluessel nvarchar(50)
Declare @ObjSchluesselBez nvarchar(50)
Declare @Aktion nvarchar(50)
Declare @Maskenname nvarchar(255)
Declare @deleted bit

Select @UserName = system_user
Select @UpdateDate = convert(varchar(8), getdate(), 112) + ' ' + convert(varchar(12), getdate(), 114)
Select @TableName = 'tabSerienbriefe
Select @Maskenname = 'Serienbriefmanager
-- Aktion bestimmen
if exists (select * from inserted)
  begin
     if exists (select * from deleted)
        select @Aktion = 'Datensatz geändert
     else
        select @Aktion = 'Datensatz eingefügt
  end
else
  Select @Aktion = 'Datensatz gelöscht.

Select @deleted = inserted.geloescht from inserted
if (@deleted=1)
  select @Aktion = 'Datensatz gelöscht

-- Variablen für alte und neue Feldinhalte der Tabelle anlegen
Declare @OldSerienbriefNameExtern nvarchar(255)
Declare @NewSerienbriefNameExtern nvarchar(255)
Declare @OldSeitenNummer nvarchar(255)
Declare @NewSeitenNummer nvarchar(255)

-- Testen auf Änderung, wenn ja - Cursor anlegen (für den Fall mehrerer Datensätze)
 IF (@Aktion = 'Datensatz eingefügt') OR (@Aktion = 'Datensatz geändert') OR (@Aktion = 'Datensatz gelöscht')
  BEGIN
    Declare iC CURSOR LOCAL FAST_FORWARD FOR
    Select ID, SerienbriefNameExtern, SeitenNummer from inserted
    OPEN iC
    FETCH NEXT FROM iC INTO @ObjSchluessel, @NewSerienbriefNameExtern, @NewSeitenNummer
  END
IF (@Aktion = 'Datensatz gelöscht.') OR (@Aktion = 'Datensatz geändert') OR (@Aktion = 'Datensatz gelöscht')
  BEGIN
    Declare dC CURSOR LOCAL FAST_FORWARD FOR
    Select ID, SerienbriefNameExtern, SeitenNummer from deleted
    OPEN dC
    FETCH NEXT FROM dC INTO @ObjSchluessel, @OldSerienbriefNameExtern, @OldSeitenNummer
  END

WHILE @@FETCH_STATUS = 0
BEGIN
  Select @OldSerienbriefNameExtern = deleted.SerienbriefNameExtern from deleted
  Select @NewSerienbriefNameExtern = inserted.SerienbriefNameExtern from inserted

-- Test auf Änderung dieses Feldes
  IF (@OldSerienbriefNameExtern <> @NewSerienbriefNameExtern) OR (@OldSerienbriefNameExtern is null AND not @NewSerienbriefNameExtern is null)
    OR (not @OldSerienbriefNameExtern is null AND @NewSerienbriefNameExtern is null) OR (not @OldSerienbriefNameExtern is null AND @deleted = 1)
  BEGIN
   INSERT INTO tabtest (test) VALUES ( '1_ '+@ObjSchluessel) -- Test, welcher Wert hier steht. Es ist die richtige ID
   IF @Aktion = 'Datensatz gelöscht
     SET @NewSerienbriefNameExtern = NULL
   Insert into tabProtokoll (Username, Logdate, OldValue, NewValue, TableName, FieldName, PersNr, ObjektSchluessel, Aktion,
   Values (@UserName, @UpdateDate, @OldSerienbriefNameExtern, @NewSerienbriefNameExtern, @TableName, 'Serienbriefname', @PersNr, @ObjSchluessel, @Aktion, @Maskenname)
   INSERT INTO tabtest (test) VALUES ( '2_ '+@ObjSchluessel) -- Test, welcher Wert hier steht. Es ist auch hier die richtige ID
  END
-- Nächstes Feld zum Protokollieren
  Select @OldSeitenNummer = deleted.SeitenNummer from deleted
  Select @NewSeitenNummer = inserted.SeitenNummer from inserted

  IF (@OldSeitenNummer <> @NewSeitenNummer) OR (@OldSeitenNummer is null AND not @NewSeitenNummer is null)
    OR (not @OldSeitenNummer is null AND @NewSeitenNummer is null) OR (not @OldSeitenNummer is null AND @deleted = 1)
  BEGIN
    IF @Aktion = 'Datensatz gelöscht
      SET @NewSeitenNummer = NULL
     Insert into tabProtokoll (Username, Logdate, OldValue, NewValue, TableName, FieldName, PersNr, ObjektSchluessel, Aktion, Maskenname)
    Values (@UserName, @UpdateDate, @OldSeitenNummer, @NewSeitenNummer, @TableName, 'SeitenNummer', @PersNr, @ObjSchluessel, @Aktion, @Maskenname)
  END
  IF (@Aktion = 'Datensatz eingefügt') OR (@Aktion = 'Datensatz geändert') OR (@Aktion = 'Datensatz gelöscht')
    FETCH NEXT FROM iC INTO @ObjSchluessel, @NewSerienbriefNameExtern, @NewSeitenNummer
  IF (@Aktion = 'Datensatz gelöscht.') OR (@Aktion = 'Datensatz geändert') OR (@Aktion = 'Datensatz gelöscht')
    FETCH NEXT FROM dC INTO @ObjSchluessel, @OldSerienbriefNameExtern, @OldSeitenNummer
  END

-- Wenn Cursor erstellt wurde, hier wieder löschen
IF (@Aktion = 'Datensatz eingefügt') OR (@Aktion = 'Datensatz geändert') OR (@Aktion = 'Datensatz gelöscht')
BEGIN
  DEALLOCATE iC;
END
IF (@Aktion = 'Datensatz gelöscht.') OR (@Aktion = 'Datensatz geändert') OR (@Aktion = 'Datensatz gelöscht')
BEGIN
  DEALLOCATE dC;

END
Conscience is what hurts when everything else feels so good.
  Mit Zitat antworten Zitat