![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дата??? [D6, Access]
Alina © (2004-05-06 14:39:00)Привет Всем!
У меня такая проблема:
На форме находится 2 MaskEdit'а
_sulent (2004-05-07 09:57:00) [1]Можно было сделать и проще, все делать на уровне строк:
str_filter := 'select * from query_meet where (place_meet<=datevalue('''+MaskEdit1.Text+'''))and(place_meet>=datevalue('''+MaskEdit2.Text+'''))';
Alina (2004-05-07 09:09:00) [2]Всем за помощь огромное спасибо!!!
Параметризованный запрос к счастью не понадобился, все оказалось проще:
if (maskedit_date1.Text<>' . . ') and (maskedit_date2.Text<>' . . ') then
begin
str1:=MaskEdit_date1.Text;
str1:=FormatDateTime('mm'+'"/"'+'dd'+'"/"'+'yyyy',(strtodate(str1)));//преобразуем в строку с датой и применяем переменную str в запросе.
str2:=MaskEdit_date2.Text;
str2:=FormatDateTime('mm'+'"/"'+'dd'+'"/"'+'yyyy',(strtodate(str2)));//преобразуем в строку с датой и применяем переменную str в запросе.
edit_date1.Text:=str1;
edit_date2.Text:=str2;
str_filter:=str_filter+ ' and (date_meet Between #'+edit_date1.text+'# And #'+edit_date2.text+'#)' ;
end;
Еще раз всем спсб, и огромной удачи :-)
sniknik (2004-05-06 16:33:00) [3]Erik © (06.05.04 15:12) [10]
> sniknik
> Да кажется действительно перепутал не '-' а '/' должен быть. На Oracle 3 года сижу, вот уже и забывать стал.
да не синтаксс правильный, access/jet почти всеядный в этом случае, разделителями что угодно принимает.
я про даду в американском формате, ты сравни их в запросе и что аксесс вернет.
> А сейчас вообще не хочет. Даже с этим ## говорит, что
> Syntax Error in date in query expression '(place_meet<>"") and (date_meet>"12.12.03") and (date_meet<#"12.12.04"#))'
> Что мне делать, как преобразовать ее, что ли?
напиши правильно, а не свои вариации, и обе даты как показывал.
Мунька (2004-05-06 15:40:00) [4]Алина, сделайте параметризованный запрос, так, как показано в коде. В этом запросе не Вы заботитесь о преобразовании данных, поэтому Вам там не надо никаких StrToDate и "'+maskedit_date1.text+'"'
ParamByName(WideString("DTEB"))->Value = BDT - этим все сказано
Только! ГРАМОТНО преобразуйте текст из эдитов в дату ОТДЕЛЬНОЙ ПРОЦЕДУРОЙ, которая вам запишет эти даты в переменные TDateTime, ну что непонятного?
Alina (2004-05-06 15:33:00) [5]Не знаю, что-то не получается.
Он все время говорит, что DataType mismatch in expression, не панимаю это несовпадение типов. Пробовала сделать StrToDate, все равно не помогает...
Мунька (2004-05-06 15:22:00) [6]Параметризованный запрос, и проблем нет, пример
TDateTime BDT, EDT;
//Типа фильтр по дате sql_txt - строка запроса на удаление (можно на извлечение, как угодно)
if(CB_DateTime->Checked)
{
if( FormDateTimeInterval(BDT, EDT))
sqltxt += " AND (DateTimeEvent BETWEEN :DTEB AND :DTEE) ";
}
//DTEB, DTEE - это параметры запроса, FormDateTimeInterval(BDT, EDT) - процедура, которая формирует переменные типа TDateTime, причем должна формировать грамотно, так, чтобы BDT<=EDT, у меня дата берется из пикеров, ты возьми из своих эдитов.
ADODelHist->SQL->Clear();
ADODelHist->SQL->Add(sqltxt);
try
{
......................................
if(CB_DateTime->Checked)//здесь вообще можно число параметров запроса проверять или еще критерий найти
{
ADODelHist->Parameters->ParamByName(WideString("DTEB"))->Value = BDT;
ADODelHist->Parameters->ParamByName(WideString("DTEE"))->Value = EDT;
}
.....................................
if (!ADODelHist->Prepared)
ADODelHist->Prepared = true;
ADODelHist->ExecSQL() ;
// ADOConnectionDel->Connected = false;
}
catch(...)
{
ModalResult = mrCancel;
return;
}
P.S. Не обращай внимания на синтаксис Билдера - суть неизменна.
Erik (2004-05-06 15:12:00) [7]sniknik
Да кажется действительно перепутал не '-' а '/' должен быть. На Oracle 3 года сижу, вот уже и забывать стал.
TAdoStoredProc повторное присвоение параметров непроходит.
Голова она по умолчанию нужна, но ее нескачаеш.
Alina (2004-05-06 15:10:00) [8]Я раньше с этим работала, но там база была Paradox'овская и вот это работало
'select * from query_meet where date_meet< "'+maskedit_date1.text+'"'
А сейчас вообще не хочет. Даже с этим ## говорит, что
Syntax Error in date in query expression '(place_meet<>"") and (date_meet>"12.12.03") and (date_meet<#"12.12.04"#))'
Что мне делать, как преобразовать ее, что ли?
sniknik (2004-05-06 15:00:00) [9]> Строкоый формат даты в MsAccess всегда Американский и заключается в #. Пример: #12-25-2003#
ты не в курсе, выполни запросик для примера
SELECT #12-25-2003#, #25-12-2003#
> Но в ADO компонентах Delphi есть глюк.
в какой версии дельфей в какой поставке в каком месте? не втречал...
> Или использовать, чтото другое не ADO.
голову в первую очередь, справку, доки, ...
ADO ни при чем.
Erik (2004-05-06 14:54:00) [10]Строкоый формат даты в MsAccess всегда Американский и заключается в #. Пример: #12-25-2003#
А еще лучше сделать в MsAccess переметрический SQL и в него загружать пареметры, после запустить его. Но в ADO компонентах Delphi есть глюк. При повторном присвоении переметра он необновляет SQL даже если сделвть Close Open. Это легко исправляется присвоением одной переменой, но надо лезть в VCL :(
Или использовать, чтото другое не ADO.
sniknik (2004-05-06 14:54:00) [11]дату в фильтре обрамлять ## вроде этого #06/05/2004# и не наворачивай фильтр черезчур сложный модет не понять (с вложенными в скоби могут быть проблемы)
тогда событие onFilterRecord обрабатывай, там любая сложность пройдет.
Alina (2004-05-06 14:47:00) [12]Ну прям, лиж бы поиздеваться. Я просто не дописала.
Если знаете что делать, жду ваших ответов и предложений!!!!!
Alina (2004-05-06 14:46:00) [13]Так вот. Эти MaskEdit'ы с маской ввода даты: " . . ". И выглядят так: Дата: с ..... по .....
В таблице Access есть поле "Дата встречи" в кратком формате даты.
Проблема состоит в том, что при создании фильтра по дате не получается распознать дату.
Вот код, пожалуйста помогите!
procedure TForm_meetings.CheckBox_filterClick(Sender: TObject);
var
p1,p2,per_date_s,per_date_m,str_filter:string;
per_sum:integer;
begin
if CheckBox_filter.Checked=false then
begin
ADO_filter.Active:=false;
ADO_filter.SQL.Text:='select * from query_meet';
ADO_filter.Active:=true;
DBGrid1.DataSource:=DS_filter;
end
else
begin
if edit_place.Text<>'' then
str_filter:='select * from query_meet WHERE place_meet="'+edit_place.text+'"'
else
str_filter:='select * from query_meet where place_meet<>" " ';
{if (maskedit_date1.Text<>' . . ') and (maskedit_date1.Text<>'__.__.__') then
str_filter:=str_filter+ ' and (date_meet> StrToDate("'+maskedit_date1.text+'")) ' ;
if (maskedit_date2.Text<>' . . ') and (maskedit_date2.Text<>'__.__.__') then
str_filter:=str_filter+ ' and (date_meet< StrToDateTime(maskedit_date2.text)) ' ; }
{if (maskedit_date1.Text<>' . . ') and (maskedit_date1.Text<>'__.__.__') and (maskedit_date2.Text<>' . . ') and (maskedit_date2.Text<>'__.__.__') then
begin
p1:=maskedit_date1.Text;
p2:=maskedit_date2.Text;
str_filter:=str_filter+ ' and ('+''''+p1+'''<=Date_meet ) AND ('+''''+p2+'''>=Date_meet ) ' ;
end;}
if edit_group.Text<>'' then
str_filter:=str_filter+ 'and (group="'+Edit_group.Text+'") ';
if edit_name_firm.Text<>'' then
str_filter:=str_filter+ 'and (name_firm="'+edit_name_firm.text+'")';
if edit_manager.Text<>'' then
str_filter:=str_filter+ 'and (fio="'+edit_manager.text+'")';
ADO_filter.Active:=false;
ADO_filter.SQL.Text:=str_filter;
DBGrid1.DataSource:=DS_filter;
ADO_filter.Active:=true;
end;
ADO_filter.FieldByName('id_meet').Visible:=false;
ADO_filter.FieldByName('note_meet').Visible:=false;
ADO_filter.FieldByName('note_other').Visible:=false;
end;
Что я только не делала (поэтому все в комментариях) ничего не получается.
help плз.
Johnmen (2004-05-06 14:43:00) [14]Убери один.
Соловьев (2004-05-06 14:42:00) [15]
> Alina (06.05.04 14:39)
это не проблема :)
sniknik (2004-05-06 14:42:00) [16]ужас какой! ;о) аж целых два MaskEdit'а не позавидуеш. но не волнуйся это не тараканы они не разводятся, как было 2 так и останется.