日期:2014-05-16  浏览次数:20510 次

SQL高级应用,触发器的难题?
想做一个原料成本核算单价自动触发影响关联表数据:
当原料清单表的 HSDJ字段被修改时,自动影响到成本卡表的原料成本单价,并将金额字
段算出来,然后将金额按产品ID合计再关联到每个产品下面,改写产品的成本价:
大慨流程是:
清单表:      HSDJ <---修改
               |
成本卡表:  原料单价字段 、金额字段 <--发生改变
               |
产品表:     成本字段 <---发生改变

我在清单表下面写了一段触发器:

CREATE TRIGGER CBK
 ON [dbo].[CYQT_YLQD] 
AFTER   UPDATE

AS

DECLARE @OLD_HSDJ DECIMAL(12,2)

UPDATE CYQT_CBKSZB 
SET CYQT_CBKSZB.HSDJ= ISNULL( A.HSDJ,0),
  CYQT_CBKSZB.JE = ISNULL(  A.HSDJ,0) * ISNULL( CYQT_CBKSZB.BJDWCBBL ,0)

FROM CYQT_CBKSZB , INSERTED AS A
WHERE 
 CYQT_CBKSZB.YLH = A.YLPH
 

清单表结构: 原料ID(不重复),原料名,核算单价
成本卡表: 产品ID,产品名,原料ID,核算单价,数量,小计 注意:不同的产品可能有多个相同的原料ID
产品表:产品ID,产品名,成本价 注意:成本价来源于成本卡表按产品ID sum(小计)

这个应用逻辑太复杂了,求高手指教


------解决方案--------------------
引用:
Quote: 引用:

CREATE TRIGGER CBK
ON [dbo].[CYQT_YLQD] 
AFTER   UPDATE
AS
BEGIN

UPDATE CYQT_CBKSZB 
SET CYQT_CBKSZB.HSDJ= ISNULL( A.HSDJ,0),
  CYQT_CBKSZB.JE = ISNULL(  A.HSDJ,0) * ISNULL( CYQT_CBKSZB.BJDWCBBL ,0)
FROM CYQT_CBKSZB , INSERTED AS A
WHERE CYQT_CBKSZB.YLH = A.YLPH

UPDATE  A
SET 成本价=(SELECT SUM(JE) FROM CYQT_CBKSZB B WHERE A.YLH=B.YLH)
FROM 产品表 A

END


谢谢回答:有几个问题:
一、如何定义事件只是更改了 清单表HSDJ 字段时才触发事件
二、如果是批量修改了,这个触发事件,是一行一行影响的吗,或者要怎么处理。




如果是清单表修改了才触发,那么触发器应该是建立在清单表上的

CREATE TRIGGER CBK
ON [dbo].[HSDJ] 
AFTER   UPDATE
……

这样才行,批量化操作是上面意思,如果你指的是在你的批量化update操作,这样的操作中有1000个语句,那应该会触发1000次,

但如果只是一个udpate语句,一次更新了1000行,那应该是触发了1次吧。