建议使用触发器,这样,你的毕业设计也有一定的技术含量了。
给一个例子:在OrderItems表上创建一个插入触发器,在添加一个订单明细记录时,减少Products表相应货品记录中的库存量。
CREATE TRIGGER OrderItemsInsert
ON OrderItems
FOR INSERT 
AS
 UPDATE Products SET PRoducts.Quantity = PRoducts.Quantity - Inserted.Quantity
 FROM Products , Inserted 
 WHERE PRoducts.P_id = Inserted.P_id
GO

解决方案 »

  1.   

    首先你可以建立一个存储过程
    create PROC insert
    @@a int(20),
    @@b int(20),
    @@c int(20) 
    as 
    select @@a=select sum(数量) from purchase where 商品名称 in (select 商品名称 from product)
    select @@b=select sum(数量) from sale     where 商品名称 in (select 商品名称 from product)
    set @@c=@@a-@@b
    UPDATE Products SET 库存=@@c
    go
    然后调用
    Private Sub Command1_Click()
    Dim conn As New ADODB.Connection
    Dim connstring As String
    = "Provider=SQLOLEDB.1;Password=ecc;Persist Security " _
                    & "Info=True;User ID=sa;Initial Catalog=PurchaseandSale;Server=(local)"
    If conn.State <> 1 Then            '打开数据库
            conn.Open (connstring)
        End If
        conn.Execute (exec proc insert)           '执行库存盘点操作
        conn.Close
        
        adoKCPD.Refresh                     '刷新库存 End Sub
      

  2.   

    谢谢wooernet的指导,我现在就采用你的建议。
    但我目前这样的问题,不知道能不能直接改一下呢?
    各各朋友都帮我看下,提点建议,麻烦你们了!!
      

  3.   

    kzh80000(康政辉),感谢你对我的问题的关注你写的代码,好象不能运行,还得改改。
      

  4.   

    下午给的例子是当你增加一条记录时,触发的。
    有时还有这样的情况,比如修改订单里的产品数量,也要更新库存,所以要有update触发器。
    例子:
    CREATE TRIGGER OrderItemsInsert
    ON OrderItems
    FOR INSERT, UPDATE
    AS
     UPDATE Products SET PRoducts.Quantity = PRoducts.Quantity - Inserted.Quantity
     FROM Products , Inserted 
     WHERE PRoducts.P_id = Inserted.P_id
    GO
    --------------------
    建议看看sql server的教程或帮助,理解触发器。
      

  5.   

    wooernet(Wooer.Net):谢谢你的提示,555555555555!按你的改法,我的库存盘点得去掉了,
                      好心疼啊! 本来已经是很少的代码量了!老师非得把我骂死!
                             我先看看,实在不行,就用触发器了!我已经好好理解了触发器了
                      我已经在SQL里运行了你的代码,代码没有错误,就是好象功能没有实现!
                      帮我看看:CREATE TRIGGER purchaseInsert
                               ON purchase
                               FOR INSERT, UPDATE
                               AS
                            UPDATE product SET product.库存 = purchase.数量- sale.数量
                          FROM product,purchase , sale
                WHERE product.商品名称 = sale.商品名称 and  sale.商品名称=purchase.商品名称
                       没有实现的功能如下:
                             1,没有更新product里的数据
                             2,如果sale对应的数据项不存在或为0,这样相减的话,会不会出现问题
                             3,另外,我用了3个表,你提示的是2个表,应该不会有问题吧?(我必须得用3个表)
    kzh80000(康政辉):不知道你还会不会再看这个贴,不过也得谢谢你,
                     你提供的存储过程代码运行 的时候,总是提示:1,insert附近有错误
                                                                2,@@a 没定义 
                                                                   @@b 没定义
                大伙也帮我看看吧,看是什么问题!
                   谢谢了!
      
    能在QQ里帮我解决问题的话,更是感激!QQ:452735276   在线等
      

  6.   

    1、你试试对purchase表,进行操作,(不要在数据库的企业管理器里改,你执行一条语句,如insert into purchase (aaa) values ('11qq')),看看,会不会触发。2、你可以再建立触发器,当库存不足或没有库存时,不能开订单。3、几个表是没关系的。4、盘点,应该是有一个盘点表,把某时某刻的盘点的记录都保存下来,这是历史记录,方便查询。
      

  7.   

    我觉得 tiansu ()  你最初的写法 只能更新三个表中都有的产品 要是在采购表和销售表中有的产品而在库存表中没有的话 这种产品是不能被更新的。 或者某一种产品只在 采购表或 销售表中有那么这种产品是不能被更新的。  你最初的语句是没有问题的 ,我觉得问题出 在 你这三个表中的数据。 你可以分析一下没有被更新的产品 在三个表中都是什么样的。
      

  8.   

    对了:
    CREATE TRIGGER purchaseInsert
                               ON purchase
                               FOR INSERT, UPDATE
                               AS
                            UPDATE product SET product.库存 = purchase.数量- sale.数量
                          FROM product,purchase , sale
                WHERE product.商品名称 = sale.商品名称 and  sale.商品名称=purchase.商品名称
    这种算法的结果是不正确的。你会发现每种产品的库存数量比正确的值要小。
      

  9.   

    systemInput() :谢谢你对我问题的关注,你一定是认真的分析过我的代码,因为你所说的问题正是在我测试中出现的。
         1,我要更新的是  product 表中的“库存”数据项。
         2,我感觉是我的代码不够严谨。
            要怎么改,我觉得:是不是先要判断表“采购产品表”中是否有对应的数据元素
                              再判断“销售产品表”中是不是有对应的数据元素
                             没有该什么办?
         3,我对这代码的编写很是不清楚!
      

  10.   

    create PROC insert
    declare @a int(20),@b int(20),@c int(20)
    as 
    select @a=select sum(数量) from purchase where 商品名称 in (select 商品名称 from product)
    select @b=select sum(数量) from sale     where 商品名称 in (select 商品名称 from product)
    set @c=@a-@b
    UPDATE Products SET 库存=@c
    go然后调用
    Private Sub Command1_Click()
    Dim conn As New ADODB.Connection
    Dim connstring As String
    = "Provider=SQLOLEDB.1;Password=ecc;Persist Security " _
                    & "Info=True;User ID=sa;Initial Catalog=PurchaseandSale;Server=(local)"
    If conn.State <> 1 Then            '打开数据库
            conn.Open (connstring)
        End If
        conn.Execute (exec  insert)           '执行库存盘点操作
        conn.Close
        
        adoKCPD.Refresh                     '刷新库存 End Sub
      

  11.   

    create PROC insert
    declare @a int,@b int,@c int
    as 
    select @a=select sum(数量) from purchase where 商品名称 in (select 商品名称 from product)
    select @b=select sum(数量) from sale     where 商品名称 in (select 商品名称 from product)
    set @c=@a-@b
    UPDATE Products SET 库存=@c
    go然后调用
    Private Sub Command1_Click()
    Dim conn As New ADODB.Connection
    Dim connstring As String
    = "Provider=SQLOLEDB.1;Password=ecc;Persist Security " _
                    & "Info=True;User ID=sa;Initial Catalog=PurchaseandSale;Server=(local)"
    If conn.State <> 1 Then            '打开数据库
            conn.Open (connstring)
        End If
        conn.Execute (exec  insert)           '执行库存盘点操作
        conn.Close
        
        adoKCPD.Refresh                     '刷新库存 End Sub
      

  12.   

    我把存储过程改成这样后就可以成功运行了:不过调用时出现问题
     CREATE proc stor1
     @a int,
     @b int,
     @c int
    as 
    set @a=(select sum(数量) from purchase where 商品名称 in (select 商品名称 from product))
    set @b=(select sum(数量) from sale     where 商品名称 in (select 商品名称 from product))
    set @c=@a-@b
    UPDATE product SET 库存=@c
    GO
    调用语句如下:
    Private Sub Command1_Click()
       
        Dim conn As New ADODB.Connection
        Dim connstring As String
         connstring = "Provider=SQLOLEDB.1;Password=ecc;Persist Security " _
                    & "Info=True;User ID=sa;Initial Catalog=PurchaseandSale;Server=(local)"
        If conn.State <> 1 Then            '打开数据库
            conn.Open (connstring)
        End If
        conn.Execute ( exec stor1)          '执行库存盘点操作<-----出现问题
        conn.Close
       adoKCPD.Refresh                     '刷新库存End Sub
    错误提示:“stor1”    缺少列表分隔符  或 )说明:在过程调用代码中,根据错误提示
         declare @a int(20),@b int(20),@c int(20)  不能有 declare 和(20)
      

  13.   

    其实吧我觉得盘点更新库存跟你的实际业务是由关系的,某一产品 有可能是自制件 也有可能是采购的
    自制件在采购表中没有记录但在销售表中会有记录,这是还是要更新库存量的。最好是在存储过程中按照你的业务有条理 的分开实现。而不是单单一个sql就可以解决的。建议先从业务角度分析总结出几种情况,然后决定如何处理。
      

  14.   

    systemInput() :你所说的自制件我在系统中没有考虑,我的系统只能够进货,销货,呵呵,功能有点简单的!以后有时间和兴趣的话,我会加上去的,目前我只希望能够解决现在的问题就好了!
      

  15.   

    存储过程和调用的代码我都已经改好了,如下:但是我的 CREATE proc stor1 as 
     declare @a int,
                  @b int,
                  @c intselect @a=(select sum(数量) from purchase where 商品名称 in (select 商品名称 from product))
    select @b=(select sum(数量) from sale     where 商品名称 in (select 商品名称 from product))
    set @c=@a-@b
    UPDATE product SET 库存=@c 
    GO
    Private Sub Command1_Click()
       
        Dim conn As New ADODB.Connection
             Dim strUpdate As String
        Dim connstring As String
         connstring = "Provider=SQLOLEDB.1;Password=ecc;Persist Security " _
                    & "Info=True;User ID=sa;Initial Catalog=PurchaseandSale;Server=(local)"
       If conn.State <> 1 Then            '打开数据库
            conn.Open (connstring)
        End If
        conn.Execute ("exec stor1")           '执行库存盘点操作
        conn.Close
       adoKCPD.Refresh                     '刷新库存End Sub运行的结果居然是:product表中所有商品的库存量都更新得一样的了 ,更新为第一个商品的正确库存怎么改呢?大家指点我一下
      

  16.   

    你更新表的时候,先判断是否存在记录再判断啊。如果eof就不执行更新操作。