Ошибка в выражении '01.04.2005': ';' expected

отредактировано 21:36 Раздел: FastReport 3.0
Есть переменная отчёта: FASTDATAN
В неё внесена переменная типа TDateTime - 01.04.2005.
В скрипте в заглавном модуле значение этой переменной присваивается переменной DOA-запроса
DOAQuery1.setVariable('P_datan', Get('FastDataN'));
После этого запрос переоткрывается.
Первый раз присвоение проходит нормально.
При повторном запуске отчета (при отладке) выдаётся ошибка:
*********************************************
Ошибка в выражении '01.04.2005': ';' expected
*********************************************
Только что попытался на втором запуске посмотреть тип
ShowMessage(IntToStr(VarType(Get('FastDataN'))));
на этой строке вылазит уже с вместе MasterData1
*********************************************
MasterData1: Ошибка в выражении '01.04.2005': ';' expected
*********************************************
Значение переменной в скрипте не трогаю.
Что это значит?
Отлаживаться невозможно, работать надо.

С уважением, Андрей

Комментарии

  • отредактировано 21:36
    отладчик показал, что во второй раз происходит обращение к TfrxReport.Calc
    в первый раз - нет
    function TfrxReport.DoGetValue выдаёт:
    в первый раз TVarData(val).VType <> varString
    в второй раз TVarData(val).VType = varString
  • отредактировано 21:36
    можно вообще создать отчет из одного скрипта
    begin
    ShowMessage(IntToStr(VarType(Get('FastDataN'))));
    end.
    и в проекте присвоить переменной значение
    activeReport.Variables := Null;
    activeReport.Variables := Date;
    И вызвать пару раз из design'ера
  • отредактировано 21:36
    После окончания формирования отчёта вызывается
    procedure TfrxReport.DoClear;
    begin
    .........
    FVariables.Clear;

    и сразу после этого вызывается

    procedure TfrxReport.ReadVariables(Reader: TReader);
    begin
    frxReadCollection(FVariables, Reader, Self);
    end;

    при этом все переменные преобразуются к типу string,
    т.к. тип их нигде не указан.
    в procedure frxReadCollection
    вызов Reader.ReadString возвращает строку
    ' Name="FASTDATAN" Value="01.04.2005"'
    *************************************
    ЧТО ДЕЛАТЬ?
  • отредактировано 21:36
    Чтобы не сваливалось при вызове GET(Index), используйте для нечисловых значений SET( Index, '''' + FASTDATAN + '''');
  • отредактировано 21:36
    Но это же неправильно!
    Где гарантия, что я потом получу правильно значение при обратной конвертации?
    Что не вылезут точки/запятые в числах и точки/слэши в датах?
    Почему вообще меняется тип переменой?
    Почему я в тип VARIANT(!) должен писать только строку?
    *************************************************
    Я уже сделал по-другому - через Script.Variables
    activeReport.Script.Variables[strName] := AllBPLSParams.arrVar.Value;
    Так вроде работает.
    С уважением, Андрей
  • отредактировано 21:36
    Хотя бы скажите, это фича или баг?
  • отредактировано 21:36
    Так как?
    Можно ли в переменных использовать тип, отличный от string?
    В документации сказано, что можно.
    А в жизни?
  • отредактировано 21:36
    Тип переменной при восстановлении отчета из потока не сохраняется - она становится String. Решения два:
    1) перед каждым вызовом отчета устанавливать переменные
    2) установить TfrxReport.EngineOptions.DestroyForms = False, чтобы переменные не перечитывались из временного потока.
  • отредактировано 21:36
    Смысл моей задачи такой: макеты отчёта хранятся на сервере в файлах *.fr3 (со временем на базе в BLOBах).
    Загружается общая форма из dll.
    Из неё грузится .fr3
    Для каждого .fr3 у нас существует список настроечных параметров.
    Эти параметры можно менять из общей формы.
    Затем они передаются в .fr3.
    После этого идет ShowReport.
    Также эта общая форма используется и для настройки макетов.
    Пока мне не представляется возможным использовать вариант 1 (как в дизайнере переустановить переданные извне переменные?), а вариант 2 я просто слабо себе представляю.
    Буду пока через Script.Variables.
    Спасибо.
    Андрей

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

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