private void button1_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Данные будут записаны в БД! Продолжить?", "Предупреждение", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
            {
                foreach (ProgramReadDB.InitValue list in InitValuesLists1[comboBox1.SelectedIndex].InitValuesList)
                {
                    string SQL = "Update ISACARDS set INITIALVALUE = '" + textBox1.Text + "' where CARDSID =" + list.ObjID;

                    ProgramConnect connect = new ProgramConnect();
                    connect.WriteToBase(SQL, BaseAddr);
                }

                MessageBox.Show("Данные записаны");
            }
        }
        public void FullKlName()
        {
            string         SQL_KLASS = "Select * from KLASSIFIKATOR";
            ProgramConnect connect   = new ProgramConnect();

            connect.ConnectToBase(SQL_KLASS, BaseAddr);

            foreach (TeconObject obj in TeconObjects)
            {
                string KlassPath = obj.KLASSIFIKATORNAME;
                int    TmpID     = 0;

                string st = "";
                for (int i = 0; i < connect.dt1.Rows.Count; i++)
                {
                    st = connect.dt1.Rows[i][2].ToString();       // выбираем НАЗВАНИЕ
                    if (st == obj.KLASSIFIKATORNAME)
                    {
                        TmpID = Convert.ToInt16(connect.dt1.Rows[i][1]); /*выбираем PID*/ break;
                    }
                }


                while (TmpID != 0)
                {
                    for (int i = 0; i < connect.dt1.Rows.Count; i++)
                    {
                        if ((Convert.ToInt16(connect.dt1.Rows[i][0]) == TmpID))
                        {
                            TmpID = Convert.ToInt16(connect.dt1.Rows[i][1]);
                            if (TmpID == 0)
                            {
                                break;
                            }
                            KlassPath = Convert.ToString(connect.dt1.Rows[i][2]) + @"\" + KlassPath;
                            break;
                        }
                    }
                }
                obj.KLASSIFIKATORNAME = KlassPath;
            }
        }
        public void AddInitValue(int ID)
        {
            string         SQL     = "Select ISACARDS.MARKA, ISACARDS.INITIALVALUE from ISACARDS where ISACARDS.CARDSID = " + ID;
            ProgramConnect connect = new ProgramConnect();

            connect.ConnectToBase(SQL, BaseAddr);

            var obj = new InitValue()
            {
                Marka        = connect.dt1.Rows[0][0].ToString(),
                InitialValue = connect.dt1.Rows[0][1].ToString(),
                ObjID        = ID.ToString()
            };

            SQL = "Select OBJTYPE.NAME from CARDS, OBJTYPE where CARDS.ID = " + ID + " and CARDS.OBJTYPEID = OBJTYPE.ID";
            connect.ConnectToBase(SQL, BaseAddr);

            obj.ObjType = connect.dt1.Rows[0][0].ToString();

            InitValues.Add(obj);
        }
        public void FindTypes()
        {
            ObjTypeIDUnic.Clear();
            ObjTypeCh.Clear(); // для повторной активации функции
            ObjTypeChannelsList.Clear();

            ObjTypeIDUnic = ObjTypeID.Distinct().ToList(); //убираем повторяющиеся типы объектов

            foreach (int id in ObjTypeIDUnic)
            {
                SQL_OBJTYPES = "Select OBJTYPEPARAM.NAME from OBJTYPEPARAM where OBJTYPEPARAM.PID = " + id;
                ProgramConnect connect = new ProgramConnect();
                connect.ConnectToBase(SQL_OBJTYPES, BaseAddr);

                for (int i = 0; i < connect.dt1.Rows.Count; i++)
                {
                    ObjTypeChannelsList.Add(connect.dt1.Rows[i][0].ToString());
                }

                var ObjTypeCh1 = new ObjTypeChannels()
                {
                    TypeID   = id,
                    Channels = ObjTypeChannelsList.ToList(),
                    Index    = 0, // 0 - значит индекс еще не заполнен
                };

                ObjTypeCh.Add(ObjTypeCh1); //заполняем список с каналами типа объекта
            }

            // выявление одинаковых каналов у типов и присваивание им индексов
            int k = 1;

            for (int i = 0; i <= ObjTypeCh.Count - 1; i++)
            {
                for (int j = 0; j <= ObjTypeCh.Count - 1; j++)
                {
                    if ((ObjTypeCh[i].Channels.SequenceEqual(ObjTypeCh[j].Channels)) && (i != j))
                    {
                        if (ObjTypeCh[i].Index != 0)
                        {
                            ObjTypeCh[j].Index = ObjTypeCh[i].Index;
                        }
                        else
                        {
                            ObjTypeCh[i].Index = k;
                            ObjTypeCh[j].Index = ObjTypeCh[i].Index;
                            k++;
                        }
                    }
                }
            }



            // Присваиваем оставшимся уникальным типам (нулевые индексы) индексы больше, чем у неуникальных
            for (int i = 0; i <= ObjTypeCh.Count - 1; i++)
            {
                if (ObjTypeCh[i].Index == 0)
                {
                    ObjTypeCh[i].Index = k;
                    k++;
                }
            }

            // Присваиваем индексы каждому объекту, согласно его типу
            for (int i = 0; i <= TeconObjects.Count - 1; i++)
            {
                for (int j = 0; j <= ObjTypeCh.Count - 1; j++)
                {
                    if (TeconObjects[i].ObjTypeID == ObjTypeCh[j].TypeID)
                    {
                        TeconObjects[i].Index = ObjTypeCh[j].Index;
                        break;
                    }
                    else if (j == ObjTypeCh.Count)
                    {
                        MessageBox.Show("Для объекта: " + TeconObjects[i].Name + "; не найден тип!");
                    }
                }
            }

            TablesNum = k - 1; //присваиваем количество таблиц
        }
        public List <string> ObjTypeChannelsMatched = new List <string>();    //список каналов типа объекта


        public void Big_SQL(List <int> ObjID) //ОНО СРАБОТАЕТ ТАК? //Запрос всех каналов
        {
            // Делаем часть строки с ID для запроса Каналов
            string Ch        = "";
            bool   firstIter = true;

            for (int i = 0; i < ObjID.Count; i++)   // объединили все id в один запрос
            {
                if (firstIter)
                {
                    Ch = Ch + " (CARDPARAMS.CARDID =  " + ObjID[i].ToString() + " and OBJTYPEPARAM.ID = CARDPARAMS.OBJTYPEPARAMID) "; firstIter = false;
                }                                                                                                                                                        // запросы проверены, таким образом мы не получим бесконечного цикла в ответе и ID каналов подменятся на имена
                else
                {
                    Ch = Ch + " or (CARDPARAMS.CARDID = " + ObjID[i].ToString() + " and OBJTYPEPARAM.ID = CARDPARAMS.OBJTYPEPARAMID) ";
                }
            }

            //1. Запрос параметров каналов
            SQL_CARDPARAMS = "Select CARDPARAMS.S0, CARDPARAMS.S100, CARDPARAMS.M, CARDPARAMS.PLC_VARNAME, CARDPARAMS.ED_IZM, CARDPARAMS.ARH_APP, CARDPARAMS.DISC, CARDPARAMS.KA, CARDPARAMS.KB, CARDPARAMS.OBJTYPEPARAMID, OBJTYPEPARAM.NAME, CARDPARAMS.CARDID from CARDPARAMS, OBJTYPEPARAM where " + Ch;
            ProgramConnect connect = new ProgramConnect();

            connect.ConnectToBase(SQL_CARDPARAMS, BaseAddr);
            TmpDG = connect.dt1;

            for (int i = 0; i < TmpDG.Rows.Count; i++)
            {
                var objChnl = new SQL_TeconObjectChannel()
                {
                    S0          = TmpDG.Rows[i][0].ToString(),
                    S100        = TmpDG.Rows[i][1].ToString(),
                    M           = TmpDG.Rows[i][2].ToString(),
                    PLC_VARNAME = TmpDG.Rows[i][3].ToString(),
                    ED_IZM      = TmpDG.Rows[i][4].ToString(),
                    ARH_APP     = TmpDG.Rows[i][5].ToString(),
                    DISC        = TmpDG.Rows[i][6].ToString(),
                    KA          = TmpDG.Rows[i][7].ToString(),
                    KB          = TmpDG.Rows[i][8].ToString(),
                    ID          = TmpDG.Rows[i][9].ToString(),        //OBJPARAMID
                    ChannelName = TmpDG.Rows[i][10].ToString(),
                    LoadID      = Convert.ToInt32(TmpDG.Rows[i][11]), //ID исходный
                };

                //connect.ConnectToBase("Select OBJTYPEPARAM.NAME from OBJTYPEPARAM where OBJTYPEPARAM.ID = " + objChnl.ID, BaseAddr);
                //objChnl.ChannelName = connect.dt1.Rows[0][0].ToString();
                SQL_Channels.Add(objChnl);
            }
            TmpDG.Clear();

            //2. Запрос деф параметров каналов
            //На удивление, имеем аналогичную часть запроса как и в предыдущем шаге, поэтому ничего менять в ней не будем.

            SQL_CARDPARAMS = "select OBJTYPEPARAM.disc, OBJTYPEPARAM.isev, OBJTYPEPARAM.NAME, cardparams.cardid, OBJTYPEPARAM.id  from OBJTYPEPARAM, cardparams where  " + Ch;
            ProgramConnect connect1 = new ProgramConnect();  // не до экспериментов, создал новую переменную, можно проверить потом, прокатит с той же или нет

            connect1.ConnectToBase(SQL_CARDPARAMS, BaseAddr);
            TmpDG = connect1.dt1;

            for (int i = 0; i < TmpDG.Rows.Count; i++)
            {
                var DefobjChnl = new SQL_TeconObjectChannel()
                {
                    S0          = "0",
                    S100        = "100",
                    M           = "1",
                    PLC_VARNAME = "",
                    ED_IZM      = "",
                    ARH_APP     = TmpDG.Rows[i][1].ToString(),
                    DISC        = TmpDG.Rows[i][0].ToString(),
                    KA          = "1",
                    KB          = "0",
                    ID          = TmpDG.Rows[i][4].ToString(),       //OBJPARAMID
                    ChannelName = TmpDG.Rows[i][2].ToString(),
                    LoadID      = Convert.ToInt32(TmpDG.Rows[i][3]), //ID исходный
                };

                //connect.ConnectToBase("Select OBJTYPEPARAM.NAME from OBJTYPEPARAM where OBJTYPEPARAM.ID = " + objChnl.ID, BaseAddr);
                //objChnl.ChannelName = connect.dt1.Rows[0][0].ToString();
                SQL_DefChannels.Add(DefobjChnl);
            }

            TmpDG.Clear();

            //3. Запрос параметров тех объекта
            Ch        = "";
            firstIter = true;
            for (int i = 0; i < ObjID.Count; i++)   // объединили все id в один запрос
            {
                if (firstIter)
                {
                    Ch = Ch + " (CARDS.ID = " + ObjID[i].ToString() + " and CARDS.OBJTYPEID = OBJTYPE.ID and CARDS.EVKLID = EVKLASSIFIKATOR.ID and CARDS.TEMPLATEID = ISAOBJ.ID and CARDS.KLID = KLASSIFIKATOR.ID) "; firstIter = false;
                }                                                                                                                                                                                                                                        // запросы проверены, таким образом мы не получим бесконечного цикла в ответе и ID каналов подменятся на имена
                else
                {
                    Ch = Ch + " or (CARDS.ID = " + ObjID[i].ToString() + " and CARDS.OBJTYPEID = OBJTYPE.ID and CARDS.EVKLID = EVKLASSIFIKATOR.ID and CARDS.TEMPLATEID = ISAOBJ.ID and CARDS.KLID = KLASSIFIKATOR.ID) ";
                }
            }

            SQL_CARDS = "Select CARDS.MARKA, CARDS.NAME, CARDS.DISC, OBJTYPE.NAME, CARDS.ARH_PER, CARDS.OBJSIGN, CARDS.PLC_ID, CARDS.PLC_GR, EVKLASSIFIKATOR.NAME, CARDS.KKS, ISAOBJ.NAME, KLASSIFIKATOR.NAME, CARDS.PLC_VARNAME, CARDS.PLC_ADRESS, CARDS.OBJTYPEID, CARDS.ID from CARDS, OBJTYPE, KLASSIFIKATOR, EVKLASSIFIKATOR, ISAOBJ where " + Ch; //, RESOURCES
            ProgramConnect connect2 = new ProgramConnect();                                                                                                                                                                                                                                                                                             // не до экспериментов, создал новую переменную, можно проверить потом, прокатит с той же или нет

            connect2.ConnectToBase(SQL_CARDS, BaseAddr);
            TmpDG = connect2.dt1;

            //---------------------------Заполняем параметры объекта---------------------------------------------------------------
            for (int i = 0; i < TmpDG.Rows.Count; i++)
            {
                var obj = new SQL_TeconObject()
                {
                    Marka               = TmpDG.Rows[i][0].ToString(),
                    Name                = TmpDG.Rows[i][1].ToString(),
                    Disc                = TmpDG.Rows[i][2].ToString(),
                    ObjTypeName         = TmpDG.Rows[i][3].ToString(),
                    Arc_Per             = TmpDG.Rows[i][4].ToString(),
                    ObjSign             = TmpDG.Rows[i][5].ToString(),
                    PLC_Name            = TmpDG.Rows[i][6].ToString(),
                    PLC_GR              = TmpDG.Rows[i][7].ToString(),
                    EVKLASSIFIKATORNAME = TmpDG.Rows[i][8].ToString(),
                    KKS               = TmpDG.Rows[i][9].ToString(),
                    POUNAME           = TmpDG.Rows[i][10].ToString(),
                    KLASSIFIKATORNAME = TmpDG.Rows[i][11].ToString(),
                    PLC_varname       = TmpDG.Rows[i][12].ToString(),
                    PLC_address       = TmpDG.Rows[i][13].ToString(),
                    ObjTypeID         = Convert.ToInt16(TmpDG.Rows[i][14]),
                    LoadID            = Convert.ToInt16(TmpDG.Rows[i][15])
                };
                //MessageBox.Show(i.ToString());
                SQL_Objects.Add(obj);
            }
            TmpDG.Clear();
            //4. Запрос одного параметра с названием ПЛК(ОТДЕЛЬНО ПОДУМОЙ!)
            //ПОКА БЕЗ ЭТОГО ПРОБУЕМ, ПОТОМ ПРИКРУТИМ
        }