
Пример 6
Function КтоНачальник () As Integer
Dim frm As Form, rst As RecordSet, S As String
Set frm = Screen.ActiveForm
Set rst = frm.RecordSetClone
rst.BookMark = frm.BookMark
S = frm.BookMark
If frm.Подчиняется > 0 Then
rst.FindFirst "[Сотрудник] =" & rst![Подчиняется]
frm.BookMark = rst.BookMark
Else
MsgBox frm.[Фамилия] & " не имеет начальника"
frm.BookMark = S
End If
rst.Close
End Function
Переменной frm присваивается ссылка на активную форму, а rst - на набор записей типа RecordSet, являющийся базовым набором этой формы. Форма имеет закладку, связанную с текущей записью формы. Именно эту запись можно видеть в режиме формы. Закладка является текстовой строкой и запоминается в переменной S.
Поля Сотрудник и Подчиняется содержат номера соответствующих сотрудников (Сотрудник - номер самого сотрудника, а Подчиняется - номер его начальника). Если у сотрудника нет начальника, то поле Подчиняется содержит нуль.
Если Подчиняется > 0, то у сотрудника есть начальник. В этом случае применяется метод FindFirst (перейти к первой записи, удовлетворяющей условию в аргументе метода). В условии сравнивается значение элемента управления формы Сотрудник с значением поля Подчиняется базового набора записей. В результате отыскивается запись начальника данного сотрудника. На нее устанавливается указатель текущей записи набора RecordSet. Форма продолжает показывать прежнего сотрудника. Инструкция frm.BookMark = rst.BookMark присваивает закладке формы значение закладки базового набора. Теперь форма показывает запись не сотрудника, а его начальника.
Если у сотрудника поле Подчиняется пусто, условие в инструкции If не выполняется. В этом случае выдается информация вида "Белкин не имеет начальника", восстанавливается сохраненная в строке S закладка, и форма продолжает показывать данные того же сотрудника.
Пусть, например, базовым набором формы является таблица Сотрудники вида
Фамилия |
Сотрудник |
Подчиняется |
Лисицына |
1 |
2 |
Белкин |
2 |
0 |
Зайцева |
3 |
2 |
Волков |
4 |
3 |
Медведев |
5 |
3 |
Из таблицы видно, что у Белкина нет начальника. Ему подчиняются Лисицына и Зайцева. Зайцевой подчиняются Волков и Медведев. Пусть текущей является запись Медведева. В заголовке формы расположена кнопка, запускающая функцию КтоНачальник. После нажатия этой кнопки текущей становится запись Зайцевой.
Пример 7
Private Sub Кнопка1_Click()
Dim rst As RecordSet, S As String
Set rst = Me.RecordSetClone
rst.BookMark = Me.BookMark
S = Me.BookMark
If Not IsNull (rst!Подчиняется) Then
rst.Move (rst!Подчиняется - rst!Сотрудник)
BookMark = rst.BookMark
Else
MsgBox [Фамилия] & " без начальника"
BookMark = S
Exit Sub
End If
rst.Close
End Sub
Процедура Кнопка1_Click расположена в модуле активной формы. Для обращения к форме использовано слово Me. Слово Me означает "Форма, в модуле которой расположена данная процедура". Процедура запускается при нажатии (событие Click) кнопки Кнопка1. Процедура выполняет ту же задачу, что и предыдущая, то есть осуществляет переход к записи начальника. Из предыдущего примера видно, что номера сотрудников идут строго по порядку. Это избавляет от необходимости производить поиск записи методом Find, а сразу перейти к нужной записи с помощью метода Move.
Рассмотрим тот же пример. Запись Волкова имеет номер 4, а нужно перейти к записи номер 3. В MS Access записи не имеют номеров и перейти к записи по ее номеру нельзя. Для перемещения по записям в наборе RecordSet можно использовать методы группы Move для перехода к первой записи (MoveFirst), к последней (MoveLast), к предыдущей (MovePrevious), к следующей (MoveNext). Метод Move перемещает указатель вперед или назад по отношению к закладке. В рассматриваемом примере происходит перемещение на разность (Подчиняется - Сотрудник) записей. Если текущей была запись Волкова, то нужно переместиться на 3 - 4 = -1 записей, т.е. к предыдущей записи.