Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Locate в цикле правильно ли это ? / 25 сообщений из 33, страница 1 из 2
25.03.2005, 14:17
    #32980892
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
Задача :
поиск в поле таблицы определннного значения
Пример: Москва.ИнтерТур-искомое значение
Москва.ИнтерСвязь - самое похожее в таблице, соотв. Москва.ИнтерТур нет в таблице
обычный локейт не найдет

написал такой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
cl_field_org="f1"
nl_Ipoz= 0 
bl_Found=.t.
DO WHILE bl_Found AND nl_Ipoz<Len(c_Find)+ 1 
	nl_Ipoz=nl_Ipoz+ 1  
	SELECT org
	LOCATE FOR LEFT(ALLTRIM(org.&cl_field_org),nl_Ipoz)==LEFT(ALLTRIM(c_Find),nl_Ipoz)
	bl_Found=FOUND()
ENDDO 
SELECT org
LOCATE FOR LEFT(ALLTRIM(org.&cl_field_org),nl_Ipoz- 1 )==LEFT(ALLTRIM(c_Find),nl_Ipoz- 1 )
thisform.Refresh

Т.е. в цикле ищется похожее отсекая по букве, недостаток такого алгоритма в том что при большой таблице и большой переменной c_Find он может притормаживать.
Есть ли вариант лучше?
Может быть кто то сталкивался с подобной задачей?

______________________________________
с уважением: Strong
...
Рейтинг: 0 / 0
25.03.2005, 14:25
    #32980938
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
MyString=ИнтерСвязь
select * from table1 into curs qq1 where nam$Mystring
brow normal
...
Рейтинг: 0 / 0
25.03.2005, 14:26
    #32980943
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
MyString="ИнтерСвязь"
select * from table1 into curs qq1 where nam$Mystring
brow normal
...
Рейтинг: 0 / 0
25.03.2005, 14:30
    #32980962
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
MyString="Москва.Интер"
select t1
locate for nam$nam$Mystring
do while !eof()
messagebox(nam)
continue
enddo
...
Рейтинг: 0 / 0
25.03.2005, 14:31
    #32980967
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
MyString="Москва.Интер"
select t1
locate for nam$Mystring do while !eof()
messagebox(nam)
continue
enddo
...
Рейтинг: 0 / 0
25.03.2005, 14:34
    #32980980
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
leafMyString="Москва.Интер"
select t1
locate for nam$Mystring do while !eof()
messagebox(nam)
continue
enddo

Хех А как узнать где Москва.Интер а где Москва. и дальше что то другое?
MyString="Москва.Интер" - не пойдет
...
Рейтинг: 0 / 0
25.03.2005, 14:40
    #32980998
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
Наверно я плохо обьяснил надо найти строку значение которой максимально близко к искомому значению

______________________________________
с уважением: Strong
...
Рейтинг: 0 / 0
25.03.2005, 14:48
    #32981024
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
MyString="Москва.ИнтерТур"
nn=len(MyString)
select t1
locate for alltrim(nam)$left(MyString,nn)
do while !found() and nn>1
nn=nn-1
locate for alltrim(nam)$left(MyString,nn)
enddo
...
Рейтинг: 0 / 0
25.03.2005, 14:51
    #32981038
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
Строится индекс по интересующему полю (в данном случае по полю F1), а далее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SET NEAR ON
SELECT MyTable
SET ORDER TO F1
IF SEEK("Москва.ИнтерТур")
* Есть такая запись
ELSE
* Указатель встал на запись ближайшую к искомой
ENDIF
...
Рейтинг: 0 / 0
25.03.2005, 14:52
    #32981042
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
leafMyString="Москва.ИнтерТур"
nn=len(MyString)
select t1
locate for alltrim(nam)$left(MyString,nn)
do while !found() and nn>1
nn=nn-1
locate for alltrim(nam)$left(MyString,nn)
enddo


Так это тоже самое что я предложил.
leaf вы читали что я написал то?
...
Рейтинг: 0 / 0
25.03.2005, 14:55
    #32981050
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
ВладимирМСтроится индекс по интересующему полю (в данном случае по полю F1), а далее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SET NEAR ON
SELECT MyTable
SET ORDER TO F1
IF SEEK("Москва.ИнтерТур")
* Есть такая запись
ELSE
* Указатель встал на запись ближайшую к искомой
ENDIF


" Если поиск завершился неудачно, SEEK( ) возвращает "ложь" (.F.) и указатель записи устанавливается в конец файла."

Так что толку от :
ELSE
* Указатель встал на запись ближайшую к искомой
ENDIF
...
Рейтинг: 0 / 0
25.03.2005, 14:59
    #32981064
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
set near off
при индексе не обязательно делть каждый раз поиск по всей таблице моно сканировать таблицу от скажем например от "М" до "Н"
...
Рейтинг: 0 / 0
25.03.2005, 15:03
    #32981083
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
Возможно эту задачу поможет решить metla.vcx с сайта Михаила Дроздова
...
Рейтинг: 0 / 0
25.03.2005, 15:05
    #32981096
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
" Если поиск завершился неудачно, SEEK( ) возвращает "ложь" (.F.) и указатель записи устанавливается в конец файла."

Был неправ , виноват
SET NEAR ON
хелп почитал
А есть еще RECNO(0) воспользуюсь лучше ей
...
Рейтинг: 0 / 0
25.03.2005, 15:10
    #32981115
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
RECNO(0)
а как вы хотите использовать это?
ИМХО всегда ноль или нет
...
Рейтинг: 0 / 0
25.03.2005, 15:18
    #32981150
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
"Функция SEEK( ) возвращает логическое значение, указывающее, насколько успешным был поиск."
"При выдаче функции RECNO( ) с аргументом 0 в случае неудачного поиска возвращается номер наиболее подходящей записи, независимо от установки SET NEAR."

______________________________________
с уважением: Strong
...
Рейтинг: 0 / 0
25.03.2005, 15:36
    #32981215
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
Не.. ребята, решение в лоб без сканирования не пройдет, все предложенные решения подразумевают, что начало слова совпадает с началом искомого выражения, а здесь я так понял нужен аналог полнотекстового поиска.
По повду алгоритма, наверное нужно отсекать символы справа и затем искать $, и потом надо бы не Locate использовать, а Select, что бы предоставить все вхождения, поскольку МоскваИнтер может быть несколько.
...
Рейтинг: 0 / 0
25.03.2005, 15:49
    #32981259
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
вариант с выборкой в курсор и последующей обработкой был отброшен автором
да и он уже нашел решение
...
Рейтинг: 0 / 0
25.03.2005, 16:30
    #32981379
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
PaulWistНе.. ребята, решение в лоб без сканирования не пройдет, все предложенные решения подразумевают, что начало слова совпадает с началом искомого выражения, а здесь я так понял нужен аналог полнотекстового поиска.


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

---------------------------
Но вообще и насчет полнотекстового поиска очень интересно как без цикла сделать.
но
PaulWist
По повду алгоритма, наверное нужно отсекать символы справа и затем искать $, и потом надо бы не Locate использовать, а Select, что бы предоставить все вхождения, поскольку МоскваИнтер может быть несколько.


ту опять предлагают цикл зависящий от длины переменной, хочется как то изящней
...
Рейтинг: 0 / 0
25.03.2005, 16:40
    #32981418
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
авторВ данном случае меня устроит совпадение начала слова с началом искомого выражения.

А если таких совпадений будет 100, то Locate найдет только первое, и что показать пользователю - первое совпадение или 10-ое или все?

авторНо вообще и насчет полнотекстового поиска очень интересно как без цикла сделать.

Вот здесь есть , на мой взгляд очень достойное решение
http://www.foxclub.ru/sol/index.php?act=view&id=443
...
Рейтинг: 0 / 0
26.03.2005, 16:57
    #32982399
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
Hi PaulWist!

> А если таких совпадений будет 100, то Locate найдет только первое, и что показать пользователю - первое совпадение или 10-ое или все?

Если активен нужный индексный тег (а причин обратному я не вижу), то достаточно показать курсор в grid/browse - соответственно будут видны ВСЕ более менее подходящие записи (по началу слова поиска конечно).

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
28.03.2005, 08:48
    #32983178
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
Igor Korolyov

Igor Korolyov> А если таких совпадений будет 100, то Locate найдет только первое, и что показать пользователю - первое совпадение или 10-ое или все?

Если активен нужный индексный тег (а причин обратному я не вижу), то достаточно показать курсор в grid/browse - соответственно будут видны ВСЕ более менее подходящие записи (по началу слова поиска конечно).

Игорь, ну так для этого и задавался вопрос, что бы человек попробовал на него ответить и в конце концов понял, какое надо принять решение.
...
Рейтинг: 0 / 0
28.03.2005, 09:34
    #32983214
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
Вообще вариант с SEEk не подходит
Поиск должен вестись не по индексируемому полю. И проиндексировать его не могу. Т. к. система не моя. Могу сделать выборку в курсор сделать с ним все что захочу, найти в нем, а затем перескочить на необходимую запись.
Но как то слишком замудрено не будет ли медленнее чем несколько локейтов?

______________________________________
с уважением: Strong
...
Рейтинг: 0 / 0
28.03.2005, 09:48
    #32983233
Strong
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
StrongВообще вариант с SEEk не подходит
Поиск должен вестись не по индексируемому полю. И проиндексировать его не могу.


т.е. поле то индексируемое (в таблице) и представление упорядочено по нему но как мне этим воспользоватся не знаю.
...
Рейтинг: 0 / 0
28.03.2005, 10:06
    #32983256
Andrey Ts
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Locate в цикле правильно ли это ?
Strong StrongВообще вариант с SEEk не подходит
Поиск должен вестись не по индексируемому полю. И проиндексировать его не могу.


т.е. поле то индексируемое (в таблице) и представление упорядочено по нему но как мне этим воспользоватся не знаю.
Индексировать представление по тому же полю (после открытия) и потом делать все вышесказанное.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Locate в цикле правильно ли это ? / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]