📄 jcledi_ansix12.pas
字号:
begin
Result := AppendEDIDataObject(FunctionalGroup);
end;
function TEDIInterchangeControl.AppendFunctionalGroups(
FunctionalGroupArray: TEDIFunctionalGroupArray): Integer;
begin
Result := AppendEDIDataObjects(TEDIDataObjectArray(FunctionalGroupArray));
end;
function TEDIInterchangeControl.Assemble: string;
var
I: Integer;
begin
FData := '';
FLength := 0;
Result := '';
if not Assigned(FDelimiters) then
raise EJclEDIError.CreateRes(@RsEDIError013);
FData := FISASegment.Assemble;
FISASegment.Data := '';
if GetCount > 0 then
for I := 0 to GetCount - 1 do
if Assigned(FEDIDataObjects[I]) then
FData := FData + FEDIDataObjects[I].Assemble;
DeleteFunctionalGroups;
FData := FData + FIEASegment.Assemble;
FIEASegment.Data := '';
FLength := Length(FData);
Result := FData;
FState := ediAssembled;
end;
procedure TEDIInterchangeControl.DeleteFunctionalGroup(Index: Integer);
begin
DeleteEDIDataObject(Index);
end;
procedure TEDIInterchangeControl.DeleteFunctionalGroups;
begin
DeleteEDIDataObjects;
end;
procedure TEDIInterchangeControl.DeleteFunctionalGroups(Index, Count: Integer);
begin
DeleteEDIDataObjects(Index, Count);
end;
procedure TEDIInterchangeControl.Disassemble;
var
I, StartPos, SearchResult: Integer;
ProcessTA1: Boolean;
TA1Segment: TEDIInterchangeControlSegment;
begin
ProcessTA1 := False;
FTA1Segments.Clear;
FISASegment.Data := '';
FISASegment.DeleteElements;
FIEASegment.Data := '';
FIEASegment.DeleteElements;
DeleteFunctionalGroups;
if not Assigned(FDelimiters) then
raise EJclEDIError.CreateRes(@RsEDIError012);
StartPos := 1;
// Search for Interchange Control Header
if ICHSegmentId + FDelimiters.ED = Copy(FData, 1, Length(ICHSegmentId + FDelimiters.ED)) then
begin
SearchResult := StrSearch(FDelimiters.SD, FData, StartPos);
if (SearchResult - StartPos) > 0 then // data exists
begin
FISASegment.Data := Copy(FData, 1, (SearchResult + FDelimiters.SDLen) - 1);
FISASegment.Disassemble;
end
else
raise EJclEDIError.CreateRes(@RsEDIError014);
end
else
raise EJclEDIError.CreateRes(@RsEDIError015);
// Search for Functional Group Header
SearchResult := StrSearch(FDelimiters.SD + FGHSegmentId + FDelimiters.ED, FData, StartPos);
// Check for TA1 Segment
I := StrSearch(FDelimiters.SD + TA1SegmentId + FDelimiters.ED, FData, StartPos);
if ((I < SearchResult) or ((I > SearchResult) and (SearchResult = 0))) and (I <> 0) then
begin
ProcessTA1 := True;
SearchResult := I;
end;
if (SearchResult <= 0) and (not ProcessTA1) then
raise EJclEDIError.CreateRes(@RsEDIError022);
// Set next start positon
StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
// Continue
while ((StartPos + Length(FGHSegmentId)) < Length(FData)) and (SearchResult > 0) do
begin
if not ProcessTA1 then
begin
// Search for Functional Group Trailer
SearchResult := StrSearch(FDelimiters.SD + FGTSegmentId + FDelimiters.ED, FData, StartPos);
if SearchResult > 0 then
begin
// Set next start positon
SearchResult := SearchResult + FDelimiters.SDLen; // Move past the delimiter
// Search for end of Functional Group Trailer Segment Terminator
SearchResult := StrSearch(FDelimiters.SD, FData, SearchResult);
if SearchResult > 0 then
begin
I := AddFunctionalGroup;
FEDIDataObjects[I].Data :=
Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.SDLen));
FEDIDataObjects[I].Disassemble;
end
else
raise EJclEDIError.CreateRes(@RsEDIError023);
end
else
raise EJclEDIError.CreateRes(@RsEDIError024);
// Set next start positon
StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
// Verify the next record is a Functional Group Header
if (TA1SegmentId + FDelimiters.ED) =
Copy(FData, StartPos, (Length(TA1SegmentId) + FDelimiters.EDLen)) then
ProcessTA1 := True
else
if (FGHSegmentId + FDelimiters.ED) <>
Copy(FData, StartPos, (Length(FGHSegmentId) + FDelimiters.EDLen)) then
Break;
end
else //Process TA1 Segment
begin
ProcessTA1 := False;
// Check next segment
SearchResult := StrSearch(FDelimiters.SD, FData, StartPos);
// Debug
//ShowMessage('"' + Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.SDLen)) + '"');
TA1Segment := TEDIInterchangeControlSegment.Create(Self);
FTA1Segments.Add(TA1Segment);
TA1Segment.Data := Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.SDLen));
TA1Segment.Disassemble;
// Set next start positon
StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
// Check next segment
if (TA1SegmentId + FDelimiters.ED) =
Copy(FData, StartPos, (Length(TA1SegmentId) + FDelimiters.EDLen)) then
ProcessTA1 := True
else
if (FGHSegmentId + FDelimiters.ED) <>
Copy(FData, StartPos, (Length(FGHSegmentId) + FDelimiters.EDLen)) then
Break;
end;
end;
// Verify the next record is a Interchange Control Trailer
if (ICTSegmentId + FDelimiters.ED) =
Copy(FData, StartPos, Length(ICTSegmentId + FDelimiters.ED)) then
begin
// Search for the end of Interchange Control Trailer Segment Terminator
SearchResult := StrSearch(FDelimiters.SD, FData, StartPos);
if (SearchResult - StartPos) > 0 then // data exists
begin
FIEASegment.Data := Copy(FData, StartPos, (SearchResult + FDelimiters.SDLen));
FIEASegment.Disassemble;
end
else
raise EJclEDIError.CreateRes(@RsEDIError016);
end
else
raise EJclEDIError.CreateRes(@RsEDIError017);
FData := '';
FState := ediDisassembled;
end;
function TEDIInterchangeControl.GetFunctionalGroup(Index: Integer): TEDIFunctionalGroup;
begin
Result := TEDIFunctionalGroup(GetEDIDataObject(Index));
end;
function TEDIInterchangeControl.InsertFunctionalGroup(InsertIndex: Integer;
FunctionalGroup: TEDIFunctionalGroup): Integer;
begin
Result := InsertEDIDataObject(InsertIndex, FunctionalGroup);
end;
function TEDIInterchangeControl.InsertFunctionalGroup(InsertIndex: Integer): Integer;
begin
Result := InsertEDIDataObject(InsertIndex);
end;
function TEDIInterchangeControl.InsertFunctionalGroups(InsertIndex, Count: Integer): Integer;
begin
Result := InsertEDIDataObjects(InsertIndex, Count);
end;
function TEDIInterchangeControl.InsertFunctionalGroups(InsertIndex: Integer;
FunctionalGroupArray: TEDIFunctionalGroupArray): Integer;
begin
Result := InsertEDIDataObjects(InsertIndex, TEDIDataObjectArray(FunctionalGroupArray));
end;
procedure TEDIInterchangeControl.SetFunctionalGroup(Index: Integer;
FunctionalGroup: TEDIFunctionalGroup);
begin
SetEDIDataObject(Index, FunctionalGroup);
end;
function TEDIInterchangeControl.InternalCreateFunctionalGroup: TEDIFunctionalGroup;
begin
Result := TEDIFunctionalGroup.Create(Self);
end;
procedure TEDIInterchangeControl.InternalCreateHeaderTrailerSegments;
begin
FISASegment := TEDIInterchangeControlSegment.Create(Self);
FIEASegment := TEDIInterchangeControlSegment.Create(Self);
end;
procedure TEDIInterchangeControl.SetIEASegment(const IEASegment: TEDIInterchangeControlSegment);
begin
FreeAndNil(FIEASegment);
FIEASegment := IEASegment;
if Assigned(FIEASegment) then
FIEASegment.Parent := Self;
end;
procedure TEDIInterchangeControl.SetISASegment(const ISASegment: TEDIInterchangeControlSegment);
begin
FreeAndNil(FISASegment);
FISASegment := ISASegment;
if Assigned(FISASegment) then
FISASegment.Parent := Self;
end;
procedure TEDIInterchangeControl.DeleteFunctionalGroup(FunctionalGroup: TEDIFunctionalGroup);
begin
DeleteEDIDataObject(FunctionalGroup);
end;
function TEDIInterchangeControl.InternalCreateEDIDataObject: TEDIDataObject;
begin
Result := InternalCreateFunctionalGroup;
end;
function TEDIInterchangeControl.InternalAssignDelimiters: TEDIDelimiters;
begin
Result := nil;
end;
//=== { TEDIFile } ===========================================================
constructor TEDIFile.Create(Parent: TEDIDataObject; InterchangeCount: Integer);
begin
inherited Create(nil, InterchangeCount);
FEDIFileOptions := [foVariableDelimiterDetection, foRemoveCrLf, foRemoveCr, foRemoveLf];
FEDIDOT := ediFile;
end;
destructor TEDIFile.Destroy;
begin
inherited Destroy;
end;
function TEDIFile.AddInterchange: Integer;
begin
Result := AddEDIDataObject;
end;
function TEDIFile.AddInterchanges(Count: Integer): Integer;
begin
Result := AddEDIDataObjects(Count);
end;
function TEDIFile.AppendInterchange(Interchange: TEDIInterchangeControl): Integer;
begin
Result := AppendEDIDataObject(Interchange);
end;
function TEDIFile.AppendInterchanges(InterchangeControlArray: TEDIInterchangeControlArray): Integer;
begin
Result := AppendEDIDataObjects(TEDIDataObjectArray(InterchangeControlArray));
end;
function TEDIFile.Assemble: string;
var
I: Integer;
begin
FData := '';
FLength := 0;
Result := '';
if GetCount > 0 then
for I := 0 to GetCount - 1 do
begin
if Assigned(FEDIDataObjects[I]) then
FData := FData + FEDIDataObjects[I].Assemble;
FEDIDataObjects[I].Data := '';
end;
FLength := Length(FData);
Result := FData;
DeleteInterchanges;
FState := ediAssembled;
end;
procedure TEDIFile.DeleteInterchange(Index: Integer);
begin
DeleteEDIDataObject(Index);
end;
procedure TEDIFile.DeleteInterchanges(Index, Count: Integer);
begin
DeleteEDIDataObjects(Index, Count);
end;
procedure TEDIFile.DeleteInterchanges;
begin
DeleteEDIDataObjects;
end;
procedure TEDIFile.Disassemble;
var
I, StartPos, SearchResult: Integer;
begin
DeleteInterchanges;
if not Assigned(FDelimiters) then
begin
FDelimiters := InternalAssignDelimiters;
FEDIFileOptions := FEDIFileOptions + [foVariableDelimiterDetection];
end;
if foRemoveCrLf in FEDIFileOptions then
{$IFDEF OPTIMIZED_STRINGREPLACE}
FData := JclEDI.StringReplace(FData, AnsiCrLf, '', [rfReplaceAll]);
{$ELSE}
FData := SysUtils.StringReplace(FData, AnsiCrLf, '', [rfReplaceAll]);
{$ENDIF OPTIMIZED_STRINGREPLACE}
if foRemoveCr in FEDIFileOptions then
{$IFDEF OPTIMIZED_STRINGREPLACE}
FData := JclEDI.StringReplace(FData, AnsiCarriageReturn, '', [rfReplaceAll]);
{$ELSE}
FData := SysUtils.StringReplace(FData, AnsiCarriageReturn, '', [rfReplaceAll]);
{$ENDIF OPTIMIZED_STRINGREPLACE}
if foRemoveLf in FEDIFileOptions then
{$IFDEF OPTIMIZED_STRINGREPLACE}
FData := JclEDI.StringReplace(FData, AnsiLineFeed, '', [rfReplaceAll]);
{$ELSE}
FData := SysUtils.StringReplace(FData, AnsiLineFeed, '', [rfReplaceAll]);
{$ENDIF OPTIMIZED_STRINGREPLACE}
StartPos := 1;
// Search for Interchange Control Header
if ICHSegmentId = Copy(FData, StartPos, Length(ICHSegmentId)) then
begin
if foVariableDelimiterDetection in FEDIFileOptions then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -