DEFINE CLASS CursorStorage As Collection sourcecursorname='' PROCEDURE Init( cSourceCursorName As String ) THIS.sourcecursorname=m.cSourceCursorName PROCEDURE Destroy * clean up on exit DO WHILE THIS.Count > 0 THIS.Remove(1) ENDDO PROCEDURE AddVersion LOCAL oCursorVersion oCursorVersion = CREATEOBJECT('CursorVersion', THIS.sourcecursorname) THIS.Add(oCursorVersion) PROCEDURE RestoreVersionByDateTime( tDateTime As DateTime ) * scan collection until a member with the closest datetime found * and run its Restore method ENDDEFINE DEFINE CLASS CursorVersion As Relation created=DATETIME() cursorname=<generate a unique name for cursor, use SYS(2015), GUID etc.) PROCEDURE Init( cSourceCursorName ) THIS.sourcecursorname=m.cSourceCursorName SELECT * FROM (THIS.sourcecursorname); INTO CURSOR ( THIS.cursorname ) NOFILTER *PROCEDURE Restore( cTargetCursor As String ) PROCEDURE Restore * check if THIS.cursorname still exists SELECT * FROM (THIS.cursorname); INTO CURSOR ( THIS.sourcecursorname ) NOFILTER PROCEDURE Destroy * clean up on exit IF USED( THIS.cursorname ) USE IN (THIS.cursorname) ENDIF ENDDEFINE