Page 6710 OData Column Choose SubForm, source in 29

Source29

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

namespace System.Integration;

using System;
using System.Apps;
using System.Reflection;

page 6710 "OData Column Choose SubForm"
{
    Caption = 'OData Column Choose SubForm';
    DeleteAllowed = false;
    InsertAllowed = false;
    PageType = ListPart;
    SourceTable = "Tenant Web Service Columns";
    SourceTableTemporary = true;

    layout
    {
        area(content)
        {
            repeater(Group)
            {
                field(Include; Rec.Include)
                {
                    ApplicationArea = Basic, Suite;
                    ToolTip = 'Specifies the field name that is selected in the data set.';

                    trigger OnValidate()
                    begin
                        if CalledForExcelExport then
                            CheckFieldFilter();
                        IsModified := true;
                    end;
                }
                field("Field Name"; Rec."Field Name")
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Field Name';
                    Editable = false;
                    ToolTip = 'Specifies the field names in a data set.';
                }
                field("Field Caption"; Rec."Field Caption")
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Field Caption';
                    Editable = false;
                    ToolTip = 'Specifies the Field Captions in a data set.';
                }
                field("Data Item Caption"; Rec."Data Item Caption")
                {
                    ApplicationArea = Basic, Suite;
                    Caption = 'Source Table';
                    Editable = false;
                    ToolTip = 'Specifies the Source Table for the Field Name.';
                }
            }
        }
    }

    actions
    {
        area(processing)
        {
        }
    }

    var
        RecRef: RecordRef;
        ColumnList: DotNet GenericList1;
        SourceObjectType: Option ,,,,,,,,"Page","Query";
        ActionType: Option "Create a new data set","Create a copy of an existing data set","Edit an existing data set";
        SourceServiceName: Text;
        SourceObjectID: Integer;
        IsModified: Boolean;
        CheckFieldErr: Label 'You cannot exclude field from selection because of applied filter for it.';
        AskYourSystemAdministratorToSetupErr: Label 'Cannot complete this task. Ask your administrator for assistance.';
        CalledForExcelExport: Boolean;

    [Scope('OnPrem')]
    procedure InitColumns(ObjectType: Option ,,,,,,,,"Page","Query"; ObjectID: Integer; InActionType: Option "Create a new data set","Create a copy of an existing data set","Edit an existing data set"; InSourceServiceName: Text; DestinationServiceName: Text)
    var
        AllObj: Record AllObj;
        ApplicationObjectMetadata: Record "Application Object Metadata";
        inStream: InStream;
    begin
        if Rec.FindFirst() then
            exit;

        ActionType := InActionType;
        SourceObjectType := ObjectType;
        SourceServiceName := InSourceServiceName;
        SourceObjectID := ObjectID;
        DestinationServiceName := DestinationServiceName;

        AllObj.Get(SourceObjectType, SourceObjectID);

        if SourceObjectType = SourceObjectType::Page then
            InitColumnsForPage(ObjectID)
        else begin
            if not ApplicationObjectMetadata.ReadPermission() then
                Error(AskYourSystemAdministratorToSetupErr);

            ApplicationObjectMetadata.Get(AllObj."App Runtime Package ID", SourceObjectType, SourceObjectID);
            if not ApplicationObjectMetadata.Metadata.HasValue() then
                exit;

            ApplicationObjectMetadata.CalcFields(Metadata);
            ApplicationObjectMetadata.Metadata.CreateInStream(inStream, TextEncoding::Windows);

            if SourceObjectType = SourceObjectType::Query then
                InitColumnsForQuery(inStream)
        end;

        Clear(Rec);
        CurrPage.Update();
    end;

    procedure GetColumns(var TempTenantWebServiceColumns: Record "Tenant Web Service Columns" temporary)
    begin
        Rec.SetRange(Include, true);
        if Rec.FindFirst() then
            repeat
                TempTenantWebServiceColumns.TransferFields(Rec);
                TempTenantWebServiceColumns.Insert();

            until Rec.Next() = 0;
        Rec.Reset();
    end;

    local procedure InitColumnsForQuery(queryStream: InStream)
    var
        queryField: DotNet QueryFields;
        metaData: DotNet QueryMetadataReader;
        i: Integer;
        OldTableNo: Integer;
    begin
        // Load into Query Metadata Reader and retrieve values
        metaData := metaData.FromStream(queryStream);
        if metaData.Fields.Count = 0 then
            exit;
        OldTableNo := 0;
        for i := 0 to metaData.Fields.Count - 1 do begin
            queryField := metaData.Fields.Item(i);
            if OldTableNo <> queryField.TableNo then
                ColumnList := ColumnList.List();
            OldTableNo := queryField.TableNo;
            Clear(Rec);
            if not queryField.IsFilterOnly then
                InsertRecord(queryField.TableNo, queryField.FieldNo, queryField.FieldName, false);
        end;
    end;

    local procedure InitColumnsForPage(ObjectID: Integer)
    var
        FieldsTable: Record "Field";
        ODataUtility: Codeunit ODataUtility;
        PageControlField: Record "Page Control Field";
        FieldNameText: Text;
        ColumnVisible: Boolean;
    begin
        ColumnList := ColumnList.List();
        // Sort on sequence to maintain order
        PageControlField.SetCurrentKey(Sequence);
        PageControlField.SETRANGE(PageNo, ObjectID);
        if PageControlField.FindSet() then
            repeat
                if not Evaluate(ColumnVisible, PageControlField.Visible) then
                    ColumnVisible := false;
                // Convert to OData compatible name.
                FieldNameText := ODataUtility.ExternalizeName(PageControlField.ControlName);
                if FieldsTable.Get(PageControlField.TableNo, PageControlField.FieldNo) then
                    // Page field is based on table (fieldsTable)
                    InsertRecord(FieldsTable.TableNo, FieldsTable."No.", FieldNameText, ColumnVisible)
                else
                    // Page field is NOT based on table 
                    InsertRecord(PageControlField.TableNo, PageControlField.ControlId, FieldNameText, ColumnVisible);
            until PageControlField.Next() = 0;
    end;

    local procedure InsertRecord(TableNo: Integer; FieldNo: Integer; FieldName: Text; IncludeParam: Boolean)
    begin
        if ColumnList.Contains(FieldNo) then
            exit;

        Rec.Init();
        Rec.Validate("Data Item", TableNo);
        Rec.Validate("Field Number", FieldNo);
        Rec.Validate("Field Name", CopyStr(FieldName, 1));
        if (ActionType = ActionType::"Create a copy of an existing data set") or
           (ActionType = ActionType::"Edit an existing data set")
        then begin
            if SourceColumnExists(TableNo, FieldNo) then
                Rec.Include := true;
        end else
            Rec.Include := IncludeParam;
        repeat
            Rec."Entry ID" := Rec."Entry ID" + 1;
        until Rec.Insert(true);

        ColumnList.Add(FieldNo);
    end;

    procedure DeleteColumns()
    begin
        Clear(Rec);
        Rec.DeleteAll();
    end;

    local procedure SourceColumnExists(TableNo: Integer; FieldNumber: Integer): Boolean
    var
        TenantWebService: Record "Tenant Web Service";
        TenantWebServiceColumns: Record "Tenant Web Service Columns";
    begin
        TenantWebService.Init();
        if TenantWebService.Get(SourceObjectType, SourceServiceName) then begin
            TenantWebServiceColumns.Init();
            TenantWebServiceColumns.SetRange(TenantWebServiceID, TenantWebService.RecordId);
            TenantWebServiceColumns.SetRange("Field Number", FieldNumber);
            TenantWebServiceColumns.SetRange("Data Item", TableNo);
            if TenantWebServiceColumns.FindFirst() then
                exit(true);
        end;
    end;

    procedure IncludeIsChanged(): Boolean
    var
        LocalDirty: Boolean;
    begin
        LocalDirty := IsModified;
        Clear(IsModified);
        exit(LocalDirty);
    end;

    procedure SetCalledForExcelExport(var SourceRecRef: RecordRef)
    begin
        CalledForExcelExport := true;
        RecRef := SourceRecRef;
    end;

    local procedure CheckFieldFilter()
    var
        FieldRef: FieldRef;
    begin
        if not Rec.Include then begin
            FieldRef := RecRef.Field(Rec."Field Number");
            if FieldRef.GetFilter <> '' then
                Error(CheckFieldErr);
        end;
    end;
}