Поиск в БД по SEEK

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

Поиск в БД по SEEK

Сообщение Rafayel » 06.12.2005 (Вт) 17:21

Добрый день всем

Возникла такая проблема...

При поиске в БД командой RECORDSOURCE.SEEK, если результат FALSE, выдает окошко с текстом No Current Record. Можно как-нибудь избавится от него? У меня работает цикл, и это окно только мешает, приходится все время ENTER жать... а записей больше 100,000... :shock:

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

Сообщение GSerg » 06.12.2005 (Вт) 17:46

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

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.12.2005 (Вт) 17:51

А ты отлавливаё окошко програмно и посылай ему SendKeys Chr(13),True

Rafayel
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 05.12.2005 (Пн) 17:20
Откуда: Armenia

Сообщение Rafayel » 06.12.2005 (Вт) 21:09

Код завтра будет, он на работе. Приблизительно выглядит так:

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

do
data2.recordsource.index="Data"
data2.recordsource.seek "=", text  ' если не находит, выводится окно с сообщением
if data2.recordsource.nomatch then <действие>
data1.recordsource.movenext        ' т.к. поле text берем из data1
loop


А SendKey... представляешь сколько времени займет обработка базы объемом 200,000-300,000 записей? :shock:

[/syntax]
Последний раз редактировалось Rafayel 07.12.2005 (Ср) 9:39, всего редактировалось 1 раз.

CORBA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 22.11.2003 (Сб) 13:41
Откуда: Ukraine-Crimea-Feodosia

Сообщение CORBA » 07.12.2005 (Ср) 1:55

я ещё не пробывал но вроде как метод find у recordset'a есть, может лучше его использовать
У каждой сложной задачи есть множество простых для понимания, но неправильных решений.

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

Сообщение alibek » 07.12.2005 (Ср) 8:37

Seek не везде работает.
Во-первых, он работает только для индексированных полей.
Во-вторых, в DAO он применим только к рекордсетам, открытым как dbOpenTable, в Jet.
В-третьих, в ADO он применим только для файлов Access MDB, в рекордсетах, открытых как adCmdTableDirect.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 07.12.2005 (Ср) 8:39

И в четвертых, после выполнения Seek полагается проверять, была ли найдена запись. В DAO для этого есть свойство NoMatch, в ADO специального свойства нет, надо смотреть параметры поиска (направление) и проверять на BOF/EOF.
Lasciate ogni speranza, voi ch'entrate.

Rafayel
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 05.12.2005 (Пн) 17:20
Откуда: Armenia

Сообщение Rafayel » 07.12.2005 (Ср) 9:06

alibek, У меня как раз он прекрасно работает, вопрос не в этом. И NoMatch проверяю, и индексация есть, на коде ведь видно! Просто при отрицательном результате поиска выводится окно с сообщением, что запись не найдена. Вот от этой окошки хочу избавится!!!

Bonjo
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 07.12.2005 (Ср) 11:18

походу это либо опция драйвера либо просто глюк.

Сообщение Bonjo » 07.12.2005 (Ср) 11:30

Rafayel писал(а):alibek, У меня как раз он прекрасно работает, вопрос не в этом. И NoMatch проверяю, и индексация есть, на коде ведь видно! Просто при отрицательном результате поиска выводится окно с сообщением, что запись не найдена. Вот от этой окошки хочу избавится!!!


Предлагаю отказацца от Seek и перейти на SQL.
у тебя же два набора данных: Data1 и Data2

вот и сделай выборку:

SELECT
d2.*
FROM
Data1 d1,
Data2 d2
where
d1.Text = d2.Text

думаю это будет работать гораздо быстрее чем цикл по записям. тем более ты говоришь что у тебя поля индексированы.

Rafayel
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 05.12.2005 (Пн) 17:20
Откуда: Armenia

Re: походу это либо опция драйвера либо просто глюк.

Сообщение Rafayel » 07.12.2005 (Ср) 12:07

Bonjo писал(а):Предлагаю отказацца от Seek и перейти на SQL.
у тебя же два набора данных: Data1 и Data2

вот и сделай выборку:

SELECT
d2.*
FROM
Data1 d1,
Data2 d2
where
d1.Text = d2.Text

думаю это будет работать гораздо быстрее чем цикл по записям. тем более ты говоришь что у тебя поля индексированы.


:shock: SQL не знаю, к сожалению... а твой код (переделанный по логике) не сработал

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

Сообщение alibek » 07.12.2005 (Ср) 12:14

Он и не сработает, он был для примера.
Реальный запрос будет зависеть от того, какие у тебя таблицы и поля.
Тебе просто предлагают не проходится в цикле по набору данных, отбирая те, которые соответствуют нужному критерию (дате), а сразу отобрать только те данные, которые нужны.
Lasciate ogni speranza, voi ch'entrate.

Rafayel
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 05.12.2005 (Пн) 17:20
Откуда: Armenia

Сообщение Rafayel » 07.12.2005 (Ср) 16:55

alibek писал(а):Он и не сработает, он был для примера.
Реальный запрос будет зависеть от того, какие у тебя таблицы и поля.


Ну я это понял :lol: и если правильно разобрался, то запрос должен выглядеть так:

SELECT ALL FROM <DatabaseName> <TableName> WHERE <Record>=<MyText>.

Так?

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 07.12.2005 (Ср) 17:04

нет

Код: Выделить всё
SELECT [Alias].[FieldName], [Alias].[FieldName] ...
FROM [TableName] AS [Alias]
WHERE [FieldName] = 'insert your text here'


в самом простом случае

Bonjo
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 07.12.2005 (Ср) 11:18

Re: походу это либо опция драйвера либо просто глюк.

Сообщение Bonjo » 07.12.2005 (Ср) 17:39

SQL не знаю, к сожалению... а твой код (переделанный по логике) не сработал


эт ниче.
возьми аксес - раз уж с ним работаешь.
там есть мастер создания запросов и конструктор создания запросов.
попробуй при помощи них создать. Это совсем не сложно.
А когда сделаешь запрос - посмотри его SQL код (он его автоматически формирует) - так быстрее разберешься.
Вообще при работе с БД лучше начинать изучение с SQL потому что языков программирования много всяких разных, в SQL всегда один и тот же (почти).


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

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

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot], Yandex-бот и гости: 200

    TopList  
cron