private DateTime GetMinDateForCalc() { if (string.IsNullOrEmpty(cbParameters.Text) || objects == null) { return DateTime.Today; } int[] selObj = objects.Where(o => (bool)((object[])o)[2]).Select(o=> (int)((object[])o)[0]).ToArray(); if (selObj.Length == 0) { return DateTime.Today; } formula = DataHelper.CustomFormulas.FirstOrDefault(f => f.Name == cbParameters.Text); if (formula == null) { return DateTime.Today; } DateTime? minDate = DataHelper.GetMinDate(selObj, formula.InitPredicates()); return minDate == null ? new DateTime(1990, 1, 1) : minDate.Value; }
private void OnRunButtonClick(object sender, EventArgs e) { if (formed && DialogResult.Yes != MessageBox.Show("Есть несохраненные данные.\r\nВы действительно хотите рассчитать форму?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) { return; } if (cbParameters.Text == string.Empty) { MessageBox.Show("Выберите параметр измерения.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var selectedObj = objects.Where(o => (bool)((object[])o)[2]).Select(o => (int)((object[])o)[0]).ToArray(); if (selectedObj.Count() == 0) { MessageBox.Show("Выберите объект измерений.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } formula = DataHelper.CustomFormulas.FirstOrDefault(f => f.Name == cbParameters.Text); if (formula == null) { MessageBox.Show("Для параметра - '" + cbParameters.Text + "' не определено рассчетных формул", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } sourceTitles.Clear(); itogData.Clear(); sourceData.Clear(); string[] predicates = formula.InitPredicates(); object[][] selObj = objects.Where(o => (bool)((object[])o)[2]).ToArray(); object[][] param = null; using (var con = DataHelper.OpenOrCreateDb()) { try { List<object> data = new List<object>(); List<object> rdata = new List<object>(); List<object> edata = new List<object>(); decimal eventInterval = DataHelper.GetSettingValue("RangeSchedule"); for (var i = trackBar.Value; i <= trackBar.Maximum; i++) { DateTime d = minDate.AddDays(i); data.Clear(); data.Add(d); rdata.Clear(); rdata.Add(d); edata.Clear(); for (var s = 0; s < selObj.Length; s++) { try { int entityId = (int)selObj[s][0]; param = predicates.Select(p => new object[] {p, DataHelper.GetAvgMetrix(entityId, p, d, con)}).ToArray(); data.AddRange(param.Select(p => p[1])); decimal value = formula.Calc(param); rdata.Add(value); if (sourceTitles.Count == s * predicates.Length) { sourceTitles.AddRange(predicates.Select(p => (string)selObj[s][1] + "/" + p)); } //обработка на событие DataHelper.ClearEvent(entityId, d, con); bool alreadyMarked = DataHelper.IsAlreadyMarked(entityId, d, eventInterval, con); if (!alreadyMarked) { foreach (object[] c in DataHelper.FindEventConditions(entityId, con)) { EventChecker checker = DataHelper.EventCheckers.FirstOrDefault(ev => ev.Name == c[1].ToString()); if (checker == null) { continue; } var o = checker.IsEventExists(c, d, con); if (o != null) { object[] result = (object[])o; if ((bool)result[0]) { DataHelper.AddEvent(entityId, c[0], checker.Name, d, (double)result[1], (double)result[2], con); edata.Add(new object[] { d, (string)c[5], (string)c[4], checker.Name, (double)result[1], (double)result[2] }); } } } } } catch { MessageBox.Show("Ошибка обработки данных для '" + (string)selObj[s][1] + "'. Обратитесь к разработчику"); continue; } } sourceData.Add(data.ToArray()); itogData.Add(rdata.ToArray()); if (edata.Count > 0) { foreach (object[] ed in edata) { eventData.Add(ed); } } } } finally { con.Close(); } PrepareViews(); formed = true; } }