powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема с поиском
9 сообщений из 9, страница 1 из 1
Проблема с поиском
    #38936111
kolhoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. У меня такая проблема простая, но не знаю в чем дело. Опишу все по порядку.

На форме есть grid в которой отображается таблица spravki_end.dbf. Таблица spravki_end.dbf имеет воля nmkp,date_v,razdel,date_del
и один индекс IDXNDR с выражением ALLTRIM(nmkp)+ALLTRIM(DTOC(date_v))+ALLTRIM(razdel)

На форме есть textbox-сы для ввода раздела, номера и даты данные из этих полей сохраняются в переменные perem_razdlist, perem_txtnmkp, perem_txtdatev соответственно.

Теперь по нажатию на enter в textbox нужно найти запись в таблице. Делаю это так, но не получается. В чем у меня ошибка?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
IF nKeyCode=13

	perem_txtdatev=ALLTRIM(DTOC(thisform.txtdatev.Value))

	SELECT spravki_end
	go top
	set exact on
	set order to IDXNDR
	seek ALLTRIM(perem_txtnmkp)+perem_txtdatev+ALLTRIM(perem_razdlist)
	set exact OFF
	if ALLTRIM(spravki_end.nmkp)==ALLTRIM(perem_txtnmkp) AND ALLTRIM(spravki_end.razdel)==ALLTRIM(perem_razdlist) AND ALLTRIM(DTOC(spravki_end.date_v))==ALLTRIM(perem_txtdatev)
		thisform.grid1.SetAll("DynamicBackColor",[iif(spravki_end.nmkp= "] + alltrim(thisform.txtnmkp.Value) +  [" and ] + [spravki_end.razdel = "] + alltrim(thisform.razdlist.Value) +[", rgb(255,255,0), This.BackColor)],"Column")
		thisform.grid1.Refresh
		thisform.command1.Enabled= .T. 
	ELSE 
		GO TOP 
		thisform.grid1.Refresh
	ENDIF 
ENDIF
...
Рейтинг: 0 / 0
Проблема с поиском
    #38936197
kolhoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может кто-нибудь подсказать? Не хотел на форуме спрашивать, но уже не выдержал т.к. не пойму в чем дело
...
Рейтинг: 0 / 0
Проблема с поиском
    #38936493
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. set exact тут лишнее. По хорошему все SET`ы делаются при старте програмы и старте формы в отдельной DE. Менять настройки среды в процессе выполнения кода не надо.
2. Если используешь SEEK, то используй found() для провеки найденного, т.е.
Код: sql
1.
2.
3.
seek ...
if found() 
  ...


или
Код: sql
1.
2.
if Seek(...)
   ....


или
Код: sql
1.
2.
if IndexSeek(...)
    ...



В остальном непонятно что у тебя не так.
...
Рейтинг: 0 / 0
Проблема с поиском
    #38936720
kolhoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, сделал так:, вроде ищет.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
IF nKeyCode=13

	perem_txtdatev=DTOC(thisform.txtdatev.Value)

	SELECT spravki_rdc
	go top
	set order to IDXNDR
	seek ALLTRIM(perem_txtnmkp)+ALLTRIM(perem_txtdatev)+ALLTRIM(perem_razdlist)
	IF FOUND()
		thisform.grid1.SetAll("DynamicBackColor",[iif(spravki_rdc.nmkp= "] + alltrim(thisform.txtnmkp.Value) +  [" and ] + [spravki_rdc.razdel = "] + alltrim(thisform.razdlist.Value) +[", rgb(255,255,0), This.BackColor)],"Column")
		thisform.grid1.Refresh
		thisform.command1.Enabled= .T.
	ELSE 
		GO TOP 
		thisform.grid1.Refresh
	ENDIF 
ENDIF



Есть ли в моем коде какое-то извращенность или норм все?:)

В моем понимании того что я тут написал происходит следующее. При заполнении текстбоксов в переменные perem_txtnmkp, perem_txtdatev, perem_razdlist заносятся соответственно раздел, номер карты и дата. Затем в таблице идет поиск по индексу IDXNDR если найден элемент совпадающий с выражением ALLTRIM(perem_txtnmkp)+ALLTRIM(perem_txtdatev)+ALLTRIM(perem_razdlist) , то строка в гриде становится желтым.

Если мой код можно можно подправить и улучшить подскажите как?
...
Рейтинг: 0 / 0
Проблема с поиском
    #38936848
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolhozDima T, сделал так:, вроде ищет.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
IF nKeyCode=13

	perem_txtdatev=DTOC(thisform.txtdatev.Value)

	SELECT spravki_rdc
	go top
	set order to IDXNDR
	seek ALLTRIM(perem_txtnmkp)+ALLTRIM(perem_txtdatev)+ALLTRIM(perem_razdlist)
	IF FOUND()
		thisform.grid1.SetAll("DynamicBackColor",[iif(spravki_rdc.nmkp= "] + alltrim(thisform.txtnmkp.Value) +  [" and ] + [spravki_rdc.razdel = "] + alltrim(thisform.razdlist.Value) +[", rgb(255,255,0), This.BackColor)],"Column")
		thisform.grid1.Refresh
		thisform.command1.Enabled= .T.
	ELSE 
		GO TOP 
		thisform.grid1.Refresh
	ENDIF 
ENDIF



Есть ли в моем коде какое-то извращенность или норм все?:)

В моем понимании того что я тут написал происходит следующее. При заполнении текстбоксов в переменные perem_txtnmkp, perem_txtdatev, perem_razdlist заносятся соответственно раздел, номер карты и дата. Затем в таблице идет поиск по индексу IDXNDR если найден элемент совпадающий с выражением ALLTRIM(perem_txtnmkp)+ALLTRIM(perem_txtdatev)+ALLTRIM(perem_razdlist) , то строка в гриде становится желтым.

Если мой код можно можно подправить и улучшить подскажите как?А выдержишь? :)
1. Можешь обосновать наличие go top ПЕРЕД командой seek()? Доку по команде seek() читал? Похоже, что нет.
2. Когда-нибудь видел, чтобы функция DTOC() выдавала в результате пробелы? Если не видел, то может можешь логически обосновать возможность появления там пробелов? Если не можешь, то задлянафига ALLTRIM(perem_txtnmkp)? Какие пробелы эта функция тут обрезает?
3. В курсе, что у textbox можно сделать настройку, обрезающую пробелы в его Value? И что в связи с этим код ALLTRIM(perem_txtnmkp)+ALLTRIM(perem_txtdatev)+ALLTRIM(perem_razdlist) превращается в большую кучу копрокода? Как, впрочем, и любое постоянное и совершенно бездумное применение везде где ни попадя Alltrim() "на всякий случай".
4. В ОБОИХ ветках оператора IF присутствует thisform.grid1.Refresh. При чем в конце каждой из них. Не пробовал вынести его сразу за IF?
5. Индексы по выражениям, возвращающим результат разной длины (очередной причем бездумному применению Alltrim()), могут подложить неплохую такую свинью и найти причину глюка будет трудно.
Достаточно?
...
Рейтинг: 0 / 0
Проблема с поиском
    #38936856
SoftwareBoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolhoz,

1. Строка, возвращаемая DTOC(), зависит от текущей настройки отображения даты. В индексных выражениях лучше использовать DTOS().
2. Индексное выражение переменной длины - потенциальное зло. Я бы индексировал по nmkp+DTOS(date_v)+razdel. И нужно учитывать ограничение на длину индексного выражения.
3. SetAll покрасит жёлтым все записи, удовлетворяющие указанному условию, а не текущую. Поиск для раскраски не нужен.
4. This.BackColor для записей, не удовлетворяющих условию - предполагается таким способом оставлять для них цвет без изменения? Предполагается при нескольких последовательных поисках докрашивать жёлтым записи по новым условиям?
...
Рейтинг: 0 / 0
Проблема с поиском
    #38936870
SoftwareBoy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Sizov2. Когда-нибудь видел, чтобы функция DTOC() выдавала в результате пробелы?
При пустой дате - таки выдаст. Что, конечно, не оправдывает применение здесь ALLTRIM().
...
Рейтинг: 0 / 0
Проблема с поиском
    #38936885
kolhoz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сейчас буду разбираться в коде учитывая ваши замечания
...
Рейтинг: 0 / 0
Проблема с поиском
    #38937063
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey SizovКогда-нибудь видел, чтобы функция DTOC() выдавала в результате пробелы?SoftwareBoyПри пустой дате - таки выдаст.Да и не только при пустой :)
Код: sql
1.
2.
Set Date LONG
MessageBox(Dtoc(Date()))
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема с поиском
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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