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

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

выполнение запроса типа Дата в базе MSAccess [D7, MSAccess]


Bohdan ©   (2004-07-07 19:41:00) 

Здравствуйте. Подскажите пожайлуста как ликвидировать ошибку "Data type mismatch in criteria exgression!"Делаю так
...
    Active:= false;
    SQL.Clear;  
    SQL.Add('SELECT Pur_bayer_cod, Pur_price, Pur_percent, Pur_date From Purchases ');
    SQL.Add('WHERE Pur_date >= '+ #39+
    DateToStr(DateTimePickerStart.Date)+#39+' And Pur_date <= '+ #39+ DateToStr(DateTimePickerEnd.Date)+#39);
...
    Active:= true;
...

При работе в других базах ошибок никаких не возникает.
Но мне нужно в MSAccess. Перепробовал почти все форматы поля типа Дата, Уже не знаю что делать. Помогите, кто знает.


Rem   (2004-07-08 17:31:00) [1]

Кстати, в ADOQuery работает конструкция вида:
 'Дата >= ' + IntToStr(Trunc(DateTimePickerStart.Date))


sniknik   (2004-07-08 16:59:00) [2]

может быть потому что ты
TADOQuery(DBGridPur.DataSource.DataSet).Clear
забыл. (большего в этом коде чегото не видится, кроме того что повторное внесение тогоже запроса явное излишество ;о), достаточно значения параметров менять)

и к слову, конструкция такая мне не нравится TADOQuery(DBGridPur.DataSource.DataSet), уверен что гриду квери всегда подключена будет? а если ADODataSet попадется? у него проперти SQL нет. а вот в обратку, CommandText есть у обоих. хотя нет все одно не нравится. (не знаю ну было бs от Sender, чтобы универсальность кода была... но ты же грид явно указываеш. какой смысл?)


Bohdan   (2004-07-08 16:34:00) [3]

Уважаемый sniknikПодскажите еще пожалуйста, почему этот запрос срабатывает один только раз, а последующие результаты пустые?

procedure TFmStatPur.BitBtn1Click(Sender: TObject);
begin
 TADOQuery(DBGridPur.DataSource.DataSet).Close;
 TADOQuery(DBGridPur.DataSource.DataSet).SQL.Add('SELECT * FROM Purchases');
 TADOQuery(DBGridPur.DataSource.DataSet).SQL.Add(' WHERE Pur_date>=:DateStart AND Pur_date<=:DateEnd AND Vendor_ID<=:Vendor_ID');
 TADOQuery(DBGridPur.DataSource.DataSet).Parameters.ParamByName('DateStart').Value:= dtStart.Date;
 TADOQuery(DBGridPur.DataSource.DataSet).Parameters.ParamByName('DateEnd').Value:= dtEnd.Date;
// if RadioGroupAll.ItemIndex=1 then if BoxVendors.ItemIndex>=0 then
 TADOQuery(DBGridPur.DataSource.DataSet).Parameters.ParamByName('Vendor_ID').Value:= 1;
 TADOQuery(DBGridPur.DataSource.DataSet).Open;
end;


sniknik   (2004-07-08 13:36:00) [4]

> но почему-то обычный запрос не срабатывает...
формат даты в строковом выражении должен быть ... #01/01/2004# ... или #01-01-2004# проверь результирующий запрос перед выполнением, чтото у тебя не складывается.
проверь и не пользуйся никогда ;о), параметры лучше.


Bohdan   (2004-07-08 13:24:00) [5]

Спасибо sniknik, разобрался лучше с параметрами, и прошло, но почему-то обычный запрос не срабатывает...


sniknik   (2004-07-07 22:36:00) [6]

соображение такое огласи получающийся запрос чтобы виднее было.
добавка

...
SQL.Add('WHERE Pur_date >= #'+StringReplace(DateToStr(DateTimePickerStart.Date), '.', '/', rfReplaceAll)+'# And...

проследи чтобы разделитель точкой был, было что заменять, или сразу его указывай '/' или '-'.

но если и с параметрами не получается...
кстати тип параметра тоже неплохо указывать тем или иным образом (например .asDateTime)

и еще кстати несовпадение типа не обязательно может быть этой стороны... поле в базе какого?


Bohdan   (2004-07-07 21:04:00) [7]

to sniknik > я имел в виду что выставлял формат поля для даты (полный, длинный, средний, краткий) - это в настройках свойств поля самой базы MSAccess.
Но через
...StringReplace(DateToStr(DTStart.Date), '.', '/', [rfReplaceAll])...
тоже выдается та же ошибка :-((
Пробовал и через параметры вот так
 sSQL:= TADOQuery(DBGridPur.DataSource.DataSet).SQL.Text;
 TADOQuery(DBGridPur.DataSource.DataSet).Close;
 TADOQuery(DBGridPur.DataSource.DataSet).Parameters.ParamByName('DateStart').Value:= dtStart.Date;
 TADOQuery(DBGridPur.DataSource.DataSet).Parameters.ParamByName('DateEnd').Value:= dtEnd.Date;
 TADOQuery(DBGridPur.DataSource.DataSet).Parameters.ParamByName('Vendor_ID').Value:= 1;
 TADOQuery(DBGridPur.DataSource.DataSet).Open;

И все равно эта же ошибка...
Выставляю и так:
 DateSeparator := '.';
 ShortDateFormat := 'dd.mm.yyyy';


Какие еще будут соображения?


sniknik   (2004-07-07 20:37:00) [8]

...
SQL.Add('WHERE Pur_date >= '+ #39+
StringReplace(DateToStr(DateTimePickerStart.Date), '.', '/', rfReplaceAll)+#39+' And...


> Перепробовал почти все форматы поля типа Дата
да ну? это как? формат у поля даты один и это число, типа Double, а ты туда строки вижу пихаеш.
делай параметрами лучше.


Наверх

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