Использовании функции find Объекта RecordSet

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
AHTOXA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 147
Зарегистрирован: 17.04.2003 (Чт) 13:38
Откуда: Россия, г. Петрозаводск

Использовании функции find Объекта RecordSet

Сообщение AHTOXA » 01.05.2003 (Чт) 15:07

Как организовать поиск по таблице:

for i = 0 to 100
rs.find(Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!)
next i

ищем пуская по двум полям, одно из них i, второе Str(i)?
Bandit

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

Сообщение alibek » 02.05.2003 (Пт) 8:42

Аргумент Find эквивалентен предложению WHERE SQL-запроса (только без "WHERE").
Но метод Find допустим не для всех типов Recordset'ов, самый подходящий для него -- Dynaset.
Lasciate ogni speranza, voi ch'entrate.

AHTOXA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 147
Зарегистрирован: 17.04.2003 (Чт) 13:38
Откуда: Россия, г. Петрозаводск

Сообщение AHTOXA » 02.05.2003 (Пт) 11:43

rs.Open "select * From MeterReadings", SQLCON, adOpenKeyset, adLockOptimistic

rs.Find Criteria:="DateReg = 1/10/01 and TimeReg = 10", Start:=0, выдает ошибку. Что здесь не так
Bandit

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 02.05.2003 (Пт) 14:14

Навскидку - может, дата вневерном формате и в кавычки не заключена? :?

AHTOXA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 147
Зарегистрирован: 17.04.2003 (Чт) 13:38
Откуда: Россия, г. Петрозаводск

Сообщение AHTOXA » 02.05.2003 (Пт) 14:20

Да вряд-ли, я пробовал по отельности и то и то работает. Пробовал задать так rs.find Criteria"(TimeReg = 8) AND (Reading = 17)",....
где Reading - числовое поле и тоже выдает ошибку, а по одному полю ищет
Bandit

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 02.05.2003 (Пт) 14:22

В описаннии написано, что "Only a single-column name may be specified in criteria. This method does not support multi-column searches."



Так что и не должен по 2 полям искать.

AHTOXA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 147
Зарегистрирован: 17.04.2003 (Чт) 13:38
Откуда: Россия, г. Петрозаводск

Сообщение AHTOXA » 02.05.2003 (Пт) 14:25

:oops: , облажался малость. Но как же мне тогда найти запись у которой два поля совпадают (rs не отсортирован)
Bandit

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 02.05.2003 (Пт) 16:24

Сделать простой open recordset'a с запросом и посмотреть пустой он или нет.

AHTOXA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 147
Зарегистрирован: 17.04.2003 (Чт) 13:38
Откуда: Россия, г. Петрозаводск

Сообщение AHTOXA » 02.05.2003 (Пт) 16:27

Дак у меня поиск то в цикле, и если я каждый раз буду открывать recordset это же страшно работу затормозит.
Bandit

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 02.05.2003 (Пт) 16:31

Ну что я могу посоветовать... Ищи по одному критерию, потом по второму и оставляй только не записи, которые попали и в первую выборку и во вторую.

AHTOXA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 147
Зарегистрирован: 17.04.2003 (Чт) 13:38
Откуда: Россия, г. Петрозаводск

Сообщение AHTOXA » 02.05.2003 (Пт) 16:35

я проще фиху придумал, только recordset должен быть отсортирован по дате времени:

Private Function FindRecDB(ByRef rs As ADODB.Recordset, _
ByRef rngRec As MeterRangesRecord) As Boolean

Dim r As Boolean
Dim srch_opt As Integer
Dim rec As String
r = False
srch_opt = 0
While Not rs.EOF And r = False
rs.Find Criteria:="DateReg = " & rngRec.DateReg, Start:=srch_opt
If Not rs.EOF Then
If rs.Fields(5) = Hour(rngRec.TimeReg) Then
r = True
End If
End If
srch_opt = 2
Wend
FindRecDB = r
End Function
Bandit

Ser-Robotiaga
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 19.01.2007 (Пт) 0:45

Re: Использовании функции find Объекта RecordSet

Сообщение Ser-Robotiaga » 31.01.2009 (Сб) 21:56

Подскажите пожалуйста как правильно использовать метод Find для ADO. В моих книжках описаны методы Find при работе с DAO. С DAO у меня прроблем не возникало. Я думал аналогично. Порылся в Object Browser. Там только Find, в то время как для DAO четыре метода от FindFirst, FindLast и т.д.

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

Re: Использовании функции find Объекта RecordSet

Сообщение alibek » 01.02.2009 (Вс) 15:42

Откуда искать и в каком направлении — задается аргументами метода. Поэтому одного Find достаточно.
Lasciate ogni speranza, voi ch'entrate.

Ser-Robotiaga
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 19.01.2007 (Пт) 0:45

Re: Использовании функции find Объекта RecordSet

Сообщение Ser-Robotiaga » 01.02.2009 (Вс) 18:40

Вот синтаксис метода.
Sub Find(Criteria As String, [SkipRecords As Long], [SearchDirection As SearchDirectionEnum = adSearchForward], [Start])
По каким правилам надо задавать Criteria ? А остальные параметры мне вообще ни о чем не говорят. Что они обозначают?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Использовании функции find Объекта RecordSet

Сообщение iGrok » 01.02.2009 (Вс) 19:25

Ser-Robotiaga писал(а):Вот синтаксис метода.
Sub Find(Criteria As String, [SkipRecords As Long], [SearchDirection As SearchDirectionEnum = adSearchForward], [Start])
По каким правилам надо задавать Criteria ? А остальные параметры мне вообще ни о чем не говорят. Что они обозначают?

Гм. Criteria описан в этом топике, начиная со второго поста. "Field_Name Operation Field_Value" (Например, "Name = 'Anonymous'", "Id > 16")
А всё остальное вроде просто.. SkipRecords - сколько записей "пропустить". Точнее, с которой по счёту начинать поиск.
SearchDirection - в какую сторону искать. Вперёд по рекордсету или назад.

http://msdn.microsoft.com/en-us/library/ms676117(VS.85).aspx
label:
cli
jmp label

Ser-Robotiaga
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 19.01.2007 (Пт) 0:45

Re: Использовании функции find Объекта RecordSet

Сообщение Ser-Robotiaga » 01.02.2009 (Вс) 21:48

iGrok писал(а):Гм. Criteria описан в этом топике, начиная со второго поста.

Я первоначально использовал Find только с критерием поиска, который успешно работал с DAO. Но у меня ничего не вышло.
И еще кое-что меня ввело в заблуждение, например двоеточие перед равно, и еще новый для меня символ &.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Использовании функции find Объекта RecordSet

Сообщение iGrok » 01.02.2009 (Вс) 23:44

Ser-Robotiaga писал(а):
iGrok писал(а):Гм. Criteria описан в этом топике, начиная со второго поста.

Я первоначально использовал Find только с критерием поиска, который успешно работал с DAO. Но у меня ничего не вышло.
И еще кое-что меня ввело в заблуждение, например двоеточие перед равно, и еще новый для меня символ &.

Ну тогда показывай, как использовал. Попробуем подсказать, почему не работает.

Двоеточие перед равно можешь спокойно пропускать, а & - это оператор конкатенации (объединения) строк.
Т.е. "строка 1" & "строка 2" = "строка 1строка 2"
label:
cli
jmp label

Ser-Robotiaga
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 19.01.2007 (Пт) 0:45

Re: Использовании функции find Объекта RecordSet

Сообщение Ser-Robotiaga » 02.02.2009 (Пн) 20:09

Я тот код не сохранил. Написал, что надо было через Execute. Но думаю, что к методу Find еще вернусь.
Знак амперсанда не узнал. Здесь на форуме он отображается не так как в среде программирования.

Ser-Robotiaga
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 19.01.2007 (Пт) 0:45

Re: Использовании функции find Объекта RecordSet

Сообщение Ser-Robotiaga » 08.02.2009 (Вс) 21:51

Вот я к нему и вернулся. Вот фрагмент кода:
strCriteriy = "cirilc ='" & DataCombo1.Text & "'"
Adodc2.Recordset.Find strCriteriy

где cirilc - поле в таблице
У меня такое ощущение, что после Adodc2.Recordset.Find strCriteriy указатель текущей записи все время установлен на первую запись. Т.е метод у меня почему-то не работает.

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

Re: Использовании функции find Объекта RecordSet

Сообщение alibek » 08.02.2009 (Вс) 23:50

Ser-Robotiaga писал(а):У меня такое ощущение, что после Adodc2.Recordset.Find strCriteriy указатель текущей записи все время установлен на первую запись. Т.е метод у меня почему-то не работает.

Конечно.
Ты ведь не указывал закладку, начиная с которой нужно осуществлять поиск.
Lasciate ogni speranza, voi ch'entrate.

Ser-Robotiaga
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 19.01.2007 (Пт) 0:45

Re: Использовании функции find Объекта RecordSet

Сообщение Ser-Robotiaga » 10.02.2009 (Вт) 21:50

Не понял, о какой закладке идет речь? Если имеется ввиду параметр SkipRecords, так он же необязательный.

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

Re: Использовании функции find Объекта RecordSet

Сообщение alibek » 10.02.2009 (Вт) 23:02

Я говорю об аргументе Start. Если он не задан, то поиск начинается с текущей записи.
Чтобы избежать глюков, скорее всего привносимых ADODC, запоминай закладку текущей позиции, а при поиске указывай ее в качестве стартовой позиции.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re:

Сообщение Andrey Fedorov » 11.02.2009 (Ср) 11:21

AHTOXA писал(а)::oops: , облажался малость. Но как же мне тогда найти запись у которой два поля совпадают (rs не отсортирован)


Хм. А почему бы Filter не использовать?

Recordset лучше при этом был клиентский - чтобы лишний раз при поиске база не дергалась...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Ser-Robotiaga
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 19.01.2007 (Пт) 0:45

Re: Использовании функции find Объекта RecordSet

Сообщение Ser-Robotiaga » 12.02.2009 (Чт) 0:04

alibek писал(а):Я говорю об аргументе Start. Если он не задан, то поиск начинается с текущей записи.
Чтобы избежать глюков, скорее всего привносимых ADODC, запоминай закладку текущей позиции, а при поиске указывай ее в качестве стартовой позиции.

Спасибо, прояснилось.
А вообще заработало без дополнительных параметров после установки CursorType=adOpenDynamic. Я чет думал, что динамич набор установлен по умолчанию
alibek писал(а):Но метод Find допустим не для всех типов Recordset'ов, самый подходящий для него -- Dynaset.

Миша-82
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 06.10.2009 (Вт) 16:10

Re: Использовании функции find Объекта RecordSet

Сообщение Миша-82 » 06.10.2009 (Вт) 16:28

а как быть и с чем работать
если нужно чтобы в listbox добавлялись записи удовлетворяющие условию из textbox-а причем совпадение может быть любым из записи?
наверно не очень понятно
на пальцах

в базе есть запись "апельсин" и др
в textbox вводим "а" или "ап" или "пель" или "син" и в listbox добвляется запись "апельсин" и другие в которых есть то же самое

пробовал и Find и Filter применить не получается

наверно не на того учился :D :(
подскажите

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

Re: Использовании функции find Объекта RecordSet

Сообщение alibek » 06.10.2009 (Вт) 20:03

Как применял Filter?
Lasciate ogni speranza, voi ch'entrate.

Миша-82
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 06.10.2009 (Вт) 16:10

Re: Использовании функции find Объекта RecordSet

Сообщение Миша-82 » 07.10.2009 (Ср) 8:25

'перед циклом указал filter
rs.Filter= "F0 и "значение" (из текстового поля) щас при себе нет точного кода, там еще куча ковычек пока не запомнил их расположения

'запускал цикл
do whil
'и добавлял значения из базы в лист бокс
list.additem rs("F0")
loop


работает, но только когда в текст боксе точное совпадение с базой



не судите строго если не прав

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

Re: Использовании функции find Объекта RecordSet

Сообщение alibek » 07.10.2009 (Ср) 8:36

Миша-82 писал(а):'перед циклом указал filter
rs.Filter= "F0 и "значение"

И что ты при этом ожидал?
Lasciate ogni speranza, voi ch'entrate.

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

Re: Использовании функции find Объекта RecordSet

Сообщение Денис » 07.10.2009 (Ср) 9:22

Извиняюсь за офтоп: Он ожидал, видимо, звон магических колокольчиков и что чудесным образом всё заработает. Я угадал?
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Миша-82
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 06.10.2009 (Вт) 16:10

Re: Использовании функции find Объекта RecordSet

Сообщение Миша-82 » 07.10.2009 (Ср) 10:37

что ожидал?

все что я написал все это путем проб и ошибок и это мое первое обращение на форум хотя примеров просмотрел уйму и то что для вас элементарно для меня и мне подобным .... :(

когда разобрался как работает filter тогда и понял что это не то

find по моему более подходит, но в методе нет как искать (полное совпадение или нет)

мне не нужен код
просто совет

След.

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

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

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

    TopList