Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Ошибка в SQL запросе!!! / 6 сообщений из 6, страница 1 из 1
21.08.2004, 22:31
    #32660180
Dionnis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в SQL запросе!!!
Добрый вечер всем! У меня такой вопрос:
Чрез ADO (из Delphi) выполняется следующий запрос (провайдер 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 не поддерживает?
Кто знает подскажите пожалуйста!
...
Рейтинг: 0 / 0
21.08.2004, 23:36
    #32660190
akrisiun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в SQL запросе!!!
Try this:

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, 3
ORDER BY 3 DESC
...
Рейтинг: 0 / 0
22.08.2004, 14:14
    #32660262
Dionnis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в SQL запросе!!!
При выполнении этого запроса:

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, 3
ORDER BY 3 DESC

Возникает другая ошибка:
Function argument value, type, or count is invalid
...
Рейтинг: 0 / 0
22.08.2004, 15:19
    #32660282
Dionnis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в SQL запросе!!!
В документации по провайдеру приведён пример:

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 )'
...
Рейтинг: 0 / 0
23.08.2004, 09:30
    #32660621
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в SQL запросе!!!
Так много ошибок сразу в таком маленьком запросе

-) О какой версии FoxPro идет речь?
-) Попробуй написать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT 
	POL, 
	VID, 
	RIGHT(DATR,  4 ) AS DR, 
	COUNT(*) AS KOLVO 
FROM DELO
WHERE (DATR >= {^ 1904 - 01 - 01 }) 
	AND (VID IN ( 1 , 2 , 3 )) 
	AND (SPOS <>  6 ) 
	AND (SPOS2 <>  6 ) 
	AND IsNull(POL)=.F.
	AND IsNull(DATR)=.F.
GROUP BY  1 , 2 , 3 
ORDER BY  3  DESC

Если Datr - это поле типа Date, то использовать для него функцию RIGHT() в принципе недопаустимо. Будет сообщение о несоответсвии типов аргумента. Для выделения года в этом случае используют функцию

YEAR(DATR)

NULL - это очень особенное значение. Проверять его любой функцией равенства не имеет смысла. Всегда получишь NULL, что для логических выражений интерпретируется как .F. Для проверки на NULL используется специальная функция

ISNULL()

Эта функция возвращает .T., если аргумент имеет значение NULL

Если необходимо сделать проверку одновременно на NULL и на пустое значение, то используют функцию

NVL(POL,0)<>0

Функция NVL возвращает значение первого аргумента, если он отличен от NULL, в противном случае, возвращается значение второго аргумента.

Начиная с версии VFP6 был введен специальный стандарт для констант типа DATE и DATETIME, который не зависит от текущих региональных настроек. Это формат вида:

{^YYYY-MM-DD HH:MM:SS}

В качестве радлеителя месяцев и дней межет выступать один из 3 символов:

{^YYYY\MM\DD}
{^YYYY-MM-DD}
{^YYYY.MM.DD}

Если Вы используете формат {01.01.1904}, то должны убедиться, что сделаны соответствующие региональные настройки в среде FoxPro:

SET STRICTDATE TO 0 && начиная с версии VFP6
SET DATE TO GERMAN
...
Рейтинг: 0 / 0
23.08.2004, 10:16
    #32660705
Dionnis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в SQL запросе!!!
Я не через FoxPro делаю, а через ADO (из DELPHI), используя провайдера Microsoft Visual FoxPro. DATR - поле типа Date! функция RIGHT действительно здесь не катит, хотя при импорте в Access запрос работает с данной функцией

SELECT POL, VID, YEAR(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 IS NOT NULL) AND (DATR IS NOT NULL) GROUP BY POL, VID, DR
ORDER BY DR DESC;

А выражения 'Значение <> NULL' и 'Значение IS NOT NULL' действительно не одно и то же. Выше указанный запрос теперь работает замечательно!
Спасибо большое за советы!!! 8-)
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Ошибка в SQL запросе!!! / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]