Fast Report: как связать в отчете два DataSet'a?

Добрый день,

Есть 2 DataSet'a в каждом есть поле CLNT_ID. Надо их связать как родитель-дочерний элементы в отчете Fast Report, чтобы показать в Master- родительские данные, в дочернем - Child данные.

Через свойство MasterDataset я их уже связал. Этого достаточно или еще где-то по полям тоже нужно соединить?

Как связать в отчете Fast Report два DataSet'a?

Нравится

7 комментариев

Если стоит задача связать два датасета по принципу "Родительский датасет"."Поле связи РД" = "Дочерний датасет"."Поле связи ДД", необходимо выполнение следующих требований:

1) Среди полей родительского датасета должно присутствовать поле, по которому осуществляется связь (в предыдущем предложении - "Поле связи РД"; в Вашем случае - CLNT_ID).
2) В запросе, который связан с дочерним датасетом, должны быть:
а) фильтр сравнения с кодом, который совпадает с названием поля связи родительского датасета;
б) параметр, название которого совпадает с названием поля связи родительского датасета;
в) в фильтре должно сравниваться поле связи дочернего датасета ("Поле связи ДД") и этого параметра.
3) Связь датасетов через свойство MasterDataset.

Для примера посмотрите, как связаны датасеты ds_ReportAccount и ds_ReportAccountAnniversary в отчёте "Знаменательные события контрагента".

Применил, но пока ничего нет.

А если дочерний Dataset - ADODataSet, данные тянутся из другой базы, а родительские из локальной, это на что то влияет? К тому же в запросах участвуют два параметра :pDATE_BEG and :pDATE_END типа DATETIME. И не могу правильно их отфильтровать.

Подскажите пожалуйста

Суть отчета такова: показать данные за период (pDATE_BEG - нач. дата, pDATE_END - конеч. дата)

Параметры pDATE_BEG, pDATE_END присутвуют в обоих датасетах (запросах). И к тому же дочерний DataSet является ADODataSet - это значит что у него нет запроса как отдельный SelectQuery, и нет фильтра сравнения с кодом. Каким образом будут подставляться параметры pDATE_BEG, pDATE_END?

Про передачу параметров в отчёт можно почитать здесь. Параметры в ADODataset можно передавать при обработке события OnPrepare отчёта.

Что касается использования ADODataset'а в DetailData, скорее всего, его фильтрацию придётся осуществлять в коде сервиса FastReport при обработке события OnBeforePrint бэнда DetailData путём передачи значений из MasterData в параметры ADODataset'a.

"Лабьяк Олег Игоревич" написал:Что касается использования ADODataset'а в DetailData, скорее всего, его фильтрацию придётся осуществлять в коде сервиса FastReport при обработке события OnBeforePrint бэнда DetailData путём передачи значений из MasterData в параметры ADODataset'a.

Как в коде передать значения переменным в ADODS в этом FS сервисе?

Т.е в запрос ADODS нужно передать 3 параметра:
CLNT_ID - ID клиента,
date_beg - дата начала
date_end - дата конца

Причем переменные периода должны связываться с полем, которое не выводится в отчет. Сейчас мне переменные date_beg и date_end не с чем связать.

procedure DetailData1OnBeforePrint(Sender: TfrxComponent);
var clnt_id : Integer;
date_end, date_beg: TDateTime;
begin
clnt_id := ;
date_beg := Get('DateBeg');
date_end := Get('DateEnd');
Set(, clnt_id);

end;

procedure DetailData1OnBeforePrint(Sender: TfrxComponent);
var clnt_id : Integer;
date_end, date_beg: TDateTime;
begin
clnt_id := Get();
date_beg := Get('DateBeg');
date_end := Get('DateEnd');
Set(, clnt_id);
end;

Только что попробовал - в коде сервиса FastReport мне не удалось связать датасет из конфигурации Terrasoft и датасет в FastReport (они разных типов). Попробуйте в обработчике OnPrepare сервиса отчёта передать значения в атрибуты ADODataset'а, а при обработке OnDatasetBeforeOpen ADODataset'а устанавливать значения параметрам и применять необходимые фильтры. Если значения параметров дочернего датасета зависят от родительского датасета, можно при обработке OnDatasetAfterOpen родительского датасета установить значения атрибутам дочернего датасета (предварительно передав этот датасет как атрибут в родительский датасет).

Для примера: в обработке OnPrepare отчёта пишем код

function ReportOnPrepare(ReportPreviewer, CanPreview) {
	var Report = ReportPreviewer.Report;
	var ParentDataset = ReportPreviewer.DatasetByComponentName(ParentDatasetName);
	var ChildDataset = ReportPreviewer.DatasetByComponentName(ChildDatasetName);
	ParentDataset.Attributes('ParentReport') = Report;
	ParentDataset.Attributes('ChildDataset') = ChildDataset;
	...
}

В обработке OnDatasetAfterOpen родительского датасета - следующий код:

function ParentDatasetOnDatasetAfterOpen(Dataset) {
	var ParamValue = Dataset.Values(FieldName);
	var ChildDataset = Dataset.Attributes('ChildDataset');
	ChildDataset.Attributes(AttributeName) = ParamValue;
	...
}

Наконец, в обработке OnDatasetAfterOpen дочернего датасета:

function ParentDatasetOnDatasetBeforeOpen(Dataset) {
	var ParamValue = ChildDataset.Attributes(AttributeName);
	var Parameters = ChildDataset.Parameters;
	SetParameterValue(Parameters, ParamName, ParamValue);
	...
}
Показать все комментарии