예제 #1
0
            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));
            }