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

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

SQL-запрос [D5, D7, dBase, FoxPro]


Dionnis ©   (2004-08-21 21:39:00) 

Добрый вечер всем! У меня такой вопрос:
Чрез ADO выполняется следующий запрос (провайдер Microsoft OLE DB
Provider for Visual FoxPro) к dbf файлу:

SELECT POL, VID, RIGHT(DATR, 4) AS DR, COUNT(*) AS KOLVO FROM DELO
WHERE (DATR >= {01.01.1904}) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6)
AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, RIGHT(DATR, 4)
ORDER BY RIGHT(DATR, 4) DESC;

При его выполнении происходит ошибка:
SQL: GROUP BY clause is missing or invalid

Если выполнить импорт dbf файла в формат Accsess, то запрос замечательно работает.
В чём загвоздка? Или может синтаксис запроса драйвер для FoxPro не поддерживает?
Кто знает подскажите пожалуйста!


Dionnis   (2004-08-23 10:03:00) [1]


> WHERE (DATR >= %s) Это что? Если %s - это параметр, то стоит
> проверить, что ты в него передаешь. Может в таблице и нет
> DATR >= %s...


%s - это естественно параметр, просто забыл его на дату заменить.
А (<> NULL) и (IS NOT NULL) действительно не одно и то же!!!
Спасибо огромное за подсказки!!! Запрос теперь работает замечательно!


Flagman   (2004-08-22 21:22:00) [2]

WHERE (DATR >= %s) Это что? Если %s - это параметр, то стоит проверить, что ты в него передаешь. Может в таблице и нет DATR >= %s...

Попробуй условия по одному поубирать, глядишь и найдешь, где собака порылась ;)

Кстати, при сравнении с NULL обычно ставится не '= NULL' и '<> NULL', а 'is NULL' и 'is not NULL', хотя это, конечно, вряд ли повлияет... IMHO, скорее всего %s неправильно воспринимается...


Dionnis   (2004-08-22 20:57:00) [3]

> Посмотри, какая функция в FoxPro используется для преобразования
> в строку. Я ж говорю, что-то вроде, но за точность названия
> функции не ручаюсь.

Спасибо большое за подсказки, вроде нашёл то что нужно это функция Year(Date):

SELECT POL, VID, YEAR(DATR) AS DR, COUNT(*) AS KOLVO FROM DELO WHERE (DATR >= %s) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6) AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, DR ORDER BY DR DESC

Запрос выполняется и ошибок не возникает, но теперь мой Query (класса TADOQuery) возвращает RecordCount = 0; 8-((


Flagman   (2004-08-22 17:17:00) [4]

>Не в курсе, как эта функция называется в FoxPro

>А смотреть надо возможности провайдера, какой синтаксис он поддерживает

Посмотри, какая функция в FoxPro используется для преобразования в строку. Я ж говорю, что-то вроде, но за точность названия функции не ручаюсь.


Dionnis   (2004-08-22 17:13:00) [5]

Возможно вы правы, но только возникает другая ошибка:
'File 'date_to_str.prg' does not exist', то есть не находит такой функции.


Flagman   (2004-08-22 15:52:00) [6]

Насколько я понимаю, DATR - поле типа Date...
А RIGHT - строковая функция...

Попробуй привести к DATR к строке.

Не в курсе, как эта функция называется в FoxPro, но что-то вроде такого должно получиться:

SELECT POL, VID, RIGHT( DATE_TO_STR(DATR), 4) AS DR, COUNT(*) AS KOLVO FROM DELO
WHERE (DATR >= {01.01.1904}) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6)
AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, DR
ORDER BY DR DESC;

'Function argument value, type or count is invalid' - это он ругается на несовпадение типов в аргументе функции - т.е. RIGHT не работает напрямую с Date.


Dionnis   (2004-08-22 15:18:00) [7]

В документации по провайдеру приведён пример:

SELECT last_name,LEFT(notes,100) AS notes2 from employee GROUP BY last_name, notes2;

Но если написать мой запрос аналогично, т.е:
SELECT POL, VID, RIGHT(DATR, 4) AS DR, COUNT(*) AS KOLVO FROM DELO
WHERE (DATR >= {01.01.1904}) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6)
AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, DR
ORDER BY DR DESC;

Тогда возникает другая ошибка:
'Function argument value, type or count is invalid'

Вместо функции RIGHT(DATR, 4) пробовал писать EXTRACT(YEAR FROM DATR), т.е. запрос
выглядит следующим образом:

SELECT POL, VID, EXTRACT(YEAR FROM DATR) AS DR, COUNT(*) AS KOLVO FROM DELO
WHERE (DATR >= {01.01.1904}) AND (VID IN (1,2,3)) AND (SPOS <> 6) AND (SPOS2 <> 6)
AND (POL <> NULL) AND (DATR <> NULL) GROUP BY POL, VID, DR
ORDER BY DR DESC;

в этом
случае возникает ошибка:
'Function name is missing )'


Anatoly Podgoretsky   (2004-08-22 13:34:00) [8]

АДО к Localsql отношения не имеет. А смотреть надо возможности провайдера, какой синтаксис он поддерживает, вероятно ему не нравится групировка по функции.


Наталия   (2004-08-22 12:28:00) [9]

Я не слишком уверена, но разве в Localsql есть такая функция - RIGHT? Ты help смотрел?


Наверх

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