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

Работаю с 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
Ошибка в frxClass.pas ?
    #38053835
Саша147
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Саша147Memo 6. Error in expression '': ';' expected

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

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

З.Ы. Лучше спросить в форуме Delphi . Там по FastReport могут подсказать.
...
Рейтинг: 0 / 0
Ошибка в frxClass.pas ?
    #38054560
Саша147
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
4 сообщений из 4, страница 1 из 1
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Ошибка в frxClass.pas ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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