📄 jcleditranslators.pas
字号:
S: Integer;
SegmentSpec: TEDISegmentSpec;
PrevSegmentSpec: TEDISegmentSpec;
SEFSegment: TEDISEFSegment;
SEFTable: TEDISEFTable;
SEFLoop: TEDISEFLoop;
LS: TEDILoopStack;
LSR: TEDILoopStackRecord;
begin
Result := TEDISEFSet.Create(Parent);
Result.Id := TransactionSetSpec.Id;
LS := TEDILoopStack.Create;
try
LS.OnAddLoop := TranslateLoopToSEFSet;
//
for S := 0 to TransactionSetSpec.SegmentCount - 1 do
begin
SegmentSpec := TEDISegmentSpec(TransactionSetSpec[S]);
if S = 0 then
begin
// Initialize the stack
SEFTable := TEDISEFTable.Create(Result);
Result.EDISEFDataObjects.Add(SEFTable);
LSR := LS.ValidateLoopStack(SegmentSpec.SegmentID, NA_LoopId, NA_LoopId, 0, SEFTable);
end
else
begin
// Check to see if the sections have changed
PrevSegmentSpec := TEDISegmentSpec(TransactionSetSpec[S-1]);
if SegmentSpec.Section <> PrevSegmentSpec.Section then
begin
// Create new table for new section
SEFTable := TEDISEFTable.Create(Result);
Result.EDISEFDataObjects.Add(SEFTable);
// Re-initialize the stack
LS.Pop(1);
LS.UpdateStackObject(SEFTable);
LSR := LS.ValidateLoopStack(SegmentSpec.SegmentID, SegmentSpec.OwnerLoopId,
SegmentSpec.ParentLoopId, 0, LSR.EDIObject);
end
else
begin
LSR := LS.ValidateLoopStack(SegmentSpec.SegmentID, SegmentSpec.OwnerLoopId,
SegmentSpec.ParentLoopId, 0, LSR.EDIObject);
end;
end;
// Debug - Keep the following line here in case someone wants to debug what happens to the stack.
// ShowMessage('Current Spec Segment: [' + IntToStr(S) + '] ' + SegmentSpec.SegmentID + #13#10 +
// LS.Debug);
// Add objects to proper owners
if LSR.EDIObject is TEDISEFTable then
begin
SEFTable := TEDISEFTable(LSR.EDIObject);
SEFSegment := TranslateToSEFSegment(SegmentSpec, SEFTable);
SEFTable.EDISEFDataObjects.Add(SEFSegment);
SEFSegment.ParentSet.AssignSegmentOrdinals;
TranslateToSEFSegmentTEXTSETS(SegmentSpec, SEFSegment);
end
else
if LSR.EDIObject is TEDISEFLoop then
begin
SEFLoop := TEDISEFLoop(LSR.EDIObject);
SEFSegment := TranslateToSEFSegment(SegmentSpec, SEFLoop);
SEFLoop.EDISEFDataObjects.Add(SEFSegment);
SEFSegment.ParentSet.AssignSegmentOrdinals;
TranslateToSEFSegmentTEXTSETS(SegmentSpec, SEFSegment);
end;
end;
finally
LS.Free;
end;
end;
function TEDISpecToSEFTranslator.TranslateToSEFFile(ICSpec: TEDIInterchangeControlSpec): TEDISEFFile;
var
F, T, S, E: Integer;
ElementList: TEDIObjectList;
SegmentSpec: TEDISegmentSpec;
ElementSpec: TEDIElementSpec;
TransactionSetSpec: TEDITransactionSetSpec;
begin
Result := TEDISEFFile.Create(nil);
ElementList := TEDIObjectList.Create(False);
try
//Fill Element Dictionary
for F := 0 to ICSpec.FunctionalGroupCount - 1 do
for T := 0 to ICSpec[F].TransactionSetCount - 1 do
for S := 0 to ICSpec[F][T].SegmentCount - 1 do
begin
SegmentSpec := TEDISegmentSpec(ICSpec[F][T][S]);
for E := 0 to SegmentSpec.ElementCount - 1 do
begin
ElementSpec := TEDIElementSpec(SegmentSpec[E]);
if Result.ELMS.FindItemByName(ElementSpec.Id) = nil then
Result.ELMS.Add(TranslateToSEFElement(ElementSpec, Result))
else
begin
//raise Exception.Create('Element Repeated - Incompatible File');
end;
end;
end;
//Fill Segment Dictionary
for F := 0 to ICSpec.FunctionalGroupCount - 1 do
for T := 0 to ICSpec[F].TransactionSetCount - 1 do
for S := 0 to ICSpec[F][T].SegmentCount - 1 do
begin
SegmentSpec := TEDISegmentSpec(ICSpec[F][T][S]);
if Result.SEGS.FindItemByName(SegmentSpec.Id) = nil then
Result.SEGS.Add(TranslateToSEFSegment(SegmentSpec, Result))
else
begin
//raise Exception.Create('Segment Repeated - Incompatible File');
end;
end;
//Fill Transaction Set Dictionary
for F := 0 to ICSpec.FunctionalGroupCount - 1 do
for T := 0 to ICSpec[F].TransactionSetCount - 1 do
for S := 0 to ICSpec[F][T].SegmentCount - 1 do
begin
TransactionSetSpec := TEDITransactionSetSpec(ICSpec[F][T]);
if Result.SETS.FindItemByName(TransactionSetSpec.Id) = nil then
Result.SETS.Add(TranslateToSEFSet(TransactionSetSpec, Result))
else
begin
//raise Exception.Create('Segment Repeated - Incompatible File');
end;
end;
finally
ElementList.Free;
end;
end;
procedure TEDISpecToSEFTranslator.TranslateToSEFElementTEXTSETS(ElementSpec: TEDIElementSpec;
SEFElement: TEDISEFElement);
var
Location: string;
Data: string;
begin
Location := SEFElement.GetTextSetsLocation;
Data := ElementSpec.Notes;
Data := JclEDI.StringReplace(Data, AnsiCrLf, SEFTextCRLF, [rfReplaceAll]);
Data := JclEDI.StringReplace(Data, AnsiCarriageReturn, SEFTextCR, [rfReplaceAll]);
Data := JclEDI.StringReplace(Data, AnsiLineFeed, SEFTextLF, [rfReplaceAll]);
SEFElement.TEXTSETS.SetText(SEFElement.SEFFile, Location, SEFTextSetsCode_Elm0, Data);
Data := ElementSpec.Description;
Data := JclEDI.StringReplace(Data, AnsiCrLf, SEFTextCRLF, [rfReplaceAll]);
Data := JclEDI.StringReplace(Data, AnsiCarriageReturn, SEFTextCR, [rfReplaceAll]);
Data := JclEDI.StringReplace(Data, AnsiLineFeed, SEFTextLF, [rfReplaceAll]);
SEFElement.TEXTSETS.SetText(SEFElement.SEFFile, Location, SEFTextSetsCode_Elm2, Data);
end;
procedure TEDISpecToSEFTranslator.TranslateToSEFSegmentTEXTSETS(SegmentSpec: TEDISegmentSpec;
SEFSegment: TEDISEFSegment);
var
Location: string;
E: Integer;
ElementSpec: TEDIElementSpec;
SEFElement: TEDISEFElement;
Data: string;
begin
Location := SEFSegment.GetTextSetsLocation;
Data := SegmentSpec.Description;
Data := JclEDI.StringReplace(Data, AnsiCrLf, SEFTextCRLF, [rfReplaceAll]);
Data := JclEDI.StringReplace(Data, AnsiCarriageReturn, SEFTextCR, [rfReplaceAll]);
Data := JclEDI.StringReplace(Data, AnsiLineFeed, SEFTextLF, [rfReplaceAll]);
SEFSegment.TEXTSETS.SetText(SEFSegment.SEFFile, Location, SEFTextSetsCode_Seg3, Data);
Data := SegmentSpec.Notes;
Data := JclEDI.StringReplace(Data, AnsiCrLf, SEFTextCRLF, [rfReplaceAll]);
Data := JclEDI.StringReplace(Data, AnsiCarriageReturn, SEFTextCR, [rfReplaceAll]);
Data := JclEDI.StringReplace(Data, AnsiLineFeed, SEFTextLF, [rfReplaceAll]);
SEFSegment.TEXTSETS.SetText(SEFSegment.SEFFile, Location, SEFTextSetsCode_Seg4, Data);
SEFSegment.AssignElementOrdinals;
for E := 0 to SegmentSpec.ElementCount - 1 do
begin
ElementSpec := TEDIElementSpec(SegmentSpec[E]);
SEFElement := TEDISEFElement(SEFSegment[E]);
TranslateToSEFElementTEXTSETS(ElementSpec, SEFElement);
end;
end;
//=== { TEDISEFToSpecTranslator } ============================================
constructor TEDISEFToSpecTranslator.Create;
begin
inherited Create;
end;
destructor TEDISEFToSpecTranslator.Destroy;
begin
inherited Destroy;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -