private DataTable resultToTable(P_ALG pAlg) { DataTable tableRes = new DataTable(); tableRes.Columns.AddRange(new DataColumn[] { new DataColumn(@"ID", typeof(int)) , new DataColumn(@"QUALITY", typeof(short)) , new DataColumn(@"VALUE", typeof(float)) }); foreach (P_ALG.P_PUT pPut in pAlg.Values) { foreach (P_ALG.P_PUT.P_VAL val in pPut.Values) { tableRes.Rows.Add(new object[] { val.m_iId //ID_PUT , val.m_sQuality //QUALITY , val.value //VALUE }); } } return(tableRes); }
/// <summary> /// Преобразование словаря с результатом в таблицу для БД /// </summary> /// <param name="pAlg">Словарь с результатами расчета</param> /// <returns>Таблица для БД с результатами расчета</returns> protected static DataTable resultToTable(P_ALG pAlg) { DataTable tableRes = new DataTable(); tableRes.Columns.AddRange(new DataColumn[] { new DataColumn(@"ID", typeof(int)) , new DataColumn(@"QUALITY", typeof(short)) , new DataColumn(@"VALUE", typeof(float)) }); foreach (P_ALG.P_PUT pPut in pAlg.Values) { foreach (P_ALG.P_PUT.P_VALUE val in pPut.Values) { tableRes.Rows.Add(new object[] { val.m_iId //ID_PUT , val.m_sQuality //QUALITY //VALUE , ((double.IsNaN(val.value) == false) && (double.IsInfinity(val.value) == false)) ? val.value : -1F }); } } return(tableRes); }
/// <summary> /// Преоразовать результаты расчетов в список со значениями для дальнейшей обработки(отображения) /// </summary> /// <param name="pAlg">Словарь с данными для расчетов или результатов расчетов</param> /// <returns>Список со значениями для отображения</returns> protected static IEnumerable <VALUE> resultToListValue(P_ALG pAlg) { List <VALUE> listRes = new List <VALUE>(); foreach (P_ALG.P_PUT pPut in pAlg.Values) { foreach (KeyValuePair <P_ALG.KEY_P_VALUE, P_ALG.P_PUT.P_VALUE> pair in pPut) { if (listRes.FindIndex(item => { return((item.m_IdPut == pair.Value.m_iId) && (item.stamp_value == pair.Key.Stamp)); }) < 0) { listRes.Add( new VALUE() { m_IdPut = pair.Value.m_iId , m_iQuality = pair.Value.m_sQuality , value = pair.Value.value , stamp_value = pair.Key.Stamp , stamp_write = DateTime.MinValue } ); } else { Logging.Logg().Error(string.Format(@"TaskCalculate::resultToListValue () - дублирование при преобразовании резудьтатов расчетов...") , Logging.INDEX_MESSAGE.NOT_SET); } } } return(listRes); }
/// <summary> /// Конструктор - основной (без параметров) /// </summary> public TaskTepCalculate() : base() { m_indxCompRealTime = INDX_COMP.UNKNOWN; In = new P_ALG(); Norm = new P_ALG(); Out = new P_ALG(); fTable = new FTable(); }
/// <summary> /// Конструктор основной (с параметром) /// </summary> /// <param name="type">Тип расчета</param> public TaskCalculate(TYPE types , IEnumerable <HandlerDbTaskCalculate.NALG_PARAMETER> listNAlg , IEnumerable <HandlerDbTaskCalculate.PUT_PARAMETER> listPutPar , Dictionary <KEY_VALUES, List <VALUE> > dictValues) //public TaskCalculate(TYPE types, ListDATATABLE listDataTables) { _types = types; In = new P_ALG(); Out = new P_ALG(); _dictPAlg = new Dictionary <TYPE, P_ALG>() { { TYPE.IN_VALUES, In } , { TYPE.OUT_VALUES, Out } }; if ((types & TYPE.OUT_TEP_NORM_VALUES) == TYPE.OUT_TEP_NORM_VALUES) { Norm = new P_ALG(); _dictPAlg.Add(TYPE.OUT_TEP_NORM_VALUES, Norm); } else { ; } if (initValues(listNAlg, listPutPar, dictValues) < 0) { Logging.Logg().Error(string.Format(@"TaskCalculate::ctor () - вызов 'initValues ()' ...") , Logging.INDEX_MESSAGE.NOT_SET); } else { ; } }
/// <summary> /// Преобразование входных для расчета значений в структуры, пригодные для производства расчетов /// </summary> /// <param name="pAlg">Объект - словарь структур для расчета</param> /// <param name="tablePar">Таблица с параметрами</param> /// <param name="tableVal">Таблица со значениями</param> protected int initValues(P_ALG pAlg, DataTable tablePar, DataTable tableVal) { int iRes = 0; //Предположение, что ошибки нет DataRow[] rVal = null; int idPut = -1 , idComponent = -1; string strNAlg = string.Empty; pAlg.Clear(); // цикл по всем параметрам расчета foreach (DataRow rPar in tablePar.Rows) { // найти соответствие параметра в алгоритме расчета и значения для него idPut = (int)rPar[@"ID"]; // идентификатор параметра в алгоритме расчета - ключ для словаря с его характеристиками strNAlg = ((string)rPar[@"N_ALG"]).Trim(); rVal = tableVal.Select(@"ID_PUT=" + idPut); // проверить успешность нахождения соответствия if (rVal.Length == 1) { if (pAlg.ContainsKey(strNAlg) == false) {// добавить параметр в алгоритме расчета pAlg.Add(strNAlg, new P_ALG.P_PUT()); pAlg[strNAlg].m_sAVG = (Int16)rPar[@"AVG"]; pAlg[strNAlg].m_bDeny = false; } else { ; } // идентификатор компонента станции - ключ для словаря со значением и характеристиками для него idComponent = (int)rPar[@"ID_COMP"]; if (pAlg[strNAlg].ContainsKey(idComponent) == false) { pAlg[strNAlg].Add(idComponent, new P_ALG.P_PUT.P_VAL() // добавить параметр компонента в алгоритме расчета { m_iId = idPut //, m_iIdComponent = idComponent , m_bDeny = false , value = (float)(double)rVal[0][@"VALUE"] , m_sQuality = ID_QUALITY_VALUE.DEFAULT // не рассчитывался , m_idRatio = (int)rPar[@"ID_RATIO"] , m_fMinValue = (rPar[@"MINVALUE"] is DBNull) ? 0 : (float)rPar[@"MINVALUE"] //??? - ошибка д.б. float , m_fMaxValue = (rPar[@"MAXVALUE"] is DBNull) ? 0 : (float)rPar[@"MAXVALUE"] //??? - ошибка д.б. float }); } else { ; } } else {// ошибка - не найдено соответствие параметр-значение iRes = -1; Logging.Logg().Error(@"TaskCalculate::initValues (ID_PUT=" + idPut + @") - не найдено соответствие параметра и значения...", Logging.INDEX_MESSAGE.NOT_SET); } } return(iRes); }
protected int initValues(P_ALG pAlg , IEnumerable <HandlerDbTaskCalculate.NALG_PARAMETER> listNAlg , IEnumerable <HandlerDbTaskCalculate.PUT_PARAMETER> listPutPar , IEnumerable <VALUE> values) { int iRes = 0; NALG_PARAMETER nAlg; IEnumerable <VALUE> putValues; //VALUE value; P_ALG.KEY_P_VALUE keyPValue; foreach (PUT_PARAMETER putPar in listPutPar) { if (putPar.IsNaN == false) { nAlg = listNAlg.FirstOrDefault(item => { return(item.m_Id == putPar.m_idNAlg); }); putValues = values.Where(item => { return(item.m_IdPut == putPar.m_Id); }); if (!(nAlg == null)) { if (!(nAlg.m_Id < 0)) { foreach (VALUE value in putValues) { if ((value.m_IdPut > 0) /*&& (((value.stamp_value.Equals(DateTime.MinValue) == false)))*/) { if (pAlg.ContainsKey(nAlg.m_nAlg) == false) { pAlg.Add(nAlg.m_nAlg, new P_ALG.P_PUT(nAlg.m_Id, !nAlg.m_bEnabled, nAlg.m_sAverage)); } else { ; } keyPValue = new P_ALG.KEY_P_VALUE() { Id = putPar.IdComponent, Stamp = value.stamp_value }; if (pAlg[nAlg.m_nAlg].ContainsKey(keyPValue) == false) { pAlg[nAlg.m_nAlg].Add(keyPValue , new P_ALG.P_PUT.P_VALUE() { m_iId = putPar.m_Id , m_bDeny = !putPar.IsEnabled , m_idRatio = putPar.m_prjRatio , m_sQuality = (value.stamp_value.Equals(DateTime.MinValue) == false) ? value.m_iQuality : ID_QUALITY_VALUE.NOT_REC , value = (value.stamp_value.Equals(DateTime.MinValue) == false) ? value.value : 0F , m_fMinValue = putPar.m_fltMinValue , m_fMaxValue = putPar.m_fltMaxValue }); } else { // для параметра 1-го порядка уже содержится значение параметра 2-го порядка ; } } else { // некорректный параметр расчета 2-го порядка ; } } } else { // не найден либо параметр 1-го порядка, либо значение для параметра 2-го порядка ; } } else { // не найден параметр 1-го порядка (не ошибка - возможно putPar для другого типа расчета) ; } } else { // параметр 2-го порядка не достоверен ; } } return(iRes); }