【问题标题】:How are unique IDs / sequence numbers generated in SAP B1?SAP B1 中如何生成唯一 ID/序列号?
【发布时间】:2021-02-04 18:54:56
【问题描述】:

我想知道是否有人知道 SAP B1 (SAP Business One) 如何生成它在各种表中使用的唯一主键。我所说的例子包括 OCRD.DocEntryOCPR.CntctCode。这些“自动”递增的整数列。

执行此操作的典型方法包括标识列(例如 SQL Server)、序列(例如 Oracle)或保存以编程方式递增的 Nextval 的手动序列表。据我所知,B1 没有对这些列使用任何这些技术。那么它是如何处理它们的呢?

我正在查看的特定实例正在使用 SQL Server 数据库。

是的,我很清楚这样一个事实,即我没有“需要”了解内部工作原理,不应该在数据库中乱七八糟,等等。我不知道这让我很困扰不知道他们是怎么做到的!如果有人能解释一下,我将不胜感激。

【问题讨论】:

    标签: sql sapb1


    【解决方案1】:

    SAPB1 使用 ONNM 表生成新的唯一编号。添加文档时会发生以下情况。

    • SQL 事务开始
    • 下一个数字是从带有更新锁的 ONNM 表中查询的
    • ONNM 表已更新为新编号 (+1)。
    • 文档已添加
    • SQL 事务已提交。

    使用更新锁运行 SQL SELECT 语句会返回当前行,同时锁定该行直到事务结束。您可以保证在您选择该行和事务结束之间没有其他用户可以更改该行。

    当您在 SAP B1 中执行操作时,您可以使用 SQL Profiler 来观察执行的语句。这是获取下一个要在报价中使用的数字的行。引用是 ObjectType 23。

    SELECT T0.* FROM [dbo].[ONNM] T0 WITH (UPDLOCK) WHERE T0.[ObjectCode] = '23'

    【讨论】:

      【解决方案2】:

      SAP B1 使用 ONNM 生成序列号。

      它为在其中注册的每个对象维护一个自动密钥。并根据自动键序列号生成。 对于每个添加事件,此自动键将增加 +1

      【讨论】: