【问题标题】:How to Read and Parse X12 Data Elements Using PowerBuilder?如何使用 PowerBuilder 读取和解析 X12 数据元素?
【发布时间】:2013-04-14 13:27:58
【问题描述】:

平面文件内容:

ST*850*12500001|
BEG*00*NE*71249364**20130103|
CUR*SE*SGD|
REF*BT*SGL169816-7191416|
P01*0000000001*4*EA*0*CP*UP*731304265511*VP*SURT1000XLIQ|
P01*0000000002*10*EA*0*CP*UP*731304265511*VP*SURT1000XLIQ|
P01*0000000003*100*EA*0*CP*UP*731304265511*VP*SURT1000XLIQ|

问题:

任何可以分享如何动态解析每个元素的想法的人。每个数据的长度有时会有所不同,例如:12500001、731304265511 和 SURT1000XLIQ。问题是如何获取星号 (*) 和管道 (|) 之间的数据。感谢帮助....

【问题讨论】:

  • 只是为了通知您:x12 文件大多/总是用 ISA 标头和尾标“封装”。我不认为您在此处展示的内容就是您实际收到的内容。
  • 不仅如此,ISA 段还可以帮助您识别段终止符、子元素分隔符和元素分隔符。您可以从您的样本中找出答案,但您也缺少发送者/接收者信息。
  • 您好,在发布之前我已经拥有完整的 850 文档和示例文件。我刚刚发布了解析应该从哪里开始。

标签: powerbuilder edi x12 powerbuilder-pfc


【解决方案1】:

您的平面文件看起来像 EDI 文件,但不是 EDIFACT。

有一些从 EDI 到 XML 的转换器(开源或商业),也许您可​​以尝试使用这样的工具来将生成的 xml 文件读入 DataWindow 或数据存储区?

由于我不知道实际的文件格式,我不能更精确。

EDI 示例 -> XML 转换器:

编辑:我刚刚在 PowerBuilder 开发人员日志上看到了一篇关于同一主题的古老帖子:“Converting X12 EDI to XML”,它提供了更多想法。

【讨论】:

  • 为什么要转换成XML?为什么不直接将其转储到数据库中?还是 CSV?还是平面文件?每个人似乎都想翻译成 XML,但我不明白。很多时候,这只是一个额外的步骤,除非您的 ERP 或中间件系统需要它(例如将 EDI 转换为 SAP 的 IDOC)。
  • @Andrew:我建议转换它,因为 OP 只是谈论一个文件,而没有告诉他是否生成它或者它是否按原样给出。此外,虽然 xml 不能成为金锤,但将其用作枢轴格式可以增加在 PB(datawindow、datastore、pbdom)中处理它的方式。我怀疑 Powerbuilder 是否已经存在处理 EDI 文件的东西。当然,另一种选择是根据规范制作自己的解析器。
  • 伙计们,我只想分享我所做的。我开发了一个 PB 函数,它将根据技术设计解析数据,然后在解析过程后将其转储到表中,这非常困难,因为要解析的许多元素和解析应该动态运行,因为字符长度每个元素都不是恒定的。感谢您的想法和想法。
【解决方案2】:

如果您使用的是普通的旧版 PowerBuilder,那么基本就是做一堆 Pos() 和 Mid();没有什么自动的。但是,在您的标签中,您提到了 PFC;读入文件后,您始终可以引入字符串服务的 of_ParseToArray() 函数,例如(以下内容未经测试,由读者自行查找错误):

long ll_Line, ll_LineCount, ll_Element, ll_ElementCount
string ls_Lines[], ls_Elements[]
n_cst_String lnv_String  

ll_LineCount = lnv_String.of_ParseToArray (ls_FileContents, "|", ls_Lines)
FOR ll_Line = 1 TO ll_LineCount
   ll_ElementCount = lnv_String.of_ParseToArray (ls_Lines[ll_Line], "*", ls_Elements)
   // process the line with the elements separated out...
NEXT

祝你好运,

特里

【讨论】:

  • 嗨特里,我认为我们有相同的方法。谢谢。
【解决方案3】:

这是一个 X12 文件,一个 850 采购订单。正如eppye 在 cmets 中所建议的那样,您需要确切了解您所获得的文件遵循什么标准。为了帮助您入门,有一个 850 here 版本。 “Draft MEMA 4010 850”将帮助您了解格式。 “GCommerce 4010 850V1.4.doc”是告诉您每个元素中的内容的数据字典。但请理解,除非您销售汽车零部件,否则这可能不是您正在使用的文件的确切规格。向您发送文件的人应将其提供给您。

我将为每个段和循环创建一个用户对象,一个代表采购订单本身。采购订单 UO 需要作为段和循环数据类型的变量。不要包括循环内的段,将它们放在循环的 UO 中。段的 UO 将具有段中数据元素的标准数据类型变量,如字符串、整数、日期等。有关数据类型,请参阅数据字典。

请注意,如果一个段重复,则保存该段的变量是一个数组。循环的变量将是数组。

您处理段的对象将有一个方法,例如of_importLine 在星号处拆分行并存储值。

处理循环的对象将有一个方法,例如of_readLoop 读取行(段),直到它读取循环的最后一段。对于每个段,它将为该类型的段创建 UO,将其分配给实例变量,或者如果段可以重复,则分配给下一个数组槽,并调用新对象的 of_importLine

处理采购订单的对象类似于循环的对象,除了当它看到循环的第一段时,它会为这种循环创建 UO,并将其分配给循环的下一个数组槽,并调用新对象的of_readLoop。请注意,当您的采购订单对象在循环内读取时,它将创建一个新对象来读取和存储循环的每个重复。

如果缺少所需的段或找到不属于循环的段,则读取循环的对象应记录错误并停止。错误应包括行号和内容。我无法详细说明如何验证采购订单本身,因为许多部分在规范中是可选的,但它们在您的应用程序中可能不是可选的。对于每个段和循环,对象都有一个变量,它需要项目出现的顺序以及最小和最大出现次数。然后 PO 对象可以检查分段和循环。

这会将文档中的数据转换为代表文档各部分的对象,以便您可以使用这些数据。

【讨论】:

  • 对我来说看起来像一个普通的 x12 850 订单。您能否详细说明为什么这是 MEMA 850 采购订单?
  • 谢谢。但是像等仍然存在。遵循另一个准则(来自另一个买家)的 850 很有可能;会不会引起误会?
  • 当然。向他发送文件的人需要告诉他他们正在发送什么。我编辑了我的答案以包含这一点,并明确指出我提供的链接不一定是他文件的确切规范。
【解决方案4】:

下面是我推导出来的方法。

ls_tranidcode = of_trimdata(is_Message, 4, '*')
ids_edihdr.SetItem(ll_hdrins,'TRANSETIDCODE',ls_tranidcode)

Function:
of_trimdata()

Return Type : String 
Argument Type : 
String arg_msg
Integer pos1
String  s_dlm

Long ll_pos2
String ls_ret

arg_msg = mid(arg_msg, pos1)            
ll_pos2 = POS(arg_msg,s_dlm) 
ls_ret = Mid(arg_msg, 1, ll_pos2 - 1)
arg_msg = Mid(arg_msg, ll_pos2 + 1) 

RETURN ls_ret

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2012-02-10
    • 2021-07-27
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多