Гость
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Ошибка в frxClass.pas ? / 4 сообщений из 4, страница 1 из 1
26.11.2012, 18:54
    #38053831
Саша147
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в frxClass.pas ?
Здравствуйте!

Работаю с FastReport 4.12. К отчету TfrxReport подключаю динамически датасет. Динамически создаю переменные в отчёте. В некоторые из них я складываю значения из БД. Далее, в коде, присваиваю значения нескольким переменным, и показываю отчёт:

Код: pascal
1.
2.
3.
4.
5.
frxRep.Variables['A'] := 'a';
frxRep.Variables['B'] := 'b';
frxRep.Variables['C'] := 'c';
...
frxRep.ShowReport;



Далее, в Обработчике OnGetValue присваиваю некоторым переменным значения из БД:

Код: pascal
1.
2.
3.
for i:=10 to Dataset.FieldsCount - 1 do
    if ( fDS.DataSet.Fields.FindField(VarName)<>nil ) then
      Value := fds.DataSet.FieldByName(VarName).Value;



Проблема в том, что на некоторые значения полей БД (со скобками), например 'Зелёный бор (лес)', возникает ошибка в модуле frxClasses.pas при нахождении в значении поля символов #13#10:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
unit frxClasses.pas
...
function TfrxReport.DoGetValue(const Expr: String; var Value: Variant): Boolean;
var
  i: Integer;
  ds: TfrxDataSet;
  fld: String;
  val: Variant;
  v: TfsCustomVariable;
begin
  Result := False;
  Value := Null;

  if Assigned(frxFR2Events.OnGetValue) then
  begin
    TVarData(val).VType := varEmpty;
    frxFR2Events.OnGetValue(Expr, val);
    if TVarData(val).VType <> varEmpty then
    begin
      Value := val;
      Result := True;
      Exit;
    end;
  end;

  { 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;

  { searching in the sys variables }
  i := FSysVariables.IndexOf(Expr);
  if i <> -1 then
  begin
    case i of
      0: Value := FEngine.StartDate;  { Date }
      1: Value := FEngine.StartTime;  { Time }
      2: Value := FPreviewPages.GetLogicalPageNo; { Page }
      3: Value := FPreviewPages.CurPage + 1;  { Page# }
      4: Value := FPreviewPages.GetLogicalTotalPages;  { TotalPages }
      5: Value := FEngine.TotalPages;  { TotalPages# }
      6: Value := FEngine.CurLine;  { Line }
      7: Value := FEngine.CurLineThrough; { Line# }
      8: Value := frxGlobalVariables['CopyName0'];
    end;
    Result := True;
    Exit;
  end;

  { value supplied by OnGetValue event }
  TVarData(val).VType := varEmpty;
  if Assigned(FOnGetValue) then
    FOnGetValue(Expr, val);
  if Assigned(FOnNewGetValue) then
    FOnNewGetValue(Self, Expr, val);
  if TVarData(val).VType <> varEmpty then
  begin
    Value := val;
    Result := True;
    Exit;
  end;

  { searching in the variables }
  i := FVariables.IndexOf(Expr);
  if i <> -1 then
  begin
    val := FVariables.Items[i].Value;
    if (TVarData(val).VType = varString) or (TVarData(val).VType = varOleStr){$IFDEF Delphi12} or (TVarData(val).VType = varUString){$ENDIF} then
    begin
      if Pos(#13#10, val) <> 0 then     //<< вот тут возникает
        Value := val
      else
        Value := Calc(val);
    end
    else
      Value := val;
    Result := True;
    Exit;
  end;

  { searching in the global variables }
  i := frxGlobalVariables.IndexOf(Expr);
  if i <> -1 then
  begin
    Value := frxGlobalVariables.Items[i].Value;
    Result := True;
    Exit;
  end;

  if not Assigned(frxFR2Events.OnGetScriptValue) then
  begin
    { searching in the script }
    v := FScript.FindLocal(Expr);
    if (v <> nil) and
      not ((v is TfsProcVariable) or (v is TfsMethodHelper)) then
    begin
      Value := v.Value;
      Result := True;
      Exit;
    end;
  end;
end;



Т.е. при вычислении значения Pos(#13#10, val) <> 0, получается что эти символы есть в val, хотя их нет, и в результате выполняется
Код: pascal
1.
Value := Calc(val);


В связи с чем отчёт падает с ошибкой: "Memo 6. Error in expression '': ';' expected". Кто с таким поведением сталкивался? Помогите пожалуйста.
...
Рейтинг: 0 / 0
26.11.2012, 18:57
    #38053835
Саша147
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в frxClass.pas ?
Саша147Memo 6. Error in expression '': ';' expected

Не дописал текст ошибки до конца: "Memo 6. Error in expression 'Зелёный бор (лес)': ';' expected"
...
Рейтинг: 0 / 0
27.11.2012, 12:27
    #38054552
user89
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в frxClass.pas ?
Саша147,

попробуйте вместо Pos использовать AnsiPos

З.Ы. Лучше спросить в форуме Delphi . Там по FastReport могут подсказать.
...
Рейтинг: 0 / 0
27.11.2012, 12:31
    #38054560
Саша147
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в frxClass.pas ?
user89, спасибо! Возьму на заметку. Хотя и решил проблему другим способом. При передаче значений параметров, эти значения следует взять в кавычки (или добавить код #39):

Код: pascal
1.
2.
3.
frxRep.Variables['A'] := #39 + 'a' + #39;
frxRep.Variables['B'] := #39 + 'b' + #39;
frxRep.Variables['C'] := #39 + 'c' + #39;
...
Рейтинг: 0 / 0
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Ошибка в frxClass.pas ? / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]