Динамический запрос в отчете Jasper

1

Я использую 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
    }
}

Проблема заключается в том, что он перебирает первичные ключи, выбранные пользователем, и выполняет запрос для каждого из них. Если бы я мог просто сделать это с помощью одного динамического запроса, это было бы намного проще.

Спасибо за любую помощь!

  • 0
    возможный дубликат JasperReports: передача параметров в запрос
  • 0
    Если вы хотите передать запрос динамически, я бы посоветовал вам попробовать DynamicReports. Это библиотека Java, основанная на JasperReports, здесь у вас есть пример: mkyong.com/java/…
Показать ещё 1 комментарий
Теги:
jasper-reports

1 ответ

4
Лучший ответ

Чтобы установить параметры из 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.

  • 0
    Вот для чего карта ... хаха. Я должен был догадаться. Я сообщу, когда я это реализовал, и посмотрю, как это работает. Спасибо! Можно ли таким образом установить значения в предложении IN? Количество значений варьируется, поэтому я не могу просто ввести параметр для каждого из них.
  • 0
    Пожалуйста, смотрите мой обновленный ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню