Sage 200 - 计数器表而不是Identity列 - 奇怪的行为

时间:2012-04-30 10:06:53

标签: sql database tsql database-design sage-erp

我最近的任务是编写一个导入数量价格折扣折扣的Sage导入工具。

有问题的Sage 200表格是:

  • StockItem - 主要产品表
  • StockItemDiscount - 主要折扣表
  • StockItemQtyDiscBreak - 折扣数量价格突破

我不会厌倦你的架构信息,因为它与我的问题无关,足以说 - 所有3个表中的主键是BigInt 没有标识集(叹气), 1 StockItem可以有很多折扣,1折可以有很多数量的折扣。

现在,为了创建一个导入例程,我首先必须分析Sage 200在SQL上如果你在sage中手动创建折扣和中断(使用SQL事件探查器)。正如我所说,Sage 200不使用Identity列,而是使用计数器表。

在StockItemDiscount中插入新行执行以下操作:

UPDATE [Counter] SET [NextValue] = [NextValue] + 10 WHERE [CounterID] = 1

然后选择新ID:

SELECT NextValue FROM Counter WHERE CounterID = 1

然后使用刚从计数器中选择的新值插入新行:

INSERT INTO StockItemDiscount (StockItemDiscountID, /.../) VALUES (@NewID, /.../) 

我的问题是:为什么Sage这样做呢?可能是它背后的原因是什么? (特别是+10那么读数值)

所有表格也共享同一个计数器,因此1个表格中的5行会导致另一个表格的ID间隔 - 我真的不知道为什么他们这样做了像这样?

我问的原因是:StockItemDiscount i中插入一行后,我需要删除StockItemQtyDiscBreak中的所有相关行。插入替换 - 但是,使用SQL分析器我看不到计数器表的递增,除非我插入5个或更多折扣(第6个使它再次点击计数器表,它几乎就像Sage UI保留那些10 ID会将它们用于各种插页,然后根据需要再保留10个 - 这对我来说似乎非常奇怪?

4 个答案:

答案 0 :(得分:2)

Sage没有将数据库设计为直接写入(并且在这种情况下它们不支持开发)。

Sage有一个SDK,可以让你通过对象写入数据库,这简化了编写例程以导入汇率或折扣等的过程。

要获得SDK需要成为经过认证的Sage开发人员,而后者又需要资金。

答案 1 :(得分:0)

理论#1:

他们正在N0上插入,并保留N1-N9以供将来编辑?

理论#2:

他们使用N0作为父记录,并使用N1-N9作为子记录ID?虽然你说所有5个表都使用相同的计数器和方法,但这似乎不太可能。

是否有使用N1-N9的行?

理论#1a& #2a:

他们打算实现其中之一,并改变主意,或者他们之前实现了这一点,并且离开了这个模型,但从未清理过他们的代码/方法。

答案 2 :(得分:0)

理论#4开发人员故意试图模糊插入记录的逻辑,以防止没有经验的“开发人员”将数据写入数据库,并使与数据库交互更难以保护他们的收入流..我认为他们完全知道自己在做什么

答案 3 :(得分:0)

Sage API通过以10为块从dbo.SYSCounter中提取增量值来管理ID。显然,他们认为拉入1的增量会太慢。任何未使用的计数器在退出时被转储。您可以安全地将SYSCounter向前推xx0000,然后将这些ID用于您的任务。

不支持直接SQL编辑。如果你操纵ID,对于任何查看审计线索的人来说都是显而易见的。建议使用SDK记录的API。与您的BP或第三方开发者联系以获取更多信息。