3

我最近的任务是编写一个导入 Quantity Price Break Discounts 的 Sage 导入工具。

有问题的 Sage 200 表是:

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

我不会用架构信息让你厌烦,因为它与我的问题无关,我只想说 - 所有 3 个表中的主键都是没有标识集的 BigInt(叹息),1 个 StockItem 可以有很多折扣,1 个折扣可以有很多 Qty Discount休息。

现在,要创建导入例程,我首先必须分析 Sage 200 在 SQL 上做了什么,如果您在 sage 中手动创建 Discount 和 Breaks(使用 SQL Profiler)。正如我所说,Sage 200 不使用标识列,而是使用计数器表。

将新行插入 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 THEN 读取值)

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

我问的原因:在插入一行后,StockItemDiscount我需要删除任何相关行StockItemQtyDiscBreak并插入替换 - 但是,使用 SQL 分析器我看不到计数器表的增量,除非我插入 5 个或更多折扣(第 6 个导致它命中再次查看计数器表,就好像 Sage UI 保留了这 10 个 ID,将它们用于各种插入,然后根据需要保留另外 10 个 - 这对我来说似乎很奇怪?

4

4 回答 4

2

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

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

要获得 SDK,需要成为经过认证的 Sage 开发人员,而这又涉及金钱。

于 2012-09-25T12:43:36.253 回答
0

理论#1:

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

理论#2:

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

是否有使用 N1-N9 的行?

理论#1a & #2a:

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

于 2012-05-07T21:05:55.983 回答
0

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

于 2014-02-11T14:51:50.227 回答
0

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

不支持直接 SQL 编辑。如果您操纵 ID,任何查看审计线索的人都可以清楚地看到。建议使用 SDK 记录的 API。与您的 BP 或第 3 方开发人员交谈以获取更多信息。

于 2016-08-03T14:29:47.547 回答