Работа со скриптами

отредактировано 11:11 Раздел: FastReport 3.0
При использовании в скрипте строки вида <frdsDataSetName."FieldName">
если поля FieldName нет в наборе данных то это выражение принимает значение 0 типа Double но ошибки о том что нет поля не выдаётся.
Это так задумано и если да то для чего ?
ЗЫ. Очень неудобно при синтаксических ошибках в имени поля

Комментарии

  • отредактировано 11:11
    Сделал скрипт в демке:

    procedure Band4OnBeforePrint(Sender: TfrxComponent);
    begin
    Memo8.Text := <Customers."Comp8any">;
    end;

    ошибка выдается, как и положено.
  • отредактировано 11:11
    Сорри не совсем корректно описал условия при которых возникает проблема

    не работает если
    Memo19.Lines[0] := 'SomeText( ' + <frdsDataSet."FieldName"> + ' SomeText)'
    При этом если поле отсутствует то получаем EConvertError не могу преобразовать тип String в тип Double
  • отредактировано 11:11
    Ошибка выдается.
    Memo8.Text := 'SomeText' + <Customers."Comp8any"> + 'SomeText';
  • отредактировано 11:11
    function TfsMethodHelper.GetValue: Variant;
    var
      v: Variant;
      i: Integer;
      s: String;
      Instance: TObject;
    begin
      if Assigned(FOnCall) then
      begin
        v := VarArrayCreate([0, Count - 1], varVariant);
        for i := 0 to Count - 1 do
          v[i] := Params[i].Value;
    
        s := Name;
        if FIndexMethod then
          s := s + '.Get';
    
        Instance := nil;
        if not VarIsNull(ParentValue) then
          Instance := TObject(Integer(ParentValue));
    
        Result := FOnCall(Instance, FClassRef, AnsiUpperCase(s), v);
        for i := 0 to Count - 1 do
          if Params[i].IsVarParam then
            Params[i].Value := v[i];
        v := Null;
      end
      else
        Result := 0;
    end;
    

    У меня получается не Assigned(FOnCall) соответственно я получаю значение 0
    Интересно почему 0 а не Null или Unassigned ?
  • отредактировано 11:11
    Разобрался в чём дело
    function TfrxReport.DoGetValue(const Expr: String; var Value: Variant): Boolean;
    var
      i: Integer;
      ds: TfrxDataSet;
      fld: String;
      v: TfsCustomVariable;
      val: Variant;
    begin
      Result := False;
      Value := Null;
    
      { maybe it's a dataset/field? }
      GetDataSetAndField(Expr, ds, fld);
      if (ds <> nil) and (fld <> '') then
      begin
        Value := ds.Value[fld];
        if FEngineOptions.ConvertNulls and (Value = Null) then
          case ds.FieldType[fld] of
            fftNumeric:
              Value := 0;
            fftString:
              Value := '';
            fftBoolean:
              Value := False;
          end;
        Result := True;
        Exit;
      end;
    

    ds.Value[fld] возвращает Null и пишет frxErrors ошибку
    ds.FieldType[fld] если не находит поле возвращает fftNumeric
    соответственно получаем EConverterror так как ожидали String затем
    по результатам frxErrors получаем сообщение о отсутствии поля.

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

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