Слайд 30Sub СвойстваФормыAccess ()
DoCmd.OpenForm FormName:="Мы", view:=acDesign
With Forms!Мы
.Caption = "Сведения
о клиентах"
.Modal = True
.DefaultView = 1
.AllowEdits =
False
.AutoResize = False
.AutoCenter = True
.Width = 300
.Picture = "d:\f1.bmp"
.Tag = "0"
.OnActivate = "=FunctionName ()"
.OnCurrent = "[Процедура обработки событий]"
.OnClose = "Макрос"
End With
DoCmd.OpenForm "Мы"
End Sub
Sub ОткрытиеОтчетаAccess ()
DoCmd.OpenForm "Выставка"
ответ = MsgBox ("Вывести отчет ?", vbYesNoCancel)
If ответ = vbYes Then
DoCmd.OpenReport "Выставка", acPreview
MsgBox Screen.ActiveReport.Name
End Sub
acDesign
acFormDS
acFormPivotChart
acFormPivotTable
acNormal default
acPreview
Немодальный режим открытия окна - допускается переход в другие окна. Модальный режим - форма или отчет сохраняет фокус до своего закрытия.
Параматры метода OpenForm:
OpenForm(FormName, View, FilterName, WhereCondition, DataMode, WindowMode, OpenArgs)
Слайд 32Sub ЗакрытьФормуОтчет ()
DoCmd.OpenForm “Сотрудники“,,, “Должность = “”дилер””
MsgBox Forms (“Сотрудники“).Caption
DoCmd.Close acForm, "Сотрудники", acPrompt
DoCmd.OpenReport “Сотрудники“, acViewPreview
MsgBox Reports!Сотрудники.Page
DoCmd.Close
Save:=acSaveYes
End Sub
Function КонецРаботыAccess ()
ответ = MsgBox ("Закончить работу?", vbYesNoCancel + vbQuestion)
Select Case ответ
Case vbYes
DoCmd.Quit acPrompt
КонецРаботыAccess = True
Case vbNo
DoCmd.Close acForm, "Форма Таблицы1", acSaveYes
КонецРаботыAccess = False
Case vbCancel
КонецРаботыAccess = False
End Select
End Function
OpenArgs – установлен фильтр на значение поля ДОЛЖНОСТЬ
Слайд 33Методы объекта Form
Обновление объектов, активных таблиц и запросов выполняется
методом Requery:
имяОбъекта.Requery
DoCmd.Requery
Sub ПолеФормыAccess ()
Dim поле As Control
DoCmd.OpenForm
"Клиенты"
Set поле = Forms!Клиенты![Обращаться к]
поле = "Сергей Петров"
Forms!Клиенты.Refresh ‘ данные обновляются только на форме
End Sub
Слайд 34Событие До обновления (BeforeUpdate) возникает в момент перемещения с записи
на запись. Если пользователь изменяет запись, свойство формы Dirty становится
истинным, и если после этого аргументу Cancel присвоить значение True, событие отменяется. Метод Undo восстанавливает исходные данные.
Событие После обновления (AfterUpdate) используется для выполнения определенных действий в зависимости от введенных в поле значений.
При передаче фокуса от одного элемента управления к другому возникают события Вход (Enter), соответствующее приему фокуса, и Выход (Exit), соответствующее его потере.
Для выявления идентичных объектов можно использовать оператор Is. Он определяет логический результат как Null или Not Null.
Для ссылок из формы или отчета на объект Recordset используется свойство RecordSetClone. Оно определяет копию записей базовой таблицы или запроса, указанных в свойстве Источник записей формы. В частности, если форма основана на запросе, то обращение к свойству RecordsetClone эквивалентно созданию копии объекта Recordset с помощью того же запроса.
Sub СвободныеЭлементыAccess()
Dim надпись As Object, поле As Object
DoCmd.OpenForm "Форма1"
Set надпись = Forms!Форма1.Надпись1
Set поле = Forms!Форма1.Поле0
надпись.Caption = поле.Text
End Sub
Надпись на метке, кнопке, заголовке формы или отчета
Слайд 35Sub ОбновлениеЧерезФормуAccess ()
DoCmd.OpenForm "Сотрудники", , , "Фамилия = 'Иванов'"
Set где = Forms!Сотрудники
If IsNull (где.оклад) Then где.оклад = 0
где.оклад = InputBox ("Можно заменить " & Str (где.оклад), , где.оклад)
DoCmd.Requery
End Sub
Sub СтильПоляФормы ()
DoCmd.OpenForm "Клиенты", acDesign, , , , acHidden
Set поле = Forms!Клиенты!Имя
поле.FontSize = 14
поле.FontName = "Times New Roman Cyr"
поле.Enabled = False
DoCmd.Save acForm, "Клиенты"
DoCmd.OpenForm "Клиенты"
End Sub
Sub НадписьAccess ()
Set форма = Forms![Сотрудники]
With форма
.[ОкладНадпись].Caption = "Должность"
.Controls![ОкладНадпись].FontName = "Arial Cyr"
.Оклад.SetFocus
.Оклад.Requery
.Дата.Enabled = False
End With
End Sub
Слайд 36Sub Form_Current ()
p = Me![Поле1] Like "К*" ‘логическое значение
If
p Then
MsgBox "Кузнецов!"
Else
MsgBox "Не он"
End Sub
Sub Кнопка_ Click ()
On Error GoTo 1
Err.Clear
With Me
!Премия.SetFocus
память = !Премия.Text
!Оклад.SetFocus
!Оклад.Text = Val (!Оклад.Text) + Val (память)
.Refresh
End With
Exit Sub
1:
MsgBox "Ошибка номер " & Err
End Sub
Слайд 37Sub КнопкаОшибки_Click ()
On Error GoTo 1
Err.Clear
n = InputBox ("Введите
число")
Me!Оклад.SetFocus
Me!Оклад.Text = n
Me.Refresh
Exit Sub
1:
m
= "Ошибка № " & Str (Err.Number) & " возникла в " & Err.Source & Chr (13) & _ Err.Description
MsgBox m, , "Ошибка"
End Sub
Sub ФормаAccess_BeforeUpdate (Cancel As Integer)
If Me.Dirty Then ‘ данные на форме изменились
If MsgBox ("Сохранить изменения?", vbYesNo) = vbNo Then
Me.Undo
End If
End Sub
Sub ФормаAccess_AfterUpdate ()
MsgBox “в “ & Me.Name & “кое-что изменилось“
End Sub
Слайд 38Sub НавигацияAccess()
DoCmd.OpenForm "Сотрудники"
Set форма = Forms!Сотрудники
DoCmd.GoToRecord , ,
acLast
форма.Надпись.Caption = Str(форма.CurrentRecord)
DoCmd.GoToRecord , , acNewRec ‘ новая запись
форма.Фамилия =
InputBox ("Следующий?")
форма.Refresh
End Sub
‘ DoCmd.GoToRecord acActiveDataObject(default), ObjectName, acNext(default), Offset
Function ПодчиненнаяФормаAccess()
DoCmd.OpenForm "Главная"
DoCmd.GoToControl "Подчиненная форма"
DoCmd.GoToRecord , , acNewRec
With Forms!Главная
![Подчиненная форма]!ПодчТовар = !КлиентыТовар
![Подчиненная форма]!ПодчНазвание = !КлиентыНазвание
![Подчиненная форма]!ПодчЦена = !КлиентыЦена
End With
Forms!Главная.Refresh
End Function
Слайд 39Sub Дни_Click ()
On Error GoTo label0
Dim день(1) As
Date, ошибки As Integer, поле As Object
Set поле =
Me!дата
DoCmd.GoToRecord , , acFirst
Do While 1
день (0) = поле
DoCmd.GoToRecord , , acNext
день (1) = поле
If DateDiff ("d", день (0), день (1)) <> 1 Then
MsgBox день (0) & " или " & день (1) & " неверно" ошибки = ошибки + 1
End If
Loop
label0:
MsgBox "Всего ошибок: " & Str (ошибки)
End Sub
Sub ОткрытыеОтчеты ()
список = "Открыто отчетов: " & Reports.Count
For Each отчеты In Reports
список = список & Chr (13) & отчеты.Name
For Each объекты In отчеты.Controls
список = список & Chr(13) & "Объект " & объекты.Name
Next объекты
Next отчеты
MsgBox список
End Sub
Слайд 40Sub ЗапросSQL ()
DoCmd.OpenForm "Сотрудники"
DoCmd.RunSQL “UPDATE Сотрудники SET Родился
= #01/12/02# WHERE Номер = 28“
DoCmd.RunSQL “DELETE FROM Сотрудники
WHERE Родился = #01/12/02#“
DoCmd.RunSQL “INSERT INTO Сотрудники (ФИО, Родился, Должность) VALUES (”Кто-то‘, #01/12/12#, ”Дилер‘)“
DoCmd.Requery
End Sub
Sub ПеренумероватьЗаписи ()
DoCmd.RunSQL "ALTER TABLE Сотрудники DROP COLUMN z"
DoCmd.RunSQL "ALTER TABLE Сотрудники ADD COLUMN z COUNTER"
DoCmd.OpenForm "Сотрудники"
End Sub
Sub ЗапросAccess ()
DoCmd.SetWarnings False
DoCmd.OpenForm "Сотрудники", acDesign, , , , acHidden
DoCmd.OpenQuery "Запрос1"
DoCmd.Close acForm, "Сотрудники"
DoCmd.SetWarnings True
End Sub
Слайд 41Sub АнализТаблицыЧерезФорму ()
DoCmd.OpenForm "Выставка"
MsgBox Forms (“Выставка“).RecordsetClone.RecordCount & "
записей "
End Sub
Sub AccessForm_Open ()
If Me.RecordsetClone.RecordCount =
0 Then
MsgBox "Записей нет", vbInformation
Else
MsgBox Me.RecordsetClone.RecordCount & " записей"
End If
End Sub
Sub ФормаADO ()
Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset
cnn.Open "DBQ=D:\Сотрудники.xls; Driver={Microsoft Excel Driver (*.xls)}"
rst.CursorType = adOpenStatic
rst.Open Лист1, cnn
DoCmd.OpenForm “Form1“
Set Forms (“Form1“).Recordset = rst
Forms (“Form1“).Controls ("Надпись").Caption = rst.RecordCount
Forms (“Form1“).Controls ("Список").RowSource = "select * from rst.Source"
End Sub
Слайд 42Курсор
Курсор – текущая запись. Типы курсора:
adOpenStatic. Изменения, внесенные другими пользователями
– невидимы
adOpenForwardOnly. Подобен первому типу, однако можно передвигаться только вперед
по записям (быстрый метод)
adOpenDynamic. Чужие изменения записей отображаются, перемещение по записям в любом направлении.
adOpenKeyset. Как третий тип, но не отображаются добавленные записи.
Программное блокирование записей
Для исключения возможности внесения изменения в запись, редактируемую другим пользователем, каждый пользователь должен заблокировать запись перед ее редактированием. Типы блокировки:
adLockReadOnly - чтение записей без их блокировки.
adLockPessimistic – запись блокируется при получении доступа к ней и освобождается при переходе к другой записи.
adLockOptimistic – запись блокируется в момент ее изменения (update)
recordset.Update Fields, Values
record.Fields.Update
adLockBatchOptimistic - запись блокируется, когда выполняется команда updatebatch (пакетное изменение)
Слайд 43Название текущей версии DAO — MS DAO 3.6 Object Library.
Обращение к элементам библиотек классов DAO и ADO и все
обращения в запросах SQL:
имяКласса. имяОбъекта. Элемент
Составные имена заключаются в скобки [].
1. класс Workspace - доступ к данным модели DAO:
DBEngine!CreateWorkspace (имяРабочейОбласти, Пользователь, Пароль [,Тип])
2. метод CreateDatabase - создание новых БД:
[рабочаяОбласть].CreateDatabase (имяБазыДанных,Язык, [Параметры] )
где рабочаяОбласть - ссылка на объект Workspace, Язык (константы dbLangGeneral, dbLangCirillic) определяет порядок сортировки данных, а необязательные Параметры задают формат ядра Jet и необходимость шифрования.
3. метод OpenDatabase - открытие БД:
[базаДанных.][рабочаяОбласть.]OpenDatabase(имяБазыДанных[,Монопольность [,толькоЧтение[,Источник]]] )
Если БД уже открыта, к ней удобно обращаться через функцию CurrentDb:
CurrentDB!имяТаблицы!имяПоля.имяСвойства , CurrentDB!QueryDefs!имяЗапроса
Процедурное программирование в DAO
Слайд 44Результирующие множества записей – объекты классов TableDef и QueryDef –
создаются методами CreateTableDef, CreateQueryDef:
[рабочаяОбласть.]базаДанных.CreateTableDef («имяТаблицы»)
[рабочаяОбласть.]базаДанных.CreateQueryDef ([запрос SQL])
Объекты
классов TableDef и QueryDef открываются методом OpenRecordset и закрываются с удалением из семейства Databases методом Close объекта Database:
• базаДанных.OpenRecordset (Источник [,Тип, Параметры] )
• объект.OpenRecordset (Источник [,Тип, Параметры] )
• базаДанных.Close
• объект.Close
Поля таблиц вначале создаются, затем добавляются в семейства, после чего обновляется окно БД:
Set объектПоле = объектТаблица.CreateField (имяПоля, Тип, [Размер])
объектТаблица.Fields.Append объектПоле
базаДанных.TableDefs.Append объектТаблица
RefreshDatabaseWindow
Доступ к полям реализуется через объекты класса Fields:
• имяТаблицыИлиЗапроса.Fields!имяПоля
• имяТаблицыИлиЗапроса. имяПоля
• имяТаблицыИлиЗапроса!Fields!имяПоля
• имяТаблицыИлиЗапроса! имяПоля
• Parent!имяПоляГлавнойФормы
Слайд 45Извлечение информации с помощью DAO:
1. создать рабочую область (объект Workspace)
2.
открыть БД (объект Database)
3. создать набор записей (объект Recordset), выбрать
записи и поля
Рабочая область - метод CreateWorkspace объекта DBEngine:
Set РабочаяОбласть = CreateWorkspace(Name, UserName, Password, UseType)
Рабочая области MS Jet:
Dim РабочаяОбласть As CreateWorkspace
Set РабочаяОбласть = DBEngine.CreateWorkspace(Name:="МояОбласть", _ UserName:="admin", Password:="", UseType:=dbUseJet)
Рабочая область ODBCDirect (ссылка на объект DBEngine применяется по умолчанию, поэтому во второй инструкции объект DBEngine опущен):
Dim РабочаяОбласть As CreateWorkspace
Set РабочаяОбласть = CreateWorkspace(Name:="МояОбласть", UserName:="UID", Passwords:="", UseType:=dbUseODBC)
Открыть БД можно методом OpenDatabase объекта Workspace.
Set БазаДанных = РабочаяОбласть.OpenDatabase (name, options, readonly, connect)
Слайд 46Объект DAO Recordset
В модели DAO присутствуют 4 типа объектов RecordSet:
Тип Table представляет набор записей одной таблицы открытого файла
БД. Он не обрабатывает связанные таблицы и таблицы ODBC и обслуживает только рабочие области Jet.
Тип Dynaset представляет динамический набор записей таблицы открытой БД, связанной таблицы, результата выполнения запроса или оператора SELECT. Он состоит из ссылок, поэтому обрабатывается медленнее, чем Table и иногда не обновляется, но охватывает более широкую область данных.
Тип Snapshot представляет статическую копию таблицы, запроса или оператора SQL SELECT, удобную для выборки данных и создания отчетов.
Тип Forward-Only представляет аналогичную копию, предназначенную для единовременного просмотра данных.
БД.OpenRecordSet (Источник [, Тип, Параметры, Блокировка])
Здесь Источник – это строка с именем таблицы, запроса или текстом SQL, далее следует тип объекта RecordSet, по умолчанию Table для таблиц и Dynaset для запросов и связанных таблиц. Любой объект RecordSet существует только в рамках своей процедуры, а затем уничтожается. Его можно закрыть раньше методом Close.
Используйте объект Recordset для:
создания вложенных форм, т.е. формы с подчиненной формой, для обращения к одному и тому же множеству данных. Это позволит синхронизировать представление данных
Set Me.Recordset = Forms!Form1.Recordset
обращения к методам объекта Recordset, не поддерживаемым свойствами формы. Например, с методом Find для поиска записи по параметрам, заданным в полях формы.
Слайд 47Sub РабочаяОбластьDAO ()
Set область = DBEngine.Workspaces (0)
Set новаяБД
= область.CreateDatabase ("Школьники.mdb", dbLangGeneral)
Set другаяБД = область.OpenDatabase ("Транспорт")
MsgBox
другаяБД.Name & Chr (13) & новаяБД.Name & Chr (13) & CurrentDb.Name
End Sub
В отличие от режима работы через интерфейс пользователя, VBA может одновременно открыть несколько БД, хотя на экране отображается только одна из них. Полный путь к открытой БД возвращает выражение объект.Name.
Sub БазыДанныхDAO()
Set текущаяБД= CurrentDb()
Set новаяБД = CreateDatabase ("Студенты.mdb", dbLangCyrillic)
Set другаяБД = OpenDatabase ("Пользователи.mdb")
MsgBox другаяБД.Name & Chr (13) & новаяБД.Name & Chr (13) & текущаяБД.Name
End Sub
Sub НаборыЗаписейDAO ()
Set tdf1 = CurrentDb.OpenRecordset ("Сотрудники", dbOpenDynaset)
Set tdf2 = CurrentDb.OpenRecordset ("Категории")
Set tdf3 = CurrentDb.OpenRecordset ("SELECT * FROM Поставщики")
Set tdf4 = CurrentDb!Поставщики.OpenRecordset
Set tdf5 = CurrentDb.QueryDefs (“Продажи“).OpenRecordset
tdf.Close
End Sub
Слайд 48Sub УправлениеТаблицей ()
Set tdf = CurrentDb.OpenRecordset ("Отделы")
MsgBox "Таблица открыта"
tdf.Close
MsgBox "Таблица закрыта"
End Sub
Sub СозданиеТаблицы ()
Set область
= DBEngine.Workspaces (0)
Set БД = область.OpenDatabase (“C:\Учащиеся.mdb“)
Set таблица = БД.CreateTableDef ("НоваяТаблица")
таблица.Fields.Append таблица.CreateField (“Кто“, dbText)
таблица.Fields.Append таблица.CreateField (“Когда“, dbDate)
БД.TableDefs.Append таблица
БД.TableDefs.Refresh
Set таблица = Nothing
Set БД = Nothing
End Sub
Sub УдалениеТаблицы ()
CurrentDb.TableDefs.Delete “НоваяТаблица“
CurrentDb.TableDefs.Refresh
RefreshDatabaseWindow
End Sub
Слайд 49Sub ДоступКПолямDAO ()
MsgBox CurrentDb!Таблица1.Fields(1).Name & Space (2) & CurrentDb!Таблица1.Fields(2).Name
& Chr (13) & "Всего полей: " & CurrentDb!Сотрудники.Fields.Count
End
Sub
Sub ЗапросDAO ()
s=CurrentDB.CreateQueryDef (“зСотр“, “SELECT * FROM Сотрудники ORDER BY Сотрудники.ФИО“)
RefreshDatabaseWindow
End Sub
При создании объекта RecordSet строки данных помещаются в буфер и не выводятся на экран, а указатель позиционирует на текущей записи. При открытии набора записей активной становится первая запись. Для перемещения к другим записям используются методы MoveFirst, MoveNext, MovePrevious, MoveLast.
Методом BookMark можно определять закладки и возвращаться впоследствии к запомненным в них записям:
объектЗакладка = объектНабор.BookMark
…
объектНабор.BookMark = объектЗакладка
Метод Move числоСтрок [,Закладка] смещает указатель на требуемое число записей вперед или назад.
Свойства BOF и EOF объекта Recordset фиксируют выход за пределы набора записей.
Слайд 50Для поиска определенной записи в наборах типа Table используется метод
Seek, а в наборах других типов – методы FindFirst, FindNext,
FindPrevious, FindLast. Найденная запись становится текущей, а свойство NoMatch устанавливается в False. При отсутствии искомой записи NoMatch = True:
• объект.Seek «оператор», списокКлючей
• объект.Find… «критерий»
Используются операторы >, <, >=, <=, =, а список ключей описывает поля текущего индекса. Критерий представляет логическое выражение вида «Поле оператор Значение».
В модели DAO изменения в таблицы вносятся последовательно. Предварительно запись копируется в специальную область памяти – буфер копирования методом Edit, а затем методом Update возвращается в объект Recordset. Update сохраняет изменения. При необходимости буфер копирования очищается методом CancelUpdate:
объект.Move… или Find… или Seek
объект.Edit
объект.имяПоля = Значение
объект.Update или объект.CancelUpdate
Новые записи не добавляются прямо в БД, а сначала помещаются в буфер копирования, затем обновляют набор методом AddNew. В наборах типа Dynaset и Table без индекса новая запись добавляется в конец набора данных. Для добавленной записи автоматически создается закладка в свойстве LastModified. Указатель текущей записи при этом автоматически не перемещается.
Удаляемая запись помещается в буфер удаления и остается текущей. Удаление выполняется без предупреждения и отмены. БД Access необходимо сжимать (до 2 МБ).
Слайд 51Sub ПоискDAO ()
Set tdf1 = CurrentDb.OpenRecordset ("Сотрудники")
tdf1.Index = "PrimaryKey"
tdf1.Seek
"=", "Иванов"
Set tdf2 = CurrentDb.OpenRecordset ("Командировки", dbOpenSnapshot)
tdf2.FindFirst "Кто =
'Алексеев'"
End Sub
Sub ЗаписиDAO ()
Set базаДанных = CurrentDb
строкаSQL = "SELECT * FROM Таблица1 WHERE Фирма LIKE 'I*'"
Set результатЗапроса = БД.OpenRecordset (строкаSQL)
результатЗапроса.MoveFirst
MsgBox результатЗапроса.Fields(0) & " - " & результатЗапроса.Fields(2)
результатЗапроса.FindFirst "Фирма = 'Intel'"
MsgBox результатЗапроса.Fields(0) & " - " & результатЗапроса.Fields(2)
результатЗапроса.FindNext "Фирма = 'Intel'"
MsgBox результатЗапроса.Fields(0) & " - " & результатЗапроса.Fields(2)
результатЗапроса.MoveLast
MsgBox результатЗапроса.RecordCount
End Sub
Слайд 52Sub ОбновлениеЗаписейDAO ()
Set rst = CurrentDb.OpenRecordset ("Таблица1")
где = "Фирма
= 'Intel'"
DoCmd.RunSQL "UPDATE Таблица1 SET Цена = 5 WHERE
NТовара=2"
DoCmd.RunSQL "UPDATE Таблица1 SET Фирма = 'LG' WHERE " & где
DoCmd.RunSQL "UPDATE Таблица1 SET Фирма = 'Zilog' WHERE " & "Фирма = 'LG'"
rst.Close
Set rst = Nothing
End Sub
Sub АнализЗаписейDAO ()
Set db = CurrentDb
Set rst = db.OpenRecordset ("Таблица1", dbOpenDynaset)
где = "Фирма = 'Intel'"
rst.MoveFirst
rst.FindFirst где
If rst.NoMatch = False Then MsgBox "Фирма есть в этой таблице"
rst.FindNext где
If rst.NoMatch=True Then MsgBox "Фирма только одна"
rst.Close
db.Close
Set rst = Nothing
Set db = Nothing
End Sub
Слайд 53Sub СписокБазыДанныхDAO ()
Set текущаяБД = CurrentDb
Set рабочаяОбласть = DBEngine.Workspaces(0)
Set
новаяБД = рабочаяОбласть.CreateDatabase ("Студенты.mdb", dbLangGeneral)
Set другаяБД = рабочаяОбласть.OpenDatabase ("ФирмаГодПрезидент")
For Each БД In рабочаяОбласть.Databases
список = список & Chr (13) & БД.Name
Next БД
MsgBox список
End Sub
Sub СписокПолейDAO ()
Set db = CurrentDb
Set tdf = db!Таблица1
For Each fld In tdf.Fields
строка = строка & Chr (13) & fld.Name
Next fld
MsgBox строка
End Sub
Слайд 54Sub ЗаменаДанныхDAO ()
Set объект = CurrentDb.OpenRecordset ("Товары", dbOpenDynaset)
критерий =
"NТовара = 1"
объект.FindFirst критерий
Do Until объект.NoMatch
With объект
.Edit
.NТовара = 333
.Update
.FindNext
критерий
End With
Loop
объект.Close
Set объект = Nothing
End Sub
Sub ЧтениеДанныхDAO ()
‘ В Access для загрузки в массив строк объекта Recordset используется метод GetRows
Set объект = CurrentDb.OpenRecordset("Товары")
массив = объект.GetRows (объект.RecordCount)
For Each элемент In массив
строка = строка & элемент & chr (13)
Next
MsgBox строка
End Sub
Слайд 55Sub ПравкаТаблицDAO ()
Set таблица = CurrentDB.OpenRecordset ("Таблица1")
таблица.MoveFirst
таблица.Edit
таблица.Fields
(Фирма) = "SCAN"
таблица.Fields (Год) = 2005
строкаSQL = "UPDATE
Таблица1 SET NТовара = 22 WHERE NТовара = 2 "
CurrentDb.Execute строкаSQL
таблица.AddNew
таблица.Fields (ФИО) = “Новый“
таблица.Update
таблица.BookMark =таблица.LastModified
таблица.Move 5
таблица.Delete
таблица.moveNext
End Sub
Слайд 56Создание таблицы с помощью DAO
Option Explicit 'предписание явного объявления
переменных
Sub Create_table()
Dim db As Database, td As TableDef, fld
As Field ‘Объектные переменные для БД, таблиц и полей
Set db = CurrentDb ‘Ссылка на текущую БД
Set td = db.CreateTableDef("Временная") ‘Новая таблица, метод CreateTableDef объекта Database
Set fld = td.CreateField("НомерЗачетки", dbByte) ‘Тип поля Byte, метод CreateField объекта TableDef
td.Fields.Append fld 'Добавляем поле в семейство Fields таблицы
Set fld = td.CreateField("Фамилия", dbText) ‘Тип поля текстовый
td.Fields.Append fld ‘Добавляем поле "Фамилия" в семейство Fields таблицы
db.TableDefs.Append td 'Добавляем таблицу к семейству TableDefs БД
db.TableDefs.Refresh 'Обновляем количество объектов семейства TableDefs
End Sub
Удаление таблицы с помощью DAO
Sub Del_table()
Dim db As Database
Set db = CurrentDb 'Устанавливаем ссылку на текущую БД
db.TableDefs.Delete "Временная"
db.TableDefs.Refresh
Set db = Nothing 'Освобождаем объектную переменную
End Sub
Создание запроса с помощью DAO
Public Sub CreateQueryDAO()
Dim db As Database, qd As QueryDef, rs As DAO.Recordset
Set db = CurrentDb
Set qd = db.CreateQueryDef("Отличники") 'новый запрос сохраняем в БД
qd.SQL = "SELECT код, предмет, оценка FROM Экзамены WHERE (оценка)=5"
Set rs = qd.OpenRecordset(dbOpenDynaset) ‘набор записей на базе нового запроса
Set rs = Nothing
End Sub
Слайд 57Sub ConnectionObjectX()
Dim wrkJet as Workspace, dbsNorthwind As Database, wrkODBC
As Workspace, conPubs As Connection
Set wrkJet = CreateWorkspace("NewJetWorkspace", "admin",
"", dbUseJet) ' (DAO)
Set dbsNorthwind = wrkJet.OpenDatabase("Northwind.mdb")
Set wrkODBC = CreateWorkspace("NewODBCWorkspace", "admin", "", dbUseODBC) ‘(DAO)
‘The DSNs must be configured to use Microsoft Windows NT Authentication Mode to authorize user access to the MS SQL Server
Set conPubs=wrkODBC.OpenConnection("Connection1", , , ODBC; DATABASE=pubs; DSN=Publishers")
Debug.Print "Database properties:"
With dbsNorthwind
For Each prpLoop In .Properties
Debug.Print " " & prpLoop.Name & " = " & prpLoop.Value
Next prpLoop
End With
For Each conLoop In wrkODBC.Connections
Debug.Print "Connection properties for " & conLoop.Name & ":"
Next conLoop
dbsNorthwind.Close
conPubs.Close
wrkJet.Close
wrkODBC.Close
End Sub
Cтрока соединения — это единое целое, включающее в себя блоки информации о провайдере и пути к БД, разделенные символом точки с запятой
Слайд 59Dim conn As ADODB.Connection 'declare conn to be a Connection
Set
conn = New ADODB.Connection ' make a connection object
conn.Provider =
"Microsoft.Jet.OLEDB.4.0“ ' specify what kind of data provider it is
conn.Open "c:/walter/ass21.mdb“ ' open the connection on one database
Dim myTableRS As ADODB.Recordset ' declare a recordset
Set myTableRS = New ADODB.Recordset ' make one
' open it using a table in the database, and the connection
myTableRS.Open "myTable", conn, adOpenDynamic, adLockPessimistic
myTableRS.MoveFirst ' go to start of recordset
' until we reach the end..
Do Until myTableRS.EOF
MsgBox (myTableRS.Fields("ID")) ' display the ID field in current row
myTableRS.MoveNext ' move next row
Loop
myTableRS.Close 'close the recordset
Set myTableRS.ActiveConnection = Nothing
conn.Close ' and the connection
Set conn = Nothing
Слайд 60Dim conn As ADODB.Connection
Dim myTableRS As ADODB.Recordset
Set conn = New
ADODB.Connection
Set myTableRS = New ADODB.Recordset
conn.Provider = "Microsoft.Jet.OLEDB.4.0"
conn.Open "c:/walter/ass21.mdb"
myTableRS.Open "myTable", conn,
adOpenStatic, adLockOptimistic
Dim wanted As String
Text5.SetFocus
wanted = Text5.Text
myTableRS.Find "ID = " & wanted
If Not myTableRS.EOF Then
Label8.Caption = myTableRS.Fields("Name")
Else
Label8.Caption = "Not found"
End If
Поиск записи
Поиск записиFind a row with a certain key field value and display other field
Выбор значения их текстового поля
Поиск
Отображение результатов
Слайд 61Dim conn As ADODB.Connection
Dim myTableRS As ADODB.Recordset
Set conn = New
ADODB.Connection
Set myTableRS = New ADODB.Recordset
conn.Provider = "Microsoft.Jet.OLEDB.4.0"
conn.Open "c:/bd1.mdb"
myTableRS.Open "myTable", conn,
adOpenStatic, adLockOptimistic
myTableRS.MoveFirst
Do While Not myTableRS.EOF
myTableRS.Fields("PhoneNumber") = myTableRS.Fields("PhoneNumber") + 1
myTableRS.Update
myTableRS.MoveNext
Loop
myTableRS.Close
Set myTableRS.ActiveConnection = Nothing
conn.Close
Запись результатов в БД
Слайд 62Вставка записей
myTableRS.Open "myTable", conn, adOpenDynamic, adLockPessimistic
myTableRS.AddNew
nameTxtBox.SetFocus
myTableRS.Fields("Name") = nameTxtBox.Text
phoneTxtBox.SetFocus
myTableRS.Fields("PhoneNumber") = phoneTxtBox.Text
myTableRS.Update
myTableRS.Close
Новая
запись добавляется в конец таблицы. В РБД порядок записей не
имеет значения.
Удаление записей
IDTxtBox.SetFocus
myTableRS.Find "ID = " & IDTxtBox.Text
If Not myTableRS.EOF Then
myTableRS.Delete
myTableRS.Update
MsgBox ("Record deleted")
Else
MsgBox ("No matching record")
End If
myTableRS.Close
Слайд 63myTableRS.Open "Select ID, name From myTable", conn, adOpenDynamic, adLockPessimistic
Do While
Not myTableRS.EOF
For i = 1 To myTableRS.Fields.Count
Debug.Print myTableRS.Fields(i - 1),
Next
Debug.Print
myTableRS.MoveNext
Loop
_______________________________________________________________
Использование
SQL
Объект Command
Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
conn.Provider = "Microsoft.Jet.OLEDB.4.0"
conn.Open "c:/db1.mdb"
Dim myCommand As ADODB.command
Set myCommand = New ADODB.command
myCommand.ActiveConnection = conn
myCommand.CommandText="Update myTable set phone=phone + 2"
myCommand.Execute
conn.Close
Set conn = Nothing
Слайд 64Создание таблицы с помощью ADO
Sub ADO()
Dim cnn As New ADODB.Connection 'Соединение
с текущей БД
Dim cat As New ADOX.Catalog
Set cnn = CurrentProject.Connection
'Используется объект модели объектов Access
cat.ActiveConnection = cnn
Debug.Print cat.Tables(0).Type
Dim Table
Set Table = CreateObject("ADOX.Table") 'Создаем таблицу в ADO
Table.name = "Временная_2"
Table.Columns.Append "НомерЗачетки", dbInteger 'Создаем столбец
Table.Columns.Append "Фамилия", dbText
cat.Tables.Append Table 'Добавляем таблицу к семейству Tables
Set cat = Nothing
End Sub
Удаление таблицы с помощью ADO
Sub ADO_del()
Dim cnn As New ADODB.Connection 'Соединение с текущей БД
Dim cat As New ADOX.Catalog
Set cnn = CurrentProject.Connection 'Используется объект модели объектов Access
cat.ActiveConnection = cnn
Debug.Print cat.Tables(0).Type
cat.Tables.Delete ("Временная_2")
End Sub
Слайд 65Sub ADO_1()
Dim Cnn As New ADODB.Connection, rsADO As New ADODB.
Recordset
Set cnn = New ADODB.Connection
Set rsADO = New ADODB.Recordset
Cnn.Mode=adModeShareDenyNone ‘по умолчанию
Shared
cnn.Open "Provider=Microsoft.jet.oledb.4.0;Data Source=D:/Wind.mdb;”
‘ Set con = CurrentProject.Connection
rsADO.Open "tblAccount", cnn, adOpenKeyset, adLockOptimistic
Do While Not rsADO.EOF
rsADO![Commis]=trim(rsADO![Commis])
rsADO.Update
rsADO.MoveNext
Loop
Set rsADO = Nothing
Set cnn = Nothing
rsADO.Close
cnn.Close
End Sub
Sub DAO_1()
Dim db As DAO.Database, Dim rsDAO As DAO.Recordset
Set db = DBEngine.OpenDatabase(“D:/Wind.mdb“, ReadOnly:=True, Shared:=True)
‘ Set db = CurrentDb()
Set rsDAO = db.OpenRecordset("tblAccount")
Do While Not rsDAO.EOF
rsDAO.Edit
rsDAO![Commis]=trim(rsDAO![Commis])
rsDAO.Update
rsDAO.MoveNext
Loop
Set rsDAO = Nothing
Set db = Nothing
rsDAO.Close
cnn.Close
End Sub
Редактирование таблиц с помощью DAO и ADO
Слайд 66* - оnly .mdb, ** - only .adp, 1 -
Uses Connection object to reference to database; 2 - Uses
Catalog object to reference database; 3 - Uses Replica object to reference database; 4 - Uses JetEngine object to reference database
Слайд 68DAO
Sub DAOOpenJetDatabase()
Dim db As DAO.Database
Set db = DBEngine.OpenDatabase(".\NorthWind.mdb")
db.Close
End Sub
ADO
Sub ADOOpenJetDatabase()
Dim cnn As New ADODB.Connection
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\NorthWind.mdb;"
cnn.Close
End Sub
DAO
Sub DAOOpenJetDatabaseReadOnly()
Dim db As DAO.Database ' Open shared, read-only.
Set db = DBEngine.OpenDatabase (".\NorthWind.mdb", False, True)
db.Close
End Sub
ADO
Sub ADOOpenJetDatabaseReadOnly()
Dim cnn As New ADODB.Connection ' Open shared, read-only
cnn.Mode = adModeRead
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\NorthWind.mdb;"
cnn.Close
End Sub
DAO в ADO с помощью Microsoft Jet Provider
Слайд 69DAO
Sub DAOOpenRecordset()
Dim db As DAO.Database, rst As DAO.Recordset, fld As
DAO.Field
Set db = DBEngine.OpenDatabase(".\NorthWind.mdb")
' Open the forward-only, read-only recordset
Set rst
= db.OpenRecordset ("SELECT * FROM Customers WHERE Region = 'WA'", dbOpenForwardOnly, dbReadOnly)
' Print the values for the fields in the first record in the debug window
For Each fld In rst.Fields
Debug.Print fld.Value & ";";
Next
rst.Close
End Sub
ADO
Sub ADOOpenRecordset()
Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset, fld As ADODB.Field
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\NorthWind.mdb;"
' Open the forward-only, read-only recordset
rst.Open "SELECT * FROM Customers WHERE Region = 'WA'", cnn, adOpenForwardOnly, adLockReadOnly
For Each fld In rst.Fields
Debug.Print fld.Value & ";";
Next
rst.Close
End Sub
Слайд 70DAO ' Open the forward-only, read-only recordset
Sub DAOMoveNext()
Dim db As DAO.Database,
rst As DAO.Recordset, fld As DAO.Field
Set db = DBEngine.OpenDatabase (".\NorthWind.mdb")
Set
rst = db.OpenRecordset("SELECT * FROM Customers WHERE Region = 'WA'", dbOpenForwardOnly, dbReadOnly)
While Not rst.EOF
For Each fld In rst.Fields
Debug.Print fld.Value & ";";
Next
rst.MoveNext
Wend
rst.Close
End Sub
ADO ' Open the forward-only, read-only recordset
Sub ADOMoveNext()
Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset, fld As ADODB.Field
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\NorthWind.mdb;"
rst.Open "SELECT * FROM Customers WHERE Region = 'WA'", cnn, adOpenForwardOnly, adLockReadOnly
While Not rst.EOF
For Each fld In rst.Fields
Debug.Print fld.Value & ";";
Next
rst.MoveNext
Wend
rst.Close
End Sub
Слайд 71DAO
Sub DAOAddRecord()
Dim db As DAO.Database, rst As DAO.Recordset
Set db = DBEngine.OpenDatabase (".\NorthWind.mdb")
Set rst = db.OpenRecordset("SELECT * FROM Customers", dbOpenDynaset)
rst.AddNew
' Specify the values for the fields
rst!CustomerId = "HENRY"
rst.Update
' Save the changes you made to the current record in the Recordset
' Position recordset on new record
rst.Bookmark = rst.LastModified
Debug.Print rst!CustomerId
rst.Close
End Sub
ADO
Sub ADOAddRecord()
Dim
cnn As New ADODB.Connection, rst As New ADODB.Recordset
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\NorthWind.mdb;"
rst.Open "SELECT * FROM Customers", cnn, adOpenKeyset, adLockOptimistic
rst.AddNew
' Specify the values for the fields
rst!CustomerId = "HENRY"
rst.Update
Debug.Print rst!CustomerId
rst.Close
End Sub
В DAO запись, которая была текущей перед вставкой новой записи, остается текущей записью, поэтому переводим курсор на новую запись.
В ADO новая запись сразу становится текущей.
Слайд 72DAO
Sub DAOUpdateRecord()
Dim db As DAO.Database, rst As DAO.Recordset
Set db =
DBEngine.OpenDatabase(".\NorthWind.mdb")
Set rst = db.OpenRecordset("SELECT * FROM Customers WHERE CustomerId =
'LAZYK'", dbOpenDynaset)
rst.Edit
' Update the Contact name of the first record
rst.Fields("ContactName").Value = "New Name"
rst.Update
rst.Close
End Sub
ADO
Sub ADOUpdateRecord()
Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\NorthWind.mdb;"
rst.Open "SELECT * FROM Customers WHERE CustomerId = 'LAZYK'", cnn, adOpenKeyset, adLockOptimistic
rst.Fields("ContactName").Value ="New Name"
rst.Update
rst.Close
End Sub
Слайд 73DAO ‘Executing a nonparameterized stored query
Sub DAOExecuteQuery()
If gbBreakEach Then Stop
Dim db As DAO.Database, rst As DAO.Recordset, fld As DAO.Field
Set
db = DBEngine.OpenDatabase(".\NorthWind.mdb")
Set rst = db.OpenRecordset("Products Above Average Price", dbOpenForwardOnly, dbReadOnly)
While Not rst.EOF
For Each fld In rst.Fields
Debug.Print fld.Value & ";";
Next
rst.MoveNext
Wend
rst.Close
End Sub
ADO
Sub ADOExecuteQuery()
Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset, fld As ADODB.Field
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\NorthWind.mdb;"
rst.Open "[Products Above Average Price]", cnn, adOpenForwardOnly, adLockReadOnly, adCmdStoredProc
While Not rst.EOF
For Each fld In rst.Fields
Debug.Print fld.Value & ";";
Next
rst.MoveNext
Wend
rst.Close
End Sub
Слайд 74DAO ‘Executing a parameterized stored query
Sub DAOExecuteParamQuery()
Dim db As DAO.Database, qdf
As DAO.QueryDef, rst As DAO.Recordset, fld As DAO.Field
Set db =
DBEngine.OpenDatabase(".\NorthWind.mdb")
Set qdf = db.QueryDefs("Sales by Year") ' Get the QueryDef from the QueryDefs collection
qdf.Parameters("Forms!Sales by Year Dialog!BeginningDate") = #8/1/1997# ' Specify the parameter values
Set rst = qdf.OpenRecordset(dbOpenForwardOnly, dbReadOnly)
While Not rst.EOF
…………….
rst.MoveNext
Wend
rst.Close
End Sub
ADO
Sub ADOExecuteParamQuery()
Dim cnn As New ADODB.Connection, cat As New ADOX.Catalog, cmd As ADODB.Command, rst As New ADODB.Recordset
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=.\NorthWind.mdb;"
cat.ActiveConnection = cnn
Set cmd = cat.Procedures("Sales by Year").Command ' Get the Command object from the Procedure
cmd.Parameters("Forms![Sales by Year Dialog]!BeginningDate") = #8/1/1997#
rst.Open cmd, , adOpenForwardOnly,adLockReadOnly, adCmdStoredProc
While Not rst.EOF
…………….
rst.MoveNext
Wend
rst.Close
End Sub
Слайд 75БД Библиотека
Dim rst As Recordset, strSQL as string
Screen.PreviousControl.SetFocus
If Not IsNull(Me.id_книга)
Then
If Not IsNull(Me.прим) Then
strSQL
= "SELECT [фонд].[id_книга], [фонд].[прим] “ & _
“FROM фонд WHERE ([фонд].[id_книга]=" & Me.id_книга & ");"
Set rst = CurrentDb.OpenRecordset(strSQL)
rst.Edit
If IsNull(rst![прим]) Then
rst![прим] = Me.прим
Else
rst![прим] = rst![прим] & "; " & Me.прим
End If
rst.Update
rst.Close
Set rst = Nothing
End If
End If
Набор записей, отображаемый в подчиненнной форме
Слайд 76Private Sub id_книга_BeforeUpdate(Cancel As Integer)
Dim rst1, rst2 As Recordset, strSQL1
as String, strSQL2 As String
If Me.id_книга 0 Then
strSQL1="SELECT фонд.кол
FROM фонд WHERE (фонд.id_книга=" & Me.id_книга & "); "
Set rst1=CurrentDb.OpenRecordset(strSQL1)
strSQL2= "SELECT count(выдано.id_книга) as count1 FROM выдано INNER JOIN фонд ON выдано.id_книга = фонд.id_книга WHERE (фонд.id_книга=" & Me.id_книга & "); "
Set rst2 = CurrentDb.OpenRecordset(strSQL2)
If (rst1![кол] - rst2!count1) <= 0 Then
MsgBox "Все книги на руках"
Me.Undo
Me![id_книга].Requery
End If
End If
End Sub
Код на событии ПОСЛЕ ОБНОВЛЕНИЯ поля СПИСОК КНИГ по указанной тематике
Слайд 77Sub update_table(table1)
Dim strsql1 As String, rst1 As Recordset
strsql1 = "SELECT
" + table1 + ".выбор FROM " + table1 +
" where " + table1 + ".выбор=true"
Set rst1 = CurrentDb.OpenRecordset(strsql1, dbOpenDynaset)
If rst1.RecordCount <> 0 Then
rst1.MoveLast
rst1.MoveFirst
For i = 1 To rst1.RecordCount - 1
rst1.Edit
rst1![Выбор] = False
rst1.Update
rst1.MoveNext
Next
rst1.Edit
rst1![Выбор] = False
rst1.Update
rst1.Close
End If
End Sub
Код на закрытии формы Фото-видео (для снятия отметок о выборе товара в исходной таблице)
Private Sub Form_Unload(Cancel As Integer)
Call update_table("[Фото-видео]")
End Sub
БД “Компьютерный Магазин”
Слайд 78Dim conn As ADODB.Connection 'declare conn to be a Connection
Set conn
= New ADODB.Connection 'make a connection object
conn.Provider = "Microsoft.Jet.OLEDB.4.0“ 'specify what kind
of data provider it is
conn.Open "c:/walter/ass21.mdb“ 'open the connection on one database
Dim myTableRS As ADODB.Recordset 'declare a recordset
Set myTableRS = New ADODB.Recordset 'make one
' open it using a table in the database, and the connection
myTableRS.Open "myTable", conn, adOpenDynamic, adLockPessimistic
myTableRS.MoveFirst 'go to start of recordset
Do Until myTableRS.EOF 'until we reach the end
MsgBox (myTableRS.Fields("ID")) 'display the ID field in current row
myTableRS.MoveNext 'move next row
Loop
myTableRS.Close 'close the recordset
Set myTableRS.ActiveConnection = Nothing
conn.Close 'close the connection
Set conn = Nothing
Слайд 79Протокол OLE DB
Пример использования объекта ADODB.Connection
Sub DemoADODB()
Const Provider = "Provider=Microsoft.Jet.OLEDB.4.0;"
Const
DataSource = "Data Source=C:\Data\Hours.mdb"
Dim Connection As New ADODB.Connection
On Error GoTo
Finally
Call Connection.Open(Provider & DataSource)
Connection.Close
Finally:
If (Err.Number <> 0) Then
MsgBox Err.Description
End If
Set Connection = Nothing
End Sub
Sub ТекущаяЗаписьADO ()
Dim rst As New ADODB.Recordset
rst.Open "Сотрудники", CurrentProject.Connection
Debug.Print rst.Fields ("Кто"), rst.Fields ("Когда")
rst.Close
End Sub
Слайд 80Извлечение информации с помощью ADO:
1. Объявить переменную-объект класса ADODB.Connection.
2. Задать
информацию о провайдере OLE DB
3. Открыть соединение.
4. По завершении работы
освободить память, выделенную объекту Connection.
Sub DemoADODB()
Const Provider = "Provider=Microsoft.Jet.OLEDB.4.0;"
Const DataSource = "Data Source=C:\Data\Hours.mdb"
Dim Connection As New ADODB.Connection
On Error GoTo Finally
Call Connection.Open(Provider & DataSource)
…..
Set Connection =Nothing
Connection.Close
Finally:
If (Err.Number <> 0) Then
MsgBox Err.Description
End If
Set Connection =Nothing
Connection.Close
End Sub
Слайд 81После объявления переменной Recordset объект надо заполнить, используя:
метод Open объекта
Recordset;
метод Execute объекта Command;
метод Execute объекта Connection.
1. Метод Open, если
используется простая инструкция Select:
Dim con As New Connection
Dim rst As Recordset
Dim strSQL As String
……………..’ соединение и открытие БД
strSQL = "SELECT * FROM Toys"
Set rst.ActiveConnection = con
rst.Open strSQL,,adOpenForwardOnly, adLockReadOnly, adCmdText ‘нет 2-го аргумента
2. В приложениях клиент/сервер обращение к сохраненным запросам методом Execute:
Dim con As New Connection
Dim cmd As New Command
Dim rst As Recordset
Dim strSQL As String
……………..’ соединение и открытие БД
With cmd
Set .ActiveConnection = con
.CommandText = strSQL
.CommandType = adCmdText
End With
rst.CursorType = adOpenForwardOnly
rst.lockType = adLockReadOnly
Set rst = cmd.Execute()
Слайд 823. Метода Execute объекта Connection позволяет работать с сохраненными процедурами.
Однако, если для выполнения процедур необходимы определенные параметры, придется включить
эти параметры в инструкцию SQL:
Dim conVert As New Connection
Dim rst As Recordset
Dim strSQL As String
……………..’ соединение и открытие БД
rst.CursorType = adOpenForwardOnly
rst.LockType = adLockReadOnly
Set rst = conVert.Execute()
Если известно, что подключение необходимо только для одного объекта Recordset, можно указать строку подключения в качестве 2-го аргумента метода Open объекта Recordset без выделения переменной для подключения к БД:
Dim rst As New Recordset
Dim strSQL As String, strConnect As String
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Data\Shop.mdb"
strSQL = "SELECT * FROM Bicycles"
rst.Open strSQL, strConnect, adOpenForwardOnly
Создание подключения на лету
Слайд 83
1. Если используется обращение к БД Jet, то Access автоматически
создает объект Connection для объекта CurrentProject, который можно использовать:
Dim conADOConnection
As Connection ‘ ADO
Set conADOConnection = CurrentProject.Connection
2. Подключение с БД SQL Server в проекте Access - свойство BaseConnectionString объекта CurrentProject:
Dim conADO Аs New Connection
conADO.ConnectionString = CurrentProject.BaseConnectionString
3. Эквивалентные примеры создания объекта Connection для БД Jet:
1. Dim. conADOConnection As New Connection ‘ ADO
Dim strCont As String
strCon = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Data\Toys.mdb"
conADOConnection.Open strCon
2. Dim conADOConnection As New Connection ‘ ADO
With conADOConnection
.Provider="Microsoft.Jet.OLEDB.4.0;"
.Properties("Data Source") - "=C:\Data\Toys.mdb"
.Open
End With
4. Пример для SQL Server:
Dim conADOConnection As New Connection ‘ ADO
Dim strCon As String
strCon="Provider=SQLOLEDB; Data Source=DSN1; Initial Catalog=toys;User ID=sa; Password=;"
conADOConnection.Open strCon
Слайд 84Курсор необходим для перемещения между записями. По умолчанию тип Forward-only.
Выбор
типа курсора
Слайд 85Свойство LockType по умолчанию имеет свойства adLockPessimistic.
Блокирование
Слайд 86Методы Recordset
Основные
rst.Open
rst.Close
Перемещение по записям
rst.Movefirst
rst.MoveLast
rst.MoveNext
rst.MovePrevious
Поиск
rst.Find
rst.Seek ‘если
поле проиндексировано (rst.seek ‘1234’, asSeekFirstEQ)
Редактирование
rst.AddNew
rst.Delete
rst.Update
Слайд 87Перемещение по набору записей (ADO)
Методы MoveFirst, MoveLast, MoveNext и MovePrevious.
Метод Move позволяет перемещаться на определенное количество записей в наборе
вперед или назад. Например, инструкция rst.Move -3 перемещает на три записи назад.
Для возвращения к определенной записи, для нее создается закладка:
var Bookmark1 = rst.Bookmark
…
rst.Bookmark = varBookmarkl
Метод Seek, а также методs FindFist, FindLat, FindNext и FindPrevious позволяют отследить определенную запись, базируясь на ее содержимом. Метод Seek работает быстрее, однако, прежде содержимое БД должно быть проиндексировано.
Метод AddNew добавляет новую запись в набор. Метод позволяет указать поля и их значения:
With rst
.AddNew Array ( "Имя", "Возраст", "Пол“), Array("Анна", 42, "Ж")
End With
Для удаления текущей записи предназначен метод Delete.
Добавление и удаление записей
Слайд 88Чтение поля
Работа с текущим значением - укажите поле по имени
или по его индексному номеру:
If rst.Fields("Service visits").Value >10
MsgBox
"This unit needs a major overhaul!"
End If
strCurrentFieldData = rst.Fields(3)
Поскольку Fields является семейством по умолчанию объекта Recordset, его указывать не обязательно:
rst!Date = #5/15/2001# ‘ rst.fields!Date
With rst
intltems =![Oil cans] ‘ rst.fields![Oil cans]
End With
Указать новое значение и переместиться к другой записи:
With rst
.Fields(0).Value = “Lemon”
.MoveNext
End With
Если надо остаться на текущей записи – метод Update:
With rst
.Value=2
.Update
End With
Изменение поля
Слайд 89Recordset - свойства
rst.recordCount
rst.BOF
rst.EOF
rst.AbsolutePosition
rst.Fields.Count
Обращение к полям записи
Каждая запись содержит поля, к
каждому из которых можно обратиться по индексу (начиная с 0)
следующими способами:
номер индекса rec(0)
имя поля rec(“surname”)
переменная rec(fieldpos)
выражение rec(fieldpos + 3)
Слайд 90Объект Command представляет инструкцию SQL или сохраненную процедуру. Средства доступа
OLE DB Provider не нужны. Для входных параметров определить объекты
Parameter коллекции Parameters. Значение adCmdText передает инструкцию SQL источнику данных:
Dim con As Connection
Dim cmdVBA As Command
Dim prmDate
Set cmdVBA = New Command
With cmdVBA
.ActiveConnection = con ‘ соединение определено и открыто
.CommandText = "qryDeleteOldRecords” ‘ имя хранимой процедуры
.CommandType = adCmdStoredProc, adCmdTable ' in Jet
‘ .CommandText = "UPDATE Bicycles SET OnSale = True WHERE Category = 4;"
‘ .CommandType = adCmdText
.Execute
End With
Set prmDate =New Parameter
With prmDate
.Name = "Date"
.Value = InputBox "Enter the cut-off date."
.Type = adDate
.Direction = adParamlnput
End With
With cmdVBA
.Parameters.Append prmDate ' Добавление параметра
.Execute
End With
Использование объекта Command
Для запроса, сохраненного в БД Jet/Access, используйте значение adCmdTable свойства CommandType объекта Command, а не adCmdStoredProc, относящееся к SQL Server и другим серверам БД.
Слайд 91SQL
В коде VBA принято использовать одинарные кавычки для определения строки
в
инструкции SQL:
strSQL = "SELECT Name FROM Kids WHERE Hates =
'Brocolli' "
cmd.CommandText = strSQL
Если часть инструкции SQL основывается на переменной, например, запрос базируется на данных, введенных пользователем в текстовом поле формы, то добавьте значение переменной к остальной части строки. Если переменная представляет строковое значение, заключите ее в одинарные кавычки:
StrSQL = "SELECT Name FROM Kids WHERE Hates = ' " & frmInputForm.TextBoxl & " ' "
Если переменная представляет данные, а не строку, заключите ее между символами #.
Переменные, представляющие числовые значения, не требуют использования каких-либо открывающих и закрывающих символов.
Слайд 92Dim rs As Object
Dim rs As Recordset
Dim int As Integer
' nonobject variable declaration
Dim db As Database ' object variable
declaration
InputBox(prompt [, title] [, default])
On Error Resume Next
Sub example()
On Error GoTo ERR_EXAMPLE
MsgBox rs.RecordCount
Exit Sub
ERR_EXAMPLE:
MsgBox Err.Description, vbCritical
Resume Next
End Sub