Page 6711 OData Setup Wizard

App
Base Application
Namespace
System.Integration
Versions
17-28
Source table
2000000168

Procedures, 2

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/System/OData/ODataSetupWizard.Page.al949 lines, Copyright (c) Microsoft Corporation. MIT

namespace System.Integration;

using System;
using System.Environment;
using System.Environment.Configuration;
using System.Integration.Excel;
using System.Reflection;
using System.Utilities;

page 6711 "OData Setup Wizard"
{
    Caption = 'Reporting Data Setup';
    PageType = NavigatePage;
    SourceTable = "Tenant Web Service";
    SourceTableTemporary = true;
    UsageCategory = Administration;
    AdditionalSearchTerms = 'Setup up reporting data for your own reports';

    layout
    {
        area(content)
        {
            group(Control17)
            {
                Editable = false;
                ShowCaption = false;
                Visible = TopBannerVisible and not (CurrentPage = 5);
#pragma warning disable AA0100
                field("MediaResourcesStandard.""Media Reference"""; MediaResourcesStandard."Media Reference")
#pragma warning restore AA0100
                {
                    ApplicationArea = Basic, Suite;
                    Editable = false;
                    ShowCaption = false;
                }
            }
            group(Control19)
            {
                Editable = false;
                ShowCaption = false;
                Visible = TopBannerVisible and (CurrentPage = 5);
#pragma warning disable AA0100
                field("MediaResourcesDone.""Media Reference"""; MediaResourcesDone."Media Reference")
#pragma warning restore AA0100
                {
                    ApplicationArea = Basic, Suite;
                    Editable = false;
                    ShowCaption = false;
                }
            }
            group(Step1)
            {
                Visible = CurrentPage = 1;
                group("Para1.1")
                {
                    Caption = 'Welcome to Reporting Data Setup';
                    label("Para1.1.1_aslabel")
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'You can create data sets that you can use for building reports in Excel, Power BI, or any other reporting tool that works with an OData data source.';
                    }
                    label("Whitespace1.1.1")
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = '';
                    }
                    label("Para1.1.2")
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'For some tools such as Power BI, selecting columns or setting filters from this assisted setup guide will have no effect. After you complete the assisted setup, use Power BI Desktop to create or modify reports to use the newly created web service, selecting the columns and setting the filters as needed.';
                    }
                }
                group("Para1.2")
                {
                    Caption = 'Let''s go!';
                    label("Para1.2.1_aslabel")
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Choose Next so you can create reporting data sets.';
                    }
                }
            }
            group(Step2)
            {
                Caption = '';
                Visible = CurrentPage = 2;
                group("Para2.1")
                {
                    Caption = 'I want to...';
                    field(ActionType; ActionType)
                    {
                        ApplicationArea = Basic, Suite;
                        OptionCaption = 'Create a new data set,Create a copy of an existing data set,Edit an existing data set';
                        ShowCaption = false;

                        trigger OnValidate()
                        begin
                            Rec."Object ID" := 0;
                            ClearTables();
                            ClearObjectType();
                            ClearName();
                        end;
                    }
                }
            }
            group(Step3)
            {
                InstructionalText = '';
                Visible = CurrentPage = 3;
                group("Para3.1")
                {
                    Caption = 'Select the data you would like to use for your reports and define a name for this data set.';
                    InstructionalText = '';
                    group(Control28)
                    {
                        ShowCaption = false;
                        Visible = ActionType > 0;
                        field(NameLookup; ServiceNameLookup)
                        {
                            ApplicationArea = Basic, Suite;
                            AssistEdit = false;
                            Caption = 'Name';
                            Lookup = true;

                            trigger OnLookup(var Text: Text): Boolean
                            var
                                TenantWebService: Record "Tenant Web Service";
                                TenantWebServicesLookup: Page "Tenant Web Services Lookup";
                            begin
                                TenantWebServicesLookup.LookupMode := true;
                                if TenantWebServicesLookup.RunModal() = ACTION::LookupOK then begin
                                    TenantWebServicesLookup.GetRecord(TenantWebService);
                                    ServiceNameLookup := TenantWebService."Service Name";
                                    ObjectTypeLookup := TenantWebService."Object Type";
                                    Rec."Object ID" := TenantWebService."Object ID";
                                end;
                                Rec."Service Name" := ServiceNameLookup;
                                Rec."Object Type" := ObjectTypeLookup;
                                Rec."Object ID" := TenantWebService."Object ID";
                                if ActionType = ActionType::"Create a copy of an existing data set" then
                                    Rec."Service Name" := ServiceNameEdit;
                                ClearTables();
                            end;

                            trigger OnValidate()
                            var
                                TenantWebService: Record "Tenant Web Service";
                            begin
                                TenantWebService.SetRange("Service Name", ServiceNameLookup);
                                if TenantWebService.FindFirst() then begin
                                    Rec."Service Name" := ServiceNameLookup;
                                    ObjectTypeLookup := TenantWebService."Object Type";
                                    Rec."Object Type" := ObjectTypeLookup;
                                    Rec."Object ID" := TenantWebService."Object ID";
                                    if ActionType = ActionType::"Create a copy of an existing data set" then
                                        Rec."Service Name" := ServiceNameEdit;
                                end else
                                    Error(UseLookupErr);
                            end;
                        }
                    }
                    group(Control32)
                    {
                        ShowCaption = false;
                        Visible = ActionType < 2;
                        field(ServiceNameEdit; ServiceNameEdit)
                        {
                            ApplicationArea = Basic, Suite;
                            Caption = 'New Name';
                            ExtendedDatatype = None;
                            ToolTip = 'Specifies the service name. Name cannot contain space(s).';

                            trigger OnValidate()
                            var
                                TenantWebService: Record "Tenant Web Service";
                                WebServiceManagement: Codeunit "Web Service Management";
                            begin
                                Rec."Service Name" := ServiceNameEdit;
                                if not WebServiceManagement.IsServiceNameValid(ServiceNameEdit) then
                                    Error(WebServiceNameNotValidErr);
                                if not (ActionType = ActionType::"Edit an existing data set") then begin
                                    TenantWebService.SetRange("Service Name", Rec."Service Name");
                                    if TenantWebService.FindFirst() then
                                        Error(DuplicateServiceNameErr);
                                end;
                            end;
                        }
                    }
                    field(ObjectTypeLookup; ObjectTypeLookup)
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Data Source Type';
                        Enabled = ActionType = 0;
                        OptionCaption = ',,,,,,,,Page,Query';

                        trigger OnValidate()
                        begin
                            Rec."Object Type" := ObjectTypeLookup;
                            if Rec."Object Type" <> xRec."Object Type" then begin
                                ClearTables();
                                Rec."Object ID" := 0;
                            end;
                        end;
                    }
                    field("Object ID"; Rec."Object ID")
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Data Source Id';
                        Enabled = ActionType = 0;
                        Lookup = true;

                        trigger OnLookup(var Text: Text): Boolean
                        var
                            AllObjWithCaption: Record AllObjWithCaption;
                            AllObjectsWithCaption: Page "All Objects with Caption";
                        begin
                            if ObjectTypeLookup = Rec."Object Type"::Page then begin
                                AllObjWithCaption.SetRange("Object Type", AllObjWithCaption."Object Type"::Page);
                                AllObjWithCaption.SetRange("Object Subtype", 'List')
                            end else
                                if ObjectTypeLookup = Rec."Object Type"::Query then
                                    AllObjWithCaption.SetRange("Object Type", AllObjWithCaption."Object Type"::Query);

                            AllObjectsWithCaption.SetTableView(AllObjWithCaption);

                            AllObjectsWithCaption.LookupMode := true;
                            if AllObjectsWithCaption.RunModal() = ACTION::LookupOK then begin
                                AllObjectsWithCaption.GetRecord(AllObjWithCaption);
                                if not ((AllObjWithCaption."Object Type" = AllObjWithCaption."Object Type"::Page) or
                                        (AllObjWithCaption."Object Type" = AllObjWithCaption."Object Type"::Query))
                                then
                                    Error(InvalidObjectTypeErr);
                                if (AllObjWithCaption."Object Type" = AllObjWithCaption."Object Type"::Page) and
                                   (AllObjWithCaption."Object Subtype" <> 'List')
                                then
                                    Error(InvalidPageTypeErr);
                                Rec."Object ID" := AllObjWithCaption."Object ID";
                                ObjectTypeLookup := AllObjWithCaption."Object Type";

                                if Rec."Object ID" <> xRec."Object ID" then
                                    ClearTables();
                            end;
                        end;

                        trigger OnValidate()
                        var
                            AllObjWithCaption: Record AllObjWithCaption;
                        begin
                            if ObjectTypeLookup = ObjectTypeLookup::Page then begin
                                AllObjWithCaption.SetRange("Object Type", AllObjWithCaption."Object Type"::Page);
                                AllObjWithCaption.SetRange("Object ID", Rec."Object ID");
                                if AllObjWithCaption.FindFirst() then
                                    if AllObjWithCaption."Object Subtype" <> 'List' then
                                        Error(InvalidPageTypeErr);
                            end;

                            if Rec."Object ID" <> xRec."Object ID" then
                                ClearTables();
                        end;
                    }
                    field(ObjectName; DisplayObjectName())
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Data Source Name';
                        Enabled = false;
                    }
                }
            }
            group(Step4)
            {
                Caption = '';
                Visible = CurrentPage = 4;
                group("Para4.1")
                {
                    Caption = 'Choose the Fields to include in your data set';
                    InstructionalText = 'Changing fields will clear previously set filters.';
                    part(ODataColSubForm; "OData Column Choose SubForm")
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = ' ';
                    }
                }
            }
            group(Step5)
            {
                Visible = CurrentPage = 5;
                group("Para5.1")
                {
                    Caption = 'Success!';
                    label("Para5.1.1_aslabel")
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Your data set has been successfully created!';
                    }
                    field(ODataUrl; oDataUrl)
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'OData URL';
                        Editable = false;
                        ExtendedDatatype = URL;
                    }
                }
            }
        }
    }

    actions
    {
        area(processing)
        {
            action(AddFiltersAction)
            {
                ApplicationArea = Basic, Suite;
                Caption = '&Add Filters';
                Enabled = CurrentPage = 4;
                Image = "Filter";
                InFooterBar = true;
                Visible = true;

                trigger OnAction()
                begin
                    Clear(ChangeFields);
                    ChangeFields := CurrPage.ODataColSubForm.PAGE.IncludeIsChanged();
                    if ChangeFields then begin
                        Clear(TempTenantWebServiceFilter);
                        TempTenantWebServiceFilter.DeleteAll();
                    end;

                    Clear(TempTenantWebServiceColumns);
                    if TempTenantWebServiceColumns.FindFirst() then
                        TempTenantWebServiceColumns.DeleteAll();

                    CurrPage.ODataColSubForm.PAGE.GetColumns(TempTenantWebServiceColumns);
                    if not TempTenantWebServiceColumns.FindFirst() then
                        Error(MissingFieldsErr);
                    GetFilterText(TempTenantWebServiceColumns)
                end;
            }
            action(BackAction)
            {
                ApplicationArea = Basic, Suite;
                Caption = '&Back';
                Enabled = (CurrentPage > 1) and (CurrentPage < 5);
                Image = PreviousRecord;
                InFooterBar = true;

                trigger OnAction()
                begin
                    CurrentPage := CurrentPage - 1;
                    CurrPage.Update();
                end;
            }
            action(NextAction)
            {
                ApplicationArea = Basic, Suite;
                Caption = '&Next';
                Enabled = (CurrentPage >= 1) and (CurrentPage < 4);
                Image = NextRecord;
                InFooterBar = true;

                trigger OnAction()
                begin
                    case CurrentPage of
                        1, 2:
                            CurrentPage := CurrentPage + 1;
                        3:
                            begin
                                if (ActionType = ActionType::"Create a new data set") and (ServiceNameEdit = '') then
                                    Error(MissingServiceNameErr);
                                if (ActionType = ActionType::"Create a copy of an existing data set") and
                                   ((ServiceNameEdit = '') or (ServiceNameLookup = ''))
                                then
                                    Error(MissingServiceNameErr);
                                if (ActionType = ActionType::"Edit an existing data set") and (ServiceNameLookup = '') then
                                    Error(MissingServiceNameErr);
                                if Rec."Object ID" = 0 then
                                    Error(MissingObjectIDErr);

                                CurrPage.Update();
                                CurrPage.ODataColSubForm.PAGE.InitColumns(ObjectTypeLookup, Rec."Object ID", ActionType, ServiceNameLookup, ServiceNameEdit);
                                CurrentPage := CurrentPage + 1;
                            end;
                    end;

                    CurrPage.Update(false);
                end;
            }
            action(PublishAction)
            {
                ApplicationArea = Basic, Suite;
                Caption = '&Publish';
                Enabled = CurrentPage = 4;
                Image = Post;
                InFooterBar = true;

                trigger OnAction()
                var
                    GuidedExperience: Codeunit "Guided Experience";
                begin
                    if TempTenantWebServiceColumns.FindFirst() then
                        TempTenantWebServiceColumns.DeleteAll();
                    CurrPage.ODataColSubForm.PAGE.GetColumns(TempTenantWebServiceColumns);
                    if not TempTenantWebServiceColumns.FindFirst() then
                        Error(PublishWithoutFieldsErr);
                    CopyTempTableToConcreteTable();
                    oDataUrl := DisplayODataUrl();
                    GuidedExperience.CompleteAssistedSetup(ObjectType::Page, Page::"OData Setup Wizard");
                    PublishFlag := true;
                    CurrentPage := CurrentPage + 1;
                    CurrPage.Update(false);
                end;
            }
            action(FinishAction)
            {
                ApplicationArea = Basic, Suite;
                Caption = '&Finish';
                Enabled = CurrentPage = 5;
                Image = Approve;
                InFooterBar = true;

                trigger OnAction()
                begin
                    CurrPage.Close();
                end;
            }
            action(CreateExcelWorkBook)
            {
                ApplicationArea = Basic, Suite;
                Caption = '&Excel';
                Enabled = (CurrentPage = 5);
                InFooterBar = true;
                Visible = (ExcelVisible = true);

                trigger OnAction()
                var
                    TenantWebService: Record "Tenant Web Service";
                    EditinExcel: Codeunit "Edit in Excel";
                begin
                    if (ActionType = ActionType::"Create a new data set") or (ActionType = ActionType::"Create a copy of an existing data set") then begin
                        if not TenantWebService.Get(ObjectTypeLookup, ServiceNameEdit) then
                            Error(ServiceNotFoundErr);
                        EditinExcel.GenerateExcelWorkBook(TenantWebService, EditinExcelFilters);
                    end else begin
                        if not TenantWebService.Get(ObjectTypeLookup, ServiceNameLookup) then
                            Error(ServiceNotFoundErr);
                        EditinExcel.GenerateExcelWorkBook(TenantWebService, EditinExcelFilters);
                    end;
                end;
            }
        }
    }

    trigger OnInit()
    begin
        CheckPermissions();
        LoadTopBanners();
        CurrentPage := 1;
        ObjectTypeLookup := Rec."Object Type"::Page;
        Rec."Object Type" := Rec."Object Type"::Page;
        EditInExcelVisible();
    end;

    trigger OnOpenPage()
    begin
        Rec.Insert();
    end;

    trigger OnQueryClosePage(CloseAction: Action): Boolean
    begin
        if not PublishFlag then
            if CloseAction = ACTION::OK then
                if not Confirm(NAVNotSetUpQst, false) then
                    exit(false);
    end;

    var
        MediaRepositoryStandard: Record "Media Repository";
        MediaRepositoryDone: Record "Media Repository";
        MediaResourcesStandard: Record "Media Resources";
        MediaResourcesDone: Record "Media Resources";
        TempTenantWebServiceColumns: Record "Tenant Web Service Columns" temporary;
        TempTenantWebServiceFilter: Record "Tenant Web Service Filter" temporary;
        EditinExcelFilters: Codeunit "Edit in Excel Filters";
        ClientTypeManagement: Codeunit "Client Type Management";
        CurrentPage: Integer;
        PublishFlag: Boolean;
        TopBannerVisible: Boolean;
        MissingServiceNameErr: Label 'Please enter a Name for the data set.';
        MissingObjectIDErr: Label 'Please enter a data source for the data set.';
        DuplicateServiceNameErr: Label 'This name already exists.';
        WebServiceNameNotValidErr: Label 'The service name is not valid. Please make sure name does not contain space(s).';
        ChangeFields: Boolean;
        ActionType: Option "Create a new data set","Create a copy of an existing data set","Edit an existing data set";
        ServiceNameLookup: Text[240];
        ServiceNameEdit: Text[240];
        ObjectTypeLookup: Option ,,,,,,,,"Page","Query";
        UseLookupErr: Label 'Use the lookup to select existing name.';
        oDataUrl: Text;
        MissingFieldsErr: Label 'Please select field(s) before adding a filter.';
        InvalidPageTypeErr: Label 'Invalid page Id. Only pages of type List are valid.';
        InvalidObjectTypeErr: Label 'Only objects of type page and query are allowed.';
        NAVNotSetUpQst: Label 'The data set has not been set up.\Are you sure you want to exit?';
        PublishWithoutFieldsErr: Label 'Please select field(s) before publishing the data set.';
        PermissionsErr: Label 'You do not have permissions to run this wizard.';
        ServiceNotFoundErr: Label 'The web service does not exist.';
        ExcelVisible: Boolean;

    local procedure GetFilterText(var TempTenantWebServiceColumns: Record "Tenant Web Service Columns" temporary): Boolean
    var
        AllObjWithCaption: Record AllObjWithCaption;
        ODataUtility: Codeunit ODataUtility;
        WebServiceManagement: Codeunit "Web Service Management";
        FieldRef: FieldRef;
        RecRef: RecordRef;
        FilterPage: FilterPageBuilder;
        DataItemDictionary: DotNet GenericDictionary2;
        keyValuePair: DotNet GenericKeyValuePair2;
        ColumnList: DotNet GenericList1;
        OldTableNo: Integer;
        FieldNo: Integer;
        FilterText: Text;
        FilterTextTemp: Text;
        FilterTextSource: Text;
    begin
        if TempTenantWebServiceColumns.FindFirst() then
            DataItemDictionary := DataItemDictionary.Dictionary();
        OldTableNo := 0;
        repeat
            if OldTableNo <> TempTenantWebServiceColumns."Data Item" then begin
                AllObjWithCaption.SetRange("Object ID", TempTenantWebServiceColumns."Data Item");
                AllObjWithCaption.SetRange("Object Type", AllObjWithCaption."Object Type"::Table);
                if AllObjWithCaption.FindFirst() then begin
                    FilterPage.AddTable(AllObjWithCaption."Object Caption", TempTenantWebServiceColumns."Data Item");

                    if not DataItemDictionary.ContainsKey(AllObjWithCaption."Object ID") then
                        DataItemDictionary.Add(AllObjWithCaption."Object ID", AllObjWithCaption."Object Caption");
                end;
            end;

            OldTableNo := TempTenantWebServiceColumns."Data Item";
        until TempTenantWebServiceColumns.Next() = 0;

        foreach keyValuePair in DataItemDictionary do begin
            FilterText := '';
            FilterTextTemp := '';
            TempTenantWebServiceFilter.Init();
            TempTenantWebServiceFilter.SetRange(TenantWebServiceID, Rec.RecordId);
            TempTenantWebServiceFilter.SetRange("Data Item", keyValuePair.Key);

            if TempTenantWebServiceFilter.Find('-') then
                FilterTextTemp := WebServiceManagement.RetrieveTenantWebServiceFilter(TempTenantWebServiceFilter);

            if (ActionType = ActionType::"Create a copy of an existing data set") or
               (ActionType = ActionType::"Edit an existing data set")
            then
                GetSourceFilterText(keyValuePair.Key, FilterTextSource);

            if (FilterTextSource <> '') and (FilterTextTemp = '') and (not ChangeFields) then
                FilterPage.SetView(keyValuePair.Value, FilterTextSource)
            else
                if FilterTextTemp <> '' then
                    FilterPage.SetView(keyValuePair.Value, FilterTextTemp);
        end;

        OldTableNo := 0;
        if TempTenantWebServiceColumns.FindFirst() then
            repeat
                if OldTableNo <> TempTenantWebServiceColumns."Data Item" then begin
                    ColumnList := ColumnList.List();
                    TempTenantWebServiceFilter.Init();
                    TempTenantWebServiceFilter.SetRange("Data Item", TempTenantWebServiceColumns."Data Item");

                    if TempTenantWebServiceFilter.Find('-') then
                        FilterTextTemp := WebServiceManagement.RetrieveTenantWebServiceFilter(TempTenantWebServiceFilter);

                    if (ActionType = ActionType::"Create a copy of an existing data set") or
                       (ActionType = ActionType::"Edit an existing data set")
                    then
                        GetSourceFilterText(TempTenantWebServiceColumns."Data Item", FilterTextSource);

                    if (FilterTextSource <> '') and (FilterTextTemp = '') and (not ChangeFields) then
                        ODataUtility.GetColumnsFromFilter(Rec, FilterTextSource, ColumnList)
                    else
                        if FilterTextTemp <> '' then
                            ODataUtility.GetColumnsFromFilter(Rec, FilterTextTemp, ColumnList);
                end;
                OldTableNo := TempTenantWebServiceColumns."Data Item";

                FieldNo := TempTenantWebServiceColumns."Field Number";
                AllObjWithCaption.SetRange("Object ID", TempTenantWebServiceColumns."Data Item");
                AllObjWithCaption.SetRange("Object Type", AllObjWithCaption."Object Type"::Table);
                if AllObjWithCaption.FindFirst() then begin
                    Clear(RecRef);
                    RecRef.Open(AllObjWithCaption."Object ID");
                    if RecRef.FieldExist(FieldNo) then begin
                        FieldRef := RecRef.Field(FieldNo);
                        if not ColumnList.Contains(FieldRef.Name) then
                            FilterPage.AddField(AllObjWithCaption."Object Caption", FieldRef);
                    end;
                end;
            until TempTenantWebServiceColumns.Next() = 0;

        if FilterPage.RunModal() then begin
            Clear(TempTenantWebServiceFilter);
            TempTenantWebServiceFilter.DeleteAll();
            foreach keyValuePair in DataItemDictionary do begin
                Clear(TempTenantWebServiceFilter);
                FilterText := FilterPage.GetView(keyValuePair.Value, false);
                TempTenantWebServiceFilter.Init();
                TempTenantWebServiceFilter."Data Item" := keyValuePair.Key;
                TempTenantWebServiceFilter.TenantWebServiceID := Rec.RecordId;
                WebServiceManagement.SetTenantWebServiceFilter(TempTenantWebServiceFilter, FilterText);

                UpdateEditInExcelFilters(AllObjWithCaption, FilterText);

                repeat
                    TempTenantWebServiceFilter."Entry ID" := TempTenantWebServiceFilter."Entry ID" + 1;
                until TempTenantWebServiceFilter.Insert(true);
            end;
            exit(true);
        end;
        exit(false);
    end;

    local procedure UpdateEditInExcelFilters(AllObjWithCaption: Record AllObjWithCaption; FilterText: Text)
    var
        ODataUtility: Codeunit ODataUtility;
        RecordRef: RecordRef;
        FieldRef: FieldRef;
        FieldIndex: Integer;
        TotalFields: Integer;
        FilterValueEnglish: Text;
        FilterEDMValue: Text;
        FilterEDMType: Enum "Edit in Excel Edm Type";
        FieldName: Text;
        FilterType: Enum "Edit in Excel Filter Type";
        PreviousGlobalLanguage: Integer;
        EnglishLanguage: Integer;
    begin
        clear(EditinExcelFilters);
        RecordRef.Open(AllObjWithCaption."Object ID");
        RecordRef.SetView(FilterText);
        TotalFields := RecordRef.FIELDCOUNT;

        for FieldIndex := 1 to TotalFields do begin
            FieldRef := RecordRef.FieldIndex(FieldIndex);

            PreviousGlobalLanguage := GlobalLanguage();
            // Retrieve filters in English-US for ease of processing
            EnglishLanguage := 1033;
            GlobalLanguage(EnglishLanguage);
            FilterValueEnglish := FieldRef.GetFilter();
            GlobalLanguage(PreviousGlobalLanguage);

            if FilterValueEnglish <> '' then
                if IsFilterRange(FieldRef) then
                    if IsFilterRangeSingleValue(FieldRef) then begin
                        FieldName := ODataUtility.ExternalizeName(FieldRef.Name);
                        FilterEDMType := ConvertFieldTypeToEdmType(FieldRef.Type);
                        FilterType := Enum::"Edit in Excel Filter Type"::Equal;
                        FilterEDMValue := ConvertToEDMValue(FilterValueEnglish, FilterEDMType);
                        EditinExcelFilters.AddFieldV2(FieldName, FilterType, FilterEDMValue, FilterEDMType);
                    end
        end
    end;

    local procedure ConvertToEDMValue(FilterValue: Text; EDMType: Enum "Edit in Excel Edm Type"): Text
    var
        FilterEDMValue: Text;
    begin
        FilterEDMValue := FilterValue;
        case EDMType of
            Enum::"Edit in Excel Edm Type"::"Edm.Boolean":
                if FilterValue = 'Yes' then
                    FilterEDMValue := 'true'
                else
                    FilterEDMValue := 'false';
        end;
        exit(FilterEDMValue)
    end;

    [TryFunction]
    local procedure IsFilterRange(FieldRef: FieldRef)
    var
        TempRange: Text;
    begin
        TempRange := FieldRef.GetRangeMax();
    end;

    local procedure IsFilterRangeSingleValue(FieldRef: FieldRef): Boolean
    begin
        exit(FieldRef.GetRangeMin() = FieldRef.GetRangeMax())
    end;

    procedure ConvertFieldTypeToEdmType(FieldType: FieldType): Enum "Edit in Excel Edm Type";
    var
        EdmType: Enum "Edit in Excel Edm Type";
    begin
        case FieldType of
            FieldType::Text, FieldType::Code, FieldType::Guid, FieldType::Option:
                EdmType := Enum::"Edit in Excel Edm Type"::"Edm.String";
            FieldType::Integer:
                EdmType := Enum::"Edit in Excel Edm Type"::"Edm.Int32";
            FieldType::BigInteger:
                EdmType := Enum::"Edit in Excel Edm Type"::"Edm.Int64";
            FieldType::Decimal:
                EdmType := Enum::"Edit in Excel Edm Type"::"Edm.Decimal";
            FieldType::DateTime, FieldType::Date:
                EdmType := Enum::"Edit in Excel Edm Type"::"Edm.DateTimeOffset";
            FieldType::Boolean:
                EdmType := Enum::"Edit in Excel Edm Type"::"Edm.Boolean";
            else
                EdmType := Enum::"Edit in Excel Edm Type"::"Edm.String";
        end;

        exit(EdmType);
    end;

    local procedure LoadTopBanners()
    begin
        if MediaRepositoryStandard.Get('AssistedSetup-NoText-400px.png', Format(ClientTypeManagement.GetCurrentClientType())) and
           MediaRepositoryDone.Get('AssistedSetupDone-NoText-400px.png', Format(ClientTypeManagement.GetCurrentClientType()))
        then
            if MediaResourcesStandard.Get(MediaRepositoryStandard."Media Resources Ref") and
               MediaResourcesDone.Get(MediaRepositoryDone."Media Resources Ref")
            then
                TopBannerVisible := MediaResourcesDone."Media Reference".HasValue;
    end;

    local procedure DisplayODataUrl(): Text
    var
        TenantWebService: Record "Tenant Web Service";
        ODataUtility: Codeunit ODataUtility;
        ODataServiceRootUrl: Text;
        ODataUrl: Text;
        ObjectTypeParam: Option ,,,,,,,,"Page","Query";
    begin
        Clear(TenantWebService);
        TenantWebService.Init();
        TenantWebService.Validate("Object Type", Rec."Object Type");
        TenantWebService.Validate("Object ID", Rec."Object ID");
        if (ActionType = ActionType::"Create a new data set") or (ActionType = ActionType::"Create a copy of an existing data set") then
            TenantWebService.Validate("Service Name", ServiceNameEdit)
        else
            TenantWebService.Validate("Service Name", ServiceNameLookup);

        TenantWebService.Validate(Published, true);
        if Rec."Object Type" = Rec."Object Type"::Query then begin
            ODataServiceRootUrl := GetUrl(CLIENTTYPE::ODataV4, CompanyName, OBJECTTYPE::Query, Rec."Object ID", TenantWebService);
            ODataUrl := ODataUtility.GenerateODataV4Url(ODataServiceRootUrl, TenantWebService."Service Name", ObjectTypeParam::Query);
            exit(ODataUrl);
        end;
        if Rec."Object Type" = Rec."Object Type"::Page then begin
            ODataServiceRootUrl := GetUrl(CLIENTTYPE::ODataV4, CompanyName, OBJECTTYPE::Page, Rec."Object ID", TenantWebService);
            ODataUrl := ODataUtility.GenerateODataV4Url(ODataServiceRootUrl, TenantWebService."Service Name", ObjectTypeParam::Page);
            exit(ODataUrl);
        end;
    end;

    local procedure CopyTempTableToConcreteTable()
    var
        TenantWebServiceColumns: Record "Tenant Web Service Columns";
        TenantWebServiceFilter: Record "Tenant Web Service Filter";
        TenantWebService: Record "Tenant Web Service";
        TenantWebServiceOData: Record "Tenant Web Service OData";
        SourceTenantWebServiceFilter: Record "Tenant Web Service Filter";
        SourceTenantWebService: Record "Tenant Web Service";
        WebServiceManagement: Codeunit "Web Service Management";
        ODataUtility: Codeunit ODataUtility;
        SelectText: Text;
        ODataV3FilterText: Text;
        ODataV4FilterText: Text;
    begin
        TenantWebService.Init();
        TenantWebService.Validate("Object Type", ObjectTypeLookup);
        TenantWebService.Validate("Object ID", Rec."Object ID");
        TenantWebService.Validate(Published, true);
        if (ActionType = ActionType::"Create a new data set") or
           (ActionType = ActionType::"Create a copy of an existing data set")
        then begin
            TenantWebService.Validate("Service Name", ServiceNameEdit);
            TenantWebService.Insert(true)
        end else begin
            TenantWebService.Validate("Service Name", ServiceNameLookup);
            TenantWebService.Modify(true);
        end;

        if TempTenantWebServiceColumns.FindFirst() then begin
            if ActionType = ActionType::"Edit an existing data set" then begin
                TenantWebServiceColumns.Init();
                TenantWebServiceColumns.SetRange(TenantWebServiceID, TenantWebService.RecordId);
                TenantWebServiceColumns.DeleteAll();
            end;

            repeat
                TenantWebServiceColumns.TransferFields(TempTenantWebServiceColumns, true);
                TenantWebServiceColumns."Entry ID" := 0;
                TenantWebServiceColumns.TenantWebServiceID := TenantWebService.RecordId;
                TenantWebServiceColumns.Insert(true);
            until TempTenantWebServiceColumns.Next() = 0;
        end;

        if TempTenantWebServiceFilter.Find('-') then begin
            if ActionType = ActionType::"Edit an existing data set" then begin
                TenantWebServiceFilter.Init();
                TenantWebServiceFilter.SetRange(TenantWebServiceID, TenantWebService.RecordId);
                TenantWebServiceFilter.DeleteAll();
            end;
            repeat
                TempTenantWebServiceFilter.CalcFields(Filter);
                TenantWebServiceFilter.TransferFields(TempTenantWebServiceFilter, true);
                TenantWebServiceFilter."Entry ID" := 0;

                TenantWebServiceFilter.TenantWebServiceID := TenantWebService.RecordId;

                TenantWebServiceFilter.Insert(true);
            until TempTenantWebServiceFilter.Next() = 0;
        end else
            if ActionType = ActionType::"Create a copy of an existing data set" then
                if SourceTenantWebService.Get(ObjectTypeLookup, ServiceNameLookup) then begin
                    SourceTenantWebServiceFilter.SetRange(TenantWebServiceID, SourceTenantWebService.RecordId);
                    if SourceTenantWebServiceFilter.FindSet() then
                        repeat
                            SourceTenantWebServiceFilter.CalcFields(Filter);
                            TenantWebServiceFilter.TransferFields(SourceTenantWebServiceFilter, true);
                            TenantWebServiceFilter."Entry ID" := 0;

                            TenantWebServiceFilter.TenantWebServiceID := TenantWebService.RecordId;

                            TenantWebServiceFilter.Insert(true);
                        until SourceTenantWebServiceFilter.Next() = 0;
                end;

        if (ActionType = ActionType::"Create a new data set") or
           (ActionType = ActionType::"Create a copy of an existing data set")
        then begin
            TenantWebServiceOData.Validate(TenantWebServiceID, TenantWebService.RecordId);
            ODataUtility.GenerateSelectText(ServiceNameEdit, ObjectTypeLookup, SelectText);
            ODataUtility.GenerateODataV3FilterText(ServiceNameEdit, ObjectTypeLookup, ODataV3FilterText);
            ODataUtility.GenerateODataV4FilterText(ServiceNameEdit, ObjectTypeLookup, ODataV4FilterText);
            WebServiceManagement.SetODataSelectClause(TenantWebServiceOData, SelectText);
            WebServiceManagement.SetODataFilterClause(TenantWebServiceOData, ODataV3FilterText);
            WebServiceManagement.SetODataV4FilterClause(TenantWebServiceOData, ODataV4FilterText);
            TenantWebServiceOData.Insert(true)
        end else begin
            TenantWebServiceOData.Validate(TenantWebServiceID, TenantWebService.RecordId);
            ODataUtility.GenerateSelectText(ServiceNameLookup, ObjectTypeLookup, SelectText);
            ODataUtility.GenerateODataV3FilterText(ServiceNameLookup, ObjectTypeLookup, ODataV3FilterText);
            ODataUtility.GenerateODataV4FilterText(ServiceNameLookup, ObjectTypeLookup, ODataV4FilterText);
            WebServiceManagement.SetODataSelectClause(TenantWebServiceOData, SelectText);
            WebServiceManagement.SetODataFilterClause(TenantWebServiceOData, ODataV3FilterText);
            WebServiceManagement.SetODataV4FilterClause(TenantWebServiceOData, ODataV4FilterText);
            TenantWebServiceOData.Modify(true);
        end;
    end;

    local procedure GetSourceFilterText(DataItem: Integer; var FilterTextParam: Text)
    var
        TenantWebService: Record "Tenant Web Service";
        TenantWebServiceFilter: Record "Tenant Web Service Filter";
        WebServiceManagement: Codeunit "Web Service Management";
    begin
        TenantWebService.Init();
        TenantWebService.SetRange("Object Type", Rec."Object Type");

        if ActionType = ActionType::"Create a copy of an existing data set" then
            TenantWebService.SetRange("Service Name", ServiceNameLookup)
        else
            TenantWebService.SetRange("Service Name", Rec."Service Name");

        if TenantWebService.FindFirst() then begin
            TenantWebServiceFilter.Init();
            TenantWebServiceFilter.SetRange(TenantWebServiceID, TenantWebService.RecordId);
            TenantWebServiceFilter.SetRange("Data Item", DataItem);
            if TenantWebServiceFilter.FindFirst() then
                FilterTextParam := WebServiceManagement.RetrieveTenantWebServiceFilter(TenantWebServiceFilter);
        end;
    end;

    local procedure ClearTables()
    begin
        CurrPage.ODataColSubForm.PAGE.DeleteColumns();
        TempTenantWebServiceColumns.DeleteAll();
        TempTenantWebServiceFilter.DeleteAll();
    end;

    local procedure ClearObjectType()
    begin
        Rec."Object Type" := Rec."Object Type"::Page;
        ObjectTypeLookup := ObjectTypeLookup::Page;
    end;

    local procedure ClearName()
    begin
        Rec."Service Name" := '';
        ServiceNameEdit := '';
        Clear(ServiceNameLookup);
    end;

    local procedure DisplayObjectName(): Text
    var
        AllObjWithCaption: Record AllObjWithCaption;
    begin
        AllObjWithCaption.SetRange("Object Type", Rec."Object Type");
        AllObjWithCaption.SetRange("Object ID", Rec."Object ID");
        if AllObjWithCaption.FindFirst() then
            exit(AllObjWithCaption."Object Name");
    end;

    local procedure CheckPermissions()
    var
        TenantWebService: Record "Tenant Web Service";
        TenantWebServiceOData: Record "Tenant Web Service OData";
        TenantWebServiceColumns: Record "Tenant Web Service Columns";
        TenantWebServiceFilter: Record "Tenant Web Service Filter";
    begin
        if not TenantWebService.WritePermission then
            Error(PermissionsErr);

        if not TenantWebService.ReadPermission then
            Error(PermissionsErr);

        if not TempTenantWebServiceColumns.WritePermission then
            Error(PermissionsErr);

        if not TenantWebServiceColumns.ReadPermission then
            Error(PermissionsErr);

        if not TenantWebServiceFilter.WritePermission then
            Error(PermissionsErr);

        if not TenantWebServiceFilter.ReadPermission then
            Error(PermissionsErr);

        if not TenantWebServiceOData.WritePermission then
            Error(PermissionsErr);

        if not TenantWebServiceOData.ReadPermission then
            Error(PermissionsErr);
    end;

    procedure EditInExcelVisible()
    begin
        if ClientTypeManagement.GetCurrentClientType() = CLIENTTYPE::Web then
            ExcelVisible := true;
    end;
}