Время прочтения: 5 мин.
В настоящее время, несмотря на то, что у разработчиков программного обеспечения появляется все больше возможностей для создания приложений со сложным графическим интерфейсом, консольные приложения по-прежнему прочно удерживают свои позиции благодаря простоте своего исполнения.
Рассмотрим решение задачи формирования отчета из базы данных на периодической основе с использованием следующих инструментов:
— MS SQL Server – сервер баз данных;
— MS Visual Studio – интегрированная среда разработки (язык программирования C#);
— Планировщик заданий Windows – запуск приложений на периодической основе;
— MS Outlook – почтовый клиент.
Создание консольного приложения
В Visual Studio создадим проект консольного приложения (.NET Framework). Консольное приложение на выходе будет представлено в виде исполняемого файла с расширением EXE.
При старте консольного приложения выполнение программы начинается со стандартного метода «Main». Создаем объект отчета «ReportISU» и запускаем его на выполнение методом «Run». Далее, консольное приложение выводит информацию об успешности формирования отчета, ждет ввода нажатия любой клавиши и закрывается.
Финальная реализация главного метода приложения будет выглядеть следующим образом:
class Program
{
static void Main(string[] args)
{
ReportISU reportISU = new ReportISU();
reportISU.Run();
Console.WriteLine("Нажмите любую клавишу для выхода...");
Console.ReadLine();
}
}
Метод формирования отчета «Run» реализован следующим образом:
public void Run()
{
_cancelToken = new CancellationTokenSource();
Console.WriteLine("Формирование отчета для передачи в ИСУ");
Console.WriteLine("Получение данных...");
// 1. Получение первоначальных настроек
LoaderReportParams reportParams = GetReportParams();
// 2. Получение данных из базы данных
DataSet ds = null;
try
{
MSSQLQueryExecuter executer = new MSSQLQueryExecuter(reportParams.AutorizationInfo);
ds = executer.GetServerData(reportParams.AutorizationInfo, reportParams.QueryText);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message, "Ошибка...");
Console.ReadLine();
return;
}
if (ds != null && ds.Tables[0] != null)
{
Console.WriteLine("Данные получены.");
// 3. Формирование и экспорт файла
byte[] data = ExcelHelper.ExportToExcel(ds.Tables[0], "Отчет", true, null);
File.WriteAllBytes(reportParams.FullFileName, data);
Console.WriteLine("Сформирован файл {0}", reportParams.FullFileName);
Console.WriteLine("Отправка сообщения...");
// 4. Отправка сообщений
new MailSender().SendMessage(reportParams.RecipientMails, reportPa
Console.WriteLine("Сообщение отправлено.");
}
else
{
Console.WriteLine("Отчет не сформирован. Нет данных.");
}
}
Давайте подробнее рассмотрим пошаговую реализацию формирования отчета.
Шаги реализации формирования отчета:
- Формируем первоначальные настройки отчета.
В методе «GetReportParams» заполняем наименование отчета, путь экспорта отчета, авторизацию на сервере, текст sql-запроса из файла, почтовые адреса получателей уведомления и формируем текст письма.
private LoaderReportParams GetReportParams()
{
var reportParams = new LoaderReportParams
{
ReportName = "Еженедельный отчет",
ExportPath = @"…\Каталог выгрузки",
AutorizationInfo = Server.GetServerByEnumName(ServerName.Prometheus_ca_sbrf_ru_Prometheus).AutorizationInfo,
DateStart = DateTime.Now.AddDays(-7).GetFirstDateOfWeek(),
DateEnd = DateTime.Now.AddDays(-7).GetLastDateOfWeek(),
RecipientMails = new List<string>()
{
"name1@omega.sbrf.ru",
"name2@omega.sbrf.ru"
}
};
reportParams.AutorizationInfo.Database = "YourDatabaseName";
reportParams.MailMessage = BuildMailMessage(reportParams);
reportParams.QueryText = GetQueryFromFile(reportParams.DateStart, reportParams.DateEnd, @"ISU\SP_ORCD_1.sql");
return reportParams;
}
2. Получение данных из базы данных
За получение данных с сервера отвечает класс «MSSQLQueryExecuter». В метод «GetServerData» передаем данные авторизации и текст запроса с параметрами, а на выходе получаем набор данных типа DataSet из пространства имен System.Data.
3. Формирование и экспорт файла отчета
Из полученного набора данных DataSet берем DataTable и с помощью библиотеки EPPlus формируем Excel файл в формате byte[]. С помощью класса File из пространства имен System.IO производим запись Excel файла в указанный в первоначальных настройках каталог.
4. Отправка сообщений
Сообщения будем отправлять через сервер сообщений MS Outlook Exchange Server. Отправка сообщений производится с помощью библиотеки Microsoft.Exchange.WebServices. В методе «SendMessage» создаем сервис, почтовое сообщение и отправляем почту.
public void SendMessage(List<string> mails, string subject, string body)
{
ExchangeService exService = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
ServicePointManager.ServerCertificateValidationCallback = (obj, certificate, chain, errors) => true;
exService.UseDefaultCredentials = true;
exService.Url = new Uri(@"https://outlook.yourdomainname.ru/EWS/Exchange.asmx");
EmailMessage message = new EmailMessage(exService);
message.Subject = subject;
message.Body = body;
message.ToRecipients.AddRange(mails);
message.SendAndSaveCopy();
}
Собираем проект консольного приложения Visual Studio в исполняемый EXE файл.
Запуск приложения.
Запускать наше приложение будем с помощью планировщика заданий. Открываем стандартную программу Windows: Пуск/Программы/Средства администрирования/Планировщик заданий.
Создаем новую задачу. На вкладке «Действие» выбираем действие «запуск программы» и указываем наш EXE файл для запуска. На вкладке «Триггеры» указываем периодичность запуска программы.
В запланированное время наше приложение выполнится, сформируется отчет и в окне консольного приложения отобразится результат выполнения программы.
В MS Outlook на почтовый ящик указанным в настройках отчета адресатам придет письмо:
Рассмотренный пример является одной из возможных способов реализации автоматизации формирования отчетов с помощью доступных программных инструментов. Кроме написания консольного приложения в Visual Studio, также, можно интегрировать написанный программный код в настольное или web-приложение, разработать скрипт Python или использовать, например, сервер отчетов Power BI. Удачи в освоении новых программных инструментов и успешного выполнения задач автоматизации.