Метки записи: |
Вопрос такой: нужно автоматически выполнить экспорт после открытия формы отчета в FastReport. У меня не получается отловить событие по которому я могу это сделать, пробовал на событии OnShow базового окна отчета, но не получилось. Пока получился только вариант на OnClose, но это не красиво, т.к. пользователю надо нажимать кнопку закрытия окна отчета.
Как быть ?
Комментарии
Отчет по выделенным записям или с использованием окна фильтрации?
По выделенной записи.
Решение "в лоб"
находим function ShowSelectedRecordsReport(...) в скрипте scr_ReportUtils
модифицируем ее примерно так
var frpMain = ReportPreviewer.ComponentsByName('frpMain');
frpMain.Report = Report;
if (frpMain.Report.Caption == 'Заголовок нужного отчета'){ // любой идентификатор нужного отчета
frpMain.PrepareReport();
frpMain.IsVisible = false;
ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
frpMain.PreviewReport();
var TempFileName = System.CreateObject('TSObjectLibrary.Value');
var FileNames = System.CreateObject('TSObjectLibrary.StringsList');
if ((System.PromptForFileNames(FileNames, '*.rtf', '', "Выберите файл", ''))) {
TempFileName.Value = ExtractFileNameWithoutExtension(FileNames.Text.substr(0, FileNames.Text.length-2)) + '.rtf';
try {
frpMain.Export(retRTF, TempFileName, false);
} catch (e){
}
}
return;
} else {
ReportPreviewer.Prepare(); // из оригинальной функции
}
Без претензии на "красоту", основное - идея
Производится экспорт в rtf без показа отчета, в какой файл - выбираем в диалоговом окне.
Александр, спасибо. Идея как раз то что надо.
Я немного переработал ее для своих нужд, сделал в гриде документов отдельную кнопку для этой обработки, кроме того мне не нужно выбирать файл, надо просто сохранить во временный и после этого автоматически открыть его в MS Word, получилось так:
//по кнопке сформировать файл формата RTF в соответствии с шаблоном FastReport
var ReportCode = 'fr_ReportLetterPrintForm';
var FilteredDatasetCode = 'ds_ReportLetterPrintForm';
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);
ApplyDatasetFilter(ReportDataset, 'ID', dlData.Dataset.Values('ID'), true);
ReportPreviewer.Build();
var frpMain = ReportPreviewer.ComponentsByName('frpMain');
frpMain.Report = Report;
frpMain.PrepareReport();
frpMain.IsVisible = false;
ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
frpMain.PreviewReport();
ScriptUtils.BeginProcessing(); //задержка для стабильного формирования RTF файла
ScriptUtils.Sleep(100);
ScriptUtils.EndProcessing();
var TempFileName = System.CreateObject('TSObjectLibrary.Value');
try {
var FileNameStr = 'letter';
var Extension = '.rtf';
TempFileName.Value = GetTemporaryFileName(FileNameStr + Extension);
frpMain.Export(retRTF, TempFileName, false);
var WShell = System.CreateObject('WScript.Shell');
var File = TempFileName.Value;
WShell.Run('winword.exe ' + File, 1);
}
catch (e){
}
}
В ходе отладки выявился один странный момент если непосредственно перед формированием временного файла вызывать отладчик, то все отлично, а если без него, то файл формируется пустым. Помогло введение в код небольшой задержки.
а вот это интересный момент