Avatar billede dougheffernan Nybegynder
28. september 2006 - 11:08 Der er 15 kommentarer og
2 løsninger

Logge ændringer til data på formular

Er det muligt at loope gennem alle kontrollerne på en formular og concatenate alle værdierne, adskilt af : ?
Jeg har brug for noget logning af hvad der ændres i dataene....måske ville det være bedre som en trigger på den sammenkædede SQL database tabel?
Avatar billede Slettet bruger
28. september 2006 - 11:49 #1
Kan du ikke lave en tabel med et log felt og evt. et autoudfyldt dato/tidsfelt og så lave en kode på afterupdate eller onChange på alle felterne. Den skal køre en sql, som hedder:

INSERT INTO Tabel1 ( LogFelt)
SELECT [forms]![formularnavn]![felt1] & " " & [forms]![formularnavn]![felt2] osv.. AS Expr1;
Avatar billede Slettet bruger
28. september 2006 - 11:54 #2
I stedet for at have alle felterne i forespørgslerne, så er det nok nemmere at styre, som en streng eller i et skjult felt!~)
Avatar billede dougheffernan Nybegynder
28. september 2006 - 12:27 #3
Der ER stumper af kode på nettet til at lave det som triggers, men så er der tale om PL-SQL og nu ER det en SQL Server vi har.

Men det som du siger er heller ikke langt fra hvad jeg selv havde tænkt på:
Kode på alle felterne (OnChange og OnUpdate), men hvor jeg så kun logger ét felt af gangen. Mere er ikke nødvendigt.
Avatar billede terry Ekspert
28. september 2006 - 12:33 #4
In a Trigger cant you insert the record into a LOG table?
Avatar billede dougheffernan Nybegynder
28. september 2006 - 13:18 #5
terry: I believe I can, but what does the code look like? THAT'S the question...!
Avatar billede terry Ekspert
28. september 2006 - 13:39 #6
You need a table which contains all of the field in your original table and a datetime field for when the change occured and also a char(6) field for the type of change (INSERT, UPDATE,DELETE)

CREATE TRIGGER dbo.TRG_YourTable ON dbo.YourTable
FOR INSERT, UPDATE, DELETE
AS
DECLARE @Inserted int,
        @Deleted  int,
        @Type char(6)

SELECT @Inserted = Count(*) from inserted
SELECT @Deleted = Count(*) from deleted

SELECT @Type = CASE
  WHEN (@Inserted > 0) and (@Deleted = 0) THEN 'INSERT'
  WHEN (@Inserted > 0) and (@Deleted > 0) THEN 'UPDATE'
  WHEN (@Inserted = 0) and (@Deleted > 0) THEN 'INSERT'
END

IF (@Type IN ('INSERT', 'UPDATE'))

INSERT INTO YourLogTable
SELECT *, current_timestamp, @Type FROM inserted

ELSE

INSERT INTO YourLogTable
SELECT *, current_timestamp, @Type FROM deleted

RETURN
Avatar billede dougheffernan Nybegynder
28. september 2006 - 13:52 #7
Yep, arrived at aproximately the same code....but I need some server variables......the name of the user who performed the update/delete.
Avatar billede terry Ekspert
28. september 2006 - 14:01 #8
suser_sname
Avatar billede dougheffernan Nybegynder
28. september 2006 - 14:05 #9
Not quite sure how that would look in this code:

CREATE TRIGGER DataUpdated
ON MyTable
FOR UPDATE AS INSERT
MyLogTable
SELECT GETDATE(), '',  '', 'Data updated' Operation FROM inserted
Avatar billede terry Ekspert
28. september 2006 - 14:12 #10
dont you need a , between 'Data updated' Operation ?

CREATE TRIGGER DataUpdated
ON MyTable
FOR UPDATE AS INSERT
MyLogTable
SELECT GETDATE(), '',  '', 'Data updated', Operation, suser_sname FROM inserted
Avatar billede dougheffernan Nybegynder
28. september 2006 - 14:18 #11
The problem I see is that SQL Server complains about the syntax.
(the Operation shouldn't have been there)

I have NO column called suser_sname!
I want to input the name of the user who changed the data into the column called Username
Avatar billede dougheffernan Nybegynder
28. september 2006 - 14:21 #12
Sorry, suser_sname is a function....sorry
Is it also possible to get the name of the computer the user was logged in on?
Avatar billede terry Ekspert
28. september 2006 - 14:27 #13
I dont think so, the PC could in theory be anywhere in the world, but the user must log on to get access to the dB.

You could put it in the original table then you have access to it inthe trigger.
Avatar billede dougheffernan Nybegynder
28. september 2006 - 14:31 #14
Yeah, thought so/thought about that...
Anyways, thanks a BUNCH, terry and spg.
Avatar billede dougheffernan Nybegynder
28. september 2006 - 15:03 #15
Just 1 more Q:
How do I concatenate a date and a string?

CREATE TRIGGER DataUpdated
ON MyTable
FOR UPDATE AS INSERT
MyLogTable
SELECT GETDATE(), suser_sname(), 'Data updated: ' + [Dato] + '/' + [customername] FROM inserted
Avatar billede terry Ekspert
28. september 2006 - 15:19 #16
you will need to convert the datetime field to type char

Convert(char(25), [Dato])
Avatar billede dougheffernan Nybegynder
28. september 2006 - 15:23 #17
Again, looking around the web (haven't used THAT word in a loooong time!), I couldn't find any easy solution, so I figured it'd be something with the Convert function
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester