You could also use a LEAVE TO CURRENT TRANSACTION (or LEAVE TO TRANSACTION sy-tcode. for old versions).
Else you could perform the checks in PAI (AT SELECTION-SCREEN), if check are CPU/time consuming wrap the text by a check like following sample which only check range validity if user request execution :
AT SELECTION-SCREEN ON so_range. CHECK sscrfields-ucomm EQ 'ONLI' OR sscrfields-ucomm EQ 'PRIN'. SELECT SINGLE field1 INTO workarea FROM table WHERE field1 IN so_range. IF sy-subrc NE 0. MESSAGE 'No data found for range'(900) TYPE 'E'. ENDIF.
So check will not be processed when user press ENTER. Also use the check on a ON clause like ON BLOCK so that fields keep input allowed.
Regards,
Raymond