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

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

Борюсь с запросом в ADOQuery - проблема с датой [D5, Accsess]


RDA ©   (2002-09-21 10:55:00) 

procedure TfmFilter.SetFilter;
const
Text="SELECT N_PLAT, NOMER, DATA, NAZV_P, RRAX_P, NAZV_O, RRAX_O, SUMA, PRIZN FROM PLAT WHERE (P_PRED=";
var
Str:String;
begin
with DM do
begin
QueryFilter.Active:=False;
QueryFilter.SQL.Clear;
if ENazv_P.Text<>"" then Str:=Str+" AND (NAZV_P="""+ENazv_P.Text+""")";
if ERRax_P.Text<>"" then Str:=Str+" AND (RRAX_P="""+ERRax_P.Text+""")";
if ENazv_O.Text<>"" then Str:=Str+" AND (NAZV_O="""+ENazv_O.Text+""")";
if ERRax_O.Text<>"" then Str:=Str+" AND (RRAX_O="""+ERRax_O.Text+""")";
//Ошибка
if Start_D.Text<>"" then Str:=Str+" AND (DATA>="+Start_D.Text+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA<="+Stopt_D.Text+")";
QueryFilter.SQL.Add(Text+PREDN_PRED.AsString+")"+Str);
QueryFilter.Active:=True;
end;
end;

Пробовал так
if Start_D.Text<>"" then Str:=Str+" AND (DATA>="+"#"+Start_D.Text+"#"+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA<="+"#"+Stopt_D.Text+"#"+")";
Ошибок нет но записи соответствующие условию не отбираються
Так ошибка
if Start_D.Text<>"" then Str:=Str+" AND (DATA>="+"#"+FormatDateTime("mm.dd.yyyy",Start_D.Date)+"#"+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA<="+"#"+FormatDateTime("mm.dd.yyyy",Stopt_D.Date)+"#"+")";


sniknik   (2002-09-22 12:04:00) [1]

запусти Access сделай любой модуль (зайдеш в бейсик) и нажми F1, если в этот момент курсор будет стоять на имени функции то сразу получиш спровку типа этой. не будет стоять :-) поищеш в справочнике.

DateValue(date)
The required date argument is normally a string expression representing a date from January 1, 100 through December 31, 9999. However, date can also be any expression that can represent a date, a time, or both a date and time, in that range.

посмотри еще DateSerial, удобно составлять дату можно делать операции с датами непосредственно не через DateAdd.

DateSeparator- системная переменая разделитель даты, не уверен что в ней есть необходимость в данном случае, Jet по моему на нее внимания не обращает.
видел гдето в хелпе ссылку типа "установите этот параметр чтобы действовали системные настройки" но где не помню и по умолчанию это не действует.


RDA   (2002-09-22 09:39:00) [2]

Всем спасибо. Три дня мучений закончились. Особенную благодарсность выражаю sniknik - спасибо.

Рабочий вариант оказался таким:

procedure TfmFilter.SetFilter;
const
Text="SELECT N_PLAT, NOMER, DATA, NAZV_P, RRAX_P, NAZV_O, RRAX_O, SUMA, PRIZN FROM PLAT WHERE (P_PRED=";
var
Str:String;
begin
DateSeparator:="/";
with DM do
begin
QueryFilter.Active:=False;
QueryFilter.SQL.Clear;
if ENazv_P.Text<>"" then Str:=Str+" AND (NAZV_P="""+ENazv_P.Text+""")";
if ERRax_P.Text<>"" then Str:=Str+" AND (RRAX_P="""+ERRax_P.Text+""")";
if ENazv_O.Text<>"" then Str:=Str+" AND (NAZV_O="""+ENazv_O.Text+""")";
if ERRax_O.Text<>"" then Str:=Str+" AND (RRAX_O="""+ERRax_O.Text+""")";
if Start_D.Text<>"" then Str:=Str+" AND (DATA >= "+FormatDateTime("#dd/mm/yyyy#",Start_D.Date)+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA <= "+FormatDateTime("#dd/mm/yyyy#",Stopt_D.Date)+")";
QueryFilter.SQL.Add(Text+PREDN_PRED.AsString+")"+Str);
QueryFilter.Active:=True;
end;
DateSeparator:="."; // Не уверен что в этой строчке есть необходимость, ну да более мудрые товарищи подскажут - если захотят.
end;


>> aus А что это за функция DataValue


sniknik   (2002-09-21 23:13:00) [3]

когда делаеш равенство смотри на время. если забито в таблице то и в условии должно быть.


sniknik   (2002-09-21 23:10:00) [4]

А так?
SELECT * FROM PLAT WHERE DATA >= #18/09/2002# AND DATA <= #20/09/2002#


aus   (2002-09-21 22:38:00) [5]

Рабочий вариант:
select * from Table1 where Data = DateValue("01.01.02")


RDA   (2002-09-21 19:11:00) [6]

Хуже того
SELECT * FROM PLAT WHERE DATA=#19.09.02# - не отбирает записи, а они есть.


RDA   (2002-09-21 18:59:00) [7]

>>sniknik - устал. Сил нет с этим запросом.
SELECT * FROM PLAT WHERE DATA >= #18.09.02# AND DATA <= #20.09.02# - не работает.
SELECT * FROM PLAT WHERE DATA >= #18.09.02# - работает.

В базе всего две записи - обе с датой 19.09.02
Пробовал через промежуток с BETWEEN - не работает.


sniknik   (2002-09-21 18:37:00) [8]

ты сначала без формата простой запрос тестируй, а после переменные задавай а то непонятно

пример с аксесом работает
SELECT * FROM Billing WHERE Log = #29/03/1996 1:38:52#
сдесь и время т.к в этой базе лог одного дня (мне так видно что отбор идет)
но основное западло, если написать
SELECT * FROM Billing WHERE Log = #03/29/1996 1:38:52#
то в выборку попадут те же записи (по мне лутше бы в одном случае ошибка была)
т.е. 03/04 можно интерпретировать по разному, согласен?

выбрать промежуток
SELECT * FROM Billing WHERE Log BETWEEN #03/29/1996 1:38:52# AND #03/29/1996 1:39:29#
а вот тут если в одном условии написать 03/04 то выбор будет однозначен т.к. второе задает 03/29, 29 явно день месяцем быть не может. короче запутатся легко.


RDA   (2002-09-21 13:39:00) [9]

Ошибся
if Start_D.Text<>"" then Str:=Str+" AND (DATA>="+FormatDateTime("#dd.mm.yy#",Start_D.Date)+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA<="+FormatDateTime("#dd.mm.yy#",Stopt_D.Date)+")";


RDA   (2002-09-21 13:32:00) [10]

>> sniknik - не разобрался.
Дошел вот до чего
if Start_D.Text<>"" then Str:=Str+" AND (DATA>="+FormatDateTime("#dd.mm.yy#",Start_D.Date)+")";
if Stopt_D.Text<>"" then Str:=Str+" AND (DATA<="+FormatDateTime("#mm.mm.yy#",Stopt_D.Date)+")";

Если ввести только стартовую дату - фильтрует.
Если только конечную или обе - не фильтрует, но и ошибок не выдает.


sniknik   (2002-09-21 12:18:00) [11]

Access принимает два формата dd.mm.yyyy и mm.dd.yyyy без всяких установок на свое усмотрение. короче определенности нет.
завязывай боротся переходи на

Syntax
DateSerial(year, month, day)
The DateSerial function syntax has these named arguments:

пример
select DateSerial(1990 - 10, 8 - 2, 1 - 1)


RDA   (2002-09-21 11:52:00) [12]

>> пробовал - не помогает.
Кстати от чего зависит формат даты - не от региональных ли установок. Смотрел в Аксесе - дата в поле храниться нормально в соответствии с моими рег. установками "dd.mm.yyyy" - или она может только показывется в соответствии с установками - а храниться в другом формате?


Balu   (2002-09-21 11:20:00) [13]

Попробуй так:
FormatDateTime(" yyyymmdd hh:mm", Start_D.Date)
или так
FormatDateTime(" #mm/dd/yyyy hh:mm#", Start_D.Date)
Если время не нужно то без hh:mm.


Наверх

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