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

Inserting through service vs database access

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

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

我自己研究这个,我只看到描述如何使用服务以及不同服务有何不同的信息。但是没有信息将它们与语言数据库访问进行比较。

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

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

smaServiceObjectTable sob;

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

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

是的,自定义 AX 服务可能很痛苦,但根据要求,它仍然比完全从头开始编写集成更省力。

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

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

  1. 业务逻辑
  2. RecId

AX 维护 RecId 编号序列,因此您不应该执行插入,并且 更重要的是 使用 inserts/updates 的服务允许业务逻辑 运行 其他人

所以想象一下,用户决定购买第 3 方 ISV,只要记录是 updated/inserted 就可以与客户交互...直接 SQL 怎么会发生这种情况?

如果用户稍后希望在客户发生任何更改时让一些逻辑验证客户帐户的 CreditLimits 怎么办...他们如何可靠地知道哪些方法通过直接 SQL 更改了客户?

RecId经常被用作外键,也有代理键的特性。直接 SQL 不会 easily/reliably 维持那些正常化的关系。

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

然后根据@FH-Inway 所说的内容,当新开发人员出现时会发生什么。该开发人员必须弄清楚之前编写的任何自定义 SQL。这些服务的可重用性也更高,并强制实施更好的做法。

编辑: 为了响应您在 post 中的编辑,您说的是通过 X++ 与 AX 中的 table 交互与实体服务或类似的东西,而不是直接 SQL.

我认为这是一个场景相关的事情,很难写出一个全面的答案。服务方法允许一个中央接口,当您有多个移动部件时,它可以提供一致性和额外的验证。您可以将其视为复制并粘贴相同的 10 行代码或将其封装在一个方法中以供重用。这样,当您想要更改这 10 行函数的方式时,只需修改方法即可。

因此,对于某些实体 (Customer/Address/Vendor/etc),如果可以确保命中所有其他业务逻辑,使用这些服务是有意义的。

很多时候与 table 互动非常有意义。

我可以举一个很好的例子,如果你要创建一个新客户。如果您使用该服务,您只需提供姓名、地址、信用额度等,它就会创建它和 运行 相关的业务逻辑。如果您尝试将新记录插入 CustTable,您可能不记得分配 PartyId,而使用该服务会自动为您完成。当您创建将由该服务处理的新客户时,可能还有其他基础 table 会自动填充数据。

另一个例子是在 InventTable 中创建一个新项目。基础 tables InventItemInventSetupInventItemPurchSetupInventItemSalesSetup 可能需要您在执行 InventTable.insert() 时忘记创建的记录。所以这就是为什么在内部使用该服务也更有意义。