Firebird && LazReport

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

Firebird && LazReport

Сообщение qwerty123 » 05.05.2015 15:04:43

Добрый день.
Осваиваю LazReport на стандартной базе Employers. Подскажите, пожалуйста, такие штуки:
1. В табличке employee есть поля first_name, last_name и job_country. Как мне сделать отчет такого формата:
Россия
Иванов Иван
Петров Петр

Китай
Сунь Ли
Хунь Чунь

США
Крейзи Ник

? Я все примеры пересмотрел в LazReport'e, ни один не подошел. Я могу без проблем кинуть master-band, а на него 3 поля, и получить просто таблицу. А мне тут нужна иерархия.

2. Чтобы вытащить значение из базы нужно в band'e написать [SQLQuery1."SOME_FIELD"], при этом SQLQuery1 должен лежать на форме. А что писать, если SQLQuery является свойством какого-нибудь объекта, который создается в real-time? Вариант [OBJECT1.SQLQuery1."SOME_FIELD"] не работает :(

P.S. Lazarus 1.4, FPC в комплекте шел
qwerty123
новенький
 
Сообщения: 14
Зарегистрирован: 05.05.2015 14:49:21

Re: Firebird && LazReport

Сообщение alexs » 05.05.2015 15:41:27

Запрос отсортировать по стране
В отчёте использовать группировку по стране
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Firebird && LazReport

Сообщение qwerty123 » 05.05.2015 15:46:25

alexs писал(а):В отчёте использовать группировку по стране

Можно подробнее: как это сделать?
qwerty123
новенький
 
Сообщения: 14
Зарегистрирован: 05.05.2015 14:49:21

Re: Firebird && LazReport

Сообщение alexs » 05.05.2015 16:17:21

Выше мастер-бэнда положить бэнд "Заголовко группы"
Сразу откроется редактор этого бэнда. В нём указать поле страны из вашего запроса к БД
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Firebird && LazReport

Сообщение qwerty123 » 05.05.2015 16:40:39

Да, это то, что нужно, спасибо. А если я хочу такой формат:
Код: Выделить всё
Россия
Админы
   Иванов Иван
   Петров Петр
Тестеры
  Сидоров Сидор

Китай
Админы
  Кынь Ху
Тестеры
  Сло Май
  Нера Ботай

Нужно просто бросить второй заголовок группы?

P.S. А подскажите, пожалуйста, еще это:
qwerty123 писал(а):Чтобы вытащить значение из базы нужно в band'e написать [SQLQuery1."SOME_FIELD"], при этом SQLQuery1 должен лежать на форме. А что писать, если SQLQuery является свойством какого-нибудь объекта, который создается в real-time? Вариант [OBJECT1.SQLQuery1."SOME_FIELD"] не работает :(
qwerty123
новенький
 
Сообщения: 14
Зарегистрирован: 05.05.2015 14:49:21

Re: Firebird && LazReport

Сообщение alexs » 05.05.2015 18:01:37

1. Да - вторая группа
2. Вместе с DataSet-ом надо добавить объект frDataSet, который будет ссылаться на DataSet.
Ну и соответсвенно, рисовать и показывать отчёт в тот момент, когда твой запрос (DataSet) создан.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Firebird && LazReport

Сообщение qwerty123 » 07.05.2015 14:32:24

Вот я делаю:
Код: Выделить всё
  DataSource1.DataSet := Obj.SQLQuery1;
  frDBDataSet1.DataSource := DataSource1;
  Obj.SQLQuery1.SQL.Text := ...
  Obj.SQLQuery1.Active := true; 

но что писать в самих band'ах, как к полю обратиться без [OBJ.SQLQuery1."SOME_FIELD"]?
qwerty123
новенький
 
Сообщения: 14
Зарегистрирован: 05.05.2015 14:49:21

Re: Firebird && LazReport

Сообщение alexs » 07.05.2015 17:59:46

В генераторе - это и есть верное обращение. Воспользуйся функцией вставки поля в текст. Будет сформирован корректный вызов.
Вот пример скрипта из моего реального отчёта:
Код: Выделить всё
  lrFormStorage1.StoreProps;

  SA1:=0;
  SA2:=0;
  SA3:=0;
  SA4:=0;
  ASum:=0;
  ASumAvg:=0;
  ATitle:='';
  RepType:=0;

  quMain.Open;
  while not quMain.Eof do
  begin
    SA1:=SA1 + [Dialog1.quMain."sum_year"];
    SA2:=SA2 + [Dialog1.quMain."sum_month_3"];
    SA3:=SA3 + [Dialog1.quMain."sum_month_cur"];
    SA4:=SA4 + [Dialog1.quMain."sum_month_year_prior"];
    quMain.Next;
  end;
  quMain.First;
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Firebird && LazReport

Сообщение qwerty123 » 09.05.2015 12:54:52

Я попробовал вот так:
Код: Выделить всё
  TMyClass = class
  public
    SQLQuery1: TSQLQuery;
    constructor Create;
    destructor Destroy; override;
  end;

{ TMyClass }

constructor TMyClass.Create;
begin
  SQLQuery1 := TSQLQuery.Create(Form1);
end;

destructor TMyClass.Destroy;
begin
  SQLQuery1.Free;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var MyClass: TMyClass;
begin
  MyClass := TMyClass.Create;
  try
    DataSource1.DataSet := MyClass.SQLQuery1;
    frDBDataSet1.DataSource := DataSource1;
    IBConnection1.Connected := true;

    MyClass.SQLQuery1.DataBase := IBConnection1;
    MyClass.SQLQuery1.SQL.Text := 'select * from employee order by job_country, job_code';
    MyClass.SQLQuery1.Active := true;

    frReport1.LoadFromFile('Безымянный.lrf');

    frReport1.FindObject('Memo10').Memo.Clear;
    frReport1.FindObject('Memo10').Memo.AddText('[MyClass.SQLQuery1."JOB_COUNTRY"]');

    frReport1.ShowReport;
  finally
    MyClass.Free;
  end;
end;

не работает: 'Undefined symbol: MyClass.SQLQuery1."JOB_COUNTRY"' :( Или как-то по-другому надо было?
qwerty123
новенький
 
Сообщения: 14
Зарегистрирован: 05.05.2015 14:49:21

Re: Firebird && LazReport

Сообщение alexs » 09.05.2015 13:15:29

Попробуй [Form1.SQLQuery1."JOB_COUNTRY"]

Добавлено спустя 54 секунды:
А чтобы быть точно уверенным - на время разаботки используй вместо frReport1.ShowReport; - frReport1.DesignReport;
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Firebird && LazReport

Сообщение qwerty123 » 09.05.2015 14:37:32

alexs писал(а):Попробуй [Form1.SQLQuery1."JOB_COUNTRY"]

Да, так получилось

alexs писал(а):А чтобы быть точно уверенным - на время разаботки используй вместо frReport1.ShowReport; - frReport1.DesignReport;

Это чтобы использовать превью для уже сгенерированного отчета? Хитро :)
qwerty123
новенький
 
Сообщения: 14
Зарегистрирован: 05.05.2015 14:49:21

Re: Firebird && LazReport

Сообщение qwerty123 » 10.05.2015 16:13:53

А есть ли способ обращаться к объектам отчета не через FindObject?
Код: Выделить всё
    frReport1.FindObject('Memo10').Memo.Clear;
    frReport1.FindObject('Memo10').Memo.AddText('[MyClass.SQLQuery1."JOB_COUNTRY"]');


Добавлено спустя 1 час 30 минут 19 секунд:
Подскажите пожалуйста, как еще избавиться от интервалов между строчками в мастер-банде, чтобы была монолитная таблица?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
qwerty123
новенький
 
Сообщения: 14
Зарегистрирован: 05.05.2015 14:49:21

Re: Firebird && LazReport

Сообщение *Rik* » 10.05.2015 19:09:43

qwerty123 писал(а):А есть ли способ обращаться к объектам отчета не через FindObject?
Код: Выделить всё
    frReport1.FindObject('Memo10').Memo.Clear;
    frReport1.FindObject('Memo10').Memo.AddText('[MyClass.SQLQuery1."JOB_COUNTRY"]');


Добавлено спустя 1 час 30 минут 19 секунд:
Подскажите пожалуйста, как еще избавиться от интервалов между строчками в мастер-банде, чтобы была монолитная таблица?

Попробуйте выделить Memo и ужерживая Shift с помощью стрелок, раздвинуть высоту Memo по 1 пикселю до нужного размера.
Аватара пользователя
*Rik*
постоялец
 
Сообщения: 451
Зарегистрирован: 19.04.2011 12:18:51
Откуда: Урал

Re: Firebird && LazReport

Сообщение qwerty123 » 11.05.2015 10:29:52

*Rik* писал(а):Попробуйте выделить Memo и ужерживая Shift с помощью стрелок, раздвинуть высоту Memo по 1 пикселю до нужного размера.

Да, это сработало, правда пришлось подгонять попиксельно, чтобы границы смежных строк не задвоились, а наложились

Добавлено спустя 1 час 7 минут 33 секунды:
А как можно сделать такую иерархию?
Код: Выделить всё
Россия            10
     Админы       7
     Тестеры      3

Китай              100
     Админы        85
     Тестеры       15

Я кинул заголовок группы, куда пишу страну ([SQLQuery."country"]) и кол-во ([SQLQuery."cnt"]), и мастер-данные, куда профессию ([SQLQuery."speciality"]) и опять кол-во ([SQLQuery."cnt"]). Запрос:
Код: Выделить всё
SELECT country, speciality, count(*) cnt
FROM table1
GROUP BY country, speciality
ORDER BY country, speciality

Но как-то полученный результат не совпадает с ожидаемым: выводится заголовок группы только для первой строки, а потом фигачатся мастер-данные без разбивки по группам
qwerty123
новенький
 
Сообщения: 14
Зарегистрирован: 05.05.2015 14:49:21

Re: Firebird && LazReport

Сообщение alexs » 11.05.2015 12:37:25

qwerty123 писал(а):Подскажите пожалуйста, как еще избавиться от интервалов между строчками в мастер-банде, чтобы была монолитная таблица?

В дизайнере есть же кнопка специальная для выравнивания объектов по сетке.
И в настройках редактор есть параметр - выравнивать по сетке.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

Рейтинг@Mail.ru