Переменные в отчет из кода

отредактировано 07:51 Раздел: FastReport Studio
Вопрос следующий:
у меня генерится отчет в зависимости от данных, передаваемых в запрос из кода основной программы.
Насколько я понял логично сделать так:
- завести переменную в отчете
- установить её значение из кода основной программы
- в запросе (ADOQuery) добавить в часть where условие типа:
where ID = :ID
- в параметрах ADOQuery задать тип параметра ID и связать его с переменной, которую передаю из программы.

Проблема:
при параметре ID типа Guid. Дизайнер просит добавить кавычки спереди и сзади, но это немного нелогично. Параметры обычно ведь задаются без кавычек.
Или подставляется просто значение переменной при выполнении запроса?
В таком случае как мне добавить кавычки спереди и сзади? Из кода не получается, т.к. возникает ошибка "Error in expression ____здесь_сам_Guid____", причем все это даже не в завпросе, а просто при попытке отобразить значение переменной в Memo. Пытался добавлять одну, две, три одинарных кавычки - результат одинаков.

Если немного непонятно рассказал - уточню. Скажите только что именно.

Комментарии

  • отредактировано 07:51
    написал:
    - в параметрах ADOQuery задать тип параметра ID и связать его с переменной, которую передаю из программы.
    Вы передаете переменную типа GUID?
    Можете привести кусок кода с передачей переменной?
  • отредактировано 07:51
    Чтобы не возникало проблем, получайте датасет в основной программе, а в отчет данные передавайте через FrxDataTable
  • отредактировано 07:51
    написал:
    написал:
    - в параметрах ADOQuery задать тип параметра ID и связать его с переменной, которую передаю из программы.
    Вы передаете переменную типа GUID?
    Можете привести кусок кода с передачей переменной?
    на самом деле я передаю строку
    report.SetVariable(NameOfVariable, "'" + GUID_As_String + "'");
    не думаю, что можно передать сам GUID (хотя могу и ошибаться)
  • отредактировано 07:51
    vlad_galaxy написал:
    Чтобы не возникало проблем, получайте датасет в основной программе, а в отчет данные передавайте через FrxDataTable
    Такой вариант неприемлем, т.к. я позволяю пользователю изменять отчеты. Т.е. я не могу знать какие данные будут в отчете, но должен в отче сообщить, находясь на какой строке, пользователь нажал кнопку "печать"
  • отредактировано 07:51
    написал:
    не думаю, что можно передать сам GUID (хотя могу и ошибаться)
    Вы правы тип GUID действительно нельзя передовать в скрипт, поэтому я и спросил.
    В отчете переменная описана в скрипте или в редакторе переменных?
  • отредактировано 07:51
    написал:
    написал:
    не думаю, что можно передать сам GUID (хотя могу и ошибаться)
    Вы правы тип GUID действительно нельзя передовать в скрипт, поэтому я и спросил.
    В отчете переменная описана в скрипте или в редакторе переменных?
    В отчете переменная описана в редакторе переменных.
  • отредактировано 07:51
    Попробуйте удалить переменную из редактора переменных, создать в секции глобальных переменных что-то вроде "var my_var: String;" и убрать лишние кавычки report.SetVariable(NameOfVariable, GUID_As_String);
  • отредактировано 07:51
    написал:
    Попробуйте удалить переменную из редактора переменных, создать в секции глобальных переменных что-то вроде "var my_var: String;" и убрать лишние кавычки report.SetVariable(NameOfVariable, GUID_As_String);
    Переменную удалю, но что в таком случае ставить в соответствие параметру в запросе? Он ведь не предлагает переменных из раздела глобальных переменных.
    Есть локальный успех (но его не хватает для решения проблемы):
    при присвоении переменной с GUIDом в скрипте значений руками
    Set('dID','''{A713D69C-8D5D-43E8-AD3E-01B686E70417}''');
    скрипт начинает понимать параметр dID в запросе
    select *
    from Docs
    where dID = :dID
    (где параметр :dID связан с переменной dID)

    НО!!!
    присвоить значение переменной dID из кода программы без выдачи ошибки "External Component throw an Exception" получается только
    строкой
    report.SetVariable("dID", "'" + dID + "'");
    В этом случае значение GUIDа хотя бы отображается в memo.
    Но в запросе все равно вылетает ошибка.
    При попытке поиграться с кавычками - переменная не отображается даже в Memo (вышеуказанная ошибка).

    Где я наступаю на грабли?
  • almanalman космополит
    отредактировано 07:51
    Maxim Koval написал:
    report.SetVariable("dID", "'" + dID + "'");
    А такой вариант пробовали?

    report.SetVariable("dID", "'{" + dID + "}'");

    вообще, передача строковых параметров в одинарных кавычках, это особенность FastReport Studio.

    Кстати, давно собираемся довести функциональность TfrxADOQuery до оригинального, дельфийского ФастРепорта. Возможно, Ваш запрос ускорит это событие.

    Да, насчёт переменной. А что получается, если в скрипте вывести диалог со значением переменной? Т.е. каков её вид?
  • отредактировано 07:51
    alman написал:
    alman написал:
    report.SetVariable("dID", "'" + dID + "'");
    report.SetVariable("dID", "'{" + dID + "}'");

    Да, насчёт переменной. А что получается, если в скрипте вывести диалог со значением переменной? Т.е. каков её вид?
    Спасибо всем, кто принял участие в обсуждении. Я поборол проблему.
    Проблема оказалась вот в чем:
    если на двух разных формах генерить свой экземпляр TfrxReportClass, то вызывая ShowReport накладок не получаем, а после вызова DesignReport при следующем вызове ShowReport проблемы могут быть самыми разнообразными ;)

    А в остальном изначальная идея с параметром оказалась верна.

    Фигурные скобки для GUID добавлять не обязательно. MS SQL понимает и так и так.

    Спасибо еще раз.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.