Вопрос

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

select floor(num1) from t1;

Когда я запускаю его, я получаю "undefined function floor".

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

Имеет ли SQL-синтаксис Access database engine эквивалентные функции?

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

Как уже упоминалось, 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top