Adventures in Groovy – Part 16: Ignore Form Save When No Data Has Been Edited
Introduction
I know you can argue this is a user issue and a training issue, but the fact is, sometimes people will save a form without editing any data. There are at least three negative issues as a result. One, the business rules and smart pushes execute, consuming unnecessary resources. Two, users may think they made changes and expect changes in the results. Three, if the processes are time consuming (like applying allocations or currency rates globally), the user will have to wait to correct the issue. There is a very simple way to stop all the processes from executing and inform the user that they haven’t made any changes.
The Code
The following will provide a template to use to accomplish the interruption of the form save. The messageBundle can be altered to be whatever is required and in as many languages as needed. If this is new to you, read Part 13 of this series.
//Setup Message Bundle def mbUs = messageBundle( ["validation.NoDataChanged":"No data was altered so no business logic was executed."]) def mbl = messageBundleLoader(["en" : mbUs]) //Create the grid and iterator objects DataGrid curgrid = operation.getGrid() GridIterator itr = curgrid.getDataCellIterator(PredicateUtils.invokerPredicate("isEdited")) // Throw an exception if no cells are edited if(!curgrid.empty && !itr.hasNext() ){throwVetoException(mbl, "validation.NoDataChanged")}
A second option would be to count the cells that have been edited. One reason to show this, as it is not my first choice, is that it could be altered for another purpose. If the number of cells edited is required, this could be used to count them.
def iCount = 0 //Setup Message Bundle def mbUs = messageBundle( ["validation.NoDataChanged":"No data was altered so no business logic was executed."]) def mbl = messageBundleLoader(["en" : mbUs]) //Iterate through the edited cells operation.grid.dataCellIterator({DataCell cell -> cell.edited}).each { iCount +=1 } // Throw an exception if no cells are edited if(iCount == 0) { throwVetoException(mbl, "validation.NoDataChanged") }
Implementing On A Form
Once the code is save as a business rule, add it to any form and run it BEFORE SAVE. This example assumes the code above is saved as GP – IsEdited.
As long as it is set to run before save and there are no cells on the form that have been altered, the user will get an error that displays whatever the message bundle represents.
Summary
This isn’t going to change your life, or make a drastic improvement for your users. But, it is a simple thing that is easy to implement that will add some polish to your application. If you have found other ways to use Groovy Calculations to add some polish to your application, please share with a comment.
Leave a Reply
Want to join the discussion?Feel free to contribute!