Цель:
У меня есть отчет SSRS, который использует скрытый параметр для захвата идентификатора пользователя, раскрывающийся параметр с несколькими значениями, отображающий ветви, и другой параметр с несколькими значениями, который будет отображать данные о продажах, связанные с этими филиалами. Идея состоит в том, что пользователь может просматривать только филиалы и отделы продаж, где их идентификатор пользователя равен имени филиала.
Проблема:
Если пользователю предоставляется доступ для просмотра ветвей Чикаго и Нью-Йорка, и он выбирает только эти филиалы, отчет работает нормально. Данные отображаются только для этих двух филиалов.
Если пользователь выбирает только Чикаго, отображается сообщение об ошибке.
Если пользователь выбирает только Нью-Йорк, отображается сообщение об ошибке.
Если пользователь выбирает «ВЫБРАТЬ ВСЕ», отчет отображает данные для всех филиалов (даже филиалов, к которым у них не должно быть доступа).
СООБЩЕНИЕ ОБ ОШИБКЕ: Ошибка преобразования при преобразовании значения nvarchar 'Chicago' в тип данных int.
Я использую запрос в наборе данных, а не хранимую процедуру. Стоит ли использовать вместо этого хранимую процедуру?
Я использую оператор 'IN' в WHERE CLAUSE:
WHERE ReportIDTable.ReportID = 1
AND ReportIDTable.UserID = @UserID
AND ((Branch IN (@BranchID)) OR Branch = 9999)
Я пытался использовать функции JOIN () и SPLIT (), и я не вижу разницы.
Я провел много исследований и не могу решить проблему. Любая помощь будет высоко ценится!
Параметр @BranchID уже установлен в TEXT и фактически заполняется другим запросом.
SELECT 'ZZ <Untracked Sales>' AS ParentID
UNION
SELECT ParentID
FROM ReportDistribution WITH (NOLOCK)
WHERE (ReportID = 1) AND (ReportHierarchyID = 3)
GROUP BY ParentID
Запрос к основному набору данных:
SELECT
commission_sale_history.invoice_year,
commission_sale_history.invoice_month,
branch.branch_description,
commission_reps.division,
commission_reps.rep_name,
commission_reps.employee_id,
commission_sale_history.customer_id,
customer.customer_name,
commission_sale_history.invoice_no,
commission_sale_history.order_no,
commission_sale_history.product_division,
commission_sale_history.commission_type,
commission_sale_history.sales,
commission_sale_history.commission_cost,
commission_sale_history.commission_amount,
commission_sale_history.payment_date,
commission_sale_history.invoice_date,
commission_sale_history.commission_rate,
commission_sale_history.commission_split,
commission_reps.salary
FROM ((((commission_sale_history WITH (NOLOCK)
INNER JOIN commission_reps WITH (NOLOCK)
ON (commission_sale_history.branch_id = commission_reps.branch_id)
AND (commission_sale_history.rep_id = commission_reps.rep_id))
INNER JOIN customer WITH (NOLOCK)
ON commission_sale_history.customer_id = customer.customer_id)
INNER JOIN branch WITH (NOLOCK)
ON commission_sale_history.branch_id = branch.branch_id)
INNER JOIN ReportIDTable WITH (NOLOCK)
ON commission_reps.rep_id =
CASE WHEN CONVERT(int,ReportIDTable.Salesrep) = 999999
THEN commission_reps.rep_id ELSE
CONVERT(int,ReportIDTable.Salesrep) END)
LEFT JOIN invoice_hdr_salesrep WITH (NOLOCK)
ON invoice_hdr_salesrep.invoice_number = commission_sale_history.invoice_no
AND invoice_hdr_salesrep.salesrep_id = commission_sale_history.rep_id
WHERE ReportIDTable.ReportID = 1
AND ReportIDTable.UserID = @UserID
AND ((Branch IN (@BranchID)) OR Branch = '9999')
AND commission_sale_history.rep_id IN(@SalesRepID)
AND commission_sale_history.invoice_date >= @InvoiceStartDate
AND commission_sale_history.payment_date
BETWEEN @PaymentFromDate AND @PaymentThroughDate
AND commission_sale_history.paid_in_full_flag = 'Y'
AND ISNULL(commission_sale_history.credit_matched_to_payment_flag,'Y') = 'Y'
AND commission_sale_history.product_division
NOT IN ('Parts Sales', 'Rental', 'Forklift/Equipment', 'Service')
AND ISNULL(invoice_hdr_salesrep.primary_salesrep,'Y')='Y'
ORDER BY
commission_reps.rep_name,
customer.customer_id,
commission_sale_history.invoice_no,
commission_sale_history.commission_type