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

Вниз

SQL-запрос   Найти похожие ветки 

 
Dionnis   (2004-08-21 21:39) [0]

Добрый вечер всем! У меня такой вопрос:
Чрез 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 не поддерживает?
Кто знает подскажите пожалуйста!


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

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


 
Anatoly Podgoretsky ©   (2004-08-22 13:34) [2]

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


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

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

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 )"


 
Flagman ©   (2004-08-22 15:52) [4]

Насколько я понимаю, 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 17:13) [5]

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


 
Flagman ©   (2004-08-22 17:17) [6]

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

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

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


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

> Посмотри, какая функция в 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 21:22) [8]

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

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

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


 
Dionnis ©   (2004-08-23 10:03) [9]


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


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



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

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

Наверх




Память: 0.49 MB
Время: 0.044 c
4-1091862602
Михаил Багров
2004-08-07 11:10
2004.09.19
Вопрос про MDI


14-1093384383
123
2004-08-25 01:53
2004.09.19
Неизвестная песня


14-1093456378
Piter
2004-08-25 21:52
2004.09.19
Монитор LG-1910P


3-1093256010
vovchik
2004-08-23 14:13
2004.09.19
Как запихнуть html страницы в exe файл


6-1089878983
wild_arg
2004-07-15 12:09
2004.09.19
скроллирование TWebBrowser