информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetSpanning Tree Protocol: недокументированное применениеПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Ядро Linux избавляется от российских... 
 20 лет Ubuntu 
 Tailscale окончательно забанила... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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
<"чистая" ссылка> <обсуждение закрыто>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach