这个过程包含多个步骤,涉及数据库中的不同表格:
生产 --> 使用类似以下语句对库存表执行 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
最后,每次更新应该插入
一行数据到我在上面添加的财务表中:
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
表上触发器来进行结算平衡吗?