Запрос с датой в Акцесс
Есть БД 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;
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;
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. Все данные передаються так как и должно. Если в запрос подставить необходимые парамерты - все прекрасно выполняется. В программе возращает пустой датасет. В чем проблема не могу понять. Если убрать параметры - все данные выбираются. Мистика какаято.
Если поле DateStart - формата DateTime, то лучше и параметры передавать типа TDateTime.
это да. понятно. но оно что так, что DataTime - одинаковый эффект. В том то все и дело.
Код:
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;
}
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;
}
то же не работает.
Загадка какая то.
помоему я потихоньку еду крышей - почти любой запрос с where возвращает пустой набор данных.
Я помню, там была какая-то засада с wild card символами, т.е. если в любом нормальном sql языка это like 'abc%', то в акцессе это like 'abc*', но возможно когда запрос выполняешь не в самом акцессе, то нужно оставить %, а о замене позаботится драйвер? Точно не помню, т.к. давно с акцессом не работал, но имхо, стоит попробовать.
Спасибо огромное.