Codeunit 9989 Word Template Field Selection, source in 28
Source242526272829metadata in 28
src/System Application/App/Word Templates/src/WordTemplateFieldSelection.Codeunit.al289 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 System.Integration.Word;
using System.Reflection;
codeunit 9989 "Word Template Field Selection"
{
Access = Internal;
InherentEntitlements = X;
InherentPermissions = X;
Permissions = tabledata "Word Template Field" = rimd,
tabledata Field = r;
var
CustomMergeFieldTok: Label 'CALC_%1', Locked = true;
procedure SetExcludedFields(WordTemplateCode: Code[30]; TableId: Integer; ExcludeFieldNames: List of [Text[30]])
var
Field: Record Field;
WordTemplateField: Record "Word Template Field";
ExcludeFieldName: Text[30];
begin
WordTemplateField.SetRange("Word Template Code", WordTemplateCode);
WordTemplateField.SetRange("Table ID", TableId);
WordTemplateField.DeleteAll();
foreach ExcludeFieldName in ExcludeFieldNames do begin
WordTemplateField.Init();
WordTemplateField."Word Template Code" := WordTemplateCode;
WordTemplateField."Table ID" := TableId;
WordTemplateField."Field Name" := ExcludeFieldName;
Field.SetRange(TableNo, TableId);
Field.SetRange(FieldName, ExcludeFieldName);
if Field.FindFirst() then
WordTemplateField."Field No." := Field."No.";
WordTemplateField.Insert();
end;
end;
procedure SetIncludeFields(WordTemplateCode: Code[30]; TableId: Integer; IncludeFieldNames: List of [Text[30]]; var WordTemplateField: Record "Word Template Field")
var
Field: Record Field;
IncludeFieldName: Text[30];
begin
foreach IncludeFieldName in IncludeFieldNames do
if WordTemplateField.Get(WordTemplateCode, TableId, IncludeFieldName) then begin
WordTemplateField.Exclude := false;
WordTemplateField.Modify();
end else begin
WordTemplateField.Init();
WordTemplateField."Word Template Code" := WordTemplateCode;
WordTemplateField."Table ID" := TableId;
WordTemplateField."Field Name" := IncludeFieldName;
WordTemplateField.Exclude := false;
Field.SetRange(TableNo, TableId);
Field.SetRange(FieldName, IncludeFieldName);
if Field.FindFirst() then
WordTemplateField."Field No." := Field."No.";
WordTemplateField.Insert();
end;
end;
procedure GetExcludedFields(WordTemplateCode: Code[30]; TableId: Integer) ExcludedFieldNames: List of [Text[30]]
var
WordTemplateField: Record "Word Template Field";
begin
WordTemplateField.SetRange("Word Template Code", WordTemplateCode);
WordTemplateField.SetRange("Table ID", TableId);
if WordTemplateField.FindSet() then
repeat
ExcludedFieldNames.Add(WordTemplateField."Field Name");
until WordTemplateField.Next() = 0;
end;
procedure GetCustomTableFields(TableId: Integer) CustomTableFieldNames: List of [Text[30]]
var
TempWordTemplateCustomField: Record "Word Template Custom Field" temporary;
WordTemplateCustomField: Codeunit "Word Template Custom Field";
WordTemplate: Codeunit "Word Template";
begin
WordTemplateCustomField.SetCurrentTableId(TableId);
WordTemplate.OnGetCustomFieldNames(WordTemplateCustomField);
WordTemplateCustomField.GetCustomFields(TempWordTemplateCustomField);
if TempWordTemplateCustomField.FindSet() then
repeat
CustomTableFieldNames.Add(StrSubstNo(CustomMergeFieldTok, TempWordTemplateCustomField.Name));
until TempWordTemplateCustomField.Next() = 0;
end;
procedure GetSupportedTableFields(TableId: Integer) FieldNames: List of [Text[30]]
var
Field: Record Field;
begin
Field.SetRange(TableNo, TableId);
if Field.FindSet() then
repeat
if IsFieldSupported(Field) then
FieldNames.Add(Field.FieldName);
until Field.Next() = 0;
end;
procedure SelectDefaultFieldsForTable(WordTemplateCode: Code[30]; TableId: Integer; var WordTemplateField: Record "Word Template Field")
var
Field: Record Field;
begin
// By default exclude everything except text fields, the primary key and custom fields
WordTemplateField.Reset();
WordTemplateField.SetRange("Word Template Code", WordTemplateCode);
WordTemplateField.SetRange("Table ID", TableId);
WordTemplateField.DeleteAll();
Field.SetRange(TableNo, TableId);
if Field.FindSet() then
repeat
WordTemplateField."Word Template Code" := WordTemplateCode;
WordTemplateField."Table ID" := TableId;
WordTemplateField."Field Name" := Field.FieldName;
WordTemplateField."Field No." := Field."No.";
WordTemplateField.Exclude := true;
if (Field.Type = Field.Type::Text) or Field.IsPartOfPrimaryKey then
WordTemplateField.Exclude := false;
WordTemplateField.Insert();
until Field.Next() = 0;
end;
procedure IsFieldSupported(Field: Record Field): Boolean
begin
exit(not (Field.Type in [Field.Type::Media, Field.Type::MediaSet]));
end;
procedure TableUsesDefaultFields(WordTemplateCode: Code[30]; TableId: Integer; var WordTemplateField: Record "Word Template Field"): Boolean
begin
WordTemplateField.Reset();
WordTemplateField.SetRange("Word Template Code", WordTemplateCode);
WordTemplateField.SetRange("Table ID", TableId);
exit(WordTemplateField.IsEmpty());
end;
procedure IsCustomFieldSelected(WordTemplateCode: Code[30]; TableId: Integer; FieldName: Text[30]; var WordTemplateField: Record "Word Template Field"): Boolean
begin
WordTemplateField.Reset();
WordTemplateField.SetRange("Word Template Code", WordTemplateCode);
WordTemplateField.SetRange("Table ID", TableId);
if WordTemplateField.IsEmpty() then
exit(true); // If no fields are selected, then custom fields are selected by default
WordTemplateField.SetRange("Field Name", FieldName);
exit(not (WordTemplateField.FindFirst() and WordTemplateField.Exclude));
end;
procedure CalculateNoSelectedFields(TableId: Integer; var TempWordTemplateField: Record "Word Template Field" temporary): Integer
var
Field: Record Field;
TempWordTemplateCustomField: Record "Word Template Custom Field" temporary;
WordTemplate: Codeunit "Word Template";
WordTemplateCustomField: Codeunit "Word Template Custom Field";
TableFields: Integer;
CustomTableFields: Integer;
ExcludedFields: Integer;
begin
Field.SetRange(TableNo, TableId);
TableFields := Field.Count();
WordTemplateCustomField.SetCurrentTableId(TableId);
WordTemplate.OnGetCustomFieldNames(WordTemplateCustomField);
WordTemplateCustomField.GetCustomFields(TempWordTemplateCustomField);
CustomTableFields := TempWordTemplateCustomField.Count();
TempWordTemplateField.Reset();
TempWordTemplateField.SetRange("Table ID", TableId);
TempWordTemplateField.SetRange(Exclude, true);
ExcludedFields := TempWordTemplateField.Count();
exit(TableFields + CustomTableFields - ExcludedFields);
end;
procedure GetAllTableFields(TableId: Integer; var TempWordTemplateField: Record "Word Template Field" temporary)
var
Field: Record Field;
TempWordTemplateCustomField: Record "Word Template Custom Field" temporary;
WordTemplate: Codeunit "Word Template";
WordTemplateCustomField: Codeunit "Word Template Custom Field";
begin
TempWordTemplateField.Reset();
TempWordTemplateField.SetRange("Table ID", TableId);
TempWordTemplateField.DeleteAll();
// Add existing table fields
Field.SetRange(TableNo, TableId);
if Field.FindSet() then
repeat
if IsFieldSupported(Field) then begin
TempWordTemplateField."Table ID" := TableId;
TempWordTemplateField."Field Name" := Field.FieldName;
TempWordTemplateField."Field No." := Field."No.";
TempWordTemplateField.Insert();
end
until Field.Next() = 0;
// Add custom fields
WordTemplateCustomField.SetCurrentTableId(TableId);
WordTemplate.OnGetCustomFieldNames(WordTemplateCustomField);
WordTemplateCustomField.GetCustomFields(TempWordTemplateCustomField);
if TempWordTemplateCustomField.FindSet() then
repeat
TempWordTemplateField.Init();
TempWordTemplateField."Table ID" := TableId;
TempWordTemplateField."Field Name" := StrSubstNo(CustomMergeFieldTok, TempWordTemplateCustomField.Name);
TempWordTemplateField.Insert();
until TempWordTemplateCustomField.Next() = 0;
end;
procedure ApplyChangesTo(TableId: Integer; var FromTempWordTemplateField: Record "Word Template Field" temporary; var ToTempWordTemplateField: Record "Word Template Field" temporary)
begin
ToTempWordTemplateField.Reset();
ToTempWordTemplateField.SetRange("Table ID", TableId);
ToTempWordTemplateField.DeleteAll();
FromTempWordTemplateField.Reset();
FromTempWordTemplateField.SetRange("Table ID", TableId);
if FromTempWordTemplateField.FindSet() then
repeat
ToTempWordTemplateField := FromTempWordTemplateField;
ToTempWordTemplateField.Insert();
until FromTempWordTemplateField.Next() = 0;
end;
procedure CopyExcludeFields(TableId: Integer; var FromTempWordTemplateField: Record "Word Template Field" temporary; var ToTempWordTemplateField: Record "Word Template Field" temporary)
var
FieldsSelectionIsSetup: Boolean;
begin
FromTempWordTemplateField.Reset();
FromTempWordTemplateField.SetRange("Table ID", TableId);
FieldsSelectionIsSetup := FromTempWordTemplateField.FindSet();
if FieldsSelectionIsSetup then
repeat
if ToTempWordTemplateField.Get(FromTempWordTemplateField."Word Template Code", FromTempWordTemplateField."Table ID", FromTempWordTemplateField."Field Name") then begin
ToTempWordTemplateField.Exclude := FromTempWordTemplateField.Exclude;
ToTempWordTemplateField.Modify();
end;
until FromTempWordTemplateField.Next() = 0
else
SelectLegacyDefaultFieldsForTable(TableId, ToTempWordTemplateField);
end;
procedure ShowFieldSelection(TableId: Integer; var TempWordTemplateField: Record "Word Template Field" temporary)
var
WordTemplatesFieldSelection: Page "Word Templates Field Selection";
begin
WordTemplatesFieldSelection.SetTemporaryFieldSelection(TableId, TempWordTemplateField);
WordTemplatesFieldSelection.LookupMode(true);
if WordTemplatesFieldSelection.RunModal() <> Action::LookupOK then
exit;
WordTemplatesFieldSelection.ApplyChangesTo(TempWordTemplateField);
end;
local procedure SelectLegacyDefaultFieldsForTable(TableId: Integer; var TempWordTemplateField: Record "Word Template Field" temporary)
var
Field: Record Field;
begin
// For existing word templates we need to include the old default fields to avoid breaking anything
TempWordTemplateField.Reset();
TempWordTemplateField.SetRange("Word Template Code", '');
TempWordTemplateField.SetRange("Table ID", TableId);
TempWordTemplateField.DeleteAll();
Field.SetRange(TableNo, TableId);
if Field.FindSet() then
repeat
TempWordTemplateField."Word Template Code" := '';
TempWordTemplateField."Table ID" := TableId;
TempWordTemplateField."Field Name" := Field.FieldName;
TempWordTemplateField."Field No." := Field."No.";
TempWordTemplateField.Exclude := false;
if not IsFieldSupported(Field) then
TempWordTemplateField.Exclude := true;
if (Field.Class = Field.Class::FlowFilter) or (Field.Type in [Field.Type::BLOB, Field.Type::Media, Field.Type::MediaSet, Field.Type::RecordID, Field.Type::TableFilter]) then
TempWordTemplateField.Exclude := true;
TempWordTemplateField.Insert();
until Field.Next() = 0;
end;
}