PROC CopyUpdate LOCAL llReturn SELECT MyTable2 && assume order set to PK SEEK MyTable1.PK IF FOUND() REPL Field1 WITH MyTable1.Field1, ; Field2 WITH MyTable1.Field2, ; Field3 WITH MyTable1.Field3, ; Field4 WITH MyTable1.Field4 llReturn = .T. ELSE llReturn = .F. ENDIF SELECT MyTable1 RETURN llReturn PROC CopyInsert INSERT INTO MyTable2 ( PK, Field1, Field2, Field3, Field4) ; VALUES (PK, Field1, Field2, Field3, Field4) RETURN .T. PROC CopyDelete LOCAL llReturn SELECT MyTable2 && assume order set to PK SEEK MyTable1.PK IF FOUND() DELETE llReturn = .T. ELSE llReturn = .F. ENDIF SELECT MyTable1Obviously, you'll need code for buffering and messaging, but that should give you an idea.