Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.17;
Скачать: CL | DM;

Вниз

Неверно выполняется запрос SQL для поля Time   Найти похожие ветки 

 
vis79 ©   (2002-09-24 08:28) [0]

Такая ситуация нужно выбрать из таблиц информацию удовлетворящую некоторым условиям:
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]);


 
Anatoly Podgoretsky ©   (2002-09-24 09:15) [1]

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


 
vis79 ©   (2002-09-24 09:50) [2]

>> 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 10:11) [3]

Да но тип 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


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

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


 
vis79 ©   (2002-09-24 10:48) [5]

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

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


 
KDS ©   (2002-09-24 12:20) [6]

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


 
vis79 ©   (2002-09-24 12:55) [7]

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



Страницы: 1 вся ветка

Текущий архив: 2002.10.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.047 c
1-56073
Shluz
2002-10-08 15:54
2002.10.17
Динамичное получение данных


1-56210
AVeR
2002-10-07 20:21
2002.10.17
TSpeedButton


6-56248
Dash
2002-08-16 12:26
2002.10.17
Программа дозвона до провайдера (звонилка)


1-56156
Ghost.
2002-10-07 11:46
2002.10.17
OLE +EXCEL


1-56036
Zodik
2002-10-07 22:29
2002.10.17
Как пользовать компонент Chart