具有仅具有一个标记的多个记录的事务的BizTalk模式生成

时间:2016-02-11 19:14:12

标签: biztalk biztalk-2013

我有一个包含以下交易记录的数据文件

1020915  
2Suppliers - Non Consumption  
2Offer sheet needed  
3CRIV SOL  
43005t5677 

1021015  
2Shippment to New York  
3Be required to provide receipts when turning in sheets   
(Invoice was not sent in time. Copy was requested)  
43005yg876

每行记录都以标签标识符1,2,3,4开头。我的问题是标记为3的第二个事务。请注意,行中没有标记(发票未及时发送。请求复制)。事实上,它是在前一行末尾带有'LF'的新行。如何制作模式以捕获此异常?

2 个答案:

答案 0 :(得分:1)

不幸的是,你不能,因为反汇编程序无法知道错误的CR / LF是记录分隔符还是实际内容。

您的问题是该文件无效,不是BizTalk或您的架构或您的任何内容。

因此,您需要做的第一件事就是让此文件的供应商知道他们发送的内容无效。

如果那时不能或不会纠正他们的问题,那么你做的第二件事就是通知你的管理层,因为他们正在产生无效数据,你必须花费额外的时间修复它。

最后,您必须为Decode状态编写一个Pipeline Component,它试图检测无效的CR / LF并替换它们。请注意,这可能会非常棘手,因为您仍然不知道[CR / LF] 3是分隔符还是内容。

祝你好运!

答案 1 :(得分:0)

我认为在这种情况下你想写一个自定义的反汇编程序。可能有一种方法可以欺骗FFDASM来处理这个问题,但这是一个非常简单的信息并且不会很难。在CodeProject上有关于该教程的教程。

您的反汇编方法可能类似于:

msgPart = pInMsg.BodyPart;
Stream originalStream = pInMsg.BodyPart.GetOriginalDataStream();
StreamReader reader = new StreamReader(originalStream);
XNamespace ns = "http://schema_name_space";
XDocument returnDoc = new XDocument(new XElement(ns + "SchemaRootNode"));

while (reader.Peek() > -1)
{
   // use reader.ReadLine() to consume your lines, use the first character to determine what kind of node to put them into
   xd.Root.Add( // new XElement with your string in it based on the "tag"
                // with logic to determine whether line has a tag or not.
}

VirtualStream vts = new VirtualStream();
xd.Save(vts);
vts.Position = 0;

IBaseMessage outMsg = pInMsg;
outMsg.BodyPart.Data = vts;

pContext.ResourceTracker.AddResource(vts);
pContext.ResourceTrakcer.AddResource(reader); // BizTalk will dispose of these later

outMsg.Context.Promote("MessageType", 
  "http://schemas.microsoft.com/BizTalk/2003/system-properties",
  "http://schema_name_space#SchemaRootNode");
outMsg.Context.Promote("SchemaStrongName", 
  "http://schemas.microsoft.com/BizTalk/2003/system-properties",
  "SchemaAssembly full name");

qOutputMsgs.Enqueue(outMsg);