Возможна ли Рассылка отчетов по электронной почте в автоматическом режиме?

Очень интересно.

Нравится

16 комментариев

каких отчетов? word-excel в принципе можно средствами террасофт

Да, возможна. В качестве таймера можно использовать планировщик Terrasoft, планировщик Windows или планировщик БД в зависимости от реализации.

Спасибо за участие. Если можно пример команды для планировщика Windows - сервис отчета - Common\Medinskiy\ReportLogist\fr_ReportComercia.

Именно с FR — не знаю. В общем случае делается специальная карточка, которая при открытии отправляет по почте что надо кому надо и сразу закрывается. А в планировщик Windows добавляется задание вроде:

c:\terrasoft\tsclient.exe /wnd=wnd_MyReportSender -cfg=MyConfiguration -usr=Supervisor -pwd=qwerty

Если задание запущено, то по таймеру открывается это окно и отрабатывает логика.

Если можно подробнее про логику работы окна, которое открывается (wnd_MyReportSender).

Вы напишете её сами. В обработчике OnPrepare окна будет примерно:

function wnd_MyReportSenderOnPrepare(Window) {
	System.BeginProcessing();
	SendReportByEmail();//ToDo
	System.EndProcessing();
	Self.Close();
}

Каким образом можно закрыть Terrasoft после окончания работы окна?

В обработчике OnShow

function wnd_MeReportSenderOnShow(Window){
    try {
        Window.Close();
    }
    catch(e){}
}

Ура получилось. Огромное спасибо.

Наваял функцию для автоматического экспорта отчета

function btnFormAutoOnClick(Control) {
        //по кнопке сформировать файл формата PDF 
 
		var ReportCode = 'fr_Reestr_Work';
 
        var FilteredDatasetCode = 'ds_Reestr_Work';
        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 CurrentData = new Date();	
		var FullYear = CurrentData.getFullYear();
		var Month = CurrentData.getMonth();
	    Month = Month -1;
	    if (Month<0) {Month=11;FullYear=FullYear-1;}
		var StartDate = new Date(FullYear, Month, 1);
		var FinishDate = new Date(FullYear, Month , 2);
		StartDate = StartDate.getVarDate();  	
		FinishDate = FinishDate.getVarDate();	
 
		//ApplyDatasetFilter(ReportDataset, 'StartDate', StartDate, true);
		//ApplyDatasetFilter(ReportDataset, 'FinishDate', FinishDate, true);
 
		ReportPreviewer.Build();
 
        var FilterWindow = ReportPreviewer.ComponentsByName('FilterWindow');
		FilterWindow = fbcMain;
        var frpMain = ReportPreviewer.ComponentsByName('frpMain');
        frpMain.Report = Report;
 
		//**********************************************************************
		// загрузим сохраненный фильтр
		var ContactID = Connector.CurrentUser.ID;   
		var ReportID=Report.ID;      // 
 
		var FiltrDataset = Services.GetNewItemByUSI('ds_SaveFiltersReports');
 
		ApplyDatasetFilter(FiltrDataset, 'ContactID', ContactID, true);    
		ApplyDatasetFilter(FiltrDataset, 'ReportID', ReportID, true);    
 
		FiltrDataset.Open();
        var XMLStorage = GetNewXMLStorage();
 
    	if (!IsEmptyValue(FiltrDataset.Values("ID"))) {
 
			XMLStorage.Text=FiltrDataset.Values("Filtr");
			fbcMain.DataFieldsList.Deserialize(XMLStorage.RootNode);
 
		}
		else {
			return;
		}
 
        fbcMain.DatasetLink.Dataset = ReportDataset;
 
		fbcMain.ApplyFilter();
 
		//**********************************************************************
 
		frpMain.PrepareReport();
	    frpMain.IsVisible = false;
	    ReportPreviewerComponent.DatasetByUSI(FilteredDatasetCode) = ReportDataset;
	    frpMain.PreviewReport();
 
	    System.BeginProcessing();        //задержка для стабильного формирования PDF файла
        System.Sleep(100); 
        System.EndProcessing();
 
		// собственно сам экспорт
    	var TempFileName = System.CreateObject('TSObjectLibrary.Value');
	    var FileNames = System.CreateObject('TSObjectLibrary.StringsList');
        TempFileName.Value = "C:\\!!\\Отчет по количественному выполнению рейсов.pdf";
        try {
           frpMain.Export( 2, TempFileName, false);
        } catch (e){
        }       
 
}

Но...
Если устанавливаю фильтр
//ApplyDatasetFilter(ReportDataset, 'StartDate', StartDate, true);
//ApplyDatasetFilter(ReportDataset, 'FinishDate', FinishDate, true);
то работает.
А возможно установить для ds_Reestr_Work ранее сохраненный фильтр в ds_SaveFiltersReports (формат фильтра XML)?

"Прищепа Владимир" написал:А возможно установить для ds_Reestr_Work ранее сохраненный фильтр в ds_SaveFiltersReports (формат фильтра XML)?

Владимир, возможно. Как пример реализации обратите внимание на function GetSelectGroupResult(Sender, Message) сервиса wnd_AccountInMassMailGridAreaScript. а именно блок кода:

....
if (GroupDataset.Values('IsFiltered') != 0) {
			var FilterBuilder = GetAccountInMassMailFilterBilder();
			Dataset = GetAccountDataset();
			FilterBuilder.FilterDataset = GroupDataset;
			FilterBuilder.Load();
			FilterBuilder.ApplyFilter();
		}
....

Где в качестве Dataset нужно указать датасет отчета, GroupDataset - ds_SaveFiltersReports

Добрый день, Наталия. Сервис ds_SaveFiltersReports никакого отношения к отчету не имеет. Из него я получаю фильтр в форме XML. И куда его (текст XML) занести в FiltersBuilder мне не понятно.

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

Нет возможности применить любой XML фильтр к любому датасету (например, нельзя применить фильтр, настроенный в разделе Задачи к разделу Контрагенты, так как наблюдается разная структура таблиц, select query).
Т.е. в сервисе, хранящем фильтры, должны содержаться фильтры преднастроенные для датасета отчета.
XML фильтр сам по себе без FilterBuilder можно использовать только для просмотра, а чтобы применить фильтр нужно использовать построитель фильтров.

"Бондарь Наталия" написал:
XML фильтра сам по себе без FilterBuilder можно использовать только для просмотра, а чтобы применить фильтр нужно использовать построитель фильтров.

И где можно взять этот мифический построитель фильтров?
А также описание его работы с примерами.

"Прищепа Владимир" написал:И где можно взять этот мифический построитель фильтров?

FilterBuilder = System.CreateObject('TSObjectLibrary.FiltersBuilder');

"Прищепа Владимир" написал:А также описание его работы с примерами.

С методами и свойствами Вы можете ознакомиться в SDK, примеры работы можно посмотреть в конфигурации.
Например, скрипт wnd_AccountInMassMailGridAreaScript

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