Динамический фильтр в табличной форме
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 |
---|
... вводить данные для фильтра в ее контролы? ... |
А может проще не в ее контролы?: