Проблема с поиском в ADO

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

Проблема с поиском в ADO

Сообщение dima81 » 09.09.2007 (Вс) 18:05

Есть код в VB6 (ищу записи в Access через ADO):

Код: Выделить всё
Private Sub CmdНайти_Click()
Dim str As String
CombМодели.Clear
TextПоиск.SetFocus
str = TextПоиск.Text
rs1.Open "Select НомерИзделия, МодельИзделия"
From Изделия Where МодельИзделия Like '" & str & "%'"
rs1.MoveFirst
TextНомер.Text = rs1.Fields("НомерИзделия")
CombМодели.Text = rs1.Fields("МодельИзделия")
Do While Not rs1.EOF
CombМодели.AddItem rs1.Fields("МодельИзделия")
rs1.MoveNext
Loop
rs1.Close
End Sub


Поиск осуществляется корректно. Но есть проблема: если я ввожу часть имени МоделиИзделия, которого нет в базе данных, выдается ошибка:

BOF или EOF имеет значение True, либо текущая запись удалена. Для выполняемой операции требуется текущая запись

Так как нечего выводить в CombМодели (нет текущей записи)

Можно это как-то решить: например, если нет таких записей, то просто выдавалась первая запись или просто делалось бы Exit Sub (т.е. нечего бы не происходило)

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

Сообщение MYF » 09.09.2007 (Вс) 20:27

dima81
Начать следовало с трассировки, чтобы выяснить в какой строке косяк?
Насколько я понял обваливается на строке
Код: Выделить всё
rs1.MoveFirst
Нельзя выполнять MoveFirst с пустым RecordSet.
Надо сразу после rs1.Open вставить проверку типа
Код: Выделить всё
If rs1.EOF and rs1.BOF then...
А дальше - на твой вкус...
Что значит "если нет таких записей, то просто выдавалась первая запись"? Если записей нет, то их нет ни первых ни последних. Чтобы были - надо добавить (Add).

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

MYF

Сообщение dima81 » 09.09.2007 (Вс) 20:41

MYF, ты наверное не понял. Я имел в виду, что, если в базе данных не найдена запись при поиске, то просто бы ничего не происходило, а не выскакивала бы ошибка.
Например, в базе данных есть запись МодельИзделия Bolt и все. В поиске я ввожу Vint. Так как такой записи нет, выскакивает ошибка.

Может есть какой-то метод в SQL-запросе наподобие NoMatch

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Re: Проблема с поиском в ADO

Сообщение VVitafresh » 09.09.2007 (Вс) 22:05

MYF тебе все правильно сказал. Может так чуть понятнее будет:
Код: Выделить всё
rs1.Open ...
If rs1.BOF And rs1.EOF Then Exit Sub
rs1.MoveFirst
.....
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

gjghjc
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 659
Зарегистрирован: 13.10.2002 (Вс) 8:28
Откуда: БАЛАКЛАВА!!

Сообщение gjghjc » 09.09.2007 (Вс) 22:50

а с матюком так

Код: Выделить всё
rs1.Open ...
If rs1.BOF And rs1.EOF Then Msgbox "Ничего не найдено": Exit Sub
rs1.MoveFirst


А то если ничего не произойдет в результате запроса, то пользователь может обидеться и не понять, что ввел некорректные данные. :)
Утро добрым не бывает!

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

Сообщение MYF » 10.09.2007 (Пн) 6:40

Действительно, наверное, я не очень понятно написал.
В базе данных записей может быть сколько угодно. Но в данном случае, dima81, ты работаешь с RecordSet (rs1), который является выборкой из бызы, отфильтрованной по условию. Поэтому в rs1 может не оказаться ни одной записи. Т.е. его начало (BOF) и конец (EOF) совпадают, а MoveFirst не имеет смысла.
Всёж таки вариант, предложенный gjghjc, я обычно использую только на этапе отладки. В готовых проектах предпочитаю, например, подкрасить красным поле, из-за которого возникает "неудобная ситуация". Или добавиль информационное поле... MsgBox обычно пугает или сбивает с толку "глупых тётенек", да и тыкать лишний раз мышкой туда-сюда не всегда удобно.

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

Сообщение dima81 » 10.09.2007 (Пн) 13:54

VVitafresh, MYF, gjghjc все правильно пишите только нужны поправки:

Код: Выделить всё
rs1.Open ...

If rs1.BOF Or rs1.EOF Then
MsgBox "Ничего не найдено. Возвращается первая запись": Form_Load
Else
rs1.MoveFirst
...
rs1.Close
End If


В Form_Load у меня заносятся данные в ComBoxсы и TextBoxсы из базы данных.

Exit Sub тут не работает. И если не написать Form_Load, то при повторном поиске записи, будет выскакивать ошибка:

Операция не допускается, если объект открыт

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 10.09.2007 (Пн) 18:37

dima81 писал(а):
Код: Выделить всё
If rs1.BOF Or rs1.EOF Then
MsgBox "Ничего не найдено. Возвращается первая запись": Form_Load
...

dima81, похоже, ты не хочешь вникать в смысл написанного.

Если ничего не найдено, то и никакой первой записи быть не может в принципе. Вот и спроектируй свое приложение исходя из этого. Всё, что для этого нужно тебе уже известно.

Кроме того, правильно rs1.BOF AND rs1.EOF
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

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

Сообщение dima81 » 10.09.2007 (Пн) 21:38

VVitafresh, у меня в Form_Load написан код, что при загрузке приложения появляется первая запись из базы данных. Поэтому, если записи не найдены, то выскакивает MsgBox и выполняется загрузка Form_Load, т.е. появляется первая запись


Вернуться в VBA

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

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

    TopList