📄 jcledi_unedifact.pas
字号:
procedure TEDIInterchangeControl.InternalCreateHeaderTrailerSegments;
begin
FUNASegment := TEDIInterchangeControlSegment.Create(Self);
FUNBSegment := TEDIInterchangeControlSegment.Create(Self);
FUNZSegment := TEDIInterchangeControlSegment.Create(Self);
end;
procedure TEDIInterchangeControl.SetUNZSegment(const UNZSegment: TEDIInterchangeControlSegment);
begin
FreeAndNil(FUNZSegment);
FUNZSegment := UNZSegment;
if Assigned(FUNZSegment) then
FUNZSegment.Parent := Self;
end;
procedure TEDIInterchangeControl.SetUNBSegment(const UNBSegment: TEDIInterchangeControlSegment);
begin
FreeAndNil(FUNBSegment);
FUNBSegment := UNBSegment;
if Assigned(FUNBSegment) then
FUNBSegment.Parent := Self;
end;
function TEDIInterchangeControl.InternalCreateEDIDataObject: TEDIDataObject;
begin
case FCreateObjectType of
ediFunctionalGroup:
Result := InternalCreateFunctionalGroup;
ediMessage:
Result := InternalCreateMessage;
else
Result := nil;
end;
end;
function TEDIInterchangeControl.InternalAssignDelimiters: TEDIDelimiters;
begin
Result := nil;
end;
function TEDIInterchangeControl.InternalCreateMessage: TEDIMessage;
begin
Result := TEDIMessage.Create(Self);
end;
function TEDIInterchangeControl.AddMessage: Integer;
begin
FCreateObjectType := ediMessage;
Result := AddEDIDataObject;
end;
function TEDIInterchangeControl.AddMessages(Count: Integer): Integer;
begin
FCreateObjectType := ediMessage;
Result := AddEDIDataObjects(Count);
end;
function TEDIInterchangeControl.AppendMessage(Message: TEDIMessage): Integer;
begin
FCreateObjectType := ediMessage;
Result := AppendEDIDataObject(Message);
end;
function TEDIInterchangeControl.AppendMessages(MessageArray: TEDIMessageArray): Integer;
begin
Result := AppendEDIDataObjects(TEDIDataObjectArray(MessageArray));
end;
function TEDIInterchangeControl.InsertMessage(InsertIndex: Integer; Message: TEDIMessage): Integer;
begin
Result := InsertEDIDataObject(InsertIndex, Message);
end;
function TEDIInterchangeControl.InsertMessage(InsertIndex: Integer): Integer;
begin
FCreateObjectType := ediMessage;
Result := InsertEDIDataObject(InsertIndex);
end;
function TEDIInterchangeControl.InsertMessages(InsertIndex, Count: Integer): Integer;
begin
FCreateObjectType := ediMessage;
Result := InsertEDIDataObjects(InsertIndex, Count);
end;
function TEDIInterchangeControl.InsertMessages(InsertIndex: Integer;
MessageArray: TEDIMessageArray): Integer;
begin
Result := InsertEDIDataObjects(InsertIndex, TEDIDataObjectArray(MessageArray));
end;
//=== { TEDIFile } ===========================================================
constructor TEDIFile.Create(Parent: TEDIDataObject; InterchangeCount: Integer);
begin
if Assigned(Parent) then
inherited Create(Parent, InterchangeCount)
else
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;
EDIInterchangeControl: TEDIInterchangeControl;
begin
FData := '';
FLength := 0;
Result := '';
if GetCount > 0 then
for I := 0 to GetCount - 1 do
begin
if Assigned(FEDIDataObjects[I]) then
begin
EDIInterchangeControl := TEDIInterchangeControl(FEDIDataObjects[I]);
if EDIInterchangeControl.SegmentUNA.EDIDataObjectCount > 0 then
begin
FData := FData + EDIInterchangeControl.SegmentUNA.Assemble;
EDIInterchangeControl.SegmentUNA.Data := '';
end;
FData := FData + FEDIDataObjects[I].Assemble;
end;
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;
UNASegmentData: string;
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_INTERNAL_STRUCTURE}
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;
if UNASegmentId = Copy(FData, StartPos, Length(UNASegmentId)) then
begin
if foVariableDelimiterDetection in FEDIFileOptions then
InternalDelimitersDetection(StartPos);
SearchResult := StrSearch(FDelimiters.SD + UNBSegmentId + FDelimiters.ED, FData, StartPos);
UNASegmentData := Copy(FData, StartPos, (SearchResult - StartPos) + FDelimiters.SDLen);
StartPos := SearchResult + FDelimiters.SDLen;
end
else
if UNBSegmentId = Copy(FData, StartPos, Length(UNBSegmentId)) then
begin
if foVariableDelimiterDetection in FEDIFileOptions then
InternalAlternateDelimitersDetection(StartPos);
end
else
raise EJclEDIError.CreateRes(@RsEDIError015);
// Continue
while (StartPos + Length(UNBSegmentId)) < Length(FData) do
begin
// Search for Interchange Control Trailer
SearchResult := StrSearch(FDelimiters.SD + UNZSegmentId + FDelimiters.ED, FData, StartPos);
if SearchResult > 0 then
begin
SearchResult := SearchResult + FDelimiters.SDLen; // Move past the delimiter
// Search for the end of Interchange Control Trailer
SearchResult := StrSearch(FDelimiters.SD, FData, SearchResult);
if SearchResult > 0 then
begin
I := AddInterchange;
FEDIDataObjects[I].Delimiters :=
TEDIDelimiters.Create(FDelimiters.SD, FDelimiters.ED, FDelimiters.SS);
TEDIInterchangeControl(FEDIDataObjects[I]).SegmentUNA.Data := UNASegmentData;
TEDIInterchangeControl(FEDIDataObjects[I]).SegmentUNA.Disassemble;
FEDIDataObjects[I].Data :=
Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.SDLen));
FEDIDataObjects[I].Disassemble;
end
else
raise EJclEDIError.CreateRes(@RsEDIError016);
end
else
raise EJclEDIError.CreateRes(@RsEDIError017);
// Set next start position, Move past the delimiter
StartPos := SearchResult + FDelimiters.SDLen;
//
if UNASegmentId = Copy(FData, StartPos, Length(UNASegmentId)) then
begin
if foVariableDelimiterDetection in FEDIFileOptions then
InternalDelimitersDetection(StartPos);
SearchResult := StrSearch(FDelimiters.SD + UNBSegmentId + FDelimiters.ED, FData, StartPos);
UNASegmentData := Copy(FData, StartPos, (SearchResult - StartPos) + FDelimiters.SDLen);
StartPos := SearchResult + FDelimiters.SDLen;
end
else
if UNBSegmentId = Copy(FData, StartPos, Length(UNBSegmentId)) then
begin
if foVariableDelimiterDetection in FEDIFileOptions then
InternalAlternateDelimitersDetection(StartPos);
end
else
if (StartPos + Length(UNBSegmentId)) < Length(FData) then
begin
if foIgnoreGarbageAtEndOfFile in FEDIFileOptions then
Break
else
raise EJclEDIError.CreateRes(@RsEDIError018);
end;
end;
FData := '';
FState := ediDisassembled;
end;
function TEDIFile.GetInterchangeControl(Index: Integer): TEDIInterchangeControl;
begin
Result := TEDIInterchangeControl(GetEDIDataObject(Index));
end;
function TEDIFile.InsertInterchange(InsertIndex: Integer;
Interchange: TEDIInterchangeControl): Integer;
begin
Result := InsertEDIDataObject(InsertIndex, Interchange);
end;
function TEDIFile.InsertInterchange(InsertIndex: Integer): Integer;
begin
Result := InsertEDIDataObject(InsertIndex);
end;
function TEDIFile.InsertInterchanges(InsertIndex, Count: Integer): Integer;
begin
Result := InsertEDIDataObjects(InsertIndex, Count);
end;
function TEDIFile.InsertInterchanges(InsertIndex: Integer;
InterchangeControlArray: TEDIInterchangeControlArray): Integer;
begin
Result := InsertEDIDataObjects(InsertIndex, TEDIDataObjectArray(InterchangeControlArray));
end;
procedure TEDIFile.InternalLoadFromFile;
var
EDIFileStream: TFileStream;
begin
FData := '';
if FFileName <> '' then
begin
EDIFileStream := TFileStream.Create(FFileName, fmOpenRead or fmShareDenyNone);
try
SetLength(FData, EDIFileStream.Size);
EDIFileStream.Read(Pointer(FData)^, EDIFileStream.Size);
finally
EDIFileStream.Free;
end;
end
else
raise EJclEDIError.CreateRes(@RsEDIError001);
end;
procedure TEDIFile.LoadFromFile(const FileName: string);
begin
FFileName := FileName;
InternalLoadFromFile;
end;
procedure TEDIFile.ReLoadFromFile;
begin
InternalLoadFromFile;
end;
procedure TEDIFile.SaveAsToFile(const FileName: string);
var
EDIFileStream: TFileStream;
begin
FFileName := FileName;
if FFileName <> '' then
begin
EDIFileStream := TFileStream.Create(FFileName, fmCreate or fmShareDenyNone);
try
EDIFileStream.Write(Pointer(FData)^, Length(FData));
finally
EDIFileStream.Free;
end;
end
else
raise EJclEDIError.CreateRes(@RsEDIError002);
end;
procedure TEDIFile.SaveToFile;
var
EDIFileStream: TFileStream;
begin
if FFileName <> '' then
begin
EDIFileStream := TFileStream.Create(FFileName, fmCreate or fmShareDenyNone);
try
EDIFileStream.Write(Pointer(FData)^, Length(FData));
finally
EDIFileStream.Free;
end;
end
else
raise EJclEDIError.CreateRes(@RsEDIError002);
end;
procedure TEDIFile.SetInterchangeControl(Index: Integer; Interchange: TEDIInterchangeControl);
begin
SetEDIDataObject(Index, Interchange);
end;
procedure TEDIFile.InternalDelimitersDetection(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -