Codeunit 1214 Map DataExch To Intermediate, source in 29

Source29

src/Layers/W1/BaseApp/System/DataExchange/MapDataExchToIntermediate.Codeunit.al148 lines, Copyright (c) Microsoft Corporation. MIT

namespace System.IO;

using Microsoft.Utilities;

codeunit 1214 "Map DataExch To Intermediate"
{
    TableNo = "Data Exch.";

    trigger OnRun()
    begin
        ProcessAllLinesColumnMapping(Rec);
    end;

    var
        TempNameValueBuffer: Record "Name/Value Buffer" temporary;
        TargetTableFieldDefinitionMustBeSpecifiedErr: Label 'You must specify a target table for the column definition.';

    [Scope('OnPrem')]
    procedure ProcessAllLinesColumnMapping(DataExch: Record "Data Exch.")
    var
        DataExchLineDef: Record "Data Exch. Line Def";
    begin
        // TempNameValueBuffer - used to "keep track" of node id - record No. relation for determining parent/child relation
        TempNameValueBuffer.Reset();
        TempNameValueBuffer.DeleteAll();

        DataExchLineDef.SetRange("Data Exch. Def Code", DataExch."Data Exch. Def Code");
        DataExchLineDef.SetRange("Parent Code", '');
        if DataExchLineDef.FindSet() then
            repeat
                ProcessColumnMapping(DataExch, DataExchLineDef);
            until DataExchLineDef.Next() = 0;
    end;

    local procedure ProcessColumnMapping(DataExch: Record "Data Exch."; DataExchLineDef: Record "Data Exch. Line Def")
    var
        DataExchField: Record "Data Exch. Field";
        ChildDataExchLineDef: Record "Data Exch. Line Def";
        CurrentLineNo: Integer;
    begin
        DataExchField.SetRange("Data Exch. No.", DataExch."Entry No.");
        DataExchField.SetRange("Data Exch. Line Def Code", DataExchLineDef.Code);

        if not DataExchField.FindSet() then
            exit;

        CurrentLineNo := -1;

        repeat
            InsertRecordDefinition(DataExchField, DataExchLineDef, CurrentLineNo);
            InsertDataValues(DataExchField, DataExchLineDef, CurrentLineNo);
        until DataExchField.Next() = 0;

        // Process Child Line Definitions
        ChildDataExchLineDef.SetRange("Data Exch. Def Code", DataExchLineDef."Data Exch. Def Code");
        ChildDataExchLineDef.SetRange("Parent Code", DataExchLineDef.Code);

        if not ChildDataExchLineDef.FindSet() then
            exit;

        repeat
            ProcessColumnMapping(DataExch, ChildDataExchLineDef);
        until ChildDataExchLineDef.Next() = 0;
    end;

    local procedure InsertRecordDefinition(DataExchField: Record "Data Exch. Field"; DataExchLineDef: Record "Data Exch. Line Def"; var CurrentLineNo: Integer)
    var
        DataExchFieldMapping: Record "Data Exch. Field Mapping";
    begin
        // Check if definition is already inserted
        if CurrentLineNo = DataExchField."Line No." then
            exit;

        // Find the table definition we need to write to.
        DataExchFieldMapping.SetRange("Data Exch. Def Code", DataExchLineDef."Data Exch. Def Code");
        DataExchFieldMapping.SetRange("Data Exch. Line Def Code", DataExchLineDef.Code);
        DataExchFieldMapping.SetRange("Table ID", DATABASE::"Intermediate Data Import");
        DataExchFieldMapping.SetFilter("Column No.", '>0');
        if DataExchFieldMapping.IsEmpty() then
            Error(TargetTableFieldDefinitionMustBeSpecifiedErr);

        CurrentLineNo := DataExchField."Line No.";

        // Save Node ID / Line No relation
        AddNodeIDLineNoPair(DataExchField."Node ID", CurrentLineNo);
    end;

    local procedure InsertDataValues(DataExchField: Record "Data Exch. Field"; DataExchLineDef: Record "Data Exch. Line Def"; LineNo: Integer)
    var
        DataExchFieldMapping: Record "Data Exch. Field Mapping";
        IntermediateDataImport: Record "Intermediate Data Import";
        TransformationRule: Record "Transformation Rule";
        ParentLineNo: Integer;
    begin
        if DataExchField."Column No." < 1 then
            exit;

        // Skip if no mapping
        if not DataExchFieldMapping.Get(
             DataExchLineDef."Data Exch. Def Code", DataExchLineDef.Code,
             DATABASE::"Intermediate Data Import", DataExchField."Column No.")
        then
            exit;

        IntermediateDataImport.Init();
        IntermediateDataImport.Validate("Data Exch. No.", DataExchField."Data Exch. No.");
        IntermediateDataImport.Validate("Table ID", DataExchFieldMapping."Target Table ID");
        IntermediateDataImport.Validate("Record No.", LineNo);
        IntermediateDataImport.Validate("Field ID", DataExchFieldMapping."Target Field ID");
        if TransformationRule.Get(DataExchFieldMapping."Transformation Rule") then
            IntermediateDataImport.SetValueWithoutModifying(TransformationRule.TransformText(DataExchField.GetValue()))
        else
            IntermediateDataImport.SetValueWithoutModifying(DataExchField.GetValue());
        IntermediateDataImport.Validate("Validate Only", DataExchFieldMapping.Optional);
        if DataExchField."Parent Node ID" <> '' then begin
            TempNameValueBuffer.SetRange(Name, DataExchField."Parent Node ID");
            TempNameValueBuffer.FindFirst();
            Evaluate(ParentLineNo, TempNameValueBuffer.Value);
            IntermediateDataImport.Validate("Parent Record No.", ParentLineNo);
        end;

        OnBeforeIntermediateDataImportInsert(DataExchField, DataExchLineDef, TempNameValueBuffer, IntermediateDataImport);
        IntermediateDataImport.Insert(true);
    end;

    local procedure AddNodeIDLineNoPair(NodeID: Text[250]; LineNo: Integer)
    var
        ID: Integer;
    begin
        TempNameValueBuffer.Reset();
        ID := 1;
        if TempNameValueBuffer.FindLast() then
            ID := TempNameValueBuffer.ID + 1;

        Clear(TempNameValueBuffer);
        TempNameValueBuffer.ID := ID;
        TempNameValueBuffer.Name := NodeID;
        TempNameValueBuffer.Value := Format(LineNo);
        TempNameValueBuffer.Insert(true);
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeIntermediateDataImportInsert(DataExchField: Record "Data Exch. Field"; DataExchLineDef: Record "Data Exch. Line Def"; var TempNameValueBuffer: Record "Name/Value Buffer" temporary; var IntermediateDataImport: Record "Intermediate Data Import")
    begin
    end;
}