Table 9600 XML Schema, source in 29

Source29

src/Layers/W1/BaseApp/System/XML/XMLSchema.Table.al177 lines, Copyright (c) Microsoft Corporation. MIT

namespace System.Xml;

using System.IO;
using System.Utilities;

table 9600 "XML Schema"
{
    Caption = 'XML Schema';
    DataCaptionFields = "Code", Description;
    DrillDownPageID = "XML Schemas";
    LookupPageID = "XML Schemas";
    DataClassification = CustomerContent;

    fields
    {
        field(1; "Code"; Code[20])
        {
            Caption = 'Code';
            NotBlank = true;
        }
        field(2; Description; Text[80])
        {
            Caption = 'Description';
        }
        field(3; "Target Namespace"; Text[250])
        {
            Caption = 'Target Namespace';
        }
        field(4; XSD; BLOB)
        {
            Caption = 'XSD';
        }
        field(6; Indentation; Integer)
        {
            Caption = 'Indentation';
        }
        field(7; Path; Text[250])
        {
            Caption = 'Path';
        }
        field(10; "Target Namespace Aliases"; Text[250])
        {
            Caption = 'Target Namespace Aliases';
        }
    }

    keys
    {
        key(Key1; "Code")
        {
            Clustered = true;
        }
    }

    fieldgroups
    {
    }

    trigger OnDelete()
    var
        XMLSchemaElement: Record "XML Schema Element";
        XMLSchemaRestriction: Record "XML Schema Restriction";
        ChildXMLSchema: Record "XML Schema";
        ReferencedXMLSchema: Record "Referenced XML Schema";
        TopSchemaCode: Code[20];
    begin
        if Indentation > 0 then
            TopSchemaCode := GetTopSchemaCode(Rec)
        else
            TopSchemaCode := Code;

        ReferencedXMLSchema.SetFilter(Code, StrSubstNo('%1:*|%1', TopSchemaCode));
        ReferencedXMLSchema.DeleteAll(true);

        XMLSchemaElement.SetFilter("XML Schema Code", StrSubstNo('%1:*|%1', TopSchemaCode));
        XMLSchemaElement.DeleteAll(true);

        XMLSchemaRestriction.SetFilter("XML Schema Code", StrSubstNo('%1:*|%1', TopSchemaCode));
        XMLSchemaRestriction.DeleteAll(true);

        ChildXMLSchema.SetFilter(Code, StrSubstNo('(%1:*|%1)&(<>%2)', TopSchemaCode, Code));
        ChildXMLSchema.DeleteAll(false);
    end;

    var
        ReplaceQst: Label 'Do you want to replace the existing definition?';

    [Scope('OnPrem')]
    procedure LoadSchema()
    var
        XMLSchema: Record "XML Schema";
        TempBlob: Codeunit "Temp Blob";
        FileMgt: Codeunit "File Management";
        XSDParser: Codeunit "XSD Parser";
        RecordRef: RecordRef;
        XMLExists: Boolean;
        FileName: Text;
        i: Integer;
    begin
        CalcFields(XSD);
        XMLExists := XSD.HasValue;

        FileName := FileMgt.BLOBImport(TempBlob, '*.xsd');
        if FileName = '' then
            exit;

        if XMLExists then begin
            if not Confirm(ReplaceQst, false) then
                exit;

            TestField(Code);
            XMLSchema := Rec;
            Delete(true);
            XMLSchema.Insert();
            Rec := XMLSchema;
        end;

        RecordRef.GetTable(Rec);
        TempBlob.ToRecordRef(RecordRef, FieldNo(XSD));
        RecordRef.SetTable(Rec);

        if StrPos(FileName, '\') <> 0 then begin
            i := StrLen(FileName);
            while (i > 0) and (FileName[i] <> '\') do
                i := i - 1;
        end;

        Description := CopyStr(FileMgt.GetFileName(FileName), 1, MaxStrLen(Description));
        Path := CopyStr(FileName, 1, MaxStrLen(Path));
        XSDParser.LoadSchema(Rec);
        Modify();
    end;

    [Scope('OnPrem')]
    procedure ExportSchema(ShowFileDialog: Boolean): Text
    var
        TempBlob: Codeunit "Temp Blob";
        FileMgt: Codeunit "File Management";
    begin
        TempBlob.FromRecord(Rec, FieldNo(XSD));
        if TempBlob.HasValue() then
            exit(FileMgt.BLOBExport(TempBlob, '*.xsd', ShowFileDialog));
    end;

    procedure GetSchemaContext(): Text
    var
        XMLSchemaElement: Record "XML Schema Element";
        XMLSchemaElement2: Record "XML Schema Element";
        Context: Text;
    begin
        XMLSchemaElement.SetRange("XML Schema Code", Code);
        XMLSchemaElement.SetCurrentKey(Indentation);

        Context := '';
        if XMLSchemaElement.FindSet() then
            repeat
                XMLSchemaElement2.CopyFilters(XMLSchemaElement);
                XMLSchemaElement2.SetRange(Indentation, XMLSchemaElement.Indentation);
                if XMLSchemaElement2.Count > 1 then
                    exit(Context);
                Context := XMLSchemaElement.GetFullPath();
            until XMLSchemaElement.Next() = 0;
    end;

    procedure GetTopSchemaCode(XMLSchema: Record "XML Schema"): Code[20]
    var
        TopElementCode: Text;
    begin
        TopElementCode := XMLSchema.Code;
        if StrPos(XMLSchema.Code, ':') > 1 then
            TopElementCode := CopyStr(XMLSchema.Code, 1, StrPos(XMLSchema.Code, ':') - 1);

        exit(TopElementCode);
    end;
}