VB+SQL2000
数据库内容
ID 型号ID  型号  原材料ID  原材料名称 比例  价格  金额
1  C101    MM101   Y101      RMC      0.5    10     5
1  C101    MM101   Y102      RTF      0.5    18     92  C102    MM102   C101     MM101     0.6   14     8.4
2  C102    MM102   Y102      RTF      0.4   18     7.23  C103    MM103   C101      MM101    0.4   14     5.6
3  C103    MM103   C102      MM102    0.6   15.6   9.36当我其中某种原材料的价格更新时,所关联的数据都更新。
例如:我把(原材料ID:Y102,原材料名称:RTF,价格:18改为10)时得到如下:ID 型号ID  型号  原材料ID  原材料名称 比例  价格  金额
1  C101    MM101   Y101      RMC      0.5    10     5
1  C101    MM101   Y102      RTF      0.5    10     52  C102    MM102   C101     MM101     0.6    10     6
2  C102    MM102   Y102      RTF      0.4    10     43  C103    MM103   C101      MM101    0.4   10      4
3  C103    MM103   C102      MM102    0.6   10      6
请问如何实现,可以建立临时表或其它表过渡或在表内增加标识字段。请各位大侠帮忙.      

解决方案 »

  1.   

    兄弟,如果我使用触发器,例如我某一种
    VB+SQL2000 
    数据库内容 
    ID 型号ID  型号  原材料ID  原材料名称 比例  价格  金额 
    1  C101    MM101  Y101      RMC      0.5    10    5 
    1  C101    MM101  Y102      RTF      0.5    18    9 2  C102    MM102  C101    MM101    0.6  14    8.4 
    2  C102    MM102  Y102      RTF      0.4  18    7.2 3  C103    MM103  C101      MM101    0.4  14    5.6 
    3  C103    MM103  C102      MM102    0.6  15.6  9.36 
    例如:我把(原材料ID:Y102,原材料名称:RTF,价格:18改为10)时得到如下: ID 型号ID  型号  原材料ID  原材料名称 比例  价格  金额 
    1  C101    MM101  Y101      RMC      0.5    10    5 
    1  C101    MM101  Y102      RTF      0.5    10    5 2  C102    MM102  C101    MM101    0.6    10    6 
    2  C102    MM102  Y102      RTF      0.4    10    4 3  C103    MM103  C101      MM101    0.4  10      4 
    3  C103    MM103  C102      MM102    0.6  10      6 使用触器它也不能从上到下更新啊(因为我只能调用已经存入数据库的型号)
    它也是指定条件才能更新。。
      

  2.   


    实际上,用两个 SQL 语句就可以了:Update TableName Set 价格 = 10 Where 材料ID='Y102' And 原材料名称='RTF'
    Update TableName Set 金额 = 比例 * 价格  Where 材料ID='Y102' And 原材料名称='RTF'
      

  3.   

    楼主您好!您这样只能更新有调用材料ID='Y102' 的价格和金额。但是没有更新(调用它们的MM101,MM102)  ID 型号ID  型号  原材料ID  原材料名称 比例  价格  金额 
    1  c1    MM101  Y101      RMC      0.5    10    5 
    1  c1    MM101  Y102      RTF      0.5    18    9 2  C2    MM102   C1      MM101    0.6  14    8.4   (MM101是由型号c1里的RMC和RTF组成)
    2  c2    MM102  Y102      RTF      0.4  18    7.2 3  C3    MM103  c1      MM101    0.4  14    5.6  (MM101是由型号c1里的RMC和RTF组成)
    3  C3    MM103  c2     MM102    0.6  15.6  9.36 (MM102是由型号MM101和RTF组成)4  C4    MM104   c1      MM101    0.4  14    5.6  (MM101是由型号c1里的RMC和RTF组成)
    4  C4    MM104   c3      MM103    0.6  15.6  9.36 (MM103是由型号MM102和MM101组成)
    ------------------------------------------------------------------------------------
    我存储时使用再插入数据库的方法。
    ID 型号ID  型号  原材料ID  原材料名称 比例  价格  金额 
    1  c1    MM101  Y101      RMC      0.5    10    5 
    1  c1    MM101  Y102      RTF      0.5    18    9 2  c2    MM101  Y101      RMC      0.5    10    5 (使用插入数据库)
    2  c2    MM101  Y102      RTF      0.5    18    9 (使用插入数据库)
    2  C2    MM102   C1       MM101    0.6  14    8.4   
    2  c2    MM102  Y102      RTF      0.4  18    7.2 3  c3    MM101  Y101      RMC      0.5    10    5 (使用插入数据库)
    3  c3    MM101  Y102      RTF      0.5    18    9 (使用插入数据库)
    3  C3    MM103  c1      MM101    0.4  14    5.6  
    3  C3    MM103  c2      MM102    0.6  15.6  9.36 
    3  c3    MM101  Y101      RMC      0.5    10    5 (使用插入数据库)
    3  c3    MM101  Y102      RTF      0.5    18    9 (使用插入数据库)
    3  C3    MM102   C1       MM101    0.6  14    8.4 (使用插入数据库)
    3  c3    MM102  Y102      RTF      0.4  18    7.2 (使用插入数据库)4  C4    MM104   c1      MM101    0.4  14    5.6  
    4  C4    MM104   c3      MM103    0.6  15.6  9.36 
    4  c4    MM101  Y101      RMC      0.5    10    5 (使用插入数据库)
    4  c4    MM101  Y102      RTF      0.5    18    9 (使用插入数据库)
    4  c4    MM101  Y101      RMC      0.5    10    5 (使用插入数据库)
    4  c4    MM101  Y102      RTF      0.5    18    9 (使用插入数据库)
    4  C4    MM103  c1      MM101    0.4  14    5.6  
    4  C4    MM103  c2      MM102    0.6  15.6  9.36 
    4  c4    MM101  Y101      RMC      0.5    10    5 (使用插入数据库)
    4  c4    MM101  Y102      RTF      0.5    18    9 (使用插入数据库)
    4  C4    MM102   C1       MM101    0.6  14    8.4 (使用插入数据库)
    4  c4    MM102  Y102      RTF      0.4  18    7.2 (使用插入数据库)
      

  4.   

    我可能把数据复杂化啦。其实就是:
    1、产成品A:是由原材料A1和A2组成(其中A1的比例是0.5单价是10元,A2白比例0.5单价是20)那么产成品A价格就等于15元2、产成品B:是由原材料A1和(产成品A)组成(那么A1的比例是0.5单价是10,而产成品A比例是0.5[(又是由A1的比例是0.5单价是10,A2白比例0.5单价是20组成)]那么产成品B的价格是原材料A1(0.5*10=5)+ 产成品A 0.5*[(05*10)+(0.5*20)]=7.5等于12.53、产成品c:是由产成品(比例0.6) B和产成品(比例0.3) A和比例(0.1) A2组成.4、产成品D:又有可能由产成品(比例0.8) C和产成品(比例0.2) A组.我想得到的是:
    当我把原材料A1的价格变更为30元时,所有调用过它的产成品都更新。
    1、产成品A:A1 0.5  30 15  , A2 0.5 20 金额 25元
    2、产成品B:A1 0.5  30 15 , 0.5 (产成品A等于25元) 金额 27.5 元
    3、产成品C:0.6 产成品B(27.5),0.3 产成品A(25),0.1 (A2 0.5*20=10) 金额 25元
    4、产成品D:0.8 产成品c(25),0.2 产成品A(25)金额 25元请各位大侠帮忙,我现在想搞个产成品生产成本计算系统。
    思想路是(当我某种原材料的价格变动,我所关联的半成品和产成品的价格都变动)如果所有的半成品和产成品都只调用一资就很容易,但我现在就是想产成品调用产成品后,如果我所调用的产成品中含有需要更的原材料时,所有关联的都更新)
      

  5.   

    使用触发器有什么问题吗?检测更新的数据,删除的数据的价格是否等于新增的数据的价格,如果不相等就执行更新语句,更新所有原材料ID等于该条数据的ID型号ID的数据,然后重新计算被更新数据的价格。
      

  6.   

    我现在也是用三个表
    1、原材料价格表
    ID   原材料名称   单价
    Y1     A1          10
    Y2     A2          20
    Y3     A3          15
    Y4     A4          30
    Y5     A5           5
    2、主表(产成品)更新价格(update 主表 set 单价=(select 单价 from  原材料价格表 where 主表.原材料ID=原材料价格表.ID))
    (当标识1,标识2都等2时,
    INSERT INTO 产品成分表(iD,标识1,标识2,型号ID,型号,原材料ID,原材名称,比例,单价) select '" & Trim(Label11.Caption) & "' as id,'4' as 标识1, 标识2,型号ID,型号,原材料ID,原材名称,比例,单价 From chanpinxinghao WHERE (型号ID =  '" & Trim(MSFlexGrid1.TextMatrix(i, 3)) & "')"iD   标识1  标识2   型号ID   型号   原材料ID   原材名称   比例   单价C101   1     1       C1     AA-101    Y2         A2        0.6   20
    C101   1     1       C1     AA-101    Y5         A5        0.4   5C102   1     1       C2     AA-102    Y3          A3        0.5    15
    c102   2     2       c2     AA-102    C1(产成品) AA-101     0.5   (0.6*20)+(0.4*5)=14C103   1     1       C3     AA-103    Y1          A1        0.6   10
    C103   2     2       C3     AA-103    C2(产成品) AA-102   0.3    (0.5*15)+(0.5*14)=14.5
    C103   1     1       C3     AA-103    Y4          A4        0.1     30C104   1     1       C4     AA-104     Y2         A2        0.2    20
    C104   2     2       C4     AA-104     C3(产成品) AA-103    0.4    13.35
    C104   2     2       C4     AA-104     C2(产成品) AA-102    0.4    14.5注:标识1,标识2都等于1时,代表调用的是原材料,标识1,标识2都等于2时,代表调用产成品。
    当标识1,标识2都等于2时,我就把所调用的资料插入到产品分类表中.3、产品成分表(update 产品成分表 set 单价=(select 单价 from  原材料价格表 where 产品成分表.原材料ID=原材料价格表.ID))
    iD   标识1  标识2   型号ID   型号   原材料ID   原材名称   比例   单价C102   4     1       C2     AA-102    Y2         A2        0.6   20
    C102   4     1       C2      AA-102    Y5         A5        0.4   5
    C102   4     1       C2      AA-102    Y3          A3       0.5    15
    c102   4     2       c2      AA-102    C1(产成品) AA-101    0.5   (0.6*20)+(0.4*5)=14            
    注:C102是由以上组成。标识1等于4代表从主表复制过来的
    C103   4     1       C1     AA-101    Y2         A2        0.6   20
    C103   4     1       C1     AA-101    Y5         A5        0.4   5
    C103   4    1        C2      AA-102    Y3          A3        0.5    15
    c103   4     2       c2     AA-102    C1(产成品) AA-101     0.5   (0.6*20)+(0.4*5)=14
    C103   4     1       C3     AA-103    Y1          A1        0.6   10
    C103   4     2       C3     AA-103    C2(产成品) AA-102   0.3    (0.5*15)+(0.5*14)=14.5
    C103   4     1       C3     AA-103    Y4          A4        0.1     30  
    注:C103是由以上组成。标识1等于4代表从主表复制过来的
    .....................................................
    我现在这样也不能更新啊。。我想了很多办法还是不能解决.(最简单的办法就是我把所有标识1,2等于2的存入临时表,然后把它们更新,
    问题就是我这样更新只能更新调用一层的,不能更新调用二次以上的。(如:AA-104是由AA-103,(AA-103又由AA-102和Y3组成)和AA-102就不能更新啦)
    (如果能从上到下来更新就能解决这个问题,如:AA-102 是第一个,先更新AA-101再把调它的AA-102再相加,再会更新AA-102......)
    也就是说,先更新再相加得到下一个,再更新相加......
    c102   2     2       c2     AA-102    C1(产成品) AA-101     0.5   (0.6*20)+(0.4*5)=14
    C103   2     2       C3     AA-103    C2(产成品) AA-102   0.3    (0.5*15)+(0.5*14)=14.5
    C104   2     2       C4     AA-104     C3(产成品) AA-103    0.4    13.35       
    C104   2     2       C4     AA-104     C2(产成品) AA-102    0.4    14.5          
      
      

  7.   


    产成品成分表怎么存?大侠。
     每条记录是一种产品的一种原材料。所以一个由 n 种原材料组成的产品就有 n 条记录。
    但是问题就是每种产成品调用产成品后所使用的比例不一样。
    例如:
    iD  标识1  标识2  型号ID  型号  原材料ID  原材名称  比例  单价 
    C101  1    1      C1    AA-101    Y2        A2        0.6  20 
    C101  1    1      C1    AA-101    Y5        A5        0.4  5 C102  1    1      C2    AA-102    Y3          A3        0.5    15 
    c102  2    2      c2    AA-102    C1(产成品) AA-101    0.5  (0.6*20)+(0.4*5)=14 
    我在C102里调用C101。但是我在C102里的比例0.5。
    您的意思应该是这样
    C102  1    1      C2    AA-102    Y3          A3        0.5    15 
    c102  2    2      c2    AA-102    C1(产成品) AA-101    0.5  (0.6*20)+(0.4*5)=14 等于14分解成以下存。
    C102  1    1      C2    AA-102    Y3       A3        0.5    15 
    C102  1    1      C2    AA-102    Y2       A2        0.6   20 
    C102  1    1      C2    AA-102    Y5       A5         0.4   5 等于21.5我原先也是这样想,但是我在C102里的比例0.5。
      

  8.   

    你把table的create语句贴出来吧,我给你写个触发器。
      

  9.   

    表名:chanpinxinghao (主表)
    ---------------------------
    列名          数据类型
    SID            decimal  
    fenlei         decimal
    leibieid       nvarchar
    xinghaoid      nvarchar
    xinghao        varchar
    yuancailiaoid  nvarchar
    yuancailiao    varchar
    bili           decimal
    danjia         decimal
    huang          decimal
    paixu          decimal
    shibiehao      decimal
    beizhu         varchar
    ----------------------------
    触发器:
    CREATE TRIGGER [TRIGGER NAME] ON [dbo].[chanpinxinghao] 
    FOR INSERT, UPDATE, DELETE 
    AS
    ----------------------------
    表名:yuancailiao(原材料价格表)
    -----------------------------
    yuancailiaoid nvarchar
    leibie        varchar
    yuancailiao   varchar
    danjia        decimal
    -----------------------------
    触发器:
    CREATE TRIGGER [TRIGGER NAME] ON [dbo].[yuancailiao] 
    FOR INSERT, UPDATE, DELETE 
    AS
    -----------------------
    谢谢大侠
      

  10.   

    ID 型号ID  型号  原材料ID  原材料名称 比例  价格  金额 
    1  C101    MM101  Y101      RMC      0.5    10    5 
    1  C101    MM101  Y102      RTF      0.5    18    9 2  C102    MM102  C101    MM101    0.6  14    8.4 
    2  C102    MM102  Y102      RTF      0.4  18    7.2 3  C103    MM103  C101      MM101    0.4  14    5.6 
    3  C103    MM103  C102      MM102    0.6  15.6  9.36 
    把你上面这个表的Create语句贴出来。
    选中你的这个表,右键编写表脚本为-->create到-->新查询编辑器窗口,然后把查询分析器里的语句贴出来。
      

  11.   

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[chanpinxinghao]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[chanpinxinghao]
    GOCREATE TABLE [dbo].[chanpinxinghao] (
    [SID] [decimal](18, 0) NULL ,
    [fenlei] [decimal](18, 0) NULL ,
    [leibieid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [xinghaoid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [xinghao] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [yuancailiaoid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [yuancailiao] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [bili] [decimal](18, 3) NULL ,
    [danjia] [decimal](18, 3) NULL ,
    [huang] [decimal](18, 0) NULL ,
    [paixu] [decimal](18, 0) NULL ,
    [shibiehao] [decimal](18, 3) NULL ,
    [beizhu] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
      

  12.   

    CREATE TABLE [chanpinxinghao] (
    [SID] [decimal](18, 0) NULL ,
    [fenlei] [decimal](18, 0) NULL ,
    [leibieid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [xinghaoid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [xinghao] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [yuancailiaoid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [yuancailiao] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [bili] [decimal](18, 3) NULL ,
    [danjia] [decimal](18, 3) NULL ,
    [huang] [decimal](18, 0) NULL ,
    [paixu] [decimal](18, 0) NULL ,
    [shibiehao] [decimal](18, 3) NULL ,
    [beizhu] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
      

  13.   

    金额是哪个字段?huang是什么?
      

  14.   

    不知道你的价格和金额字段是哪个?你把下面的修改成你的价格和金额字段应该就可以。
    我没测试过,如果还有问题再告诉我。
    Create trigger [Updanjia] on [dbo].[chanpinxinghao]  
    for update
    as
    begin
    set nocount on
    declare @bdanjiaOld decimal(18,0)
    ,@bdanjiaNew decimal(18,0)
    ,@bjineOld decimal(18,0)
    ,@bjineNew decimal(18,0)
    if exists(select * from inserted) and exists(select * from deleted)
    begin
    select @bdanjiaOld=danjia from deleted
    select @bdanjiaNew=danjia from inserted
    if @bdanjiaOld<>@bdanjiaNew
    Begin
    update chanpinxinghao set jine=bili*danjia where SID=(select SID from inserted)
    End
    select @bjineOld=jine from deleted
    select @bjineNew=jine from inserted
    if @bjineOld<>@bjineNew
    Begin
    update chanpinxinghao set danjia=(select sum(jine) from chanpinxinghao group by xinghaoid)
    where yuancailiaoid=(select xinghaoid from inserted)
    End
    End
    End
      

  15.   

    sql2000数据库里的内容:
    sid fenlei  xinghaoid xinghao yuancailiaoid yuancailiao bili danjia jine huang paixu
    001 1       C1000  AA-102    Y10001 R-MA-T-01       0.6     10      6     1       1
    001 1       C1000  AA-102    Y10003 R-MA-X-09 0.4 180 72     1       2002 1       C1004  AA-102白  Y10000 R-MA-X-02 0.6 90 54 1 1
    002 1       C1004  AA-102白  Y10002 R-MC-Z-09 0.4 60 24 1 2003 3       C1001  AA-103    C1000 AA-102         0.6 84 50.4 1 1
    003 3       C1001  AA-103    C1004 AA-102白          0.4 78 31.2 1 2 1、fenlei为1时代表调用原材料,为3时,代表调用产成品.
    2、huang代表循环次数,因为我保存时是使用MSFLEXGRID控件作为表单录入,所有要有一个作为我保存时循环存入表。
    3、PAIXU代表,我调用它显示时的排序标识。
    大侠,我用您的触发器时还是不能更新数据。(我在SQL里测试,不能更新)Update chanpinxinghao set danjia=20 where yuancailiaoid='Y1000001',我使用UPDATE时,触发器没有反映。
      

  16.   

    你给的表的生成语句里面哪里有jine这个字段?请发个完整的
      

  17.   

    不好意思大侠,金额(jine)这个字段我后面加上去的。
    CREATE TABLE [chanpinxinghao] (
    [SID] [decimal](18, 0) NULL ,
    [fenlei] [decimal](18, 0) NULL ,
    [leibieid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [xinghaoid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [xinghao] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [yuancailiaoid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [yuancailiao] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [bili] [decimal](18, 3) NULL ,
    [danjia] [decimal](18, 3) NULL ,
    [jine] [decimal](18, 3) NULL ,
    [huang] [decimal](18, 0) NULL ,
    [paixu] [decimal](18, 0) NULL ,
    [shibiehao] [decimal](18, 3) NULL ,
    [beizhu] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
      

  18.   

    不好意思大侠,金额(jine)这个字段我后面加上去的。
    CREATE TABLE [chanpinxinghao] (
    [SID] [decimal](18, 0) NULL ,
    [fenlei] [decimal](18, 0) NULL ,
    [leibieid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [xinghaoid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [xinghao] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [yuancailiaoid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [yuancailiao] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [bili] [decimal](18, 3) NULL ,
    [danjia] [decimal](18, 3) NULL ,
    [jine] [decimal](18, 3) NULL ,
    [huang] [decimal](18, 0) NULL ,
    [paixu] [decimal](18, 0) NULL ,
    [shibiehao] [decimal](18, 3) NULL ,
    [beizhu] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
      

  19.   

    --生成表
    CREATE TABLE [chanpinxinghao] ( 
    [SID] [decimal](18, 0) NULL , 
    [fenlei] [decimal](18, 0) NULL , 
    [leibieid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , 
    [xinghaoid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , 
    [xinghao] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , 
    [yuancailiaoid] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , 
    [yuancailiao] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , 
    [bili] [decimal](18, 3) NULL , 
    [danjia] [decimal](18, 3) NULL , 
    [jine] [decimal](18, 3) NULL , 
    [huang] [decimal](18, 0) NULL , 
    [paixu] [decimal](18, 0) NULL , 
    [shibiehao] [decimal](18, 3) NULL , 
    [beizhu] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY] 
    GO
    --测试数据
    insert into [chanpinxinghao](sid,xinghaoid,yuancailiaoid,bili,danjia,jine)
    values(1,'C1000','Y10001',0.6,10,6)
    insert into [chanpinxinghao](sid,xinghaoid,yuancailiaoid,bili,danjia,jine)
    values(1,'C1000','Y10003',0.4,180,72)
    insert into [chanpinxinghao](sid,xinghaoid,yuancailiaoid,bili,danjia,jine)
    values(2,'C1004','Y10000',0.6,90,54)
    insert into [chanpinxinghao](sid,xinghaoid,yuancailiaoid,bili,danjia,jine)
    values(2,'C1004','Y10002',0.4,60,24)
    insert into [chanpinxinghao](sid,xinghaoid,yuancailiaoid,bili,danjia,jine)
    values(3,'C1001','C1000',0.6,78,50.4)
    insert into [chanpinxinghao](sid,xinghaoid,yuancailiaoid,bili,danjia,jine)
    values(3,'C1001','C1004',0.4,78,31.2)
    --触发器更新单价
    create trigger [Updanjia] on [dbo].[chanpinxinghao]  
    for update
    as
    begin
    set nocount on
    declare @bdanjiaOld decimal(18,0)
    ,@bdanjiaNew decimal(18,0)
        if exists(select * from inserted) and exists(select * from deleted)
        begin
            select @bdanjiaOld=danjia from deleted
            select @bdanjiaNew=danjia from inserted
            if @bdanjiaOld<>@bdanjiaNew
            Begin
                update chanpinxinghao set jine=bili*danjia where SID=(select SID from inserted)
            End
        End
    End
    --触发器更新金额
    create trigger [Upjine] on [dbo].[chanpinxinghao]  
    for update
    as
    begin
    set nocount on
    declare @bjineOld decimal(18,0)
    ,@bjineNew decimal(18,0)
        if exists(select * from inserted) and exists(select * from deleted)
        begin
            select @bjineOld=jine from deleted
            select @bjineNew=jine from inserted
            if @bjineOld<>@bjineNew
            Begin
                update chanpinxinghao set danjia=(
    select sum(jine) from chanpinxinghao where SID in (select SID from inserted) group by xinghaoid 
    )
                where yuancailiaoid in (select xinghaoid from inserted)
            End
        End
    End
    --测试更新
    select * from [chanpinxinghao]
    update [chanpinxinghao] set danjia=100 where sid=1 and yuancailiaoid='Y10003'
    select * from [chanpinxinghao]
    这次可以了,测试过了,不过我不知道你的SID和yuancailiaoid的区别,可能需要稍微改下
      

  20.   

    大侠测试过是可以的,但是我现在又遇到一个新的问题,当我同时更新两条记录以上时,就会报错.
    (子查询返回的值多于一个,当子查询跟随在=,!=,<,<=,>,>=之后,或子查询用作表达式时,这种情况是不允许的)
      

  21.   

    UPDATE chanpinxinghao
    SET danjia = 10
    WHERE (yuancailiaoid = 'Y10001') OR
          (yuancailiaoid = 'Y10003')
      

  22.   

    很简单alter trigger [Updanjia] on [dbo].[chanpinxinghao]  
    for update
    as
    begin
    set nocount on
    declare @bdanjiaOld decimal(18,0)
    ,@bdanjiaNew decimal(18,0)
        if exists(select * from inserted) and exists(select * from deleted)
        begin
            select @bdanjiaOld=danjia from deleted
            select @bdanjiaNew=danjia from inserted
            if @bdanjiaOld<>@bdanjiaNew
            Begin
                update chanpinxinghao set jine=bili*danjia where SID in (select SID from inserted)
            End
        End
    End
      

  23.   

    大侠,现在更新两个Danjia可以,但是jine不会更新..(UPDATE后的结果)
    000001 C100002 Y1000000 0.6 30 18
    000001 C100002 Y1000002 0.3 30 9
    000001 C100002 Y1000005 0.1 90 9000002 C100003 C100002          0.8 [81] 64.8
    000002 C100003 Y1000001 0.1 10 1
    000002 C100003 Y1000003 0.1 180 18000003 C100000 C100002         0.6 [81] 48.6
    000003 C100000 C100003         0.4 [84.8] 33.92
      

  24.   

    大侠,我试过好多次,还是会经常会出现(子查询返回的值多于一个,当子查询跟随在=,!=, <, <=,>,>=之后,或子查询用作表达式时,这种情况是不允许的) ,我想会不会是我使用的SQL版本有问题,我使用的是SQL2000个人版。
      

  25.   

    应该不会啊,我这里可以啊,把=改成in就可以了啊
    update chanpinxinghao set jine=bili*danjia where SID = (select SID from inserted)
    修改为
    update chanpinxinghao set jine=bili*danjia where SID in (select SID from inserted)了金额应该会更新啊,上面这个就是更新金额的,我确实测试过才给你发的。
      

  26.   

    大侠真的太感激您,我现在测试过我重启SQL就可以啦,但还有一个问题就是如果表内同时存在两种以上相同的原材料时,更新时就会出错。
    000001 C100000 AA-102 Y1000001 R-MA-T-01 0.6 30 18
    000001 C100000 AA-102 Y1000003 R-MA-X-09 0.4 30 12

    000002 C100004 AA-102白 Y1000000 R-MA-X-02 0.6 65 39
    000002 C100004 AA-102白 Y1000002 R-MC-Z-09 0.4 20 8

    000003 C100001 AA-103 C100000           AA-102 0.6 30 18
    000003 C100001 AA-103 C100004          AA-102白 0.4 47 18.8

    000004 C100002 1223 [Y1000002] [R-MC-Z-09] 0.6 20 36
    000004 C100002 1223 [Y1000002] [R-MC-Z-09] 0.4 20 24UPDATE  chanpinxinghao set danjia=30 where yuancailiaoid='Y1000002'
    (子查询返回的值多于一个,当子查询跟随在=,!=, <, <=,>,>=之后,或子查询用作表达式时,这种情况是不允许的) 
      

  27.   


    --触发器更新单价
    alter trigger [Updanjia] on [dbo].[chanpinxinghao]  
    for update
    as
    begin
    set nocount on
    declare @bdanjiaOld decimal(18,0)
    ,@bdanjiaNew decimal(18,0)
    ,@bSID decimal(18,0)
        if exists(select * from inserted) and exists(select * from deleted)
        begin
    select * into #tmpin from inserted
    select * into #tmpde from deleted
    while exists(select top 1 * from #tmpde)
    Begin
    --此处不知道主键是哪些,需要修改成相应主键
    select @bSID=SID,@bdanjiaOld=danjia from #tmpde
    select @bdanjiaNew=danjia from #tmpin where SID=@bSID
    if @bdanjiaOld<>@bdanjiaNew
    Begin
    update chanpinxinghao set jine=bili*danjia where SID =@bSID
    End
    delete from #tmpde where SID=@bSID
    delete from #tmpin where SID=@bSID
    select @bSID=null
    End
    drop table #tmpin
    drop table #tmpde
        End
    End
      

  28.   

    大侠,我没有设置主键,因为我的SID,XINGHAOID也不是唯一的。