Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MVBA_2000.DOC
Скачиваний:
21
Добавлен:
08.11.2019
Размер:
599.55 Кб
Скачать

3.3.6.6. Поиск записей в объектах Recordset

Поиск записей основывается на использовании методов Seek или Find. Метод нахождения записи, отвечающей заданному критерию поиска, зависит от типа созданного объекта Recordset. Работа с объектом Recordset табличного типа позволяет использовать индексы и метод Seek. При работе с динамическим набором Recordset индексы применять нельзя. Вместо этого приходится использовать методы Find. Любой из методов поиска позволяет найти запись, соответствующую заданному условию. Эта запись становится текущей. Если поиск не был успешным, то в модели DAO текущая запись не определена, а в модели ADO указатель текущей записи помещается либо перед первой записью набора, либо после последней.

Применение методов Find

DAO

Методы FindFirst, FindLast, FindNext FindPrevios находят первую, последнюю, следующую или предыдущую запись, удовлетворяющую заданному критерию, и делают ее текущей. Они имеют следующий синтаксис:

набор_записей.{FindFirst | FindLast | FindNext | FindPrevios } критерий

где

набор_записей - ссылка на существующий объект Recordset типа динамического набора записей;

критерий - строковое выражение для поиска записей.

Пример выражения (критерий):

"Country='Germany' "

Каждый из четырех методов Find начинает поиск с разных точек и в разных направлениях:

  • метод FindFirst ищет с начала набора и к концу;

  • метод FindLast от конца к началу;

  • метод FindNext от текущей записи к концу;

  • метод FindPrevios от текущей записи к началу.

Успешность поиска можно определить по значению характеристики NoMatch объекта Recordset. Если поиск был успешен, ее значением станет False, в противном случае - True.

ADO

В объектной модели ADO существует только один метод Find, который начинает поиск всегда с текущей записи. Использование аргументов этого метода позволяют определить направление поиска (аргумент SearchDirection) и указать смещение начала поиска относительно текущей записи (аргумент SkipRows).

Применение метода Seek

Для максимально быстрого поиска записей метод Seek предусматривает индексы. Таблица должна иметь не менее одного индекса, а характеристику Index объекта Recordset нужно установить в конкретное значение индекса, используемого при поиске:

таблица.Index = имя_индекса

где

таблица - имя существующего набора записей табличного типа с индексом имя_индекса;

имя_индекса - строковое выражение, представляющее имя индекса;

DAO

Синтаксис метода Seek для объектной модели DAO:

таблица.Seek сравнение, ключ1,ключ2... ключ13

где

сравнение - строковое выражение с одним из операторов сравнения "<","<=","=",">",">=";

ключ1, ключ2 . .- значения поиска, соответствующие полям текущего индекса.

Запятая между сравнением и значениями поиска обязательна.

Например:

rst.Index="Country"

rst.Seek "=", "Argentina"

ADO

Синтаксис метода ADO отличается и имеет следующий вид:

recordset.Seek массив_значений_полей_индекса, тип_сравнения

3.3.7. Пример решения задачи в Access на основе построения vba-кода

Требуется решить задачу обработки поступления товаров на склад. База данных содержит две таблицы. Входная информация для решения задачи содержится в таблице «Наличие», а выходная – в таблице «Накладные». При решении этой задачи корректируются записи входной таблицы "Наличие" и формируются (добавляются) новые записи в выходную таблицу "Накладные".

Справочная информация о товарах, хранящихся в магазине, имеется в таблице “Наличие, содержащей следующие данные:

  • Код товара

  • Наименование товара

  • Остаток

  • Дата

  • Единицы измерения

В форму осуществляется ввод информации о каждой поступившей на склад партии товаров:

  • номер накладной

  • код товара

  • дата поступления

  • количество

В таблице "Наличие" осуществляется поиск записи с введенным кодом детали. Если искомая запись найдена, то программа должна предусмотреть выполнение следующих операций:

  1. Произвести корректировку найденной записи в таблице "Наличие", заключающуюся в добавлении к значению поля "Остаток" введенного значения "количество" и в замещении значения поля "Дата" на введенное значение "дата поступления"

  2. Добавить новую запись в таблицу "Накладные".

Выходная таблица имеет следующий состав полей:

  • Номер накладной

  • Код товара

  • Дата поступления

  • Количество

Форма, в которую осуществляется ввод данных для решения данной задачи имеет вид, представленный на рис 3.7. Текст VBA – кода размещен в модуле формы «Поступление»

Далее приводится программа решения данной задачи в двух вариантах: с использованием объектной модели DAO (Пример 3.22) и с использованием объектной модели ADO (Пример 3.23).

Р ис.3.7. Форма "Поступление"

Пример 3.22. Текст программы с использованием методов DAO

Option Compare Database

Option Explicit

Dim n As String

Dim t As String

Dim d As Date

Dim k As Single

Private Sub Кнопка_ОК_Click()

On Error GoTo Err_Кнопка_ОК_Click

n = Поле_нн.Value

t = Поле_кт.Value

d = Поле_дп.Value

k = Поле_кл.Value

Obrabotka

Поле_нн.Value = Null

Поле_кт.Value = Null

Поле_дп.Value = Null

Поле_кл.Value = Null

Exit_Кнопка_ОК_Click:

Exit Sub

Err_Кнопка_ОК_Click:

MsgBox Err.Description

Resume Exit_Кнопка_ОК_Click

End Sub

Private Sub Кнопка_выход_Click()

On Error GoTo Err_Кнопка_выход_Click

DoCmd.Close

Exit_Кнопка_выход_Click:

Exit Sub

Err_Кнопка_выход_Click:

MsgBox Err.Description

Resume Exit_Кнопка_выход_Click

End Sub

Function Obrabotka()

Dim dbs As Database

Dim rst As DAO.Recordset

Dim nst As DAO.Recordset

Set dbs = CurrentDb

Set rst = dbs.OpenRecordset("Наличие")

Set nst = dbs.OpenRecordset("Накладные")

rst.MoveFirst

Do Until rst.EOF

If t = rst![Код товара] Then

rst.Edit

rst![Остаток] = rst![Остаток] + k

rst![Дата] = d

rst.Update

nst.AddNew

nst![Номер накладной] = n

nst![Код товара] = t

nst![Дата поступления] = d

nst![Количество] = k

nst.Update

End If

rst.MoveNext

Loop

End Function

Пример 3.22. Текст программы с использованием методов ADO

Option Compare Database

Option Explicit

Dim n As String

Dim t As String

Dim d As Date

Dim k As Single

Private Sub Кнопка_ОК_Click()

On Error GoTo Err_Кнопка_ОК_Click

n = Поле_нн.Value

t = Поле_кт.Value

d = Поле_дп.Value

k = Поле_кл.Value

Obrabotka

Поле_нн.Value = Null

Поле_кт.Value = Null

Поле_дп.Value = Null

Поле_кл.Value = Null

Exit_Кнопка_ОК_Click:

Exit Sub

Err_Кнопка_ОК_Click:

MsgBox Err.Description

Resume Exit_Кнопка_ОК_Click

End Sub

Private Sub Кнопка_выход_Click()

On Error GoTo Err_Кнопка_выход_Click

DoCmd.Close

Exit_Кнопка_выход_Click:

Exit Sub

Err_Кнопка_выход_Click:

MsgBox Err.Description

Resume Exit_Кнопка_выход_Click

End Sub

Function Obrabotka()

Dim rst As New ADODB.Recordset

Dim nst As New ADODB.Recordset

rst.Open "Наличие", CurrentProject.Connection, adOpenKeyset, _ adLockOptimistic

nst.Open "Накладные", CurrentProject.Connection, adOpenKeyset, _ adLockOptimistic

rst.MoveFirst

Do Until rst.EOF

If t = rst![Код товара] Then

rst![Остаток] = rst![Остаток] + k

rst![Дата] = d

nst.AddNew

nst![Номер накладной] = n

nst![Код товара] = t

nst![Дата поступления] = d

nst![Количество] = k

nst.Update

End If

rst.MoveNext

Loop

End Function

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