65.9K
CodeProject 正在变化。 阅读更多。
Home

TRADACOMS 订单 9 阅读器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.40/5 (2投票s)

2010年5月24日

CPOL

3分钟阅读

viewsIcon

27234

downloadIcon

321

一个用于读取 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

image04.png

解析器

在开始解释我用于解析 TRADACOMS 消息的方法之前,我想说有许多解析分隔文本文件的方法,我只是演示了一种对我有用的方法。图 3 总结了用于解析消息的流程

image02.png

为了管理从消息中提取的信息,我使用图 4 中的类

image03.png

用于读取消息的方法基于 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 消息的方法的人有所帮助。希望您觉得它有用。

© . All rights reserved.