Table 710 Activity Log, source in 29
Source29
src/Layers/W1/BaseApp/Modules/System/Logging/ActivityLog.Table.al207 lines, Copyright (c) Microsoft Corporation. MIT
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Utilities;
using System.IO;
using System.Reflection;
using System.Security.AccessControl;
using System.Utilities;
table 710 "Activity Log"
{
Caption = 'Activity Log';
ReplicateData = false;
DataClassification = CustomerContent;
fields
{
field(1; ID; Integer)
{
AutoIncrement = true;
Caption = 'ID';
ToolTip = 'Specifies the activity ID.';
}
field(2; "Record ID"; RecordID)
{
Caption = 'Record ID';
DataClassification = CustomerContent;
}
field(3; "Activity Date"; DateTime)
{
Caption = 'Activity Date';
ToolTip = 'Specifies the data of the activity.';
}
field(4; "User ID"; Code[50])
{
Caption = 'User ID';
DataClassification = EndUserIdentifiableInformation;
TableRelation = User."User Name";
}
field(5; Status; Option)
{
Caption = 'Status';
ToolTip = 'Specifies the status of the activity.';
OptionCaption = 'Success,Failed';
OptionMembers = Success,Failed;
}
field(6; Context; Text[30])
{
Caption = 'Context';
ToolTip = 'Specifies the context in which the activity occurred.';
}
field(10; Description; Text[250])
{
Caption = 'Description';
ToolTip = 'Specifies the activity.';
}
field(20; "Activity Message"; Text[250])
{
Caption = 'Activity Message';
ToolTip = 'Specifies the status or error message for the activity.';
}
field(21; "Detailed Info"; BLOB)
{
Caption = 'Detailed Info';
}
field(22; "Table No Filter"; Integer)
{
Caption = 'Table No Filter';
}
}
keys
{
key(Key1; ID)
{
Clustered = true;
}
key(Key2; "Activity Date")
{
}
key(Key3; "Record ID")
{
}
}
fieldgroups
{
}
var
DataTypeNotValidErr: Label 'The specified variant type is not valid.';
NoDetailsMsg: Label 'The log does not contain any more details.';
ConfirmDeletingEntriesQst: Label 'Are you sure that you want to delete log entries?';
DeletingMsg: Label 'Deleting Entries...';
DeletedMsg: Label 'The entries were deleted from the log.';
procedure LogActivity(RelatedVariant: Variant; NewStatus: Option; NewContext: Text[30]; ActivityDescription: Text; ActivityMessage: Text)
var
UserCode: Code[50];
begin
UserCode := '';
LogActivityImplementation(RelatedVariant, NewStatus, NewContext, ActivityDescription, ActivityMessage, UserCode);
end;
procedure ShowEntries(RecordVariant: Variant)
var
DataTypeManagement: Codeunit "Data Type Management";
RecRef: RecordRef;
begin
if not DataTypeManagement.GetRecordRef(RecordVariant, RecRef) then
Error(DataTypeNotValidErr);
SetRange("Record ID", RecRef.RecordId);
Commit();
PAGE.RunModal(PAGE::"Activity Log", Rec);
end;
procedure SetDetailedInfoFromStream(InputStream: InStream)
var
InfoOutStream: OutStream;
begin
"Detailed Info".CreateOutStream(InfoOutStream);
CopyStream(InfoOutStream, InputStream);
Modify();
end;
procedure SetDetailedInfoFromText(Details: Text)
var
OutputStream: OutStream;
begin
"Detailed Info".CreateOutStream(OutputStream);
OutputStream.WriteText(Details);
Modify();
end;
[Scope('OnPrem')]
procedure Export(DefaultFileName: Text; ShowFileDialog: Boolean): Text
var
TempBlob: Codeunit "Temp Blob";
FileMgt: Codeunit "File Management";
begin
CalcFields("Detailed Info");
if not "Detailed Info".HasValue() then begin
Message(NoDetailsMsg);
exit;
end;
if DefaultFileName = '' then
DefaultFileName := 'Log.txt';
TempBlob.FromRecord(Rec, FieldNo("Detailed Info"));
exit(FileMgt.BLOBExport(TempBlob, DefaultFileName, ShowFileDialog));
end;
local procedure LogActivityImplementation(RelatedVariant: Variant; NewStatus: Option; NewContext: Text[30]; ActivityDescription: Text; ActivityMessage: Text; UserCode: Code[50])
var
DataTypeManagement: Codeunit "Data Type Management";
RecRef: RecordRef;
begin
Clear(Rec);
if not DataTypeManagement.GetRecordRef(RelatedVariant, RecRef) then
Error(DataTypeNotValidErr);
"Record ID" := RecRef.RecordId;
"Activity Date" := CurrentDateTime;
"User ID" := UserCode;
if "User ID" = '' then
"User ID" := CopyStr(UserId(), 1, MaxStrLen("User ID"));
Status := NewStatus;
Context := NewContext;
Description := CopyStr(ActivityDescription, 1, MaxStrLen(Description));
"Activity Message" := CopyStr(ActivityMessage, 1, MaxStrLen("Activity Message"));
"Table No Filter" := RecRef.Number;
Insert(true);
if StrLen(ActivityMessage) > MaxStrLen("Activity Message") then
SetDetailedInfoFromText(ActivityMessage);
end;
procedure LogActivityForUser(RelatedVariant: Variant; NewStatus: Option; NewContext: Text[30]; ActivityDescription: Text; ActivityMessage: Text; UserCode: Code[50])
begin
LogActivityImplementation(RelatedVariant, NewStatus, NewContext, ActivityDescription, ActivityMessage, UserCode);
end;
procedure DeleteEntries(DaysOld: Integer)
var
Window: Dialog;
begin
if not Confirm(ConfirmDeletingEntriesQst) then
exit;
Window.Open(DeletingMsg);
if DaysOld > 0 then
SetFilter("Activity Date", '<=%1', CreateDateTime(Today - DaysOld, Time));
DeleteAll();
Window.Close();
SetRange("Activity Date");
Message(DeletedMsg);
end;
}