Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

AccessVBA

.pdf
Скачиваний:
20
Добавлен:
13.04.2015
Размер:
391 Кб
Скачать
☆

11

tdf2.FindFirst "Кто = 'Алексеев'" End Sub

Sub ЗаписиDAO ()

Set базаДанных = CurrentDb

строкаSQL = "SELECT * FROM Таблица1 WHERE Фирма LIKE 'I*'"

Set результатЗапроса = базаДанных.OpenRecordset (строкаSQL) результатЗапроса.MoveFirst

MsgBox результатЗапроса.Fields (0) & " - " & результатЗапроса.Fields (2)

где = "Фирма = 'Intel'"

результатЗапроса.FindFirst где

MsgBox результатЗапроса.Fields (0) & " - " & результатЗапроса.Fields (2) результатЗапроса.FindNext где

MsgBox результатЗапроса.Fields (0) & " - " & результатЗапроса.Fields (2)

результатЗапроса.MoveLast

MsgBox результатЗапроса.RecordCount

End Sub

Sub ОбновлениеЗаписей ()

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 АнализЗаписей ()

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 Then MsgBox "Фирма только одна" rst.Close

db.Close

Set rst = Nothing Set db = Nothing

End Sub

Sub СписокБазыДанных ()

Set текущаяБазаДанных = CurrentDb

Set рабочаяОбласть = DBEngine.Workspaces(0)

Set новаяБазаДанных = рабочаяОбласть.CreateDatabase _ ("Студенты.mdb", dbLangGeneral)

12

Set другаяБазаДанных = рабочаяОбласть.OpenDatabase _ ("ФирмаГодПрезидент")

For Each базаДанных In рабочаяОбласть.Databases

список = список & Chr (13) & базаДанных.Name

Next базаДанных

MsgBox список End Sub

Sub СписокПолей ()

Set db = CurrentDb Set tdf = db!Таблица1

For Each fld In tdf.Fields

строка = строка & Chr (13) & fld.Name

Next fld

MsgBox строка

End Sub

Sub ЗаменаДанных ()

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 ЧтениеДанных ()

‘В Access для загрузки в массив строк объекта Recordset

‘используется метод GetRows

Set объект = CurrentDb.OpenRecordset("Товары") массив = объект.GetRows (объект.RecordCount) For Each элемент In массив

строка = строка & элемент & chr (13)

Next

MsgBox строка End Sub

Sub ПравкаТаблицDAO ()

Set таблица = CurrentDB.OpenRecordset ("Таблица1")

таблица.MoveFirst

таблица.Edit

таблица.Fields (Фирма) = "SCAN" таблица.Fields (Год) = 2005

строкаSQL = "UPDATE Таблица1 SET NТовара = 22 " _

13

& "WHERE NТовара = 2 " CurrentDb.Execute строкаSQL

таблица.AddNew

таблица.Fields (ФИО) = “Новый” таблица.Update

таблица.BookMark = таблица.LastModified

таблица.Move 5

таблица.Delete

таблица.moveNext

End Sub

Процедурное и структурное программирование в ADO

Синтаксис обращения к объектам ADO:

ADODB.имяОбъекта

Для доступа к данным в этой модели используются объекты Connection, несущие сведения об источнике данных и его расположении. Для работы с ним открывается множество Recorddet или Command и задается строка подключения ConnectionString. Значения каждого свойства такого объекта можно задавать как аргумент метода Open или отдельно, через свойство Properties. Connection открывает сеанс обмена данными через провайдера OLEDB. Command служит для выполнения запросов. Recordset представляет набор записей, а Fields — семейство его полей. Отдельные параметры SQLзапросов и хранимых процедур образуют семейство Parameter. Ошибки сеанса связи фиксируются объектами семейства Errors. Как и в DAO, свойства — объекты Properties — делятся на встроенные и динамические. Можно сначала задавать свойства, а потом создавать объект, используя его метод или метод другого объекта. Или наоборот: вначале создать объект, а затем установить значения его свойств.

Свойства и методы классов модели ADODB приведены в таблице.

Название

Тип

 

Определение

 

 

 

Класс Connection

Initial Catalog

Свойство

 

Папка по умолчанию

Data Source

Свойство

 

Источник данных: таблица, запрос…

User ID

Свойство

 

Сетевое имя пользователя

Integrated Sequrity

Свойство

 

Интегрироаванная защита

Prompt

Свойство

 

Ввод пароля

Persist Sequrity

Свойство

 

Пароль в строке подключения

Info

 

 

 

 

CursorLocation

Свойство

 

Клиентские курсоры

ConnectionString

Свойство

 

Строка подключения со списком свойств

 

 

14

 

 

 

 

Название

Тип

 

Определение

State

Свойство

 

Состояние объекта Connection

Open

Метод

 

Создает новый объект Connection

Execute

Метод

 

Выполняет команду

 

 

 

Класс Recordset

AbsolutePosition

Свойство

 

Устанавливает указатель на текущей записи

BOF, EOF

Свойство

 

Определяет начало и конец набора записей

Bookmark

Свойство

 

Сохраняет позицию указателя в наборе

Connection

Свойство

 

Объектная переменная соединения

RecordCount

Свойство

 

Число записей в наборе

Close

Метод

 

Закрывает набор записей

Delete

Метод

 

Удаляет текущую запись из набора

GetRows

Метод

 

Копирует записи в двухмерный массив

Move

Метод

 

Смещает указатель на заданную величину

MoveFirst, Move-

 

 

Переходит к первой, последней, следующей

Last, MoveNext,

Метод

 

 

или предыдущей записи, делая ее текущей

MovePrevious

 

 

 

 

 

OpenRecordset

Метод

 

Создает новый набор записей

Requery

Метод

 

Обновляет набор, переходя в ее начало

 

 

 

Класс Command

ActiveConnection

Свойство

 

Устанавливает подключение или его строку

CommandText

Свойство

 

Источник: SQL-инструкция, таблица

CommandType

Свойство

 

Тип свойства CommandText

CommandTimeout

Свойство

 

Время ожидания выполнения запроса, с

Prepared

Свойство

 

Предварительная готовность CommandText

State

Свойство

 

Состояние объекта Command

Cancel

Метод

 

Прекращает выполнение запроса

CreateParameter

Метод

 

Создает параметр запроса

Execute

Метод

 

Выполняет запрос объекта Command

Объекты Recordset создают тремя методами: Open класса Recordset, Exequte класса Command или Exequte класса Connection. Синтаксис метода Open:

rst.Open Source, Connection, CursorType, lockType, Options

где Source — это имя таблицы или запроса, инструкция SQL, ссылка на объект Command или имя файла, Connection — ссылка на объект подключения, cursorType — тип доступа: adOpenDynamic — отображает все изменения, вставки и удаления, вносимые другими пользователями; adOpenKeyset — показывает только изменения; adOpenStatic — сохраняет исходный набор; adOpenForwardOnly — то же, при одностороннем движении курсора; LockType — тип блокировки: adLockReadOnly — только для чтения,

15

adLockPessimistic — пессимистическая блокировка, adLockOptimistic —

оптимистическая блокировка, adLockBatchOptimistic — с кэшированием изменений в наборе; Options — характеристика Source: adCmdText — инструкция SQL, adCmdTable — SQL-запрос ко всем записям таблицы, adCmdTableDirect — таблица или запрос, adCmdUnknown — без указания параметра, adCmdFile — файл с набором записей.

Объект Command служит для выполнения запросов. В качестве источника данных запроса может задаваться таблица или SQL-инструкция, серверное представление или хранимая процедура. Его свойство CommandType при этом принимает одно из значений: adCmdUnknown — неизвестный, по умолчанию, adCmdText — запрос или хранимая процедура, adCmdTable — таблица для запроса, adCmdTableDirect — непосредственно открываемая таблица, adCmdStoredProc — хранимая процедура на сервере, adCmdFile — файл с набором записей.

Примеры

Sub ТекущееСоединениеADO ()

Dim cnn As ADODB.Connection

Set cnn = CurrentProject.Connection

MsgBox cnn.ConnectionString

If cnn.State = adStateClosed Then

MsgBox "Нет подключения"

Else

MsgBox "Подключение есть"

End If

Set cnn = Nothing

End Sub

Sub Соединение1ADO ()

Dim cnn As ADODB.Connection Set cnn = New ADODB.Connection cnn.Open _

"Provider=SQLOLEDB; Data Source=srv; Initial Catalog=pubs;" & _ "DataBase=базаДанных; User Id=sa; Password=;"

MsgBox cnn.ConnectionString

If cnn.State = adStateClosed Then MsgBox "Нет подключения"

Else

MsgBox "Подключение есть"

End If cnn.Close

End Sub

Sub Соединение2ADO ()

Dim cnn As ADODB.Connection Set cnn = New ADODB.Connection cnn.Provider = "SQLOLEDB"

cnn.Properties ("DataSource") = "Источник"

16

cnn.Properties ("DataBase") = "базаДанных" cnn.Properties ("UserId") = "Пользователь" cnn.Properties ("Password") = "Пароль" cnn.Open

MsgBox cnn.ConnectionString

If cnn.State = adStateClosed Then MsgBox "Нет подключения"

Else

MsgBox "Подключение есть"

End If cnn.Close

End Sub

Sub ДоступКПолямADO ()

Dim rst As New ADODB.Recordset

rst.Open "Сотрудники", CurrentProject.Connection

For i = 0 To rst.Fields.Count - 1

temp = temp & rst.Fields(i).Name & vbCr

Next

MsgBox "Всего полей: " & Str(rst.Fields.Count) & vbCr & temp End Sub

Sub СвойстваADO ()

Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset cnn.Provider = "Microsoft.Jet.OLEDB.4.0"

cnn.Properties ("Data Source") = "D:\ Кадры.mdb" cnn.Open

rst.CursorType = adOpenStatic rst.Open “Сотрудники”, cnn

' вот как можно узнать все свойства класса

For i = 0 To cnn.Properties.Count - 1 Debug.Print cnn.Properties (i).Name

Next End Sub

Public cnnXLS As New ADODB.Connection, _ cnnMDB As New ADODB.Connection, _ cnnDBF As New ADODB.Connection

Public rstXLS As New ADODB.Recordset, _ rstMDB As New ADODB.Recordset, _ rstDBF As New ADODB.Recordset

Sub Соединения ()

Отключение

cnnXLS.Open "DBQ=D:\ Сотрудники.xls;Driver={Microsoft Excel Driver (*.xls)}" RSTOpen "Сотрудники", cnnXLS, rstXLS

cnnDBF.Open "DBQ=D:\;Driver={Microsoft dBase Driver (*.dbf)}" RSTOpen "T", cnnDBF, rstDBF

17

cnnMDB.Open "DBQ=D:\ Кадры.mdb;Driver={Microsoft Access Driver (*.mdb)}" RSTOpen "Сотрудники", cnnMDB, rstMDB

End Sub

Sub RSTOpen (tbl As String, _

cnn As ADODB.Connection, rst As ADODB.Recordset)

MsgBox tbl & " connection: " & cnn.ConnectionString

If cnn.State = adStateClosed Then

MsgBox "Нет подключения к " & tbl

Else

rst.CursorType = adOpenStatic rst.Open tbl, cnn

End If End Sub

Sub Отключение ()

Set cnnXLS = Nothing

Set cnnMDB = Nothing

Set cnnDBF = Nothing

Set rstXLS = Nothing

Set rstMDB = Nothing

Set rstDBF = Nothing

End Sub

Sub ВсеПоля ()

Set базаДанных = CurrentDb Set таблица = базаДанных!t3 For Each поле In таблица.Fields

строка = строка & Chr(13) & поле.Name

Next поле MsgBox строка

End Sub

Sub ТекущаяЗаписьADO ()

Dim rst As New ADODB.Recordset

rst.Open "Сотрудники", CurrentProject.Connection Debug.Print rst.Fields ("Кто"), rst.Fields ("Когда") rst.Close

End Sub

Sub Записи1ADO ()

Dim rst As New ADODB.Recordset

rst.Open "ЗапросСотрудники", CurrentProject.Connection

набор.MoveNext

Debug.Print rst.Fields ("Кто"), rst.Fields ("Когда")

набор.Move 4

Debug.Print rst.Fields ("Кто"), rst.Fields ("Когда") Set rst = Nothing

End Sub

Sub Записи2ADO ()

Dim cnn As New ADODB.Connection, rst As New ADODB.Recordset

18

cnn.Open "DBQ=D:\;Driver={Microsoft dBase Driver (*.dbf)}" With rst

.Open "Сотрудники", cnn

For i = 0 To .Fields.Count - 1

temp = temp & .Fields (i).Name & " "

Next

temp = temp & vbCr

Do While Not .EOF

For i = 0 To .Fields.Count - 1

temp = temp & rst.Fields (i) & " "

Next

temp = temp & vbCr

.MoveNext

Loop

MsgBox "Всего в " & .Source & " полей: " & .Fields.Count & _ vbCr & "Всего записей: " & .RecordCount & vbCr & temp

End Sub

Sub ПозиционированиеADO ()

Dim rst As New ADODB.Recordset

rst.Open "Сотрудники", CurrentProject.Connection, adOpenStatic Do While Not rst.EOF

строка = rst!Кто & " " & rst.AbsolutePosition & _ " из " & rst.RecordCount

If MsgBox (строка, vbOKCancel) = vbCancel Then Exit Do rst.MoveNext

Loop End Sub

Sub ОбъектCommand ()

Dim rst As ADODB.Recordset, cmd As ADODB.Command Dim строка As String, счетчик As Integer

Set rst = New ADODB.Recordset Set cmd = New ADODB.Command

Set cmd.ActiveConnection = CurrentProject.Connection cmd.CommandText = _

"SELECT Кто, Сколько FROM Сотрудники WHERE Сколько>1100" rst.CursorLocation = adUseClient

Set rst = cmd.Execute () Do While Not rst.EOF

счетчик = счетчик + 1

строка = строка & Str (счетчик) & " " & rst!Кто & " " & rst!Сколько & vbCr rst.MoveNext

Loop

MsgBox строка & "Всего: " & счетчик rst.Close

Set cmd = Nothing

End Sub

Для изменения данных следует сначала сделать запись текущей. В модели ADO изменения данных программируются проще, чем в DAO, так

19

как используется обычный оператор присваивания с последующим обновлением.

В модели ADO используется отличный от DAO синтаксис поиска:

•объектRecordset.Seek (значенияКлюча, параметрыПоиска)

•Find (Критерии, Пропуск, направлениеПоиска, Старт)

где аргументы указывают массив переменных искомого значения и константный тип сравнения, число пропускаемых строк и направление.

Sub ПравкаADO ()

Dim rst As New ADODB.Recordset

строкаSQL = "SELECT * FROM Сотрудники WHERE Сколько <300" rst.Open строкаSQL, _

CurrentProject.Connection, adOpenDynamic, adLockOptimistic With rst

.MoveLast

.Fields ("Кто") = "Новый"

.Update

.Move -5

.Delete

.Close End With

End Sub

Sub ПоискADO ()

Dim rst As New ADODB.Recordset

rst.Open "Сотрудники", CurrentProject.Connection, _ adOpenStatic, adLockReadOnly

rst.Find "Кто = 'Алексин'"

Debug.Print rst.Fields ("Где"), rst.Fields ("Сколько") rst.Close

End Sub

Sub ПравкаТаблицADO ()

Dim rst As New ADODB.Recordset

With rst

.Open "Сотрудники", CurrentProject.Connection, _ adOpenStatic, adLockOptimistic

.Find "Кто = 'Алексин'"

.Fields ("Зачем") = "Отпуск"

.Update

.Close End With

End Sub

Sub ДобавлениеADO ()

Dim rst As New ADODB.Recordset With rst

20

.Open "Сотрудники", CurrentProject.Connection, _ adOpenDynamic, adLockPessimistic

.Find "Кто = 'Гуринов'"

.Fields ("Зачем") = "Отпуск"

.AddNew

.Fields ("Кто") = "Архипов"

.Update

.Close

End With End Sub

Sub УдалениеADO ()

Dim rst As New ADODB.Recordset

rst.Open "Сотрудники", CurrentProject.Connection, _ adOpenStatic, adLockOptimistic

rst.Find "Кто = 'Гуринов'" rst.Delete adAffectCurrent rst.Update

rst.Close

End Sub

Public Sub УдалениеЗаписиADO()

Dim rst As New ADODB.Recordset

rst.Open "SELECT * FROM Сотрудники " & _

"WHERE Сколько < 200", CurrentProject.Connection, _ adOpenStatic, adLockOptimistic

строка = rst.RecordCount & vbCr

Do While Not rst.EOF

строка = строка & rst!Кто & vbCr rst.MoveNext

Loop

MsgBox строка

строка = UCase (InputBox ("Кого удалить?")) rst.Filter = "Кто = '" & строка & "'"

rst.Delete

rst.UpdateBatch rst.Filter = adFilterNone rst.Requery

строка = "После удаления осталось " & rst.RecordCount & vbCr

Do While Not rst.EOF

строка = строка & rst!Кто & vbCr rst.MoveNext

Loop

MsgBox строка rst.Close

End Sub

Sub ЗапросыADO ()

Dim набор As New ADODB.Recordset

набор.Open "Сотр", CurrentProject.Connection, adOpenStatic, adLockOptimistic

где = "Сколько < 200"

DoCmd.RunSQL _

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