* procedure Class.UpdateAllTables lparameters llForceOverwrite ... BEGIN TRANSACTION llCont = .T. for i=1 to alen(this.aTableList,1) llCont = this.TryToUpdateData(this.aTableList[i],llForceOverwrite) if !llCont gcModifiedTabe = this.aTableList[i] && notofy by some way which table is not updated exit endif endfor if llCont END TRANSACTION else ROLLBACK endif ... return llContTryToUpdateData - updates a single table in the "force" mode passed as a parameter. In the main routine you call the UpdateAllTables routine as many times as needed. First time call it with parameter = .F. When some tableupdate() fail in the TryToUpdateData method, transaction will rollback and that returns all buffers to the state before the BEGIN TRANSACTION. Then call second time with "force" option = .T. In the TryToUpdateData you will check specially if table is not changed again using timestamp:
.... if FSIZE("tTimeStamp")>0 AND llForceOverwrite && if timestamp field exists, do this only when && we're going to overwrite ltTimeStamp = CurVal(tTimeStamp) refresh() && after this CurVal() will return the lates values if ltTimeStamp<>CurVal(tTimeStamp) return .F. && again, we cannot update because record is changes in the moment between && first try and this moment endif endif ....HTH.