Fast Report: как связать в отчете два DataSet'a?
Добрый день,
Есть 2 DataSet'a в каждом есть поле CLNT_ID. Надо их связать как родитель-дочерний элементы в отчете Fast Report, чтобы показать в Master- родительские данные, в дочернем - Child данные.
Через свойство MasterDataset я их уже связал. Этого достаточно или еще где-то по полям тоже нужно соединить?
Как связать в отчете Fast Report два DataSet'a?
Нравится
Если стоит задача связать два датасета по принципу "Родительский датасет"."Поле связи РД" = "Дочерний датасет"."Поле связи ДД", необходимо выполнение следующих требований:
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); ... }