Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6308
Последний выпуск: 19.06.2015

Запрос с датой в Акцесс

1
16 марта 2012 года
kot_
7.3K / / 20.01.2000
Абсолютно тупая проблема, но не могу разобраться хоть убей.
Есть БД Access из которой надо выбрать данные.
Есть запрос который эти данные выбирает. В самом акцессе все прекрасно отрабатывает и не вызывает никаких проблем.
А вот в программе работать не хочет.
Запрос выглядит так:

 
Код:
SELECT *
FROM V_TypeCP INNER JOIN (V_CP INNER JOIN (V_FormCP INNER JOIN (M_CP INNER JOIN PerelZayav ON M_CP.MFS = PerelZayav.MFS) ON V_FormCP.id = PerelZayav.TYPE) ON V_CP.id = M_CP.ST_VID) ON V_TypeCP.id = M_CP.ST_TYPE
WHERE V_CP.VCP LIKE :cp AND date_start BETWEEN :dtbegin AND :dtend;

Соотвественно вызывается так:

 
Код:
adoListOrder->SQL->LoadFromFile(path+"\\scripts\\listorder.sql");
  adoListOrder->Prepared = true;
  adoListOrder->ParamCheck = true;
  adoListOrder->Parameters->ParseSQL(adoListOrder->SQL->Text,true);
  adoListOrder->Parameters->ParamByName("cp")->Value = st;
  adoListOrder->Parameters->ParamByName("dtbegin")->Value = StringReplace(FormatDateTime("mm.dd.yyyy",(begin)),".","/",TReplaceFlags() << rfReplaceAll );//FormatDateTime("mm/dd/yyyy",begin);
  adoListOrder->Parameters->ParamByName("dtend")->Value = StringReplace(FormatDateTime("mm.dd.yyyy",(end)),".","/",TReplaceFlags() << rfReplaceAll );//FormatDateTime("mm/dd/yyyy",end);
  adoListOrder->Active = true;

где соотвественно begin и end - переменные типа TDateTime. Все данные передаються так как и должно. Если в запрос подставить необходимые парамерты - все прекрасно выполняется. В программе возращает пустой датасет. В чем проблема не могу понять. Если убрать параметры - все данные выбираются. Мистика какаято.
247
16 марта 2012 года
wanja
1.2K / / 03.02.2003
Если поле DateStart - формата DateTime, то лучше и параметры передавать типа TDateTime.
1
16 марта 2012 года
kot_
7.3K / / 20.01.2000
это да. понятно. но оно что так, что DataTime - одинаковый эффект. В том то все и дело.
1
16 марта 2012 года
kot_
7.3K / / 20.01.2000
т.е. если полный код:

Код:
void __fastcall TdmMain::FillQuery(const String st, const TDateTime begin,const TDateTime end){
  adoListOrder->Active = false;
  cdsListOrder->Active = false;
  adoListOrder->SQL->Clear();
  String path = ExtractFilePath(Application->ExeName);
  adoListOrder->SQL->LoadFromFile(path+"\\scripts\\listorder.sql");
  adoListOrder->Prepared = true;
  adoListOrder->ParamCheck = true;
  adoListOrder->Parameters->ParseSQL(adoListOrder->SQL->Text,true);
  adoListOrder->Parameters->ParamByName("cp")->Value = st;
  adoListOrder->Parameters->ParamByName("dtbegin")->Value = begin;
  adoListOrder->Parameters->ParamByName("dtend")->Value = end;
  adoListOrder->Active = true;
  cdsListOrder->Active = true;
}

то же не работает.
Загадка какая то.
1
16 марта 2012 года
kot_
7.3K / / 20.01.2000
помоему я потихоньку еду крышей - почти любой запрос с where возвращает пустой набор данных.
385
17 марта 2012 года
SomewherSomehow
477 / / 25.07.2004
А если выполнить запрос, убрав вот этот кусочек "LIKE :cp AND", тоже пустой набор?
Я помню, там была какая-то засада с wild card символами, т.е. если в любом нормальном sql языка это like 'abc%', то в акцессе это like 'abc*', но возможно когда запрос выполняешь не в самом акцессе, то нужно оставить %, а о замене позаботится драйвер? Точно не помню, т.к. давно с акцессом не работал, но имхо, стоит попробовать.
1
17 марта 2012 года
kot_
7.3K / / 20.01.2000
Да, действительно, проблема была в этом. Необходимо вместо акцессовского вилкарда ставить нормальный. Да будут прокляты редмодовские индийские разработчики. :) Или их борландовские собратья - я уж не знаю.
Спасибо огромное.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог