Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Отбор записей в субформе


Автор: Woodlin 3.9.2009, 10:36
  Всем здравствуйте!
  Столкнулся с проблемой: задумал с помощью первой субформы отбтрать записи во второй субформе, созданной на основе отчёта. Предполагалось, что если в первой субформе флажок = True, то поле КБК добавляется в условие отбора во второй субформе. Проблема в том что таких КБК может быть много.

Подскажите как это можно сделать.



Автор: bopoha 3.9.2009, 11:28
1. Первый вариант:
пробежаться по таблице "Выбираемые КБК" и собрать строку значений КБК через запятую, для отмеченных строк.
Например,
Код

05311625071010000140, 05311625071010000140, 03311204060020000120


фильтр для подчиненной формы может быть таким:
Код

[Код бюджетной классификации] in (05311625071010000140, 05311625071010000140, 03311204060020000120)


2. Второй вариант (рекомендую): 
фильтр для подчиненной формы может быть таким:
Код

[Код бюджетной классификации] in (SELECT [Выбираемые КБК].КБКFROM [Выбираемые КБК] WHERE [Выбираемые КБК].Флажок = true)


При этом после установки флажка необходимо сразу же сохранять данные в таблицу, а подчиненную форму обновлять. Например, на событии до обновления поля Флажок.

Код

    '-- Сохранить
    Me.Refresh

    '-- обновить.
    '-- для формы Свод должен существовать модуль формы
    Dim frmMain As Form_Свод
    
    Set frmMain = Me.Parent
    If frmMain Is Nothing Then Exit Sub
    frmMain.подчиненнаяВыводДанных.Form.Requery


З.Ы. Чтобы пройтись по записям формы пользуйтесь конструкцией:
Код

Dim rst as DAO.Recordset

Set rst = Me.RecordsetClone

'-- ....

Автор: Woodlin 4.9.2009, 11:05
bopoha

"Второй вариант" фильтра работает только я видимо когда задавал вопрос лишнего вырезал из своего примера формы.

Мне нужно отбирать записи с учётом двух субформ с флажками. Пробовал сам написать код SQL для фильтра, но получается некоррертно
Код

[Код бюджетной классификации] in (SELECT [Выбираемые КБК].КБК FROM [Выбираемые КБК] WHERE [Выбираемые КБК].Флажок = true) and [Код ОКАТО] in (select [Выбираемые ОКАТО].Окато FROM [Выбираемые ОКАТО] where  [Выбираемые ОКАТО].Флажок =true)


пробовал также вместо оператора and вставлять or, тоже не получается.

Автор: bopoha 7.9.2009, 12:22
Почему некорректно? Что не так работает?

Автор: Woodlin 7.9.2009, 12:54
bopoha

В присоединённом файле с примером моей "стряпни" одна субформа с "флажками", где идёт отбор КБК (Код бюджетной классификации), а для работы у меня идёт отбор и по Кодам ОКАТО.

В итоге должны быть две субформы: 1 Флажок-КБК
                                                             2 Флажок-Код ОКАТО

Ваш вариант с одной субформой "Флажок-КБК" работает отлично

У меня же с двумя субформами получается казус, вот код:
 
Код

[Код бюджетной классификации] in (SELECT [Выбираемые КБК].КБК FROM [Выбираемые КБК] WHERE [Выбираемые КБК].Флажок = true) and [Код ОКАТО] in (select [Выбираемые ОКАТО].Окато FROM [Выбираемые ОКАТО] where  [Выбираемые ОКАТО].Флажок =true)

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

Похоже у меня появилась идея как это обойти, сейчас буду пробовать

Спасибо большое за помощь

Автор: bopoha 7.9.2009, 14:47
Цитата(Woodlin @  7.9.2009,  12:54 Найти цитируемый пост)
когда в одной из субформ ни один флажок не установлен запрос ни одной записи не выводит.

Тогда нужно использовать OR вместо AND

Автор: Woodlin 9.9.2009, 13:27
bopoha

Цитата

Тогда нужно использовать OR вместо AND


Пробовал, OR не подходит, выбираются лишние записи.

Мне думается нужно добавить поле, в котором подсчитывается количество установленных флажков, если установленных флажков Ноль, то...  Таи как-нибудь сделать несколько вариантов фильтра, вроде бы их три должно быть. Только проблема теперь Count отчего то не хочет считать флажки 

Автор: Akina 9.9.2009, 13:46
Цитата(Woodlin @  9.9.2009,  14:27 Найти цитируемый пост)
Count отчего то не хочет считать флажки  

Видать не от того объекта Count...

Автор: bopoha 9.9.2009, 14:29
Цитата(Woodlin @  9.9.2009,  13:27 Найти цитируемый пост)

Пробовал, OR не подходит, выбираются лишние записи.

Почему они лишние? Т.е. если галочки выбраны и там и там, но нужно одновременное совпадение?

Автор: Woodlin 10.9.2009, 10:44
bopoha

Цитата

Пробовал, OR не подходит, выбираются лишние записи.

Почему они лишние? Т.е. если галочки выбраны и там и там, но нужно одновременное совпадение?




ага, нужно одновременное совпадение.

Автор: bopoha 10.9.2009, 12:50
Вот так должно работать. На мой взгляд будет притормаживать.
Код

iif( SELECT count(*) FROM [Выбираемые КБК] WHERE [Выбираемые КБК].Флажок = true) > 0
     , [Код бюджетной классификации] in (SELECT [Выбираемые КБК].КБК FROM [Выбираемые КБК] WHERE [Выбираемые КБК].Флажок = true)
     , true) 
and 
iif( (select count(*) FROM [Выбираемые ОКАТО] where  [Выбираемые ОКАТО].Флажок =true) > 0
        , [Код ОКАТО] in (select [Выбираемые ОКАТО].Окато FROM [Выбираемые ОКАТО] where  [Выбираемые ОКАТО].Флажок =true)
        , true)

Автор: Woodlin 15.9.2009, 08:26
bopoha

Спасибо за помощь. Получилось сделать всё в модуле:

1: подвесил на флажок
Код

Private Sub Флажок_Click()
    DoCmd.RunCommand acCmdSaveRecord
    Call Макрос2
End Sub


2: собственно сам фильтр
Код

Function Макрос2()
Dim ftm As Form
Dim KBK_cnt As Integer         'количество записей КБК с вкл. флажком
Dim OKATO_cnt As Integer       'количество записей Окато с вкл. флажком


Set frm = Forms!Свод!подчиненнаяВыводДанных.Form

KBK_cnt = DCount("[Флажок]", "[Выбираемые КБК]", "[Флажок]=true")
OKATO_cnt = DCount("[Флажок]", "[Выбираемые ОКАТО]", "[Флажок]=true")

If KBK_cnt > 0 And OKATO_cnt = 0 Then
   frm.Filter = "[Код бюджетной классификации] in (SELECT [Выбираемые КБК].КБК FROM [Выбираемые КБК] WHERE [Выбираемые КБК].Флажок = true)"
End If

If KBK_cnt = 0 And OKATO_cnt > 0 Then
   frm.Filter = "[Код ОКАТО] in (select [Выбираемые ОКАТО].Окато FROM [Выбираемые ОКАТО] where  [Выбираемые ОКАТО].Флажок =true)"
End If

If KBK_cnt > 0 And OKATO_cnt > 0 Then
   frm.Filter = "[Код бюджетной классификации] in (SELECT [Выбираемые КБК].КБК FROM [Выбираемые КБК] WHERE [Выбираемые КБК].Флажок = true) and [Код ОКАТО] in (select [Выбираемые ОКАТО].Окато FROM [Выбираемые ОКАТО] where  [Выбираемые ОКАТО].Флажок =true)"
End If

If KBK_cnt = 0 And OKATO_cnt = 0 Then
   frm.Filter = "[Код бюджетной классификации] in (SELECT [Выбираемые КБК].КБК FROM [Выбираемые КБК] WHERE [Выбираемые КБК].Флажок = true) and [Код ОКАТО] in (select [Выбираемые ОКАТО].Окато FROM [Выбираемые ОКАТО] where  [Выбираемые ОКАТО].Флажок =true)"
End If
frm.FilterOn = True
End Function


Может быть и не очень изящно, но работает

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)