Динамический фильтр в табличной форме

samosyn
Дата: 21.01.2012 21:16:44
Доброго времени суток вам!

Ситуация такая: есть табличная форма, используется для ввода, просмотра и редактирования данных. Режимы меняются кнопками, всё работает. Захотелось на ее же базе сделать еще возможность фильтровать записи. Например, по нажатию кнопки "Задать условия отбора" поля формы становятся пустыми и доступными для редактирования (например, создается новая пустая временная запись в таблице), мы вводим или выбираем из списков нужные критерии в нужных полях, жмем "Применить" - ву а ля, имеем в форме подмножество записей ее таблицы, соответствующих нашим критериям.

Создаю новую запись, определяю критерии, создаю строку фильтра... Все идет хорошо до попытки изменить recordsource формы.

Не прошли варианты:

Me.Form.RecordSource = FilterString
Me.Requery - фильтр дает на любой набор условий одну запись, ее не видно (данные в форму не загружаются) - форма пуста

Me.Form.Filter = FilterString
Me.Form.FilterOn = True - выдает ошибку "Невозможно присвоить значение объекту"

Как изменить recordsource формы? Какие мысли? Может я что-то не по феншую делаю?
qwerty112
Дата: 21.01.2012 21:25:12
samosyn
Доброго времени суток вам!

Ситуация такая: есть табличная форма, используется для ввода, просмотра и редактирования данных. Режимы меняются кнопками, всё работает. Захотелось на ее же базе сделать еще возможность фильтровать записи. Например, по нажатию кнопки "Задать условия отбора" поля формы становятся пустыми и доступными для редактирования (например, создается новая пустая временная запись в таблице), мы вводим или выбираем из списков нужные критерии в нужных полях, жмем "Применить" - ву а ля, имеем в форме подмножество записей ее таблицы, соответствующих нашим критериям.

Создаю новую запись, определяю критерии, создаю строку фильтра... Все идет хорошо до попытки изменить recordsource формы.

Не прошли варианты:

Me.Form.RecordSource = FilterString
Me.Requery - фильтр дает на любой набор условий одну запись, ее не видно (данные в форму не загружаются) - форма пуста

Me.Form.Filter = FilterString
Me.Form.FilterOn = True - выдает ошибку "Невозможно присвоить значение объекту"


Как изменить recordsource формы? Какие мысли? Может я что-то не по феншую делаю?

и что, и в 1-ом и во 2-ом случае FilterString - одна и та же строка ??
а добавьте-ка, до присваивания - debug.print FilterString
и тут опубликуйте результат
samosyn
Дата: 21.01.2012 21:44:15
qwerty112,

Не знаю, на пишет ничего почему-то, Debug.Print, но вот например, из отладчика, типичная строка:
"SELECT * FROM Samples WHERE 1=1 And (Samples.tProject = Forms!Samples!tProject) ORDER BY Samples.vNum;"
qwerty112
Дата: 21.01.2012 22:11:55
samosyn
qwerty112,

Не знаю, на пишет ничего почему-то, Debug.Print, но вот например, из отладчика, типичная строка:
"SELECT * FROM Samples WHERE 1=1 And (Samples.tProject = Forms!Samples!tProject) ORDER BY Samples.vNum;"

это НЕ строка фильтра, присваивать такое Filter - нельзя
Filter - это условие без WHERE

а вот для RecordSource - самое оно

автор
фильтр дает на любой набор условий одну запись, ее не видно (данные в форму не загружаются) - форма пуста

вот эту фразу объясняйте
непоймучка
Дата: 21.01.2012 22:18:55
samosyn
из отладчика, типичная строка:
"SELECT * FROM Samples WHERE 1=1 And (Samples.tProject = Forms!Samples!tProject) ORDER BY Samples.vNum;"

Это строка запроса, который УЖЕ содержит условие отбора, эту строку надо писать прямо в RecordSource.

Если есть записи, удовлетворяющие критерию, то и в форме вы должны их увидеть. Если вы в форме не видите ни одной записи (которые там должны быть), то первое подозрение - форма у вас в режиме ввода новых записей.

Скажите, а как вы делаете вот это:
samosyn
по нажатию кнопки "Задать условия отбора" поля формы становятся пустыми и доступными для редактирования (например, создается новая пустая временная запись в таблице)
вы тут, часом, не переводите форму в режим ввода новых записей (DataEntry)?
samosyn
Дата: 21.01.2012 22:37:52
qwerty112, непоймучка,

Однако да. Она в режиме ввода новой записи. Я создаю ее вызовом DoCmd.GoToRecord , , acNewRec - так я получаю готовую для ввода данных форму, пустую (временную, лишь на один сеанс фильтрации) запись в таблице формы и могу формировать условия для фильтра, не создавая никаких дополнительных форм и временных таблиц. Идея в этом и состоит.

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

Осталось понять - как =)
qwerty112
Дата: 21.01.2012 22:55:48
samosyn
Тем не менее, нужно как-то теперь корректно выйти из этой ситуации - форму на запись закрыть, данные для фильтра не потерять, запись удалить а источник данных поменять.

а не проще ли, сделать "по-людски"

создать на форме столько сколько нужно комбобоксов,
заполнить их дистинкт выборкой соотв.полей

и по выбору значения в псс - пересоздавать рекордсоурс

?

strSQL = "select * from tab where 1=1 " 
if not isnull(cmb_f1) then
  strSQL = strSQL & "and f1=" & cmb_f1 & " "
end if
if not isnull(cmb_f2) then
  strSQL = strSQL & "and f2='" & cmb_f2 & "' "
end if

Me.Form.RecordSource = strSQL 
samosyn
Дата: 21.01.2012 23:07:52
qwerty112,

не вполне уверен что понимаю что такое дистинкт-выборка соотв. полей и псс, но мне кажется я так и делаю - особенно, если смотреть на код, приведенный в Вашем примере. Именно так я формирую свою FilterString, добавляя к ней все возможные условия при обработке события AfterUpdate каждого контрола на форме.

однако факт остается фактом: на момент переприсвоения рекордсоурса форма находится в режиме ввода данных (в нашем случае - условий для фильтра).

И вопрос: как и когда нужно переводить форму в режим просмотра, не потеряв при этом данные фильтра и удалив вовремя временную запись?
samosyn
Дата: 21.01.2012 23:29:15
А можно как-то обойтись вообще без создания новой записи в таблице формы, но иметь возможность вводить данные для фильтра в ее контролы? Тогда всё могло бы быть проще, возможно...
nord-woolf
Дата: 22.01.2012 00:01:26
samosyn
... вводить данные для фильтра в ее контролы? ...

А может проще не в ее контролы?: