Экспорт отчета FastReport в деталь Файлы в формате PDF для выделенных записей в реестре

Задача:
Экспорт отчета 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

Нравится

Поделиться

0 комментариев
Показать все комментарии