Ну что же, решил вспомнить старое. Если честно, то не по своей воле, а по просьбе одного читателя моего блога, который попросил показать, как можно выполнять запросы к БД MS Access и сравнивать в условии даты. По его словам у него возникли проблемы при сравнении дат (то есть по выборке записей, по условию дат), если тип поля в БД MS Access стоит — Дата/Время, то появляется примерно ошибки следующие:
- Неверный синтаксис SQL-запросов
- Несоответствие типов данных
Ну тут я предложу два варианта решения проблемы, возможно их и больше.
Первый вариант довольно простой. Создаем базу в MS Access, и создаем необходимые Вам поля (у меня id-Счетчик, dat-Текстовый), а поле, где должна находиться дата, указываем тип — Текстовый. То есть, у нас дата будет храниться, как обычный текст, записывать Вы сможете в любом формате (в котором Вам нужно), а делать SQL-запрос и в условии сравнивать текстовые значения — это без проблем, запрос будет выполнен без всяких синтаксических ошибок.
Давайте создадим наш проект. Тут немного, возможно, будет удивительно, но теперь большинство исходников будут выкладываться на блог в проекте Delphi XE. Это, во-первых, связано с переходом с Windows XP на Windows 7 (давно пора уже было это сделать).
В своем проекте, я установил следующие компоненты:
- TADOConnection
- TADOQuery
- TButton
Отображать данные, мы нигде не будем, а просто, для проверки выведем их в цикле, чтобы просто убедиться, что наш запрос выполнен правильно.
Вот такая у меня структура вышла моей БД.
А вот пример такого запроса, но не забывайте, что в БД Access в поле dat, стоит тип — Текстовый.
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
try
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT * FROM MyTable WHERE dat='''+'07.05.2011'+'''');
Active:=True;
for i := 0 to RecordCount-1 do
begin
ShowMessage(FieldByName('dat').AsVariant);
end;
end;
finally
//-//-//-//-//-//
end;
end;
Данный запрос, выводит одну запись, при следующих данных в таблице:
Что касается второго метода решения данной проблемы, то тут, мы будет устанавливать в поле dat тип - Дата/Время и установим формат — дд.мм.гггг (Краткий формат даты). Ниже приведена структура БД (поля и их тип данных).
Тут, нам необходимо будет использовать параметры. Для этого, выделяем компонент TADOQuery и в свойстве Parameters, создаем новый параметр, где в свойстве Name задаем — data, а в свойстве DataType - ftDataTime.
Дальше, на событие OnClick кнопки, пишем следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
try
with ADOQuery1 do
begin
SQL.Clear;
SQL.Add('SELECT * FROM MyTable WHERE dat=:data');
Parameters.ParamByName('data').Value:=FormatDateTime('dd.mm.yyyy',Date);
Active:=True;
for i := 0 to RecordCount-1 do
begin
ShowMessage(FieldByName('dat').AsVariant);
end;
end;
finally
//-//-//-//-//-//
end;
end;
При значениях в таблице:
У меня вывело 1 запись, что говорит о работоспособности запроса и программы в целом.
Ну и напоследок, хотел бы сказать, про сами запросы в MS Access, на выборку записей по условию даты. В самом MS Access, в запросе, дату в условии, необходимо заключать в знаки #. Пример:
SELECT * FROM MyTable WHERE dat BETWEEN #09.02.2011# AND #08.05.2011#
Но, в Delphi, данный метод не работает, поэтому приходится работать, при помощи параметров.
Исходники, скачать можно тут (Delphi XE, БД — MS Access 2010, сохраненная под MS Access 2003)
Похожие записи
Метки: Access, Ado, ADoconnection, AdoQuery, dbGo, MS Access, sql
Все проще, в коде делфи пишем:
Q1.Sql.Text:=’select * from table1 where date_fld = CDate(‘+Edit1.Text+’)';
Т.е поручим аксесу самому преобразовать наш текст в тип дата при выполнении запроса.
спасибо, тоже как вариант еще один будет
Именно то что искал, большое спасибо!
Интересует вопрос, нигде в нете не нашел достойного ответа, может подскажешь? Как с чекбоксами в DBGrideh работать (ADO, ACCESS)? На форумах везде реально, одни гипотезы, ни одного рабочего примера. Чтоб выбранные строки — выделенные галочками в DBGridEh, переносились в другой DBGRidEh.
На сколько я знаю, результат, выделенной галочки в таблице храниться как True False, на это и необходимо проверять данное поле, но так как под рукой нету у меня этого компонента, то точно сказать не могу, постараюсь в ближайшее время рассмотреть данную тему
Спасибо большое. Было бы очень интересно.
[…] Ну, а теперь, выборка записей, у которых установлен флажок. Для этого, мы частично, воспользуемся статьей. […]
https://www.youtube.com/watch?v=FeNlT4gtCg0 — Организация поиска по записям базы данных
Вопрос такой. Скачал исходник по ADOsqldat скомпилировал, в коде ошибка. Вы сами проверяли работоспособность приложения? Там параметр data не не найден. Я потерял уйму времени ломая голову в чем проблема у меня в коде программы, оказывается исходник рукосракий
все работоспособно под версию, в которой я компилировал!
Здраствуйте. у меня.такой вопрос. на dbgrid не
отображает данные таблицы.в таблице стоит слово memo1, memo2
Здраствуйте. у меня.такой вопрос. на dbgrid не
отображает данные таблицы.в таблице
стоит слово memo1, memo2. соединила дельфи
+ sql server manag.studio. помогите.срочна нужна