0
Голосовать

Как автоматически стартовать экспорт в FastReport ?

Создано:

Вопрос такой: нужно автоматически выполнить экспорт после открытия формы отчета в FastReport. У меня не получается отловить событие по которому я могу это сделать, пробовал на событии OnShow базового окна отчета, но не получилось. Пока получился только вариант на OnClose, но это не красиво, т.к. пользователю надо нажимать кнопку закрытия окна отчета.
Как быть ?

Комментарии

Александр Кудряшов

Отчет по выделенным записям или с использованием окна фильтрации?

Тюрин Юрий

По выделенной записи.

Александр Кудряшов

Решение "в лоб"
находим function ShowSelectedRecordsReport(...) в скрипте scr_ReportUtils
модифицируем ее примерно так

ReportPreviewer.Build(); // из оригинальной фунции
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(); // из оригинальной функции
}

Без претензии на "красоту", основное - идея:smile: Творческая переработка и оптимизация рекомендуются.
Производится экспорт в rtf без показа отчета, в какой файл - выбираем в диалоговом окне.

Тюрин Юрий

Александр, спасибо. Идея как раз то что надо.
Я немного переработал ее для своих нужд, сделал в гриде документов отдельную кнопку для этой обработки, кроме того мне не нужно выбирать файл, надо просто сохранить во временный и после этого автоматически открыть его в MS Word, получилось так:

function btnRTFletterOnClick(Control) {
        //по кнопке сформировать файл формата 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){
                                }      
}

В ходе отладки выявился один странный момент если непосредственно перед формированием временного файла вызывать отладчик, то все отлично, а если без него, то файл формируется пустым. Помогло введение в код небольшой задержки.

Александр Кудряшов
Тюрин Юрий пишет:
В ходе отладки выявился один странный момент если непосредственно перед формированием временного файла вызывать отладчик, то все отлично, а если без него, то файл формируется пустым. Помогло введение в код небольшой задержки.

а вот это интересный момент:smile: