powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Функция в запросе.
20 сообщений из 20, страница 1 из 1
Функция в запросе.
    #32158029
newDave
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть запорс c именем Query1, вида:
Код: plaintext
1.
Select Field1, Field2, MyFunction([Field1],[Field2]) as Field3
From SomeTable; 

В модуле обявлена и описана функция MyFunction, которая возвращает double(пробовал и другие типы).
Проблема возникает при попытке задать условие отбора связанное c полем Field3, т.е. например если написать запрос
Код: plaintext
Select * from Query1 Where Field3> 15 . 0 

возникает ошибка "data type missmatch in criteria expression".
Замечу, что таблица SomeTable под MS SQL Server'ом, а доступаемся до нее через ODBC ссылку. Еще могу заметить что определенное время все эти конструкции работали нормально. Жду советов по анализу и отладке глюка, или моих мозгов.
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158063
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Могу добавить только то, что у меня была похожая проблема и мне в этом форуме получить ответ не удалось.\r
\r
/topic/26067
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158126
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2newDave

Пробовал использовать явное преобразование типов?
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158161
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в функции нет ли часом условных операторов ?
if select case .... ?
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158176
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
У меня есть. Кажется, появился хвостик ниточки... Это известная проблема? А что делать?
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158184
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msaccess 2000 mdb

в таком виде работает

Public Function MyFunction(f1, F2) As Double
MyFunction = f1 + F2
End Function


Q1:
SELECT [Field1], [Field2], MyFunction([Field1],[Field2]) AS Field3
FROM SomeTable;

Q2:
SELECT * FROM Query1 WHERE (((Query1.Field3) >15.23));

тип данных в таблице
f1 - float
f2 - целое

приведи пример функции, если в ней есть условные операторы то возможно проблема в ней.
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158201
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Но если есть условные операторы, то что делать?
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158210
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в случе с условными операторам в зависимости от версии аксесс возникают следующие глюки.

1. при каждом повторном вызове функции из запроса может быть использовано - предыдущее значение функции

вот пример

Public Function MyFunction(f1, F2) As Double
if f1 > 2 then
MyFunction = f1 + F2
end if
End Function

Эта функция не возвратит в запрос 0 в случае если значение f1 >= 2
а будет возвращено предыдущее значение.

Видимо при выполнении функции в запросе не происходит повторной инициализации переменной

так работает

Public Function MyFunction(f1, F2) As Double
MyFunction = 0
if f1 > 2 then
MyFunction = f1 + F2
end if
End Function
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158215
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> возникают следующие глюки.
>
> 1.

А дальше?
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158223
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
второй, известный мне глюк с функциями в запросах не касается условных операторов но тем не менее имеет место быть

начиная с АСС 2000

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

пример - функция прибавляет к аргументу значение времени

в 97 - разные результаты
в 2000 - один
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158233
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Прежде всего, громадное спасибо. Про второй глюк я знал и даже примерно представляю, как с ним бороться (просто добавить аргумент и передавать туда что-нибудь разное, например Timer или значение ключа). А как бороться с первым глюком?
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158235
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
так работает 

Public Function MyFunction(f1, F2) As Double 
MyFunction =  0  ' Инициализация вручную
if f1 >  2  then 
MyFunction = f1 + F2 
end if 
End Function
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158237
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
СПАСИБИЩЕ!!!
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158259
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да пожайлуста , ларчик просто открывался )))
жаль когда я переходил с 97 - на 2000 мне некому было подсказать - 2 недели поиска причины ошибки....
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158263
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Теперь будем надеяться, что автор топика тоже будет удовлетворен. :^)
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158350
IgorM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2АлексейК: ...по поводу кэширования значений. У меня в A'97 при передаче константного параметра никаких пересчетов. Пример, для функции:

Function testd(i As Long) As Date
testd = DateAdd("S", i, Time)
End Function

и запроса:

SELECT t1.*, testd(50) AS TimeVal FROM t1;

В TimeVal возвращается одно и тоже время. И имхо это правильно.
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158360
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 IgorM:

АлексейК именно так и сказал - "функция не пересчитывается а берется кэшированное значение".

По поводу того, хорошо это или плохо, - вопрос субъективный.
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158373
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 IgorM

вы невнимательны
я сказал что это происходит только при использовании условных опреаторов в функциях - смотрите выше


решения 2

1. Обнулять переменные
2. Всегда писать ветку "иначе"
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158392
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Кажется, я тоже невнимателен.

Мне показалось, что

Код: plaintext
1.
2.
3.
4.
5.
Public Function MyFunction(f1, F2) As Double
    MyFunction =  0  ' Инициализация вручную
    if f1 >  2  then
        MyFunction = f1 + F2
    end if
End Function


- это замена для неработающего

Код: plaintext
1.
2.
3.
4.
5.
6.
Public Function MyFunction(f1, F2) As Double
    if f1 >  2  then
        MyFunction = f1 + F2
    else
        MyFunction =  0 
    end if
End Function


Кажется, я поспешил.
...
Рейтинг: 0 / 0
Функция в запросе.
    #32158664
IgorM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Владимир Саныч: Да, но "начиная с АСС 2000 ... в 97 - разные результаты
в 2000 - один".

2АлексейК: "...второй, известный мне глюк с функциями в запросах не касается условных операторов ..." - а как же эта фраза?

Хорошо, меняем пример:

Function testd(i As Long) As Date
If i > 1 Then testd = DateAdd("S", i, Time)
End Function

Значение не меняется. Может быть я чего-то не учитываю? Можете привести конретный пример? Т.е. данный, функцию, запрос, результат...
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Функция в запросе.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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