Передача даты в запрос.

отредактировано February 2006 Раздел: FastReport 3.0
Добрый день!!!

Мне необходимо из дельфи передать в запрос отчета две даты для задания диаппазона выборки. Как это сделать корректно.
В рук. по fastreport есть пример как обращаться и работать с объектом мемо из дельфи. Но мне кажеться это немного нето. Заранее спасибо.

Комментарии

  • LexLex
    отредактировано 11:58
    Каким образом ты получаешь данные для отчета?
  • отредактировано 11:58
    В отчете есть запрос к таблицам БД. В этот запрос мне необходимо передать два параметра типа Date, для указания дтаппазона выборки.
  • LexLex
    отредактировано 11:58
    Есть несколько способов:

    1: Диалоговая форма в самом отчете.
    2: Ч/з обработчик TfrxReport.OnGetValue (см. документацию)
    3:
      MyQuery := frxReport.FindObject('MyQuery') as TfrxADOQuery;
      MyQuery.ParamByName('DateBegin').Value := DateBegin;
      MyQuery.ParamByName('DateEnd').Value := DateEnd;
    
  • отредактировано 11:58
    Спасибо за ответ. Ваше решение, тоже подходит.

    Я создал две переменные в отчет и в запросе указал их как параметры.
    Из дельфи к ним обратился как:
    frmFc.frxReport1.Variables['StartDate']:=dtpStartDate.Date;
          frmFc.frxReport1.Variables['StopDate']:=dtpStopDate.Date;
          frmFC.frxReport1.ShowReport;
    
    Все зарботало. Просто сначала наврал в синтаксисе.
  • отредактировано February 2006
    Еще вопросик.

    Добавил в мемо переменые StartDate и StopDate для отображения диаппазона за который произойдет выборка.
    При выполнении запроса он даты отобразил как 3691,2154.
    Как или где задается тип переменной.
    В моем случае мне нужен тип Date а он по умолчаню похоже на Variant.
    Подходящую функцию конвертации ненашол.
  • gpigpi
    отредактировано 11:58
    У Memo установите свойства Memo.DisplayFormat.Kind=fkDateTime and
    Memo.DisplayFormat.FormatStr='dd/mm/yyyy' (Можно и через контекстное меню)
  • отредактировано February 2006
    Вот спасибо то что нужно.
    А указать тип переменной я все таки могу или нет?
  • gpigpi
    отредактировано 11:58
    Нет. У переменных отчёта тип один - Variant
  • отредактировано 11:58
    gpi написал:
    Нет. У переменных отчёта тип один - Variant
    Описываю ситуацию:
    В приложении создается экземпляр TFrxReport.
    Программно добавляется новая переменная:
    AddVariable('Категория', 'МояДата', StrToDate('10.02.2006'));
    При работе приложения вызывается дизайнер отчета.
    На пустую форму добавляется переменная "МояДата".
    Вызывается окно предварительного просмотра.
    Отчет формируется и отображается корректно.
    Окно предварительного просмотра закрывается и вызывается повторно.
    Возникает сообщение об ошибке "Ошибка в выражении '10.02.2006':;".
    Отладка показала, что в процедуре TfrxReport.DoGetValue на участке
    val:= FVariables.Items.Value;
    if (TVarData(val).VType = varString) or (TVarData(val).VType = varOleStr) then
    при первом просмотре отчета VType = 7, т.е. дата.
    Но при втором просмотре VType уже равен 256 и ядро пытается выполнить Value:= Calc(val);!!! И выражение '10.02.2006' не поддается "расчету".
    Почему в коллекции FVariables VType отдельных элементов меняется с 7 на 256 я никак не могу понять!
    Определение обработчика OnGetValue исключает эту ситуацию, но вопрос принципа!
  • отредактировано 11:58
    sesna2 написал:
    Описываю ситуацию:
    Дополнительная информация.
    В код функции TfrxReport.DoGetValue добавляем для отладки ShowMessage, после чего отчетливо видно, что VType меняется с 7 на 256:

    ...
    i:= FVariables.IndexOf(Expr);
    if i<>-1 then
    begin
    val:= FVariables.Items.Value;

    ShowMessage(Format('TVarData(val).VType = %d', [TVarData(val).VType]));

    if (TVarData(val).VType = varString) or (TVarData(val).VType = varOleStr) then
    begin
    if Pos(#13#10, val)<>0 then
    Value:= val
    else
    Value:= Calc(val);
    end
    else
    Value:= val;
    Result:= True;
    Exit;
    end;
    ...
  • отредактировано 11:58
    sesna2 написал:
    sesna2 написал:
    Описываю ситуацию:
    Ужас!
    Оказывается после PrepareReport все объекты, в том числе и пременные, тянуться из Stream в виде xml тегов. Соответсвенно значение даты парсируется как значение свойства "value" из строки "value=10.02.2006". Выделеная подстрока "10.02.2006" присваивается в элемент коллекции FVariables именно как строка (... Value: String...). Естественно все типы летят к чертовой матери. Это относится и к другим типам, не только к дате. Только, например, целые числа парсер разбирает нормально. Но, сам факт вызова парсера, начиная со второго просмотра - это чересчур! Производительности - никакой!
    Если я сумбурно и непонятно выразился, пишите коменты. Я хочу разобраться в этой проблеме. Может быть я неправильно установил значения каких либо свойств, может "проблемы" вообще не существует...
  • отредактировано 11:58
    Все верно, перед выполнением отчета он сохраняется в поток, после выполнения - восстанавливается. Это, кстати, регулируется св-вом TfrxReport.EngineOptions.DestroyForms - если его поставить в False, сохранения-восстановления не будет, и не должно быть проблем с датами.
  • отредактировано 11:58
    AlexTZ написал:
    Все верно, перед выполнением отчета он сохраняется в поток, после выполнения - восстанавливается. Это, кстати, регулируется св-вом TfrxReport.EngineOptions.DestroyForms - если его поставить в False, сохранения-восстановления не будет, и не должно быть проблем с датами.
    Увы. Изменение свойства TfrxReport.EngineOptions.DestroyForms не помогло.
    Проверяется так: в обработчик события OnGetValue включаем текст
    Value := Freport.Variables[VarName];
    ShowMessage(Format('TVarData("%s").VType = %d', [VarName, TVarData(Value).VType]));
    Подчеркиваю, что при первом формировании отчета значение переменной (не только с типом дата) возвращается из коллекции TfrxReport.Variables. При повторном построении отчета ВСЕ переменные воспринимаются как текст и "вычисляются" как выражения движком FastScript. Фактически в моей ситуации получаются две проблемы:
    1) FastScript не умеет интерпретировать даты (целые числа без проблем, к примеру)
    2) Потеря заданного при создании переменной типа при сохранении и извлечении из Stream - а это уже существенный баг!!!
    3) Ненужные "вычисления выражений", начиная со второй попытки формирования, вместо того, чтобы напрямую брать значения переменных.
    Если я не прав, укажите где.
  • отредактировано 11:58
    AlexTZ написал:
    ... TfrxReport.EngineOptions.DestroyForms ...
    Это уже из области приколов разработчиков наверное!
    Имеем код:
    FReport.Name := 'TestReport';
    FReport.EngineOptions.DestroyForms := false;
    FReport.DesignReport;
    В дизайнере формируем страницу и запускаем предварительный просмотр.
    Ставим предварительно в модуле frClass точку останова в начале функции TfrxReport.PrepareReport. в Watch выводим свойство Name и FEngineOptions.DestroyForms. И что же видим?!
    Name = 'TestReport' - отлично!!!
    FEngineOptions.DestroyForms = true - ???!!!?????
    Что это?
    Естественно блок
    if FEngineOptions.DestroyForms then
    begin
    TempStream := TMemoryStream.Create;
    SaveToStream(TempStream);
    end;
    выполняется всегда.

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

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