2014-06-16 6 views
0

Мне нужно иметь возможность передавать имена столбцов в качестве параметров для ссылок на поля в отчетах jasper при выполнении запроса.Как передать имена столбцов в качестве параметров в отчетах яшмы

Это требуется, чтобы отчет .jrxml не привязывался к именам столбцов, указанным в запросе (фактически позволяя запускать любой SQL-запрос в отчете jrxml).

Я хочу сделать что-то вроде $ F для значений или категории выражений в графиках, где {$ P {параметр1}!}:

<parameter name="Parameter1" class="java.lang.String" isForPrompting="false"> 
    <defaultValueExpression><![CDATA["country"]]></defaultValueExpression> 
</parameter> 

Но я получаю сообщение об ошибке: "Поле не найдено" получить $ P ! {Parameter1 --- net.sj.jasperreports.engine.design.JRDesignExpression

набор Категория данных (графика):

<categoryDataset> 
      <categorySeries> 
       <seriesExpression><![CDATA[country]]></seriesExpression> 
       <categoryExpression><![CDATA[$F{$P!{Parameter1}}]]></categoryExpression> 
       <valueExpression><![CDATA[$F{number_of_sites}]]></valueExpression> 
      </categorySeries> 
     </categoryDataset> 

Я 100% кто-то попытался сделать то же самое, любые предложения пожалуйста?

ответ

0

Вы можете попробовать это, использовать параметр напрямую со значением по умолчанию, которое является именем столбца в вашем случае.

<categoryDataset> 
    <categorySeries> 
     <seriesExpression><![CDATA[$P!{Parameter1}]]></seriesExpression> 
     <categoryExpression><![CDATA[$P!{Parameter1}]]></categoryExpression> 
     <valueExpression><![CDATA[$F{number_of_sites}]]></valueExpression> 
    </categorySeries> 
</categoryDataset> 
+0

попытался с самого начала: «$ P не может быть разрешено переменной». Фокус здесь заключается в том, что ожидаемое значение относится к объекту поля $ F не к параметру. Я пытался использовать переменные как внутренние выражения V V, а внутри Variable ссылается на $ P, но он снова не разрешает $ P, он заменяет $ V с помощью «$ P {Parameter1} напрямую ... – Aubergine

0

Я хотел бы попробовать манипулировать запрос (например, динамический SQL) вместо этого, используя свой параметр, как вы делали в categoryDataset.

Мы использовали это много раз, чтобы подготовить наши запросы для получения указанного столбца для целей группировки (в основном с помощью jasperreports), и я уверен, что это тоже сработает для вас.

Ваш запрос будет выглядеть следующим образом:

select 
    column1, 
    column2, 
    column3, 
    column4, 
    $P!{Parameter1} as GROUP_COL 

from 
    yourTable 

Это также описано в jasper docs.

+0

Это будет связывать запрос столбцы к некоторому порядку. Поскольку вы будете подразумевать, что поля будут представлены как $ P! {Parameter1} AS SERIES_EXPRESSION и говорят $ P! {Parameter2} AS VALUE_EXPRESSION, поэтому запросы, связанные с отчетом, должны знать, в каком порядке должны быть поставлены столбцы. Другими словами, запрос должен знать, к какому имени общего поля он должен связываться, используя директиву «AS». Мы уже разбираем jrxml, потому что блок отчета глуп и не отображает параметры его ресурса jrxml ... Больше обходных путей звучит тревожно. – Aubergine

-1

Вы не можете устанавливать переменные в SQL как имена столбцов или таблиц. Но со следующим трюком вы можете. Надеюсь, это поможет вам.

DECLARE @variable1 system; /* type system is datatype for tablenames, columns etc.*/ 
    DECLARE @variable2 system; 
    DECLARE @variable3 system; 

    Select @variable1 = tablename, @variable2 = columname, @variable3 = variable 
    From tempdb.dbo.powerdeviation 
    Where ID = @ID 

    /*please note that if the select result is giving you more then one result, 
    the first row is used as the variable! There will be not error*/ 


    DECLARE @sqlCommand nvarchar(max)=' 
    SELECT something 
     FROM [[email protected]].[dbo].['+ @variable2 +'] 
     where LogInterval = 10 and PlantID = ''@variable3'' 
    ' 
    SET @sqlCommand = REPLACE(@sqlCommand,'@variable',@variable); 
    SET @sqlCommand = REPLACE(@sqlCommand,'@variable2',@variable2); 
    SET @sqlCommand = REPLACE(@sqlCommand,'@variable3',@variable3) 

    PRINT @sqlCommand; 
    EXEC sys.sp_executesql @sqlCommand; 
+0

С чистым SQL ok, но с JasperReports у вас есть слой абстракции между ними. Таким образом, на этот вопрос это, кажется, не правильный ответ. –

Смежные вопросы