-
A5_Audit_trail(2)
I have a global script that is run from the CanSaveRecord in field rules that deletes any existing audit file, recreates it & then copies it elsewhere. Unfortunately it does not work every time in that it does not create the audit file at all. I assume i have created some conflict with its operation. My script is below.
The only suggestion i have from the users is it depends on how the form is opened as to whether it works i.e. opening a form go to one record change it all ok but move to another record it does not work. Open the form from a list going directly to the selected record it does not work.
Any help out there?
Thanks
Terry
delete tmpdate
delete tmptime
delete oldfilename
delete newfilename
dim tmpdate as c = remspecial(dtoc(date(),"7-"))
dim tmptime as c = remspecial(time())
dim oldfilename as c = ""
dim newfilename as c = ""
xbasic_wait_for_idle()
tst=a5_is_path_valid(vDBPATH+"Audit Trail\"+vPREFIX)
If tst = .f.
dir_create(vDBPATH+"Audit Trail\"+vPREFIX)
end if
tst=a5_is_path_valid(vDBPATH+"Audit Trail\"+vPREFIX+"\"+ut(t.uniquequoteno))
If tst = .f.
dir_create(vDBPATH+"Audit Trail\"+vPREFIX+"\"+ut(t.uniquequoteno))
end if
xbasic_wait_for_idle()
Master_name = a5.Get_Master_Name()
if (Master_name = "") then
' ui_msg_box("STOP", "You are NOT in a Shadow database." +crlf(2) + "You can only run this operation from a Shadow.", UI_STOP_SYMBOL+UI_OK)
oldfilename = vDBPATH+vPREFIX+"- audit_trail.txt"
' ui_msg_box("oldfilename",oldfilename,UI_OK)
else
oldfilename = "C:\MROffice\Shadow\"+vPREFIX+"- audit_trail.txt"
' ui_msg_box("oldfilename",oldfilename,UI_OK)
End if
newfilename = vDBPATH+"Audit Trail\"+vPREFIX+"\"+ut(t.uniquequoteno)+"\"+ut(t.uniquequoteno)+" - audit_trail "+tmpdate+" "+tmptime+".txt"
'ui_msg_box("newfilename",newfilename,UI_OK)
if file.exists(oldfilename) then
' ui_msg_box("OK","File "+oldfilename+" exists.",UI_INFORMATION_SYMBOL+UI_OK)
' a5_file_remove(oldfilename)
FILE.remove(oldfilename)
xbasic_wait_for_idle()
A5_Audit_trail(2)
else
' ui_msg_box("Error Finding File","File "+oldfilename+" does not exist. Please report this to your Supervisor.",ui_stop_symbol+UI_OK)
A5_Audit_trail(2)
end if
xbasic_wait_for_idle()
if file.exists(oldfilename) then
' ui_msg_box("OK","File "+oldfilename+" exists.",UI_INFORMATION_SYMBOL+UI_OK)
file.copy(oldfilename,newfilename)
else
sleep(3)
A5_Audit_trail(2)
sleep(1)
if file.exists(oldfilename) then
' ui_msg_box("OK","File "+oldfilename+" exists.",UI_INFORMATION_SYMBOL+UI_OK)
file.copy(oldfilename,newfilename)
else
ui_msg_box("Error Finding File To Copy","File "+oldfilename+" does not exist. Please report this to your Supervisor.",ui_stop_symbol+UI_OK)
end if
end if
xbasic_wait_for_idle()
if file.exists(newfilename) then
' ui_msg_box("OK","File "+newfilename+" exists.",UI_INFORMATION_SYMBOL+UI_OK)
else
ui_msg_box("Error Finding File","File "+newfilename+" does not exist. Please report this to your Supervisor.",ui_stop_symbol+UI_OK)
end if
-
Re: A5_Audit_trail(2)
Please explain what you want to happen.
As in the whole process.
In simple terms without code, which just confuses things.
-
Re: A5_Audit_trail(2)
Delete any existing audit trail file
Create a clean new audit trail file contains on the details of the single record enter or change
Copy the new file under a new reference
Or
Alternatively another method of record all record changes, that can easily be referenced
Thanks
-
Re: A5_Audit_trail(2)
Well what I have done is;
Save the Audit trail
Import the Audit Trail report to a Table from the CSV - can be as big as you like.
Create a search facility in a locked down form if you want.
Use the delete function to remove the CSV, but I wouldn't recommend that. Archiving is better.
As far as aggregating field changes at the Record level , that can be done in the Audit table table form via queries quite easily
I have worked a lot with legacy data, so that's why deleting history is an anathema to me.
-
Re: A5_Audit_trail(2)
But my code is falling down at the first part. The audit trail file is not always being created.
Records are also deleted to maximise performance, so cannot aggregate at record level, as the record numbers change over time.
Thanks
-
Re: A5_Audit_trail(2)
Been fiddling with this.
"CanSaveRecord in field rules" should be in the Form Events for CanSaveRecord, [Addin.run("audit_trail")], but you do mention field rules so just checking.
I struggled with getting a set to handle the Audit Trail so it works on a single table but you might have to roll your own with sets.
With a single table, security activated, the name of the user and the changes made are saved into my test directory.
Then, a cursory import of the .txt file shows a messy result but that could be worked on and developed.
You mention record numbers changing over time, does that mean you don't have an automatic Primary Key created?
Edit
Tried just opening the Audit.txt from a button on the form. Comes up in Notepad with all the options for finding, deleting etc. You could password protect that button.
-
Re: A5_Audit_trail(2)
I am using A5_Audit_trail(2) rather than Addin.run("audit_trail")
Whether used as a form event or as a field rule event I have the same issue.
Narrowed it down to failing when there is more than one form open, that are based on Sets that have the same child / link.
I guess the audit trail is checking for changes to the child / link table albeit there are none, but cannot get the right access - guess this is a bug.
Anyone have a suggested work around or could this bug be fixed.
Thanks
Terry
-
Re: A5_Audit_trail(2)
I finally got round this by creating my own audit trail to run from the Field Rules CanSaveRecord with a combination of a script running from the OnSaveRecord to get the correct Auto Numbered field & save as a memo into a new table.
Thanks for the suggestions.
If anyone would like the code, happy to share.
Terry
-
Re: A5_Audit_trail(2)
-
Re: A5_Audit_trail(2)
On a side note: I would suggest if your deleting for the sake of performance to simply save the record in a deleted files table. It has been a life saver to go back and explain to a user that they deleted the file that they claim is "missing" now. Not only that, I can name the exact date and time they did it or another user did. I also have a lot of redundant data in my tables which helps me easily piece back anything a user can do to "mess up" their data.