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 не используются.
Если честно, то первый вариант мне больлше нравится, так как в запросе  при построении запроса на выборку фильтр использует все переменные.
Не подскажите, мастера, что я делаю не так, почему первый код не работоспособен .
Заранее благодарю. С уважением...


Progr   (2007-09-12 20:21:00) [1]

Спасибо всем.
Вроде получилось пока.
Использовал Trunc, и нашел некоторый глюк который исправил.
Спасибо еще раз.


sniknik   (2007-09-12 11:02:00) [2]

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

кстати в [0] условие первого запроса далеко не тоже самое что во втором...
там ближе было бы поставить or вместо and между первым условием и кучкой остальных.
а так запрос верный (по сути а не по логике которую ты от него ожидаешь и которая нам неизвестна), просто нет нужных данных, впрочем см. [1].


Progr   (2007-09-11 21:16:00) [3]

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

С уважением.


Progr   (2007-09-07 22:53:00) [4]

Не подскажите каким образом мне построить запрос.
Я просто новичок и не сразу все схватываю.
С уважением...


Desdechado   (2007-09-07 22:09:00) [5]

Все можно из [0] сделать одним запросом.


Progr   (2007-09-07 21:14:00) [6]

Хорошо. А есть способ, скажем сделать так:
1. Делаю выборку по дате. Она работает вроде правильно.
2. А из полученного Readonly таблицы осуществить выборку по полям int.
Тогда вроде может заработать.

Возможно это сделать одним запросом.
Или надо 2 запроса строить.
Еслди 2 то как тогда быть, создавать виртуальную таблицу?


Desdechado   (2007-09-07 20:25:00) [7]

> НАсколько я помню, в ИВ нет типа "Дата", а есть только "Дата-время" и таймстамп
В разных диалектах по-разному.
В 3-м TIMESTAMP - это комбинация, но есть и независимые дата и время. Судя по DDL таблицы автора, у него 3-й диалект.


Progr   (2007-09-07 20:11:00) [8]

>>>Washington ©   (07.09.07 15:21) [20]

Простите. То есть мне желательно в столбец CHISLO типа Date вносить дату обработанную Вашим кодом? Или этого кода достаточно, чтобы правильно построить выборку?

Потому что я так понял из рассуждений выше, что  в поле базы вносится как дата, так и время?


Washington   (2007-09-07 15:21:00) [9]

Получение даты в формате дд.мм.гггг:

var
time:TSystemTime;
date:TDateTime;
begin
GetSystemTime(time);
date:=SystemTimeToDateTime(time);
end;

Вроде так, у меня всё нормально пахает


MsGuns   (2007-09-07 00:17:00) [10]

НАсколько я помню, в ИВ нет типа "Дата", а есть только "Дата-время" и таймстамп


Progr   (2007-09-07 00:02:00) [11]

Кстати, еще один момент
Когда я убираю операции AND с полями int, условие прекрасно работает, и выборку выдает правильно по всем записям.
Но если я добавляю хоть один элемент AND для значения int, то согласно логике оно тоже должно выполняться.


Anatoly Podgoretsky   (2007-09-06 23:44:00) [12]

Может это тебе и не поможет, точнее точно не поможет, но именно так надо работать с интервалами, которые включают время.

Trunc(StartDate) >= and < Trunc(EndDate) + 1


Progr   (2007-09-06 23:37:00) [13]

>>>Anatoly Podgoretsky ©   (06.09.07 22:43) [13]

попробую сделать


Anatoly Podgoretsky   (2007-09-06 22:47:00) [14]

> Progr  (06.09.2007 22:45:14)  [14]

Не надо литературе, это в исходника и возможно в справке

TDate = TDateTime;
TTime = TDateTime;


Progr   (2007-09-06 22:45:00) [15]

Не сможете подкинуть ссылочку, в моей лит-ре слабо описан тип TDate.


Anatoly Podgoretsky   (2007-09-06 22:43:00) [16]

> Progr  (06.09.2007 22:28:11)  [11]

> Firstdate := dt1.Date;  
> Secondate := dt2.Date; (Tdatetimepicker-переведен в Date)

Это ни о чем не говорит, какие то неясные переменные, с неясными значениями. Если писать, то так

Firstdate := Trunc(dt1.Date);  
Secondate := Trunc(dt2.Date) + 1;

и условие заменить на Secondate < :Secondate, ведь ты же хочешь любую дату, например 15.09.2007 23:00:00 а не только 15.09.2007 00:00:00 - это типичная ошибка при работе с датами.

По второй дате, ведь


Anatoly Podgoretsky   (2007-09-06 22:36:00) [17]

> Progr  (06.09.2007 22:09:10)  [10]

Посмотри описания тип TDate, будешь удивлен.


Progr   (2007-09-06 22:28:00) [18]

Давайте я попробую привести код:
Var
 firstdate: TDate;
 secondate: TDate;
 int1: smallint;
 int2: smallint;
 int3: smallint;
 int4: smallint;
 int5: smallint;
 

begin

 Firstdate := dt1.Date;  
 Secondate := dt2.Date; (Tdatetimepicker-переведен в Date)

 if box1.Checked     then int1:=1   else int1:=0;
 if box2.Checked     then int2:=1   else int2:=0;
 if box3.Checked     then int3:=1   else int3:=0;
 if box4.Checked     then int4:=1   else int4:=0;
 if box5.Checked     then int5:=1   else int5:=0;

IB.Close;
IB.ParamByName('data1').AsDate      := Firstdate;
IB.ParamByName('data2').AsDate      := Secondate;
IB.ParamByName('tint1').AsSmallInt   := int1;
IB.ParamByName('tint2').AsSmallInt   := int2;
IB.ParamByName('tint3').AsSmallInt   := int3;
IB.ParamByName('tint4').AsSmallInt   := int4;
IB.ParamByName('tint5').AsSmallInt   := int5;
IB.Open;

end;

Код поиска в первом сообщении.

Теперь сама таблица в IB:
CREATE TABLE ANM_SAON(ID NUMERIC(6,0) NOT NULL PRIMARY KEY, CHISLO DATE, VREMYA TIME, VL530 INTEGER, PRICHINA VARCHAR(350), INT1 SMALLINT, INT2 SMALLINT, INT3 SMALLINT, INT4 SMALLINT, INT5 SMALLINT, PRIMECHANIE VARCHAR(350))

Вот пожалуй основные исходные данные.
С вводом, редактированием, удалением записей все работает.
А вот с выборкой вот такая проблема.


Progr   (2007-09-06 22:09:00) [19]

Var
a: Tdate;

...
ParamByName('data1').asDate := a;

Так у меня в программе, тип переменной явное TDate.
Это получается что в переменную заносится еще и время, интересно.

может подскажите тогда как преобразуется первый код.
С уважением.


Anatoly Podgoretsky   (2007-09-06 22:08:00) [20]

> MsGuns  (06.09.2007 21:54:06)  [6]

В даннои случае это не так, кроме граничных условий.
D >= :D1 and D <=:D2

Зато там еще куча AND, должны выполниться все условия, а ту еще и SmallInt в придачу.
К вопросу не приложен DDL, точное значение параметров и записи которые якобы должны быть выданы.


Страницы:   1 2

Наверх

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