Связь с базой данных Access через ADO

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

Связь с базой данных Access через ADO

Сообщение dima81 » 26.08.2007 (Вс) 22:58

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

rs1.Source = "Select DISTINCT НомерПоставщика From Поставки Order by НомерПоставщика "

rs1.Open

rs1.MoveFirst
Do While Not rs1.EOF
Combo1.AddItem rs1.Fields(0).Value
rs1.MoveNext
Loop
rs1.Close
Этим кодом я загрузил в Combo1 НомерПоставщика.

Private Sub Combo1_Click()
abba = CombЗавном.Text

rs1.Source = "Select Статус, " & _
" From Ремонты Where НомерИзделия = ' " & abba & " ' "
rs1.Open

rs1.MoveFirst

Combo2.Text = rs1.Fields(0)
Do While Not rs1.EOF
Combo2.AddItem rs1.Fields(0)
rs1.MoveNext
Loop

rs1.Close

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

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Сообщение MYF » 27.08.2007 (Пн) 2:09

Для начала рекомендую все rs1.Fields(0) заменить на rs1.Fields("ИмяПоля").
Вроде бы мелочь, но когда мы занимались отладкой она попортила нам много крови. Кто-то в базе/запросе пару полей передёрнул и вся система обвалилась.

По-моему, ты не точно переписал код. Особенно под конец. Проверь.

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 27.08.2007 (Пн) 8:13

вероятно ошибка возникает из-за того, что для "поставщика" не нашелся ни один статус

и кстати, зачем так заполнять комбобоксы?
не лучше присвоить им источник данных?

Код: Выделить всё
rs1.Source = "Select DISTINCT НомерПоставщика From Поставки Order by НомерПоставщика "

rs1.Open

Set Combo1.DataSource rs1



примерно так
I Have Nine Lives You Have One Only
THINK!

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

MYF, HandKot

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

Да, немного описался: вот полностью мой код:

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, либо текущая запись удалена. Для выполнения операции требуется текущая запись


Специально для HandKot:
для каждого поставщика есть свой статус (т.е. в базе данных все заполнено нормально). А на счет твоего способа заполнения комбобоксов, то очень хороший способ - приму на вооружение

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 27.08.2007 (Пн) 12:11

ошибка скорее всего здесь

Код: Выделить всё
Combo2.Text = rs1.Fields("Статус")


уберите эту строку

ЗЫЖ если ошибки не будет, то запрос про статусы у вас возвращается пустой
I Have Nine Lives You Have One Only
THINK!

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

HandKot

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

HandKot, убираю эти 2 строки

rs1.MoveFirst
Combo2.Text = rs1.Fields("Статус")

и действительно ошибка пропадает и запрос про статусы возвращается пустой. А как теперь сделать, чтобы при выборе номера поставщика в Combo1 - в Combo2 выводился бы конкретный статус, а не был бы Combo2 пустым?

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 27.08.2007 (Пн) 12:54

разумеется изменить вот этот запрос
Код: Выделить всё
rs1.Source = "Select Статус " & _
" From Поставки Where НомерПоставщика = ' " & abba & " ' "

разобратся почему он не работает если
для каждого поставщика есть свой статус (т.е. в базе данных все заполнено нормально).


если в постах у вас запрос один к одномук в проекте, то тогда уберите лишние символы "пробел" из запроса, в условии
' " & abba & " ' "

если не получится то так
Код: Выделить всё
rs1.Source = "Select Статус " & _
" From Поставки Where НомерПоставщика Like '*" & abba & "*' "


пробуйте
I Have Nine Lives You Have One Only
THINK!

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

HandKot

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

HandKot, огромное Вам спасибо. Разумеется я поменял на Код:
rs1.Source = "Select Статус " & _
" From Поставки Where НомерПоставщика = ' " & abba & " ' "

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

Еще раз ОГРОМНОЕ СПАСИБО. ПРОБЛЕМА РЕШЕНА

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

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

А вообще проблема то не стоит и гроша.
HandKot, если вы бы сразу сказали на счет пробелов, то все бы пошло и в первоначальном коде. Просто при выборе поставщика, у которого нет статуса, Combo2 был бы пустым. При выборе того поставщика, у которого есть стаутс в Combo2 выводится его статус.
Все так вроде легко, но эти пробелы :)
Еще раз СПАСИБО ВАМ

dormouse
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 140
Зарегистрирован: 10.01.2007 (Ср) 21:58
Откуда: Волжский

Сообщение dormouse » 27.08.2007 (Пн) 16:14

совет. запрос, если он очень сложный или пока ещё (зависит от опыта) не очень понятный, лучше его сделать мышкой в конструкторе запросов акцесса, переключить в режим SQL и скопипастить. если в запросе будут использоваться условия, то в конструкторе так и указать какое-то одно реальное условие, с которым запрос выдаст то, что надо. а потом найти это условие в скопированном выражении и заменить кавычки на апострофы с именем переменной и амперсандами.

а вот, когда дело доходит до выполнения этого запроса, то можно вставить в код
Код: Выделить всё
Debug.Print rs1.Source

и посмотреть в окне отладки, что же оно там делает и невооружённым глазом увидеть все пробелы и прочие ошибки
VBA, MSA97

MYF
Новичок
Новичок
Аватара пользователя
 
Сообщения: 44
Зарегистрирован: 12.05.2006 (Пт) 6:38
Откуда: Череповец

Сообщение MYF » 28.08.2007 (Вт) 21:41

И вообще, при отладке таких заморочных случаев надо чаще выводить запросы и ответы через Debug.Print или MsgBox. А если работа скрипта критична по времени - выводить лог в текстовый файл. Иногда приходится чуть ли не после каждой команды вывод делать- такие корки другой раз вылезают... И обработчики ошибок вставлять...

nApoBo3
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 30.08.2007 (Чт) 14:43

Сообщение nApoBo3 » 30.08.2007 (Чт) 20:40

Ошибка у вас была вот здесь
rs1.MoveFirst

MoveFirst выдает ошибку если рекодсет пустой ( eof ). Перед вызовом надо проверять рекордсет на eof, можно проверять на кол-во записей но не во всех случаях работает.

Для вашей задачи можно использовать TreeView, при небольшом кол-ве поставщиков очень удобно.


Вернуться в VBA

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

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

    TopList