LazReport

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
slyubez
постоялец
Сообщения: 185
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

Благодарю.

Тут нарвался еще на непонятный косяк. В официальном вики-учебнике есть вот такой пример передачи значения в переменную:

Код: Выделить всё

procedure TForm1.Button1Click(Sender:TObject);
begin
  frReport1.Values.FindVariable('test').Field := QuotedStr('test1');
  frReport1.ShowReport;
end;

У меня такой метод почему-то не работает. Вместо значения переменной - пустота на месте, где оно должно быть. Имена переменных - английские; их названия прописывал через мемо записи категорий и переменных в дизайнере. Строки задания значений я записал после загрузки отчета из файла и назначения датасета компоненту TfrDBDataset. В качестве значений пробовал и английский, и русский текст - не идёт. Что касается OnGetValue - его хотелось бы использовать лишь в крайнем случае, если этот способ не заведется, ибо многомодульная структура проекта мешает такому использованию.

Добавлено спустя 4 часа 21 минуту 1 секунду:
Полез по этой проблеме в сорцы с отладчиком. Привожу код с моими комментами.
Модуль LRClass.pas

Код: Выделить всё

procedure TfrReport.GetVariableValue(const s: String; var aValue: Variant); 
...
begin
  TVarData(aValue).VType := varEmpty;

  DoGetValue(s,aValue); //по исполнении aValue=UnAssigned
     
  if TVarData(aValue).VType = varEmpty then
  begin
    Value := Values.FindVariable(s); //заданное значение видно в отладчике
    if Assigned(Value) then
    begin
      with Value do
      begin
         case Typ of
          vtNotAssigned: aValue := ''; //а вот здесь значение обнуляется
          vtDBField    : begin
                            F := TfrTField(DSet.FindField(Field));
                            if not F.DataSet.Active then
                              F.DataSet.Open;
                            if Assigned(F.OnGetText) then
                              aValue:=F.DisplayText
                            else
                              aValue:=lrGetFieldValue(F);//F.AsVariant;
                          end;
          vtFRVar       : aValue := frParser.Calc(Field);
          vtOther       : begin
                            if OtherKind = 1 then
                              aValue:=frParser.Calc(Field)
                            else
                              aValue:=frParser.Calc(frSpecFuncs[OtherKind]);
                          end;
         end;
      end;

Похоже, этим переменным нужно задавать еще какой-то тип. Но как это делать в дизайнере - непонятно.

Добавлено спустя 27 минут 54 секунды:
Заменил строчку 8897 в LR_Class.pas

Код: Выделить всё

vtNotAssigned: aValue := '';

на

Код: Выделить всё

vtNotAssigned: aValue := Field;

Заработало. Но могу лишь понадеяться, что я не сломал другого функционала такой заменой.

Добавлено спустя 3 часа 23 минуты 25 секунд:
Кто-нибудь может загнать последнюю проблему в багтрекер? Я там зарегился, но подтверждение мне на мыло не пришло.
xcod
постоялец
Сообщения: 108
Зарегистрирован: 07.08.2009 12:37:23

Сообщение xcod »

я вот так передаю значение в переменную

Код: Выделить всё

frVariables['DIAG'] := DBLupCBoxDIAG.Text;
slyubez
постоялец
Сообщения: 185
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

я вот так передаю значение в переменную

Этим способом я пользовался уже давно, когда работал с FreeReport (он описан в его документации). У меня такая запись не компилировалась, даже когда я прописал Lr_intrp в uses.
xcod
постоялец
Сообщения: 108
Зарегистрирован: 07.08.2009 12:37:23

Сообщение xcod »

у меня на lr_class ссылается
правда я лазаря с паскалем не менял с 13 года
все компилируется
slyubez
постоялец
Сообщения: 185
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

у меня на lr_class ссылается
правда я лазаря с паскалем не менял с 13 года
все компилируется

Попробовал еще раз. Код скомпилировался. Однако с ним та же самая проблема, что и выше - то есть, без корректировки строчки значение переменной отображается пустым.
xcod
постоялец
Сообщения: 108
Зарегистрирован: 07.08.2009 12:37:23

Сообщение xcod »

тогда не знаю
возможно чет сломали или переделали
вы пробовали на тестовом проекте?
создать с нуля и проверить
slyubez
постоялец
Сообщения: 185
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

вы пробовали на тестовом проекте?
создать с нуля и проверить

Наткнулся на своем новом проекте (тестовым его назвать язык не поворачивается), но сделать тестовый простейший - не проблема. Но тогда уж правильнее это делать на чистой среде. На днях проверну.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

xcod писал(а):frVariables['DIAG'] := DBLupCBoxDIAG.Text;

Это правильный метод. Работает нормально.
slyubez
постоялец
Сообщения: 185
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

Прилагаю тестовый проект и пару скриншотов с изображением дизайнера и отчета в превью-окне.
Использую Lazarus 1.2.6, FPC 2.6.4, ревизию SVN: 46529. Версия под Windows.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Для такого метода не надо объявлять переменную в самом отчёте.
Достаточно сделать присвоение.

А вообще - есть конечно глюк. Там переменные ведутся в 2-х массивах. Надо бы переделать.
slyubez
постоялец
Сообщения: 185
Зарегистрирован: 31.03.2015 07:44:07

Сообщение slyubez »

Не холивара ради - а какое исключение должен выкидывать именно LazReport? Проверять, находится ли файл по указанному пути - обязанность программиста.

Хотя бы о невозможности открыть файл отчета. Если файл окажется на месте, но будет запорчен, LR что, тоже исключения не выкинет? Здесь вот возник косяк с путем, и из-за невыданного исключения возник вопрос - глюк это LR или строки с именем? У FastReport метод LoadFromFile выкидывает исключение.
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

Хочу вернуться к вопросу группировки на Detail Data Band. Имеется Master Data, за ним Group Header, за ним Detail Data, группировка не работает. Скажите пожалуйста, группировка не работает на Detail Data или я что-то не так делаю? Если группировку применяю к Master Data все нормально...
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

alexs Добрый день. Никак у меня все же не получается запустить LazReport.
Исходные - Лазарус 1.4.0, LazReport - пакет из самого свежего SVN, перекомпилированный
MySQL 5.6, доступ к ней через компоненты ZeosDBO

Есть открытый источник данных ZTable, в отчете просто сделал бэнд details и внес на лист все поля таблицы.
Метод ShowReport ничего не открывает, превью в дизайнере отчетов также ничего не показывает.

Что мне делать, не знаю((((
Аватара пользователя
*Rik*
постоялец
Сообщения: 453
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал
Контактная информация:

Сообщение *Rik* »

java73 писал(а):alexs Добрый день. Никак у меня все же не получается запустить LazReport.
Исходные - Лазарус 1.4.0, LazReport - пакет из самого свежего SVN, перекомпилированный
MySQL 5.6, доступ к ней через компоненты ZeosDBO

Есть открытый источник данных ZTable, в отчете просто сделал бэнд details и внес на лист все поля таблицы.
Метод ShowReport ничего не открывает, превью в дизайнере отчетов также ничего не показывает.

Что мне делать, не знаю((((

Почему details?

Начинать лучше с Master Data.

Для ZTable должен существовать TfrDBDataSet (источник данных для отчета) для того, чтобы отчет мог прокручивать ваш ZTable.
В этом примере, для набора данных REALIZ добавлен компонент frREALIZ: TfrDBDataSet, который связан с REALIZ
Изображение

В отчете MasterData связан с frREALIZ
Изображение

Добавлено спустя 3 часа 14 минут 5 секунд:
Нашел такой косяк:
Новая колонка стартует без отступа:
Изображение

alex, можешь помочь? Я как понял ты похоже в коде lazreporta шаришь. На вскидку исправить не удалось, там есть переменная CurY, манипуляции с ней ни чего не дали...
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

*Rik* писал(а):Новая колонка стартует без отступа:


А это как добился?
Колонки нормально выравниваться должны.
Может пытался подотчёты (subreport-ы) использовать?
Ответить