如何使用PowerBuilder读取和解析X12数据元素?

时间:2013-04-14 13:27:58

标签: powerbuilder edi x12 powerbuilder-pfc

平面文件内容:

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|

first lines of file

问题:

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

4 个答案:

答案 0 :(得分:1)

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

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

由于我不知道实际的文件格式,我无法更准确。

EDI的例子 - > XML转换器:

编辑:我刚刚登上PowerBuilder开发者期刊上一篇关于同一主题的古老帖子:“Converting X12 EDI to XML”,它提供了更多的想法。

答案 1 :(得分:0)

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

我会为每个细分和循环创建一个用户对象,一个用于表示采购订单本身。采购订单UO需要变量,这些变量是段和循环的数据类型。不要包含循环内部的段,将它们放在UO中以进行循环。段的UO将具有标准数据类型的变量,如字符串,整数,日期等,用于段中的数据元素。有关数据类型,请参阅数据字典。

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

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

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

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

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

这会将文档中的数据转换为表示文档各部分的对象,以便您可以处理数据。

答案 2 :(得分:0)

如果你使用的是普通的PowerBuilder,那么基础就是做一堆Pos()和Mid();没有任何自动化。但是,在你的标签中你提到了PFC;在你读完文件后,你总是可以引入String Service的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 :(得分:0)

以下是我推导出的方法。

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