Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Access] Можно ли сделать автоматический фильтр в таблице MS Access? Дубль 2. 08.03.11 12:01
Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 08.03.11 12:04 Количество правок: 6
|
Есть таблица параметров: params (id, title); есть таблица значений, допустимых для этих параметров: values (id, title); есть таблица соответствия значений параметрам: params_values (param, value); есть таблица list (id, param, value), в которой хранится список параметров и их значений. Параметры и типы выбираются с помощью всплывающего списка.
Необходимо сделать так, чтобы во всплывающем списке отображались только те значения, которые соответствуют выбранному параметру. Ранее я уже задавал подобный вопрос, но поторопился закрыть тему, не расставив все точки над i.
Мне частично удалось решить эту задачу: я создал форму и на событие AfterUpdate списка params поставил Requery для values. В списке values прописан следующий запрос:
SELECT id, title FROM values WHERE id in
(SELECT value FROM params_values WHERE param=param.value);
---
Жирным выделена переменная, которая подставляется из всплывающего списка params.
Проблема в следующем. Если в таблице list есть только одна запись, то всё работает как часы, но если добавляются ещё записи, то начинается такая следующая неприятная вещь. В первой строке я задаю параметр и значение. Во второй, я задаю новый параметр.... И как только я делаю это (как только сработает AfterUpdate и, соответственно Requery), то значение из первой строки исчезает, т.к. уже не соответствует текущей выборке. Но исчезает оно только визуально, - оно не отображается только из-за несоответствия критериям текущей выборки, но в таблице params_values соответствующая запись остаётся.
Такой вопрос. Можно ли сделать так, чтобы последствия Requery затрагивали только текущую запись таблицы, а все остальные записи оставляли не тронутыми?
|
|
во всплывающем списке (popup) или в выпадающем... 08.03.11 15:47
Автор: Den <Денис Т.> Статус: The Elderman Отредактировано 08.03.11 15:54 Количество правок: 2
|
> Есть таблица параметров: params (id, title); есть таблица > значений, допустимых для этих параметров: values (id, > title); есть таблица соответствия значений параметрам: > params_values (param, value); есть таблица list (id, param, > value), в которой хранится список параметров и их значений. > Параметры и типы выбираются с помощью всплывающего списка. > > Необходимо сделать так, чтобы во всплывающем списке > отображались только те значения, которые соответствуют > выбранному параметру. Ранее я уже задавал подобный вопрос, > но поторопился закрыть тему, не расставив все точки над i.
во всплывающем списке (popup) или в выпадающем (combobox)???
> Мне частично удалось решить эту задачу: я создал форму и на > событие AfterUpdate списка params поставил Requery для > values. В списке values прописан следующий запрос: > > > SELECT id, title FROM values WHERE id in
> (SELECT value FROM params_values WHERE
> param=param.value);
> ---
> Жирным выделена переменная, которая подставляется из > всплывающего списка params.
неоптимальный запрос. сделай так:
SELECT values.id, values.title
FROM params_values
INNER JOIN values
ON values.id = params_values.value
WHERE params_values.id = Me.cmboxParam_ID.Value ---
где Me - ссылка на текущую форму; cmboxParam_ID - поле с выпадающим списком в форме Me.
У тебя неописательные имена полей в таблице params_values, может поэтому ты сам часто путаешься. Если поле предназначено для хранения идентификатора значения, то так и называй - value_id, а не просто value.
> Проблема в следующем. Если в таблице list есть только одна > запись, то всё работает как часы, но если добавляются ещё > записи, то начинается такая следующая неприятная вещь. В > первой строке я задаю параметр и значение. Во второй, я > задаю новый параметр.... И как только я делаю это (как > только сработает AfterUpdate и, соответственно Requery), то > значение из первой строки исчезает, т.к. уже не > соответствует текущей выборке. Но исчезает оно только > визуально, - оно не отображается только из-за > несоответствия критериям текущей выборки, но в таблице > params_values соответствующая запись остаётся.
Ты используешь ленточную форму в которой у тебя поля с выпадающим списком??? В ленточных формах используется многократно повторяющаяся одна и таже форма, потому у тебя и возникает такая "неприятная вещь".
Есть три варианта обхода этой проблемы:
1. Для выборки DropDownList не задавать ограничений до момента события выпадания списка, а перед выпадением списка уточнять запрос.
2. Использовать ленточную форму только для просмотра и/или редактирования полей, значения которых не зависит от других значений. Например, ленточную форму можно использовать только для чтения, а при двойном щелчке по записи открывать одиночную форму для редактирования выбранной записи.
3. Частный случай, который далеко не всегда удается использовать "в лоб" - подформы (вложенные формы).
> Такой вопрос. Можно ли сделать так, чтобы последствия > Requery затрагивали только текущую запись таблицы, а все > остальные записи оставляли не тронутыми?
можно. решения смотри выше.
P.S. Для изучения Access'а лучше всего использовать Access '97, т.к. в нем самый лучший (хоть и устаревший) файл помощи + база решений, в которой можно почерпнуть интересные решения.
|
| |
Спасибо за оптимизацию. 09.03.11 10:23
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
Спасибо за оптимизацию.
Правильно ли я понимаю, что в 1-м случае остальные данные также будут скрыты, но только на время того, пока действует уточнённый запрос? Если да, то как-то это не очень красиво.
Второй вариант понятен, но он довольно громоздкий – будет от пользователя требовать много лишних действий.
Насколько я понял, в третьем варианте вы предлагаете для param сделать одну форму, а для value – другую, подчинённую ей. Такое решение будет не наглядным – для того чтобы узнать значения параметра, придётся осуществлять дополнительные действия.
Я использую не ленточные формы, а табличные и подчинённые. Как это выглядит, можно посмотреть на скрине.
|
| | |
Можно попытаться найти подходящий бесплатный OCX, в котором... 09.03.11 14:40
Автор: Den <Денис Т.> Статус: The Elderman
|
> Спасибо за оптимизацию. > > Правильно ли я понимаю, что в 1-м случае остальные данные > также будут скрыты, но только на время того, пока действует > уточнённый запрос? Если да, то как-то это не очень красиво. >
> Второй вариант понятен, но он довольно громоздкий – будет > от пользователя требовать много лишних действий.
Можно попытаться найти подходящий бесплатный OCX, в котором реализованы все необходимые возможности.
Средствами Access практически невозможно сделать гибкую и удобную обвязку БД, к которым привык пользователь. Все более-менее сложные вещи приходится делать через одно место.
Access хорош для создания отчетов.
Выбор варианта решения за тобой. Других идей нет.
|
| | | |
Спасибо за беспокойство! 12.03.11 14:50
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
|
|
|