Время прочтения: 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("Отчет не сформирован. Нет данных.");
            }
        }

Давайте подробнее рассмотрим пошаговую реализацию формирования отчета.

Шаги реализации формирования отчета:

  1. Формируем первоначальные настройки отчета.

В методе «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. Удачи в освоении новых программных инструментов и успешного выполнения задач автоматизации.