📄 jcledi_unedifact.pas
字号:
{**************************************************************************************************}
{ }
{ 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 + -