>Function TableB_Trigger >m.Id_A = TableB.Id_A >m.Id_B = TableB.Id_B >Select Sum(Total_B) From TableB Where Id_B = m.Id_B Into Array Total_A >m.Total_A = Iif(Type("Total_A[1]")#"N",0,Total_A[1]) >Update Table_A Where Id_A = m.Id_A Set Total_A = m.Total_A >>
function TableB_Trigger(TriggerType) local Success, Ids[2], Delta[2], AliasName, s, i Success = .T. AliasName = sys(2015) do case case TriggerType == 'I' && for insert Ids[1] = Id_A Delta[1] = Total_B Case TriggerType == 'U' && for update DO case case oldval('Id_A') == Id_A && key not changed Ids[1] = Id_A Delta[1] = - oldval('Total_B') + Total_b otherwise Ids[1] = oldval('Id_A') Delta[1] = - oldval('Total_B') Ids[2] = Id_a Delta[2] = Total_B endcase case TriggerType = 'D' && for delete Ids[1] = oldval('Id_A') Delta[1] = - oldval('Total_B') otherwise assert .F. Success = .F. endcase do case case !Success case empty(Delta[1]) and empty(Delta[2]) && nothing to do otherwise use Table_A in 0 alias (AliasName) order Id && order of Id_A s = select(0) select (AliasName) for i = 1 to 2 do case case !Success case empty(Delta[i]) case seek(Ids[i]) do case case !_TriggerLockRecord() Success = .F. otherwise repl Total_A with Total_a + Delta[i] Success = Success and _TriggerTableUpdate() =_TriggerUnLockRecord() endcase otherwise insert into (AliasName) (Id_a, Total_a) values (Ids[i], Delta[i]) Success = Success and _TriggerTableUpdate() endcase endfor use in (AliasName) select (s) endcase return Success endfunc *--------------------------------------------------------------------------- function _TriggerTableUpdate() do case case (CursorGetProp('Buffering') > 1) do case case !TableUpdate() =TableRevert() return FALSE endcase endcase endfunc *--------------------------------------------------------------------------- && change for deadlocks function _TriggerLockRecord() local Success Success = TRUE do case case (IsRLocked() and !Deleted()) Success = FALSE case !RLock() Success = FALSE endcase do case case !Success local msg, _table _table = CursorGetProp('SourceName') msg = 'Cannot lock record in ' + _table =_TriggerError(-1, 'Cannot lock record', '', '', msg, ; _Table, '', '', '' ) endcase return Success endfunc *--------------------------------------------------------------------------- function _TriggerUnLockRecord() unlock record (recno()) endfunc *---------------------------------------------------------------------------I would use a view. Much simpler