【发布时间】:2022-09-22 21:52:38
【问题描述】:
我写了一个映射来生成一个 HL7 消息头 (MSH)。 对于 MSH.10 段,根据定义应该是唯一的,所以我将以下内容放在我的地图中。
public string MessageControlId()
{
//return System.DateTime.Now.ToString(\"yyyyMMddHHmmssffff\");
string firstPart = System.DateTime.Now.ToString(\"yyyyMMdd\");
string middlePart = new Random().Next( 1000, 9999 ).ToString();
string lastPart = System.DateTime.Now.ToString(\"ffff\");
return firstPart + middlePart + lastPart;
}
然后在我的编排中,我在一个循环中多次调用标题映射。我的目标是生成多条 HL7 消息,每条消息都有自己的消息头和唯一的 MSH.10 值。
下面的代码基于Microsoft Biztalk XLANG 语法,它调用映射来转换并通过transform() 语句创建消息头。
tMapType = System.Type.GetType(msgBre.HeaderMapName);
transform (msgHeader) = tMapType(msgBilling);
但是,当我对此进行测试时,我看到生成了多个 HL7 消息,但其中许多消息的 MSH.10 段具有重复值。我在下面将它们分组为不同的颜色。
我希望每次都有单独的值,因为在我的代码中,我生成了一个介于 1000 和 9999 之间的随机数。另外,我还生成了千分之一秒的时间值。
你知道为什么会这样吗?我唯一的理论是,当我调用 transform() 函数时,它并没有真正调用地图来每次重新创建标题......这对我来说似乎是错误的。
更新:
感谢@hulihunskeli 的输入,我能够通过进入我在 Biztalk 中的编排来解决这个问题,就在循环重复之前,我添加了 200 毫秒的延迟,这似乎解决了这个问题。我想这是其中循环的处理时间太快以至于函数无法生成确保唯一编号的新对象的事情之一。
-
为什么你的 firstPart 不包括时间嗯嗯?
-
@sqlab 这只是我的一个测试,我最初有 yyyyMMddHHmmssffff 但它产生了同样的问题,所以我尝试通过引入随机 4 位数字作为中间部分来调试它,但我仍然有同样的问题。这向我证明,每次我调用 transform() 时都没有运行
-
为什么不只是有一个序列号而不是一个随机数?您可以在循环内增加该序列号。
-
@Dijkgraaf 我原来的 yyyyMMddHHmmssffff 是日期时间戳,精确到 4 位数字,我认为这足以捕获并生成唯一值。就您而言,循环处于我的编排级别,它调用要转换的标头映射,我不确定如何捕获编排计数器值并将其放置在映射中。
-
使用区分字段,确保将默认值映射到字段,并在构造 & 之后有一个表达式,将值分配给字段。