Codeunit 1241 Fixed File Import, source in 29

Source29

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

namespace System.IO;

codeunit 1241 "Fixed File Import"
{
    Permissions = TableData "Data Exch. Field" = rimd;
    TableNo = "Data Exch.";

    trigger OnRun()
    var
        ReadStream: InStream;
        ReadText: Text;
        ReadLen: Integer;
        LineNo: Integer;
        SkippedLineNo: Integer;
    begin
        DataExchDef.Get(Rec."Data Exch. Def Code");
        case DataExchDef."File Encoding" of
            DataExchDef."File Encoding"::"MS-DOS":
                Rec."File Content".CreateInStream(ReadStream, TextEncoding::MSDos);
            DataExchDef."File Encoding"::"UTF-8":
                Rec."File Content".CreateInStream(ReadStream, TextEncoding::UTF8);
            DataExchDef."File Encoding"::"UTF-16":
                Rec."File Content".CreateInStream(ReadStream, TextEncoding::UTF16);
            DataExchDef."File Encoding"::WINDOWS:
                Rec."File Content".CreateInStream(ReadStream, TextEncoding::Windows);
        end;
        LineNo := 1;
        repeat
            ReadLen := ReadStream.ReadText(ReadText);
            if ReadLen > 0 then
                ParseLine(ReadText, Rec, LineNo, SkippedLineNo);
        until ReadLen = 0;
    end;

    var
        DataExchDef: Record "Data Exch. Def";

    local procedure ParseLine(Line: Text; DataExch: Record "Data Exch."; var LineNo: Integer; var SkippedLineNo: Integer)
    var
        DataExchLineDef: Record "Data Exch. Line Def";
        DataExchColumnDef: Record "Data Exch. Column Def";
        DataExchField: Record "Data Exch. Field";
        StartPosition: Integer;
        IsHandled: Boolean;
    begin
        DataExchLineDef.SetRange("Data Exch. Def Code", DataExch."Data Exch. Def Code");
        DataExchLineDef.FindFirst();

        if ((LineNo + SkippedLineNo) <= DataExchDef."Header Lines") or
           ((DataExchLineDef."Data Line Tag" <> '') and (StrPos(Line, DataExchLineDef."Data Line Tag") <> 1))
        then begin
            SkippedLineNo += 1;
            exit;
        end;

        DataExchColumnDef.SetRange("Data Exch. Def Code", DataExch."Data Exch. Def Code");
        DataExchColumnDef.SetRange("Data Exch. Line Def Code", DataExchLineDef.Code);
        DataExchColumnDef.FindSet();

        StartPosition := 1;
        IsHandled := false;
        OnParseLineOnBeforeDataExchColumnDefLoop(DataExch, DataExchDef, DataExchColumnDef, DataExchField, Line, LineNo, StartPosition, IsHandled);
        if not IsHandled then
            repeat
                DataExchField.InsertRecXMLField(DataExch."Entry No.", LineNo, DataExchColumnDef."Column No.", '',
                  CopyStr(Line, StartPosition, DataExchColumnDef.Length), DataExchLineDef.Code);
                StartPosition += DataExchColumnDef.Length;
            until DataExchColumnDef.Next() = 0;
        LineNo += 1;
    end;

    [IntegrationEvent(false, false)]
    local procedure OnParseLineOnBeforeDataExchColumnDefLoop(DataExch: Record "Data Exch."; var DataExchDef: Record "Data Exch. Def"; var DataExchColumnDef: Record "Data Exch. Column Def"; var DataExchField: Record "Data Exch. Field"; var Line: Text; LineNo: Integer; var StartPosition: Integer; var IsHandled: Boolean);
    begin
    end;
}