Very often you will need to design a certain amount of user-specified flexibility into your SQL Reports, similar to that which is done through options in with Crystal Reports. Control's SQL Reports allow you to build options that dynamically build a dialog for the user when running the report. This functionality is similar to, though not identical to, the options in Crystal Reports.
===== Option Syntax =====
==== Discrete Options ====
<%Employee%>
<%Effective_Date%>
<%Customer%>
<%Station%>
==== Collection Options ====
<%EmployeeSET%>
<%CustomerSET%>
<%StationSET%>
<%OrderSET%>
Notes:
* Collections are created by including SET in the name at the end as shown in the examples above. You can name the parameters anything you like such as <%ProductSET%>. When SET is included Control will pass a comma delimited list of ID to the SQL query prior to it being executed on the database. You can verify this by running a simple query like.
-- Run just this one line below in your SQL Report and set the Parameter Type on the Options tab of the SQL Report to Product. Select 2 or 3 products from the list and run the report.
SELECT <%ProductSET%>;
* When the above is actually query is actually executed SQL will see the query as
SELECT 1,2,3
* At times, you may to have your list of values passed by your Collection (SET) to be displayed in a table fashion. This can be accomplished by utilizing the function below.
SELECT * FROM dbo.CrystalListToIntTable( '<%ProductSET%>' );
-- This would give you 1 value per line in a table format when executed.
* You can also select from a set of standard variables data types such as Date, Date & Time, Order Number, Employees Lists and Products Lists that will be selectable at runtime.
{{:screen_shot_2018-04-23_at_3.50.27_pm.png?nolink&}}
==== Range Options ====
<%Report_DateSTART%>
<%Report_DateEND%>
===== Setting the Option Type in Control =====
===== Examples =====
==== Exporting An Employees Calendar to Outlook ====
DECLARE @CalendarID INT;
DECLARE @MinDate datetime; -- Set the absolute earliest date you want to query
DECLARE @MaxDate datetime; -- Set the absolute latest date you want to query
SET @CalendarID = <%Employee%>;
SET @MinDate = ISNULL(CONVERT(DateTime, <%Export_DateSTART%>),'1/1/1900');
SET @MaxDate = ISNULL(CONVERT(DateTime, <%Export_DateEND%>),'1/1/2100');
DECLARE @ZeroDate DATE;
DECLARE @Delimiter VARCHAR(7);
DECLARE @AddressDelimiter VARCHAR(7);
SET @ZeroDate = '12/30/1900';
SET @Delimiter = ' //'+CHAR(13)+CHAR(10);
SET @AddressDelimiter = ', ';
SELECT
J.ID AS [KeyID],
CONVERT( VARCHAR(10), COALESCE(J.StartDateTime, J.QueryStartDateTime), 101) AS [START DATE],
CONVERT( VARCHAR(12), CONVERT(TIME, CASE WHEN (CA.AllDayEvent=1 OR CA.IsTimeless=1) THEN '00:00' ELSE COALESCE(J.StartDateTime, J.QueryStartDateTime) END), 0 ) AS [START TIME],
J.Description AS [Subject],
RTrim(Address.StreetAddress1 + COALESCE(' ' + Address.StreetAddress2, ''))
+ @AddressDelimiter + COALESCE(Address.City + ', ', '') + COALESCE(Address.State + ' ', '') + COALESCE(Address.PostalCode, '')
+ ' (' + Account.CompanyName + ')'
AS [Location],
Account.CompanyName
+ ' (' + AC.FirstName + ' ' + AC.LastName
+ COALESCE(' ' + Phone.FormattedText, '') + ') '
AS [Meeting Organizer],
'Company: '+ Account.CompanyName
+ @Delimiter + 'Contact: ' + (AC.FirstName + ' ' + AC.LastName)
+ @Delimiter + 'Phone: ' + Phone.FormattedText
+ @Delimiter + 'Employee: ' + Employee.LastName +', '+Employee.FirstName
+ @Delimiter + 'Notes: ' + CAST(J.Notes AS VARCHAR(1024))
AS [Description],
CONVERT( VARCHAR(10), COALESCE(J.EndDateTime, J.QueryEndDateTime), 101) AS [END DATE],
CONVERT( VARCHAR(12), CONVERT(TIME, CASE WHEN (CA.AllDayEvent=1 OR CA.IsTimeless=1) THEN '23:59:59.9' ELSE COALESCE(J.EndDateTime, J.QueryEndDateTime) END), 0 ) AS [END TIME],
CASE WHEN (CA.AllDayEvent=1 OR CA.IsTimeless=1) THEN 'TRUE' ELSE 'FALSE' END AS [ALL DAY Event],
CASE WHEN J.ReminderPrompt = 1 THEN 'TRUE' ELSE 'FALSE' END AS [Reminder ON/Off],
CASE WHEN J.ReminderPrompt=0 THEN NULL ELSE CAST(J.ReminderDateTime AS DATE) END AS [Reminder DATE],
CASE WHEN J.ReminderPrompt=0 THEN NULL ELSE CAST(J.ReminderDateTime AS TIME) END AS [Reminder TIME],
CASE WHEN CA.PrivateEvent = 1 THEN 'TRUE' ELSE 'FALSE' END AS [Private],
CA.PriorityText AS [Priority],
Employee.LastName +', '+Employee.FirstName AS [Employee Name],
Account.CompanyName AS [Company Name],
(AC.FirstName + ' ' + AC.LastName) AS [Contact Name],
Phone.FormattedText AS [Phone NUMBER],
J.Notes AS [Notes ONLY],
@CalendarID AS CalendarID,
J.ModifiedDate AS [LAST Modified],
J.AccountID AS AccountID,
J.TransactionID AS TransHeaderID,
J.ID AS JournalID
FROM
Journal J
JOIN ContactActivity CA ON J.ID = CA.ID
JOIN CalendarLink CL ON J.ID = CL.JournalID
LEFT JOIN TransHeader TH ON J.TransactionID = TH.ID
LEFT JOIN Account ON J.AccountID = Account.ID
LEFT JOIN AccountContact AC ON J.ContactID = AC.ID
LEFT JOIN Employee ON CL.CalendarID = Employee.ID
LEFT JOIN Address ON COALESCE(AC.ShippingAddressID, Account.BillingAddressID) = Address.ID
LEFT JOIN PhoneNumber Phone ON COALESCE(AC.MainPhoneNumberID, Account.MainPhoneNumberID) = Phone.ID
WHERE
EmployeeID = @CalendarID
AND J.QueryStartDateTime BETWEEN @MinDate AND @MaxDate
AND J.CompletedDateTime IS NULL
-- There is no field to save whether this record was exported or not.
-- In order to put this some place, we are going to use two depricated integer fields in the CalendarLink table.
-- The CalendarStoreID will store the days from the "Zero Date" since the activity was last modified.
-- The JournalStoreID will store the minutes from midnight since the activity was last modified.
-- After the export we will need to run a query to set these values!
AND ( (J.ModifiedDate - COALESCE(CL.CalendarStoreID, 0) > @ZeroDate)
OR (DatePart(HOUR, J.ModifiedDate) * 24 + DatePart(MINUTE, J.ModifiedDate) > COALESCE(CL.JournalStoreID, 0)) )
===Tags===
SQL Report Parameters Variables