Передача параметров в запрос Sql

SysolyatinSNSysolyatinSN Екатеринбург
отредактировано 07:56 Раздел: FastReport .NET
Добрый день.
Столкнулся со следующей проблемой: Вытаскиваю компонент report, далее захожу в дизайнер. Добавляю источник данных, вставлю sql запрос (отчет по кассе). Отчет нужно формировать на определенный период, прочитав документацию нашел что выборку можно фильтровать с помощью добавления на форму поля даты. При такой реализации отчет формируется неправильно. Можно ли программно изменять sql запрос в отчете. Например добавив в запрос условие на дату?

Комментарии

  • отредактировано 07:56
    Здравствуйте,

    А что именно формируется неправильно?
    Текст запроса программно изменить можно, вот так:

    TableDataSource table = Report.GetDataSource("MyTable") as TableDataSource;
    table.SelectCommand = "select * from ...";
  • SysolyatinSNSysolyatinSN Екатеринбург
    отредактировано 07:56
    AlexTZ написал: »
    Здравствуйте,

    А что именно формируется неправильно?
    Текст запроса программно изменить можно, вот так:

    TableDataSource table = Report.GetDataSource("MyTable") as TableDataSource;
    table.SelectCommand = "select * from ...";

    Спасибо за ответ. Нашел в инструкции, прочитав внимательно.

    AlexTZ у меня еще пару вопросиков:
    Вопрос 1: Есть ли возможность у FastReport.Net сворачивать и разворачивать группировку отчета.
    Вопрос 2: Например в отчете нужно вывести прейскурант услуг. Справочник хранится в иерархическом виде. Как такие данные можно организовать в FastReport.Net если не известно кол-во вложенности и опять же как реализовать возможность сварачивать и разворачивать группировки?

    Заранее блогадарен вам.
  • отредактировано 07:56
    1) Такая возможность есть, с помощью скрипта. Смотрите демо-отчет "Interactive Reports/Drill-Down Groups".
    2) Про отчеты с иерархией можно почитать тут:
    http://fast-report.com/documentation/UserM...nthierarchy.htm
    Также смотрите демо-отчет "General/Hierarchic List". Насчет сворачивания иерархии не уверен, что получится сделать в скрипте.
  • SysolyatinSNSysolyatinSN Екатеринбург
    отредактировано 07:56
    По первой теме, я немного не правильно выразился по поводу sql запроса. В общем я в дизайнере отчета, при добавлении источника указал источник как SQL запрос к базе вставил запрос. И сделал фильтрацию выборки средствами FastReport, создал форму в дизайнере отчета и вытащил два раза поле с датой. Но это не удобно тем что это форма появляется только при открытии отчета, а хотелось бы сделать возможность изменять период и по нажатию кнопки выводить отчет.
    Примерно знаю как это сделать, сложность вызвало редактирование текста запроса. Например есть запрос
    SELECT
    PRODUCT.PRODUCT_ID,PRODUCT.DATE,PRODUCT.PRICE
    FROM
    PRODUCT
    WHERE
    PRODUCT.DATE>=ПараметрНачалоПериода AND PRODUCT.DATE<=ПараметрКонецПериода
  • отредактировано 07:56
    Менять текст sql не стоит. Определите в запросе два параметра и привяжите их к параметрам отчета, как описано здесь:
    http://fast-report.com/documentation/UserM...passvalueto.htm
    Ну а в параметры отчета значение передавайте из программы.
  • SysolyatinSNSysolyatinSN Екатеринбург
    отредактировано 07:56
    Скажите в чем различие купленной версии FR.Net от версии демонстрационной. Демо версия вроде бы ничем не ограниченна. Можно тренироваться строить отчеты и.т.д. Вопрос я этот задал, так как FR очень понравился своим функционалом по сравнению с встроинным CrystalReport в VS 2008. В перспективе хочу приобрести лицензию на FR, когда более подробней познакомлюсь с компонентой. И еще вопросик лицензионное соглашение предусматривает получение обновления продукта или за каждую версию нужно доплачивать? И как часто в FastReport.Net появляются новый функционал?
  • отредактировано 07:56
    Ограничения демо-версии проявляются при печати и экспорте. На отпечатке есть водяной знак, также нельзя напечатать более 5 страниц.
    Новые версии можно бесплатно получать в течение года. После этого надо продлять подписку (за 1/3 цены). Частота появления нового функционала пока довольно высокая.
  • SysolyatinSNSysolyatinSN Екатеринбург
    отредактировано July 2010
    AlexTZ подскажите пожалуйста, что не так делаю. Добавляю источник данных SQL запрос, указываю парамеетры:
    SELECT
     FM_ACCOUNT_TRAN.TRAN_DATE,FM_ACCOUNT_TRAN.FM_ACCOUNT_TRAN_ID 
    FROM
     FM_PAYMENTS FM_PAYMENTS JOIN FM_ACCOUNT_TRAN FM_ACCOUNT_TRAN ON FM_ACCOUNT_TRAN.FM_ACCOUNT_TRAN_ID = FM_PAYMENTS.FM_ACCOUNT_TRAN_ID 
     JOIN FM_PAYMODE FM_PAYMODE ON FM_PAYMODE.FM_PAYMODE_ID = FM_ACCOUNT_TRAN.FM_PAYMODE_ID 
    WHERE
     (FM_ACCOUNT_TRAN.TRAN_TYPE not in ('Z','J','K'))
     AND (ISNULL(FM_PAYMODE.PAYMODE_TYPE,9) IN (0,2,9))
     AND ((FM_ACCOUNT_TRAN.TRAN_DATE >=@StartDate AND FM_ACCOUNT_TRAN.TRAN_DATE - 1 < @EndDate))
    GROUP BY FM_ACCOUNT_TRAN.TRAN_DATE,FM_ACCOUNT_TRAN.FM_ACCOUNT_TRAN_ID,cast((PATIENTS.NOM + ' ' + PATIENTS.PRENOM + ' ' + 
     PATIENTS.PATRONYME) AS VARCHAR(100)),FM_PAYMODE.LABEL
    ORDER BY FM_PAYMODE_LABEL
    

    на следующей странице добавляю эти параметры указываю тип DateTime, в Expression указываю параметр из отчета. При нажатии Далее выдает ошибку "Failed to convert parametr value from a Variant to DateTime" в чем я ошибся?
  • отредактировано 07:56
    Забыли указать DefaultValue для параметра?
  • SysolyatinSNSysolyatinSN Екатеринбург
    отредактировано 07:56
    С параметрами разобрался. Но вот с передачей возникли проблемы.
    Создал форму вытащил PreviewControl, 2 DateTimePiker'а и кнопку. На клик кнопки прописал:
    private void buttonStart_Click(object sender, EventArgs e)
            {
                report_kassa.SetParameterValue("StartDate", StartDate); //StartDate это DateTimePiker
                report_kassa.SetParameterValue("EndDate", EndDate); //EndDate это DateTimePiker
                if (report_kassa.Prepare())
                {
                    previewControl1.Enabled = true;
                    report_kassa.ShowPrepared();
                }
            }
    

    пишет ошибку при выполнении строки if (report_kassa.Prepare())
    (TitlePeriodText): error CS0103: Имя 'DateTimePicker1' отсутствует в текущем контексте
    (TitlePeriodText): error CS0103: Имя 'DateTimePicker2' отсутствует в текущем контексте

    Делал по инструкции, не могу понять в чем проблема
  • SysolyatinSNSysolyatinSN Екатеринбург
    отредактировано 07:56
    Если просто создать report1 и в дизайнере определить поля, то там все просто.
    report1.Show();
    а вот работа с компонентом previewControl1 и как к нему цеплять сконфигурированный report1 в инструкции не нашел.
  • отредактировано 07:56
    Ну сам-то DateTimePiker зачем передавать?

    report_kassa.SetParameterValue("StartDate", StartDate.Value);
    report_kassa.SetParameterValue("EndDate", EndDate.Value);
  • SysolyatinSNSysolyatinSN Екатеринбург
    отредактировано 07:56
    Спасибо AlexTZ. Я просто на 1С програмлю еще, не привык к жосткой типизации. С С# только знакомлюсь.

    а на счет previewControl1
    написал:
    а вот работа с компонентом previewControl1 и как к нему цеплять сконфигурированный report1

    как мне его связать с отчетом?
  • отредактировано 07:56
    Вот так:

    report1.Preview = previewControl1;
  • SysolyatinSNSysolyatinSN Екатеринбург
    отредактировано 07:56
    AlexTZ написал: »
    Вот так:

    report1.Preview = previewControl1;

    Огромное спасибо.
  • SysolyatinSNSysolyatinSN Екатеринбург
    отредактировано July 2010
    AlexTZ написал: »
    Ну сам-то DateTimePiker зачем передавать?

    report_kassa.SetParameterValue("StartDate", StartDate.Value);
    report_kassa.SetParameterValue("EndDate", EndDate.Value);

    :) не помогло, пишет ту же самую ошибку.
  • SysolyatinSNSysolyatinSN Екатеринбург
    отредактировано July 2010
    Все разобрался с ошибкой. Из DateTimePicker-ов передаю даты в параметры StartDate и EndDate с типом DateTime, пробую запустить отчет из дизайнера. Возвращает пустую выборку т.к. параметры пустые. Но когда пытаюсь привязать к запросу параметры и выбираю тип DateTime возникает ошибка. В инструкциях прочитал все что связанно с параметрами.
    Пересмотрел все демо примеры, и не одного не нашел с использованием параметров. В инструкциях то же нет примера.
  • отредактировано 07:56
    Вы не заполнили св-во DefaultValue параметра запроса, поэтому и ошибка. В демо-примерах запросов нет, т.к. демо-база хранится в виде xml и загружается в DataSet напрямую.
  • SysolyatinSNSysolyatinSN Екатеринбург
    отредактировано 07:56
    Можно ли при отладке приложения смотреть что получилось в результате обработки выражения. Например в параметр передается дата
    13.07.2010 00:00:00, а для SQL запроса нужно передать в формате 2010-07-13 00:00:00. С помощью выражения конвертирую, а как посмотреть что получилось в результате форматирования?
  • отредактировано 07:56
    Отладчика в FastReport нет, посмотреть не получится.
  • SysolyatinSNSysolyatinSN Екатеринбург
    отредактировано 07:56
    Уважаемый AlexTZ, хочу попросить у вас совета.

    Когда в SQL запросе нужно задавать много параметров, например период,отделение,сотрудник, и.т.д. Если параметры все заполняются то прописать WHERE в запросе, проблем никаких не составляет, но вот когда какой нибудь параметр не укажут, то в запросе нужно убрать это условие, иначе произойдет ошибка.
    В 1С я делал следующим образом: в условии проверял заполнено ли поле, если заполнено то формировал строку с условием и добавлял к запросу, иначе возвращал пустую строку. подскажите как бы поступили в такой ситуации.
    Чтоб сделать проверку для периода пришлось вот так вот извратиться:
    WHERE 
     FM_BILL.BILL_DATE>=CASE 
      WHEN @StartDate IS NOT NULL THEN @StartDate 
      WHEN @StartDate IS NULL THEN ''
     END
    AND
     FM_BILL.BILL_DATE<=CASE 
      WHEN @EndDate IS NOT NULL THEN @EndDate 
      WHEN @EndDate IS NULL THEN ''
     END
    
  • отредактировано 07:56
    Можно текст запроса формировать в коде, вот так:

    TableDataSource table = Report.GetDataSource("MyTable") as TableDataSource;
    table.SelectCommand = "select * from ...";

    Этот код можно выполнить в скрипте отчета (например, в обработчике события BeforePrint у бэнда - заголовка отчета), или в своей программе, перед запуском отчета.

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

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