📄 jcledi_ansix12.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_ANSIX12.pas. }
{ }
{ The Initial Developer of the Original Code is Raymond Alexander. }
{ Portions created by Raymond Alexander are Copyright Raymond Alexander. All rights reserved. }
{ }
{ Contributor(s): }
{ Raymond Alexander (rayspostbox3), Robert Marquardt, Robert Rossmair, Petr Vones }
{ }
{**************************************************************************************************}
{ }
{ Contains classes to eaisly 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_ANSIX12.pas,v 1.15 2005/03/08 08:33:16 marquardt Exp $
unit JclEDI_ANSIX12;
{$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
// ANSI X12 Segment Id's
ICHSegmentId = 'ISA'; // Interchange Control Header Segment Id
ICTSegmentId = 'IEA'; // Interchange Control Trailer Segment Id
FGHSegmentId = 'GS'; // Functional Group Header Segment Id
FGTSegmentId = 'GE'; // Functional Group Trailer Segment Id
TSHSegmentId = 'ST'; // Transaction Set Header Segment Id
TSTSegmentId = 'SE'; // Transaction Set Trailer Segment Id
TA1SegmentId = 'TA1'; // Interchange Acknowledgment Segment
// Reserved Data Field Names (TStringList Values)
RDFN_Id = 'Id';
RDFN_Position = 'Position';
RDFN_Description = 'Description';
RDFN_Notes = 'Notes';
RDFN_Section = 'Section'; // For Segment Only
RDFN_RequirementDesignator = 'RequirementDesignator';
RDFN_MaximumUsage = 'MaximumUsage'; // For Segment Only
RDFN_OwnerLoopId = 'OwnerLoopId'; // ...
RDFN_ParentLoopId = 'ParentLoopId'; // ...
RDFN_MaximumLoopRepeat = 'MaximumLoopRepeat'; // For Loop however saved in segment that begins loop
RDFN_Type = 'Type'; // For Element Only
RDFN_MinimumLength = 'MinimumLength'; // ...
RDFN_MaximumLength = 'MaximumLength'; // ...
RDFN_TransSetId = 'TransSetId'; // For Segment ST Only
RDFN_TransSetDesc = 'TransSetDesc'; // ...
RDFN_FunctionalGroupId = 'FunctionalGroupId'; // For Segment GS Only
RDFN_FGDescription = 'FGDescription'; // ...
RDFN_AgencyCodeId = 'AgencyCodeId'; // ...
RDFN_VersionReleaseId = 'VersionReleaseId'; // ...
RDFN_StandardId = 'StandardId'; // For Segment ISA Only
RDFN_VersionId = 'VersionId'; // ...
RDFN_ICDescription = 'ICDescription'; // ...
type
// EDI Forward Class Declarations
TEDIElement = class;
TEDISegment = class;
TEDITransactionSet = class;
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 Element Specification
TEDIElementSpec = class(TEDIElement)
private
FReservedData: TStringList;
FElementId: string;
FPosition: Integer;
FDescription: string;
FNotes: string;
FRequirementDesignator: string;
FType: string;
FMinimumLength: Integer;
FMaximumLength: Integer;
function GetReservedData: TStrings;
public
constructor Create(Parent: TEDIDataObject); reintroduce;
destructor Destroy; override;
function Assemble: string; override;
procedure Disassemble; override;
published
property ReservedData: TStrings read GetReservedData;
property Id: string read FElementId write FElementId;
property ElementId: string read FElementId write FElementId;
property Position: Integer read FPosition write FPosition;
property Description: string read FDescription write FDescription;
property Notes: string read FNotes write FNotes;
property RequirementDesignator: string read FRequirementDesignator write FRequirementDesignator;
property ElementType: string read FType write FType;
property MinimumLength: Integer read FMinimumLength write FMinimumLength;
property MaximumLength: Integer read FMaximumLength write FMaximumLength;
end;
// EDI Segment Classes
TEDISegment = class(TEDIDataObjectGroup)
private
function GetElement(Index: Integer): TEDIElement;
procedure SetElement(Index: Integer; Element: TEDIElement);
protected
FSegmentId: string;
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;
published
property SegmentId: string read FSegmentId write FSegmentId;
property ElementCount: Integer read GetCount;
end;
TEDISegmentArray = array of TEDISegment;
TEDITransactionSetSegment = 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 Segment Specification Classes
TEDISegmentSpec = class(TEDISegment)
private
FReservedData: TStringList;
FPosition: Integer;
FDescription: string;
FNotes: string;
FSection: string;
FRequirementDesignator: string;
FMaximumUsage: Integer;
FOwnerLoopId: string;
FParentLoopId: string;
function GetReservedData: TStrings;
public
constructor Create(Parent: TEDIDataObject; ElementCount: Integer = 0); reintroduce;
destructor Destroy; override;
procedure AssembleReservedData(ReservedData: TStrings); virtual;
procedure DisassembleReservedData(ReservedData: TStrings); virtual;
function InternalCreateElement: TEDIElement; override;
function Assemble: string; override;
procedure Disassemble; override;
procedure ValidateElementIndexPositions;
published
property ReservedData: TStrings read GetReservedData;
property Id: string read FSegmentId write FSegmentId;
property Position: Integer read FPosition write FPosition;
property Description: string read FDescription write FDescription;
property Notes: string read FNotes write FNotes;
property Section: string read FSection write FSection;
property RequirementDesignator: string read FRequirementDesignator write FRequirementDesignator;
property MaximumUsage: Integer read FMaximumUsage write FMaximumUsage;
property OwnerLoopId: string read FOwnerLoopId write FOwnerLoopId;
property ParentLoopId: string read FParentLoopId write FParentLoopId;
end;
TEDITransactionSetSegmentSpec = class(TEDISegmentSpec)
public
constructor Create(Parent: TEDIDataObject; ElementCount: Integer = 0); reintroduce;
function InternalAssignDelimiters: TEDIDelimiters; override;
end;
TEDITransactionSetSegmentSTSpec = class(TEDITransactionSetSegmentSpec)
public
constructor Create(Parent: TEDIDataObject; ElementCount: Integer = 0); reintroduce;
procedure AssembleReservedData(ReservedData: TStrings); override;
procedure DisassembleReservedData(ReservedData: TStrings); override;
end;
TEDIFunctionalGroupSegmentSpec = class(TEDISegmentSpec)
public
constructor Create(Parent: TEDIDataObject; ElementCount: Integer = 0); reintroduce;
function InternalAssignDelimiters: TEDIDelimiters; override;
end;
TEDIFunctionalGroupSegmentGSSpec = class(TEDIFunctionalGroupSegmentSpec)
public
constructor Create(Parent: TEDIDataObject; ElementCount: Integer = 0); reintroduce;
procedure AssembleReservedData(ReservedData: TStrings); override;
procedure DisassembleReservedData(ReservedData: TStrings); override;
end;
TEDIInterchangeControlSegmentSpec = class(TEDISegmentSpec)
public
constructor Create(Parent: TEDIDataObject; ElementCount: Integer = 0); reintroduce;
function InternalAssignDelimiters: TEDIDelimiters; override;
end;
TEDIInterchangeControlSegmentISASpec = class(TEDIInterchangeControlSegmentSpec)
public
constructor Create(Parent: TEDIDataObject; ElementCount: Integer = 0); reintroduce;
function Assemble: string; override;
procedure Disassemble; override;
procedure AssembleReservedData(ReservedData: TStrings); override;
procedure DisassembleReservedData(ReservedData: TStrings); override;
end;
// EDI Transaction Set
TEDITransactionSet = class(TEDIDataObjectGroup)
private
FSTSegment: TEDITransactionSetSegment;
FSESegment: TEDITransactionSetSegment;
function GetSegment(Index: Integer): TEDISegment;
procedure SetSegment(Index: Integer; Segment: TEDISegment);
procedure SetSTSegment(const STSegment: TEDITransactionSetSegment);
procedure SetSESegment(const SESegment: TEDITransactionSetSegment);
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 SegmentST: TEDITransactionSetSegment read FSTSegment write SetSTSegment;
property SegmentSE: TEDITransactionSetSegment read FSESegment write SetSESegment;
property SegmentCount: Integer read GetCount;
end;
TEDITransactionSetArray = array of TEDITransactionSet;
// EDI Transaction Set Specification
TEDITransactionSetSpec = class(TEDITransactionSet)
private
FTransactionSetId: string;
FTSDescription: string;
public
procedure InternalCreateHeaderTrailerSegments; override;
function InternalCreateSegment: TEDISegment; override;
procedure ValidateSegmentIndexPositions;
published
property Id: string read FTransactionSetId write FTransactionSetId;
property TransactionSetId: string read FTransactionSetId write FTransactionSetId;
property TSDescription: string read FTSDescription write FTSDescription;
end;
// EDI Transaction Set Loop
TEDITransactionSetLoop = class(TEDIDataObjectGroup)
protected
FOwnerLoopId: string;
FParentLoopId: string;
FParentTransactionSet: TEDITransactionSet;
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): TEDITransactionSetLoop;
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -