> >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 >