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

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

Если я хочу,Как что вы сказали, делать что мне нода делать? какой код должен писать?
...
Рейтинг: 0 / 0
27.11.2014, 16:31
    #38818548
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
форма поиска
Насколько вы знаете VFP? Сможете создать таблицу, заполнить ее данными, создать форму, на ней три текстбокса, кнопку и грид?
...
Рейтинг: 0 / 0
27.11.2014, 21:20
    #38818852
fatimaaaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
форма поиска
GoshaS,
Да, я знаю, все, что вы сказали,но кодирование плохо знаю
...
Рейтинг: 0 / 0
28.11.2014, 10:43
    #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
29.11.2014, 02:25
    #38820148
sg12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
форма поиска
GoshaS

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

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

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

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

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

В прочем, вам никто не запрещает выложить свой вариант решения задачи. Он может оказаться для данной ситуации более подходящим.
...
Рейтинг: 0 / 0
29.11.2014, 18:21
    #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
30.11.2014, 19:04
    #38820798
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
форма поиска
sg12,
Для решения этой конкретной задачи ваш вариант конечно подойдет лучше.
...
Рейтинг: 0 / 0
30.11.2014, 19:12
    #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
01.12.2014, 08:32
    #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
01.12.2014, 10:32
    #38821093
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
форма поиска
А так, чтобы понять, что не работает - надо дебагером глянуть, что за ошибка, проверить синтаксис, значение переменных, которые могут вызвать эту ошибку.
...
Рейтинг: 0 / 0
01.12.2014, 10:43
    #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
01.12.2014, 10:57
    #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
01.12.2014, 12:28
    #38821275
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
форма поиска
IgorNG,
В конструкции
TEXT ENDTEXT не надо ставить ';'
...
Рейтинг: 0 / 0
01.12.2014, 14:33
    #38821393
GoshaS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
форма поиска
Кому интересно покрутить:
https://cloud.mail.ru/public/20f961650457/Forms.rar
Сразу добавлена временная таблица по фамилиям - Петров, Иванов, Сидоров. Т.е. при запуске формы сразу можно их поискать.
в поиск вводим с знаками замещения _ один символ % любое кол-во символов.
...
Рейтинг: 0 / 0
01.12.2014, 16:25
    #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
01.12.2014, 21:38
    #38821981
fatimaaaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
форма поиска
GoshaS,

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


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