powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / форма поиска
19 сообщений из 19, страница 1 из 1
форма поиска
    #38817803
fatimaaaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В Visual FoxPro, я сделал Grid , которая содержит 20 слов. В 5 слов из 20 слов, два первых буквы, начинают "Ан". Я хочу сделать кнопку "поиск", что каждый раз, когда я написал две первые буквы (например, "An"), в Text box написал 5 слов (которых два первая буква, начинают "Ан") Что мне делать?
...
Рейтинг: 0 / 0
форма поиска
    #38817980
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак не сделать. Тексбокс выводит одно поле таблицы или одно значение.
Для вывода значений поиска удобно использовать грид.
В тексбокс поиска в кипасс прописать запрос, который данные скидывает в курсор, который необходимо каждый раз отвязывать и подвязать к гриду.
Но такой подход по моему мнению очень ресурсоемкий и не нужный.
К примеру:
я пользователь и хочу найти клиента "Аниськин"
начинаю набирать "А" - комп показывает мне все фамилии на "А"
потом "н" - комп отображает мне все фамилии начинающиеся на "Ан"
затем я опечатывась и пропечатываю "м" - мне показывается пустой грид
затем я стираю букввву "м" и мне опять показваются фамилии на "Ан".
При этом подтормаживая при каждом поиске, который идет после каждой нажатой клавишы. Зачем оно нужно? Я и так знаю, что мне нужно, зачем мне нужны лишние тормоза при поиске и лишние запросы?

По моему, лучше сделать отдельную кнопку поиск. В кипасс каждого тексбокса прописать, что если была нажата клавиша ентер, то отработать метод клик в кнопке поиск. Ну и не забывать сделать возможность в поиске с замещением символа и оговорить это с пользователем некими подсказками, инструкциями. Т.е. если я набираю "Синиц_н" то мне выводится фамилии "Синицын" и "Синицин".
...
Рейтинг: 0 / 0
форма поиска
    #38818318
fatimaaaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GoshaS,Здравствуйте!
спасибо за информация

Если я хочу,Как что вы сказали, делать что мне нода делать? какой код должен писать?
...
Рейтинг: 0 / 0
форма поиска
    #38818548
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько вы знаете VFP? Сможете создать таблицу, заполнить ее данными, создать форму, на ней три текстбокса, кнопку и грид?
...
Рейтинг: 0 / 0
форма поиска
    #38818852
fatimaaaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GoshaS,
Да, я знаю, все, что вы сказали,но кодирование плохо знаю
...
Рейтинг: 0 / 0
форма поиска
    #38819144
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в стартовый файл, где все настройки добавим строку
Код: sql
1.
SET TEXTMERGE ON &&для TEXT ... ENDTEXT 


Создим таблицу
Код: sql
1.
CREATE  TABLE tClient (idClient i autoinc, f_name c(60), i_name c(60), o_name c(60), date_rozh d)


создадим форму и нарисуем на ней грид с четырмся столбцами, внизу три текстбокса и одну кнопку, во всех textbox в событиях KeyPress добавить код:
Код: sql
1.
2.
3.
4.
IF LASTKEY()=13
	thisform.Command1.Click()
	NODEFAULT  	
ENDIF


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

Далее идем к нашей кнопке, в событии click прописываем наш код поиска:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
DIMENSION a_base(3,2) 
a_base(1,1)=lower(ALLTRIM(thisform.textbox1.Value))
a_base(2,1)=lower(ALLTRIM(thisform.textbox2.Value))
a_base(3,1)=lower(ALLTRIM(thisform.textbox3.Value))
*******************
a_base(1,2)= " lower(tClient.f_name) like '&a_base(1, 1)' "
a_base(2,2)= " lower(tClient.I_name) like '&a_base(2, 1)' "
a_base(3,2)= " lower(tClient.O_name) like '&a_base(3, 1)' "
******************
**создал массив, где занес имя поля таблицы и соответствующее ему значение для поиска из тексбокса. Через Lower() привел к одному регистру, чтобы поиск был не зависим от регистра.

LOCAL LcCondition
lcCondition=''
FOR i=1 TO ALEN(a_base,1)
	IF !EMPTY(a_base(i, 1))
		IF !EMPTY(lcCondition)
			lcCondition=lcCondition+' and '+ a_base(i, 2)
		ELSE 
			lcCondition = 'where '+a_base(i, 2)
		ENDIF 		
	ENDIF 
ENDFOR 	
****************************************
**создал условие поиска для запроса, если ячейки пустые – то игнорировать их. итоговый результат будет наподобие “where lower(f_name) like ‘петров’ and lower(i_name) like ‘алекс%’ 
thisform.grid1.RecordSource=''
**отвязываем грид, чтобы не получить белый квадрат при пересоздании запроса.
TEXT TO lcClient NOSHOW PRETEXT 15 
SELECT tClient.f_name, tClient.i_name, tClient.o_name, tClient.date_rozh 
FROM tClient 
ORDER BY tClient.f_name, tClient.i_name, tClient.o_name 
<<m.lcCondition>> INTO CURSOR cClient 
ENDTEXT 
****************************************
thisform.grid1.RecordSourceType= 4
thisform.grid1.RecordSource=lcClient
thisform.Refresh()


Данные в строку поиска вносим либо полностью, либо прописываем знаки замещения, "%" - любое количество любых символов "_" любой один символ.
к примеру: если в поле поиска фамилии внести фамилию Шипиц_н со знаком замещения "_" то в результате поиска выйдут все Шипицын и Шипицин.
если в поле поиска фамилии внести Шип% то результат будет Шип, Шипицин, Шипицын, Шипулин, Шиптяев и т.д.
если в поле поиска внести Шип, то результат будет один - Шип.
...
Рейтинг: 0 / 0
форма поиска
    #38820148
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GoshaS

Может лучше будет использовать ListBox?
Из TextBox для SELECT...WHERE... можно взять условие без кнопки, массивов и TEXT...ENDTEXT.
При малых таблицах и простым фильтром можно обойтись.
...
Рейтинг: 0 / 0
форма поиска
    #38820300
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12,
Кнопка т.к. пользователю нужен выбор, либо поиск осуществлять клавишей ентер или мышкой, кому как удобней.

Можно и без TEXT...ENDTEXT только когда запрос большой - для меня удобней смотреть в этой конструкции, ведь не обязательно он может состоять из одной таблицы. Удобно составлят запросы для отпрвки на sql сервер. В общем дело привычки.

Что касается массива - то я нашел такое решение, использую как канву, чуть подправил и в другой ситуации применил. Есть конечно другие решения.

Фильтр - ну может подтормаживать на таблицах под 10тысяч записей, все равно будет не проще моего способа организовать. Т.е. проверка какой фильтр установлен, создать новый или добавить к существующему и все это минимум по трем полям. Плюс индексы на таблицу для сортировки, ведь работаем с базой клиентов и пользователю будет понятней, когда ФИО идут по порядку.

Листбокс - как минимум грид красивей оформлен, можно отдельно отметить цветом к примеру клиентов с просроченными паспортами, активную строку или выделить несколько строк одновременно и т.д.

В прочем, вам никто не запрещает выложить свой вариант решения задачи. Он может оказаться для данной ситуации более подходящим.
...
Рейтинг: 0 / 0
форма поиска
    #38820337
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GoshaS

***Text1.Init
SET ANSI OFF
THIS.INTERACTIVECHANGE()
THISFORM.List1.ROWSOURCETYPE = 2
THISFORM.List1.ROWSOURCE = 'cur_table1'

***Text1.InteractiveChange
SELECT name1 FROM table1 WHERE name1 = ALLTRIM(THIS.VALUE) INTO CURSOR cur_table1
THISFORM.List1.REQUERY()
...
Рейтинг: 0 / 0
форма поиска
    #38820798
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12,
Для решения этой конкретной задачи ваш вариант конечно подойдет лучше.
...
Рейтинг: 0 / 0
форма поиска
    #38820804
fatimaaaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GoshaS,

следующий строки что значит?

lcCondition = 'where '+a_base(i, 2)

и

TEXT TO lcClient NOSHOW PRETEXT 15
SELECT tClient.f_name, tClient.i_name, tClient.o_name, tClient.date_rozh
FROM tClient
ORDER BY tClient.f_name, tClient.i_name, tClient.o_name
<<m.lcCondition>> INTO CURSOR cClient
ENDTEXT

в этих линиях ,Происходит ошибка программы
зачем,не знаю

и другой вопрос
можно использовать из фильтр?как?
...
Рейтинг: 0 / 0
форма поиска
    #38820997
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fatimaaaa,
Воспользуйтесь решением от sg12, его вариант лучше подходит под ваши условия задачи. Как я понял, вам для учёбы?

по моему коду
lcCondition - переменная, где сохраняется фильтр поиска. 1 действие - если нашли не пустое поле поиска, тогда создаем условие для запроса, которое всегда начинается с 'where' (см. SQL, к примеру select f_name from table1 where f_name='Петров'). Если есть еще одно поле, тогда к предыдущему условию добавить новое через 'AND' (select f_name from table1 where f_name='Петров' and i_name='Андрей') делаем, пока есть такие поля.

TEXT TO lcClient NOSHOW PRETEXT 15
***
ENDTEXT
Сохраняет строки, находящиеся между TEXT и ENDTEXT в переменную lcClient
для работы этой конструкции надо установить настройку: SET TEXTMERGE ON
...
Рейтинг: 0 / 0
форма поиска
    #38821093
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так, чтобы понять, что не работает - надо дебагером глянуть, что за ошибка, проверить синтаксис, значение переменных, которые могут вызвать эту ошибку.
...
Рейтинг: 0 / 0
форма поиска
    #38821107
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fatimaaaaGoshaS,

следующий строки что значит?

lcCondition = 'where '+a_base(i, 2)

и

TEXT TO lcClient NOSHOW PRETEXT 15
SELECT tClient.f_name, tClient.i_name, tClient.o_name, tClient.date_rozh ;
FROM tClient ;
ORDER BY tClient.f_name, tClient.i_name, tClient.o_name ;
<<m.lcCondition>> INTO CURSOR cClient
ENDTEXT

в этих линиях ,Происходит ошибка программы
зачем,не знаю

и другой вопрос
можно использовать из фильтр?как?
...
Рейтинг: 0 / 0
форма поиска
    #38821127
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fatimaaaaGoshaS,

следующий строки что значит?

lcCondition = 'where '+a_base(i, 2)

и

TEXT TO lcClient NOSHOW PRETEXT 15
SELECT tClient.f_name, tClient.i_name, tClient.o_name, tClient.date_rozh ;
FROM tClient ;
ORDER BY tClient.f_name, tClient.i_name, tClient.o_name ;
<<m.lcCondition>> INTO CURSOR cClient
ENDTEXT

в этих линиях ,Происходит ошибка программы
зачем,не знаю

и другой вопрос
можно использовать из фильтр?как?
...
Рейтинг: 0 / 0
форма поиска
    #38821275
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorNG,
В конструкции
TEXT ENDTEXT не надо ставить ';'
...
Рейтинг: 0 / 0
форма поиска
    #38821393
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кому интересно покрутить:
https://cloud.mail.ru/public/20f961650457/Forms.rar
Сразу добавлена временная таблица по фамилиям - Петров, Иванов, Сидоров. Т.е. при запуске формы сразу можно их поискать.
в поиск вводим с знаками замещения _ один символ % любое кол-во символов.
...
Рейтинг: 0 / 0
форма поиска
    #38821551
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эту же конструкцию применяю и для работы с SQL сервером,
только
Код: sql
1.
2.
thisform.grid1.RecordSourceType= 4
thisform.grid1.RecordSource=lcClient


заменяю на
Код: sql
1.
2.
3.
4.
5.
6.
7.
IF SQLEXEC(_nCH,lcClient, 'cClient')<=0
	AERROR(a_er)
	MESSAGEBOX('Ошибка № '+CAST(a_er(1) as varchar(6))+CHR(13)+a_er(2), 16)
	RETURN 
ENDIF 
thisform.grid1.RecordSourceType= 1
thisform.grid1.RecordSource='cClient'


Это еще одна причина использования мной: TEXT ENDTEXT. Составил запрос утилиткой sql-сервера, скопировал в TEXT ENDTEXT и все гарантированно работает, остается добавить только условие.
...
Рейтинг: 0 / 0
форма поиска
    #38821981
fatimaaaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GoshaS,

Большое спасибо
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / форма поиска
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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