С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690

Перемещение фокуса по коллекции записей субФормы

10.03.2020, 14:16. Показов 3572. Ответов 12

Студворк — интернет-сервис помощи студентам
Требуемая логика.
- Пользователь. Вводит значение в поле "fNameStud_frm";
- Код. Поиск по критерию "NameStud Like '*" & Me.fNameStud_frm.Text & "*'";
- Код. Переносит фокус на запись нужную;

- Пользователь. Нажимает кнопку "вниз";
- Код. Перемещает фокус "вниз" по коллекции записей, которые соответствуют критерию;

- Пользователь. Нажимает кнопку "вверх";
- Код. Перемещает фокус "вверх" по коллекции записей, которые соответствуют критерию;

Код предварительный
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
' *** Глобальные  
' *** *** *** *** *** *** ***
Public rst As DAO.Recordset
 
Private Sub fNameStud_frm_Change()
        '   Dim frm As Form                     ' Форма
        '   Dim strCriteria As String       ' "Имя поля формы" +  "Критерий".  "Имя поля формы" которая фильтруется. Пример использования ("GoodID = 25")
        '            Dim blToFirst As Boolean     ' К `первой`(`последней`) записи.  blToFirst = False (переход на последнюю запись)
        '
        '            Set frm = Me!tbl_02_Students.Form
        '            ' strCriteria = "NameStud = " & Me.fNameStud_frm
        '              strCriteria = "NameStud  = "
        '             strCriteria = "NameStud Like '*" & Me.fNameStud_frm & "*'"
        '            blToFirst = True ' Переход на первую запись
        '
        '            ' Call SetFormRecord(frm, strCriteria, blToFirst)
End Sub
 
Private Sub fNameStud_frm_KeyDown(KeyCode As Integer, Shift As Integer)
   If KeyCode = 13 Then
            Dim frm As Form                     ' Форма
            Dim strCriteria As String       ' "Имя поля формы" +  "Критерий".  "Имя поля формы" которая фильтруется. Пример использования ("GoodID = 25")
            Dim blToFirst As Boolean     ' К `первой`(`последней`) записи.  blToFirst = False (переход на последнюю запись)
            
            Set frm = Me!tbl_02_Students.Form
            ' strCriteria = "NameStud = " & Me.fNameStud_frm
            ' strCriteria = "NameStud  = "
             strCriteria = "NameStud Like '*" & Me.fNameStud_frm.Text & "*'"
            blToFirst = True ' Переход на первую запись
            
           ' Call SetFormRecord(frm, strCriteria, blToFirst)
            Me.fNameStud_frm.SetFocus
            
            ' *** Тест --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
            Test1
            
   End If
End Sub
 
 
 
Public Sub SetFormRecord(frm As Form, Optional strCriteria As String, Optional blToFirst As Boolean = False)
' es 22.11.2004 - 16.12.2017 LE
' http://msa.polarcom.ru/st/s0000115.htm
' Производит поиск записи по заданным критериям в форме(подчиненной форме).
' ***
' Если запись найдена -  ставит фокус на найденную запись;
' Если запись не найдена -  переход на Первую или Последнюю запись;
' Переход Первую или Последнюю запись происходит в зависимости от аргумента - `blToFirst`
' blToFirst = False  - переход на последнюю запись
' По умолчанию  blToFirst = False (переход на последнюю запись)
' Пример использования - см. ссылку вначале.
' ------------------------------------------------------------------------------
On Error GoTo SetFormRecordErr
    With frm
        .RecordsetClone.FindFirst strCriteria
        If .RecordsetClone.NoMatch Then
            If blToFirst = False Then
                .RecordsetClone.MoveLast
            Else
                .RecordsetClone.MoveFirst
            End If
        End If
        .Bookmark = .RecordsetClone.Bookmark
    End With
SetFormRecordBye:
    On Error Resume Next
    Set frm = Nothing
    Exit Sub
SetFormRecordErr:
    Err.Clear
    Resume SetFormRecordBye
End Sub
 
 
' *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
' ***  Тест  ***
' *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Public Sub Test1()
         Dim nameTable As String
         Dim criteria As String
         Dim nameFieldCriteria As String
          
        nameTable = "tbl_02_Students"
        criteria = "NameStud Like '*" & Me.fNameStud_frm.Text & "*'"
        nameFieldCriteria = "NameStud"
          
        Call GetRecordsByCriteria(nameTable, nameFieldCriteria, criteria)
          
End Sub
 
Public Sub GetRecorsdByCriteria(nameTable As String, nameFieldCriteria As String, criteria As String)
        
         Dim strSQL  As String
                   
        ' Формируем запрос ---  --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---
        ' ASC  -  по возрастанию
        ' DESC - по убыванию
         strSQL = "select *" & _
                        " from " & nameTable & _
                        " WHERE " & criteria
 
            
        Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)    ' Открытие на редакцию
        ' Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot) ' Только просмотр
                   
'      'Перебор всех записей в наборе
'        With rst
'            Do Until .EOF = True 'Цикл до конца набора
'                'Тут операции с записью:
'                '…
'                Dim result As String
'               result = .Fields(nameFieldCriteria)
'
'                .MoveNext
'            Loop
'        End With
    
    On Error Resume Next
    rst.Close
    Set rst = Nothing
End Sub
 
 
' Вверх
Private Sub UP_btn_Click()
        Dim result As String
        result = rst.Fields("NameStud")
        rst.MoveNext
End Sub
 
' Вниз
Private Sub Down_btn_Click()
        ' Dim result As String
        ' result = rst.Fields("NameStud")
        ' rst.MoveNext
        Dim rstCur As DAO.Recordset
        Dim i As Integer
        
        Set rstCur = rst
        i = rstCur.RecordCount
        
        With rstCur
                Dim result As String
               result = .Fields("NameStud")
               rst.MoveNext
        End With
End Sub
Миниатюры
Перемещение фокуса по коллекции записей субФормы  
Вложения
Тип файла: zip Фокус.zip (36.7 Кб, 8 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.03.2020, 14:16
Ответы с готовыми решениями:

Перемещение фокуса с кнопки на форму
Никак не могу переместить фокус с кнопки на форму после нажатия на нее (кнопку). private void btn_MouseUp(object sender,...

Перемещение фокуса по нажатию на TAB
Привет. У меня есть проект на с++ + MFC. Там есть диалог. В этом диалоге при нажатии на TAB, фокус идет не попрядку по контролам, а...

Принудительная синхронизация коллекции и DataGrid в момент редактирования ячейки, а не при потере фокуса строки
Есть dg, элементы которого прибиндины к элементам коллекции. Если редактировать ячейку dg, то значение элемента в коллекции происходит при...

12
 Аватар для amd48
845 / 475 / 80
Регистрация: 18.05.2016
Сообщений: 1,266
Записей в блоге: 5
10.03.2020, 15:18
Если я правильно понял, вопрос в навигации по таблице с помощью клавиш?
1. можно таблицу сделать в виде табличной подчинённой формы. У неё появится поведение таблицы с соответствующими возможностями. взаимодействие с основной формой наладить не будет проблемой
2. переход по записям ленточной формы можно таким способом:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sub GotoRec(KeyCode As Integer)
Select Case KeyCode
Case 40:    DoCmd.GoToRecord , , acNext
Case 38:    DoCmd.GoToRecord , , acPrevious
End Select
End Sub
 
Private Sub поле1_KeyDown(KeyCode As Integer, Shift As Integer)
GotoRec (KeyCode)
End Sub
 
Private Sub поле2_KeyDown(KeyCode As Integer, Shift As Integer)
GotoRec (KeyCode)
End Sub
1
385 / 86 / 16
Регистрация: 08.12.2012
Сообщений: 645
10.03.2020, 15:21
К сожалению ваша БД не открывается в Access 2007. Посмотреть, что у вас внутри БД - нельзя. Но исходя из вашего описания и приложенного фото - нестыковка у вас: что вводит пользователь? Правильно - одно значение. Следовательно будет выводится одно значение:
Цитата Сообщение от Soft17 Посмотреть сообщение
- Код. Переносит фокус на запись нужную;
Откуда возьмутся "коллекции записей"?
Цитата Сообщение от Soft17 Посмотреть сообщение
- Пользователь. Нажимает кнопку "вниз";
- Код. Перемещает фокус "вниз" по коллекции записей, которые соответствуют критерию;
- Пользователь. Нажимает кнопку "вверх";
- Код. Перемещает фокус "вверх" по коллекции записей, которые соответствуют критерию;
Просмотр и изменения в таблицах должны делаться пользователем в Формах.
P.S. И судя по скрину, то у вас недостает несколько таблиц.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
10.03.2020, 17:34  [ТС]
amd48, matva,
Мне нужно чтобы фокус перемещался по одному полю ленточной формы.
Если пользователь ввёл в поле главной формы "fNameStud_frm" значение "1" (fNameStud_frm = 1).
То код должен перемещать фокус по записям:
- Name Student 1;
- Name Student 11;
- Name Student 12;
- Name Student 13;
- Name Student 14;
- Name Student 15;
- Name Student 16;
- Name Student 17;
- Name Student 18;
- Name Student 19.
Т.к. эти записи содержат "1".
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
10.03.2020, 18:27
Лучший ответ Сообщение было отмечено Soft17 как решение

Решение

Цитата Сообщение от Soft17 Посмотреть сообщение
код должен перемещать фокус по записям
Используйте следующие команды. Здесь StrCond - строка сравнения.
Visual Basic
1
2
3
4
5
Me.Recordset.FindFirst "NameStud Like ""*" & StrCond & "*"""
 
Me.Recordset.FindNext "NameStud Like ""*" & StrCond & "*"""
 
Me.Recordset.FindPrevious "NameStud Like ""*" & StrCond & "*"""
Вместо Me можете указать подформу.
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
10.03.2020, 19:15  [ТС]
Цитата Сообщение от Capi Посмотреть сообщение
Вместо Me можете указать подформу.
)) Признаюсь, не сразу сообразил... Но сообразил...

1. Всё таки до конца не понимаю как это применить...
Пока не совсем понял назначение "StrCond", поэтому сделал так (см. ниже)?
Код формы frm_00_00_MainForm
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub fNameStud_frm_KeyDown(KeyCode As Integer, Shift As Integer)
   If KeyCode = 13 Then
        Me.tbl_02_Students.Form.Recordset.FindFirst "NameStud Like ""*" & Me.fNameStud_frm.Text & "*"""
   End If
End Sub
Private Sub UP_btn_Click()
        Me.tbl_02_Students.Form.Recordset.FindPrevious "NameStud Like ""*" & Me.fNameStud_frm.Text & "*"""
End Sub
 
Private Sub Down_btn_Click()
        ' Me.tbl_02_Students.SetFocus
        Me.tbl_02_Students.Form.SetFocus
        Me.tbl_02_Students.Form.Recordset.FindNext "NameStud Like ""*" & Me.fNameStud_frm.Text & "*"""
End Sub
Получаю ошибку.
Действия
1. Ввожу в поле frm_00_00_MainForm.fNameStud_frm значение 1 (Me.fNameStud_frm.Text = 1 );
2. Нажимаю кнопку "Down_btn";
3. Результат: Ошибка: 2449. Выражение содержит недопустимы метод

2. "StrCond" это про это ссылка?
Миниатюры
Перемещение фокуса по коллекции записей субФормы  
0
385 / 86 / 16
Регистрация: 08.12.2012
Сообщений: 645
10.03.2020, 19:25
Цитата Сообщение от Soft17 Посмотреть сообщение
3. Результат: Ошибка: 2449. Выражение содержит недопустимы метод
И правильно выводит. У вас есть Форма tbl_02_Students ? Нет. У Вас есть таблица, но не форма. Так чему будем присваивать Focus?
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
10.03.2020, 19:48  [ТС]
Цитата Сообщение от matva Посмотреть сообщение
И правильно выводит. У вас есть Форма tbl_02_Students ? Нет. У Вас есть таблица, но не форма. Так чему будем присваивать Focus?
Не пойму как надо?
Код формы frm_00_00_MainForm
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub Down_btn_Click()
        ' FindNextEx
        FindNextEx1
End Sub
 
Public Sub FindNextEx()
        Froms![frm_03_03_Students_Lent].Form.SetFocus
        Froms![frm_03_03_Students_Lent].Form.Recordset.FindNext "NameStud Like ""*" & Me.fNameStud_frm.Text & "*"""
End Sub
 
Public Sub FindNextEx1()
        Me.frm_03_03_Students_Lent.Form.SetFocus
        Me.frm_03_03_Students_Lent.Form.Recordset.FindNext "NameStud Like ""*" & Me.fNameStud_frm.Text & "*"""
End Sub
Миниатюры
Перемещение фокуса по коллекции записей субФормы  
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
10.03.2020, 20:34
Лучший ответ Сообщение было отмечено Soft17 как решение

Решение

Цитата Сообщение от Soft17 Посмотреть сообщение
2. "StrCond" это про это ссылка
Нет, конечно.
Это строка Dim StrCond As String, которой присваивается условие сравнения.
Вами присваивается.
Чтобы не писать сто раз одно и тоже.

И совсем не нужны эти многочисленные SetFocus, это же не DoCmd, который без этого не может.

И свойство Text применять имеет смысл только в процедуре OnChange, пока курсор в поле.
А ведь у Вас при нажатиях на Ваши кнопки поле fNameStud_frm фокус потеряло и свойство Text уже неприменимо.
Убирайте Text.

Всего-то
Visual Basic
1
2
3
4
5
6
7
8
9
10
Private Sub Down_btn_Click()
  frm_03_03_Students_Lent.Form.Recordset.FindNext "NameStud Like ""*" & Me.fNameStud_frm & "*"""
End Sub
 
Private Sub Up_btn_Click()
  frm_03_03_Students_Lent.Form.Recordset.FindPrevious "NameStud Like ""*" & Me.fNameStud_frm & "*"""
End Sub
 
' ну и для Enter это вставьте куда надо
  frm_03_03_Students_Lent.Form.Recordset.FindFirst "NameStud Like ""*" & Me.fNameStud_frm & "*"""
1
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
10.03.2020, 21:06  [ТС]
Цитата Сообщение от Capi Посмотреть сообщение
Нет, конечно.
Это строка Dim StrCond As String, которой присваивается условие сравнения.
Вами присваивается.
Чтобы не писать сто раз одно и тоже.
И совсем не нужны эти многочисленные SetFocus, это же не DoCmd, который без этого не может.
И свойство Text применять имеет смысл только в процедуре OnChange, пока курсор в поле.
А ведь у Вас при нажатиях на Ваши кнопки поле fNameStud_frm фокус потеряло и свойство Text уже неприменимо.
Убирайте Text.
Всего-то
Run-time error '424': Object required

Visual Basic
1
2
3
4
5
6
7
Private Sub Down_btn_Click()
            FindNextEx2
End Sub
 
Public Sub FindNextEx2()
           frm_03_03_Students_Lent.Form.Recordset.FindNext "NameStud Like ""*" & fNameStud_frm & "*"""          
End Sub
Миниатюры
Перемещение фокуса по коллекции записей субФормы  
Вложения
Тип файла: zip Фокус_02.zip (81.7 Кб, 11 просмотров)
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
10.03.2020, 21:56
Цитата Сообщение от Soft17 Посмотреть сообщение
Run-time error '424': Object required
Но ведь подформа у Вас называется tbl_02_Students , а не frm_03_03_Students_Lent.

Издеваетесь, честное слово...
1
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
10.03.2020, 22:03
Цитата Сообщение от matva Посмотреть сообщение
У вас есть Форма tbl_02_Students ? Нет. У Вас есть таблица, но не форма.
Правильно у него все называлось, это контрол подчиненной формы, названный так неизвестно зачем.
Вот Вы его и сбили с толку.
2
11.03.2020, 10:04

Не по теме:

Цитата Сообщение от Capi Посмотреть сообщение
Вот Вы его и сбили с толку.
Извините, не хотел сбивать с толку. Вот честно, не хотел.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.03.2020, 10:04
Помогаю со студенческими работами здесь

Перемещение фокуса курсора в начало и конец текста
Есть функция, которая в текстовом редакторе(текст вводится в RichTextBox) перемещает курсор влево или вправо при нажатии клавиш в...

Работа с консолью в Windows. Перемещение фокуса ввода на начало.
Хочу написать тетрис в текстовом режиме, а для этого надо каждый раз заново выводить заново поле с текстовым изображением предметов. Как...

Перемещение фокуса на конкретный компонент, имеющий известный TabOrder
Помогите, пожалуйста! Как выбрать элемент (переместить фокус, не курсор мыши), если известен его TabOrder? Может есть что-то проще, чем...

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

Перемещение элементов в коллекции List<T>;
Требуется в коллекции List&lt;T&gt; организовать перемещение элементов. В Delphi у класса TStringList был такой метод как MOVE вот его...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru