我使用DataGrid控件显示我数据库中的内容,有时候在输入数据库内容的时候内容会因为失误照成录入错误,所以我修改的时候会直接通过DataGrid控件进行修改。但是因为我数据库中有3个表,一个是物品的入库记录,一个是物品的出库记录,还有一个是总的物品库。物品入库表和出库表里边的字段都是一样的,为品名、单价、数量、货物余额、单位、金额、备注、经办人、结余金额、日期。而总的物品库中的字段只有品名、货物余额、结余金额3个。我现在请教群里的朋友,如果我直接对DataGrid控件进行修改同一物品的数量和金额时,能不能我总的物品库中的货物余额和结余金额能直接进行修改啊?

解决方案 »

  1.   

    A)如果数据库(比如 SQL Server)支持,就在入库表、出库表中做触发器,连带更新库存表。
    B)也可以在 DataGrid 的 AfterInsert、AfterDelete、AfterUpdae 事件中进行更新库存表。
      

  2.   

    能不能我总的物品库中的货物余额和结余金额能直接进行修改啊?啥意思?? 
     
    我没有说明白,意思就是在我入库表或是出库表中如果数量或是金额通过DataGrid控件更改了,我总的物品库可以判断出来自己进行更改货物余额或是结余金额。
      

  3.   

    A)如果数据库(比如 SQL Server)支持,就在入库表、出库表中做触发器,连带更新库存表。 
    B)也可以在 DataGrid 的 AfterInsert、AfterDelete、AfterUpdae 事件中进行更新库存表。 第一种方法我没有接触过,所以不会使用,请问你这个DataGrid中的AfterUpdae事件是怎么操作完成的呢,是通过Command控件点击完成还是在我程序中用鼠标点击DataGrid控件中内容直接修改后就可以激发呢?
      

  4.   

    1、在DataGrid的AfterUpdae事件中写更新总的物品库(表)程序就可以了。2、修改过的数据已经从 DataGrid 控件中被写到数据库后被触发AfterUpdate 事件(当你在DataGrid某单元格修改了数据并确认后(光标到达另一个单元格时),此事件发生。)
      

  5.   

    请问下楼上的,那更新的时候怎么判断是哪个物品进行了更改呢,还有怎么来更新呢,我现在用的adodc的update方法,好像不管用。能给举个例子吗?
      

  6.   

    1、在DataGrid的AfterUpdae事件中写更新总的物品库(表)程序就可以了。 2、修改过的数据已经从 DataGrid 控件中被写到数据库后被触发AfterUpdate 事件(当你在DataGrid某单元格修改了数据并确认后(光标到达另一个单元格时),此事件发生。)
    猴哥,你说的第一步方法,我看了,请问下我怎么更新我总得物品库呢,是需要全部更新吗,因为更新的话我肯定的从新计算更改物品目前在库存中有多少剩余数量还有剩余金额。还有怎么判断DataGrid更改的是哪一种物品呢?
    第二步在DataGrid 控件中被写到数据库后被触发AfterUpdate 事件,这时候能把修改的物品名称得出吗?
      

  7.   

    AfterInsert、AfterDelete、AfterUpdae 都只针对一条记录,所以只要更新一个库车即可。
      

  8.   

    我在修改DataGrid后AfterUpdae发生下边的操作,我现在就是有点不明白因为DataGrid我要修改的物品品名是鼠标直接点击的,那我更新总物品库的时候怎么来判读我要更新的是哪一个品名呢,就像我下边写的代码,如果我要更新哪一个品名的数量,我的让Combo2.Text中的内容等于更新的品名,这个我需要怎么完成呢?
    Private Sub DataGrid1_AfterUpdate()
    Adodc1.CommandType = adCmdText
    Adodc1.RecordSource = "select sum(数量) from 出库 where 品名='" + Combo2.Text + "'"
    Adodc1.Refresh
    Text1.Text = Val(Adodc1.Recordset.Fields(0) & "")Adodc2.CommandType = adCmdText
    Adodc2.RecordSource = "select sum(数量) from 入库 where 品名='" + Combo2.Text + "'"
    Adodc2.Refresh
    Text8.Text = Val(Adodc2.Recordset.Fields(0) & "")Text9.Text = Val(Text8.Text) - Val(Text1.Text)
    End Sub
      

  9.   

        1、DataGrid 控件的AfterUpdate 事件 是在光标里开本条记录(光标到达上一行或下一行的某单元格)时发生的,也就是说DataGrid的更新是行更新。
         2、事件发生时通过DataGrid列来判断物品名称,然后更新。Private Sub DataGrid1_AfterUpdate()
        Dim iWp As String
        iWp = DataGrid1.Columns(1).Value'被更新行第二列的值(假设为物品名称),自己改。
         ....
    End Sub
      

  10.   

    1、你利用DataGrid 控件改写数据,必需将DataGrid与数据库中的记录集(入库表或出库表ID为自动编号)绑定。
    2、修改了数据库中的出库表(或入库表)进而可以关联地更新数据库中的总物品表。
    3、你应在总物品表中多设两个字段,1个是入库表ID,另1个是出库表的ID。
    4、在总物品表中根据出库表(或入库表)修改的ID号对总物品表中的此条记录进行更新操作。
      

  11.   

    那我是不是可以这样理解,如果DataGrid进行了更改,那我就可以进行用DataGrid1.Columns(1).Value替换掉Combo2.Text来计算我库存内这个品名的物品目前有多少剩余数量。(要计算这个品名的物品还有多少剩余数量要从入库表和出库表中计算得出)
    Private Sub DataGrid1_AfterUpdate() 
    Adodc1.CommandType = adCmdText 
    Adodc1.RecordSource = "select sum(数量) from 出库 where 品名='" + DataGrid1.Columns(1).Value + "'" 
    Adodc1.Refresh 
    Text1.Text = Val(Adodc1.Recordset.Fields(0) & "") 
    Adodc2.CommandType = adCmdText 
    Adodc2.RecordSource = "select sum(数量) from 入库 where 品名='" + DataGrid1.Columns(1).Value + "'" 
    Adodc2.Refresh 
    Text8.Text = Val(Adodc2.Recordset.Fields(0) & "") 
    Text9.Text = Val(Text8.Text) - Val(Text1.Text) 
      

  12.   

    1、你利用DataGrid 控件改写数据,必需将DataGrid与数据库中的记录集(入库表或出库表ID为自动编号)绑定。 
    2、修改了数据库中的出库表(或入库表)进而可以关联地更新数据库中的总物品表。 
    3、你应在总物品表中多设两个字段,1个是入库表ID,另1个是出库表的ID。 
    4、在总物品表中根据出库表(或入库表)修改的ID号对总物品表中的此条记录进行更新操作。
    这个程序已经在用了,如果在增加可以吗?当初开始设计的时候不会使用这种方法。
      

  13.   

    当然可以追加记录,入库时你用一个按钮弹出DataGrid1此控件,再绑定到入库表就可添加记录到数据库中的入库表,进而关联到总物品表。计算问题你可先写一个有关数据计算的程序右自动向DataGrid1中填结果。添加、更新、删除要多用几个DataGrid控件和几个按钮事件。
      

  14.   

    猴哥还在不,我这样操作,但是发现我用鼠标点击datagrid1控件修改后,程序没有在我物品总库里边坐相应的修改,能帮我看看是我代码什么地方出错吗?
    Adodc1.CommandType = adCmdText
    Adodc1.RecordSource = "select sum(数量) from 出库 where 品名='" + DataGrid1.Columns(0).Value + "'"
    Adodc1.Refresh
    Text1.Text = Val(Adodc1.Recordset.Fields(0) & "")Adodc2.CommandType = adCmdText
    Adodc2.RecordSource = "select sum(数量) from 入库 where 品名='" + DataGrid1.Columns(0).Value + "'"
    Adodc2.Refresh
    Text8.Text = Val(Adodc2.Recordset.Fields(0) & "")Text9.Text = Val(Text8.Text) - Val(Text1.Text)sql1 = "select * from 芯片库 "
    Adodc3.Recordset.Fields("货物余额") = Val(Text9.Text)
    Adodc3.Recordset.Update
    Adodc3.Refresh
      

  15.   

    就是这样。
    不过用这样的更新用绑定效率不高,最好直接用 ADODB.Connection.Execute() 直接执行一个类似下面格式的 SQL
    UPDATE 库存
       SET 数量 = (SELECT SUM(数量) FROM 入库 WHERE 品名='...') -
                  (SELECT SUM(数量) FROM 出库 WHERE 品名='...') 
     WHERE 库存.品名='...'
      

  16.   

    我现在用这种方法试了下,发现还是总物品库中没有发生变化,请问是我的代码有错吗?(我设置点击datagrid控件,将要改的物品品名显示在text5中)
    Dim sqlUpdate As String
    sqlUpdate = "update 芯片库 set 货物余额 = (select sum(数量) form 入库 where 品名=" + Text5.Text + "') - (select sum(数量) form 出库 where 品名=" + Text5.Text + "') where 品名='" + Text5.Text + "'"
    Dim rs_sumupdate As New ADODB.Recordset
    rs_sumupdate.CursorLocation = adUseClient
    rs_sumupdate.Open sqlUpdate, conn, adOpenKeyset, adLockPessimistic
      

  17.   

    我刚才试了下,我修改了DataGrid中一条数据中的数量内容,结果发现好像程序没有激活
    Private Sub DataGrid1_AfterUpdate() 事件。没有执行里边的操作,这事问什么啊?
      

  18.   

    刚才我又试了下,上次是我搞错了,在我修改DataGrid中内容后可以激活Private Sub DataGrid1_AfterUpdate() 事件但是在我用下边的代码时程序提示我下标越界,然后VB6都自动关闭了,问下论坛高手这是怎么回事啊,能帮给看看嘛?
    Private Sub DataGrid1_AfterUpdate()Adodc1.CommandType = adCmdText
    Adodc1.RecordSource = "select sum(金额) from 出库 where 品名='" + DataGrid1.Columns(0).Value + "'"
    Adodc1.Refresh
    Text11.Text = Val(Adodc1.Recordset.Fields(0) & "")Adodc2.CommandType = adCmdText
    Adodc2.RecordSource = "select sum(金额) from 入库 where 品名='" + DataGrid1.Columns(0).Value + "'"
    Adodc2.Refresh
    Text12.Text = Val(Adodc2.Recordset.Fields(0) & "")
      

  19.   

    要焦点行离开当前行才表示修改结束,才会触发 AfterUpdate。
      

  20.   

    嗯。我现在也发现了, 我现在试的可以激发AfterUpdate了, 但是激发以后运行里边的程序
    Adodc1.CommandType = adCmdText 
    Adodc1.RecordSource = "select sum(金额) from 出库 where 品名='" + DataGrid1.Columns(0).Value + "'" 
    Adodc1.Refresh 
    Text11.Text = Val(Adodc1.Recordset.Fields(0) & "") 后发现DataGrid1.Columns(0).Value中的内容不是我的物品品名,但是我DataGrid1第一列就是显示的品名啊,这是为啥啊?
      

  21.   

    Debug.Print DataGrid1.Columns(0).Value是什么?
      

  22.   

    DataGrid1.Columns(0).Value不是我更改DataGrid1内容中的物品的品名吗?
      

  23.   

    可以啊 你可以放两个 一个visible=false ,初始华时填充同样的原始数据,然后记录下当前的单元格,通过AfterUpdate(),来比较原始数据来更新,或者增加个按钮执行后统一更新,必须要设置每行唯一编码来判断
      

  24.   

    Adodc1.CommandType = adCmdText 
    Adodc1.RecordSource = "select sum(数量) from 出库 where 品名='" + DataGrid1.Columns(0).Value + "'" '关联到数据库中的表。
    '这里应写:DataGrid1中填写的内容应赋给数据库中表对应的字段(写代码)。
    Adodc1.Update '更新记录集
      

  25.   

    Adodc1.CommandType = adCmdText 
    Adodc1.RecordSource = "select sum(数量) from 出库 where 品名='" + DataGrid1.Columns(0).Value + "'" '关联到数据库中的表。 
    '这里应写:DataGrid1中填写的内容应赋给数据库中表对应的字段(写代码)。 
    Adodc1.Update '更新记录集我现在就是不知道我更新总数据库中应该是哪一条的数据,要想知道需要更新哪条数据就得先知道是对DataGrid1操作更改的是哪个物品的品名,这样才能对总物品库中这个品名的具体内容进行更新啊!我现在得到的DataGrid1.Columns(0).Value中的值好像不是品名这个字段的。
      

  26.   

    首先,AfterUpdate事件是在你焦点离开当前行后才触发
    你说DataGrid1.Columns(0).Value不是你需要的品名,你可以Debug.Print 看看,到底是什么,应该是得到当前行的第一列值
    剩下的上面几位都说了。
      

  27.   

    你的数据库中3个表没有相互关联,“入库表”,“出库表”、“总物品表”,应该在前两个表中的ID用自动编号,总物表中的每个物品有对应的“入库表ID”和“出库表ID”是表中的两个字段。这样你操作“入(或出)库表”就可以方便地操作“总物品表”,添加、更新、删除记录最好用ID。
      

  28.   

    你的数据库中3个表没有相互关联,“入库表”,“出库表”、“总物品表”,应该在前两个表中的ID用自动编号,总物表中的每个物品有对应的“入库表ID”和“出库表ID”是表中的两个字段。这样你操作“入(或出)库表”就可以方便地操作“总物品表”,添加、更新、删除记录最好用ID。
    那个ID让我给删了。。数据库中第一列就是品名。