- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于这个问题的长度,我们深表歉意。
我有一个数据库设计部分,我担心这可能会开始引起问题。现在还没有到那个阶段,但是显然不想等到解决问题。但是在开始测试各种场景之前,我将不胜感激任何有此问题经验的人的意见。
情况是库存控制并保持StockOnHand值。
可以维护一个保存库存控制数字的表格,只要手动或使用数据库触发器输入订单,就可以更新该表格。
或者,您可以通过读取和求和实际销售价值来使SQL来计算数量。
该程序安装在几个站点上,其中一些站点使用MS-SQL 2005,而某些站点使用2008。
我的问题很复杂,因为同一个设计需要处理几种情况,
如 :
1)现金/销售点销售环境。输入销售,一次交易减少库存。不能对此交易进行任何修改。
2)订单/路线/确认
在这种环境中,订单将被创建,并且可以被搁置,下达,发送,路由,修改,交付和开票。并且在开具发票之前的任何阶段都可以修改订单。 (我之所以这样说是因为任何数据库触发器都可能被调用很多时间,并且必须确定更改是否会影响现有库存数据)
3)不同的企业对于何时减少他们的StockOnHand有不同的想法。例如,有些人在批准订单后将其视为已售出(因为他们已 promise 出售商品,因此不应将其出售给其他人)。其他人只有在将其发送给客户之前才将其视为已售出,而另一些则只有在交货或收集时才视为已售出。
4)每个产品的交易数量可能会有很大的差异。例如,一个系统有四个或五个产品,每月售出数千次,因此,要求SQL对这些交易执行总和,即每年读取上万笔交易,而在同一系统上,有数千笔交易其他产品,每个产品每年的销售量少于1000笔交易。
5)历史信息很重要。因此,我们的系统不会删除或存档交易,并且具有数年的交易价值。
6)系统必须具有警告操作员的能力,如果他们在输入订单时没有足够的库存(通常是实时的,例如电话订单)。
请注意,这仅对于某些产品是必需的。 (但我认为实时汇总上万笔交易的数量并不可行)。
7)平均成本价格。可以根据库存商品的平均成本来定价某些产品。实现方法是重新计算交易中每种商品的平均成本价格,例如newAverageCostPrice =((((oldAverageCostPrice * oldStockOnHand)+ newCostValue)/ newStockOnHand)。这意味着,如果产品使用的是AverageCost,则必须知道每种商品的现有库存。
当前实施该系统的方式有两个方面。
我们有一个表格,其中包含每个产品和位置的StockOnHand。每当销售更新时,此表都会通过应用程序的业务层(C#)更新
这仅提供了现有库存数据。
如果需要在特定日期运行“库存评估”,则可以通过对相关行中的数量求和来计算该数字。由于数量和产品存储在行文件中,而日期和状态仅保存在表头中,因此这还需要在销售线表和销售表头之间建立联接。
但是,这种方法也有缺点。
运行股票估值报告的速度很慢(但并非慢得令人无法接受),但是我对此并不满意。 (它可以正常工作,并且监视服务器不会显示它超载,但是有可能引起问题,因此需要定期监视)
更新StockOnHand表的代码逻辑很复杂。
该表经常更新。在很多情况下,这是不必要的,因为不需要检查信息。例如,如果您90%的企业销售4或5种产品,则您实际上并不需要一台计算机来告诉您缺货。
数据库触发器。
我以前从未实现过复杂的触发器,因此请小心。
例如,如前所述,我们需要配置选项来确定何时更新库存量的条件。目前,该文件仅读取一次并缓存在我们的程序中。在触发器内执行此操作可能意味着要为每个触发器读取此信息。这对性能有很大影响吗?
另外,我们可能需要在销售标题和销售线上设置触发器。 (这可能意味着对销售 header 的修订将被迫读取行并更新相关产品的现货库存,然后稍后保存该行,另一个数据库触发器将再次修改stockonahand表,该表可能位于高效。
另一种选择是仅在交易开票时才更新StockOnHand表(这意味着无法进行进一步的修改),并提供基于此表与未开票交易的并集来计算库存数量的功能股票。
任何建议将不胜感激。
最佳答案
首先,我强烈建议您添加“StockOnHand”,“ReservedStock”和“SoldStock”
到你的桌子上。
现金销售将立即从“StockOnHand”中减去销售并将其添加到“SoldStock”,对于订单,您将不理会“StockOnHand”,仅将销售添加到ReservedStock,当最终开具发票时,您从StockOnHand中减去销售和预留库存并将其添加到“SoldStock”。
然后,业务用户可以选择StockOnHand还是StockOnHand-ReservedStock。
使用保持不变的StockOnHand图形将大大减少您的查询时间,而如果您弄乱了程序逻辑,则该图形可能会掉下去的风险很小。
如果您的客户足够幸运,可以在维护StockOnHand数据时遇到更新争用(即,他们可能在高峰时间每秒处理五笔以上的销售),则可以考虑以下方案:
隔夜通过计算交付量(销售额或其他)来计算StockOnHand值。
确认销售后,在“今天的销售”表中插入一行。
当您需要查询当前库存的总库存时,请从当天的开始数字中减去。
您还可以在每个产品上放置一个“库存检查阈值”,因此,如果您使用10,000个小部件开始新的一天,那么如果某人订购的数量少于100,那么您可以将CheckThreshold设置为100,而不必打扰检查库存。如果有人订购超过100件,则检查库存并重新计算新的下限阈值。
关于sql - 有关最佳SQL性能更新和/或计算现有库存总数的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3440632/
SQL、PL-SQL 和 T-SQL 之间有什么区别? 谁能解释一下这三者之间的区别,并提供每一个的相关使用场景? 最佳答案 SQL 是一种对集合进行操作的查询语言。 它或多或少是标准化的,几乎所有关
这个问题已经有答案了: What is the difference between SQL, PL-SQL and T-SQL? (6 个回答) 已关闭 9 年前。 我对 SQL 的了解足以完成我的
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列有一个默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任
我有一个可能属于以下类型的字符串 string expected result 15-th-rp 15 15/12-rp 12 15-12-th
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我有一个存储过程(称为 sprocGetArticles),它从文章表中返回文章列表。这个存储过程没有任何参数。 用户可以对每篇文章发表评论,我将这些评论存储在由文章 ID 链接的评论表中。 有什么方
我目前正在做一个 *cough*Oracle*cough* 数据库主题。讲师介绍embedded SQL作为让其他语言(例如 C、C++)与(Oracle)数据库交互的方式。 我自己做了一些数据库工作
SQL Server 中 SQL 语句的最大长度是多少?这个长度是否取决于 SQL Server 的版本? 例如,在 DECLARE @SQLStatement NVARCHAR(MAX) = N'S
这个问题已经有答案了: Simple way to transpose columns and rows in SQL? (9 个回答) 已关闭 8 年前。 CallType
预先感谢您对此提供的任何帮助。 假设我有一个查询,可以比较跨年的数据,从某个任意年份开始,永无止境(进入 future ),每年同一时期直到最后一个完整的月份(其特点是一月数据永远不会显示至 2 月
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列的默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任何数
下面是我试图用来检查存储过程是否不存在然后创建过程的 sql。它会抛出一个错误:Incorrect syntax near the keyword 'PROCEDURE' IF NOT EXISTS
我有一个同事声称动态 SQL 在许多情况下比静态 SQL 执行得更快,所以我经常看到 DSQL 到处都是。除了明显的缺点,比如在运行之前无法检测到错误并且更难阅读,这是否准确?当我问他为什么一直使用
来自 lobodava 的动态 SQL 查询是: declare @sql nvarchar(4000) = N';with cteColumnts (ORDINAL_POSITION, CO
使用 SQL Server 中的存储过程执行动态 SQL 命令的现实优点和缺点是什么 EXEC (@SQL) 对比 EXEC SP_EXECUTESQL @SQL ? 最佳答案 sp_executes
我有这个有效的 SQL 查询: select sum(dbos.Points) as Points, dboseasons.Year from dbo.StatLines dbos i
我正在调试一些构建成功运行的 SQL 命令的代码。 然而,在查询结束时,查询结果似乎被写入了一个文本文件。 完整的查询如下 echo SELECT DATE,DATETABLE,DATE,APPDAT
我有一些创建表的 .sql 文件(MS SQL 数据库): 表_1.sql: IF OBJECT_ID (N'my_schema.table1', N'U') IS NOT NULL DROP TAB
我写了下面的 SQL 存储过程,它一直给我错误@pid = SELECT MAX(... 整个过程是: Alter PROCEDURE insert_partyco @pname varchar(20
我在 SQL Server 2005 中有包含两列 Fruit 和 Color 的表,如下所示 Fruit Colour Apple Red Orange
我是一名优秀的程序员,十分优秀!