Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по БД [D7, D2005, XP]


Страницы:   1 2

Progr ©   (2007-09-06 21:07:00) 

Доброго времени суток, мастера.
Возник один вопрос, который я не могу понять. Пишу небольшую БД, исходный файл БД в IB. Использую IBquery компонент. Так Вот, почему:
{select * from ANM_Saon
Where (CHISLO >= :data1 and CHISLO <= :data2)  and
(int1 = :Tint1)    and
(int2 = :Tint2)   and
(int3 = :Tint3)  and
(int4 = :Tint4)    and
(int5= :Tint5)}    этот код не делает выборку. CHISLO типа DATE, а все остальные поля int1-5 SmallINT. Все параметизированные данные задаю верно. Но выборки нет. А вот код:
{select * from ANM_Saon
Where (CHISLO >= :data1 and CHISLO <= :data2)  
Union
select * from ANM_Saon where
(int1 = :Tint1)    and
(int2 = :Tint2)   and
(int3 = :Tint3)  and
(int4 = :Tint4)    and
(int5= :Tint5)}  
работает. Причем не всегда правильно. Я обратил внимание если data1=data2 то условия в секции Union не используются.
Если честно, то первый вариант мне больлше нравится, так как в запросе  при построении запроса на выборку фильтр использует все переменные.
Не подскажите, мастера, что я делаю не так, почему первый код не работоспособен .
Заранее благодарю. С уважением...


Anatoly Podgoretsky   (2007-09-06 22:05:00) [21]

> Progr  (06.09.2007 21:50:05)  [5]

Ты сам написал, что не работает (не всегда именно это и означает)
Повторяю еще раз, нет записей под условие.
Это и доказывает второй пример.
Запись с датой есть, а с INT нет
При первом примере это явно видно.


MsGuns   (2007-09-06 21:57:00) [22]

Надо указывать либо >=[<Дата> 00:00:00] and <=[<Дата> 23:59:59]
либо использовать функции преобразования чтобы сверять только числа, но не время


MsGuns   (2007-09-06 21:54:00) [23]

>Progr   (06.09.07 21:50) [5]
>Не понял. Расшифруйте пожалуйста.
>С уважением.

Запрос типа
Select ..
  where FDate=:p1

с ParamByName('p1').asDate := NOW

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

Все дело во времени - hh:mm:ss


Progr   (2007-09-06 21:50:00) [24]

>>>В дате сеть еще время

Не понял. Расшифруйте пожалуйста.
С уважением.

А почему тогда второй работает при таких же условиях


MsGuns   (2007-09-06 21:40:00) [25]

В дате сеть еще время


Progr   (2007-09-06 21:38:00) [26]

>>> Первый код не работает, поскольку нет записей удовлетворяющих условию.

Но почему. Если я задаю между 10.08.07 и 10.09.07.
Поля в базе int принимают либо 1 либо 0. Соответственно на форме в программе ввожу эти переменные. Но в базе есть запись удовлетворяющая этому условию.
поле:
CHISLO     int1  int2   int3   int4   int5
15.08.07.  1       0       1      0      0
База сама шире. Есть дополнительные поля, которые я здесь не привожу так фильтрация по ним не происходит.
Я соответственно в запрос передаю параметры int1-5 и дату соответствующие данной записи. Параметры, передаваемые в запрос, удовлетворяют условию приведенной выше записи. То есть должна вернуться выборка состоящая из этой записи.

Так почему не работает?
С уважением..


Desdechado   (2007-09-06 21:30:00) [27]

Нужно быть осторожным с типом SMALLINT, т.к. параметры нужно явно типизироватьи явно присваивать так, чтоб не получилось, например, как будто это Integer.

Секции UNION не существует. Это способ объединения результатов двух запросов. Т.о. 1-й и 2-й код делают совершенно разные вещи:
1. выбирает то, что удовлетворяет обоим условиям
2. выбирает то, что удовлетворяет только 1-му условию, а затем дополняет результат тем, что удовлетворяет только 2-му условию


Anatoly Podgoretsky   (2007-09-06 21:13:00) [28]

> Progr  (06.09.2007 21:07:00)  [0]

Первый код не работает, поскольку нет записей удовлетворяющих условию.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо