是否有一种非常简单的方法来处理 EDIFACT,例如 D96A?

Posted

技术标签:

【中文标题】是否有一种非常简单的方法来处理 EDIFACT,例如 D96A?【英文标题】:Is there a really simple way to process EDIFACT for example D96A? 【发布时间】:2012-07-02 23:28:38 【问题描述】:

我们是一家使用现代技术(如 XML 接口)的现代公司,但我们的许多客户都希望我们的电子发票采用 EDIFACT 格式(如 D96A)。

不,我们不能使用现有的库,因为它们不是用我们的 Navision 软件使用的 C/AL 编程语言编写的。

所以为了在 C/AL 中解析它,我需要了解它的规范。但它看起来极其困难和复杂。

那么谁能给我一个概述如何解释说 D96A 以及如何解析它?

【问题讨论】:

不!没有简单的方法!大声笑... 【参考方案1】:

解析 EDIFACT 实际上并没有那么复杂。只需在语法字符处拆分:首先在' 获取段,然后在+ 获取该段的数据元素,然后在: 获取各个组件。当然,您需要处理转义的分隔符。这里使用的字符只是默认值,它们可以在消息的开头通过可选的 UNA 段进行更改。实际上,EDIFACT 上的wikipedia article 对此进行了很好的(但简短的)介绍。格式在UN's UNECE site 上有详细记录(是的,这很多而且难以阅读)。

棘手的部分是从中获取信息并进入您的应用程序(并验证它是否有效,更不用说创建好的错误消息了)。如果你真的打算用任何语言从无到有地编写一个完整的解析器,那么:不,没有简单的方法可以做到这一点。也没有任何其他灵活的数据表示。这一项艰巨的任务,而且永远都是。

但这里有一个想法:如果您对 XML 有这么多的兴趣(或者您喜欢称之为的任何其他“现代技术”......)。编写一些将 EDIFACT 消息转换为某种统一的 XML-EDIFACT-Format 的程序将是一项相对容易的任务(这是一件非常可怕的事情,很可能会吓到我)。您可以将每个 EDIFACT 段转换为一个 XML 标记,可能是这样的:

ERC+A7V:1:AMD'
IFT+3+NO MORE FLIGHTS'

在 XML 中:

<segment qualifier="ERC">
    <element>
        <component>A7V</component>
        <component>1</component>
        <component>AMD<component>
    </element>
</segment>
<segment qualifier="IFT">
   <element>
       <component>3</component>
   </element>
   <element>
       <component>NO MORE FLIGHTS</component>
   </element>
</segment>

然后您就可以释放您的 XML 工具和库的力量来验证/评估它。

你也可以做的更具体,像这样:

<segment_ERC>
    <element>
        <component>A7V</component>
        <component>1</component>
        <component>AMD<component>
    </element>
</segment_ERC>
<segment_IFT>
   <element>
       <component>3</component>
   </element>
   <element>
       <component>NO MORE FLIGHTS</component>
   </element>
</segment_IFT>

这可以使通过 XSD 的验证更容易。当然,您可以通过此对话获得尽可能具体的信息,但是您迟早会遇到一个问题,即您需要将有关当前解析的消息结构的信息放入转换器中(因为这并非易事知道哪些段嵌套在对它们进行分组的其他段中。不仅有UNGUNH 等,还有一些你不直接看到的段组。

不过,根据您应该作为文档获得的 EDIFACT 手册,您必须为收到的消息创建特定的评估程序/模式/任何内容。

【讨论】:

【参考方案2】:

我建议通过 GitHub 或 SourceForge 存储库进行搜索和阅读。快速搜索 带关键字:+EDIFACT +D96A 提供了几个库可供选择。 事实上,这看起来很有希望:

Bots 开源编辑器,http://sourceforge.net/projects/bots/。项目描述称它是 EDI(电子数据交换)的完整翻译器。

您可以随时评估和查看 Oracle B2B 11g,它是 Oracle SOA Suite 11gR1 的一部分: -http://www.oracle.com/technetwork/middleware/soasuite/downloads/downloads-085394.html#11g。 它有 UN/EDIFACT OTD 库,我猜您至少可以将其用于解析。

通常,您最好的选择是选择现有的库并将其移植到 NAV 或通过 数据流入您的 NAV 数据库的外部接口。如果您能够调用 .NET 代码,那么应该存在大量现有库,并且只需引用程序集即可。因为我不熟悉 NAV 开发,但无论您的数据传输对象调用机制是什么,都应该使用某种 REST/JSON - 您的组件 B 完成繁重的工作,而您的 NAV 组件通过您的XML 接口。

还有另一个类似的问题和几个答案也可能适合您: Is there any good open source EDIFACT parser in Java?.

edifactnavisionx12xmledid96a

干杯!

【讨论】:

我们深入研究了 BOTS EDI,它是一个 paaaaaaaaaaainnnnn。不是 BOTS 本身,而是您仍然必须手动破译 EDI 并创建一个映射文件供 BOTS 用作翻译器... ARrrggghhhh... 为什么世界仍在使用 EDI !!!??【参考方案3】:

我知道这个问题比较老,但我不得不为客户的项目做一些研究。 Dynamics NAV 有几个不错的附加组件。例如看看Anveo EDI Connect,他们直接在 NAV 中实现了 EDIFACT(以及更多格式)的导入和导出。 BMI、Yaveon、Lanham 和其他几家公司提供其他解决方案。还有几个服务提供商处理数据,您同意他们使用简单的 XML 或基于文件的结构。

【讨论】:

【参考方案4】:

我偶尔会使用 Talend Open Studio(TOS),它是一个功能丰富的 ETL 工具,可让您直观地构建数据转换作业。然后,当一切正常时,您可以将作业导出为 .bat 或 .sh 文件。很酷的是这个工具支持开箱即用的 EDIFACT。因此,您可以构建一个批处理文件,将 EDI 文件名作为参数并生成您定义的任何输出。

https://help.talend.com/reader/hCrOzogIwKfuR3mPf~LydA/1qBCcoArBu0cDLAgdrMyMA

【讨论】:

以上是关于是否有一种非常简单的方法来处理 EDIFACT,例如 D96A?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swiftui 中是不是有一种简单的方法可以通过捏合来放大图像?

是否有一种简单或正确的方法来删除spring安全插件?

是否有一种特定的方法来处理循环python中的错误

是否有一种简单的方法来检查 Ruby IO 实例是否会在 read() 上阻塞?

是否有一种优雅的 Pythonic 方式来计算已处理的数据? [复制]

是否有人在 X12 或 EDIFACT 中有包含二进制数据的示例文件?