Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DAO new materials and examples.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
180.74 Кб
Скачать

Пример 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 записей, т.е. к предыдущей записи.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]