#ssrs-2008 #ssrs-tablix
#ssrs-2008 #ssrs-tablix
Вопрос:
Я работаю над отчетами ssrs. Я смог увидеть данные или результат моей хранимой процедуры. к сожалению, при использовании того же, что и мой набор данных для отчета, я не смог увидеть данные, вместо этого я получаю 0 записей.в чем могут быть причины?Структура моих отчетов будет такой, как показано на рисунке ниже :
Ниже приведена моя процедура :
ALTER Proc [dbo].[SP_Get_CIPPSubjectMarks_New_HTSTEST] -
-7,'1,17,8','2537,2555,2558,2568'
(
@ReportId int=7,
@SubjectId varchar(200),
@SectionId varchar(200)
)
AS
BEGIN
Create table #temp (Name Varchar(500),Class varchar(50),Section
Varchar(20),enrollno varchar(500),SubjectName varchar(500),TermName
varchar(500),TestName varchar(500),TestGroupName varchar(500),Weightage
int,IsWeight bit,Marks varchar(20),MaxMarks int,IsAbsent bit,SubjectOrder
Varchar(200))
Insert into
#temp(Name,Class,Section,enrollNo,SubjectName,
TermName,TestName,TestGroupName,Weightage,IsWeight,Marks,
MaxMarks,IsAbsent,SubjectOrder)
SELECT DISTINCT CONCAT(d.name,' ',d.surname),cls.Value,sec.Value,
e.enroll_no,
CASE WHEN ISNULL(cxs.subject_alias,'')='' THEN CASE WHEN rtv.value='Second
Language' then '2ND LANGUAGE:' b.Name WHEN
rtv.value='Third Language' THEN '3rd Language:' b.name else b.name end
ELSE cxs.subject_alias end as SubjectName,
z.str_termname,c.str_termtestname,i.str_testgroupname,
i.str_testweightage,i.is_weighted_average,a.marks,max_marks,a.is_absent,
CASE WHEN rtv.value='Second Language' THEN 'Second Language' WHEN
rtv.Value='Third Language' THEN 'Third Language' When
ISNULL(cxs.subject_alias,'')='' THEN b.Name
ELSE cxs.subject_alias end as SubOrder
FROM marks_entry_HTS a JOIN subject b ON a.fk_subject_id=b.Id and a.marks
is not null
LEFT JOIN subjectCategory_HTS l ON l.Id= b.subject_categoryID
JOIN class_term_test_mapping_HTS c ON a.fk_class_term_test_mapping_id=c.id
-- added by me
JOIN class_term_test_category_HTS ctc on c.fk_termcategoryid = ctc.id
JOIN reference_type_value rtv ON rtv.id=a.fk_subject_type_id
-- close
JOIN Term_Test_Subject_AssessmentType_HTS m ON m.fk_term_testID=c.id and
m.fk_SubjectID=b.Id
JOIN class_report_types_mapping_test_HTS k ON
k.fk_class_term_test_mapping_id=c.Id
JOIN class_term_mapping_HTS z ON z.id=k.fk_class_term_mapping_id
JOIN Term_Test_Testgroup_aggregate_HTS i ON
i.Id=c.fk_testgroup_aggregateID
JOIN TestGroup_HTS j on j.Id=i.fk_TestGroupID
JOIN student d ON a.fk_student_id=d.Id JOIN student_enroll_no e ON
e.fk_student_id=d.id and IsNULL(e.is_deleted,0)=0
JOIN student_academic f on f.fk_student_enroll_no_id=e.id and
f.fk_academic_year_id=c.fk_academic_year_id
JOIN reference_type_value cls on cls.Id=f.fk_class_id
LEFT JOIN reference_type_value sec ON sec.Id=f.fk_section_id
LEFT JOIN max_marks_entry_HTS h on h.id=a.fk_max_marks_entry_id
join class_xref_subjects cxs ON h.fk_subject_id=cxs.fk_subject_id and
cxs.fk_subject_type_id=h.fk_subject_type_id and
IsNull(cxs.is_deleted,0)=0
and cxs.fk_class_id=h.fk_class_id and
cxs.fk_academic_year_campus_id=h.fk_academic_year_campus_id and
cxs.fk_curriculum_segment_id=h.fk_curriculum_segment_id
where k.fk_class_report_types_mapping_id=@ReportId
and h.fk_section_id in (select * from SplitStringByChar(@SectionId,','))
and a.fk_subject_id in (select * from SplitStringByChar(@SubjectId,','))
select Name,Class,Section,enrollNo,SubjectName,TermName,
TestGroupName as TestName,
Case WHEN IsWeight=1 THEN Round(Cast(((avg(CAST(Marks as
float)/cast(MaxMarks as float)))*Weightage) as decimal(10,0)),0)
else Round(Cast(((cast(max(Marks) as float)/cast(max(MaxMarks) as
float))*Weightage) as decimal(10,0)),0) ENd as Marks ,
SubjectOrder ,sum(maxmarks) as maxmarksare INTO #temp1 from #temp
GROUP BY Name,Class,Section,enrollNo,SubjectName,
TermName,SubjectOrder,IsWeight,Weightage,TestGroupName
Insert into #temp
(Name,Class,Section,enrollNo,SubjectName,
TermName,TestName,Marks,SubjectOrder)
select
Name,Class,Section,enrollNo,SubjectName,TermName,'Total',
SUM(Marks),SubjectOrder from #temp1
GROUP BY Name,Class,Section,enrollNo,SubjectName,TermName,SubjectOrder
Insert into #temp
(Name,Class,SubjectName,Section,enrollNo,TermName,TestName,Marks)
select Name,Class,'Total',Section,enrollNo,TermName,'Total
Marks',SUM(Marks)
from #temp1
GROUP BY Name,Class,Section,enrollNo,TermName
Insert into #temp
(Name,Class,SubjectName,Section,enrollNo,TermName,TestName,Marks)
select
Name,Class,'Total',Section,enrollNo,TermName,'Percentage',
SUM(Marks)*100/sum(m
axmarksare) from #temp1
GROUP BY Name,Class,Section,enrollNo,TermName
select *from #temp
drop table #temp
drop table #temp1
end
Результат моей процедуры такой, как показано на рисунке ниже :
Комментарии:
1. Не видя хранимой процедуры, трудно сказать, но я предполагаю, что вам нужно проанализировать идентификаторы объектов и разделов в вашем SP. Я предполагаю, что у вас есть предложение WHERE, в котором говорится что-то вроде
SubjectID in (@subjects)
. В этом случае повторный код был быSubjectID IN ('1,17,8')
, а неSubjectID IN (1,17,8)
. Если это так, то вам нужно разделить строку в вашем SP. На SO есть много похожих вопросов, если вы выполните поиск2. @AlanSchofield ваша точка зрения верна. но здесь нам не нужно указывать кавычки, если тип varchar в SSRS. и я могу получить результаты для других отчетов.
3. я хотел сказать, что если вы передадите идентификаторы разделов непосредственно из своего отчета, они будут переданы неправильно. выполните трассировку на вашем sql Server, и вы увидите, что оператор sql неверен.
4. Если существует несоответствие типов, мы столкнемся с исключительным сообщением в файлах журнала. Это не проблема. Мы уже разбиваем строку с помощью функции. Кроме этого, можете ли вы предположить, что еще может вызвать эту проблему.
5. Как я сказал в своем первом комментарии «Не видя хранимую процедуру, трудно сказать «. Вы не получите большой помощи, пока не опубликуете код с примерами данных. Кроме того, запустите трассировку на сервере при запуске отчета и проверьте фактический выполняемый запрос, который обычно укажет вам на проблему.
Ответ №1:
Поскольку есть ряд вещей, которые могут быть неправильными, я бы сделал следующее.
- Создайте копию вашего отчета
- Удалите существующий набор данных и табликс, если хотите.
- Создайте несколько новых наборов данных, которые просто получают базовые данные (например,
SELECT top 10 * FROM marks_emtry_HTS
). Пока не используйте ваши параметры, поскольку мы просто хотим проверить, можем ли мы получить базовые данные. - Добавьте несколько таблиц в свой отчет, чтобы показать, что данные возвращаются
- Добавьте набор данных для проверки правильности передачи и синтаксического анализа параметров с помощью запроса dataset, подобного
select * from SplitStringByChar(@SectionId,',')
, а затем поместите tablix в свой отчет, чтобы отобразить результаты. - Попробуйте обрезать значения ваших параметров
SET @SectionId = LTRIM(RTRIM(@SectionId))
, чтобы убедиться, что вы неправильно обрабатываете начальный или конечный пробел в вашей функции разделения. - Если какие-либо части не работают, запустите трассировку на сервере SQL при запуске отчета и посмотрите, что именно выполняется на сервере.
Я знаю многие из тех шагов, которые вы сочтете ненужными, но потратьте на это время, и, по крайней мере, вы будете уверены и сможете исключить такие базовые проверки из своего расследования.