Проблема с ComboBox

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
dima81
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 26.08.2007 (Вс) 22:36

Проблема с ComboBox

Сообщение dima81 » 27.08.2007 (Пн) 11:10

Есть такой код соединения с базой данных через ADO. Загрузил в 1-ый ComboBox столбец с номерами поставщиков. А теперь мне нужно, чтобы при выборе конкретного номера поставщика в 1-ом ComboBox, напр. S3, в другой ComboBox загружался его статус (только без if, так этих номеров может быть сотня), для другого поставщика свой статус и т.д.

Dim cn1 As ADODB.Connection
Dim rs1 As ADODB.Recordset
Dim abba as string

Private Sub Form_Load()

Set cn1 = New ADODB.Connection
Set rs1 = New ADODB.Recordset
cn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
" Data Source =" & App.Path & "\Post.mdb"
rs1.LockType = adLockOptimistic
Set rs1.ActiveConnection = cn1
rs1.Source = ""Select DISTINCT НомерПоставщика From Поставщики Order by НомерПоставщика "
rs1.Open
rs1.MoveFirst
Combo1.Text = rs1.Fields("НомерПоставщика")
Do While Not rs1.EOF
Combo1.AddItem rs1.Fields("НомерПоставщика").Value
rs1.MoveNext
Loop
rs1.Close
End Sub

Private Sub Combo1_Click()
abba = Combo1.Text

rs1.Source = "Select Статус " & _
" From Поставки Where НомерПоставщика = ' " & abba & " ' "

rs1.Open

rs1.MoveFirst

Combo2.Text = rs1.Fields("Статус")
Do While Not rs1.EOF
Combo2..AddItem rs1.Fields("Статус")
rs1.MoveNext
Loop
rs1.Close

End Sub

Но возникает ошибка
Run time-Error '3021' BOF или EOF имеет значение True, либо текущая запись удалена. Для выполнения операции требуется текущая запись

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Проблема с ComboBox

Сообщение Antonariy » 27.08.2007 (Пн) 11:20

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

Private Sub Form_Load()

Set cn1 = New ADODB.Connection
Set rs1 = New ADODB.Recordset
cn1.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
" Data Source =" & App.Path & "\Post.mdb"
rs1.LockType = adLockOptimistic
Set rs1.ActiveConnection = cn1
rs1.Source = ""Select DISTINCT НомерПоставщика From Поставщики Order by НомерПоставщика "
rs1.Open
Do While Not rs1.EOF
Combo1.AddItem rs1.Fields("НомерПоставщика").Value
rs1.MoveNext
Loop
If Combo1.ListCount > 0 Then Combo1.ListIndex = 0
rs1.Close
End Sub

Private Sub Combo1_Click()
abba = Combo1.Text

rs1.Source = "Select Статус " & _
" From Поставки Where НомерПоставщика = ' " & abba & " ' "

rs1.Open
Combo2.Clear
Do While Not rs1.EOF
Combo2.AddItem rs1.Fields("Статус")
rs1.MoveNext
Loop
rs1.Close
If Combo2.ListCount>0 then Combo2.ListIndex = 0
End Sub
Лучший способ понять что-то самому — объяснить это другому.

dima81
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 26.08.2007 (Вс) 22:36

Antonariy

Сообщение dima81 » 27.08.2007 (Пн) 12:00

Спешe огорчить вас, Antonariy. Но с вашем кодом Combo1 заполняется, но при нажатии на конкретного номера поставщика в Combo1 - Combo2 ничем не заполняется, а просто очищается (т.к. в коде стоит Combo2.Clear)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 27.08.2007 (Пн) 12:42

Спешу в свою очередь огорчить ВАС, потому что для некоторых поставщиков в "поставках" записи отсутствуют. :) Поэтому и вываливалась ошибка 3021, когда на второй по счету строчке rs1.MoveFirst (кстати совершенно не нужную - если есть записи, то после открытия курсор и так находится на первой) происходит попытка перехода на первую запись, которой нет.

Одно из золотых правил работы с рекордсетами - после открытия и перед манипуляциями со значениями ВСЕГДА тем или иным способом проверять количество записей.

Еще одно золотое правило - при присвоении значения переменной конкретного типа проверять, не null ли присваивается. Самый простой способ:
Код: Выделить всё
Dim s As String

s = StrFromRs(rs!Field1)

Public Function StrFromRS(valueRS) As String
    If Not IsNull(valueRS) Then StrFromRS = valueRS
End Function
Соблюдение этих нехитрых правил позволит избежать большинства неожиданных ламерских ошибок.
Лучший способ понять что-то самому — объяснить это другому.

dima81
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 26.08.2007 (Вс) 22:36

Antonariy

Сообщение dima81 » 27.08.2007 (Пн) 13:11

Согласен с Вами. Действительно не для всех поставщиков в "поставках" записи присутствуют, поэтому Вы и убрали из кода Combo2.Text = rs1.Fields("Статус"). Ошибка пропала.
Чтобы были все записи, надо поменять строку
rs1.Source = ""Select DISTINCT НомерПоставщика From Поставщики Order by НомерПоставщика "
на строку
rs1.Source = ""Select DISTINCT НомерПоставщика From Поставки Order by НомерПоставщика "

Но почему-то все равно Combo2 выводится пустым. Подскажите в чем дело?
С уважением

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.08.2007 (Пн) 13:16

dima81, за создание дублей здесь получают по голове.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

dima81
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 26.08.2007 (Вс) 22:36

GSerg

Сообщение dima81 » 27.08.2007 (Пн) 13:29

GSerg, извините. Просто не уверен был, в каком разделе это надо было писать. Больше не повторится.


Antonariy, спасибо за помощь. Я разобрался
Чтобы были все записи, надо поменять строку
rs1.Source = ""Select DISTINCT НомерПоставщика From Поставщики Order by НомерПоставщика "
на строку
rs1.Source = ""Select DISTINCT НомерПоставщика From Поставки Order by НомерПоставщика "

Но чтобы все выводилось надо было убрать лишние пробелы из строки rs1.Source = "Select Статус " & _
" From Поставки Where НомерПоставщика = ' " & abba & " ' " (т.е. так: '" & abba & "' "

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 27.08.2007 (Пн) 13:29

Код: Выделить всё
' " & abba & " '
Мешаются пробелы между апострофами?
Лучший способ понять что-то самому — объяснить это другому.

dima81
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 26.08.2007 (Вс) 22:36

Antonariy

Сообщение dima81 » 27.08.2007 (Пн) 13:41

Antonariy, точно так. Но вы мне сильно помогли. СПАСИБО


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: AhrefsBot и гости: 50

    TopList