Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос из формы / 25 сообщений из 29, страница 1 из 2
15.09.2011, 13:21
    #37441679
Запрос из формы
Здравствуйте. Создал форму, добавил на неё кнопочку с такой командой:
LOCAL per_re, per_pens, per_fio, per_dr, per_sp, per_np, pre_spe, per_dpr, per_di
per_re=THISFORM.reg_nom1.VALUE
per_pens=THISFORM.pens1.VALUE
per_fio=alltrim(THISFORM.fio1.VALUE)+"%"
per_dr=THISFORM.data_rogd1.VALUE
per_sp=THISFORM.s_polis1.VALUE
per_np=THISFORM.n_polis1.VALUE
pre_spe=alltrim(THISFORM.spec_tnum1.VALUE)+"%"
per_dpr=THISFORM.data_pr1.VALUE
per_di=alltrim(THISFORM.diagnoz_o1.VALUE)+"%"
SELECT * from D:\progr\table1;
WHERE table1.reg_nom = per_re;
AND table1.PENS = per_pens;
AND table1.FIO = per_fio;
AND TABLE1.DATA_ROGD = per_dr;
AND TABLE1.S_POLIS = per_sp;
AND TABLE1.N_POLIS = per_np;
AND TABLE1.SPEC_TNUM = pre_spe;
AND TABLE1.DATA_PR = per_dpr;
AND TABLE1.DIAGNOZ_O = per_di

В итоге, если хоть одно поле формы не заполнено, то запрос не возвращает ни одной записи. Собственно вопрос. Почему? Ведь такой запрос, написанный ручками не из формы работает как надо
...
Рейтинг: 0 / 0
15.09.2011, 13:35
    #37441711
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
Возьмём, например, ситуацию с незаполненным полем "номер". В этом случае выполняется такой запрос:
Код: plaintext
1.
2.
3.
SELECT ...
WHERE ...
AND table1.reg_nom = '';
AND ...
А теперь скажите, у вас в базе много записей с пустыми номерами (и прочими полями)?
И зачем вы приписываете проценты? Это годится для оператора LIKE, никак не для проверки на равенство...
...
Рейтинг: 0 / 0
15.09.2011, 13:48
    #37441747
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
tanglir,

С процентами как раз и не найдет, хоть ручками, хоть как. Врядли в этих полях есть данные с процентами.
...
Рейтинг: 0 / 0
15.09.2011, 13:53
    #37441756
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
IgorNG, вроде бы я и написал, что проценты нужны только для лайка, а в сравнении им делать нечего...
...
Рейтинг: 0 / 0
15.09.2011, 14:00
    #37441770
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
tanglir,

Извини, не туда ответил :)
...
Рейтинг: 0 / 0
15.09.2011, 14:28
    #37441801
Запрос из формы
Но смотрите. такой запрос
primer = ''
SELECT * FROM table WHERE pole = '15' AND pole2 = primer
является вполне работоспособным и выбирает все записи, где pole1 = 15. Я просто разницы не вижу
...
Рейтинг: 0 / 0
15.09.2011, 14:54
    #37441854
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
А почему Вы решили, что "не указанное" значение - это пустая строка? А не, скажем, 10 пробелов?

Код: plaintext
1.
2.
primer = SPACE( 10 )
SELECT * FROM table WHERE pole = '15' AND pole2 = m.primer

Тоже что-то вернет?

А такой запрос, что вернет?

Код: plaintext
1.
SELECT * FROM table WHERE pole = '%'
...
Рейтинг: 0 / 0
15.09.2011, 15:06
    #37441882
Запрос из формы
"А почему Вы решили, что "не указанное" значение - это пустая строка?" Разве нет? Не знал. Как тогда сделать поиск только по "указанным" значениям?
...
Рейтинг: 0 / 0
15.09.2011, 15:08
    #37441884
Запрос из формы
ОлегОлегОлег,


А такой запрос, что вернет?

SELECT * FROM table WHERE pole = '%'


проценты из запроса убрал
...
Рейтинг: 0 / 0
15.09.2011, 15:24
    #37441921
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
ОлегОлегОлег"А почему Вы решили, что "не указанное" значение - это пустая строка?" Разве нет? Не знал.
А я откуда знаю чем Вы инициализируете объекты формы? Вы проверяли значения, записанные в объектах? Смотрели что там записано?

ОлегОлегОлегКак тогда сделать поиск только по "указанным" значениям?
А как Вы определяете в каких объектах что-то указано, а в каких нет? Вам никогда не понадобиться найти именно пустое значение? Как Вы отличите "пустое" от "не указанного"?
...
Рейтинг: 0 / 0
15.09.2011, 15:41
    #37441957
Запрос из формы
Даааа.. Ваши вопросы заставили задуматься...
Ну смотрите. В форме создал кнопку, чтоб очистить все. Вот код:
THISFORM.reg_nom1.VALUE = ''
THISFORM.pens1.VALUE = ''
THISFORM.FIO1.VALUE = ''
THISFORM.DATA_ROGD1.VALUE = ''
THISFORM.S_POLIS1.VALUE = ''
THISFORM.N_POLIS1.VALUE = ''
THISFORM.SPEC_TNUM1.VALUE = ''
THISFORM.DATA_PR1.VALUE = ''
THISFORM.DIAGNOZ_O1.VALUE = ''
Пробовал сначала нажимать эту кнопку, чтоб сделать значения пустыми, потом делать запрос. Тоже безрезультатно.

"А как Вы определяете в каких объектах что-то указано, а в каких нет? Вам никогда не понадобиться найти именно пустое значение? Как Вы отличите "пустое" от "не указанного"?"
Пустое значение искать не нужно будет в этой программе
...
Рейтинг: 0 / 0
15.09.2011, 17:53
    #37442206
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
1. Еще раз. Как Вы проверяли , что записано в объекте? С чего Вы взяли, что после команды

Код: plaintext
THISFORM.reg_nom1.VALUE = ''

Значение будет именно пустая строка? Надо проверить . Явным образом. Например, так

Код: plaintext
1.
2.
3.
IF LEN(THISFORM.reg_nom1.VALUE) =  0 
     MessageBox("reg_nom1 пустое")
ENDIF


2. Что возвращает

Код: plaintext
?SET("ANSI")

Там где "работает" и там, где "не работает"?

3. Если использовать локальные алиасы и префикс "m.", будет работать?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t1.* ;
from D:\progr\table1 t1 ;
WHERE t1.reg_nom = m.per_re ;
	AND t1.PENS = m.per_pens ;
	AND t1.FIO = m.per_fio ;
	AND t1.DATA_ROGD = m.per_dr ;
	AND t1.S_POLIS = m.per_sp ;
	AND t1.N_POLIS = m.per_np ;
	AND t1.SPEC_TNUM = m.pre_spe ;
	AND t1.DATA_PR = m.per_dpr ;
	AND t1.DIAGNOZ_O = m.per_di
...
Рейтинг: 0 / 0
15.09.2011, 17:55
    #37442213
SSn888
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
ОлегОлегОлег,

(1) "from D:\progr\table1.." ... ужас!!

(2) RTFM! AND вернет .T. ТОЛЬКО если ВСЕ его элементы .T.

(3) Если режете пробелы - делайте это в обоих частях... Иначе если в таблице есть " Иванов" - у Вас он никогда не найдется .. и так далее

(3) Если уж совсем невтерпеж использовать именно такую конструкцию - дополните строки условия (выкинув нафиг проценты) до
чего-нибудь вроде

AND IIF(EMPTY(ALLTRIM(per_fio)), .T., (ALLTRIM(table1.FIO) = per_fio));

(4) Как понимаю - к некоторым полям прикрутили процент "чтоб найти по началу фамилии"?
Чтоб по "Иванов" выходили все "Иванов", "Иванова" етцетера?
тогда уж

(LEFT(ALLTRIM(table1.FIO), LEN(per_fio)) = per_fio));
...
Рейтинг: 0 / 0
16.09.2011, 11:08
    #37443089
Запрос из формы
ВладимирМ,

1. Значение будет именно пустая строка? Надо проверить. Явным образом. Например, так

IF LEN(THISFORM.reg_nom1.VALUE) = 0
MessageBox("reg_nom1 пустое")
ENDIF


При запуске формы эта команда ниче не отображает. Но, если сделать: THISFORM.reg_nom1.VALUE = '', то сообщение: reg_nom1 пустое выводится... Значит, по умолчанию поле формы имеют другое значение... Но, даже при (THISFORM.reg_nom1.VALUE) = 0 в результате запроса выводятся пустые строки

2. Что возвращает

?SET("ANSI")


Там где "работает" и там, где "не работает"?

честно, не понял, куда прикрутить ?SET("ANSI"). в самом запросе поставил set ansi off. но вы не то, наверное, имели ввиду

3. Если использовать локальные алиасы и префикс "m.", будет работать?

SELECT t1.* ;
from D:\progr\table1 t1 ;
WHERE t1.reg_nom = m.per_re ;
AND t1.PENS = m.per_pens ;
AND t1.FIO = m.per_fio ;
AND t1.DATA_ROGD = m.per_dr ;
AND t1.S_POLIS = m.per_sp ;
AND t1.N_POLIS = m.per_np ;
AND t1.SPEC_TNUM = m.pre_spe ;
AND t1.DATA_PR = m.per_dpr ;
AND t1.DIAGNOZ_O = m.per_di

Попробовал. Результат тот же.
...
Рейтинг: 0 / 0
16.09.2011, 11:13
    #37443098
Запрос из формы
ВладимирМ
2. Что возвращает

Код: plaintext
?SET("ANSI")

Там где "работает" и там, где "не работает"?

[/src]

Объясните на примере пожалуйста
...
Рейтинг: 0 / 0
16.09.2011, 14:03
    #37443536
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create cursor test (f1 C( 10 ))
insert into test values ('Пример')

set ansi on
select * from test where f1 = ''

set ansi off
select * from test where f1 = ''

Прочитайте справку по настройке SET ANSI, поймете в чем дело.
...
Рейтинг: 0 / 0
20.09.2011, 09:28
    #37447375
Запрос из формы
ВладимирМ,

В общем создал я форму заново. И все запросы норм возвращают результат. Наверно форма кривая была. wizard-ом её создавал. Спасибо большое за помощь и внимание
...
Рейтинг: 0 / 0
20.09.2011, 09:33
    #37447384
Запрос из формы
И еще вопросик такой в этой же теме. Гугл чет сбой дал). Поставил в textbox формат date. set date british, как всегда... Но запрос выдает ошибку несоответствия типов(operator type mismatch).
вот запрос:
DR = THISFORM.Text4.Value
SELECT * FROM TABLE1;
WHERE;
DATA_ROGD=DR;
INTO CURSOR GAB
Как перевести значение texbox в формат даты?
...
Рейтинг: 0 / 0
20.09.2011, 09:59
    #37447427
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
ОлегОлегОлегИ еще вопросик такой в этой же теме. Гугл чет сбой дал). Поставил в textbox формат date. set date british, как всегда... Но запрос выдает ошибку несоответствия типов(operator type mismatch).
вот запрос:
DR = THISFORM.Text4.Value
SELECT * FROM TABLE1;
WHERE;
DATA_ROGD=DR;
INTO CURSOR GAB
Как перевести значение texbox в формат даты?

Вариант 1 .

В дизайнере формы в свойстве THISFORM.Text4.Value указать две фигурные скобки подряд {} - это автоматически установит формат TextBox в тип Date. В этом случае ничего менять в коде не надо.

Вариант 2 .

У Вас в настоящее время значение THISFORM.Text4.Value имеет тип Character. Для перевода символьной строки в дату можно использовать функции CTOD() или CAST()

Код: plaintext
DR = CTOD(THISFORM.Text4.Value)

Однако при таком "ручном" переводе всегда следует иметь в виду, что символьная строка может не переводится в дату. Например, ввели 31 февраля как символьную строку. Это значит, что следует предусмотреть возможные ошибки при попытке перевода строки в дату.

Код: plaintext
1.
2.
3.
4.
5.
DR = CTOD(THISFORM.Text4.Value)
if empty(DR)
    MessageBox("Дата " + THISFORM.Text4.Value + " не корректна!")
    return
endif
...
Рейтинг: 0 / 0
20.09.2011, 10:57
    #37447530
Запрос из формы
ВладимирМ,

Пасиб. сделал. Наверно последний вопрос в этой теме.
Такой запрос
RN = THISFORM.Text1.Value
FAM = ALLTRIM(THISFORM.Text2.Value)
SNILS = THISFORM.Text3.Value
DR = CTOD(THISFORM.Text4.Value)
SP = THISFORM.Text5.Value
NP = THISFORM.Text6.Value
VRA = THISFORM.Text7.Value
DR2 = THISFORM.Text4.Value
if DR2 = ''
SELECT * FROM D:\progr\TABLE1;
WHERE;
REG_NOM = RN;
AND FIO = FAM;
AND S_POLIS = SP;
AND pens = snils;
AND N_POLIS = NP;
AND SPEC_TNUM = VRA;
INTO CURSOR RAB
ELSE
SELECT * FROM D:\progr\TABLE1;
WHERE;
DATA_ROGD=DR;
INTO CURSOR GAB
endif
Собственно проблема. Если поле THISFORM.Text4.Value пустое, то запрос возвращает то, что нужно, но, если в этом поле указана дата, то возвращаются вообще все записи... Почему так?
...
Рейтинг: 0 / 0
20.09.2011, 11:03
    #37447548
Запрос из формы
Извините за нечитаемость. Писал с пробелами. Так лучше
авторRN = THISFORM.Text1.Value
FAM = ALLTRIM(THISFORM.Text2.Value)
SNILS = THISFORM.Text3.Value
DR = CTOD(THISFORM.Text4.Value)
SP = THISFORM.Text5.Value
NP = THISFORM.Text6.Value
VRA = THISFORM.Text7.Value
DR2 = THISFORM.Text4.Value
if DR2 = ''
SELECT * FROM D:\progr\TABLE1;
WHERE;
REG_NOM = RN;
AND FIO = FAM;
AND S_POLIS = SP;
AND pens = snils;
AND N_POLIS = NP;
AND SPEC_TNUM = VRA;
INTO CURSOR RAB
ELSE
SELECT * FROM D:\progr\TABLE1;
WHERE;
DATA_ROGD=DR;
INTO CURSOR GAB
endif
...
Рейтинг: 0 / 0
20.09.2011, 12:54
    #37447872
SSn888
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
ОлегОлегОлег,

а один раз RAB, а второй GAB - это специально?
или просто грузите в 1 курсор а смотрите другой?
...
Рейтинг: 0 / 0
20.09.2011, 14:19
    #37448079
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
ОлегОлегОлег
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
DR2 = THISFORM.Text4.Value
if DR2 = ''
  SELECT * FROM D:\progr\TABLE1;
	WHERE;
	       REG_NOM = RN;
	   AND FIO = FAM;
	   AND S_POLIS = SP;
	   AND pens = snils;
	   AND N_POLIS = NP;
	   AND SPEC_TNUM = VRA; 
	   		INTO CURSOR RAB
ELSE
	SELECT * FROM D:\progr\TABLE1;
	WHERE;
	      DATA_ROGD=DR;
	   		INTO CURSOR GAB
endif

Собственно проблема. Если поле THISFORM.Text4.Value пустое, то запрос возвращает то, что нужно, но, если в этом поле указана дата, то возвращаются вообще все записи... Почему так?

Если Вы хотите проверить, не является ли символьная переменная пустой, то для этого существует функция Empty()

Код: plaintext
1.
2.
3.
4.
5.
if empty(DR2)
    * Переменная DR2 - "пустая"
else
    * Переменная DR2 - не "пустая". В ней что-то есть.
endif

Использовать для сравнения на "пустоту" прямые операторы сравнения можно. Но для этого надо хорошо представлять, что именно Вы делаете. В этом случае результат сравнения зависит от текущей настройки SET EXACT.

По умолчанию, настройка SET EXACT имеет значение OFF. А это значит, что сравнение идет до истечения символов в выражении, стоящем справа от оператора сравнения. Если же справа стоит пустая строка, то она будет равна любому значению переменной DR2.

В Вашем примере получалось, что Вы никогда не попадали в ветку ELSE вне зависимости от значения переменной DR2.

Чтобы не путаться:

SET ANSI - способ сравнения символьных строк внутри команд Select-SQL
SET EXACT - способ сравнения символьных строк во всех остальных командах

Есть еще ряд тонкостей, которые позволяют "игнорировать" настройку SET EXACT. В смысле, писать код так, чтобы он не зависел от этой настройки. Но, в данном конкретном случае вполне достаточно использования функции EMPTY()

PS: Для выделения кода в данном форуме используется тег SRC. Можно выбрать T-SQL
...
Рейтинг: 0 / 0
22.09.2011, 12:54
    #37451503
Запрос из формы
Спасибо в очередной раз!
Программу дописал... Осталась последняя загвоздка. Хочу, чтобы пути к файлам, с которыми работает программа, можно было установить и изменить после компиляции exe-шника. Создал файл CONFIG.FPW, в котором прописал строчку:
path=d:\primer.dbf. Ну это для примера. Как я понял, фокпро ищет конфиг сам в папке с программой. Но, программа требует указать файлы вручную... Есть другие варианты?
...
Рейтинг: 0 / 0
22.09.2011, 13:42
    #37451619
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос из формы
ОлегОлегОлег,

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


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