powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Поиск записи
13 сообщений из 13, страница 1 из 1
Поиск записи
    #33339381
K_Maria
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxPro 6.0 Моя форма содержит всякие "text box"-ы, "combo box"-ы, вобщем я там созада кнопочку "Поиск"
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT katalog
LOCATE FOR katalog.name=ALLTRIM(thisform.zakladka1.page2.txtname.value)
if !Found()
   messagebox('Запись не найдена')
endif 
thisform.refresh
refresh просто вставляет значения из текущей записи в форму. Проблема в том, что у меня вроде запись находит, если текст входит в начало katalog.name, к тому же учытывает регистры, и вообще при повторном поиске, он ищет не от текущей записи, а с начала файла, а мне нужно чтобы поиск находил вхождение текста в любом месте (в середине, конце) без учета регистра, чтобы искал начинаяя с текущей записи, пробовала
Код: plaintext
1.
2.
3.
select katalog
seek(alltrim(thisform.zakladka1.page2.txtname.value))
thisform.refresh
но по всей видимости я не знаю орфографию чтоли...
...
Рейтинг: 0 / 0
Поиск записи
    #33339397
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K_MariaFoxPro 6.0 Моя форма содержит всякие "text box"-ы, "combo box"-ы, вобщем я там созада кнопочку "Поиск"
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT katalog
LOCATE FOR katalog.name=ALLTRIM(thisform.zakladka1.page2.txtname.value)
if !Found()
   messagebox('Запись не найдена')
endif 
thisform.refresh
refresh просто вставляет значения из текущей записи в форму. Проблема в том, что у меня вроде запись находит, если текст входит в начало katalog.name, к тому же учытывает регистры, и вообще при повторном поиске, он ищет не от текущей записи, а с начала файла, а мне нужно чтобы поиск находил вхождение текста в любом месте (в середине, конце) без учета регистра, чтобы искал начинаяя с текущей записи, пробовала
Код: plaintext
1.
2.
3.
select katalog
seek(alltrim(thisform.zakladka1.page2.txtname.value))
thisform.refresh
но по всей видимости я не знаю орфографию чтоли...
Ну что же... Начнем обучение орфографии. Урок первый
1. Команда LOCATE ищет от начала до конца файла. Для того, чтобы найти последовательно все вхождения искомого значения, необходимо продолжить поиск командой CONTINUЕ.
Т.е. имеем примерно такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT katalog
LOCATE FOR katalog.name=ALLTRIM(thisform.zakladka1.page2.txtname.value)
if !Found()
   messagebox('Запись не найдена')
endif 
thisform.refresh
...
CONTINUE && Продолжаем поиск с теми же параметрами
2. Чтобы начать поиск от текущего положения в таблице необходимо использовать ключевое слово REST.
Т.е.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT katalog
LOCATE REST FOR katalog.name=ALLTRIM(thisform.zakladka1.page2.txtname.value)
if !Found()
   messagebox('Запись не найдена')
endif 
thisform.refresh
...
3. Чтобы искать запись при помощи SEEK необходимо иметь индекс по условию поиска. (Он может быть и неактивным в данный момент).
Т.е.
Код: plaintext
1.
2.
3.
select katalog
seek(alltrim(thisform.zakladka1.page2.txtname.value)) && у таблицы Katalog должен быть индекс по полю name
thisform.refresh
4. Чтобы искать значение вне зависимости от регистра букв необходимо привести их все к одному регистру (см. функции UPPER() или LOWER()). Т.е.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT katalog
LOCATE FOR upper(katalog.name)=upper(ALLTRIM(thisform.zakladka1.page2.txtname.value))
if !Found()
   messagebox('Запись не найдена')
endif 
thisform.refresh
...
...
Рейтинг: 0 / 0
Поиск записи
    #33339407
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав C.
3. Чтобы искать запись при помощи SEEK необходимо иметь индекс по условию поиска. (Он может быть и неактивным в данный момент).
Т.е.
Код: plaintext
1.
2.
3.
select katalog
seek(alltrim(thisform.zakladka1.page2.txtname.value)) && у таблицы Katalog должен быть индекс по полю name
thisform.refresh

Поправка. Индекс должен быть активным (!)...
Т.е.
Код: plaintext
1.
2.
3.
4.
select katalog && у таблицы Katalog должен быть индекс по полю name
set order to ... && Делаем активным индекс по полю name
seek(alltrim(thisform.zakladka1.page2.txtname.value)) 
thisform.refresh
...
Рейтинг: 0 / 0
Поиск записи
    #33339450
Samvel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав C.
Поправка. Индекс должен быть активным (!)...

Не обязательно! Для этого в команде seek есть допольнительные параметры:
Код: plaintext
1.
2.
SEEK(eExpression [, nWorkArea | cTableAlias
   [, nIndexNumber | cIDXIndexFileName | cTagName]])

Всеравно seek всегда находит первую запись, в данном случае locate предпочительнее.
...
Рейтинг: 0 / 0
Поиск записи
    #33339544
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Samvel
Всеравно seek всегда находит первую запись, в данном случае locate предпочительнее.
Так ведь у нас индекс!
Тогда имеем следующий алгоритм:
Находим первую запись.
По skip переходим на следующую (по индексу!) запись.

Таким образом, если записей с одинаковым индексным выражением несколько, то последовательными skip'ами (или в цикле scan - endscan) их все можно пройти...
...
Рейтинг: 0 / 0
Поиск записи
    #33339575
K_Maria
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо вам, у меня вроде получилось, skip использовала, но я так подумала, что неудобно в использовании такой вариант, т.к. thisform.txtName надо постоянно затирать и вводить свой текст, теперь решила при нажатии кнопки запустиь форму poisk, где будет грид, отображающий все записи, отвечающие критерию. Но у меня опять ничего не получается, забиваю данные в cursor, а потом как заполнить этот грид?
...
Рейтинг: 0 / 0
Поиск записи
    #33339686
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K_Mariaспасибо вам, у меня вроде получилось, skip использовала, но я так подумала, что неудобно в использовании такой вариант, т.к. thisform.txtName надо постоянно затирать и вводить свой текст, теперь решила при нажатии кнопки запустиь форму poisk, где будет грид, отображающий все записи, отвечающие критерию. Но у меня опять ничего не получается, забиваю данные в cursor, а потом как заполнить этот грид?
Select-SQL спасет Вас от головной боли... А затем (после получения курсора) все делается так же, как и при использовании таблицы...
...
Рейтинг: 0 / 0
Поиск записи
    #33339739
K_Maria
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не использую SQL, пока для меня это слишком сложно, а вообще как бы в плане есть. Я сейчас сделала так, есить кнопка "поиск"
Код: plaintext
1.
do form poisk
и там тоже есть кнопка поиск
Код: plaintext
1.
2.
text_poisk=alltrim(thisform.text1.value)
do form prosm_res
там в data environment есть таблица katalog, в properties-> filter стоит upper(text_poisk)$upper(katalog.name). Дак при запуске этой формы у меня вся программа закрывается, где у меня ошибка могет быть
...
Рейтинг: 0 / 0
Поиск записи
    #33339786
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K_MariaЯ не использую SQL, пока для меня это слишком сложно, а вообще как бы в плане есть. Я сейчас сделала так, есить кнопка "поиск"
Код: plaintext
1.
do form poisk
и там тоже есть кнопка поиск
Код: plaintext
1.
2.
text_poisk=alltrim(thisform.text1.value)
do form prosm_res
там в data environment есть таблица katalog, в properties-> filter стоит upper(text_poisk)$upper(katalog.name). Дак при запуске этой формы у меня вся программа закрывается, где у меня ошибка могет быть
1. Если Вы пишете в 6-м Фоксе, то надо обязательно (!) учить SQL - избавитесь от многих проблем в будущем. И легче будет осваивать SQL Server, Oracle, MySQL и т.д.
2. Фильтрация записей работает относительно "хорошо" (невидимо для пользователя) для небольших наборов данных (до 100-1000 записей). Дальше - начинаются жуткие тормоза, когда надо сидеть и гадать - зависла твоя программа или еще нет
3. По теме: при использовании переменной text_poisk в таком контексте она должна иметь глобальную область видимости (т.е. обязательно (!) должна быть объявлена как public !)
4. Может быть, где-то в форме prosm_res встречается команда clear events?
...
Рейтинг: 0 / 0
Поиск записи
    #33339872
K_Maria
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав еще раз спасибо, в основной программе объявила переменную text_poisk , всё чики-пуки, и еще неплохо было бы освоить Ваш совет, но знаете многие вещи до меня туго доходят, вот вроде и Лису учу уже как 2 месяца, и проблемы совсем пустяковые самостоятельно не могу решить, хорошо, что есть форум.
...
Рейтинг: 0 / 0
Поиск записи
    #33340571
gotko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT katalog
str_fltr=upper(alltrim(thisform.zakladka1.page2.txtname.value))
set filter to str_fltr$upper(alltrim(katalog.name))
thisform.refresh

НО :
1. оператор Upper на некоторых русских символах работает некорректно
2. неоптимизируется, хотя работает довольно быстро...
...
Рейтинг: 0 / 0
Поиск записи
    #33340651
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gotko1. оператор Upper на некоторых русских символах работает некорректно
Зависит от версии FoxPro, кодовой страницы файла DBF и факт наличия CONFIG.FPW со строкой CODEPAGE=...

Т.е. это не ошибка собственно функции UPPER(), а конфликт использования нескольких кодовых страниц.
...
Рейтинг: 0 / 0
Поиск записи
    #33347751
GrayFox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Posmotri tut : http://www.foxclub.ru/sol/index.php?kat=1&act=list
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Поиск записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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