コード例 #1
0
ファイル: Form1.cs プロジェクト: nemetz-zp/LimitCalc
        private void onConfigurationSelect(object sender, EventArgs e)
        {
            if (openFileMenuItem.DropDownItems.Count == 0)
            {
                return;
            }

            // Убираем флажки с других конфигураций
            foreach (var cfg in openFileMenuItem.DropDownItems)
            {
                ((ToolStripMenuItem)cfg).Checked = false;
            }

            string cfgFilePath = System.IO.Path.Combine(getApplicationDirectory(), CFG_DIRECTORY_NAME, ((ToolStripMenuItem)sender).Text);

            try
            {
                metersList.ReadFromXml(cfgFilePath);
                NotificationHelper.ShowInfo("Конфігурація успішно завантажена!");

                // Отмечаем в меню выбранную конфигурацию
                ToolStripMenuItem item = (ToolStripMenuItem)sender;
                item.Checked = true;
            }
            catch (Exception ex)
            {
                NotificationHelper.ShowError(ex.Message);
            }
        }
コード例 #2
0
ファイル: Form1.cs プロジェクト: nemetz-zp/LimitCalc
        private void monthLimit_Leave(object sender, EventArgs e)
        {
            TextBox currentTB = (TextBox)sender;

            try
            {
                double num = Convert.ToDouble(currentTB.Text);
                currentTB.Text = string.Format("{0:F3}", num);
                if (num.LT(0.0))
                {
                    throw new ArgumentException("Коеффіцієнт не може бути менше нуля.");
                }
            }
            catch (FormatException)
            {
                if (string.IsNullOrWhiteSpace(currentTB.Text))
                {
                    currentTB.Text = string.Format("{0:F3}", 0.0);
                }
                else
                {
                    NotificationHelper.ShowError("Вводити можна лише числа!");
                    currentTB.Undo();
                }
            }
            catch (ArgumentException ex)
            {
                NotificationHelper.ShowError(ex.Message);
                currentTB.Undo();
            }

            CalculateCoeffsSum();
        }
コード例 #3
0
ファイル: Form1.cs プロジェクト: nemetz-zp/LimitCalc
        private void totalMoneySumTextBox_Leave(object sender, EventArgs e)
        {
            double enteredTotalMoneySum = Math.Round(0.0, TENDER_SUM_PRECISION);

            // Если пользователь ничего не ввёл, не выбрасывает никаких ошибок - будем считать что сумма ноль
            if (string.IsNullOrEmpty(totalMoneySumTextBox.Text))
            {
                CalculateVolume();
                return;
            }

            try
            {
                enteredTotalMoneySum = Convert.ToDouble(totalMoneySumTextBox.Text);
            }
            catch
            {
                NotificationHelper.ShowError("Ціна повинна бути числовим значенням!");
                totalMoneySumTextBox.Undo();
            }

            totalMoneySumTextBox.Text = enteredTotalMoneySum.ToString("F" + TENDER_SUM_PRECISION);
            try
            {
                CalculateVolume();
            }
            catch (Exception ex)
            {
                NotificationHelper.ShowError(ex.Message);
                return;
            }
        }
コード例 #4
0
ファイル: Form1.cs プロジェクト: nemetz-zp/LimitCalc
        private void calcLimitesButton_Click(object sender, EventArgs e)
        {
            double volume = 0.0;

            try
            {
                volume = CalculateVolume();
            }
            catch (Exception ex)
            {
                NotificationHelper.ShowError(ex.Message);
                return;
            }

            //if (volume.EQ(0.0))
            //{
            //    if(NotificationHelper.AskYesNo("Об'єм закупівлі дорівнює нулю. Ви впевнені, що хочете продовжити?") == System.Windows.Forms.DialogResult.No)
            //    {
            //        return;
            //    }
            //}

            if (NotificationHelper.AskYesNo("Розпочати розрахунок?") == System.Windows.Forms.DialogResult.Yes)
            {
                if (!metersList.IsEverythingReady)
                {
                    if (NotificationHelper.AskYesNo(
                            "Для деяких ЛПЗ не встановлені коефіцієнти. Встановити для них значення за-умовчанням?")
                        == System.Windows.Forms.DialogResult.Yes)
                    {
                        WaitForm wf = new WaitForm(this);
                        wf.Show();
                        wf.Refresh();
                        Enabled = false;

                        try
                        {
                            metersList.PrepareNotReadyMeters();
                        }
                        catch (Exception ex)
                        {
                            NotificationHelper.ShowError(ex.Message);
                        }
                        finally
                        {
                            wf.Close();
                            Enabled = true;
                        }

                        WriteLimitsToExcelFile();
                        return;
                    }
                    else
                    {
                        return;
                    }
                }
                WriteLimitsToExcelFile();
            }
        }
コード例 #5
0
ファイル: Form1.cs プロジェクト: nemetz-zp/LimitCalc
        private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            if (e.Exception.GetType() == typeof(System.FormatException))
            {
                NotificationHelper.ShowError("Для вводу дозволені лише числа!");
            }
            else
            {
                NotificationHelper.ShowError(e.Exception.Message);
            }

            dataGridView1.CancelEdit();
        }
コード例 #6
0
ファイル: Form1.cs プロジェクト: nemetz-zp/LimitCalc
        private void saveFileMenuItem_Click(object sender, EventArgs e)
        {
            SaveFileDialog sd = new SaveFileDialog();

            sd.Filter           = "XML файл (*.xml)|*.xml";
            sd.InitialDirectory = System.IO.Path.Combine(getApplicationDirectory(), CFG_DIRECTORY_NAME);
            sd.ShowDialog();

            try
            {
                if (!string.IsNullOrWhiteSpace(sd.FileName))
                {
                    metersList.WriteToXml(sd.FileName);
                    NotificationHelper.ShowInfo("Зміни успішно збережені!");
                }
            }
            catch (Exception ex)
            {
                NotificationHelper.ShowError(ex.Message);
            }
        }
コード例 #7
0
ファイル: Form1.cs プロジェクト: nemetz-zp/LimitCalc
        private void button1_Click(object sender, EventArgs e)
        {
            Waiter w = new Waiter(this);

            w.BeginWait();

            Enabled = false;

            try
            {
                metersList.CalculateGeneralCoeffs();
            }
            catch (Exception ex)
            {
                NotificationHelper.ShowError(ex.Message);
            }
            finally
            {
                Enabled = true;
                w.EndWait();
            }
        }
コード例 #8
0
ファイル: Form1.cs プロジェクト: nemetz-zp/LimitCalc
        private void saveSettingsButton_Click(object sender, EventArgs e)
        {
            if (metersList[0].GeneralCoefficient.NE(100.0))
            {
                NotificationHelper.ShowError("Загальна сумма коефіцієнтів по закладам повинна бути рівна 100");
                return;
            }

            if (CalculateCoeffsSum().NE(100.0))
            {
                NotificationHelper.ShowError("Сумма коефіцієнтів повинная бути рівна 100");
                return;
            }

            if (dataGridView1.SelectedCells.Count == 0 ||
                ((dataGridView1.SelectedCells != null) && (dataGridView1.SelectedCells[0].RowIndex == 0)))
            {
                if (NotificationHelper.AskYesNo("Ви впевнені, що хочете встановити ці коефіцієнти для всіх ЛПЗ?")
                    == System.Windows.Forms.DialogResult.Yes)
                {
                    double[] coeffs = new double[12];
                    for (int i = 1; i <= 12; i++)
                    {
                        coeffs[i - 1] = Convert.ToDouble(Controls.Find("monthLimit" + i, true).First().Text);
                    }

                    WaitForm wf = new WaitForm(this);
                    wf.Show();
                    wf.Refresh();
                    Enabled = false;

                    try
                    {
                        metersList.SetDefaultCoeffs(coeffs);
                    }
                    catch (Exception ex)
                    {
                        NotificationHelper.ShowError(ex.Message);
                    }
                    finally
                    {
                        wf.Close();
                        Enabled = true;
                    }
                }
            }
            else
            {
                if (NotificationHelper.AskYesNo(
                        string.Format("Встановити данні коефіцієнти для {0}",
                                      metersList[dataGridView1.SelectedCells[0].RowIndex].Name)
                        ) == System.Windows.Forms.DialogResult.Yes)
                {
                    double[] coeffs = new double[12];
                    for (int i = 1; i <= 12; i++)
                    {
                        coeffs[i - 1] = Convert.ToDouble(Controls.Find("monthLimit" + i, true).First().Text);
                    }

                    metersList[dataGridView1.SelectedCells[0].RowIndex].MonthsCoefficients = coeffs;
                }
            }
        }
コード例 #9
0
ファイル: Form1.cs プロジェクト: nemetz-zp/LimitCalc
        private void WriteLimitsToExcelFile()
        {
            try
            {
                metersList.SetSum(CalculateVolume());
            }
            catch (Exception ex)
            {
                NotificationHelper.ShowError(ex.Message);
                return;
            }

            HeavyProcessProgressForm hpForm = new HeavyProcessProgressForm(this);

            hpForm.Show();

            Enabled = false;

            Excel.Application xlApp = new Excel.Application();

            if (xlApp == null)
            {
                NotificationHelper.ShowError("Помилка при завантаженні Excel.");
                Environment.Exit(0);
            }
            hpForm.ChangeProgress(null, 2);

            Excel.Workbook wb = xlApp.Workbooks.Open(System.IO.Path.Combine(getApplicationDirectory(), TEMPLATES_DIRECTORY_NAME, TEMPLATES_FILE_NAME));

            if (wb == null)
            {
                xlApp.Quit();
                xlApp = null;
                NotificationHelper.ShowError("Помилка при завантаженні файлу шаблону.");
                Environment.Exit(0);
            }
            hpForm.ChangeProgress(null, 2);

            Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];
            if (ws == null)
            {
                wb.Close(0);
                xlApp.Quit();
                xlApp = null;
                NotificationHelper.ShowError("Помилка при завантаженні файлу шаблону.");
                Environment.Exit(0);
            }
            hpForm.ChangeProgress(null, 2);

            int progrStep = (int)Math.Floor((double)(hpForm.ProgressRest / (metersList.Count() - 1)));

            try
            {
                // Массив итогов по месяцам
                double[] monthTotals = new double[12];
                // Массив итогов по кварталам
                double[] quartalsLimits = new double[QUARTER_LETTERS.Length];
                // Общая мощность
                double totalPower = 0.0;
                // Итог по году
                double yearTotal = 0.0;

                for (int i = 1; i < metersList.Count; i++)
                {
                    hpForm.ChangeProgress(string.Format("Заповнюємо ліміти по '{0}'...", metersList[i].Name),
                                          progrStep);

                    ws.get_Range(POWER_COLUMN_LETTER + (NAME_COLUMN_INDEX + (i - 1))).Value = metersList[i].ConnectedPower;
                    totalPower += metersList[i].ConnectedPower;
                    ws.get_Range(POWER_COLUMN_LETTER + YEAR_BEGIN_INDEX).Value = Math.Round(totalPower, EnergyMeter.LIMIT_PRECISION);

                    // Заполняем лимиты по месяцам
                    for (int j = 0; j < metersList[i].MonthsLimits.Length; j++)
                    {
                        ws.get_Range(MONTHS_LETTERS[j] + (NAME_COLUMN_INDEX + (i - 1))).Value = metersList[i].MonthsLimits[j];
                        monthTotals[j] += metersList[i].MonthsLimits[j];
                        ws.get_Range(MONTHS_LETTERS[j] + YEAR_BEGIN_INDEX).Value = Math.Round(monthTotals[j], EnergyMeter.LIMIT_PRECISION);
                    }

                    // Вычисляем и заполняем значения за кварталы
                    for (int j = 0; j < QUARTER_LETTERS.Length; j++)
                    {
                        double quartalValue = Math.Round((metersList[i].MonthsLimits[0 + (3 * j)]
                                                          + metersList[i].MonthsLimits[1 + (3 * j)]
                                                          + metersList[i].MonthsLimits[2 + (3 * j)])
                                                         , EnergyMeter.LIMIT_PRECISION);
                        ws.get_Range(QUARTER_LETTERS[j] + (NAME_COLUMN_INDEX + (i - 1))).Value = quartalValue;
                        quartalsLimits[j] += quartalValue;

                        // Если на шаблон на формулах, то комментим
                        ws.get_Range(QUARTER_LETTERS[j] + YEAR_BEGIN_INDEX).Value = Math.Round(quartalsLimits[j], EnergyMeter.LIMIT_PRECISION);
                    }

                    // ВСЁ ЧТО НИЖЕ МОЖНО ПРОСТО ПРОПИСАТЬ ФОРМУЛАМИ В ШАБЛОНЕ!!
                    double yearMeterTotal = Math.Round(metersList[i].MonthsLimits.Sum(), EnergyMeter.LIMIT_PRECISION);
                    ws.get_Range(YEAR_LETTER + (NAME_COLUMN_INDEX + (i - 1))).Value = yearMeterTotal;
                    yearTotal += yearMeterTotal;
                    ws.get_Range(YEAR_LETTER + YEAR_BEGIN_INDEX).Value = Math.Round(yearTotal, EnergyMeter.LIMIT_PRECISION);
                }

                hpForm.ChangeProgress("Зберігаємо зміни до файлу...", hpForm.ProgressRest);

                string fileNameToSave = System.IO.Path.Combine(getApplicationDirectory(), READY_FILE_NAME);
                string fName          = System.IO.Path.GetFileNameWithoutExtension(fileNameToSave);
                int    k = 0;
                while (System.IO.File.Exists(fileNameToSave))
                {
                    string fExtension = new System.IO.FileInfo(fileNameToSave).Extension;
                    string newFName   = fName + "-" + (k++) + fExtension;
                    fileNameToSave = System.IO.Path.Combine(getApplicationDirectory(), newFName);
                }
                wb.SaveAs(fileNameToSave);

                NotificationHelper.ShowInfo("Все готово!");
            }
            catch
            {
                NotificationHelper.ShowError("Помилка при заповненні файлу! Скоріше за все файл зайнятий іншою программою");
                return;
            }
            finally
            {
                hpForm.Close();
                Enabled = true;

                // Закрываем всё!
                wb.Close(0);
                xlApp.Quit();
                xlApp = null;
            }
        }
コード例 #10
0
ファイル: Form1.cs プロジェクト: nemetz-zp/LimitCalc
        private MetersList GetDataFromExelFile(string fileName, bool appStart)
        {
            MetersList mList = new MetersList();

            // запуск процесса Excel
            Excel.Application xlApp = new Excel.Application();
            if (xlApp == null)
            {
                NotificationHelper.ShowError("Помилка при завантаженні екземпляру Microsoft Excel!");
                Environment.Exit(0);
            }

            // Загрузка книги
            Excel.Workbook wb = xlApp.Workbooks.Open(fileName);
            if (wb == null)
            {
                NotificationHelper.ShowError("Помилка при завантаженні книги Microsoft Excel!");
                xlApp.Quit();
                xlApp = null;
                Environment.Exit(0);
            }

            // Выбор листа с данными
            Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets[1];
            if (ws == null)
            {
                NotificationHelper.ShowError("Помилка при завантаженні листа із книги Microsoft Excel!");
                xlApp.Quit();
                xlApp = null;
                Environment.Exit(0);
            }

            // Считывание данных с листа
            try
            {
                for (int i = 0; ; i++)
                {
                    string name = ws.get_Range(NAME_COLUMN_LETTER + (NAME_COLUMN_INDEX + i)).Value;
                    if (string.IsNullOrWhiteSpace(name))
                    {
                        break;
                    }
                    if (appStart)
                    {
                        mList.Add(
                            new EnergyMeter
                        {
                            Name           = name,
                            IsHeating      = (name.EndsWith("(опал.)") || name.EndsWith("(оп.)") || name.EndsWith("(опалення)")),
                            Number         = (i + 1),
                            ConnectedPower = ws.get_Range(POWER_COLUMN_LETTER + (NAME_COLUMN_INDEX + i)).Value
                        });
                    }
                    else
                    {
                        double[] mounthLimits = new double[12];
                        for (int j = 0; j < MONTHS_LETTERS.Count(); j++)
                        {
                            mounthLimits[j] = ws.get_Range(MONTHS_LETTERS[j] + (NAME_COLUMN_INDEX + i)).Value;
                        }
                        EnergyMeter newMeter = new EnergyMeter(ws.get_Range(YEAR_LETTER + (NAME_COLUMN_INDEX + i)).Value,
                                                               mounthLimits);
                        newMeter.Name           = name;
                        newMeter.Number         = (i + 1);
                        newMeter.ConnectedPower = ws.get_Range(POWER_COLUMN_LETTER + (NAME_COLUMN_INDEX + i)).Value;
                        mList.Add(newMeter);
                    }
                }
            }
            catch (Exception ex)
            {
                NotificationHelper.ShowError("Помилка при завантаженні данних!");
                Environment.Exit(0);
            }
            finally
            {
                wb.Close(false);
                xlApp.Quit();
                xlApp = null;
                //System.GC.Collect();
            }

            return(mList);
        }