public MiddleMarks_class(int Year, uint PodrID, uint ObjectID) { this.Year = Year; this.PodrID = PodrID; this.ObjectID = ObjectID; var SM = T.SM.CreateSubTable(false); var SMS = T.SMS.CreateSubTable(false); var Sample = T.Sample.CreateSubTable(false); var SPoint = T.SPoint.CreateSubTable(false); var Mark = T.Mark.CreateSubTable(false); int DayFrom = ATMisc.GetYMDFromYearMonth(Year, 1) - 1; int DayTo = ATMisc.GetYMDFromYearMonth(Year + 1, 1); var Union = data.User <uint>(C.User.UType) == (uint)data.UType.Union; var SMQ = SM.QUERRY() .SHOW .WHERE .AC(C.SM.Amount).More.BV <double>(0) .AND.ARC(C.SM.Sample, C.Sample.CYMD).More.BV(DayFrom) .AND.ARC(C.SM.Sample, C.Sample.CYMD).Less.BV(DayTo) .AND.ARC(C.SM.Sample, C.Sample.Number).More.BV(0) .AND.ARC(C.SM.Sample, C.Sample.SPoint, C.SPoint.YMDS).Less.BV(DayTo) .AND .OB() .ARC(C.SM.Sample, C.Sample.SPoint, C.SPoint.YMDE).More.BV(DayFrom) .OR.ARC(C.SM.Sample, C.Sample.SPoint, C.SPoint.YMDE).EQUI.BV(0) .CB() .AND.ARC(C.SM.Sample, C.Sample.SPoint, C.SPoint.Union).EQUI.BV(Union); var SMSQ = SMS.QUERRY() .SHOW .WHERE .ARC(C.SMS.SPoint, C.SPoint.YMDS).Less.BV(DayTo) .AND .OB() .ARC(C.SMS.SPoint, C.SPoint.YMDE).More.BV(DayFrom) .OR.ARC(C.SMS.SPoint, C.SPoint.YMDE).EQUI.BV(0) .CB() .AND.ARC(C.SMS.SPoint, C.SPoint.Union).EQUI.BV(Union); var SPQ = SPoint.QUERRY() .SHOW .WHERE .AC(C.SPoint.YMDS).Less.BV(DayTo) .AND .OB() .AC(C.SPoint.YMDE).More.BV(DayFrom) .OR.AC(C.SPoint.YMDE).EQUI.BV(0) .CB() .AND.C(C.SPoint.Union, Union); var SQ = Sample.QUERRY() .SHOW .WHERE .AC(C.Sample.Number).More.BV <int>(0) .AND.ARC(C.Sample.SPoint, C.SPoint.YMDS).Less.BV(DayTo) .AND .OB() .ARC(C.Sample.SPoint, C.SPoint.YMDE).More.BV(DayFrom) .OR.ARC(C.Sample.SPoint, C.SPoint.YMDE).EQUI.BV(0) .CB() .AND.AC(C.Sample.CYMD).More.BV(DayFrom) .AND.AC(C.Sample.CYMD).Less.BV(DayTo) .AND.ARC(C.Sample.SPoint, C.SPoint.Union).EQUI.BV(Union); if (PodrID > 0) { SMQ.AND.ARC(C.SM.Sample, C.Sample.SPoint, C.SPoint.Podr).EQUI.BV(PodrID); SMSQ.AND.ARC(C.SMS.SPoint, C.SPoint.Podr).EQUI.BV(PodrID); SPQ.AND.AC(C.SPoint.Podr).EQUI.BV(PodrID); SQ.AND.ARC(C.Sample.SPoint, C.SPoint.Podr).EQUI.BV(PodrID); } if (ObjectID > 0) { SMQ.AND.ARC(C.SM.Sample, C.Sample.SPoint, C.SPoint.Object).EQUI.BV(ObjectID); SMSQ.AND.ARC(C.SMS.SPoint, C.SPoint.Object).EQUI.BV(ObjectID); SPQ.AND.AC(C.SPoint.Object).EQUI.BV(ObjectID); SQ.AND.ARC(C.Sample.SPoint, C.SPoint.Object).EQUI.BV(ObjectID); } SMQ.DO(); SMSQ.DO(); SPQ.DO(); SQ.DO(); Mark.QUERRY().SHOW.WHERE.AC(C.Mark.Number).More.BV(0).DO(); var MarkPerSP = new bool[SPoint.Rows.Count, Mark.Rows.Count]; var SPSampleCount = new int[SPoint.Rows.Count, 12]; var MarkIndexes = new int[Mark.Rows.Count]; for (int i = 0; i < MarkIndexes.Length; i++) { MarkIndexes[i] = -1; } for (int i = 0; i < SMS.Rows.Count; i++) //получаю список доступных показателей, по спискам показателей для точек отбора { var SPRI = SPoint.Rows.GetIndex(SMS.Rows.Get_UnShow <uint>(i, C.SMS.SPoint)); var MID = SMS.Rows.Get_UnShow <uint>(i, C.SMS.Mark); if (SPRI > -1) { var MRI = Mark.Rows.GetIndex(SMS.Rows.Get_UnShow <uint>(i, C.SMS.Mark)); if (MRI > -1) { MarkPerSP[SPRI, MRI] = true; MarkIndexes[MRI] = 1; } } } for (int i = 0; i < SPoint.Rows.Count; i++) //получаю показатели по настройке точек отбора "Игнорировать список показателей" { if (SPoint.Rows.Get <bool>(i, C.SPoint.IMLst)) { for (int j = 0; j < MarkIndexes.Length; j++) { MarkIndexes[j] = 1; MarkPerSP[i, j] = true; } } } { //определяю список показателей вывода int count = 0; for (int i = 0; i < MarkIndexes.Length; i++) { if (MarkIndexes[i] > 0) { MarkIndexes[i] = count++; } } Marks = new Mark_struct[count]; } //определяю показатели, которые в любом случае надо выводить for (int i = 0; i < MarkIndexes.Length; i++) { if (MarkIndexes[i] > -1 && ((data.VarType)Mark.Rows.Get_UnShow <uint>(i, C.Mark.VarType) == data.VarType.Bool || Mark.Rows.Get <bool>(i, C.Mark.ShowZr))) //булевый тип или настройка показателя { Marks[MarkIndexes[i]] = new Mark_struct(Mark.Rows.GetID(i)); } } //считаю кол-во замеров по месяцам и точкам отборов for (int i = 0; i < Sample.Rows.Count; i++) { if (Sample.Rows.Get <int>(i, C.Sample.Number) > 0) { var SPRI = SPoint.Rows.GetIndex(Sample.Rows.Get_UnShow <uint>(i, C.Sample.SPoint)); if (SPRI > -1) { int tmpYear, tmpMonth, tmpDay; ATMisc.GetYearMonthDayFromYMD(Sample.Rows.Get <int>(i, C.Sample.CYMD), out tmpYear, out tmpMonth, out tmpDay); SPSampleCount[SPRI, tmpMonth - 1]++; } } } //заношу концентрации for (int i = 0; i < SM.Rows.Count; i++) { var SMID = SM.Rows.GetID(i); var SPRI = SPoint.Rows.GetIndex(SM.Rows.Get_UnShow <uint>(i, C.SM.Sample, C.Sample.SPoint)); var MID = SM.Rows.Get_UnShow <uint>(i, C.SM.Mark); if (SPRI > -1) { var SRI = Sample.Rows.GetIndex(SM.Rows.Get_UnShow <uint>(i, C.SM.Sample)); if (SRI > -1) { var MIndex = Mark.Rows.GetIndex(MID); if (MIndex > -1 && MarkPerSP[SPRI, MIndex]) { MIndex = MarkIndexes[MIndex]; if (!Marks[MIndex].Existed) { Marks[MIndex] = new Mark_struct(MID); } int tmpYear, tmpMonth, tmpDay; ATMisc.GetYearMonthDayFromYMD(SM.Rows.Get <int>(i, C.SM.Sample, C.Sample.CYMD), out tmpYear, out tmpMonth, out tmpDay); Marks[MIndex].AddAmount(tmpMonth - 1, (data.VarType)SM.Rows.Get_UnShow <uint>(i, C.SM.Mark, C.Mark.VarType), SM.Rows.Get <double>(i, C.SM.Amount)); } } } } //указываю кол-во замеров по месяцам и убираю не использованые показатели if (Marks.Length > 0) { for (int i = 0; i < MarkIndexes.Length; i++) { if (MarkIndexes[i] > -1 && Marks[MarkIndexes[i]].Existed) { var SMRepMonth = new int[12]; for (int j = 0; j < SPoint.Rows.Count; j++) { if (MarkPerSP[j, i]) { for (int m = 0; m < 12; m++) //месяцы { SMRepMonth[m] += SPSampleCount[j, m]; } } } for (int j = 0; j < SMRepMonth.Length; j++) { Marks[MarkIndexes[i]].SetMarksCount(SMRepMonth[j], j); } } } int RemoveCount = 0; for (int i = Marks.Length - 2; i > -1; i--) { if (!Marks[i].Existed) { Array.Copy(Marks, i + 1, Marks, i, Marks.Length - i - 1); RemoveCount++; } } if (!Marks[Marks.Length - 1].Existed) { RemoveCount++; } Array.Resize(ref Marks, Marks.Length - RemoveCount); } Array.Sort(Marks, (it1, it2) => it1.Number.CompareTo(it2.Number)); }