The only other option that I know is to transfer functions to stored procedures or database functions. This is actually the best implementation (in general) since Crystal Reports client report processing is much slower than SQL Server. therefore, your pass or failure will become a function or stored procedure, or even using case statuses in Select Query.
A good rule of thumb with crystal reports is to smooth the dataset as much as possible before returning the dataset to Crystal. This will allow you to use the power of the database server before relying on the client to handle processing. An ideal example is to return 1 million lines to the client, but smooth it to display only the results from 5 groups. A crystal will suppress a 1 million row sample before it can process the totals.
source share