Простая часть - это параметр отчета: установите тип отображения в поле списка, затем установите флажок «Разрешить множественные значения».
Теперь самая сложная часть: к сожалению, вы не можете связать многозначное значениепараметр отчета для параметра набора данных (по крайней мере, не в версии 3.2, что я и использую).Здесь есть запись в блоге BIRT World: http://birtworld.blogspot.com/2009/03/birt-multi-select-statements.html, в которой описано, как использовать подключаемый модуль кода для привязки параметров выбора нескольких отчетов к набору данных отчета.
К сожалению, когда я попробовал егоне сработало.Если вы можете заставить его работать, я рекомендую этот метод;если вы не можете, тогда альтернативой было бы изменить queryText набора данных, чтобы вставить все значения из параметра отчета в запрос в соответствующей точке.Предполагая, что s.id
является числовым, вот функция, которую можно вставить в сценарий события beforeOpen для источника данных :
function fnMultiValParamSql ( pmParameterName, pmSubstituteString, pmQueryText )
{
strParamValsSelected=reportContext.getParameterValue(pmParameterName);
strSelectedValues="";
for (var varCounter=0;varCounter<strParamValsSelected.length;varCounter++)
{
strSelectedValues += strParamValsSelected[varCounter].toString()+",";
}
strSelectedValues = strSelectedValues.substring(0,strSelectedValues.length-1);
return pmQueryText.replace(pmSubstituteString,strSelectedValues);
}
, который затем можно вызвать из сценария события beforeOpen для набор данных , например:
this.queryText = fnMultiValParamSql ( "rpID", "0 /*rpID*/", this.queryText );
при условии, что ваш параметр отчета называется rpID.Вам необходимо изменить запрос так, чтобы он выглядел следующим образом:
select s.name, w.week_ending, w.sales
from store s, weekly_sales_summary w
where s.id=w.store_id and s.id IN (0 /*rpID*/)
Значение 0 включено в сценарий, чтобы сценарий запроса действовал во время разработки, а значения набора данных будут правильно привязаны к отчету;во время выполнения этот жестко запрограммированный 0 будет удален.
Однако этот подход потенциально очень опасен, так как может сделать вас уязвимым для атак SQL-инъекций: http://en.wikipedia.org/wiki/SQL_injection, как показано здесь: http://xkcd.com/327/.
В случае чисто числовых значений, выбранных из предопределенного списка выбора, атака с использованием SQL-инъекции не должна быть возможной;тем не менее, тот же подход уязвим, если разрешены строки ввода произвольной формы для параметра.