Page 5338 Integration Synch. Job List, source in 29
Source29
src/Layers/W1/BaseApp/Integration/SynchEngine/IntegrationSynchJobList.Page.al282 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.Integration.SyncEngine;
using Microsoft.Integration.Dataverse;
using System.Reflection;
page 5338 "Integration Synch. Job List"
{
ApplicationArea = Suite;
Caption = 'Integration Synchronization Jobs';
DataCaptionExpression = Rec."Integration Table Mapping Name";
DeleteAllowed = true;
Editable = false;
InsertAllowed = false;
LinksAllowed = false;
ModifyAllowed = false;
PageType = List;
SourceTable = "Integration Synch. Job";
SourceTableView = sorting("Start Date/Time", ID)
order(descending);
UsageCategory = Lists;
layout
{
area(content)
{
repeater(Group)
{
field("Start Date/Time"; Rec."Start Date/Time")
{
ApplicationArea = Suite;
}
field("Finish Date/Time"; Rec."Finish Date/Time")
{
ApplicationArea = Suite;
}
field(Duration; Duration)
{
ApplicationArea = Suite;
Caption = 'Duration';
HideValue = DoHideDuration;
ToolTip = 'Specifies how long the data synchronization has taken.';
}
field("Integration Table Mapping Name"; Rec."Integration Table Mapping Name")
{
ApplicationArea = Suite;
Visible = false;
}
field(Uncoupled; Rec.Uncoupled)
{
ApplicationArea = Suite;
Visible = UncouplingSpecificColumnsVisible;
}
field(Coupled; Rec.Coupled)
{
ApplicationArea = Suite;
Visible = CouplingSpecificColumnsVisible;
}
field(Inserted; Rec.Inserted)
{
ApplicationArea = Suite;
Visible = SynchSpecificColumnsVisible;
trigger OnDrillDown()
var
IntegrationTableMapping: Record "Integration Table Mapping";
LocalRecordRef: RecordRef;
VarLocalRecordRef: Variant;
begin
if Rec."Synch. Direction" <> Rec."Synch. Direction"::FromIntegrationTable then
exit;
if Rec.Inserted = 0 then
exit;
if not IntegrationTableMapping.Get(Rec."Integration Table Mapping Name") then
exit;
if IntegrationTableMapping."Table ID" = 0 then
exit;
LocalRecordRef.Open(IntegrationTableMapping."Table ID");
LocalRecordRef.Field(LocalRecordRef.SystemCreatedAtNo()).SetRange(Rec."Start Date/Time", Rec."Finish Date/Time");
if not LocalRecordRef.IsEmpty() then begin
VarLocalRecordRef := LocalRecordRef;
PAGE.Run(0, VarLocalRecordRef);
end;
end;
}
field(Modified; Rec.Modified)
{
ApplicationArea = Suite;
}
field(Deleted; Rec.Deleted)
{
ApplicationArea = Suite;
Visible = SynchSpecificColumnsVisible;
}
field(Unchanged; Rec.Unchanged)
{
ApplicationArea = Suite;
Visible = SynchSpecificColumnsVisible;
}
field(Failed; Rec.Failed)
{
ApplicationArea = Suite;
trigger OnDrillDown()
var
IntegrationSynchJobErrors: Record "Integration Synch. Job Errors";
begin
IntegrationSynchJobErrors.SetCurrentKey("Date/Time", "Integration Synch. Job ID");
IntegrationSynchJobErrors.Ascending := false;
IntegrationSynchJobErrors.FilterGroup(2);
IntegrationSynchJobErrors.SetRange("Integration Synch. Job ID", Rec.ID);
IntegrationSynchJobErrors.FilterGroup(0);
IntegrationSynchJobErrors.FindFirst();
PAGE.Run(PAGE::"Integration Synch. Error List", IntegrationSynchJobErrors);
end;
}
field(Skipped; Rec.Skipped)
{
ApplicationArea = Suite;
trigger OnDrillDown()
var
IntegrationTableMapping: Record "Integration Table Mapping";
CRMIntegrationRecord: Record "CRM Integration Record";
CRMSkippedRecords: Page "CRM Skipped Records";
begin
if IntegrationTableMapping.Get(Rec."Integration Table Mapping Name") then begin
CRMIntegrationRecord.SetRange("Table ID", IntegrationTableMapping."Table ID");
CRMIntegrationRecord.SetRange(Skipped, true);
if CRMIntegrationRecord.FindFirst() then begin
CRMSkippedRecords.SetRecords(CRMIntegrationRecord);
CRMSkippedRecords.Run();
end;
end;
end;
}
field("Synch. Direction"; Rec."Synch. Direction")
{
ApplicationArea = Suite;
Caption = 'Synch. Direction';
Visible = false;
}
field(Direction; SynchDirection)
{
ApplicationArea = Suite;
Caption = 'Direction';
ToolTip = 'Specifies in which direction data is synchronized.';
Visible = SynchSpecificColumnsVisible;
}
field(Type; Rec.Type)
{
ApplicationArea = Suite;
Caption = 'Type';
Visible = SynchSpecificColumnsVisible and UncouplingSpecificColumnsVisible and CouplingSpecificColumnsVisible;
}
field(Message; Rec.Message)
{
ApplicationArea = Suite;
}
}
}
}
actions
{
area(navigation)
{
action(Delete7days)
{
ApplicationArea = Suite;
Caption = 'Delete Entries Older Than 7 Days';
Enabled = HasRecords;
Image = ClearLog;
ToolTip = 'Delete log information for job queue entries that are older than seven days.';
trigger OnAction()
begin
Rec.DeleteEntries(7);
end;
}
action(Delete0days)
{
ApplicationArea = Suite;
Caption = 'Delete All Entries';
Enabled = HasRecords;
Image = Delete;
ToolTip = 'Delete all error log information for job queue entries.';
trigger OnAction()
begin
Rec.DeleteEntries(0);
end;
}
}
area(Promoted)
{
group(Category_Process)
{
Caption = 'Process';
actionref(Delete7days_Promoted; Delete7days)
{
}
actionref(Delete0days_Promoted; Delete0days)
{
}
}
}
}
trigger OnInit()
var
TempIntegrationSynchJob: Record "Integration Synch. Job" temporary;
JobTypeFilter: Text;
begin
JobTypeFilter := Rec.GetFilter(Type);
if JobTypeFilter <> '' then begin
TempIntegrationSynchJob.SetRange(Type, TempIntegrationSynchJob.Type::Uncoupling);
UncouplingSpecificColumnsVisible := Rec.GetFilter(Type) = TempIntegrationSynchJob.GetFilter(Type);
TempIntegrationSynchJob.SetRange(Type, TempIntegrationSynchJob.Type::Coupling);
CouplingSpecificColumnsVisible := Rec.GetFilter(Type) = TempIntegrationSynchJob.GetFilter(Type);
SynchSpecificColumnsVisible := (not UncouplingSpecificColumnsVisible) and (not CouplingSpecificColumnsVisible);
if UncouplingSpecificColumnsVisible then
CurrPage.Caption(IntegrationUncouplingJobsCaptionTxt);
if CouplingSpecificColumnsVisible then
CurrPage.Caption(IntegrationCouplingJobsCaptionTxt);
end else begin
UncouplingSpecificColumnsVisible := true;
CouplingSpecificColumnsVisible := true;
SynchSpecificColumnsVisible := true;
end;
end;
trigger OnAfterGetRecord()
var
IntegrationTableMapping: Record "Integration Table Mapping";
TableMetadata: Record "Table Metadata";
begin
SynchDirection := '';
if IntegrationTableMapping.Get(Rec."Integration Table Mapping Name") then begin
TableMetadata.Get(IntegrationTableMapping."Table ID");
if not (Rec.Type in [Rec.Type::Uncoupling, Rec.Type::Coupling]) then
if Rec."Synch. Direction" = Rec."Synch. Direction"::ToIntegrationTable then
SynchDirection :=
StrSubstNo(SynchDirectionTxt, TableMetadata.Caption, IntegrationTableMapping.GetExtendedIntegrationTableCaption())
else
SynchDirection :=
StrSubstNo(SynchDirectionTxt, IntegrationTableMapping.GetExtendedIntegrationTableCaption(), TableMetadata.Caption);
end;
DoHideDuration := Rec."Finish Date/Time" < Rec."Start Date/Time";
if DoHideDuration then
Clear(Duration)
else
Duration := Rec."Finish Date/Time" - Rec."Start Date/Time";
HasRecords := not Rec.IsEmpty();
end;
var
SynchDirectionTxt: Label '%1 to %2.', Comment = '%1 = Source table caption, %2 = Destination table caption';
IntegrationUncouplingJobsCaptionTxt: Label 'Integration Uncoupling Jobs';
IntegrationCouplingJobsCaptionTxt: Label 'Integration Coupling Jobs';
SynchDirection: Text;
DoHideDuration: Boolean;
Duration: Duration;
HasRecords: Boolean;
CouplingSpecificColumnsVisible: Boolean;
UncouplingSpecificColumnsVisible: Boolean;
SynchSpecificColumnsVisible: Boolean;
}