Использование математических функций в SQL с MS Access - PullRequest
2 голосов
/ 07 августа 2009

Я разработал запрос в SQL View с использованием MS Access:

select floor(num1) from t1;

Когда я запускаю его, я получаю «неопределенный пол функции».

Я получаю похожие ошибки для функций Ceil, Mod, Power, Sign, Sqrt, Trunc и initcap.

Имеет ли синтаксис SQL ядра СУБД Access эквивалентные функции?

Ответы [ 3 ]

12 голосов
/ 08 августа 2009

Заменить Floor () на Int (). Я узнал об этом, выполнив поиск в файлах справки Access, в данном случае нажав клавишу F1 в конструкторе запросов и выполнив поиск «функций». Это привело меня к разделу справки, сравнивающему функции VBA и T-SQL.

Вероятно, вам стоит взглянуть на Справочник по SQL для ядра базы данных Access . Я не могу найти хороший онлайн-справочник по функциям, которые поддерживаются через службы Jet / ACE и Access Express. По какой-то неизвестной причине справка Access не включала выражения Jet / ACE начиная с Jet 3.0, и этот устаревший ресурс был окончательно удален из MSDN год или два назад: (

Имейте в виду, что служба выражений Jet / ACE для использования вне Access поддерживает гораздо меньший набор функций, которые возможны при использовании службы выражений Access при запуске SQL в Access 2007. Вообще говоря, функции VBA5 (в отличие от методы), которые включают простые типы данных (в отличие, скажем, от массивов или объектов), поддерживаются за пределами пользовательского интерфейса Access; Примерный список имен функций см. в разделе «Использование операций режима песочницы с Jet 4.0 Service Pack 3 и более поздними версиями» в этой статье MSDN .

Кроме того, ссылка на функции в справке VBE должна быть отправной точкой.

Файлы справки не идеальны, но небольшой поиск должен дать вам то, что вам нужно.

1 голос
/ 07 августа 2012
Public Function Floor(ByVal x As Double) As Double
'Be Because VBA does not have a Floor function.
'Works for positive numbers
'Turns 3.9 -> 3
'Note: Round(3.9) = 4

    Dim s As String, dPos As Integer
    s = CStr(x)
    dPos = InStr(s, ".")
    Floor = CLng(Left(s, dPos - 1))
End Function
0 голосов
/ 09 августа 2009

Как уже упоминалось, Floor не доступен в access, вы должны использовать int () в качестве альтернативы. Если вы настаиваете на использовании Floor, вы всегда можете создать функцию модуля vba в вашем файле mdb, как показано ниже, но это, вероятно, излишне.

Public Function floor(dblIn As Double, dec As Integer) As Double
  decPosition = InStr(Str(dblIn), ".")
  x = Left(dblIn, decPosition + dec - 1)
  floor = x
End Function

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

...