Задача:
Экспорт отчета FastReport в деталь Файлы в формате PDF для выделенных записей в реестре
Решение
1. В ShowSelectedRecordsReport добавляем SetAttribute(ReportPreviewer,'GridDatasetIDs',GridDatasetIDs);
function ShowSelectedRecordsReport(ReportCode, FilteredDatasetCode,
GridDatasetIDs, FilterForm) {
var Report = Services.GetNewItemByUSI(ReportCode);
var ReportPreviewer = Services.GetNewItemByUSI('wnd_BaseFastReportPreview');
var ReportPreviewerComponent = ReportPreviewer.Attributes('ReportPreviewer');
var ReportDataset = Services.GetNewItemByUSI(FilteredDatasetCode);
SetAttribute(ReportPreviewer, 'Report', Report);
var Select = GetSelectQueryPrimarySelect(ReportDataset.SelectQuery);
var Filters = Select.Filters;
Filter = GetSelectQueryFilterByCode(ReportDataset.SelectQuery, 'IDs');
if (!Assigned(Filter)) {
Filter = Filters.CreateIncludeFilter();
Filter.Code = 'IDs';
Filters.Add(Filter);
Filter.TestExpression =
Filter.CreateFieldFilterExpression();
Filter.TestExpression.TableAlias =
Select.FromTableAlias;
Filter.TestExpression.Field =
Select.FromTable.Fields.ItemsByName('ID');
}
var Enabled = (GridDatasetIDs.length > 0);
ApplyDatasetIncludeFilter(ReportDataset, 'IDs', GridDatasetIDs, Enabled);
if (Assigned(FilterForm)) {
SetAttribute(ReportPreviewer, 'FilterForm', FilterForm);
SetAttribute(ReportPreviewer, 'ShowFilterForm', true);
}
SetAttribute(ReportPreviewer,'GridDatasetIDs',GridDatasetIDs);
ReportPreviewer.Build();
ReportPreviewer.Prepare();
ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
}
2. В wnd_BaseFastReportPreviewScript дописываем
function wnd_BaseFastReportPreviewOnClose(Window) {
if (Window.ComponentsByName('frpMain').Report.Caption == 'Коммерческое предложение') {
var GridDatasetIDs = GetAttribute(Window, 'GridDatasetIDs');
var frpMain = Window.ComponentsByName('frpMain');//ReportPreviewer.ComponentsByName('frpMain') ;
var TempFileName = System.CreateObject('TSObjectLibrary.Value');
var FileNameStr = frpMain.Report.Caption;
var Extension = '.pdf';
TempFileName.Value = GetTemporaryFileName(FileNameStr + Extension, true);
frpMain.Export(retPDF, TempFileName, false);
for (var i=0 ; iGridDatasetIDs.length; i++)
{
var ID = Connector.GenGUID();
var Dataset = Services.GetNewItemByUSI('ds_Files');
var DataFieldName = 'FileData';
//пишем файл в базу...
Dataset.Append();
Dataset.Values('ID') = ID;
//тип - файл
Dataset.Values('ItemTypeID') = '{39A5B367-4A7A-473E-8F74-26977CB6DB67}';
Dataset.Values('Link') = FileNameStr+ Extension;
Dataset.Values('Revision') = 1;
var FileSize = GetFileSize(TempFileName.Value);
if (FileSize > 0)
{
Dataset.Values('FileSize') = FileSize;
}
SaveFileToDataset(TempFileName.Value, Dataset, DataFieldName);
Dataset.Post();
var FileID = ID;
//получили Documents, теперь формируем полное имя сервиса insert query
// IsertQueryLinkUSI = IsertQueryLinkUSI + 'Invoice'//Temp[1].substring(0, count);
//и получаем экземпляр данного сервиса
var InsertQuery = Services.GetNewItemByUSI('iq_FileInOffering');
//заполняем параметры запроса
var ColumnsValues = InsertQuery.ColumnsValues;
ColumnsValues.Items(1).Value = FileID;
ColumnsValues.Items(2).Value = GridDatasetIDs[i];
var IDs = Connector.GenGUID();
ColumnsValues.Items(0).Value = IDs;
//выполняем
InsertQuery.Execute();
}
}
frpMain.Cancel();
}
Комментарий:
Мы делаем экспорт на событии закрытия пред просмотра отчета, так необходимо делать так как на OnShow, отчет еще не успевает сформироваться.
В данном примере в экспорт в деталь будет только для отчета с названием 'Коммерческое предложение' в деталь продукты (iq_FileInOffering) , если нужно выгружать все отчеты, уберите проверку.
Аналогичный код можно кинуть в ShowSelectedRecordsReport, в конце функции, но будет беда когда к отчету прикручено окно фильтрации, а отчет то не сформировался, и писать нечего, поэтому решено писать на событии закрытия предпросмотра.
Пожелание по улучшению:
1.Сделать универсальную подстановку InsertQuery, в духе того как это сделано тут Прикрепить отчет на деталь "Файлы" сразу после генерации Word отчета
2.Проверку делать не по Window.ComponentsByName('frpMain').Report.Caption а по USI