这个过程有几个步骤,反映在数据库的各种表中:
生产->UPDATE
使用类似的东西到库存表
UPDATE STOR SET
STOR.BLOC1 = T.BLOC1,
STOR.BLOC2 = T.BLOC2,
STOR.BLOC3 = T.BLOC3,
STOR.PRODUCTION = T.PROD,
STOR.DELTA = T.DELTA
FROM BLDG B INNER JOIN STOR S
ON S.B_ID = B.B_ID
CROSS APPLY dbo.INVENTORIZE(B.B_ID) AS T;
上面提供了一个日志表,TRIGGER
如下所示:
CREATE TRIGGER trgrCYCLE
ON STOR
FOR UPDATE
AS
INSERT INTO dbo.INVT
(TS, BLDG, PROD, ACT, VAL)
SELECT CURRENT_TIMESTAMP, B_ID, PRODUCTION,
CASE WHEN DELTA < 0 THEN 'SELL' ELSE 'BUY' END,
DELTA
FROM inserted WHERE COALESCE(DELTA,0) <> 0
最后,每次更新都应该 在我添加到上面 TRIGGER 的财务表中占INSERT
一行:
INSERT INTO dbo.FINS
(COMPANY, TS, COST2, BAL)
SELECT CORP, CURRENT_TIMESTAMP, COST,
((SELECT TOP 1 BAL FROM FINS WHERE COMPANY = CORP ORDER BY TS DESC)- COST)
FROM inserted WHERE COALESCE(COST,0) <> 0
问题在于这一行:
((SELECT TOP 1 BAL FROM FINS WHERE COMPANY = CORP ORDER BY TS DESC)- COST)
这意味着计算帐户的最新余额。但是因为CROSS APPLY
将所有这些都INSERTS
视为一个批次,所以计算是根据相同的最后一条记录完成的,我得到了一个不正确的余额数字。例子:
COST BALANCE
----------------
1,000 <-- initial balance
-150 850
-220 780 <-- should be 630
解决这个问题的方法是什么?表上的触发器FINS
而不是余额计算?