Страницы: 1
RSS
Связь(фильтр) данных между комбобоксами, Организация взаимосвязи между двумя комбобоксами
 
Как всегда, приветствую многоуважаемых форумчан!

Есть два комбобокса, заполненные из таблицы с сервера.
Выглядят так:

Код
'Соединение с базой и получение данных в Combobx-ы'
cn.Open    
sSQL = "Select distinct id1 From Itog Where id1 IS NOT NULL Order by 1"    
Set rs = cn.Execute(sSQL)    
If Not cn.State = 1 Then Exit Sub    
a = rs.GetRows   
 Me.ComboBox1.List = Application.Index(a, 1, 0)
rs.Close:     
cn.Close
'-------------------
cn.Open    
sSQL = "Select distinct id2 FROM Itog ORDER BY 1"    
Set rs = cn.Execute(sSQL)
    If Not cn.State = 1 Then Exit Sub
    a = rs.GetRows
    Me.ComboBox2.List = Application.Index(a, 1, 0)
rs.Close:
cn.Close

Как организовать связь между комбобоксами?
Что бы при выборе данных в комбобоксе подтягивались данные из другого комбобокса, если они есть?
Изменено: Джек Восмеркин - 14.01.2020 08:12:45
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
 
Цитата
Джек Восмеркин написал:
Что бы при выборе данных в комбобоксе подтягивались данные из другого комбобокса,
Подтягивались куда?
Задание неясно.
если нужно во втором боксе получить список на основании первого, то что то типа
sSQL = "Select distinct id2 FROM Itog WHERE id1 =" &  Me.ComboBox1.Value & "ORDER BY 1"
 
Не то.
Me.ComboBox1.Value просто не попадает в sSQL
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
 
1. Мне кажется, что у Вас в каждый комбобокс записывается только 1 значение из выборки, а не весь результат запроса, но я могу ошибаться.
2. Из Вашего кода совершенно не видно какая связь между  ID1 и ID2.
3. На каждый комбобокс нужно повесить повесить событие "on change", по срабатывании которого обновлять список значений в другом комбобоксе.
4. ИМХО не очень хорошая идея постоянно запрашивать данные для комбо боксов туда-сюда, так что хорошо бы их при запуске формы сохранить их в какой-нить массив, а потом при необходимости обновления обращаться уже непосредственно к нему.
Я не волшебник, я только учусь.
 
1. Да не, в комбобокс идет весь результат запроса - из которого можно выбирать любое значение.
2.Связи действительно не видно...)))... Ее надо сделать. ID1, ID2 - это просто поля одной таблицы и никаких условий там нет.
Если в ComboBox1 выбрать 1элемент "Иванов", то в ComboBox2 должны отобразиться соответствующие 4 "Иван".
Вот как то вот так...)))
3. Мне кажется, не стоит. Хотя возможно и ошибаюсь.
4. Данные для комбобоксов запрашиваются с сервера SQL - так что каждый раз при инициализации формы приходится запрашивать заново, во избежание.
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
 
Ну не знаю я как Вы без onChange такую задачу решите...
В теории, в комбоБокс можно в одной строчке несколько значений хранить. Если у Вас связь списков один к одному, то можно в каждый комбо бокс сразу пару значений загнать, но зачем тогда их 2 нужно?!....
Код
Option Explicit

Dim bFlag

Private Sub ComboBox1_Change()
    If bFlag Then
        bFlag = False
        UserForm1.ComboBox2.Value = UserForm1.ComboBox1.List(UserForm1.ComboBox1.ListIndex, 1)
        bFlag = True
    End If
End Sub

Private Sub ComboBox2_Change()
    If bFlag Then
        bFlag = False
        UserForm1.ComboBox1.Value = UserForm1.ComboBox2.List(UserForm1.ComboBox2.ListIndex, 1)
        bFlag = True
    End If
End Sub

Private Sub UserForm_Activate()
    Dim arrX(3, 2) As String
    Dim i As Long
    
    bFlag = True
    arrX(1, 1) = "Иванов"
    arrX(1, 2) = "Иван"
    arrX(2, 1) = "Петров"
    arrX(2, 2) = "Пётр"
    arrX(3, 1) = "Сидоров"
    arrX(3, 2) = "Яша"
    UserForm1.ComboBox1.ColumnCount = 2 'Вообще не нужная строчка, просто показать, что  в комбоБоксе можно оба хначения показывать
    For i = 1 To 3
        UserForm1.ComboBox1.AddItem arrX(i, 1)
        UserForm1.ComboBox1.List(i - 1, 1) = arrX(i, 2)
        UserForm1.ComboBox2.AddItem arrX(i, 2)
        UserForm1.ComboBox2.List(i - 1, 1) = arrX(i, 1)
    Next i
    bFlag = True
End Sub

Я не волшебник, я только учусь.
Страницы: 1
Наверх