Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Функция как условие запроса на выборку - как вывести все записи
 
 автор: access_newb   (19.06.2009 в 10:29)   личное сообщение
 
 

Я написал запрос на выборку, в котором условие задается функцией:

SELECT * FROM MyTable WHERE MyTableID=GetMyTableID()

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

В этих самых "некоторых случаях" я ничего лучше не придумал, как присвоить функции значение:
GetMyTableID() = "Like""*"""
или
GetMyTableID() = ">0"
И в результате выполнения запроса получал ошибку несоответствия типов. Смысл ошибки понятен - запрос ожидает Long, а функция возвращает ему String.

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

  Ответить  
 
 автор: snipe   (19.06.2009 в 11:26)   личное сообщение
 
 

WHERE ((([MyTable].[MyTableID])=IIf(GetMyTableID()="Черт его знает",[MyTableID],GetMyTableID())));

Соответственно функция должна возвращать "Черт его знает" в случаях когда нужно выбрать все записи

  Ответить  
 
 автор: access_newb   (19.06.2009 в 12:34)   личное сообщение
 
 

snipe, большое спасибо, все работает!

  Ответить  
 
 автор: access_newb   (19.06.2009 в 23:01)   личное сообщение
 
 

У меня еще вопрос касательно вот этого примера:
WHERE ((([MyTable].[MyTableID])=IIf(GetMyTableID()="Черт его знает",[MyTableID],GetMyTableID())));
Он выводит только те записи, где определен MyTableID, а как задать чтобы все записи выводил?
Я пробовал писать:
WHERE ((([MyTable].[MyTableID])=IIf(GetMyTableID()="Черт его знает",[MyTableID] or Is Null,GetMyTableID())));
или даже
WHERE ((([MyTable].[MyTableID])=IIf(GetMyTableID()="Черт его знает",Is Null,GetMyTableID())));
чтобы хотя записи с пустым полем MyTableID вывести
но он вообще ничего не выводит. Хотя если в условие записать просто Is Null, то работает.

  Ответить  
 
 автор: snipe   (20.06.2009 в 05:17)   личное сообщение
 
 

WHERE (((IIf(GetMyTableID()="Черт его знает",([MyTable].[MyTableID])=[MyTableID] Or ([MyTable].[MyTableID]) Is Null,([MyTable].[MyTableID])=GetMyTableID()))));

так должно заработать

  Ответить  
 
 автор: access_newb   (20.06.2009 в 07:33)   личное сообщение
 
 

Пробовал по-всякому и так тоже. Че-то не работает.

  Ответить  
 
 автор: osmor   (19.06.2009 в 12:17)   личное сообщение
 
 

SELECT * FROM MyTable WHERE MyTableID=GetMyTableID() or Not GetMyTableID()
При необходимости получить все записи функция должна вернуть 0

  Ответить  
 
 автор: access_newb   (19.06.2009 в 12:48)   личное сообщение
 
 

а вот это работает неправильно, потому что запрос в любом случае выводит все записи.
(1) или (не 1) = все множество целых чисел
(0) или (не 0) = все множество целых чисел

  Ответить  
 
 автор: osmor   (19.06.2009 в 14:53)   личное сообщение
 
 

Вы проверяли?

  Ответить  
 
 автор: osmor   (19.06.2009 в 15:01)   личное сообщение
 
 

SELECT * FROM MyTable WHERE MyTableID=GetMyTableID() or Not GetMyTableID()
Вариант 1.
GetMyTableID() вернет какое-то число <> 0
MyTableID=GetMyTableID() - истина только в том случае если MyTableID равно результату функции
Not GetMyTableID() - Not (Истина) - ложь при любом раскладе
т.е. в результате только т. записи которые соответствуют значению функции
Вариант 2.
GetMyTableID() вернет 0
MyTableID=GetMyTableID() - ложь в любом случае Кроме записи MyTableID = 0
Not GetMyTableID() - Not(Ложь) - истина при любом раскладе
Т.е все записи

  Ответить  
 
 автор: access_newb   (19.06.2009 в 15:16)   личное сообщение
 
 

Да, набил код и проверил, прежде чем написать ответ. А что, я разве не прав?

  Ответить  
 
 автор: access_newb   (19.06.2009 в 15:31)   личное сообщение
 
 

А я полагаю, что это не так. Причем здесь вообще истина/ложь? В выражении GetMyTableID() or Not GetMyTableID() не говорится об Истине или Лжи. Когда мы говорим MyTableID = Not GetMyTableID() - это значит, что MyTableID <> GetMyTableID() - проверьте сами. Access сам ставит "<>" вместо "= Not". Поэтому:

Вариант 1.
GetMyTableID() вернет какое-то число <> 0
WHERE MyTableID=GetMyTableID() or Not GetMyTableID()
т.е. в предыдущей строке сказано, что MyTableID д.б. равен GetMyTableID() (в данном случае какому-то числу, отличному от нуля) или не равен GetMyTableID() (какому-то числу, отличному от нуля), т.е. запрос выведет все значения.

Вариант 2.
GetMyTableID() вернет 0 - тоже самое только вокруг нуля - множество чисел неравных нулю + сам нуль.

  Ответить  
 
 автор: osmor   (19.06.2009 в 15:39)   личное сообщение
 
 

Когда мы говорим MyTableID = Not GetMyTableID()

Во второй части условия (той что после OR) нет сравнения с MyTableID !!!
SELECT * FROM MyTable WHERE MyTableID=GetMyTableID() or Not GetMyTableID()

Вы же, вероятно, написали
SELECT * FROM MyTable WHERE MyTableID=GetMyTableID() or MyTableID=Not GetMyTableID()

  Ответить  
 
 автор: access_newb   (19.06.2009 в 16:09)   личное сообщение
 
 

Да, верно в той части нет сравнения с MyTableID, но Access сам его ставит. Я в конструкторе пишу в поле условия:
MyTableID=GetMyTableID() or Not GetMyTableID()

потом переключаюсь в SQL, и вижу, что исправлено на:
WHERE (([MyTableID]=GetMyTableID() Or Not [MyTableID]=GetMyTableID()))

Тут мне становится интересно: а вы сами пробовали так делать, как мне советуете?

Тогда я в режиме SQL правлю на:
WHERE (([MyTableID]=GetMyTableID() Or Not GetMyTableID()))

Переключаюсь в конструктор и вижу, что access из одной колонки MyFieldID сделал 2 колонки: MyTableID с условием GetMyTableID() и GetMyTableID с условием or false. Смысла в последнем вообще не вижу.

Ладно, выполняю запрос - он выводит все записи - это притом, что функция GetMyTableID() должна возвращать Null, потому что в ее теле записано: GetMyTableID() = MyTableIDValue, а переменной MyTableIDValue на тот момент вообще задано никакое значение.

Сорри, если утомил, просто охота докопаться до истины. Что я делаю не так?

  Ответить  
 
 автор: osmor   (19.06.2009 в 16:16)   личное сообщение
 
 

MyTableID с условием GetAccountFilter() и GetMyTableID с условием or false.


Так именно и должно быть.
Только для того что бы это работало функция GetMyTableID(), когда нужно вернуть все записи, должна возвращать 0 (ноль), но никак не NULL

Должно быть 2 условия соединенных OR
1-е
MyTableID = GetAccountFilter()
2-е
GetAccountFilter() = false

  Ответить  
 
 автор: access_newb   (19.06.2009 в 16:33)   личное сообщение
 
 

Спасибо, разобрался, все работает! Круто! Спасибо за ваше терпение и за науку.
Я понял, как это работает: когда запрос пытается выполнить MyTableID = GetAccountFilter(), а функция возвращает 0, то запрос не находит ни одной записи и тогда выполняет вторую часть условия или: GetAccountFilter() = false - в данном случае все записи соответствуют этому выражению, поэтому он их все и выводит.

  Ответить  
 
 автор: osmor   (19.06.2009 в 17:13)   личное сообщение
 
 

Ну примерно так.

  Ответить  
 
 автор: Анатолий (Киев)   (19.06.2009 в 12:58)   личное сообщение
 
 

SELECT * FROM MyTable WHERE (([Некоторый случай]) OR (MyTableID=GetMyTableID()))
Где [Некоторый случай] - условие, при котором должны возвращаться все записи.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList