TRADACOMS 订单 9 阅读器






3.40/5 (2投票s)
一个用于读取 EDI TRADACOMS Order 9 的简单类。
引言
在本文中,我将展示一种读取 EDI TRADACOMS Order 9 消息并将内容填充到业务对象中的方法。最终,目标不是读取整个消息,而是演示如何读取消息段、数据元素和数据子元素。
背景
TRADACOMS 标准专为英国设计,是英国 EDI 最常用的消息格式。尽管它涵盖的范围与联合国发布的 UN/EDIFACT 标准数据相似,但 TRADACOMS 在消息中使用不同的结构。 TRADACOMS 标准包含 30 多种消息类型,涵盖了所有最常见的商业交易。本文将重点介绍 Order 9 标准。更多信息可以在 这里 找到。
当您第一次查看消息时,内容很难理解;但是,我将尝试演示一种简单的方法来理解它。您可以在图 1 中看到一个示例。
STX=ANA:1+5000000000000:SOME STORES
LTD+5010000000000:SUPPLIER UK LTD+070315:130233+000007+PASSW+ORDHDR+B'
MHD=1+ORDHDR:9'
TYP=0430+NEW-ORDERS'
SDT=5010000000000:000030034'
CDT=5000000000000'
FIL=1630+1+070315'
MTR=6'
MHD=2+ORDERS:9'
CLO=5000000000283:89828+EAST SOMEWHERE DEPOT'
ORD=70970::070315'
DIN=070321++0000'
OLD=1+5010210000000+114455441444:00893592:035921+12+60++++CRUSTY ROLLS:4 PACK'
OTR=1'
MTR=7'
MHD=3+ORDTLR:9'
OFT=1'
MTR=3'
END=3'
TRADACOMS 消息包含以段代码(例如,OLD=)开头的段;每个段代表订单头、详细信息或尾部等部分,并以段终止符 (') 结束。每个段包含许多由 (+) 分隔的数据元素,每个数据元素包含由 (:) 分隔的零个或多个数据子元素。在这些元素上,您可以找到订单日期、客户、供应商、产品、订单数量等信息。参见图 2
解析器
在开始解释我用于解析 TRADACOMS 消息的方法之前,我想说有许多解析分隔文本文件的方法,我只是演示了一种对我有用的方法。图 3 总结了用于解析消息的流程
为了管理从消息中提取的信息,我使用图 4 中的类
用于读取消息的方法基于 Split
函数。Tradacoms
类的 ParseMessage()
方法通过分隔符 (') 分割消息,从而获取所有段。
public SegmentList ParseMessage()
{
SegmentList segList = new SegmentList();
string[] fileSegments = _fileContent.Split(delimiterSeg);
foreach (string str in fileSegments)
{
Segment seg = ParseSegment(str);
segList.Add(seg);
}
return segList;
}
在每个段使用 ParseSegment()
方法解析后,通过 (+) 分割以获取所有数据元素,然后通过 (:) 分割每个数据元素以获取数据子元素,如清单 1 所示。
private Segment ParseSegment(string _segment)
{
string[] strSeg = _segment.Split(delimiterDataElem);
Segment seg = new Segment();
for (Int32 i = 0; i < strSeg.Length; i++)
{
if (i == 0)
{
// get segmentName
seg.SegmentName = strSeg[i];
continue;
}
string[] strDataElem = strSeg[i].Split(delimiterDataSubElem);
DataElement dataElem = new DataElement();
for (Int32 j = 0; j < strDataElem.Length; j++)
{
DataSubElement dataSubElem = new DataSubElement();
dataSubElem.Value = strDataElem[j];
dataElem.DataSubElement.Add(dataSubElem);
}
seg.DataElement.Add(dataElem);
}
return seg;
}
最后,一旦所有消息被解析,ParseMessage()
方法将返回一个 SegmentList
类,其中包含提取的所有信息。有了包含所有段的列表,下一步是迭代每个段并在业务对象 Order9
上填充一个相应的属性。信息从段对象中通过方法 GetDataElement(int dataElementPosition)
和重载 GetDataElement(int dataElementPosition, int dataSubElementposition)
指示位置,如清单 2 所示。
foreach (Segment seg in segList)
{
switch (seg.SegmentName)
{
case "TYP":
{
orderType = new Order9Type();
orderType.OrderTypeCode = seg.GetDataElement(0);
orderType.OrderType = seg.GetDataElement(1);
break;
}
case "SDT":
{
supplier = new Order9Supplier();
supplier.SupplierGLN = seg.GetDataElement(0);
supplier.SupplierName = seg.GetDataElement(1);
break;
}
case "CDT":
{
customer = new Order9Customer();
customer.CustomerGLN = seg.GetDataElement(0);
customer.CustomerName = seg.GetDataElement(1);
break;
}
case "MHD":
{
if (seg.GetDataElement(1).Equals("ORDERS"))
{
order = new Order9(orderType, supplier, customer);
}
break;
}
case "CLO":
{
order.CustomerDepotGLN = seg.GetDataElement(0);
order.CustomerDepotCode = seg.GetDataElement(0, 1);
order.CustomerDepotAddress = seg.GetDataElement(2);
break;
}
case "ORD":
{
order.CustomerOrderNo = seg.GetDataElement(0);
order.OrderDate = ParseDate(seg.GetDataElement(0, 2));
break;
}
case "DIN":
{
order.DepotDate = ParseDate(seg.GetDataElement(0));
order.DepotTime = ParseTime(seg.GetDataElement(2));
break;
}
case "OLD":
{
Order9Line details = new Order9Line(order.Id);
details.LineNo = seg.GetDataElement(0);
details.ProductSupplierGTIN = seg.GetDataElement(1);
details.ProductSupplierCode = seg.GetDataElement(1, 1);
details.ProductGTIN = seg.GetDataElement(2);
details.ProductCustomerGTIN = seg.GetDataElement(3);
details.ProductCustomerCode = seg.GetDataElement(3, 1);
details.OrderUnit = Convert.ToInt32(seg.GetDataElement(4));
details.OrderQty = Convert.ToInt32(seg.GetDataElement(5));
details.ProductDescription = seg.GetDataElement(9);
order.Order9Lines.Add(details);
break;
}
case "OTR":
{
orderLst.Add(order);
break;
}
default:
break;
}
}
在本示例中,我没有将 Order 9 消息中的所有信息映射到业务对象。
结论
本文中提出的想法演示了一种从 TRADACOMS 消息中检索信息的方法。本文介绍了 TRADACOMS 消息的基础知识。远非一个完整的解决方案,此处介绍的概念可能对那些正在寻找读取 EDI 消息的方法的人有所帮助。希望您觉得它有用。