Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пользовательская функция в запросе, в критерии отбора 
:(
    Опции темы
Woodlin
Дата 27.6.2011, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.7.2009
Где: Челябинская облас ть, г. Пласт

Репутация: 1
Всего: 1



Всех приветствую!

Возник вопрос, в форме табличного вида (источник записей запрос) нужно отбирать записи, к примеру за определённый месяц, год, или за какой то период (в общем работа с датами, пока во всяком случае). 
На данный момент в условии отбора запроса тупо используются значения контролов формы поиска.

Вопрос вот в чём, мне хочется в критерий отбора вместо значений контролов включить функцию, которая будет содержать строку условия отбора. Например такую: [Дата]=Month([Дата])=4 and [Дата]=Year([Дата])=2011
На мой взгляд это позволило бы более гибко собирать строку отбора записей
А функцию вставить сразу после Where:
Код

... WHERE My_Func()

Подскажите можно ли так сделать? у меня вот не получилось.
PM MAIL ICQ   Вверх
Akina
Дата 27.6.2011, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Это несложно. НО.
1) Функция должна присутствовать в той БД, где выполняется запрос. Т.е. стОит разделить БД - начинаются проблемы.
2) Функция будет недоступна (и запрос неработоспособен) при работе с базой через ADO/DAO/ODBC...
3) Функция будет применена ко всем записям - т.е. будет выполнен полный перебор записей и не будут использоваться индексы. На больших таблицах (и тем более больших пересечениях) это будет страшенные тормоза.

Цитата(Woodlin @  27.6.2011,  13:52 Найти цитируемый пост)
у меня вот не получилось. 

Или проблемы с типом возврата, или с синтаксисом.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Woodlin
Дата 27.6.2011, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 15.7.2009
Где: Челябинская облас ть, г. Пласт

Репутация: 1
Всего: 1



Akina, у меня база разделена, но такая строка работает: ... Where Month([Дата])=My_Func(), где My_Func()=4
Функция у меня строкового типа, выводил собираемую строку в MsgBox, строка собиралась правильно.

Буду пробовать дальше.

PM MAIL ICQ   Вверх
Akina
Дата 27.6.2011, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Woodlin @  27.6.2011,  14:13 Найти цитируемый пост)
Where Month([Дата])=My_Func(), где My_Func()=4
Функция у меня строкового типа

А то, что Month() возвращает чисельное значение, тебя не смущает?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bopoha
Дата 27.6.2011, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Что бы это работало:
Код

... WHERE My_Func()


Необходимо что бы функция возвращала True или False. Возвращать текстовое выражение не получится и не нужно.

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

Предлагаю следующие варианты:
Формируете выражение отбора и:
1. Формируете запрос select * from <запрос> where <выражения> и назначаете его в качестве источника данных формы
2. На форме указываете в качестве источника данных ваш запрос, а выражение назначаете в качестве фильтра.
Код

    Set frm = ....
    frm.Filter = "выражения"
    frm.FilterOn = True

PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.