|
Запрос из формы
|
|||
---|---|---|---|
#18+
Здравствуйте. Создал форму, добавил на неё кнопочку с такой командой: 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 В итоге, если хоть одно поле формы не заполнено, то запрос не возвращает ни одной записи. Собственно вопрос. Почему? Ведь такой запрос, написанный ручками не из формы работает как надо ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 13:21 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
Возьмём, например, ситуацию с незаполненным полем "номер". В этом случае выполняется такой запрос: Код: plaintext 1. 2. 3.
И зачем вы приписываете проценты? Это годится для оператора LIKE, никак не для проверки на равенство... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 13:35 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
tanglir, С процентами как раз и не найдет, хоть ручками, хоть как. Врядли в этих полях есть данные с процентами. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 13:48 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
IgorNG, вроде бы я и написал, что проценты нужны только для лайка, а в сравнении им делать нечего... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 13:53 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
tanglir, Извини, не туда ответил :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 14:00 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
Но смотрите. такой запрос primer = '' SELECT * FROM table WHERE pole = '15' AND pole2 = primer является вполне работоспособным и выбирает все записи, где pole1 = 15. Я просто разницы не вижу ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 14:28 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
А почему Вы решили, что "не указанное" значение - это пустая строка? А не, скажем, 10 пробелов? Код: plaintext 1. 2.
Тоже что-то вернет? А такой запрос, что вернет? Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 14:54 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
"А почему Вы решили, что "не указанное" значение - это пустая строка?" Разве нет? Не знал. Как тогда сделать поиск только по "указанным" значениям? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 15:06 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
ОлегОлегОлег, А такой запрос, что вернет? SELECT * FROM table WHERE pole = '%' проценты из запроса убрал ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 15:08 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
ОлегОлегОлег"А почему Вы решили, что "не указанное" значение - это пустая строка?" Разве нет? Не знал. А я откуда знаю чем Вы инициализируете объекты формы? Вы проверяли значения, записанные в объектах? Смотрели что там записано? ОлегОлегОлегКак тогда сделать поиск только по "указанным" значениям? А как Вы определяете в каких объектах что-то указано, а в каких нет? Вам никогда не понадобиться найти именно пустое значение? Как Вы отличите "пустое" от "не указанного"? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 15:24 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
Даааа.. Ваши вопросы заставили задуматься... Ну смотрите. В форме создал кнопку, чтоб очистить все. Вот код: 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 = '' Пробовал сначала нажимать эту кнопку, чтоб сделать значения пустыми, потом делать запрос. Тоже безрезультатно. "А как Вы определяете в каких объектах что-то указано, а в каких нет? Вам никогда не понадобиться найти именно пустое значение? Как Вы отличите "пустое" от "не указанного"?" Пустое значение искать не нужно будет в этой программе ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 15:41 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
1. Еще раз. Как Вы проверяли , что записано в объекте? С чего Вы взяли, что после команды Код: plaintext
Значение будет именно пустая строка? Надо проверить . Явным образом. Например, так Код: plaintext 1. 2. 3.
2. Что возвращает Код: plaintext
Там где "работает" и там, где "не работает"? 3. Если использовать локальные алиасы и префикс "m.", будет работать? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 17:53 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
ОлегОлегОлег, (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)); ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2011, 17:55 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
ВладимирМ, 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 Попробовал. Результат тот же. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2011, 11:08 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
ВладимирМ 2. Что возвращает Код: plaintext
Там где "работает" и там, где "не работает"? [/src] Объясните на примере пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2011, 11:13 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Прочитайте справку по настройке SET ANSI, поймете в чем дело. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2011, 14:03 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
ВладимирМ, В общем создал я форму заново. И все запросы норм возвращают результат. Наверно форма кривая была. wizard-ом её создавал. Спасибо большое за помощь и внимание ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2011, 09:28 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
И еще вопросик такой в этой же теме. Гугл чет сбой дал). Поставил в textbox формат date. set date british, как всегда... Но запрос выдает ошибку несоответствия типов(operator type mismatch). вот запрос: DR = THISFORM.Text4.Value SELECT * FROM TABLE1; WHERE; DATA_ROGD=DR; INTO CURSOR GAB Как перевести значение texbox в формат даты? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2011, 09:33 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
ОлегОлегОлегИ еще вопросик такой в этой же теме. Гугл чет сбой дал). Поставил в 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
Однако при таком "ручном" переводе всегда следует иметь в виду, что символьная строка может не переводится в дату. Например, ввели 31 февраля как символьную строку. Это значит, что следует предусмотреть возможные ошибки при попытке перевода строки в дату. Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2011, 09:59 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
ВладимирМ, Пасиб. сделал. Наверно последний вопрос в этой теме. Такой запрос 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 пустое, то запрос возвращает то, что нужно, но, если в этом поле указана дата, то возвращаются вообще все записи... Почему так? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2011, 10:57 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
Извините за нечитаемость. Писал с пробелами. Так лучше автор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 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2011, 11:03 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
ОлегОлегОлег, а один раз RAB, а второй GAB - это специально? или просто грузите в 1 курсор а смотрите другой? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2011, 12:54 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
ОлегОлегОлег Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Собственно проблема. Если поле THISFORM.Text4.Value пустое, то запрос возвращает то, что нужно, но, если в этом поле указана дата, то возвращаются вообще все записи... Почему так? Если Вы хотите проверить, не является ли символьная переменная пустой, то для этого существует функция Empty() Код: plaintext 1. 2. 3. 4. 5.
Использовать для сравнения на "пустоту" прямые операторы сравнения можно. Но для этого надо хорошо представлять, что именно Вы делаете. В этом случае результат сравнения зависит от текущей настройки SET EXACT. По умолчанию, настройка SET EXACT имеет значение OFF. А это значит, что сравнение идет до истечения символов в выражении, стоящем справа от оператора сравнения. Если же справа стоит пустая строка, то она будет равна любому значению переменной DR2. В Вашем примере получалось, что Вы никогда не попадали в ветку ELSE вне зависимости от значения переменной DR2. Чтобы не путаться: SET ANSI - способ сравнения символьных строк внутри команд Select-SQL SET EXACT - способ сравнения символьных строк во всех остальных командах Есть еще ряд тонкостей, которые позволяют "игнорировать" настройку SET EXACT. В смысле, писать код так, чтобы он не зависел от этой настройки. Но, в данном конкретном случае вполне достаточно использования функции EMPTY() PS: Для выделения кода в данном форуме используется тег SRC. Можно выбрать T-SQL ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2011, 14:19 |
|
Запрос из формы
|
|||
---|---|---|---|
#18+
Спасибо в очередной раз! Программу дописал... Осталась последняя загвоздка. Хочу, чтобы пути к файлам, с которыми работает программа, можно было установить и изменить после компиляции exe-шника. Создал файл CONFIG.FPW, в котором прописал строчку: path=d:\primer.dbf. Ну это для примера. Как я понял, фокпро ищет конфиг сам в папке с программой. Но, программа требует указать файлы вручную... Есть другие варианты? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2011, 12:54 |
|
|
start [/forum/topic.php?fid=41&msg=37447548&tid=1584122]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 300ms |
total: | 431ms |
0 / 0 |