Reputation: 619
I made a SQL-based report in Visual Studio 2008 and uploaded it to the CRM. I indicated that you can only run it on "Forms for related record types". I thought this would generate 1 report for the current record you are in.
This isn't the case. It generates a report for each record of the specific entity (Order), 1 record per page in the report.
I know I have to use Data-Prefiltering (automatic or specific?), but there are no good examples online and there is even a thread here on stackoverflow but I jsut can't figure it out.
Link to thread: CRMAF Filtering in CRM 2011
SELECT FilteredSalesOrder.customerid AS x1, FilteredAccount.accountid AS x2, FilteredSalesOrderDetail.salesorderid AS x3, FilteredSystemUser.systemuserid AS x4,
FilteredProduct.productid AS x5, FilteredAccount.address1_city, FilteredAccount.address1_line1, FilteredAccount.address1_postalcode, FilteredAccount.name AS AccountName,
FilteredSalesOrder.ordernumber, FilteredSalesOrderDetail.quantity, FilteredSystemUser.fullname, FilteredProduct.fmcg_erpreference, FilteredProduct.name AS ProductName
FROM FilteredSalesOrder INNER JOIN FilteredAccount
ON FilteredSalesOrder.customerid = FilteredAccount.accountid INNER JOIN FilteredSalesOrderDetail
ON FilteredSalesOrderDetail.salesorderid = FilteredSalesOrder.salesorderid INNER JOIN FilteredProduct
ON FilteredProduct.productid = FilteredSalesOrderDetail.productid INNER JOIN FilteredSystemUser
ON FilteredSystemUser.systemuserid = FilteredSalesOrder.ownerid
To pre-filter the data only to use the current Order:
FROM FilteredSalesOrder AS CRMAF_FilteredSalesOrder INNER JOIN FilteredAccount
EDIT:
This is my new entire SQL where I used the CRMAF_ on FilteredSalesOrder. But alas it does not work. It still gives me only the opportunity to run it against all records, and thus generates all the Salesorders that exist (luckily there are not that many).
SELECT CRMAF_FilteredSalesOrder.customerid AS x1, CustomerAccount.accountid AS x2,
FilteredSalesOrderDetail.salesorderid AS x3, FilteredSystemUser.systemuserid AS x4,
FilteredProduct.productid AS x5,CRMAF_FilteredSalesOrder.fmcg_supplierid as x6,
CustomerAccount.address1_city as customerCity, CustomerAccount.address1_line1 as
customerStreet1, CustomerAccount.address1_postalcode as customerPostalCode,
CustomerAccount.name AS CustomerAccountName, CRMAF_FilteredSalesOrder.ordernumber,
FilteredSalesOrderDetail.quantity, FilteredSystemUser.fullname,
FilteredProduct.fmcg_erpreference, FilteredProduct.name AS ProductName,
SupplierAccount.name as supplierAccountName, SupplierAccount.address1_city AS
supplierCity,SupplierAccount.address1_line1 as supplierStreet1,
SupplierAccount.address1_postalcode as supplierPostalCode,
CRMAF_FilteredSalesOrder.requestdeliveryby, CRMAF_FilteredSalesOrder.createdon
FROM FilteredSalesOrder AS CRMAF_FilteredSalesOrder INNER JOIN FilteredAccount AS CustomerAccount
ON CRMAF_FilteredSalesOrder.customerid = CustomerAccount.accountid INNER JOIN FilteredSalesOrderDetail
ON FilteredSalesOrderDetail.salesorderid = CRMAF_FilteredSalesOrder.salesorderid INNER JOIN FilteredProduct
ON FilteredProduct.productid = FilteredSalesOrderDetail.productid INNER JOIN FilteredSystemUser
ON FilteredSystemUser.systemuserid = CRMAF_FilteredSalesOrder.ownerid INNER JOIN FilteredAccount AS SupplierAccount
ON CRMAF_FilteredSalesOrder.fmcg_supplierid = SupplierAccount.accountid
Solution: Deleted Report and redeployed it.
Upvotes: 2
Views: 7240
Reputation: 485
See Sample: Make a Report Context-Sensitive on MSDN.
You only need to filter on the current SalesOrder.
The documentation on automatic prefiltering in CRM 2011 is sparse, however, I think it hasn't changed much between CRM 2011 and CRM 4. So please refer to Using Filters in a Report on MSDN regarding SSRS reports in CRM 4 for a better explanation.
What I often use in reports are parameters like CRM_FilteredSalesOrder
combined with a SQL query like the following:
EXEC('
SELECT FSO.*
FROM (' + @CRM_FilteredSalesOrder + ') AS FSO
')
It is the same principle as automatic prefiltering, but now you control where the prefilter is inserted. Also remember that an automatic prefilter can't be used more than once in a single query in an SSRS report.
EDIT: OK, let me just literally use your example:
EXEC('
SELECT
FSO.customerid AS x1,
FilteredAccount.accountid AS x2,
FilteredSalesOrderDetail.salesorderid AS x3,
FilteredSystemUser.systemuserid AS x4,
FilteredProduct.productid AS x5,
FilteredAccount.address1_city,
FilteredAccount.address1_line1,
FilteredAccount.address1_postalcode,
FilteredAccount.name AS AccountName,
FSO.ordernumber,
FilteredSalesOrderDetail.quantity,
FilteredSystemUser.fullname,
FilteredProduct.fmcg_erpreference,
FilteredProduct.name AS ProductName
FROM (' + @CRM_FilteredSalesOrder + ') AS FSO
INNER JOIN FilteredAccount ON FSO.customerid = FilteredAccount.accountid
INNER JOIN FilteredSalesOrderDetail ON FilteredSalesOrderDetail.salesorderid = FSO.salesorderid
INNER JOIN FilteredProduct ON FilteredProduct.productid = FilteredSalesOrderDetail.productid
INNER JOIN FilteredSystemUser ON FilteredSystemUser.systemuserid = FSO.ownerid
')
If you want to understand what the CRM inserts, put the CRM_FilteredSalesOrder
parameter in a textbox on the report. It will be a query in the form SELECT f0.* FROM FilteredSalesOrder AS f0 WHERE f0.salesorderid = '3641478b-5022-40fa-90c1-a4d407e8b99b'
when it's on "Forms for related record types". This is effectively a subquery for this one particular Order. That's what they call "prefiltering", you'll just query a subquery.
Upvotes: 5