我会尝试尽可能清楚地说明这一点。我的结构是这样的:
表:
Fish
Pond
Plant
order_details
order_item
etc...
现在我要做的就是这个。如果订单在半小时内开始但未完成,则该订单中的项目将返回到相关表格。我已经设置了订购流程(我没有使用交易,我只是将订单项插入order_item
表)。
所以基本上我说如果order_id
1在3分钟前有一个order_date(日期时间字段)。然后,对于表格中的每个项目,根据其stock_id更新相关的库存项目(即fish0
将在鱼群表上,plant1
将在工厂表上。我想在伪代码中它会读到这样的东西:
select all order_id's
from order_details
where the datetime is more than 30 minutes ago
对于Order_item表中具有该order_id的每个项目
如果stockid
包含鱼,则使用当前数量+订单数量更新fish_in_stock,其中库存ID匹配,但如果库存ID类似于池塘,则在池塘表上执行相同操作
这有意义吗?这可能是不可能的事情。我问的唯一原因是我可以尝试将其作为存储过程自动执行。
答案 0 :(得分:1)
我想我明白你在说什么,我相信你可以写一个程序来更新这样的表格,但你必须几乎每分钟运行一次以保持鱼和池塘表最新。< / p>
要减少程序的频率,您可以设置挂起销售表或购物车表,这些表保存这些值,直到交易完成为止。然后有一个程序,每30分钟从待处理的销售表中删除超过30分钟的交易。查询库存值时,您可以使用两个值。一个来自主库存表,一个来自待定销售表,仅包括来自30分钟或更短时间的待定销售表的那些。这将允许缓冲程序的频率,从待处理的销售表中删除旧的事务。
不确定这对你有帮助,但我认为这就是我要这样做的方式。
答案 1 :(得分:1)
Rashlien的解决方案很好,而且可扩展。您的目标是接受没有“超额预订”的订单,即销售尚未(库存)的商品。你只需要一种方法来删除 - 或者更好地忽略 - 在计算手头数量时,在分配的时间内没有最终确定的订单。
唯一不适合我的解决方案是“删除”这个词。 : - )
您可以将待处理订单及其订单项标记为“待处理”或“已发货”或“已过期”,而不是从订单表中删除数据。然后,您可以测量从未完成的订单,也许可以调查原因。如果数据库与网站绑定,则可能与特定浏览器或网页流的问题有关。过期订单的数量应该是已完成订单的一小部分,因此您不必担心死木会堵塞您的数据库。如果它不仅仅是一小部分,那么也许您会很高兴保存数据以检测模式。
答案 2 :(得分:0)
我无法在帖子中添加评论,但这是我看到的内容
--update your order_details first
Update Order_Details set Order_Status = 'CANCELLED' where Order_Date < DATEADD(MINUTE, -15, SYSDATETIMEOFFSET()) AND Order_Status = 'OPEN'
--update the quantities second add select and () for each
Update Fish set Fish_In_Stock = (Select a.Fish_In_Stock + b.Order_Item_Qty from Fish as a, Order_Item as b, Order_Details as c where c.Order_Date < DATEADD(MINUTE, -15, SYSDATETIMEOFFSET()) and b.Stock_ID = a.Stock_ID AND b.Order_Status = 'OPEN' AND c.Order_Status = 'OPEN');
Update Plant set Plant_In_Stock = (select a.Plant_In_Stock + b.Order_Item_Qty from Plant as a, Order_Item as b, Order_Details as c where c.Order_Date < DATEADD(MINUTE, -15, SYSDATETIMEOFFSET()) and b.Stock_ID = a.Stock_ID AND b.Order_Status = 'OPEN' AND c.Order_Status = 'OPEN');
Update Pond set Pond_In_Stock = (select a.Pond_In_Stock + b.Order_Item_Qty from Pond as a, Order_Item as b, Order_Details as c where c.Order_Date < DATEADD(MINUTE, -15, SYSDATETIMEOFFSET()) and b.Stock_ID = a.Stock_ID AND b.Order_Status = 'OPEN' AND c.Order_Status = 'OPEN');
Update Food set Food_In_Stock = (select a.Food_In_Stock + b.Order_Item_Qty from Food as a, Order_Item as b, Order_Details as c where c.Order_Date < DATEADD(MINUTE, -15, SYSDATETIMEOFFSET()) and b.Stock_ID = a.Stock_ID AND b.Order_Status = 'OPEN' AND c.Order_Status = 'OPEN');
Update Pump set Pump_In_Stock = (select a.Pump_In_Stock + b.Order_Item_Qty from Pump as a, Order_Item as b, Order_Details as c where c.Order_Date < DATEADD(MINUTE, -15, SYSDATETIMEOFFSET()) and b.Stock_ID = a.Stock_ID AND b.Order_Status = 'OPEN' AND c.Order_Status = 'OPEN');
--not sure what this is for or what you are trying to do here, you should have a way to join the tables or use and outer join to select those that aren't equal to anything
Update Order_Item set Order_Status = b.Order_Status FROM Order_Item as a, Order_Details as b where b.Order_Date < DATEADD(MINUTE, -15, SYSDATETIMEOFFSET()) AND a.Order_Status <> b.Order_Status