 <p>I think you need to rethink your design!</p> <p>"Undo" implies that a transaction is open and that specific transaction is rolled back. You can do this for instance by encapsulating your entire GUI in a transaction but that is bad practice. It will give long transactions, locking issues, bi-file growth and potential crashes if somebody leaves their session open. Not a good idea - you want to make your transactions small!</p> <p>You need to look into a more service based approach. For instance:</p> <ul> <li><p>When the interface loads you load the records your interested into a temp-table.</p></li> <li><p>When you click "add," "update", "delete" etc you make changes to these records. "Add" creates a new record in the temp-table, "update" makes changes to a record and delete deletes (or marks for delete) records in the temp-table.</p></li> <li><p>When clicking "save" you first check that no records are changed in the database, if not you save the changes from the temp-tables into the database. If they are changed you might want to alert the user. </p></li> <li><p>When clicking "cancel" you just exit and disregard the changes.</p></li> </ul> <p>You can get support for parts of this way of by working utilizing datasets. Read up on those! </p> <p><a href="https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dvpds/preface.html#" rel="nofollow">https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/dvpds/preface.html#</a></p>