Я использую Jasper Reports с Java для создания некоторых отчетов. В интерфейсе пользователь выбирает 1 или несколько элементов, а для каждого элемента создается отчет. Теперь у меня есть запрос:
SELECT * FROM StockInventory
Это находится в файле jrxml. Но, запуская это через мое приложение, он создаст отчет для каждого отдельного элемента в таблице. Я бы хотел:
SELECT * FROM StockInventory WHERE pk IN (?...)
Где "?..." - это клавиши элементов, которые пользователь выбирает. Таким образом, не только параметр динамический, но и число параметров также динамическое.
Моя проблема в том, что я не знаю, как настроить параметры в jrxml, и я не знаю, как установить параметры из библиотеки jasperreports на Java. В настоящее время для установки значений я делаю это:
Map<String, Object> params = new HashMap<String, Object>();
JasperReport report = JasperCompileManager.compileReport("path\\to\\jrxml");
JasperPrint print = JasperFillManager.fillReport(report, params, new ItemData(keys));
Где ItemData():
private class ItemData implements JRDataSource
{
private final List<InventoryItem> items;
private int counter;
public ItemData(List<PrimaryKey> keys)
{
items = new ArrayList<InventoryItem>();
InventoryItemDao dao = new InventoryItemDao();
for(PrimaryKey key : keys)
{
InventoryItem item = dao.find(key.getPk(), key.getCpk());
if (item != null)
{
items.add(item);
}
}
counter = -1;
}
@Override
public boolean next() throws JRException
{
if ( counter < items.size() - 1)
{
counter++;
return true;
}
return false;
}
@Override
public Object getFieldValue(JRField jrf) throws JRException
{
// Return the relevant field
}
}
Проблема заключается в том, что он перебирает первичные ключи, выбранные пользователем, и выполняет запрос для каждого из них. Если бы я мог просто сделать это с помощью одного динамического запроса, это было бы намного проще.
Спасибо за любую помощь!
Чтобы установить параметры из Java, вы должны поместить их в свой объект params
.
Map<String, Object> params = new HashMap<String, Object>();
params.put("paramName",value);
JasperReport report = JasperCompileManager.compileReport("path\\to\\jrxml");
JasperPrint print = JasperFillManager.fillReport(report, params, new ItemData(keys));
а затем использовать его в отчете как $ P {paramName}. Убедитесь, что при объявлении параметра в отчете должно быть одно имя ('paramName') и что его класс является классом вашего объекта value
.
Если вы хотите использовать предложение IN, вам придется использовать встроенные функции предложения SQL, предоставляемые Jasper.
Формат: $X{IN, <column_name>, <parameter_name>}
(обязательно используйте в этом случае только имя параметра без $ P).
Итак, в вашем случае запрос будет выглядеть следующим образом:
SELECT * FROM StockInventory WHERE $ X {IN, pk, paramName}
Параметр paramName может быть либо экземпляром java.util.Collection, либо экземпляром java.util.List.