Ошибка в 3.16 ?

отредактировано 05:44 Раздел: FastReport 3.0
После установки версии 3.16 отчеты, ранее нормально работающие, перестали открываться. Ошибка: Could not convert variant of type (Null) into type (OleStr). Данные для отчета берутся из MS SQL через TADODataset.

Комментарии

  • MichaelMichael планета Земля
    отредактировано 05:44
    Все следы предыдущей версии выкорчеваны полностью? Более подробное описание проблемы на support сбросьте, чтобы можно было её смоделировать. Или, лучше, простенький пример сами набросайте и отошлите.
  • MichaelMichael планета Земля
    отредактировано 05:44
    Кстати, в скрипте отчёта, случаем, не используется JScript или VBScript? В 3.16 выявлена подобная ошибка. Сейчас работаем над устранением.
  • отредактировано 05:44
    В отчете на MasterData лежит несколько TfrxMemoView, связанных с полями DataSet. Скрипты не используются.

    Вот простенький пример:
    ...

    TForm1 = class(TForm)
    ADODataSet1: TADODataSet;
    frxDBDataset1: TfrxDBDataset;
    Button1: TButton;
    frxReport1: TfrxReport;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    ...

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ADODataset1.ConnectionString:=...; //Формируем строку подключения к SQL-серверу через SQLOLEDB
    ADODataset1.CommandText:='select Field1, Field2 from table1';
    ADODataset1.Open;
    frxReport1.ShowReport(); //Как только доходит до записи, содержащей NULL - возникает ошибка.
    end;

    Порывшись в исходниках, нашел:
    В модуле frxDBSet в функции TfrxDBDataset.GetDisplayText есть такие строки:

    {$IFDEF Delphi5}
    if TField(Fields.Objects) is TWideStringField then
    s := TField(Fields.Objects).Value
    else
    {$ENDIF}
    s := TField(Fields.Objects).DisplayText;

    Value с типом Variant присваивается переменной s типа WideString. Естественно, если Value равно Null, будет ошибка.
  • отредактировано 05:44
    Fix:
    {$IFDEF Delphi5}
    if TField(Fields.Objects) is TWideStringField then
    s := VarToWideStr(TField(Fields.Objects).Value)
  • отредактировано September 2005
    Noskov написал:
    Порывшись в исходниках, нашел:
    В модуле frxDBSet в функции TfrxDBDataset.GetDisplayText есть такие строки:

    {$IFDEF Delphi5}
            if TField(Fields.Objects) is TWideStringField then
              s := TField(Fields.Objects).Value
            else
    {$ENDIF}
              s := TField(Fields.Objects).DisplayText;

    Value с типом Variant присваивается переменной s типа WideString. Естественно, если Value равно Null, будет ошибка.
    А ещё если бы вы посмотрели хелп, то после того наверняка нашли бы в исходниках frxClass.pas строки которые разрешит Вашу проблему автоматически:
    if FEngineOptions.ConvertNulls and (Value = Null) then
    case ds.FieldType[fld] of
    fftNumeric: Value := 0;
    fftString: Value := '';
    fftBoolean: Value := False;
    end;
    Result := True;
    Для этого в EngineOptions репорта выставите опцию ConvertNulls в true.
  • отредактировано 05:44
    ConvertNulls как раз выставлена в true, а ошибка все равно появляется ...
    Fix от AlexTZ помог.

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

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