/// <summary>КОНСТРУКТОР </summary> /// <param name="pStrahFile">Строка файла реестра</param> public MyExcel(StrahFile pStrahFile) { // Используя NuGet пакет LinqToExcel (https://code.google.com/p/linqtoexcel/) подключаемся к книге Excel // Работа с Excel http://wladm.narod.ru/C_Sharp/comexcel.html PRI_StrahFile = pStrahFile; // Наш объект Excel PRI_ExcelApp = new e.Application(); // Одна страница в книге PRI_ExcelApp.SheetsInNewWorkbook = 1; // Добавляем книгу PRI_ExcelApp.Workbooks.Add(Type.Missing); // Колллекция страниц e.Sheets _Sheets = PRI_ExcelApp.Workbooks.Item[1].Worksheets; // Рабочая страница PRI_Worksheet = (e.Worksheet)_Sheets.Item[1]; // Заголовок string _Value = "Реестр №" + PRI_StrahFile.Cod; MET_Print("A1", _Value); // Шапка // 1 MET_Print("A3", "Номер"); MET_ColumnWidth("A", 6); // 2 MET_Print("B3", "Тип"); MET_ColumnWidth("B", 13); // 3 MET_Print("C3", "Поступил"); MET_ColumnWidth("C", 10); // 4 MET_Print("D3", "ФИО"); MET_ColumnWidth("D", 22); // 5 MET_Print("E3", "Д.Р."); MET_ColumnWidth("E", 10); // 6 MET_Print("F3", "Код ошибки"); // 7 MET_Print("G3", "Описание ошибки"); MET_ColumnWidth("G", 80); // 8 MET_Print("H3", "Код"); MET_ColumnWidth("H", 16); }
/// <summary>МЕТОД 2. Запуск расчета</summary> private void MET_StartCalc() { // Сохраняем значение ProgressBar double _BarValue = 0; // Создание делегата и привязка к изменению свойства ProgressBar UpdateProgressBarDelegate _Progress = PART_ProgressBar.SetValue; // Ну начинаем PROP_ProgressLabel = "Подгружаем данные с сервера"; // Всё больше форму НЕ трогаем, можем только закрыть PART_UserPage.IsEnabled = false; // Даем поток, для обновления формы Dispatcher.Invoke(_Progress, DispatcherPriority.Background, RangeBase.ValueProperty, _BarValue); // Связь с SQL, в принципе не очень то и нужен, только для разового сохраниения в StrahFile try { PRI_Context = new StarahReestrDataContext(MySql.MET_ConSql()); // Запись файла StrahFile PRI_StrahFile = new StrahFile { Cod = PRI_Context.StrahFile.Max(e => e.Cod + 1), DateN = PROP_DateN, DateK = PROP_DateK, Korekt = 0, StrahComp = 4, VMP = (byte?)PRI_TipReestr, SUMMAV = 0, Tip = 1, YEAR = PROP_DateK.Year, MONTH = PROP_DateK.Month, NSCHET = PROP_Schet, DSCHET = PROP_DateSchet, pPaket = PRI_MainCorrect == 1 ? (byte?)124 : (byte?)123, pHide = 0, pParent = PROP_ParentCod }; } catch (Exception e) { MessageBox.Show(e.Message); } // Стартовые номера для поля N_ZAP int.TryParse($"{PRI_TipReestr}{PROP_DateK.Month:00}00000", out PRI_ReeN_Zap); PRI_ReeNom_Zap = PRI_ReeN_Zap; DataRelation _DataRelation; DataColumn[] _ReStrahReestr = new DataColumn[] { MyGlo.DataSet.Tables["ReStrahReestr"].Columns["Cod"], MyGlo.DataSet.Tables["ReStrahReestr"].Columns["LPU_ST"] }; if (PRI_TipReestr == 3 || PRI_TipReestr == 4) { // Поликлиника 1. Apac (только конечные посещения) MySql.MET_DsAdapterFill(MyQuery.ReApac_Select_4(PRI_TipReestr, PRI_MainCorrect, PROP_DateN, PROP_DateK), "ReApac"); // Связываем по колонками DataColumn[] _ReApac = new DataColumn[] { MyGlo.DataSet.Tables["ReApac"].Columns["Cod"], MyGlo.DataSet.Tables["ReApac"].Columns["LPU_ST"] }; // Связь Реестр - Apac _DataRelation = new DataRelation("ReReestr_Apac", _ReStrahReestr, _ReApac, false); MyGlo.DataSet.Relations.Add(_DataRelation); // Поликлиника 2. (промежуточные посещения) MySql.MET_DsAdapterFill(MyQuery.ReApac_Select_5(PRI_TipReestr, PRI_MainCorrect, PROP_DateN, PROP_DateK), "RePol"); // Связь Apac - Pol _DataRelation = new DataRelation("ReApac_Pol", MyGlo.DataSet.Tables["ReApac"].Columns["NumberFirstTap"], MyGlo.DataSet.Tables["RePol"].Columns["NumberFirstTap"], false); // Запретим создание ограничений, на "осиротевшие" записи в RePol MyGlo.DataSet.Relations.Add(_DataRelation); // Поликлиника 3. (консилиумы) MySql.MET_DsAdapterFill(MyQuery.ReApac_Select_6(PRI_TipReestr, PRI_MainCorrect, PROP_DateN, PROP_DateK), "RePolCons"); // Связь Apac - PolCons _DataRelation = new DataRelation("ReApac_PolCons", MyGlo.DataSet.Tables["ReApac"].Columns["Cod"], MyGlo.DataSet.Tables["RePolCons"].Columns["Cod"], false); // Запретим создание ограничений, на "осиротевшие" записи в RePolCons MyGlo.DataSet.Relations.Add(_DataRelation); } // Стационар 1. Apstac MySql.MET_DsAdapterFill(MyQuery.ReApstac_Select_4(PRI_TipReestr, PRI_MainCorrect, PROP_DateN, PROP_DateK), "ReApstac"); // Связываем по колонками DataColumn[] _ReApstac = new DataColumn[] { MyGlo.DataSet.Tables["ReApstac"].Columns["Ind"], MyGlo.DataSet.Tables["ReApstac"].Columns["LPU_ST"] }; // Связь Реестр - Apstac _DataRelation = new DataRelation("ReReestr_Apstac", _ReStrahReestr, _ReApstac, false); MyGlo.DataSet.Relations.Add(_DataRelation); // Стационар 2. Ksg MySql.MET_DsAdapterFill(MyQuery.ReApstac_Select_5(PRI_TipReestr, PRI_MainCorrect, PROP_DateN, PROP_DateK), "ReKsg"); // Связь Apstac - Ksg _DataRelation = new DataRelation("ReApstac_Ksg", MyGlo.DataSet.Tables["ReApstac"].Columns["Ind"], MyGlo.DataSet.Tables["ReKsg"].Columns["Ind"], false); MyGlo.DataSet.Relations.Add(_DataRelation); // Стационар 3. (консилиумы) MySql.MET_DsAdapterFill(MyQuery.ReApstac_Select_6(PRI_TipReestr, PRI_MainCorrect, PROP_DateN, PROP_DateK), "ReApstacCons"); // Связь Apstac - ApstacCons _DataRelation = new DataRelation("ReApstac_ApstacCons", MyGlo.DataSet.Tables["ReApstac"].Columns["Ind"], MyGlo.DataSet.Tables["ReApstacCons"].Columns["Ind"], false); MyGlo.DataSet.Relations.Add(_DataRelation); if (PRI_TipReestr == 4) { // Параклиника 1. Par MySql.MET_DsAdapterFill(MyQuery.RePar_Select_2(PRI_TipReestr, PRI_MainCorrect, PROP_DateN, PROP_DateK), "RePar"); // Связываем по колонками DataColumn[] _RePar = new DataColumn[] { MyGlo.DataSet.Tables["RePar"].Columns["Cod"], MyGlo.DataSet.Tables["RePar"].Columns["LPU_ST"] }; // Связь Реестр - RePar _DataRelation = new DataRelation("ReReestr_Par", _ReStrahReestr, _RePar, false); MyGlo.DataSet.Relations.Add(_DataRelation); } // Страховые компании. StrahComp if (MyGlo.DataSet.Tables["ReStrahComp"] == null) // если ещё не загруженна { MySql.MET_DsAdapterFill(MyQuery.ReStrahComp_Select_1(), "ReStrahComp"); DataTable _Table = MyGlo.DataSet.Tables["ReStrahComp"]; _Table.PrimaryKey = new[] { _Table.Columns["Cod"] }; } // Загружаем справочники StrahSpr PRI_N002 = new List <StrahSpr>(PRI_Context.StrahSpr.Where(e => e.Number > 0 && e.TableID == "N002")); PRI_N003 = new List <StrahSpr>(PRI_Context.StrahSpr.Where(e => e.Number > 0 && e.TableID == "N003")); PRI_N004 = new List <StrahSpr>(PRI_Context.StrahSpr.Where(e => e.Number > 0 && e.TableID == "N004")); PRI_N005 = new List <StrahSpr>(PRI_Context.StrahSpr.Where(e => e.Number > 0 && e.TableID == "N005")); PRI_N008 = new List <StrahSpr>(PRI_Context.StrahSpr.Where(e => e.Number > 0 && e.TableID == "N008")); PRI_N009 = new List <StrahSpr>(PRI_Context.StrahSpr.Where(e => e.Number > 0 && e.TableID == "N009")); PRI_N011 = new List <StrahSpr>(PRI_Context.StrahSpr.Where(e => e.Number > 0 && e.TableID == "N011")); PRI_N012 = new List <StrahSpr>(PRI_Context.StrahSpr.Where(e => e.Number > 0 && e.TableID == "N012")); PRI_StrahStacSv = new List <StrahStacSv>(PRI_Context.StrahStacSv); // Максимум ProgressBar PART_ProgressBar.Maximum = MyGlo.DataSet.Tables["ReStrahReestr"].Rows.Count; // Сохраним запись в StrahFile PRI_Context.StrahFile.InsertOnSubmit(PRI_StrahFile); PRI_Context.SubmitChanges(); // Создаем файл с ошибками (шапачку там) PRI_ErrorToExcel = new MyExcel(PRI_StrahFile); // Перебераем все записи foreach (DataRow _Reestr in MyGlo.DataSet.Tables["ReStrahReestr"].Rows) { PRI_RowReestr = _Reestr; PRI_StrahReestr = new StrahReestr(); PRI_Sl = new MySL(); // Тип услуги PRI_TipUsl = (eTipUsl)m.MET_PoleInt("LPU_ST", PRI_RowReestr); PRI_ErrorRow = false; // ошибок нет (ну это пока) // Заранее готовим информацию для будущей ошибки PRI_ErrorToExcel.PROP_StrahReestr = PRI_StrahReestr; PRI_ErrorToExcel.PROP_RowReestr = PRI_RowReestr; PRI_ErrorToExcel.PROP_Nom++; PRI_ErrorToExcel.PROP_Tip = new[] { "", "Кр. Стационар", "Дн. Стационар", "Поликлиника", "Параклиника", "Гистология" }[(int)PRI_TipUsl]; switch (PRI_TipUsl) { case eTipUsl.StacKr: case eTipUsl.StacDn: MET_CalcStac(); // считаем стационар break; case eTipUsl.Pol: MET_CalcPol(); // считаем поликлинику break; case eTipUsl.Par: case eTipUsl.Gist: MET_CalcPar(); // считаем параклинику break; } // Изменения прогресса PROP_ProgressLabel = $"Загружено: {++_BarValue} из {PART_ProgressBar.Maximum}"; Dispatcher.Invoke(_Progress, DispatcherPriority.Background, RangeBase.ValueProperty, _BarValue); // Сохраним строку в StrahReestr (если ошибок нет) if (!PRI_ErrorRow) { MET_SaveSql(); } } // Для корректрирующих реестров пересчитаем нумерацию if (PROP_ParentCod > 0) { MySql.MET_QueryNo(MyQuery.StrahReestr_Update_2(PRI_StrahFile.Cod, PROP_ParentCod)); } // Пересчитаем поле Сумму MySql.MET_QueryNo(MyQuery.StrahFile_Update_1(PRI_StrahFile.Cod)); // Подчистим связи if (PRI_TipReestr == 3 || PRI_TipReestr == 4) { MyGlo.DataSet.Tables["ReApac"].ChildRelations.Clear(); MyGlo.DataSet.Tables["RePol"].ChildRelations.Clear(); MyGlo.DataSet.Tables["RePolCons"].ChildRelations.Clear(); MyGlo.DataSet.Tables["RePol"].Clear(); MyGlo.DataSet.Tables["RePolCons"].Clear(); MyGlo.DataSet.Tables["ReApac"].Clear(); } MyGlo.DataSet.Tables["ReApstac"].ChildRelations.Clear(); MyGlo.DataSet.Tables["ReKsg"].ChildRelations.Clear(); MyGlo.DataSet.Tables["ReApstacCons"].ChildRelations.Clear(); MyGlo.DataSet.Tables["ReKsg"].Clear(); MyGlo.DataSet.Tables["ReApstacCons"].Clear(); MyGlo.DataSet.Tables["ReApstac"].Clear(); if (PRI_TipReestr == 4) { MyGlo.DataSet.Tables["RePar"].Clear(); } MyGlo.DataSet.Relations.Clear(); // Усё MessageBox.Show(string.Format("Реестр №{0} сформирован!", PRI_StrahFile.Cod)); // Показываем ошибки PRI_ErrorToExcel.MET_End(); }