两个主要的技术原因(我能想到的)是:
- 商业逻辑
- 记录的
AX 维护 RecId 编号序列,因此您永远不应该执行插入,更重要的是使用插入/更新服务允许您和其他人运行业务逻辑。
因此,想象一下,用户决定购买一个在更新/插入记录时与客户进行交互的第 3 方 ISV……直接 SQL 会如何发生这种情况?
如果用户稍后想要在客户发生任何更改时对客户帐户的 CreditLimits 进行一些逻辑验证怎么办……他们如何可靠地知道哪些方法会通过直接 SQL 更改客户?
RecId 经常用作外键,也有代理键的特点。直接 SQL 不容易/可靠地让人们维护那些规范化的关系。
RecId 序列存储在一个表中,但也被缓存,因此除非您真的知道自己在做什么,否则仅拉下一个并不容易。
然后以@FH-Inway 所说的话为基础,当新开发人员出现时会发生什么。该开发人员必须弄清楚之前编写的任何自定义 SQL。这些服务也更具可重用性,并强制执行更好的实践。
编辑:为了回应您在帖子中的编辑,您谈论的是通过 X++ 与 AX 中的表交互与与实体服务或类似的东西交互,而不是直接 SQL。
我认为这是一个取决于场景的事情,很难写出一个全面的答案。服务方法允许一个中央接口,当您有多个移动部件时,它可以提供一致性和额外的验证。你可以把它想象成复制和粘贴相同的 10 行代码,或者将其封装在一个方法中以供重用。这样,当您想更改这 10 行的运行方式时,只需修改方法即可。
因此,对于某些实体(客户/地址/供应商/等)而言,如果可以确保命中其他所有业务逻辑,则使用这些服务是有意义的。
很多时候,与表格进行交互是非常有意义的。
我可以举一个很好的例子,如果你要创建一个新客户。如果您使用该服务,您只需提供姓名、地址、信用额度等,它就会创建并运行相关的业务逻辑。如果您尝试将新记录插入到CustTable
中,您可能不记得分配 a PartyId
,而使用该服务会自动为您完成。当您创建将由服务处理的新客户时,可能还会有其他基础表自动填充数据。
另一个例子是在InventTable
. 基础表InventItemInventSetup
,InventItemPurchSetup
和InventItemSalesSetup
可能需要您在创建时忘记创建的记录InventTable.insert()
。所以这就是为什么在内部使用该服务也更有意义。