Axapta 通过服务插入与数据库访问

Axapta 通过服务插入与数据库访问,axapta,dynamics-ax-2012,aif,Axapta,Dynamics Ax 2012,Aif,我现在正在处理的代码需要插入一组相关记录来导入外部数据 有一段广泛的代码使用CustCustomerService插入数据,后面是一段较小的代码,使用表记录插入和更新其余的数据。我向我的同事询问了为什么这两种不同的方法,答案是,当他开始时,他听说通过服务更好,但服务不支持他需要的所有更改,因此进行了切换 我自己对此进行了研究,只看到了描述如何使用服务以及不同服务之间差异的信息。但没有任何信息将其与语言数据库访问进行比较 是这样。我为什么要使用服务而不是直接插入和更新记录? 编辑:我必须澄清。对于

我现在正在处理的代码需要插入一组相关记录来导入外部数据

有一段广泛的代码使用CustCustomerService插入数据,后面是一段较小的代码,使用表记录插入和更新其余的数据。我向我的同事询问了为什么这两种不同的方法,答案是,当他开始时,他听说通过服务更好,但服务不支持他需要的所有更改,因此进行了切换

我自己对此进行了研究,只看到了描述如何使用服务以及不同服务之间差异的信息。但没有任何信息将其与语言数据库访问进行比较

是这样。我为什么要使用服务而不是直接插入和更新记录?

编辑:我必须澄清。对于数据库访问,我的意思是:

smaServiceObjectTable sob;

sob.clear();
sob.Foo = Bar;
// ...
sob.insert();

因为服务允许您在开箱即用的情况下(至少在理论上)将AX与其他系统集成。如果您直接插入和更新记录,并且希望将其与另一个系统集成,则必须自己实现集成

是的,定制AX服务可能会很痛苦,但根据需求,它可能比完全从头开始编写集成要省力


当然,如果您只是进行导入,而没有集成到另一个系统,那么定制实现可能会更容易。但在这种情况下,我建议您看看数据导入/导出框架(DIXF)。

因为服务允许您将AX与其他系统进行开箱即用的集成(至少在理论上是如此)。如果您直接插入和更新记录,并且希望将其与另一个系统集成,则必须自己实现集成

是的,定制AX服务可能会很痛苦,但根据需求,它可能比完全从头开始编写集成要省力


当然,如果您只是进行导入,而没有集成到另一个系统,那么定制实现可能会更容易。但在这种情况下,我建议大家看看数据导入/导出框架(DIXF)。

两个主要的技术原因(我可以想到)是:

  • 业务逻辑
  • 雷西德
  • AX维护RecId编号序列,因此您永远不应该执行插入操作,更重要的是,使用插入/更新服务可以让您和其他人运行业务逻辑

    因此,假设用户决定购买第三方ISV,该ISV在更新/插入记录时与客户进行交互……使用direct SQL时会发生什么情况

    如果用户以后想要在客户发生任何更改时对客户帐户进行一些逻辑验证CreditLimits,该怎么办?他们如何可靠地知道使用direct SQL更改客户的方法

    RecId经常用作外键,并且还具有代理键的功能。Direct SQL不容易/可靠地维护这些规范化关系

    RecId序列存储在一个表中,但也被缓存,因此,除非您真的知道自己在做什么,否则很难直接提取下一个序列

    然后根据@FH Inway所说的,当一个新的开发人员出现时会发生什么。开发人员必须弄清楚以前编写的自定义SQL是什么。这些服务也具有更高的可重用性,并强制实施更好的实践

    编辑:为了响应您在文章中的编辑,您讨论的是通过X++与AX中的表交互,而不是与实体服务或类似的东西交互,而不是直接SQL

    我认为这是一个依赖于情景的问题,很难写出一个全面的答案。服务方法允许一个中央接口,当您有多个移动部件时,该接口可以提供一致性和附加验证。您可以将其想象为复制和粘贴相同的10行代码,或者将其封装在方法中以供重用。这样,当您想要更改这10行的工作方式时,您只需修改该方法

    因此,对于某些实体(客户/地址/供应商/等),如果可以确保其他业务逻辑的每一部分都受到影响,那么使用这些服务是有意义的

    在很多情况下,仅仅与表交互是非常有意义的

    我可以举一个很好的例子,如果你要创建一个新客户。如果您使用该服务,您只需提供名称、地址、信用额度等,它就会创建该服务并运行相关的业务逻辑。如果您试图将新记录插入到
    客户表中
    ,您可能不记得分配
    PartyId
    ,而使用该服务会自动完成此操作。还可能存在其他基础表,这些表在您创建新客户时自动填充数据,该客户将由服务负责


    另一个示例是在
    InventTable
    中创建新项。基础表
    InventItemInventSetup
    inventTempourchSetup
    InventItemSalesSetup
    可能需要在执行
    InventTable.insert()时忘记创建的记录。这就是为什么在内部使用该服务也更有意义。

    我能想到的两个主要技术原因是:

  • 业务逻辑
  • 雷西德
  • AX维护RecId编号序列,因此您永远不应该执行插入操作,更重要的是,使用插入/更新服务可以让您和其他人运行业务逻辑

    因此,假设用户决定购买第三方ISV,该ISV在更新/插入记录时与客户进行交互……使用direct SQL时会发生什么情况

    如果用户以后想要有一些逻辑呢