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

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

Неверно выполняется запрос SQL для поля Time [D3, D4, D5, D6, dBase, FoxPro]


vis79 ©   (2002-09-24 08:28:00) 

Такая ситуация нужно выбрать из таблиц информацию удовлетворящую некоторым условиям:
Select NDate, NTime, EVENT, FAM
From Mytest, MyFam
Where
(NDate >= "24.09.02") AND (NDate <= "26.09.02")
AND (NTime >= "00:00:00") AND (NTime <= "00:00:09")
AND (MyTest.ID_User = MyFam.Number)

Здесь для диапазона даты работает выборка, а для диапазона времени нет! В чем проблема??

У таблиц такая структура:
TableName:="mytest";
TableType:=ttDBase;
FieldDefs.Add("NTime", ftTime , 0, false);
ну и т.д.

А добавление записи в таблицу производиться так:
MyTable.InsertRecord([Date, TimeToStr(Time) , Edit1.Text, 1]);


vis79   (2002-09-24 12:55:00) [1]

>> KDS
диапазон времни здесь не принципиален, он был указан для отображения синтаксиса, здесь моя проблема была в отсутствии типа TIME как такового, в dBase!
Правильный ответ дал Anatoly Podgoretsky! см выше..


KDS   (2002-09-24 12:20:00) [2]

>(NTime >= "00:00:00") AND (NTime <= "00:00:09")
А что это за диапазон времени такой "узкий"??? Ааа?
Это получается девять секунд, начиная от полночи?
Синтаксис правильный, а в такой "узкий" диапазон
данные могут не попадать.
Проверь правильность заданияя диапазона времени сначала.


vis79   (2002-09-24 10:48:00) [3]

Воспользовавшись вашим первым ответом я просто сменил тип таблицы dBase на Paradox (для меня это не принципиально)...
TableType:=ttParadox;
в Paradox есть тип ftTime, поэтому запрос стабильно работает
GetCurrentDir я использую для того чтобы программа создавала таблицы и работала с ними не зависимо от того в какую директорию она будет скопирована... почему эта величина не постоянная, как она может меня подвести???
Что касается проверки: Самой первой строкой ее сделать нельзя так как именно на следующем этапе:
with MyTable do
begin
DatabaseName:=GetCurrentDir;
TableName:="mytest";
TableType:=ttDBase;
end;
я определяю что она будет загружена с диска
а вот то что ее нужно поставить перед определением полей я с вами согласень.

Спасибо большое за содействие!


Anatoly Podgoretsky   (2002-09-24 10:12:00) [4]

Да если есть еще вопросы, то я в чате


Anatoly Podgoretsky   (2002-09-24 10:11:00) [5]

Да но тип TIME для dBase VII это тип double, а для более низких версий вообще не поддержано, что касается FoxPro в нем тоже нет типа TIME, опять же не знаю как насчет Visual FoxPro как там с этим. Я бы тебе рекомендовал сделать поле с типом Char 8, в Дельфи это будет так Add("NTime", ftString, 8, false); вот в этом случае у тебя будет работать, а запись через преобразование TimeToStr(Time) как у тебя и сделано и наоборот StrToTime.
Запросы и фильтры тоже будут работать именно в той форме как у тебя записано.

По твоему коду проверку на существование таблицы надо делать самой первой строкой, а не в конце

If FileExists(GetCurrentDir+"\"+TableName+".dbf") then {Exit или что то другое};

и не стоит опираться на GetCurrentDir это величина не постоянная, лучше использовать фиксированное абсолютное или относительно местонахождения программы (видимо ты именно это хочешь). То же самое DatabaseName:=GetCurrentDir;

С уровнем также разберись, если нет особых оснований в использовании уровня 7, то смени его на 5 или даже 4, будет полезно. Это в BDE Admin


vis79   (2002-09-24 09:50:00) [6]

>> Anatoly Podgoretsky

Спасибо за ответ Анатолий, не могли бы вы меня просветить поподробнее. Буду очень благодарен.

Дело в том, что я не задумывался какая версия Dbase, я создаю таблицу из Делфей таким образом:
MyTable := TTable.Create(Nil);
with MyTable do
begin
DatabaseName:=GetCurrentDir;
TableName:="mytest";
TableType:=ttDBase;
{Создать поля}
with FieldDefs do
begin
Add("NDate", ftDate, 0, false);
Add("NTime", ftTime , 0, false);
Add("EVENT", ftString, 25, false);
Add("ID_User", ftInteger, 0, false);
end;
If not(Fileexists(GetCurrentDir+"\"+TableName+".dbf")) Then
CreateTable;
end;
DataSource1.DataSet := MyTable;
MyTable.Active := True;

И как я уже подчеркнул выше добавляю запись путем MyTable.InsertRecord([Date, TimeToStr(Time) , Edit1.Text, 1]);
Верно ли я добавляю в таблицу время??? ведь я не пишу просто Time, а сначало преобразовываю его в строку, для того чтобы в DB Grid оно отображалось нормально а не числом типа float

И далее если я буду использовать для поля Time строковое значение, то смогули я в запросе указать дипазон таким образом:
(NTime >= "00:00:00") AND (NTime <= "00:00:09")
или это необходимо сделать каким-то иным способом???


Anatoly Podgoretsky   (2002-09-24 09:15:00) [7]

Ты не пишешь, какая версия dBase и FoxPro у тебя, может в последних версиях и есть такой тип данных, не уверен, а так тип Time отсутствует как класс, тебе надо использовать тип char 8


Наверх

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