|
Polina@ 0 / 0 / 0 Регистрация: 09.10.2012 Сообщений: 28 |
||||||||
|
1 |
||||||||
|
MS Access Число содержит синтаксическую ошибку в выражении запроса (дата)10.02.2015, 23:17. Показов 1472. Ответов 2 Метки нет (Все метки)
Выполняю следующий запрос:
В Edit3 ввожу 10.02.2010 В БД access поле «Дата» текстовое.
Помогите, пожалуйста!!!
__________________
0 |
|
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
10.02.2015, 23:17 |
|
2 |
|
northener пофигист широкого профиля 4599 / 3059 / 850 Регистрация: 15.07.2013 Сообщений: 17,624 |
||||
|
10.02.2015, 23:20 |
2 |
|||
1 |
|
KOPOJI Почетный модератор
16842 / 6720 / 880 Регистрация: 12.06.2012 Сообщений: 19,967 |
||||
|
10.02.2015, 23:21 |
3 |
|||
?
0 |
← →
Valerik ©
(2008-11-25 10:46)
[0]
Помгите пожалуйста с запросом!!!!
Form2.ADOQuery1.SQL.Add(«select * from Otchet Where data=»+DateTimePicker1.+»»);
Дает ошибку:Число содержит синтаксическую ошибку в выражении запроса «data=24.11.2008»
В чем может быть проблема?
![]()
![]()
← →
Valerik ©
(2008-11-25 10:47)
[1]
Извините опечатка, вот запрос:
Form2.ADOQuery1.SQL.Add(«select * from Otchet Where data=»+DateToStr(DateTimePicker1.Date)+»»);
![]()
![]()
← →
Sergey13 ©
(2008-11-25 10:50)
[2]
> [0] Valerik © (25.11.08 10:46)
> В чем может быть проблема?
В нежелании использовать параметры в запросе.
Where data=:data
![]()
![]()
← →
qqq
(2008-11-25 10:53)
[3]
> )+»»);
этот хвостик зачем?
![]()
![]()
← →
sniknik ©
(2008-11-25 10:55)
[4]
> Дает ошибку:Число содержит синтаксическую ошибку в выражении запроса «data=24.11.2008»
а разве нет? правильным с точки зрения любого sql сервера будет число с одной точкой между целой и дробной частью типа «data=24.11»
используй параметры.
![]()
![]()
← →
stas ©
(2008-11-25 11:22)
[5]
Valerik © (25.11.08 10:46)
Дата в Access записывается в диезах
data=#24.11.2008#
![]()
![]()
← →
Sergey13 ©
(2008-11-25 11:57)
[6]
> [5] stas © (25.11.08 11:22)
А в другой СУБД в бемолях. А через параметры едят все.
![]()
![]()
← →
qqq
(2008-11-25 13:10)
[7]
> stas © (25.11.08 11:22) [5]
это зло!
![]()
![]()
← →
Valerik ©
(2008-11-25 13:35)
[8]
Form2.ADOQuery1.Close;
Form2.ADOQuery1.SQL.Clear;
Form2.ADOQuery1.SQL.Add(«select * from Otchet Where data=:D1»); Form2.ADOQuery1.Parameters.ParamByName(«D1»).Value:=DateTimePicker1.Date;
Form2.ADOQuery1.Open;
Попробовал через параметры. Ошибки нет, но запрос возвращается пустым.
![]()
![]()
← →
Palladin ©
(2008-11-25 13:44)
[9]
значит нет ничего за эту дату
![]()
![]()
← →
Palladin ©
(2008-11-25 13:45)
[10]
у тебя поди в данных дата еще и со временем сидит…
![]()
![]()
← →
sniknik ©
(2008-11-25 14:03)
[11]
> у тебя поди в данных дата еще и со временем сидит…
по другому и не бывает, типа только дата в аксессе нет, и кстати DateTimePicker1.Date тоже не совсем Date…
![]()
![]()
← →
Valerik ©
(2008-11-25 14:08)
[12]
есть за эту дату данные. и функцию в Access задавал, что бы ставил только дату.
И все равно пусто.
![]()
![]()
← →
Правильный$Вася
(2008-11-25 14:09)
[13]
> есть за эту дату данные
начало и конец суток можешь определить?
BETWEEN юзай
![]()
![]()
← →
Palladin ©
(2008-11-25 14:11)
[14]
> sniknik © (25.11.08 14:03) [11]
) я имею в виду, что значение времени в данных не 0 (взял да поставил значение по умолчанию на поле Date()+Time()),
> и кстати DateTimePicker1.Date тоже не совсем Date
а вот это, кстати да, упущение с моей стороны, причина скорее всего наоборотная )
Form2.ADOQuery1.Parameters.ParamByName("D1").Value:=Trunc(DateTimePicker1.Date);
![]()
![]()
← →
Valerik ©
(2008-11-25 14:11)
[15]
Разобрался. Перевел дату в стринг и все заработало:
Form2.ADOQuery1.Parameters.ParamByName(«D1»).Value:=DateToStr(DateTimePicker1.Da te)
![]()
![]()
← →
Sergey13 ©
(2008-11-25 14:17)
[16]
> [15] Valerik © (25.11.08 14:11)
> Перевел дату в стринг и все заработало
Успехов тебе в нелегкой борьбе.
![]()
![]()
← →
sniknik ©
(2008-11-25 14:19)
[17]
> Перевел дату в стринг и все заработало:
ну это только на первый взгляд. ты просто перенес ошибку из очевидных в «плавающие» и трудно уловимые.
![]()
![]()
← →
sniknik ©
(2008-11-25 14:23)
[18]
> Form2.ADOQuery1.Parameters.ParamByName(«D1»).Value:=DateToStr(DateTimePicker1.Da te)
вместо этого выполни к примеру вот эту пару и сравни результат
Form2.ADOQuery1.Parameters.ParamByName(«D1»).Value:= «24.11.2008»;
и
Form2.ADOQuery1.Parameters.ParamByName(«D1»).Value:= «11.24.2008»;
![]()
![]()
← →
Valerik ©
(2008-11-25 14:50)
[19]
> вместо этого выполни к примеру вот эту пару и сравни результатForm2.
> ADOQuery1.Parameters.ParamByName(«D1»).Value:= «24.11.2008»;
> иForm2.ADOQuery1.Parameters.ParamByName(«D1»).Value:= «11.
> 24.200
Результат одинаковый)))
![]()
![]()
← →
Palladin ©
(2008-11-25 15:03)
[20]
> Valerik © (25.11.08 14:50) [19]
а так ?
Form2.ADOQuery1.Parameters.ParamByName(«D1»).Value:= «12.11.2008»;
и
Form2.ADOQuery1.Parameters.ParamByName(«D1»).Value:= «11.12.2008»;
![]()
![]()
← →
Valerik ©
(2008-11-25 15:20)
[21]
> а так ?Form2.ADOQuery1.Parameters.ParamByName(«D1»).Value:
> = «12.11.2008»;иForm2.ADOQuery1.Parameters.ParamByName(«D1»).
> Value:= «11.12.2008»;
А в чем разница????
![]()
![]()
← →
Palladin ©
(2008-11-25 15:39)
[22]
Это не разница. Это игра такая. Угадай где месяц. На какой машине.
![]()
![]()
← →
sniknik ©
(2008-11-25 15:42)
[23]
> А в чем разница????
дальтоник? нет разницы (в принципе задания. есть только в цифрах > 12 и <=), а результат для разных случаев различается. и подумай что будет если ты на таких недостоверных данных будешь к примеру зарплату начислять… побьют ведь (как минимум).
![]()
![]()
← →
stas ©
(2008-11-25 17:08)
[24]
Sergey13 © (25.11.08 11:57) [6]
qqq (25.11.08 13:10) [7]
Параметры параметрами, а синтаксис sql движка с которым работаешь надо знать.
![]()
![]()
← →
Правильный$Вася
(2008-11-25 18:39)
[25]
> stas © (25.11.08 17:08) [24]
многое нужно знать, а еще больше нужно знать, что делать НЕ надо
даже если есть такая возможность
![]()
![]()
← →
Palladin ©
(2008-11-25 18:41)
[26]
особенно для того, что бы потом не скакать по всему проекту исправляя запросы при смене СУБД
![]()
![]()
← →
stas ©
(2008-11-25 20:53)
[27]
>Правильный$Вася (25.11.08 18:39) [25]
Palladin © (25.11.08 18:41) [26]
Я нигде и не говорил что параметры не нужно использовать.
![]()
![]()
← →
Правильный$Вася
(2008-11-25 21:50)
[28]
> stas © (25.11.08 20:53) [27]
но ты и не говорил, что их нужно использовать
напротив, ты решительно подсовывал заведомо порочный способ
![]()
![]()
← →
Palladin ©
(2008-11-25 21:56)
[29]
негодяй! 😉
![]()
![]()
← →
Valerik ©
(2008-11-26 09:03)
[30]
> sniknik © (25.11.08 15:42) [23]
Ты думаешь я не понял, что разницы ни какой????
![]()
![]()
← →
Valerik ©
(2008-11-26 09:03)
[31]
Так может кто нибудь подсказать, как это делается правильно????
![]()
![]()
← →
Palladin ©
(2008-11-26 09:13)
[32]
> Valerik © (26.11.08 09:03) [31]
а ты всю ветку прочитал?
![]()
![]()
← →
stas ©
(2008-11-26 10:06)
[33]
Palladin © (25.11.08 21:56) [29]
))
Правильный$Вася (25.11.08 21:50) [28]
За параметры было написано в [4], зачем дублировать?
А я ничего не подсовывал ))
А сказал как правильно записывать запрос с использованием даты.
Я же не писал не слушай [4], а делай как в [5].
Valerik © (25.11.08 14:11) [15]
Если уже преобразовал в стринг, то нужно в такой формат YYYYMMDD, т.е.
20081126.
![]()
![]()
← →
Правильный$Вася
(2008-11-26 11:08)
[34]
> Если уже преобразовал в стринг, то нужно
не нужно!
параметр должен идти тем типом, какой он есть «в натуре», без всяких преобразований, которые даже если не обманывают СУБД (что часто случается), то вынуждают его делать обратные преобразования, что и накладно по времени/ресурсам, и может привести к неверному обратному преобразованию
и при нормальном «тип-в-тип» использовании параметров нет никакой необходимости помнить все эти бредовые недоформаты, специфичные для каждой СУБД каждой ее версии на каждой локали под каждой учеткой
![]()
![]()
← →
Sergey13 ©
(2008-11-26 11:49)
[35]
> [34] Правильный$Вася (26.11.08 11:08)
> параметр должен идти тем типом, какой он есть «в натуре»,
Как я понял, он у автора так и идет. Его проблема в том, что у него в БД дата в строке хранится.
![]()
![]()
← →
Palladin ©
(2008-11-26 12:00)
[36]
> Его проблема в том, что у него в БД дата в строке хранится.
хто сказал? variant — содержащий строковые данные при попытке обратиться к нему как к TDateTime будет пытаться преобразовать эту строку
![]()
![]()
← →
Anatoly Podgoretsky ©
(2008-11-26 12:34)
[37]
> Sergey13 (26.11.2008 11:49:35) [35]
Тогда это не дата, а набор символов.
![]()
![]()
← →
sniknik ©
(2008-11-26 13:02)
[38]
> Ты думаешь я не понял, что разницы ни какой????
ты это спросил, я на это ответил, а уж что я там при этом думал дело десятое.
но раз спрашиваешь отвечу и на это, думаю ты и сейчас ничего не понимаешь (не хочешь, хотя все написано тут же, но мозг почему то написанное частично не воспринимает…)
судя по
> Так может кто нибудь подсказать, как это делается правильно????
> Если уже преобразовал в стринг, то нужно в такой формат YYYYMMDD, т.е. 20081126.
не путай акцесс и мсскл
> Его проблема в том, что у него в БД дата в строке хранится.
вряд ли. если бы у него была строка мой тест не сработал бы.
![]()
![]()
← →
stas ©
(2008-11-26 13:05)
[39]
>sniknik © (26.11.08 13:02) [38]
Это вроде любая СУБД правильно понимает.
![]()
![]()
← →
sniknik ©
(2008-11-26 13:13)
[40]
> Это вроде любая СУБД правильно понимает.
а ты проверь… и огласи список.
если уж нужен строковый формат для любой(вернее для как можно большего количества, любая это слишком самоуверенно) то тогда надо брать формат представления odbc 2008-11-26, «засилье» odbc было длительным и многие вводили поддержку и ради совместимости будут держать дальше. тогда их будет больше, но не все естественно.
![]()
![]()
|
|
|
|

Запрос по дате
, Создание запроса по дате
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
|
|
Уважаемые господа! |
Chow |
|
|
Используй параметры:
… SQL.Add(‘(Date=:P_DATE)’); SQL.ParamByName(‘P_DATE’).Value = DateEdit.Date; … |
|
nikvicfc |
|
|
Спасибо за такой быстрый ответ, но к сожалению не компилируется. |
Bas |
|
|
Цитата nikvicfc, 8.10.04, 15:48 SQL.Add(‘(Date=»’+DateEdit.EditText+»’)’);
‘(Date=#’+DateEdit.EditText+’#)’ |
|
nikvicfc |
|
|
Уважаемый Master! |
|
Kobra |
|
|
Цитата nikvicfc, 8.10.04, 15:48 SQL.Add(‘(Date=»’+DateEdit.EditText+»’)’); тут кажется ошибки нет, но дату нужно вводить соответствующим форматом. точно не помню но кажется YYYY-MM-DD. |
|
shilnik |
|
|
Если выдается именно (дословно) такая ошибка: Цитата ‘Дата содержит синтаксическую ошибку в выражении запроса ‘(Date=##)»
то это значит, что DateEdit.EditText имеет пустое значение. Иначе было бы: |
Bas |
|
|
Цитата nikvicfc, 11.10.04, 09:04 ‘Дата содержит синтаксическую ошибку в выражении запроса ‘(Date=##)».
В Accesse дату принято заключать в #. |
|
nikvicfc |
|
|
Уважаемые господа! Сообщение отредактировано: nikvicfc — 11.10.04, 10:05 |
Bas |
|
|
Цитата nikvicfc, 11.10.04, 13:01 ‘(Date=#11.10.2004#)». А так (Date=#11/10/2004#)
WHERE (((Заказы.ДатаРазмещения)=#7/26/1996#)); |
|
pigas |
|
|
слово DATE зарезервировано стандартом ANSI/iso sql92. |
|
nikvicfc |
|
|
Уважаемый Master! |
|
Mamont |
|
|
Member
Рейтинг (т): 4 |
Я работаю на Delphi 7 с использованием DBExpress Компонет. Цитата
SQLQuery1.Close;
Он ругается : «dbExpress Error: Invalid Field Type» Сообщение отредактировано: Mamont — 12.10.04, 06:23 |
Chow |
|
|
Какой текст запроса полностью? Добавлено 12.10.04, 06:11 Цитата Mamont, 12.10.04, 09:07 ‘insert into (now_date) values (:date)’ Где здесь указано имя таблицы? |
|
Mamont |
|
|
Member
Рейтинг (т): 4 |
Забыл сказать, что тоже компилирует он нормально, ошибка возникает воремя обращения. Добавлено 12.10.04, 06:14 Цитата SQLQuery1.SQL.Text:=’insert into history (now_date) values (:date)’; Это я когда пост писал, забыл написать. В проге название таблицы присутствует. |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Базы данных
- Следующая тема
[ Script execution time: 0,1237 ] [ 16 queries used ] [ Generated: 28.01.23, 18:02 GMT ]
Типов сообщений компилятора — более двухсот. Рассмотрим перечень наиболее встречающихся сообщений класса Error
- 0. <Что-то1> expected but <Что-то2> found. Обычно это сообщение возникает при синтаксической ошибке.Например,в случае небаланса скобок,компилятор сообщит: ‘)’ expected but ‘;’ found (вместо ожидавшейся скобки найдена запятая).
Компилятор часто сообщает, что ‘end’ ожидается,например:x:= 5,7; здесь неуместен разделитель-запятая, а сообщается про end. (‘END’ expected but ‘,’ found)
- 1. <Имя> is not a type identifier. Данное <Имя> не является именем типа.
- 2. ‘;’ not allowed before ‘Else’. Перед else нельзя ставить точку с запятой
- 3. Abstract method must be virtual or dynamic. Абстрактный метод должен быть виртуальным или динамическим.
- 4. Ambiguous overloaded call to <Имя блока>. Компилятор не может однозначно выбрать перегружаемый блок. Измените параметр.
- 5. Array type required. Ошибка возникает в случаях, когда в индексе элемента массива указано больше уровней, чем предусмотрено описанием, и если массив не описан. Например, после объявления двумерного массива х или простой переменной х ошибочно записывают элемент х[2,1,1] (в нем показано три измерения).
- 6. Assignment to FOR-loop variable <Имя>. Присваивание значения параметру FOR-цикла в теле цикла.
Например, вследствие описки дважды используется имя i в кратном цикле:
For i:= 1 to n do For i:= 1 to m do ...
- 7. Break or Continue outside of loop. Break или Continue — не в цикле.
- 8. Cannot initialize local variables. Локальные переменные запрещено инициализировать (задавать им значения при описании).
- 9. Cannot assign to/read a read-only/write-only property. Присвоение значения свойству read/only и чтение свойства write/only запрещены.
- 10. Constant expression expected.В этом месте должна стоять константа или константное выражение, например константа выбора в структуре Case.
- 11. Constant expression violates subrange bounds. Выход значения константы из диапазона. Контроль не полон. Например, «сойдет с рук» присваивание x:=3000000000, где х имеет тип integer, но начение х будет искажено.
- 12. Constant or type identifier expected. Требуется имя типа или тип-диапазон.
- 13. Could not compile used unit <Имя>. Компиляция присоединенного модуля <Имя> невозможна.
- 14. Data type too large. Тип определяет структуру размером более 2 Гбайт; это слишком много.
- 15. Declaration expected but <Что-то> found. Пропущено описание или оператор.
- 16. Declaration of <Имя> differs from previous declarations… Данный заголовок блока не соответствует упреждающему объявлению блока.
- 17. Default parameter <Имя> must be by-value or constant. Необязательный параметр (со значением по умолчанию) не должен вызываться по ссылке.
- 18. Expression expected. В этом месте программы должно стоять выражение.
- 19. Expression too complicated. Выражение излишне сложно для компиляции.
- 20. File type not allowed here. В этом месте или в этой роли файловую переменную нельзя использовать. Например, она не может быть формальным параметром-значением.
- 21. For loop control variable must be simple local variable. Параметр цикла должен быть простой локальной (описанной в этом же блоке) переменной.
- 22. For loop control variable must have ordinal type. Параметр цикла должен иметь порядковый тип.Вещественный тип запрещен.
- 23. Function needs result type. В заголовке функции надо указывать тип ее результата.
- 24. Identifier expected but <Что-то> found. В этом месте должно стоять имя. Например, пропущено имя функции после Function.
- 25. Identifier redeclared <Имя>.<Имя> описано повторно, но в пределах блока имя можно описать лишь раз. Проверьте, не обозначена ли локальная переменная тем же именем, что и формальный параметр блока.
- 26. Illegal character in input file <знак>. Запретный знак, например «русская» буква, либо вы оставили скобку }, убрав открывающую скобку {.
- 27. Illegal type in Read/Readln (Write/Writeln) statement. Элемент запрещенного типа в списке ввода/вывода.
- 28. Incompatible types <указание типов>. Несоответствие типов по присваиванию или типов операндов одной операции. Сообщение выдается и при неверном использовании структур. Например, z — запись, ошибочно записано присваивание z:= 0 (работать надо с полями записи).
- 29. Invalid function result type. Недопустимый тип результата функции.
- 30. Label already defined: <Метка>. <Метка> уже помечает другой оператор.
- 31. Left side cannot be assigned to. He может быть такой левой части в присваивании. Примеры: попытка присвоить значение файловой переменной, присвоение значения формальному параметру-константе.
- 32. Line too long. В строке программного текста больше 255 знаков.
- 33. Low bound exceeds high bound. Нижняя граница превышает верхнюю.
- 34. Missing operator or semicolon.Пропуск операции (например перед скобкой) или пропуск точки с запятой. При пропуске ‘;’ маркер ошибки стоит на очередном предложении (объявлении или операторе).
- 35. Missing parameter type. He указан тип формального параметра-значения или параметра процедурного типа.
- 36. Not enough actual parameters. He хватает фактических параметров.
- 37. Need to specify at least one dimension … Нужно задавать в операторе SetLength хотя бы один размер динамического массива.
- 38. Number of elements differs from declaration. Число элементов в структурной константе не соответствует ее описанию.
- 39. Operator not applicable to this operand type. Операция не применима к операндам данного типа. Например: ‘А’ or ‘В’; ‘Text1’* ‘Text2’.
- 40. Order of fields in record constant differs from declaration. Порядок полей в записи-константе не соответствует описанию записи.
- 41. Ordinal type required. Требуется порядковый тип (например, в индексе).
- 42. Out of memory. Компилятору не хватает памяти.
- 43. Statement expected but <Что-то> found. В этом месте должен стоять оператор. Сообщение выдается во всех случаях, когда в тело блока или секцию инициализации ошибочно помещают описание (<Что-то>). Ошибочная форма обращения к процедуре Procedure <Имя> или к функции Function <Имя> также вызывает сообщение.
- 44. Sets may have at most 256 elements. Множество (тип Set) не может содержать более 256 элементов.
- 45. Slice standard function only allowed as open array argument. Функцию Slice можно использовать лишь как фактический параметр
- 46. Statement not allowed in interface part. Предложения в секции интерфейса программного модуля недопустимы.
- 47. Syntax error in real number. Синтаксическая ошибка в записи числа вещственного типа.
- 48. There is no overload version of <Имя> that can be called with these arguments.Не предусмотрен перегружаемый блок <Имя>, который мог бы вызываться с таким аргументом. Пример: IntToStr(x), где х – выражение вещественного типа.
- 49. Too many actual parameters. Фактических параметров больше, чем формальных.
- 50. Type actual and formal var parameters must be identical. Тип фактического параметра должен быть идентичен типу формального параметра-переменной.
- 51. Type of expression must be <Тип>. Выражение должно быть указанного типа. Например,после While и Until должно стоять логическое выражение.
- 52. Undeclared identifier: <Имя>.Не описано <Имя>. Проверьте есть ли описание в нужном месте,нет ли описок в имени. Если указано имя компонента формы, проверьте,поместили ли компонент на данную форму.
- 53. Unexpected end of file in comment started on line <N>. Неожиданный конец файла при незавершенном комментарии, начало комментария — в строке N.
- 54. Unit name mismatch: <Имя>. Имя модуля ошибочно.
- 55. Unsatisfied forward or external declaration <Имя>. Отсутствует описание блока, объявление которого было дано (заголовок в интерфейсе или в описании объектного типа, либо упреждающее описание).
- 56. Unterminate string. He закрыта апострофом строка-константа типа string.
Рассмотрим также некоторые сообщения классов warning и hint.
- Return value of function <Имя> might be undefined. В теле функции нет присваивания ее результата.
- Variable <Имя> might not have been initialized. Указывает имя переменой, которой не задали значения.
- For-Loop variable <Имя> may be undefined after loop. Попытка использования значения параметра For-цикла после завершения этого цикла.
- Text after final ‘END.’ ignored by compiler. Текст, идущий за конечной строкой модуля, игнорируется компилятором.
- Variable <Имя> is declared but never used in <Имя блока>. Обращает внимание на переменную <Имя>, описанную,но не нашедшую применения.
- Value assigned to <Имя> never used. Хотя бы одно значение переменной <Имя> никак не использовано.
Несколько рекомендаций
Сосредотачивайтесь на первом сообщении компилятора. Исправление хотя бы одной ошибки и повторная компиляция может значительно уменьшить число сообщений об ошибках,поэтому не упорствуйте, стремясь понять сразу причину каждого сообщения.
Не удаляйте прежний вариант кода,пока не убедитесь,что ошибка устранена. Лучше на время закомментировать код,заключив его в скобки: { код }
Компилятор не анализирует, как будет выполняться программа, поэтому выход значения индекса из диапазона выявляет только если индекс задан константным выражением. Деление на ноль вообще пропускается, кроме оператора div, в случае если делитель — константное выражение.
I keep getting the same error when I try and get info from my MS access database. Below is my coding.
var
iTemp, iX, iY, k : Integer;
sDate : String;
begin
iTemp := 0;
DB.Close;
DB.SQL.Add('SELECT Count(UserID) AS Total FROM tblResults;');
DB.Parameters.ParamByName('ID').Value := pID;
DB.ExecSQL;
DB.Open;
iTemp := DB.FieldByName('Total').AsInteger;
if iTemp = 0 then
ShowMessage('Sorry but we do not have any test results for you. Take a test and check your result !')
else
Begin
DB.Close;
DB.SQL.Add('SELECT Mark,DateTested AS Total FROM tblResults WHERE UserID=:ID;');
DB.Parameters.ParamByName('ID').Value := pID;
DB.ExecSQL;
DB.Open;
for k := 1 to iTemp do
Begin
iX := k;
iY := DB.FieldByName('Mark').AsInteger;
sDate := DB.FieldByName('DateTested').AsString;
Chart1.Series[0].AddXY(iX,iY,sDate,clTeeColor);
DB.Next;
End;
Db.Close;
End;
The error is
Syntax errpr. in query expression ‘Username=»SELECT Count(UserID) AS Total FROM tblResults’
I really do not undertand this error. Please help me get this thing working.
![]()
Gord Thompson
113k30 gold badges203 silver badges404 bronze badges
asked Oct 27, 2013 at 19:18
1
I don’t know Delphi (only MS Access), but one thing in your code still looks strange to me:
Your error message says that the error occurs «in query expression ‘Username=»[the SQL string from your code].
You passed the SQL string to your query with this code:
DB.SQL.Add('SELECT Count(UserID) AS Total FROM tblResults;');
As you are using DB.SQL.Add('...') (and not something like DB.SQL = '...'), I suspect that maybe DB.SQL already contains something at the beginning of your code.
Where else should the 'Username= part come from?
answered Oct 27, 2013 at 19:31
Christian SpechtChristian Specht
35.4k14 gold badges130 silver badges181 bronze badges
1
I keep getting the same error when I try and get info from my MS access database. Below is my coding.
var
iTemp, iX, iY, k : Integer;
sDate : String;
begin
iTemp := 0;
DB.Close;
DB.SQL.Add('SELECT Count(UserID) AS Total FROM tblResults;');
DB.Parameters.ParamByName('ID').Value := pID;
DB.ExecSQL;
DB.Open;
iTemp := DB.FieldByName('Total').AsInteger;
if iTemp = 0 then
ShowMessage('Sorry but we do not have any test results for you. Take a test and check your result !')
else
Begin
DB.Close;
DB.SQL.Add('SELECT Mark,DateTested AS Total FROM tblResults WHERE UserID=:ID;');
DB.Parameters.ParamByName('ID').Value := pID;
DB.ExecSQL;
DB.Open;
for k := 1 to iTemp do
Begin
iX := k;
iY := DB.FieldByName('Mark').AsInteger;
sDate := DB.FieldByName('DateTested').AsString;
Chart1.Series[0].AddXY(iX,iY,sDate,clTeeColor);
DB.Next;
End;
Db.Close;
End;
The error is
Syntax errpr. in query expression ‘Username=»SELECT Count(UserID) AS Total FROM tblResults’
I really do not undertand this error. Please help me get this thing working.
![]()
Gord Thompson
113k30 gold badges203 silver badges404 bronze badges
asked Oct 27, 2013 at 19:18
1
I don’t know Delphi (only MS Access), but one thing in your code still looks strange to me:
Your error message says that the error occurs «in query expression ‘Username=»[the SQL string from your code].
You passed the SQL string to your query with this code:
DB.SQL.Add('SELECT Count(UserID) AS Total FROM tblResults;');
As you are using DB.SQL.Add('...') (and not something like DB.SQL = '...'), I suspect that maybe DB.SQL already contains something at the beginning of your code.
Where else should the 'Username= part come from?
answered Oct 27, 2013 at 19:31
Christian SpechtChristian Specht
35.4k14 gold badges130 silver badges181 bronze badges
1
- MOV
- Постоялец

- Сообщения: 414
- Зарегистрирован: 13.03.2004 (Сб) 15:13
- Откуда: Санкт-Петербург
Ошибка в SQL-запросе
Вот запрос в Accesse:
- Код: Выделить всё
Dim i As Date
DoCmd.RunSQL "UPDATE DailySales SET DailySales.dn =" + g + " WHERE DailySales.Data = " + Format( i, "DD.MM.YYYY")
Ругается что: Число содержит синтаксическую ошибку в выражении запроса ‘DailySales.Data= 01.07.2004’
Поле Data в таблице и переменная в условии запроса (i) имеют тип дата. Пробовал без форматирования даты и менять формат даты самого поля таблицы (сейчас там краткий формат). Все-таки что-то не то с типами. i форматировал по разному.
Если записать просто Format( i, «DDMMYYYY»), то зарос проходит, но дат в таблице не находит, чтобы обновить, а они есть.
Может кто-то точно знает в чем причина?
- Leon_
- Постоялец

-
- Сообщения: 333
- Зарегистрирован: 19.05.2004 (Ср) 16:31
- Откуда: Moscow
-
- ICQ
Leon_ » 12.07.2004 (Пн) 10:41
Попробуй Format$(i, «#mm-dd-yyyy#).
Off. Не лучше ли для конкатенации строк использовать & вместо + ?
- MOV
- Постоялец

- Сообщения: 414
- Зарегистрирован: 13.03.2004 (Сб) 15:13
- Откуда: Санкт-Петербург
MOV » 12.07.2004 (Пн) 11:13
пишу так Format$(i, «#DD.MM.YYYY#») в ошибке вообще косяк выдается:
Ошибка синтаксиса (пропущен оператор) в выражении запроса ‘DailySales.Data= 3816DD-MM-YYYY9’
(это дословно). ![]()
Если пишу без символа «#», а=просто
Format$(i, «DD.MM.YYYY») он съедает, но дат все равно в таблице не находит ![]()
Off. Не лучше ли для конкатенации строк использовать & вместо + ?
Я часто встречал раньше, что что-то работает быстрее, но все время забываю что именно и проверять пока некогда. Поэтому пишу «+», тоже нормально пашет.
- alibek
- Большой Человек

- Сообщения: 14204
- Зарегистрирован: 19.04.2002 (Пт) 11:40
- Откуда: Russia
alibek » 12.07.2004 (Пн) 11:21
Format$(i, «#mm/dd/yyyy#»)
Lasciate ogni speranza, voi ch’entrate.
- Leon_
- Постоялец

-
- Сообщения: 333
- Зарегистрирован: 19.05.2004 (Ср) 16:31
- Откуда: Moscow
-
- ICQ
Leon_ » 12.07.2004 (Пн) 11:24
Я использую такую функцию везде, где нужна форматированная для Access дата:
- Код: Выделить всё
Public Function fl_ConvToStrDt(ByVal dtDate As Date) As String
'конв "#12-31-1999#"
Dim sDate As StringsDate = Format$(dtDate, "mm-dd-yyyy hh:mm:ss")
sDate = "#" & sDate & "#"
fl_ConvToStrDt = sDate
End Function
т.е. не в Format сразу вставляю «#», а во второй строке. Может, в этом дело?
- MOV
- Постоялец

- Сообщения: 414
- Зарегистрирован: 13.03.2004 (Сб) 15:13
- Откуда: Санкт-Петербург
MOV » 12.07.2004 (Пн) 11:56
Мда ![]()
Ни один вариант не проходит. Эксперементировал по разному.
А если и проходит, то не ловит даты в таблице. Попробую поле даты сделать строковым или как нибудь по другому, чтобы обойти этот косяк.
Спасибо. Моежет вернусь к вопросу позже.
- Leon_
- Постоялец

-
- Сообщения: 333
- Зарегистрирован: 19.05.2004 (Ср) 16:31
- Откуда: Moscow
-
- ICQ
Leon_ » 12.07.2004 (Пн) 12:08
Должно все быть Ок.
1) Попробуй сначала делать не UPDATE запрос, а SELECT, чтобы проверить правильность условий.
2) Проверь, что дата форматируется как MM-DD-YYYY («американский» формат даты), а не DD-MM-YYYY.
- Leon_
- Постоялец

-
- Сообщения: 333
- Зарегистрирован: 19.05.2004 (Ср) 16:31
- Откуда: Moscow
-
- ICQ
Leon_ » 12.07.2004 (Пн) 12:11
Поле даты не надо делать строковым, это изврат и гемор.
Лучше покажи код, что не получился и формат таблицы DailySales.
- MOV
- Постоялец

- Сообщения: 414
- Зарегистрирован: 13.03.2004 (Сб) 15:13
- Откуда: Санкт-Петербург
MOV » 12.07.2004 (Пн) 13:04
Поле даты не надо делать строковым, это изврат и гемор
Согласен. Но в данном случае это выход, т.к. таблица вспомогательная и ни на что не завязана это просто отчет, поэтому главное, чтобы он работал.
Лучше покажи код, что не получился и формат таблицы DailySales.
Это код:
- Код: Выделить всё
Private Sub Кнопка35_Click()
DoCmd.RunSQL "DELETE * FROM [DailySales]"
Dim dbsTemp As Database, i As Date
Set dbsTemp = CurrentDb
Dim g As String
g = "1"
For i = CDate(Me.fldDateFrom) To CDate(Me.fldDateTo)ConnectOutput dbsTemp, _
"dBASETable", _
"dBase IV;DATABASE=D:ARCHIVSALEARCH", _
"SALE" & Format(Month(i), "00") & Format(Day(i), "00")DoCmd.RunSQL "INSERT INTO DailySales ( Data, Store, Amount ) " & _
"SELECT dBASETable.DATE, dBASETable.STORE, Sum(IIf([OPERATION]='P',[DELTASUM],-[DELTASUM])) AS Amount " & _
"FROM dBASETable GROUP BY dBASETable.DATE, dBASETable.STORE"DoCmd.RunSQL "UPDATE DailySales SET DailySales.dn =" + g + " WHERE DailySales.Dn IS NULL AND DailySales.Data= '" + Format(i, "dd.mm.yyyy") + "'"
dbsTemp.TableDefs.Delete "dBASETable"
g = Str(Val(g) + 1)' за тот же день предыдущей недели
ConnectOutput dbsTemp, _
"dBASETable", _
"dBase IV;DATABASE=D:ARCHIVSALEARCH", _
"SALE" & Format(Month(i - 7), "00") & Format(Day(i - 7), "00")DoCmd.RunSQL "INSERT INTO DailySales ( Data, Store, Amount ) " & _
"SELECT dBASETable.DATE, dBASETable.STORE, Sum(IIf([OPERATION]='P',[DELTASUM],-[DELTASUM])) AS Amount " & _
"FROM dBASETable GROUP BY dBASETable.DATE, dBASETable.STORE"DoCmd.RunSQL "UPDATE DailySales SET DailySales.dn =" + g + " WHERE DailySales.Dn IS NULL AND DailySales.Data= '" + Format(i - 7, "dd.mm.yyyy") + "'"
dbsTemp.TableDefs.Delete "dBASETable"
g = Str(Val(g) + 1)
NextDoCmd.OpenReport "rptПродажи", acViewPreview
End Sub
Все-таки преобразовал поле DailySales.Data к текстовому типу так заработало. Но когда добавил еще одно услове (чтобы он не обновлял, то, что уже обновил по второму разу):
это
- Код: Выделить всё
WHERE DailySales.Dn IS NULL
он начал обновлять все поле на нули
. мне уже смешно становится такие косяки…
Тип данных в таблице DailySales:
Поле Data — текстовый;
Поле Dn- числовой. (можно было бы и его в текстовый, чтобы апдейт заработал нормально, но это нельзя — по нему потом упорядочиается все)
Последний раз редактировалось MOV 12.07.2004 (Пн) 13:42, всего редактировалось 1 раз.
- Leon_
- Постоялец

-
- Сообщения: 333
- Зарегистрирован: 19.05.2004 (Ср) 16:31
- Откуда: Moscow
-
- ICQ
Leon_ » 12.07.2004 (Пн) 13:39
Думаю
DoCmd.RunSQL «UPDATE DailySales SET DailySales.dn =» + g + » WHERE DailySales.Dn IS NULL AND DailySales.Data= ‘» + Format(i — 7, «MM.DD.yyyy») + «‘»
Надо изменить на
- Код: Выделить всё
Dim sDate as String
sDate = "#" & Format$(i - 7, "MM/DD/yyyy") & "#"
DoCmd.RunSQL "UPDATE DailySales SET DailySales.dn =" + g + " WHERE DailySales.Dn IS NULL AND DailySales.Data= " & sDate
- MOV
- Постоялец

- Сообщения: 414
- Зарегистрирован: 13.03.2004 (Сб) 15:13
- Откуда: Санкт-Петербург
MOV » 12.07.2004 (Пн) 13:58
Легче не становится. Да я решил остановиться на текстовом форамте поля даты. Так что теперь первый вопрос отпал — сейчас мне интересно почему он так криво обновляет (все на нули), когда добавляешь в условие
DailySales.Dn IS NULL
- MOV
- Постоялец

- Сообщения: 414
- Зарегистрирован: 13.03.2004 (Сб) 15:13
- Откуда: Санкт-Петербург
MOV » 12.07.2004 (Пн) 14:19
Все сделал. Ну их нафиг эти UPDATE ![]()
Засунул сразу все в INSERT и короче, и гимора нет, и быстрее, и поле дата не надо к текстовому преобразовывать.
Получилось так:
Вместо
- Код: Выделить всё
DoCmd.RunSQL "INSERT INTO DailySales ( Data, Store, Amount ) " & _
"SELECT dBASETable.DATE, dBASETable.STORE, Sum(IIf([OPERATION]='P',[DELTASUM],-[DELTASUM])) AS Amount " & _
"FROM dBASETable GROUP BY dBASETable.DATE, dBASETable.STORE"DoCmd.RunSQL "UPDATE DailySales SET DailySales.dn =" + g + " WHERE DailySales.Dn IS NULL AND DailySales.Data= '" + Format(i, "dd.mm.yyyy") + "'"
можно ведь сразу записать:
- Код: Выделить всё
DoCmd.RunSQL "INSERT INTO DailySales ( Data, Store, Amount, [b]dn[/b] ) " & _
"SELECT dBASETable.DATE, dBASETable.STORE, Sum(IIf([OPERATION]='P',[DELTASUM],-[DELTASUM])) AS Amount, " [b]+ g + [/b]_
" FROM dBASETable GROUP BY dBASETable.DATE, dBASETable.STORE"
И чего сразу не допер
, единственное смущает, что так и не понятно как по дате выбирать (если она не строкового типа а тип даты имеет).
Спасибо всем. Пожалуй, все. Тему можно закрыть.
Вернуться в VBA
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1



