⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jcledi_unedifact.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 5 页
字号:
{**************************************************************************************************}
{                                                                                                  }
{ Project JEDI Code Library (JCL)                                                                  }
{                                                                                                  }
{ The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); }
{ you may not use this file except in compliance with the License. You may obtain a copy of the    }
{ License at http://www.mozilla.org/MPL/                                                           }
{                                                                                                  }
{ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF   }
{ ANY KIND, either express or implied. See the License for the specific language governing rights  }
{ and limitations under the License.                                                               }
{                                                                                                  }
{ The Original Code is JclEDI_UNEDIFACT.pas.                                                       }
{                                                                                                  }
{ The Initial Developer of the Original Code is Raymond Alexander.                                 }
{ Portions created by Raymond Alexander are Copyright (C) Raymond Alexander. All rights reserved.  }
{                                                                                                  }
{ Contributor(s):                                                                                  }
{   Raymond Alexander (rayspostbox3), Robert Marquardt, Robert Rossmair, Petr Vones                }
{                                                                                                  }
{**************************************************************************************************}
{                                                                                                  }
{ Contains classes to easily parse EDI documents and data. Variable delimiter detection allows     }
{ parsing of the file without knowledge of the standards at an Interchange level.  This enables    }
{ parsing and construction of EDI documents with different delimiters.                             }
{                                                                                                  }
{ Unit owner: Raymond Alexander                                                                    }
{ Date created: May 22, 2003                                                                       }
{ Additional Info:                                                                                 }
{   E-Mail at RaysDelphiBox3 att hotmail dott com                                                  }
{   For latest EDI specific demos see http://sourceforge.net/projects/edisdk                       }
{   See home page for latest news & events and online help.                                        }
{                                                                                                  }
{**************************************************************************************************}

// $Id: JclEDI_UNEDIFACT.pas,v 1.16 2005/03/08 16:10:08 marquardt Exp $

unit JclEDI_UNEDIFACT;

{$I jcl.inc}

{$IFDEF SUPPORTS_WEAKPACKAGEUNIT}
{$WEAKPACKAGEUNIT ON}
{$ENDIF SUPPORTS_WEAKPACKAGEUNIT}

// (Default) Enable the following directive to use the optimized JclEDI.StringReplace function.
{$DEFINE OPTIMIZED_STRINGREPLACE}

interface

uses
  SysUtils, Classes,
  JclEDI;

const
  //  UN/EDIFACT Segment Id's
  UNASegmentId = 'UNA';  // Service String Advice Segment Id
  UNBSegmentId = 'UNB';  // Interchange Control Header Segment Id
  UNZSegmentId = 'UNZ';  // Interchange Control Trailer Segment Id
  UNGSegmentId = 'UNG';  // Functional Group Header Segment Id
  UNESegmentId = 'UNE';  // Functional Group Trailer Segment Id
  UNHSegmentId = 'UNH';  // Message (Transaction Set) Header Segment Id
  UNTSegmentId = 'UNT';  // Message (Transaction Set) Trailer Segment Id

type
  //  EDI Forward Class Declarations
  TEDIElement = class;
  TEDICompositeElement = class;
  TEDISegment = class;
  TEDIMessage = class; // (Transaction Set)
  TEDIFunctionalGroup = class;
  TEDIInterchangeControl = class;
  TEDIFile = class;

  //  EDI Element
  TEDIElement = class(TEDIDataObject)
  public
    constructor Create(Parent: TEDIDataObject); reintroduce;
    function Assemble: string; override;
    procedure Disassemble; override;
    function GetIndexPositionFromParent: Integer;
  end;

  TEDIElementArray = array of TEDIElement;

  //  EDI Composite Element Classes
  TEDICompositeElement = class(TEDIDataObjectGroup)
  private
    function GetElement(Index: Integer): TEDIElement;
    procedure SetElement(Index: Integer; Element: TEDIElement);
  protected
    function InternalCreateElement: TEDIElement; virtual;
    function InternalAssignDelimiters: TEDIDelimiters; override;
    function InternalCreateEDIDataObject: TEDIDataObject; override;
  public
    constructor Create(Parent: TEDIDataObject; ElementCount: Integer = 0); reintroduce;
    destructor Destroy; override;
    //
    function AddElement: Integer;
    function AppendElement(Element: TEDIElement): Integer;
    function InsertElement(InsertIndex: Integer): Integer; overload;
    function InsertElement(InsertIndex: Integer; Element: TEDIElement): Integer; overload;
    procedure DeleteElement(Index: Integer); overload;
    procedure DeleteElement(Element: TEDIElement); overload;
    //
    function AddElements(Count: Integer): Integer;
    function AppendElements(ElementArray: TEDIElementArray): Integer;
    function InsertElements(InsertIndex, Count: Integer): Integer; overload;
    function InsertElements(InsertIndex: Integer;
      ElementArray: TEDIElementArray): Integer; overload;
    procedure DeleteElements; overload;
    procedure DeleteElements(Index, Count: Integer); overload;
    //
    function Assemble: string; override;
    procedure Disassemble; override;
    //
    property Element[Index: Integer]: TEDIElement read GetElement write SetElement; default;
    property Elements: TEDIDataObjectList read FEDIDataObjects;
  end;

  TEDICompositeElementArray = array of TEDICompositeElement;

  //  EDI Segment Classes
  TEDISegment = class(TEDIDataObjectGroup)
  private
    FSegmentID: string;
    //FSegmentIdData: T??? // ToDo: ex: AAA:1:1:2+data1+data2'
  protected
    function InternalCreateElement: TEDIElement; virtual;
    function InternalCreateCompositeElement: TEDICompositeElement; virtual;
    function InternalAssignDelimiters: TEDIDelimiters; override;
    function InternalCreateEDIDataObject: TEDIDataObject; override;
  public
    constructor Create(Parent: TEDIDataObject; ElementCount: Integer = 0); reintroduce;
    destructor Destroy; override;
    //
    function AddElement: Integer;
    function AppendElement(Element: TEDIElement): Integer;
    function InsertElement(InsertIndex: Integer): Integer; overload;
    function InsertElement(InsertIndex: Integer; Element: TEDIElement): Integer; overload;
    procedure DeleteElement(Index: Integer); overload;
    procedure DeleteElement(Element: TEDIElement); overload;
    //
    function AddElements(Count: Integer): Integer;
    function AppendElements(ElementArray: TEDIElementArray): Integer;
    function InsertElements(InsertIndex, Count: Integer): Integer; overload;
    function InsertElements(InsertIndex: Integer;
      ElementArray: TEDIElementArray): Integer; overload;
    procedure DeleteElements; overload;
    procedure DeleteElements(Index, Count: Integer); overload;
    //
    function AddCompositeElement: Integer;
    function AppendCompositeElement(CompositeElement: TEDICompositeElement): Integer;
    function InsertCompositeElement(InsertIndex: Integer): Integer; overload;
    function InsertCompositeElement(InsertIndex: Integer;
      CompositeElement: TEDICompositeElement): Integer; overload;
    //
    function AddCompositeElements(Count: Integer): Integer;
    function AppendCompositeElements(CompositeElementArray: TEDICompositeElementArray): Integer;
    function InsertCompositeElements(InsertIndex, Count: Integer): Integer; overload;
    function InsertCompositeElements(InsertIndex: Integer;
      CompositeElementArray: TEDICompositeElementArray): Integer; overload;
    //
    function Assemble: string; override;
    procedure Disassemble; override;
  published
    property SegmentID: string read FSegmentID write FSegmentID;
    property ElementCount: Integer read GetCount;
  end;

  TEDISegmentArray = array of TEDISegment;

  TEDIMessageSegment = class(TEDISegment)
  public
    constructor Create(Parent: TEDIDataObject; ElementCount: Integer = 0); reintroduce;
    function InternalAssignDelimiters: TEDIDelimiters; override;
  end;

  TEDIFunctionalGroupSegment = class(TEDISegment)
  public
    constructor Create(Parent: TEDIDataObject; ElementCount: Integer = 0); reintroduce;
    function InternalAssignDelimiters: TEDIDelimiters; override;
  end;

  TEDIInterchangeControlSegment = class(TEDISegment)
  public
    constructor Create(Parent: TEDIDataObject; ElementCount: Integer = 0); reintroduce;
    function InternalAssignDelimiters: TEDIDelimiters; override;
  end;

  //  EDI Transaction Set Loop
  TEDIMessageLoop = class(TEDIDataObjectGroup)
  protected
    FOwnerLoopId: string;
    FParentLoopId: string;
    FParentMessage: TEDIMessage;
    function InternalAssignDelimiters: TEDIDelimiters; override;
    function InternalCreateEDIDataObject: TEDIDataObject; override;
  public
    constructor Create(Parent: TEDIDataObject); reintroduce;
    destructor Destroy; override;
    function Assemble: string; override;
    procedure Disassemble; override;
    //
    //  ToDo:  More procedures and functions to manage internal structures
    //
    function FindLoop(LoopId: string; var StartIndex: Integer): TEDIMessageLoop;
    function FindSegment(SegmentId: string; var StartIndex: Integer): TEDISegment; overload;
    function FindSegment(SegmentId: string; var StartIndex: Integer;
      ElementConditions: TStrings): TEDISegment; overload;
    //
    function AddLoop(OwnerLoopId, ParentLoopId: string): Integer;
    procedure AppendSegment(Segment: TEDISegment);
    procedure DeleteEDIDataObjects;
  published
    property OwnerLoopId: string read FOwnerLoopId write FOwnerLoopId;
    property ParentLoopId: string read FParentLoopId write FParentLoopId;
    property ParentMessage: TEDIMessage read FParentMessage write FParentMessage;
  end;

  //  EDI Message (Transaction Set)
  TEDIMessage = class(TEDIDataObjectGroup)
  private
    FUNHSegment: TEDIMessageSegment;
    FUNTSegment: TEDIMessageSegment;
    function GetSegment(Index: Integer): TEDISegment;
    procedure SetSegment(Index: Integer; Segment: TEDISegment);
    procedure SetUNHSegment(const UNHSegment: TEDIMessageSegment);
    procedure SetUNTSegment(const UNTSegment: TEDIMessageSegment);
  protected
    procedure InternalCreateHeaderTrailerSegments; virtual;
    function InternalCreateSegment: TEDISegment; virtual;
    function InternalAssignDelimiters: TEDIDelimiters; override;
    function InternalCreateEDIDataObject: TEDIDataObject; override;
  public
    constructor Create(Parent: TEDIDataObject; SegmentCount: Integer = 0); reintroduce;
    destructor Destroy; override;

    function AddSegment: Integer;
    function AppendSegment(Segment: TEDISegment): Integer;
    function InsertSegment(InsertIndex: Integer): Integer; overload;
    function InsertSegment(InsertIndex: Integer; Segment: TEDISegment): Integer; overload;
    procedure DeleteSegment(Index: Integer); overload;
    procedure DeleteSegment(Segment: TEDISegment); overload;

    function AddSegments(Count: Integer): Integer;
    function AppendSegments(SegmentArray: TEDISegmentArray): Integer;
    function InsertSegments(InsertIndex, Count: Integer): Integer; overload;
    function InsertSegments(InsertIndex: Integer;
      SegmentArray: TEDISegmentArray): Integer; overload;
    procedure DeleteSegments; overload;
    procedure DeleteSegments(Index, Count: Integer); overload;

    function Assemble: string; override;
    procedure Disassemble; override;

    property Segment[Index: Integer]: TEDISegment read GetSegment write SetSegment; default;
    property Segments: TEDIDataObjectList read FEDIDataObjects;
  published
    property SegmentUNH: TEDIMessageSegment read FUNHSegment write SetUNHSegment;
    property SegmentUNT: TEDIMessageSegment read FUNTSegment write SetUNTSegment;
    property SegmentCount: Integer read GetCount;
  end;

  TEDIMessageArray = array of TEDIMessage;

  //  EDI Functional Group
  TEDIFunctionalGroup = class(TEDIDataObjectGroup)
  private
    FUNGSegment: TEDIFunctionalGroupSegment;
    FUNESegment: TEDIFunctionalGroupSegment;
    function GetMessage(Index: Integer): TEDIMessage;
    procedure SetMessage(Index: Integer; Message: TEDIMessage);
    procedure SetUNGSegment(const UNGSegment: TEDIFunctionalGroupSegment);
    procedure SetUNESegment(const UNESegment: TEDIFunctionalGroupSegment);
  protected
    procedure InternalCreateHeaderTrailerSegments; virtual;
    function InternalCreateMessage: TEDIMessage; virtual;
    function InternalAssignDelimiters: TEDIDelimiters; override;
    function InternalCreateEDIDataObject: TEDIDataObject; override;
  public
    constructor Create(Parent: TEDIDataObject; MessageCount: Integer = 0); reintroduce;
    destructor Destroy; override;

    function AddMessage: Integer;
    function AppendMessage(Message: TEDIMessage): Integer;
    function InsertMessage(InsertIndex: Integer): Integer; overload;
    function InsertMessage(InsertIndex: Integer;
      Message: TEDIMessage): Integer; overload;
    procedure DeleteMessage(Index: Integer); overload;
    procedure DeleteMessage(Message: TEDIMessage); overload;

    function AddMessages(Count: Integer): Integer;
    function AppendMessages(MessageArray: TEDIMessageArray): Integer;
    function InsertMessages(InsertIndex, Count: Integer): Integer; overload;
    function InsertMessages(InsertIndex: Integer;
      MessageArray: TEDIMessageArray): Integer; overload;
    procedure DeleteMessages; overload;
    procedure DeleteMessages(Index, Count: Integer); overload;

    function Assemble: string; override;
    procedure Disassemble; override;

    property Message[Index: Integer]: TEDIMessage read GetMessage
      write SetMessage; default;
    property Messages: TEDIDataObjectList read FEDIDataObjects;
  published
    property SegmentUNG: TEDIFunctionalGroupSegment read FUNGSegment write SetUNGSegment;
    property SegmentUNE: TEDIFunctionalGroupSegment read FUNESegment write SetUNESegment;
    property MessageCount: Integer read GetCount;
  end;

  TEDIFunctionalGroupArray = array of TEDIFunctionalGroup;

  //  EDI Interchange Control
  TEDIInterchangeControl = class(TEDIDataObjectGroup)
  private
    FUNASegment: TEDIInterchangeControlSegment;
    FUNBSegment: TEDIInterchangeControlSegment;
    FUNZSegment: TEDIInterchangeControlSegment;
    procedure SetUNBSegment(const UNBSegment: TEDIInterchangeControlSegment);
    procedure SetUNZSegment(const UNZSegment: TEDIInterchangeControlSegment);
  protected
    FCreateObjectType: TEDIDataObjectType;
    procedure InternalCreateHeaderTrailerSegments; virtual;
    function InternalCreateFunctionalGroup: TEDIFunctionalGroup; virtual;
    function InternalCreateMessage: TEDIMessage; virtual;
    function InternalAssignDelimiters: TEDIDelimiters; override;
    function InternalCreateEDIDataObject: TEDIDataObject; override;
  public
    constructor Create(Parent: TEDIDataObject; FunctionalGroupCount: Integer = 0); reintroduce;
    destructor Destroy; override;

    function AddFunctionalGroup: Integer;
    function AppendFunctionalGroup(FunctionalGroup: TEDIFunctionalGroup): Integer;
    function InsertFunctionalGroup(InsertIndex: Integer): Integer; overload;
    function InsertFunctionalGroup(InsertIndex: Integer;
      FunctionalGroup: TEDIFunctionalGroup): Integer; overload;

    function AddFunctionalGroups(Count: Integer): Integer;
    function AppendFunctionalGroups(FunctionalGroupArray: TEDIFunctionalGroupArray): Integer;
    function InsertFunctionalGroups(InsertIndex, Count: Integer): Integer; overload;
    function InsertFunctionalGroups(InsertIndex: Integer;
      FunctionalGroupArray: TEDIFunctionalGroupArray): Integer; overload;

    function AddMessage: Integer;
    function AppendMessage(Message: TEDIMessage): Integer;
    function InsertMessage(InsertIndex: Integer): Integer; overload;
    function InsertMessage(InsertIndex: Integer; Message: TEDIMessage): Integer; overload;

    function AddMessages(Count: Integer): Integer;
    function AppendMessages(MessageArray: TEDIMessageArray): Integer;
    function InsertMessages(InsertIndex, Count: Integer): Integer; overload;
    function InsertMessages(InsertIndex: Integer; MessageArray: TEDIMessageArray): Integer; overload;

    function Assemble: string; override;
    procedure Disassemble; override;
  published
    property SegmentUNA: TEDIInterchangeControlSegment read FUNASegment;
    property SegmentUNB: TEDIInterchangeControlSegment read FUNBSegment write SetUNBSegment;
    property SegmentUNZ: TEDIInterchangeControlSegment read FUNZSegment write SetUNZSegment;
  end;

  TEDIInterchangeControlArray = array of TEDIInterchangeControl;

  //  EDI File
  TEDIFileOptions = set of (foVariableDelimiterDetection, foRemoveCrLf, foRemoveCr, foRemoveLf,
    foIgnoreGarbageAtEndOfFile);

  TEDIFile = class(TEDIDataObjectGroup)
  private
    FFileID: Integer;
    FFileName: string;
    FEDIFileOptions: TEDIFileOptions;
    function GetInterchangeControl(Index: Integer): TEDIInterchangeControl;
    procedure SetInterchangeControl(Index: Integer; Interchange: TEDIInterchangeControl);
    procedure InternalLoadFromFile;
  protected
    procedure InternalDelimitersDetection(StartPos: Integer); virtual;
    procedure InternalAlternateDelimitersDetection(StartPos: Integer);
    function InternalCreateInterchangeControl: TEDIInterchangeControl; virtual;
    function InternalAssignDelimiters: TEDIDelimiters; override;
    function InternalCreateEDIDataObject: TEDIDataObject; override;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -