一個入庫的主副表,新增,保存,刪除數据都出錯,數据庫是ms sql"找不到要更新的资料列,最后读取的值已经变更"由於數据庫有触發器,刪除后一切正常如何解決這個問題

解决方案 »

  1.   

    应该是并发更新导致,上一个更新没保存,对同一条记录又更新,会有这样的提示。
    可以通过timestamp类型的附加字段解决。或者用锁。
      

  2.   

    REATE TRIGGER purproductdetail_insert ON dbo.purproductdetail 
    FOR INSERT
    AS
     /*更新amstock*/   
              UPDATE A SET
               qty = A.qty +I.qty
               FROM amstock  AS A  INNER JOIN (select materialID,materialID1,warehouseID,sum(qty) as qty from Inserted group by materialID,materialID1,warehouseID) AS I
               ON A.materialID = I.materialID and  A.materialID1 = I.materialID1 and A.warehouseID=I.warehouseID           insert into amstock (materialID,materialID1,qty,warehouseID)
               select materialID,materialID1,sum(qty) as qty,warehouseID from  Inserted I
               where not exists (
                  select 1  FROM amstock  AS A  where A.materialID = I.materialID and  A.materialID1 = I.materialID1 and  A.warehouseID=I.warehouseID
                )
                group by materialID,materialID1,warehouseID
     /*更新amdate*/    
              UPDATE M SET
               mdate =I.mdate
               FROM amdate  AS M  INNER JOIN (SELECT Inserted.materialID,Inserted.materialID1,max(purproductmaster.purchasedate) AS mdate
               FROM   purproductmaster INNER JOIN  Inserted  ON  purproductmaster.purchaseID = Inserted .purchaseID GROUP BY  Inserted.materialID,Inserted.materialID1) AS I
               ON M.materialID = I.materialID and M.materialID1 = I.materialID1
               Where M.mdate<I.mdate            insert into amdate (materialID,materialID1,mdate)
               SELECT Inserted.materialID,Inserted.materialID1,max(purproductmaster.purchasedate) AS mdate
               FROM   purproductmaster INNER JOIN  Inserted  ON  purproductmaster.purchaseID = Inserted .purchaseID 
               where not exists ( select 1  FROM amdate  AS M  where M.materialID = Inserted.materialID and M.materialID = Inserted.materialID )
              GROUP BY  Inserted.materialID,Inserted.materialID1
      

  3.   

    問題是不是出在這,先把副表保存了,后保存主表,而触發器是在副表里void __fastcall TFrbillbase::ado_tableBeforePost(TDataSet *DataSet)
    {  adodetail->UpdateBatch();
      adodetail->DataSource=dstable;
     if(dm->ADOC->InTransaction)
        {
           dm->ADOC->CommitTrans();
          }
    }
      

  4.   

    晕倒,你的触发器涉及的东西太多,我又不知道业务,你大概解释一下吧
    你是附表有insert触发器,你在附表insert的时候要做些什么? 解释一下
      

  5.   

    主表:purproductmaster
    3 purchaseID nvarchar 20 0
    0 purchasedate datetime 8 0
    0 supplierID nvarchar 20 0
    0 employeeID nvarchar 4 1
    0 rem nvarchar 40 1從表:purproductdetail1 purchaseID nvarchar 20 0
    0 pno nvarchar 20 1
    0 invID nvarchar 10 1
    0 warehouseID nvarchar 20 1
    0 materialID nvarchar 20 0
    0 materialID1 nvarchar 10 1
    0 purchasedetailID int 4 1
    0 qty decimal 9 1
    0 price decimal 9 1
    0 price1 decimal 9 1
    0 money decimal 9 1
    0 money1 decimal 9 1
    0 rem nvarchar 20 1
    庫存表: amstock
    1 materialID nvarchar 20 0
    0 materialID1 nvarchar 10 0
    0 warehouseID nvarchar 20 0
    0 QTY decimal 9 1
    0 price decimal 9 1
    0 price1 decimal 9 1
    0 money decimal 9 1
    0 money1 decimal 9 1每次新時都出錯:找不到要更新的资料列,最后读取的值已经变更
      

  6.   

    看了一下,update语句里面好像不能有join的吧?
    就像我们写这样的句子,在界面里面不能修改数据一样的到了
      

  7.   

    REATE TRIGGER purproductdetail_insert ON dbo.purproductdetail 
    FOR INSERT
    AS
    SET NOCOUNT ON
    ...
      

  8.   

    to: madyak(无天) 
    能不能說詳細點,謝謝!!!!!!!1
      

  9.   

    madyak的意思就是在你的tigger的执行语句的前后加上
    set nocount on 
    set nocount off
    像这样:REATE TRIGGER purproductdetail_insert ON dbo.purproductdetail 
    FOR INSERT
    AS
    SET NOCOUNT ON
    ...这中间是你在tigger中要做的事
    SET NOCOUNT OFF
      

  10.   

    不好意思,好几天没有上来。原理是这样的,默认情况下,会返回影响的行数,由于有了触发器,返回的行数与DELPHI中的SQL应该返回的行数不一致。所以会出现问题。
    把SQL Server的这个功能关闭就解决了。