Ok. The only way I know of to do this type of report is through a separate application unless you're only talking about a couple of fields (2 or 3 at most.) You need to decide up front what the maximum number of fields you'll allow the users to select.
1. Create two report tables with the following structure (ALL fields are String/VarChar fields except Report_ID which is numeric.):
Report_Header
Report_ID
Field1_Label
Field2_Label
Field3_Label
...
FieldN_Label
Report_Data
Report_ID
Field1
Field2
Field3
...
FieldN
If the report must be run through BO, these tables will be in your database. If it will just be run through your application, they can be in-memory tables (ADO.NET dataset in Visual Studio.)
2. Write an application where the user can select which fields to include in the report. When the user runs the report, the application will fill the tables with data from the selected fields only, in the order in which the fields were selected - one record in Report_Header for the column titles and one or more records in the Report_Data table.
3. Create a report off of the two report tables. Link from Report_Header to Report_Data on the Report_ID field. Use the Report_Header values to show column labels. On each header and data field on the report, put something like the following suppress formula (N is the number of the field you're working with):
IsNull({Report_Header.FieldN_Label})
This way, if the user doesn't select fields for all possible columns on the report, the ones not selected won't appear on the report.
Once your application extracts the data, it will also schedule the report in BO (if that's what you need) OR it can display the report in the CrystalViewer component inside the application itself.
-Dell