2009

Feb

4

Av

Vi har tidigare skrivit om ändringsloggar i FileMaker. Med FileMaker Pro 10 och manus-triggers blir det ännu enklare att skapa loggar och då till en separat tabell. Följande exempel visade vi också på FileMakers frukostseminarium i Lund idag (4 februari). 

I exemplet nedan kan jag logga ändringar i obegränsat antal fält. Börja med att skapa två manus enligt nedan:

Manus 1: Spara fältdata

Ange variabel [ $$faltdata; Värde:Get ( AktivtFältinnehåll ) ]

Manuset sparar innehållet i aktivt fält i en global variabel. Det är tänkt att köras när man går till ett fält för att spara befintligt värde.

Manus 2: Jämför data

If [ Get ( AktivtFältinnehåll ) <> $$faltdata ] 
	Ange variabel [ $faltnamn; Värde:Get ( AktivtFältnamn ) ] 
	Ange variabel [ $data; Värde:$$faltdata & "->" & 
                               Get ( AktivtFältinnehåll ) ] 
	Gå till layout [ “Logg” (Logg) ] 
	Ny post/sökpost 
	Tilldela fält [ Logg::Faltnamn; $faltnamn ] 
	Tilldela fält [ Logg::Data; $data ] 
	Gå till layout [ ursprunglig layout ] 
	Avsluta manus [ Resultat: 1 ] 
End If

Manuset kontrollerar om innehållet i aktivt fält är ändrat, och om det är ändrat skapas en ny post i tabellen “Logg” med uppgift om vad som ändrats. Tabellen Logg kan du ställa in så att Skapad tid och Kontonamn sätts in med automatik när man skapar en ny post.

Markera sedan alla fält du vill skapa ändringslogg för i layoutläget, högerklicka (ctrl + musklick på Mac) och välj Ställ in manusutlösare i menyn. Ställ in den enligt bilden nedan.

audittrail

När ett fält blir aktivt dvs. när man klickar i det eller tabbar till det så körs manuset “Spara fältdata”. När fältet lämnas genom att annat fält blir aktivt eller posten verkställs (genom att man klickar utanför fälten) så körs det andra manuset “Jämför data”.

Alla ändringar sparas i en separat tabell med gammalt och nytt värde, datum och klockslag samt vem som gjorde ändringen.

Ladda ner exempelfil om du vill se hur databas och manus är gjorda. Klicka på knappen Visa logg i exemplet för att se ändringsloggen.

 

4 kommentarer till ”Ändringslogg (audit trail)”

  1. Niklas Swedenborg

    Hepp. Härligt med exempel till massorna! Det gillar vi. Smile

    Ett problem dock: Om man utformar ett fält som meny så triggar inte OnEnter som den ska… Den hugger först när man lämnar fältet. Detta få då till följd att $$faltdata får det nya värdet och jämförelsen i nästa script gör att loggningen inte utförs. Har ni donat med att få detta att funka?

    /Niklas

    Reply
  2. Robert

    Manus-triggern PåObjektStarta körs tyvärr inte för fält som är utformade med t.ex. meny eller kalender.

    Ett annat sätt att lösa det på är att använda OnRecordLoad (PåPostLäsIn i svensk översättning) på layouten som kör ett manus som lägger undan alla fälts värden i globala variabler för att sedan använda OnRecordCommit (PåPostVerkställ) för att köra annat manus vid verkställande av post som jämför datat före och efter och skapar eventuella loggposter i de fall där posten ändrats.

    Det som även måste ske vid verkställande är att manuset som kördes vid OnRecordLoad körs igen så att de nya värdena finns som underlag för en eventuell ytterligare ändring.

    Ytterligare en variant (utan manus-triggers!) är att göra som i följande inlägg: http://www.filemakerbloggen.se/…/…for-flera-falt.aspx

    Reply
  3. Niklas Swedenborg

    Nya lösningar -> Nya problem… Smile

    I min lösning faller upplägget med att rusa igenom alla fält OnRecordLoad på två saker:

    1. Att det finns flera flikpaneler (som dessutom har flikpaneler i sig). (Scriptsteget “Gå till nästa fält” byter inte flik.)
    Man skulle kunna lösa detta med en ny layout som alltid innehåller alla fält och som används av scriptet för att samla in fältvärden.

    2. Att det finns portaler med hundratals rader som gör att scriptet har ett par sekunder för lång tid.

    Detta gör att jag slår om till använda OnObjectSave (istället för OnObjectExit) och lever med att vissa fall inte få med ursprungsvärdet i fältet.

    /Niklas

    Reply
  4. Robert

    Du har helt rätt. Om lösningen fungerar eller ej beror på grundförutsättningarna.
    Portaler med hundratals poster i kombination med den föreslagna lösningen fungerar inte så bra.

    Reply

Skriv en kommentar

  • (will not be published)
  • one + = 5

Läs också: