Access 2003. Проблема с запросами

Хреновый_Программер
Дата: 17.12.2011 15:21:24
Добрый день! Помогите, пожалуйста, разобраться с очередной возникшей проблемой. В приложенном файле, имеются два запроса: первый - qВозраст, вычисляет возраст сотрудника, второй - qОтбор, пытается отобрать сотрудников у которых возраст больше или равен предельному возрасту. И вот, во втором запросе возникает проблема, а именно: без ввода условия отбора, возраст считает без проблем, а при вводе условия, выдает окно с требованием о вводе возраста, который сам запрос и должен считаться. Как справиться с этой проблемой? Спасибо!
mds_world
Дата: 17.12.2011 15:36:12
Хреновый_Программер,

в предложении Where нельзя использовать алиасы полей, которые вы присвоили в селекте. Во Where опять надо вычислять функцию Возраст, т.е. такое же выражение для функции, как и в селекте
Хреновый_Программер
Дата: 17.12.2011 15:47:44
mds_world
в предложении Where нельзя использовать алиасы полей, которые вы присвоили в селекте. Во Where опять надо вычислять функцию Возраст, т.е. такое же выражение для функции, как и в селекте


Уважаемый mds_world! Спасибо Вам за помощь! Я, конечно, дико извиняюсь, но слишком много умных слов для меня, да еще в таком количестве!... Не сочтите за наглость, но не могли бы Вы показать конкретно на приложенном примере, что и в каком месте присвоить, по-другому никак не дано понять. В самом запросе знаков больше чем умных слов в сообщении. Наглядно будет понятнее. Спасибо!
mds_world
Дата: 17.12.2011 15:53:18
Да, пожалуйста
SELECT tblКартотека.ID, tblКартотека.ФИО, tblПредел.ПРЕДЕЛЬНЫЙ_ВОЗРАСТ, tblКартотека.ДАТА_РОЖДЕНИЯ, Date() AS Сегодня,
Возраст([ДАТА_РОЖДЕНИЯ],[Сегодня]) AS Возраст, Val(Left([Возраст],2)) AS Лет, Val(Left(Right([Возраст],5),2)) AS Мес, Val(Right([Возраст],2)) AS Дней
FROM tblПредел INNER JOIN tblКартотека ON tblПредел.ID = tblКартотека.ID_ВЗ
WHERE Val(Left(Возраст([ДАТА_РОЖДЕНИЯ],date()),2))>=[ПРЕДЕЛЬНЫЙ_ВОЗРАСТ]
Хреновый_Программер
Дата: 17.12.2011 16:07:25
mds_world
Да, пожалуйста

Еще раз спасибо Вам большое! Я только одно никак не могу понять: а как быть в том случае, если, к примеру, меняются условия запроса (надо было больше или равно, потом, к примеру, меньше или равно понадобится)? Как привязать данные условия к кнопке на форме? Как быть простому смертному сидящему за компьютером, который о программном коде или SQL (в отличие от меня конечно ) знает только понаслышке?
mds_world
Дата: 17.12.2011 16:17:41
Хреновый_Программер,
в случае гибких условий, зависящих от выбора юзера, условия отбора, как правило формируют динамически, в коде процедуры.
Хреновый_Программер
Дата: 17.12.2011 16:23:43
mds_world
в случае гибких условий, зависящих от выбора юзера, условия отбора, как правило формируют динамически, в коде процедуры.


Вы имеете ввиду в виде программного кода VBA или я опять не так все понял?
mds_world
Дата: 17.12.2011 16:32:14
Хреновый_Программер
mds_world
в случае гибких условий, зависящих от выбора юзера, условия отбора, как правило формируют динамически, в коде процедуры.


Вы имеете ввиду в виде программного кода VBA или я опять не так все понял?

Да, примерно, так. На форме юзер задает свои требования в специальных полях, приграмма их считывает и преобразует в условия отбора в SQL-выражении. Ну, а что дальше делать с полученным скл-выражением, это по потребности - выдать в мсгбоксе, показать в форме, в отчете.
Программист-Любитель
Дата: 17.12.2011 18:19:53
Поля (комбо) фильтрации прямо над таблицей с данными - совершенно типовое решение. Имеет смысл сделать для него набор функций или библиотеку классов, с помощью которых такие формы будут вылетать с полпинка.
Программист-Любитель
Дата: 17.12.2011 18:28:23
Картинка.

И как условие отбора можно засунуть в сам список фильтрации

КОД УСЛОВИЕ
SELECT '<Все инструменты>' AS c '1=1' AS condition
UNION ALL SELECT '<Все векселя>' 'sInstrumentTypeCode LIKE ''%вексель%'''
UNION ALL SELECT '<Все депозиты вкл. серт. и р/с>' 'sInstrumentTypeCode LIKE ''%депозит%'''
UNION ALL SELECT '<Депозиты кроме серт. и р/с>' '(iInstrumentTypeNomer BETWEEN 101 AND 199) AND (sInstrumentTypeCode NOT LIKE ''%Займ%'')'
UNION ALL SELECT '<Депозиты на р/с>' 'iInstrumentTypeNomer BETWEEN 201 AND 299'
UNION ALL SELECT '<Депозитные серификаты>' 'iInstrumentTypeNomer=301'
UNION ALL SELECT sInstrumentTypeCode 'sInstrumentTypeCode=''{list}'''
FROM DIC_InstrumentType