А.Н. писал(а):Как вывести в отчёте всех водителей для каждого договора?
А.Н. писал(а):Как делать master-detail Отчёт? Откуда брать detail данные? Возможно ли каким-то образом получить detail из запроса с параметрами?
Концептуально:
master - запрос Договор (select ID_DOGOVOR, NAME_DOGOVOR)
detail - запрос Водители (select ID_DRIVER, ID_DOGOVOR, NAME_DRIVER)
Если делать через TfrUserDataset, то будет примерно так. User-датасет в lazReport отвечает, фактически, только за переключение от одной записи к другой:
- Код: Выделить всё
var
index_variable : longint;
procedure TForm1.UserDataset1CheckEOF(Sender: TObject; var Eof: Boolean);
begin
Eof := index_variable > MaxValue;
end;
procedure TForm1.UserDataset1First(Sender: TObject);
begin
index_variable := 1;
end;
procedure TForm1.UserDataset1Next(Sender: TObject);
begin
Inc(index_variable);
end;
Сама выдача организуется через frReport1GetValue:
- Код: Выделить всё
procedure TForm1.frReport1GetValue(const ParName: String; var ParValue: Variant );
begin
if ParName = 'DOGOV_var' then
ParValue := значение_переменной;
if ParName = 'VODITEL_var1' then
ParValue := значение_переменной_2;
if ParName = 'VODITEL_var2' then
ParValue := значение_переменной_3;
end;
То есть нужно два UserDataset, один для договоров, другой для водителей. В зависимости от состояния index_variable каждого из них процедура frReport1GetValue должна выдавать данные. Откуда они берутся, дело десятое (можно программно читать из базы, например).
Подробнее:
Сгрузить записи кодов договоров из БД в списки TStringList. При чтении [DOGOV_var] в отчете в зависимости от index_variable_of_dogovor_dataset из списка выбирается N-я по счету запись и выдается код договора. При чтении VODITEL_var'ов в зависимости от index_variable_of_driver_dataset к базе любым способом делаются запросы (select ID_VODITEL, NAME, VODITEL from Водители where ID_DOGOVOR=...) и сгружаются в списки StringGrid. Дальше, в зависимости от index_variable_of_driver_dataset из списков выдаются данные через VODITEL_var'ы.
В отчет в редакторе отчетов добавляются master_data band и detail_data band для данных. Каждому проставляются датасеты, создаются memo с выводом переменных, добавляются master_header/detail_header (заголовки колонок) и т. д. Вроде все описал.
Наверное, можно как-то можно и через frDBDataSet, но информации по нему маловато.