powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / iReport и использование переменных в запросе
19 сообщений из 19, страница 1 из 1
iReport и использование переменных в запросе
    #37750779
andrejjj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня всем!
Вопросы от новичка, поэтому просьба не пинать.
1) Можно ли использовать в тексте sql-запроса переменные
Ну например, есть такой код
WHERE T.CODE = $V{MY_VAR}
где $V{MY_VAR} скажем java.lang.String, которая инициализируется строкой "216"
данная конструкция компилируется нормально, но при выполнении отчета валится с ошибкой
"...
Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc][t4][1061][10303][3.62.56] Синтаксическая ошибка в условии ESCAPE. Подробности смотрите в прикрепленном модуле Throwable. ERRORCODE=-4463, SQLSTATE=42601
..."
на форуме Jasperа люди пишут, что у них такие конструкции работают (может ли это от того, что у меня DB2?)
2) Правда ли что в параметрах я не могу иметь доступа ни к полям запроса, ни к переменных, потому что параметры создаются до них?
3) есть ли возможность в дефолтное значение параметра засунуть РЕЗУЛЬТАТ произвольного запроса, не связанного с основным запросом отчета.
ИМЕННО РЕЗУЛЬТАТ потому, что конструкция вида P!{} не работает (по крайней мере у меня?)
4) откуда растут ноги вопроса 3 попробую объяснить
есть параметр запроса PERIOD_CODE - пользователь вводит это значение выбором из существующей таблицы базы данных
CODE :: NAME
216 :: 01.2012
217 :: 02.2012
218 :: 03.2012
(это чтобы было понятно какбы месяц года в формате строки ММ.ГГГГ), в параметре оказывается строка например "216"
в следующем параметре (целое число) пользователь вводит день месяца
на основании этих двух параметров я пытаюсь сформировать дату которую надо передать в основной запрос что-то типа ENDDATE > <СФОРМИРОВАННЫЙ ПАРАМЕТР>
последний вариант который я попробовал и на котором сломался окончательно был такой:
Код: plsql
1.
TIMESTAMP_FORMAT(CAST(YEAR((SELECT PRD1.ENDDATE FROM ENERGY.PERIOD PRD1 WHERE PRD1.CODE = $P{PERIOD_CODE})) AS VARCHAR)||"-"CAST(MONTH((SELECT PRD1.ENDDATE FROM ENERGY.PERIOD PRD1 WHERE PRD1.CODE = $P{PERIOD_CODE})) AS VARCHAR)||"-"CAST($P{DAY_OF_CALC} AS VARCHAR)||" 00:00:00", 'YYYY-MM-DD HH24:MI:SS')


P.S. просьба извинить за сумбур - бьюсь головой уже 3-ий день
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37751910
Баян
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4.
Хм... т.е. $P{par1} - это код, ссылающийся на дату в формате mm.rrrr, а $P{par2} - день?

А почему нельзя сделать по рабоче-крестьянски:

Код: plsql
1.
select * from table where dat = to_date($P{par2}||'.'||(select name from table2 where code = $P{par1}), 'dd.mm.rrrr')


?
НУ как-то так.
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37752234
andrejjj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Баян,
Каюсь, я привел только часть кода, полностью это будет так
Код: plsql
1.
($P{ALL_DAYS} == 1 ? "AND EPC.CONTRACTENDDATE > PRD.ENDDATE" : "AND CAST(EPC.CONTRACTENDDATE AS DATE) > TIMESTAMP_FORMAT(CAST(YEAR((SELECT PRD1.ENDDATE FROM ENERGY.PERIOD PRD1 WHERE PRD1.CODE = $P{PERIOD_CODE})) AS VARCHAR)||\"-\"CAST(MONTH((SELECT PRD1.ENDDATE FROM ENERGY.PERIOD PRD1 WHERE PRD1.CODE = $P{PERIOD_CODE})) AS VARCHAR)||\"-\"CAST($P{DAY_OF_CALC} AS VARCHAR)||\" 00:00:00\", 'YYYY-MM-DD HH24:MI:SS')" )



идея была такая:
1)пользователь вводит номер дня внутри месяца, это целое число $P{DAY_OF_CALC}
2)пользователь выбирает из существующей таблицы "номер периода" (ну я не виноват, что его так назвали, а вообще-то это месяц года), это строка P{PERIOD_CODE}
Т.е. у пользователя вываливается таблица вида
Название - Начало_Периода - Окончание_Периода
01.2012 - 01.01.2012 - 31.01.2012
он тыкает на название периода и ему возвращается текстовая строка, которая является индентификатором этой записи в таблице PERIOD
3) Пользователь тыкает(или не тыкает) чекбокс, это параметр P{ALL_DAYS} в зависимости от которого выводятся или все договора для данного периода или только те у которых расчетная дата < $P{DAY_OF_CALC}
4) При этом надо проверить, чтобы дата окончания договора была после $P{DAY_OF_CALC}
5) здесь в дело вступает параметр P{CHECK_DATE} с типом String и дефолтным значением которе я привел выше
P.S. почему нельзя по-рабоче крестьянски. Я честно не проверял, но у меня DB2 а у нее форма вызова функции to_date
Код: plsql
1.
2.
TO_DATE('2012-01-31 00:00:00',
       'YYYY-MM-DD HH24:MI:SS') 


Взято отсюда
Valid format strings are:

'YYYY-MM-DD HH24:MI:SS'

where YYYY represents a 4-digit year value; MM represents a 2-digit month value (01-12; January=01); DD represents a 2-digit day of the month value (01-31); HH24 represents a 2-digit hour of the day value (00-24; If the hour is 24, the minutes and seconds values are zero.); MI represents a 2-digit minute value (00-59); and SS represents a 2-digit seconds value (00-59).
P.P.S Я разбираюсь с JR и ireport всего месяц, так что не обессудьте
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37759422
andrejjj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я немножко переписал дефолтное значение для P{CHECK_DATE} теперь оно выглядит так:
Код: sql
1.
($P{ALL_DAYS} == 1 ? "AND CAST(COALESCE(EPC.CONTRACTENDDATE, '9999-12-31') AS DATE) > CAST(PRD.ENDDATE AS DATE)" :  "AND CAST(COALESCE(EPC.CONTRACTENDDATE, '9999-12-31') AS DATE) > (SELECT TO_DATE(CAST(YEAR(PR.ENDDATE) AS CHAR(4))||'-'||CAST(MONTH(PR.ENDDATE)AS CHAR(2))||'-'||CAST(P{DAY_OF_CLAC} AS CHAR(2))||' 00:00:00', 'YYYY-MM-DD HH24:MI:SS')FROM ENERGY.PERIOD PR WHERE PR.CODE=CAST(P{PERIOD_CODE} AS INTEGER)" )



если вставляю выражение
Код: sql
1.
CAST(COALESCE(EPC.CONTRACTENDDATE, '9999-12-31') AS DATE) > (SELECT TO_DATE(CAST(YEAR(PR.ENDDATE) AS CHAR(4))||'-'||CAST(MONTH(PR.ENDDATE)AS CHAR(2))||'-'||CAST(13 AS CHAR(2))||' 00:00:00', 'YYYY-MM-DD HH24:MI:SS')FROM ENERGY.PERIOD PR WHERE PR.CODE=CAST(P{PERIOD_CODE} AS INTEGER)" )


в обычный запрос (заменив предварительно параметры P{PERIOD_CODE} и P{DAY_OF_CLAC} на числа) то все работает замечательно, но как только запускаю iReport сразу валится ошибка:
    at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createStatement(JRJdbcQueryExecuter.java:326)      at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:186)      at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:731)      at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:629)      at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:1159)      at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:802)      at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:746)      at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:58)      at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:417)      at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:247)      at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:879)      at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)      at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997)  Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc][t4][1061][10303][3.62.56] Синтаксическая ошибка в условии ESCAPE.  Подробности смотрите в прикрепленном модуле Throwable. ERRORCODE=-4463, SQLSTATE=42601      at com.ibm.db2.jcc.am.fd.a(fd.java:676)      at com.ibm.db2.jcc.am.fd.a(fd.java:60)      at com.ibm.db2.jcc.am.fd.a(fd.java:112)      at com.ibm.db2.jcc.am.jb.c(jb.java:947)      at com.ibm.db2.jcc.am.jb.v(jb.java:7474)      at com.ibm.db2.jcc.am.jb.a(jb.java:2143)      at com.ibm.db2.jcc.am.jb.prepareStatement(jb.java:774)      at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createStatement(JRJdbcQueryExecuter.java:256)      ... 12 more  Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc][1064][10658][3.62.56] Нераспознанное ключевое слово в условии ESCAPE: PERIOD_CODE. ERRORCODE=-4463, SQLSTATE=42601      at com.ibm.db2.jcc.am.fd.a(fd.java:676)      at com.ibm.db2.jcc.am.fd.a(fd.java:60)      at com.ibm.db2.jcc.am.fd.a(fd.java:103)      at com.ibm.db2.jcc.am.bd.a(bd.java:53)      at com.ibm.db2.jcc.am.bd.a(bd.java:115)      at com.ibm.db2.jcc.am.jb.c(jb.java:944)      ... 16 more 
Print not filled. Try to use an EmptyDataSource...
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37759433
andrejjj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто-нибудь может разъяснить, что это такое
Нераспознанное ключевое слово в условии ESCAPE
или подсказать в какую сторону копать?
Подобная ошибка раньше у меня встречалась только когда пытался переменную засунуть в текст sql-запроса в JR, но сейчас вроде параметр, я уже и вариант с "!" пробовал - те же грабли
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37759749
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejjj,

А вам не кажется странным что в самом начале условия один параметр у вас $P{ALL_DAYS}, а в конце: P{PERIOD_CODE} без доллара?
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37759768
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanBez,

Да и в строку его наверно надо конкатенировать как "начало условия"+$P{PERIOD_CODE}+"конец условия"
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37760575
andrejjj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, sanBez мне как раз это и приходило в голову.
Переделал $P{CHECK_DATE}
Код: java
1.
($P{ALL_DAYS} == 1 ? "AND CAST(COALESCE(EPC.CONTRACTENDDATE, '9999-12-31') AS DATE) > CAST(PRD.ENDDATE AS DATE)" :  new String("AND CAST(COALESCE(EPC.CONTRACTENDDATE, '9999-12-31') AS DATE) > (SELECT CAST(PR.STARTDATE AS DATE) + " + $P{DAY_OF_CALC}.toString() + " DAY - 1 DAY FROM ENERGY.PERIOD PR WHERE PR.CODE = " + $P{PERIOD_CODE}+ "\r\n"))




Теперь ошибка ... Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=END-OF-STATEMENT; ;), DRIVER=3.62.56  ...


P.S. если вдруг тему прочитают спецы по JR - хотелось бы знать правильно ли я понял логику работы JR:
1) инициализируются (и вычисляются?) параметры которые записаны как $P{} (здесь я не имею доступа к переменным и полям)
2) вместо параметров $P!{} подставляется результат их вычисления (здесь я не могу напрямую воспользоваться параметрами вида $P{} потому что они подставятся в sql как-есть и тогда я получу ошибку "Нераспознанное ключевое слово в условии ESCAPE")
3) параметры вставляются в sql. (и тут)
4) возвращается результат
5) формируется отчет (здесь я уже имею доступ к переменным и полям)
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37760799
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejjj,

Вы можете отключить выполнение вашего запроса и просто вывести в отчете в TextField параметр ${P_CHECK_DATE} ?
Или весь запрос, каким он у вас получается.
А потом выполнить просто запрос с использованием получившейся строки.

Меня смущает: SQLERRMC=END-OF-STATEMENT; ;)
Закрывающее что-то лишнее пишете?
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37761223
andrejjj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Самое смешное, что по отдельности все работает

сделал три параметра
String --> xlam1 -->
Код: java
1.
new String ("AND CAST(COALESCE(EPC.CONTRACTENDDATE, \'9999-12-31\') AS DATE) > CAST(PRD.ENDDATE AS DATE)")


String --> xlam2 -->
Код: java
1.
new String ("AND CAST(COALESCE(EPC.CONTRACTENDDATE, \'9999-12-31\') AS DATE) > (SELECT CAST(PR.STARTDATE AS DATE) " + new Integer($P{DAY_OF_CALC}).toString() + " DAY - 1 DAY FROM ENERGY.PERIOD PR WHERE CAST(PR.CODE AS INTEGER)= " + $P{PERIOD_CODE} + " ")


String --> CHECK_D -->
Код: java
1.
( $P{ALL_DAYS}.intValue() == 1 ? $P{xlam1}.toString() : $P{xlam2}.toString())


кинул xlam2 в заголовок отчета
запустил с $P{ALL_DAYS} = 1, получил такую картинку (прилагается
запустил с $P{ALL_DAYS} = 0, получил такую ошибку
Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=20;R.STARTDATE AS DATE);<space>, DRIVER=3.62.56

*пичалька
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37761387
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejjj,

Итого: один вариант работает (==1), строку запроса вы видите. Нужно отладить второй (==0).
Кидаем xlam1 в Title, ставим на банд Detail (точнее на все кроме Title) PrintWhenExpression = false
Запускаем с параметром == 0 и проверяем строку запроса.

В чем проблемы то? Или я чего-то не понял?
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37761469
andrejjj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже и сам не понимаю, что происходит
я приложил файлик, это снимок экрана с работающего отчета. На нем хлам2 выкинут на титл
и вроде строка нужная генерируется
а вот когда этот до....ный хлам2 стоит в тернарном операторе вылазит ошибка
Я уже и строку на несколько кусков разбивал и в нетбинсе этот кусок тестировал - ничего не пойму.
у меня есть другой параметр
вот такой
String -->
Код: java
1.
 ( $P{ALL_DAYS}.intValue() == 1 ? new String (" AND 1=1 ") : new String (" AND EPC.DAYOFCALCULATION < " + new Integer($P{DAY_OF_CALC}+1).toString() +" ") )


все работает нормально
а здесь
Код: java
1.
new String ("AND CAST(COALESCE(EPC.CONTRACTENDDATE, \'9999-12-31\') AS DATE) > (SELECT CAST(PR.STARTDATE AS DATE) " + new Integer($P{DAY_OF_CALC}).toString() + " DAY - 1 DAY FROM ENERGY.PERIOD PR WHERE CAST(PR.CODE AS INTEGER)= " + $P{PERIOD_CODE} + " ")


кроется какая то бяка и именно когда это выражение стоит в тернарном ветке иначе (ща попробую в если)
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37761518
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejjj,

Не понял.
Не xlam2 надо проверять здесь а хlam1
У вас же на нем ломается. Киньте его в Title.

Кто-то из нас запутался
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37761531
andrejjj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
положил в титл оба хлама ))))
запустил отчет с параметром $P{ALL_DAYS} == 1 (потому что если = 0 , валится с ошибкой)
рисунок прилагаю
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37761557
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejjj,

Я совсем не знаю db2, но вопрос: перед "20 DAY" плюс не нужен?
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37761598
andrejjj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да ужжж (((( посыпаю голову пеплом, добавил этот злосчастный плюс теперь ошибка полезла дальше

Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=END-OF-STATEMENT;DAYOFCALCULATION ASC;), DRIVER=3.62.56 
это идет ругань на следующие строки в sql запросе,
а если в sql запросе выкинуть все что стоит после этого параметра получаю ошибку
Caused by: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=END-OF-STATEMENT;ODE AS INTEGER)= 219;), DRIVER=3.62.56 
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37761651
sanBez
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejjj,

Эта удаленная отладка - дело непродуктивное. Отдохните, попейте кофе и не спеша проходите по сообщениям стектрейса.
Все что возникало у вас там прекрасно описано. Не торопитесь, аккуратненько и все у вас получится.

Например из последнего поста видно что забыт order by наверно: END-OF-STATEMENT;DAYOFCALCULATION ASC;
и так далее.

Удачи
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37762396
andrejjj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за внимание, задача решилась.
Ларчик как обычно открывался просто (((
в выражении для xlam2 была забыта закрывающая скобка
правильно было так
Код: java
1.
 new String ("AND CAST(COALESCE(EPC.CONTRACTENDDATE, \'9999-12-31\') AS DATE) > (SELECT CAST(PR.STARTDATE AS DATE) + " + new Integer($P{DAY_OF_CALC}).toString() + " DAY - 1 DAY FROM ENERGY.PERIOD PR WHERE PR.CODE = " + new String($P{PERIOD_CODE}).toString() + ") ")


Сейчас попробую убрать лишние cast, я думаю и без них всё будет работать
Отчет сформировался нормально
Есть правда одно но: компиляция проходит без ошибок, но когда захожу в "Report query" и нажимаю "Read fields" получаю ошибку:
...
Рейтинг: 0 / 0
iReport и использование переменных в запросе
    #37762432
andrejjj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще раз всем спасибо, отдельная благодарность sanBez за участие и ценные замечания.
Тему можно закрывать.
P.S. оказывается ошибка которую я выше показал это не баг, это фича :D объяснение здесь
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / iReport и использование переменных в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]