hur.cn - 华软网

 热门搜索

请问高手一个主从表更新的问题

  作者:未知    来源:网络    更新时间:2018/6/13
我做了一个出库单的表单,
数据库:MS_SQL

主表:T_HDR对应的数据窗口dw_edit
从表:T_DTL对应的数据窗口dw_grid

主表没有触发器
从表有一个触发器For insert,作用是当有明细记录插入时,根据明细的数量更新库存表

问题是:T_DTL触发器执行正确,遇到错误不会在T_DTL中增加记录,但是主表里的记录依然添加.

我该怎样处理这个问题?

PB里的保存代码如下:
If dw_edit.update() = 1 and dw_grid.update() = 1 then
COMMIT USING SQLCA;
f_msgbox(1,'00012')
Return true
Else
ROLLBACK USING SQLCA;
f_msgbox(1,'00013')
Return false
End If
------华软网友回答------
问题提清楚点。。。

“T_DTL触发器执行正确,遇到错误不会在T_DTL中增加记录,但是主表里的记录依然添加.”怎么也看不明白!
主从表和触发器有什么关系?
------华软网友回复------
在向数据库中增加一条新的出库单,t_hdr保存头文件内容,t_dtl保存明细内容,是一个典型的单据录入窗口.如果作过类似的模块,一定很清楚.

我只需要检测t_dtl里面是否有插入新纪录,
如果有,则吧明细的数量添加到,库存表即可,添加成功,添加成功,则主表的添加也有效.
反之,如果库存数量更新不成功,则明细表t_dtl记录添加撤销,主表t_hdr的添加也撤销
------华软网友回复------
If dw_edit 提交成功 then
  if dw_grid 提交成功 then
    commit;
  else
    ROLLBACK 
  end if
else
  ROLLBACK 
end if


------华软网友回复------
谢谢楼上的兄弟,应该先dw_grid,再dw_edit
If dw_grid 提交成功 then
  if dw_edit 提交成功 then


但是还是有问题,当t_dtl插入记录错误时,该表确实没有增加记录,但是主表的记录依然添加
也就是说,t_dtl的触发器不管是成功还是失败,dw_grid.update()都等于1,那么自然会执行dw_edit.edit.update()

t_dtl的触发器如下:
CREATE TRIGGER trig_delivery_insert ON t_dtl
FOR INSERT
AS

begin
Declare @companyid char(10),@id char(20)
Declare @count1 int,@count2 int

Begin Transaction

UPDATE t_item set res_qty = res_qty + T.sum_qty 
FROM (SELECT companyid,item_id,sum_qty = SUM(qty)
FROM inserted
GROUP BY id,companyid,item_id) T 
WHERE t_item.companyid = T.companyid and t_item.id = T.item_id
Select @count1 = @@rowcount

UPDATE t_stock set res_qty = res_qty + T.sum_qty 
FROM (SELECT companyid,item_id,lot_id,sum_qty = SUM(qty)
FROM inserted
GROUP BY id,companyid,item_id,lot_id) T 
WHERE t_stock.companyid = T.companyid and t_stock.item_id = T.item_id And t_stock.lot_id = T.lot_id

Select @count2 = @@rowcount

If @count1 = 0 Or @count2 = 0
Begin 
rollback transaction
Return
End
Else
Begin
Commit transaction
End
End




------华软网友回复------
.........................
GetItemStatus(row,column,dwbuffer)函数判断行的修改状态。
如:dw_grid 的第一行是新插入并修改过的行,可用下面语句判断
if dw_grid.getitemstatus(1,0,Primary!) = NewModified! 

     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。