powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Поиск в memo
9 сообщений из 9, страница 1 из 1
Поиск в memo
    #35028580
KostyaMAX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в поле типа text(на форме) вводятся различные слова через пробелы...
нужно сделать выборку записей, в которых все введенные слова есть в memo-поле...
слова необязательно должны идти друг за другом...
как это сделать?
...
Рейтинг: 0 / 0
Поиск в memo
    #35028665
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про функцию LIKE() почитай
...
Рейтинг: 0 / 0
Поиск в memo
    #35028689
KostyaMAX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
думаю like тут неподойдет т.к. должно быть примерно так:
select ... where <первое слово> $ <поле memo> and <второе слово> $ <поле memo> and ...
однако кол-во слов неограничено... если можно сделать с помощью like, то обьясните как...
...
Рейтинг: 0 / 0
Поиск в memo
    #35028730
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда про макроподстановку прочитай и формируй команду динамически.
...
Рейтинг: 0 / 0
Поиск в memo
    #35028754
KostyaMAX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DagТогда про макроподстановку прочитай и формируй команду динамически.
да нет... у меня и так макроподстановка... мне нужен сам алгоритм поиска...
т.е. разбиение строки на слова(мб можно и без разбиения), и выборку записей, memo которых содержит все эти слова...
мб сформировать массив и использовать do each? только вот как это связвть с самим запросом... буду думать...
...
Рейтинг: 0 / 0
Поиск в memo
    #35028943
KostyaMAX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
никто не отвечает... видимо придется пояснить все вышесказанное на примере...
thisform.list1.RowSource='SELECT m ... WHERE "'+ALLTRIM(thisform.text1.Value)+'" $ m'
вот так у меня сейчас... но нужно чтобы порядок слов в text1 неимел значения и любое из слов могло бы находится в любом месте memo поля
...
Рейтинг: 0 / 0
Поиск в memo
    #35029047
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KostyaMAXникто не отвечает...
Думашь много народу в форуме в воскресенье вечером?

KostyaMAX... но нужно чтобы порядок слов в text1 неимел значения и любое из слов могло бы находится в любом месте memo поля Тогда ты решение уже сам написал:
KostyaMAXselect ... where <первое слово> $ <поле memo> and <второе слово> $ <поле memo> and ...
однако кол-во слов неограничено... если можно сделать с помощью like, то обьясните как...
Код условия надо сформировать в строку и использовать макроподстановку:
Код: plaintext
1.
lcFilter = '<первое слово> $ <поле memo> and <второе слово> $ <поле memo> and ...'
select ... where &lcFilter

С помошью LIKE() возможно только если порядок слов в мемо совпадает с порядком в строке:
Код: plaintext
LIKE('*' + chrtran(<строка со словами>, ' ', '*') + '*', memo)

KostyaMAX... у меня и так макроподстановка... мне нужен сам алгоритм поиска...
По скорости работы твоя макроподстановка и LIKE() примерно одинаковы. Любой способ разбора мемо перед выполнением запроса будет еще медленее.
Если надо алгоритм для ускорения выборки, то необходима какая-то предобработка при сохранении мемо-поля, а это зависит от того как часто оно меняется, как наполняется.

Например можно создать таблицу со словами и таблицу со ссылками на мемо где они встречаются. В таблице уже можно будет индексный поиск использовать. Затем делать выборку по наиболее редкому слову и т.д.
Тут все зависит от нюансов конкретно твоей задачи. Универсального алгоритма нет.
...
Рейтинг: 0 / 0
Поиск в memo
    #35029261
MiklS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если оформить через SCAN ... ENDSCAN
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
LOCAL lReturn
FOR i= 1  TO GETWORDCOUNT(ThisForm.Text1.Value)
    IF UPPER(GETWORDNUM(ThisForm.Text1.Value, i)) $ UPPER(Table.memo)
        lReturn=.T.
    ELSE
        lReturn=.F.
        EXIT
    ENDIF
ENDFOR
IF lReturn
     *** Нашли такую запись
ENDIF
Для таблиц до 100.000 записей будет работать быстро, ну а дальше нужно посмотреть
...
Рейтинг: 0 / 0
Поиск в memo
    #35030991
KostyaMAX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T спасибо...
получилось вот что:
Код: plaintext
1.
2.
3.
4.
5.
6.
...
ALINES(a,ALLTRIM(thisform.text1.Value)," ")
lcFilter=""
FOR EACH temp IN a
lcFilter =lcFilter + ' AND "' + a+'" $ post'
ENDFOR
...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Поиск в memo
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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