![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 смотрел?