0 / 0 / 0
Регистрация: 10.06.2012
Сообщений: 4
1

Обращение к подчиненной форме из VBA

11.06.2012, 09:10. Показов 21955. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как правильно обратиться к подчиненной форме, а именно, отфильтровать подчиненную форму по значению в выпадающем списке. Форма: Find_form, Cписок: Имя транзистора (NameTr) Поле в подчиненной форме для фильтрации name_of_tr

Написал для события "после обновления"(в выпадающем списке) следующее:

Visual Basic
1
2
3
4
Private Sub NameTr_AfterUpdate()
Me.Filter = "[SubFindForm].Form.name_of_tr = [NameTr].Value"
Me.FilterOn = True
End Sub
не отрабатывает...
Как корректно написать процедуру?
Вложения
Тип файла: rar v1.11.rar (96.6 Кб, 83 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.06.2012, 09:10
Ответы с готовыми решениями:

Обращение к подчиненной форме
И это снова я.. к сожалению мои вопросы еще не исчерпаны(( Теперь мне не понятно вот чего: Как...

VBA открыть запрос в подчиненной форме
Есть форма f_seach , на ней расположены: множество полей и выпадающих списков, подчиненная форма...

Фильтрация записей в подчиненной форме через VBA
Здравствуйте! Подскажите пожалуйста, как в данном случае в коде прописать применение фильтра в...

Access + VBA: итоговая сумма по подчиненной форме
Привет всем форумчанам и гуру в VBA + Access, кто сможет подсказать и помочь много тем не охота...

11
0 / 0 / 0
Регистрация: 10.06.2012
Сообщений: 4
11.06.2012, 10:19  [ТС] 2
На всякий случай .mdb а то забыл прикрепить. Буду рад любому напутствию по данному вопросу)
Вложения
Тип файла: rar v1.111.rar (76.4 Кб, 130 просмотров)
0
Эксперт MS Access
26805 / 14484 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
11.06.2012, 15:40 3
Лучший ответ Сообщение было отмечено как решение

Решение

archi_TS, если точно по вопросу, то процедура такова
Visual Basic
1
2
3
4
Private Sub NameTr_AfterUpdate()
    Me.SubFindForm.Form.Filter = "name_of_tr = '" & [NameTr].Value & "'"
    Me.SubFindForm.Form.FilterOn = True
End Sub
Но ведь на форме еще много комбо и представляется, что фильтрацию данных в субформе вы хотите делать по всем полям со списком. Тогда надо сделать функцию, в которой будут собираться фильтры по всем комбо и на афтерапдейт каждого из них вызывать эту функцию.
2
78 / 78 / 1
Регистрация: 22.08.2010
Сообщений: 212
11.06.2012, 22:09 4
Есть предложение использовать Глобалные переменные в MS Access 2000-2003
1. создайте запрос для источника записей подчиненной формы
2. если пользуетесь конструктором откройте его и в конструкторе в поля которые собрались фильтровать впишите (в качестве условия)
SQL
1
LIKE (tempVar1)&*
где tempVar1 - временная переменная хронящая значение условия отбора для данного поля (разумеется для каждого поля свое имя tempVar)
3. при загрузке установите значение всех tempVar`s в значение NULL (эта конструкция даст возможность загрузить все записи подчиненной формы)
4. на событие После обновления, всех контролов фильтра, достаточно просто обновить подчиненную форму, а значения сами передатутся в запрос через tempVar`s и отфильтруют его.

Внимательно прочитайте пост с описанием tempVar`s там есть примеры как для VBA так и для SQL, но модуль написать (скопировать) прийдется )), какой из вариантов выбирать Вам.
Вроде все! Удачи!
1
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
11.06.2012, 22:33 5
Есть предложение использовать Глобалные переменные в MS Access 2000-2003
...
Пожалуйста, продемонстрируйте ваши рекомендации на небольшом конкретном примере.
1
0 / 0 / 0
Регистрация: 10.06.2012
Сообщений: 4
11.06.2012, 22:44  [ТС] 6
Всем большое спасибо. Написал вот так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
Option Compare Database
 
Private Sub NameTr_AfterUpdate()
If IsNull(Me.NameTr) Then
    Me.SubFindForm.Form.Filter = ""
    Me.SubFindForm.Form.FilterOn = False
Else
        Me.SubFindForm.Form.Filter = "name_of_tr =  '" & [NameTr].Value & "'"
        Me.SubFindForm.Form.FilterOn = True
End If
End Sub
 
 
Private Sub Выключатель42_Click()
Me.SubFindForm.Form.Filter = ""
Me.SubFindForm.Form.FilterOn = False
[ПолеСоСписком0].Value = ""
[ПолеСоСписком2].Value = ""
[ПолеСоСписком4].Value = ""
[NameTr].Value = ""
[ПолеСоСписком10].Value = ""
[ПолеСоСписком12].Value = ""
[ПолеСоСписком14].Value = ""
[ПолеСоСписком16].Value = ""
[ПолеСоСписком18].Value = ""
[ПолеСоСписком20].Value = ""
End Sub
 
Private Sub ПолеСоСписком16_AfterUpdate()
If IsNull(Me.ПолеСоСписком16) Then
    Me.SubFindForm.Form.Filter = ""
    Me.SubFindForm.Form.FilterOn = False
Else
        Me.SubFindForm.Form.Filter = "type_of_characteristic =  '" & [ПолеСоСписком16].Text & "'"
        Me.SubFindForm.Form.FilterOn = True
End If
End Sub
 
Private Sub ПолеСоСписком2_AfterUpdate()
If IsNull(Me.ПолеСоСписком2) Then
    Me.SubFindForm.Form.Filter = ""
    Me.SubFindForm.Form.FilterOn = False
Else
        Me.SubFindForm.Form.Filter = "name_tech =  '" & [ПолеСоСписком2].Text & "'"
        Me.SubFindForm.Form.FilterOn = True
End If
End Sub
Private Sub ПолеСоСписком18_AfterUpdate()
If IsNull(Me.ПолеСоСписком18) Then
    Me.SubFindForm.Form.Filter = ""
    Me.SubFindForm.Form.FilterOn = False
Else
        Me.SubFindForm.Form.Filter = "name_of_condition =  '" & [ПолеСоСписком18].Text & "'"
        Me.SubFindForm.Form.FilterOn = True
End If
End Sub
 
Private Sub ПолеСоСписком12_AfterUpdate()
If IsNull(Me.ПолеСоСписком12) Then
    Me.SubFindForm.Form.Filter = ""
    Me.SubFindForm.Form.FilterOn = False
Else
        Me.SubFindForm.Form.Filter = "type_of_tranz =  '" & [ПолеСоСписком12].Value & "'"
        Me.SubFindForm.Form.FilterOn = True
End If
End Sub
 
Private Sub ПолеСоСписком10_AfterUpdate()
If IsNull(Me.ПолеСоСписком10) Then
    Me.SubFindForm.Form.Filter = ""
    Me.SubFindForm.Form.FilterOn = False
Else
        Me.SubFindForm.Form.Filter = "year_order =  '" & [ПолеСоСписком10].Text & "'"
        Me.SubFindForm.Form.FilterOn = True
End If
End Sub
 
Private Sub ПолеСоСписком20_AfterUpdate()
If IsNull(Me.ПолеСоСписком20) Then
    Me.SubFindForm.Form.Filter = ""
    Me.SubFindForm.Form.FilterOn = False
Else
        Me.SubFindForm.Form.Filter = "base_version =  '" & [ПолеСоСписком20].Text & "'"
        Me.SubFindForm.Form.FilterOn = True
End If
End Sub
 
Private Sub ПолеСоСписком14_AfterUpdate()
If IsNull(Me.ПолеСоСписком14) Then
    Me.SubFindForm.Form.Filter = ""
    Me.SubFindForm.Form.FilterOn = False
Else
        Me.SubFindForm.Form.Filter = "construction =  '" & [ПолеСоСписком14].Text & "'"
        Me.SubFindForm.Form.FilterOn = True
End If
End Sub
 
Private Sub ПолеСоСписком4_AfterUpdate()
If IsNull(Me.ПолеСоСписком4) Then
    Me.SubFindForm.Form.Filter = ""
    Me.SubFindForm.Form.FilterOn = False
Else
        Me.SubFindForm.Form.Filter = "type_tech =  '" & [ПолеСоСписком4].Text & "'"
        Me.SubFindForm.Form.FilterOn = True
End If
End Sub
 
Private Sub ПолеСоСписком0_AfterUpdate()
If IsNull(Me.ПолеСоСписком0) Then
    Me.SubFindForm.Form.Filter = ""
    Me.SubFindForm.Form.FilterOn = False
Else
        Me.SubFindForm.Form.Filter = "customer_name =  '" & [ПолеСоСписком0].Value & "'"
        Me.SubFindForm.Form.FilterOn = True
End If
End Sub
То что хотел вроде заработало как надо)
0
78 / 78 / 1
Регистрация: 22.08.2010
Сообщений: 212
12.06.2012, 21:47 7
Цитата Сообщение от minob Посмотреть сообщение
Пожалуйста, продемонстрируйте ваши рекомендации на небольшом конкретном примере.
Посмотрите этот вариант!

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

P/S: но при помощи этой функции, 3-5 контролов для ввода условий и возможно 1 дополнительной таблицы можно организовать фильтрацию на любое количество полей
Вложения
Тип файла: zip Example_with_MyTempVar.zip (25.7 Кб, 237 просмотров)
0
206 / 23 / 5
Регистрация: 12.06.2012
Сообщений: 235
12.06.2012, 23:12 8
WiLex, а что нет никакого способа контролы в массив запихнуть?
жаль, чегото не получается динамически на форме сформировать контролы, просит чтобы режим формы был acDesign, а у меня при загрузке формы не получается перехватить и загнать в Design Mode. Только если открывать с другой формы.
0
Эксперт MS Access
7395 / 4532 / 295
Регистрация: 12.08.2011
Сообщений: 14,015
13.06.2012, 03:13 9
WiLex, это не удобно. Возможно просто до конца не довели?
Миниатюры
Обращение к подчиненной форме из VBA  
0
3544 / 1118 / 94
Регистрация: 13.03.2011
Сообщений: 1,513
13.06.2012, 09:08 10
Цитата Сообщение от WiLex Посмотреть сообщение
Посмотрите этот вариант!
Посмотрел. Ни одной глобальной переменной, о которых писалось здесь, в приложении не обнаружил. В запросе используется не переменная, как показано в примере по ссылке, а функция MyTempVars, описанная в общем модуле, которую Jet SQL "видит", в отличие от переменных. Таким образом вы пытаетесь в примере выдать желаемое за действительное путем подмены понятий. Позтому можно сделать вывод, что рекомендации по ссылке являются плодом безосновательной фантазии.
Судя по комментариям к функции MyTempVars
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
'Created 13/01/2012 Wilex Soft Studio
'Колекция глодальных переменных
'Создает именованные глобальные переменные, хранящие значения
'на протяженнии всей сеии пользователя
Public Function MyTempVars(Name As String, Optional Val) 'Функция принимающая и возвращающая переменные
Static MyTempVarsCol As New Collection 'колекция переменных
On Error Resume Next
    MyTempVars = Null
    MyTempVars = MyTempVarsCol(Name)
    If IsMissing(Val) Then Exit Function
    MyTempVarsCol.Remove Name
    If Not IsNull(Val) Then MyTempVarsCol.Add Val, Name
End Function
вы путается в понятиях области видимости переменных и времени их существования. Функция, несмотря на ваши декларации, никаких глобальных переменных не создает, она лищь работает с компонентами коллекции, которые никаким образом не причастны к глобальным переменным. Объектная переменная MyTempVarsCol, объявленная в функции, как Static, является локальной, имеющей областью видимости только эту функцию и время существования от первого вызова функции и до завершения работы приложения.

Функция MyTempVars в выложенном примере притянута за уши, чтобы выдать желаемое (см.рекомендации по ссылке) за действительное. Достаточно изменить запрос qryTBL1 таким образом
SQL
1
2
3
4
5
6
7
8
9
SELECT KeyID_tbl1, Chapter1, Chapter2, Chapter3, Chapter4, Chapter5, Chapter6, Chapter7
FROM tbl1
WHERE Chapter1 LIKE Forms!Form1!cmbBoxCh1 & "*" AND 
      Chapter2 LIKE Forms!Form1!cmbBoxCh2 & "*" AND 
      Chapter3 LIKE Forms!Form1!cmbBoxCh3 & "*" AND 
      Chapter4 LIKE Forms!Form1!cmbBoxCh4 & "*" AND 
      Chapter5 LIKE Forms!Form1!cmbBoxCh5 & "*" AND 
      Chapter6 LIKE Forms!Form1!cmbBoxCh6 & "*" AND 
      Chapter7 LIKE Forms!Form1!cmbBoxCh7 & "*"
чтобы получить тот же результат без использования функции.

P.S. Т.к. переменная - это отдельный именованный участок памяти, то говорить "именованная переменная" это все равно, что масло масляное.
2
0 / 0 / 0
Регистрация: 05.06.2013
Сообщений: 38
04.09.2017, 16:40 11
Подскажите пожалуйста, вот чтобы отменить внесенные изменения через форму достаточно написать: Me.Undo
А если на форме есть подчиненная форма, как отменить изменения, внесенные через подчиненную форму?
Forms![Название подчиненной формы].Undo не работает)
0
Эксперт MS Access
26805 / 14484 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
04.09.2017, 17:40 12
Цитата Сообщение от darklumen Посмотреть сообщение
если на форме есть подчиненная форма, как отменить изменения, внесенные через подчиненную форму?
После того, как Вы нажали кнопку или просто перешли на любой контрол на главной форме, редактируемая запись сохранилась в таблице и все OldValue ее полей исчезли. Поэтому, чтобы удовлетворить требованиям отмены, надо сохранять значения записи до модификации, например в массиве или свободном адо-рекордсете. Или в таблице типа журнала изменений. Тогда, при необходимости достаем сохраненные старые значения и записываем их в таблицу вместо новых.
0
04.09.2017, 17:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2017, 17:40
Помогаю со студенческими работами здесь

Запрет на создание записи в подчиненной форме при отсутствии значения в поле главной формы( или в этой же подчиненной форме) Аксесс 2003
Доброго времени суток ! Помогите , пожалуйста, решить проблему! шаг 1. В форме "frmТОиР_2"...

Фильтрация данных в подчиненной форме через главную/в самой подчиненной
Доброго времени суток! Столкнулся с проблемой - нужно отфильтровать публикации по типу и дате в...

Сумма из подчиненной формы, отмена записей в подчиненной форме
Нужна сразу помощь по четырем пунктам, форма КвитанцияСкупкиОбмена надо: 1. Суммирование поля...

Выборка в подчиненной форме 2 из формы 2 по выбранному значению в подчиненной форме 1 из формы 1
Добрый день! Есть 2 формы(на первой форме находится "подчиненная форма 1", на второй "подчиненная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru