Hi,
I am new to creating reports in CRM 2011. I have a requirement to create a report that - list all activties
a) related to an opportunity
and b) related to the primary contact of an opportunity
and c) related to the account of the opportunity
The report should be designed to work for any selected opportunity.
MY APPROACH :
I have create a SQL query that joins the opportunity filtered view with the ActivityPointer filtered view and finds the activities for that opportunity, another SQL query that joins the opportunity and contacts filtered view to the ActivityPointer view, and another SQL query that joins the opportunity and account filtered view to the ActivityPointer view. In the end I do a UNION ALL of these three SQL queries. This resulting SQL query works perfect. I need to create a report in CRM to make the same SQL work for a selected opportunity. I am unable to do this. The steps I follwed are as follows.
Datasource Properties : Name : DataSource1
Data Source=abc-crm01;Initial Catalog=Company
Credentials: Use Windows Authentication(integrated security)
Datasets: I have created 2 datasets - Dataset1 and Dataset2
Dataset 1 provides the opportunity id to the Dataset2. Then Datset2 uses the same opportunity id to generate a list of all the activities for that opportunity id.
Dataset1 Details - Query Type: Text
Query: SELECT opportunityid, name FROM FilteredOpportunity AS opportunity0
Dataset2 Details - Query Type: Text
Query:
SELECT
CRMAF_Opp.name as Acc_Contact_Opportunity,
CRMAF_Opp.name as OpportunityName,
CRMAF_Main.activitytypecodename AS ActivityType,
CRMAF_Main.subject AS [subject],
COALESCE(CRMAF_Task.createdbyname, CRMAF_Email.createdbyname, CRMAF_Appo.createdbyname, CRMAF_Phone.createdbyname, CRMAF_Letter.createdbyname) AS Createdby,
COALESCE(CRMAF_Task.description, CRMAF_Email.description, CRMAF_Appo.description, CRMAF_Phone.description, CRMAF_Letter.description) as ActivityDescrp,
COALESCE(CRMAF_Task.statuscodename, CRMAF_Email.statuscodename, CRMAF_Appo.statuscodename, CRMAF_Phone.statuscodename, CRMAF_Letter.statuscodename) as ActivityStatus,
COALESCE(CRMAF_Task.regardingobjectidname, CRMAF_Email.regardingobjectidname, CRMAF_Appo.regardingobjectidname, CRMAF_Phone.regardingobjectidname, CRMAF_Letter.regardingobjectidname) as ActivityRegarding,
COALESCE(CRMAF_Task.scheduledstart, CRMAF_Email.scheduledstart, CRMAF_Appo.scheduledstart, CRMAF_Phone.scheduledstart, CRMAF_Letter.scheduledstart) as ScheduledStart,
COALESCE(CRMAF_Task.scheduledend, CRMAF_Email.scheduledend, CRMAF_Appo.scheduledend, CRMAF_Phone.scheduledend, CRMAF_Letter.scheduledend) as ScheduledEnd,
COALESCE(CRMAF_Task.actualstart, CRMAF_Email.actualstart, CRMAF_Appo.actualstart, CRMAF_Phone.actualstart, CRMAF_Letter.actualstart) as ActualStart,
COALESCE(CRMAF_Task.actualend, CRMAF_Email.actualend, CRMAF_Appo.actualend, CRMAF_Phone.actualend, CRMAF_Letter.actualend) as ActualdEnd
FROM FilteredActivityPointer AS CRMAF_Main
INNER JOIN FilteredOpportunity AS CRMAF_Opp ON CRMAF_Main.regardingobjectid = CRMAF_Opp.opportunityid
LEFT JOIN FilteredTask AS CRMAF_Task ON CRMAF_Main.activityid = CRMAF_Task.activityid
LEFT JOIN FilteredEmail AS CRMAF_Email ON CRMAF_Main.activityid = CRMAF_Email.activityid
LEFT JOIN FilteredAppointment AS CRMAF_Appo ON CRMAF_Main.activityid = CRMAF_Appo.activityid
LEFT JOIN FilteredPhoneCall AS CRMAF_Phone ON CRMAF_Main.activityid = CRMAF_Phone.activityid
LEFT JOIN FilteredLetter AS CRMAF_Letter ON CRMAF_Main.activityid = CRMAF_Letter.activityid
WHERE CRMAF_Opp.opportunityid = (@CRM_SelectedOpportunity)
union all
SELECT
CRMAF_Con.fullname as Acc_Contact_Opportunity,
CRMAF_ConOpp.name as OpportunityName,
CRMAF_Main.activitytypecodename AS ActivityType,
CRMAF_Main.subject AS [subject],
COALESCE(CRMAF_Task.createdbyname, CRMAF_Email.createdbyname, CRMAF_Appo.createdbyname, CRMAF_Phone.createdbyname, CRMAF_Letter.createdbyname) AS Createdby,
COALESCE(CRMAF_Task.description, CRMAF_Email.description, CRMAF_Appo.description, CRMAF_Phone.description, CRMAF_Letter.description) as ActivityDescrp,
COALESCE(CRMAF_Task.statuscodename, CRMAF_Email.statuscodename, CRMAF_Appo.statuscodename, CRMAF_Phone.statuscodename, CRMAF_Letter.statuscodename) as ActivityStatus,
COALESCE(CRMAF_Task.regardingobjectidname, CRMAF_Email.regardingobjectidname, CRMAF_Appo.regardingobjectidname, CRMAF_Phone.regardingobjectidname, CRMAF_Letter.regardingobjectidname) as ActivityRegarding,
COALESCE(CRMAF_Task.scheduledstart, CRMAF_Email.scheduledstart, CRMAF_Appo.scheduledstart, CRMAF_Phone.scheduledstart, CRMAF_Letter.scheduledstart) as ScheduledStart,
COALESCE(CRMAF_Task.scheduledend, CRMAF_Email.scheduledend, CRMAF_Appo.scheduledend, CRMAF_Phone.scheduledend, CRMAF_Letter.scheduledend) as ScheduledEnd,
COALESCE(CRMAF_Task.actualstart, CRMAF_Email.actualstart, CRMAF_Appo.actualstart, CRMAF_Phone.actualstart, CRMAF_Letter.actualstart) as ActualStart,
COALESCE(CRMAF_Task.actualend, CRMAF_Email.actualend, CRMAF_Appo.actualend, CRMAF_Phone.actualend, CRMAF_Letter.actualend) as ActualdEnd
FROM FilteredActivityPointer AS CRMAF_Main
INNER JOIN FilteredContact AS CRMAF_Con ON CRMAF_Main.regardingobjectid = CRMAF_Con.contactid
INNER JOIN FilteredOpportunity as CRMAF_ConOpp ON CRMAF_ConOpp.cw_primarycontactid = CRMAF_Con.contactid
LEFT JOIN FilteredTask AS CRMAF_Task ON CRMAF_Main.activityid = CRMAF_Task.activityid
LEFT JOIN FilteredEmail AS CRMAF_Email ON CRMAF_Main.activityid = CRMAF_Email.activityid
LEFT JOIN FilteredAppointment AS CRMAF_Appo ON CRMAF_Main.activityid = CRMAF_Appo.activityid
LEFT JOIN FilteredPhoneCall AS CRMAF_Phone ON CRMAF_Main.activityid = CRMAF_Phone.activityid
LEFT JOIN FilteredLetter AS CRMAF_Letter ON CRMAF_Main.activityid = CRMAF_Letter.activityid
WHERE CRMAF_ConOpp.opportunityid = (@CRM_SelectedOpportunity)
union all
SELECT
CRMAF_Acc.name as Acc_Contact_Opportunity,
CRMAF_AccOpp.name as OpportunityName,
CRMAF_Main.activitytypecodename AS ActivityType,
CRMAF_Main.subject AS [subject],
COALESCE(CRMAF_Task.createdbyname, CRMAF_Email.createdbyname, CRMAF_Appo.createdbyname, CRMAF_Phone.createdbyname, CRMAF_Letter.createdbyname) AS Createdby,
COALESCE(CRMAF_Task.description, CRMAF_Email.description, CRMAF_Appo.description, CRMAF_Phone.description, CRMAF_Letter.description) as ActivityDescrp,
COALESCE(CRMAF_Task.statuscodename, CRMAF_Email.statuscodename, CRMAF_Appo.statuscodename, CRMAF_Phone.statuscodename, CRMAF_Letter.statuscodename) as ActivityStatus,
COALESCE(CRMAF_Task.regardingobjectidname, CRMAF_Email.regardingobjectidname, CRMAF_Appo.regardingobjectidname, CRMAF_Phone.regardingobjectidname, CRMAF_Letter.regardingobjectidname) as ActivityRegarding,
COALESCE(CRMAF_Task.scheduledstart, CRMAF_Email.scheduledstart, CRMAF_Appo.scheduledstart, CRMAF_Phone.scheduledstart, CRMAF_Letter.scheduledstart) as ScheduledStart,
COALESCE(CRMAF_Task.scheduledend, CRMAF_Email.scheduledend, CRMAF_Appo.scheduledend, CRMAF_Phone.scheduledend, CRMAF_Letter.scheduledend) as ScheduledEnd,
COALESCE(CRMAF_Task.actualstart, CRMAF_Email.actualstart, CRMAF_Appo.actualstart, CRMAF_Phone.actualstart, CRMAF_Letter.actualstart) as ActualStart,
COALESCE(CRMAF_Task.actualend, CRMAF_Email.actualend, CRMAF_Appo.actualend, CRMAF_Phone.actualend, CRMAF_Letter.actualend) as ActualdEnd
FROM craneware.dbo.FilteredActivityPointer AS CRMAF_Main
INNER JOIN FilteredAccount AS CRMAF_Acc ON CRMAF_Main.regardingobjectid = CRMAF_Acc.accountid
INNER JOIN FilteredOpportunity as CRMAF_AccOpp ON CRMAF_AccOpp.accountid = CRMAF_Acc.accountid
LEFT JOIN FilteredTask AS CRMAF_Task ON CRMAF_Main.activityid = CRMAF_Task.activityid
LEFT JOIN FilteredEmail AS CRMAF_Email ON CRMAF_Main.activityid = CRMAF_Email.activityid
LEFT JOIN FilteredAppointment AS CRMAF_Appo ON CRMAF_Main.activityid = CRMAF_Appo.activityid
LEFT JOIN FilteredPhoneCall AS CRMAF_Phone ON CRMAF_Main.activityid = CRMAF_Phone.activityid
LEFT JOIN FilteredLetter AS CRMAF_Letter ON CRMAF_Main.activityid = CRMAF_Letter.activityid
WHERE CRMAF_AccOpp.opportunityid = (@CRM_SelectedOpportunity)
ORDER BY Acc_Contact_Opportunity, CRMAF_Main.activitytypecodename
Parameter details of Dataset2: Parameter name: @CRM_SelectedOpportunity Parameter Value: [@CRM_SelectedOpportunity]
Report Parameters : Name: CRM_SelectedOpportunity
Prompt: Selected Opportunity
Data type: text Tick - Allow blank value Tick : Allow null value Select parameter visibility :Visible
Available Values: 'Get value from query' Dataset : DataSet1(select from dropdown) Value field: opportunityid(select from dropdown) Label field : name(select from dropdown)
Default Values: 'Get value from query' Dataset : DataSet1(select from dropdown) Value field: opportunityid(select from dropdown) Label field : name(select from dropdown)
Then I design a table on the Report Layout with the fields from the Dataset2 and preview it in VisualStudio.
I get the 'Selected Opportunity' parameter prompt for a dropdown that lists all the opportunity names correctly. I select one opportunity and click '' View Report'.
The report displays the list of all activities correctly. This proves my SQL query of DataSet2 is perfect.
My big problem is how to customise this report to work in CRM.
Can anyone help me by telling the steps to follow to change this above mentioned report to work for a particular record in CRM ???
Cheers!