связь двух полей

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
waresok
Новичок
Новичок
Аватара пользователя
 
Сообщения: 35
Зарегистрирован: 15.06.2008 (Вс) 9:17

связь двух полей

Сообщение waresok » 09.04.2010 (Пт) 20:37

Здравствуйте.

в VB6 на форме есть TextBox и ComboBox в который загружаются все записи поля №1 таблицы "Список" из базы данных Access

делаю это так
Код: Выделить всё
Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = DAO.OpenDatabase("C:\база.mdb")
Set rs = db.OpenRecordset("Список")

With rs
    .MoveFirst
    Do While Not .EOF
    cmb_word2.AddItem .Fields(1)
    .MoveNext
Loop
End With
rs.Close '
db.Close


так вот, нужно вывести информацию в TextBox из поля №2 таблицы "Список" в зависимости от выбранной записи в ComboBox.

Прошу пример, если можно.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: связь двух полей

Сообщение Денис » 09.04.2010 (Пт) 21:01

.AddSubItem
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

waresok
Новичок
Новичок
Аватара пользователя
 
Сообщения: 35
Зарегистрирован: 15.06.2008 (Вс) 9:17

Re: связь двух полей

Сообщение waresok » 09.04.2010 (Пт) 21:33

Денис писал(а):.AddSubItem


для VB.NET, а мне нужно для VB6

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: связь двух полей

Сообщение Денис » 09.04.2010 (Пт) 23:07

waresok писал(а):для VB.NET, а мне нужно для VB6

Упс, точно. :oops:
Можно было бы воспользоваться коллекцией ItemData, но у Вас вроде как строковые значения в обоих полях, как я понял.
Я бы сделал так:
    1. Структуру
    Код: Выделить всё
    Type Sample
        Field1 as string
        Field2 as string
    end type

    dim Smp(100500) as Sample

    2. заполнить массив-структуру из таблицы-рекордсета;
    3. подставить в List значения из Field1, в ItemData индексы массива;
    4. при выборе значения из списка, подставляем куда надо значение из Field2.

Как-то так:
Код: Выделить всё
Type Sample
    Field1 as string
    Field2 as string
end type

Dim db As DAO.Database
Dim rs As DAO.Recordset
dim Smp() as Sample
dim i as Long

Set db = DAO.OpenDatabase("C:\база.mdb")
Set rs = db.OpenRecordset("Список")

redim Smp({количество записей rs (ну не помню)})

With rs
    .MoveFirst
    Do While Not .EOF
    smp(i).field1 = .Fields(1)
    smp(i).field2 = .Fields(2)
    cmb_word2.AddItem smp(i).field1
    i = i+1
    .MoveNext
Loop
End With
rs.Close '
db.Close


Я сделал с итератором (i), но вообще, из соображений красоты и стиля, если в таблице есть ключевое поле с уникальными значениями, лучше брать значения оттуда, а не из итератора. Но это дело вкуса.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

waresok
Новичок
Новичок
Аватара пользователя
 
Сообщения: 35
Зарегистрирован: 15.06.2008 (Вс) 9:17

Re: связь двух полей

Сообщение waresok » 10.04.2010 (Сб) 8:52

Спасибо, но я имел ввиду другое, вот нашел на форуме то, что нужно примерно http://bbs.vbstreets.ru/viewtopic.php?f=1&t=34152&p=6672538&hilit=ComboBox+SELECT#p6672538, но там ошибка 3705 "операция не допускается, если объект уже открыт" на строке кода
Код: Выделить всё
rs1.Source = "Select Раздел1" & " From внештатники Where ФИО = ' " & abba & " ' "
в cmb_word2, а вот весь код (на форме 2 ComboBox с именами cmb_word2 и Combo2)


Код: Выделить всё
Dim abba As String
Dim cn1 As ADODB.Connection
Dim rs1 As ADODB.Recordset

Private Sub Form_Load()
Set cn1 = New ADODB.Connection
Set rs1 = New ADODB.Recordset
cn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & " Data Source =" & "C:\база.mdb"
rs1.LockType = adLockOptimistic
Set rs1.ActiveConnection = cn1
rs1.Source = "Select DISTINCT ПОЛЕ1 From Список Order by ПОЛЕ1"
rs1.Open
Do While Not rs1.EOF
cmb_word2.AddItem rs1.Fields("ПОЛЕ1").Value
rs1.MoveNext
Loop
If cmb_word2.ListCount > 0 Then cmb_word2.ListIndex = 0
rs1.Close
End Sub


Private Sub cmb_word2_Click()
abba = cmb_word2.Text
rs1.Source = "Select ПОЛЕ2" & " From Список Where ПОЛЕ1 = ' " & abba & " ' "
rs1.Open
Combo2.Clear
Do While Not rs1.EOF
Combo2.AddItem rs1.Fields("ПОЛЕ2")
rs1.MoveNext
Loop
rs1.Close
If Combo2.ListCount > 0 Then Combo2.ListIndex = 0
End Sub


А ошибка возникает во время загрузки формы, то есть rs1 в Sub Load еще не закрыт, а уже возникает ошибка в cmb_word2 на строчке
Код: Выделить всё
rs1.Source = "Select ПОЛЕ2" & " From Список Where ПОЛЕ1 = ' " & abba & " ' "
, о том, что объектная переменная rs1 не закрыта, хотя в Sub load должна закрываться.

Поясните в чем где ошибка

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: связь двух полей

Сообщение alibek » 10.04.2010 (Сб) 8:59

В источнике данных задай два поля, в комбобоксе укажи два столбца.
Нужный столбец можно получить через .Column.
Lasciate ogni speranza, voi ch'entrate.

waresok
Новичок
Новичок
Аватара пользователя
 
Сообщения: 35
Зарегистрирован: 15.06.2008 (Вс) 9:17

Re: связь двух полей

Сообщение waresok » 10.04.2010 (Сб) 12:48

alibek писал(а):В источнике данных задай два поля, в комбобоксе укажи два столбца.
Нужный столбец можно получить через .Column.


не подойдет, т.к. нужно в TextBox выводить, а 2 комбобокса для примера, просто похожая тема, но пример не работает

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: связь двух полей

Сообщение Денис » 11.04.2010 (Вс) 17:10

alibek писал(а):В источнике данных задай два поля, в комбобоксе укажи два столбца.
Нужный столбец можно получить через .Column.


Ему для vb6 надо. В тамошних комбобоксах нет столбцов.

А вообще, давайте абстрагируемся от БД. Нужно так или не так? (на форму кинуть комбобокс Combo1 и текстбокс Text1)

Код: Выделить всё
Option Explicit

Private Type Sample
    str1 As String
    str2 As String
End Type

Dim Smp(10) As Sample

Private Sub Combo1_Click()
   
    Text1.Text = Smp(Combo1.ListIndex).str2

End Sub

Private Sub Form_Load()

Dim i As Integer

For i = 0 To 10
    Smp(i).str1 = "Элемент " & CStr(i)
    Smp(i).str2 = "Текст для элемента " & CStr(i)
    Combo1.AddItem Smp(i).str1, i
Next

End Sub
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26

    TopList