📄 jcledi_unedifact.pas
字号:
if not Assigned(FDelimiters) then
raise EJclEDIError.CreateRes(@RsEDIError019);
end;
// Find Functional Group Header Segment
StartPos := 1;
// Search for Functional Group Header
if UNGSegmentId + FDelimiters.ED = Copy(FData, 1, Length(UNGSegmentId + FDelimiters.ED)) then
begin
// Search for Functional Group Header Segment Terminator
SearchResult := StrSearch(FDelimiters.SD, FData, 1);
if (SearchResult - StartPos) > 0 then // data exists
begin
FUNGSegment.Data := Copy(FData, 1, (SearchResult + FDelimiters.SDLen) - 1);
FUNGSegment.Disassemble;
end
else
raise EJclEDIError.CreateRes(@RsEDIError021);
end
else
raise EJclEDIError.CreateRes(@RsEDIError022);
// Search for Message Header
SearchResult := StrSearch(FDelimiters.SD + UNHSegmentId + FDelimiters.ED, FData, StartPos);
if SearchResult <= 0 then
raise EJclEDIError.CreateRes(@RsEDIError032);
// Set next start position
StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
// Continue
while SearchResult <> 0 do
begin
// Search for Message Trailer
SearchResult := StrSearch(FDelimiters.SD + UNTSegmentId + FDelimiters.ED, FData, StartPos);
if SearchResult <> 0 then
begin
// Set the next start position
SearchResult := SearchResult + FDelimiters.SDLen; // Move past the delimiter
// Search for the end of Message Trailer
SearchResult := StrSearch(FDelimiters.SD, FData, SearchResult);
if SearchResult <> 0 then
begin
I := AddMessage;
FEDIDataObjects[I].Data :=
Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.SDLen));
FEDIDataObjects[I].Disassemble;
end
else
raise EJclEDIError.CreateRes(@RsEDIError033);
end
else
raise EJclEDIError.CreateRes(@RsEDIError034);
// Set the next start position
StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
//
// Verify the next record is a Message Header
if (UNHSegmentId + FDelimiters.ED) <>
Copy(FData, StartPos, (Length(UNHSegmentId) + FDelimiters.EDLen)) then
Break;
end;
// Set the next start position
StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
// Find Functional Group Trailer Segment
if (UNESegmentId + FDelimiters.ED) =
Copy(FData, StartPos, Length(UNESegmentId + FDelimiters.ED)) then
begin
// Find Functional Group Trailer Segment Terminator
SearchResult := StrSearch(FDelimiters.SD, FData, StartPos + FDelimiters.SDLen);
if (SearchResult - StartPos) > 0 then // data exists
begin
FUNESegment.Data := Copy(FData, StartPos, (SearchResult + FDelimiters.SDLen));
FUNESegment.Disassemble;
end
else
raise EJclEDIError.CreateRes(@RsEDIError023);
end
else
raise EJclEDIError.CreateRes(@RsEDIError024);
FData := '';
FState := ediDisassembled;
end;
function TEDIFunctionalGroup.GetMessage(Index: Integer): TEDIMessage;
begin
Result := TEDIMessage(GetEDIDataObject(Index));
end;
function TEDIFunctionalGroup.InsertMessage(InsertIndex: Integer): Integer;
begin
Result := InsertEDIDataObject(InsertIndex);
end;
function TEDIFunctionalGroup.InsertMessage(InsertIndex: Integer;
Message: TEDIMessage): Integer;
begin
Result := InsertEDIDataObject(InsertIndex, Message);
end;
function TEDIFunctionalGroup.InsertMessages(InsertIndex: Integer;
MessageArray: TEDIMessageArray): Integer;
begin
Result := InsertEDIDataObjects(InsertIndex, TEDIDataObjectArray(MessageArray));
end;
function TEDIFunctionalGroup.InsertMessages(InsertIndex, Count: Integer): Integer;
begin
Result := InsertEDIDataObjects(InsertIndex, Count);
end;
function TEDIFunctionalGroup.InternalAssignDelimiters: TEDIDelimiters;
begin
Result := nil;
// Attempt to assign the delimiters
if not Assigned(FDelimiters) then
if Assigned(Parent) and (Parent is TEDIInterchangeControl) then
Result := Parent.Delimiters;
end;
function TEDIFunctionalGroup.InternalCreateMessage: TEDIMessage;
begin
Result := TEDIMessage.Create(Self);
end;
procedure TEDIFunctionalGroup.InternalCreateHeaderTrailerSegments;
begin
FUNGSegment := TEDIFunctionalGroupSegment.Create(Self);
FUNESegment := TEDIFunctionalGroupSegment.Create(Self);
end;
procedure TEDIFunctionalGroup.SetMessage(Index: Integer; Message: TEDIMessage);
begin
SetEDIDataObject(Index, Message);
end;
procedure TEDIFunctionalGroup.SetUNESegment(const UNESegment: TEDIFunctionalGroupSegment);
begin
FreeAndNil(FUNESegment);
FUNESegment := UNESegment;
if Assigned(FUNESegment) then
FUNESegment.Parent := Self;
end;
procedure TEDIFunctionalGroup.SetUNGSegment(const UNGSegment: TEDIFunctionalGroupSegment);
begin
FreeAndNil(FUNGSegment);
FUNGSegment := UNGSegment;
if Assigned(FUNGSegment) then
FUNGSegment.Parent := Self;
end;
function TEDIFunctionalGroup.InternalCreateEDIDataObject: TEDIDataObject;
begin
Result := InternalCreateMessage;
end;
//=== { TEDIInterchangeControl } =============================================
constructor TEDIInterchangeControl.Create(Parent: TEDIDataObject; FunctionalGroupCount: Integer);
begin
if Assigned(Parent) and (Parent is TEDIFile) then
inherited Create(Parent, FunctionalGroupCount)
else
inherited Create(nil, FunctionalGroupCount);
FEDIDOT := ediInterchangeControl;
InternalCreateHeaderTrailerSegments;
FCreateObjectType := ediFunctionalGroup;
end;
destructor TEDIInterchangeControl.Destroy;
begin
FUNASegment.Free;
FUNBSegment.Free;
FUNZSegment.Free;
FreeAndNil(FDelimiters);
inherited Destroy;
end;
function TEDIInterchangeControl.AddFunctionalGroup: Integer;
begin
FCreateObjectType := ediFunctionalGroup;
Result := AddEDIDataObject;
end;
function TEDIInterchangeControl.AddFunctionalGroups(Count: Integer): Integer;
begin
FCreateObjectType := ediFunctionalGroup;
Result := AddEDIDataObjects(Count);
end;
function TEDIInterchangeControl.AppendFunctionalGroup(
FunctionalGroup: TEDIFunctionalGroup): Integer;
begin
FCreateObjectType := ediFunctionalGroup;
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 := FUNBSegment.Assemble;
FUNBSegment.Data := '';
if GetCount > 0 then
for I := 0 to GetCount - 1 do
if Assigned(FEDIDataObjects[I]) then
FData := FData + FEDIDataObjects[I].Assemble;
DeleteEDIDataObjects;
FData := FData + FUNZSegment.Assemble;
FUNZSegment.Data := '';
FLength := Length(FData);
Result := FData;
FState := ediAssembled;
end;
procedure TEDIInterchangeControl.Disassemble;
var
I, StartPos, SearchResult: Integer;
begin
FUNBSegment.Data := '';
FUNBSegment.DeleteElements;
FUNZSegment.Data := '';
FUNZSegment.DeleteElements;
DeleteEDIDataObjects;
if not Assigned(FDelimiters) then
raise EJclEDIError.CreateRes(@RsEDIError012);
StartPos := 1;
// Search for Interchange Control Header
if UNBSegmentId + FDelimiters.ED = Copy(FData, 1, Length(UNBSegmentId + FDelimiters.ED)) then
begin
SearchResult := StrSearch(FDelimiters.SD, FData, StartPos);
if (SearchResult - StartPos) > 0 then // data exists
begin
FUNBSegment.Data := Copy(FData, 1, (SearchResult + FDelimiters.SDLen) - 1);
FUNBSegment.Disassemble;
end
else
raise EJclEDIError.CreateRes(@RsEDIError014);
end
else
raise EJclEDIError.CreateRes(@RsEDIError015);
// Search for Functional Group Header
SearchResult := StrSearch(FDelimiters.SD + UNGSegmentId + FDelimiters.ED, FData, StartPos);
if SearchResult > 0 then
begin
// Set next start positon
StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
// Continue
while ((StartPos + Length(UNGSegmentId)) < Length(FData)) and (SearchResult > 0) do
begin
// Search for Functional Group Trailer
SearchResult := StrSearch(FDelimiters.SD + UNESegmentId + 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 (UNGSegmentId + FDelimiters.ED) <>
Copy(FData, StartPos, (Length(UNGSegmentId) + FDelimiters.EDLen)) then
Break;
end;
end
else
begin
// Search for Message Header
SearchResult := StrSearch(FDelimiters.SD + UNHSegmentId + FDelimiters.ED, FData, StartPos);
if SearchResult <= 0 then
raise EJclEDIError.CreateRes(@RsEDIError032);
// Set next start position
StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
// Continue
while SearchResult <> 0 do
begin
// Search for Message Trailer
SearchResult := StrSearch(FDelimiters.SD + UNTSegmentId + FDelimiters.ED, FData, StartPos);
if SearchResult <> 0 then
begin
// Set the next start position
SearchResult := SearchResult + FDelimiters.SDLen; // Move past the delimiter
// Search for the end of Message Trailer
SearchResult := StrSearch(FDelimiters.SD, FData, SearchResult);
if SearchResult <> 0 then
begin
I := AddMessage;
FEDIDataObjects[I].Data :=
Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.SDLen));
FEDIDataObjects[I].Disassemble;
end
else
raise EJclEDIError.CreateRes(@RsEDIError033);
end
else
raise EJclEDIError.CreateRes(@RsEDIError034);
// Set the next start position
StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
// Verify the next record is a Message Header
if (UNHSegmentId + FDelimiters.ED) <>
Copy(FData, StartPos, (Length(UNHSegmentId) + FDelimiters.EDLen)) then
Break;
end;
end;
// Verify the next record is a Interchange Control Trailer
if (UNZSegmentId + FDelimiters.ED) =
Copy(FData, StartPos, Length(UNZSegmentId + 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
FUNZSegment.Data := Copy(FData, StartPos, (SearchResult + FDelimiters.SDLen));
FUNZSegment.Disassemble;
end
else
raise EJclEDIError.CreateRes(@RsEDIError016);
end
else
raise EJclEDIError.CreateRes(@RsEDIError017);
FData := '';
FState := ediDisassembled;
end;
function TEDIInterchangeControl.InsertFunctionalGroup(InsertIndex: Integer;
FunctionalGroup: TEDIFunctionalGroup): Integer;
begin
Result := InsertEDIDataObject(InsertIndex, FunctionalGroup);
end;
function TEDIInterchangeControl.InsertFunctionalGroup(InsertIndex: Integer): Integer;
begin
FCreateObjectType := ediFunctionalGroup;
Result := InsertEDIDataObject(InsertIndex);
end;
function TEDIInterchangeControl.InsertFunctionalGroups(InsertIndex, Count: Integer): Integer;
begin
FCreateObjectType := ediFunctionalGroup;
Result := InsertEDIDataObjects(InsertIndex, Count);
end;
function TEDIInterchangeControl.InsertFunctionalGroups(InsertIndex: Integer;
FunctionalGroupArray: TEDIFunctionalGroupArray): Integer;
begin
Result := InsertEDIDataObjects(InsertIndex, TEDIDataObjectArray(FunctionalGroupArray));
end;
function TEDIInterchangeControl.InternalCreateFunctionalGroup: TEDIFunctionalGroup;
begin
Result := TEDIFunctionalGroup.Create(Self);
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -