Программирование в среде VB 5.0
В приложениях VB 5.0 исполняемые строки должны размещаться внутри
процедур либо функций. Операторы в VB редко используют номера строк, а
любые из них обычно начинаются с новой строки. Строки ограничены длиной в
1023 символа. можно расширять строки, используя символ “_” после пробела в
конце строки. Несколько операторов можно объединять в одной строке,
разделяя их “ : ”.
Комментарии задаются верхней кавычкой (‘), либо оператором REM.
Комментарий может быть выведен отдельной строкой, либо в конце строки. Во
втором случае лучше использовать кавычку (‘), чем REM, т.к. REM здесь
требует разделителя (:). Например,
DIM FARENG ‘ переменная для вычисления t0 по Фаренгейту или
DIM FARENG : REM переменная для вычисления t0 по Фаренгейту
Оператор End - программа останавливается. После оператора End
закрываются все окна, открытые программой, а сама она стирается из памяти.
Внутри приложения VB может быть сколько угодно операторов End, но обычно
лучше использовать только один оператор End в процедуре обработки событий
QueryUnload для основной формы. В этом случае все операторы End заменяются
на Unload Me, который вызывает себе QueryUnload для формы.
Одним из основных операторов является присваивание значения переменным и установка значений свойств.
Например,
1) Result = 0.5 ( 20 имя значение переменной
Можно использовать оператор LET
2) объект.свойство = значение txtDisplay.Text = “ “
Свойства по умолчанию
У любого объекта VB есть свойство по умолчанию. Например, для текстового поля это свойство Text. При ссылке на данное свойство можно не указывать его имя.
Например, txtDisplay=“Привет!”
Некоторые свойства могут принимать значения TRUE или FALSE. В VB5 имеются встроенные константы для обозначения данных свойств, например, cmdExit=False будет скрывать командную кнопку, пока не появится выражение cmdExit=True.
Внутри себя VB использует значение 0 для False и -1 для True (или любое ненулевое значение).
Можно использовать следующее выражение для изменения свойства на противоположное cmdExit.Visible = Not (cmdExit.Visible).
Переменные. Имена переменных менее 255 символов начинаются с буквы, за которой следуют другие буквы, цифры или символ “_”. Регистр значения не имеет. В качестве имен переменных нельзя использовать зарезервированные слова, например, Print. Принято использовать смешанный регистр при задании имен переменных, состоящих из нескольких слов, например, CurrentValue.
Типы переменных. Используется 14 стандартных типов переменных. Можно определить и собственный тип. Основные типы:
String - строковые переменные. Для обозначения этого типа можно добавить символ “$” к концу имени.
Например, Message $ = txtDisplay.Text
Integer - целочисленная переменная в диапазоне -32768 (+32767. Для обозначения в конце имени добавляется “%” арифметический оператор выполняется быстро.
Например, IntVar% =5
LongInteger - длинное целое от -2147483648 до +2147483647.
Обозначается “&”.
LongInt&= 123456789.
SinglePrecision хранит дробные числа с точностью до 7 цифр. Для на чисел может достигать 38 знаков с обозначением “!”. Вычисления ч данными переменными будет приблизительным.
DoublePrecision “#”. Числа с точностью до 16 цифр и длиной до 300
символов. Вычисления тоже приблизительны, а скорость небольшая.
Используется для научных расчетов.
Currency - используется при преобразовании десятичных чисел в двоичную
форму и наоборот. Обозначение - “@”. Может иметь до 14 цифр до запятой и до
4 цифр - после. Используется для финансовых расчетов.
Date - значения даты и времени от 00 час.1 января.100 года до 00час.31 декабря.9999 г. Значение обозначается “#”.
Time = # May 5, 1999 #
Byte - для хранения целых чисел от 0 до 255. Экономит оперативную память и размеры массивов. Используется также при работе с двоичными файлами.
Variant - данные любого типа. Если VB не знает тип принимаемых данных, используется этот тип. Использование его замедляет работу программ, т.к. требует времени и ресурсы для операций преобразования типов.
В отличие от других версий Basic в одной программе нельзя использовать одни и те же имена переменных, отличающихся только типом. Например, A% и А!
При первом использовании переменной VB временно присваивает переменной тип Variant и пустое значение. Это значение исчезает в тот момент, когда переменной присваивается реальное. Любой тип данных имеет свое “пустое” значение. Для String это строка нулевой длины “ “. Для численных переменных это 0.
Можно не использовать идентификаторы для обозначения типа переменной, а использовать оператор Dim. Оператор Dim служит для объявления типов переменных.
Dim Years As Integer
Dim Amount As Currency
. . . .
Объявления можно комбинировать в одной строке.
Dim Years As Integer, Amount As Currency
Dim Result без типа присваивает переменной тип Variant.
Если в программе используются необъявленные переменные, легко
допустить ошибку при написании их имени. В этом случае используется
принудительное объявление переменных с помощью оператора Option Explicit.
Этот оператор не используется в конкретных процедурах обработки событий, а
размещается в разделе General формы, чтобы быть доступным всем процедурам
обработки событий. После того, как VB встречает оператор Option Explicit,
он не позволяет более использовать необъявленные переменные. Этот оператор
можно использовать для изменения значений по умолчанию.
Область видимости переменных
В программах VB5 все переменные изолированы внутри процедур. То есть переменная Result в одной процедуре не влияет на значение переменной с тем же именем в другой процедуре. То есть переменные являются локальными по отношению к процедурам, если не указано иначе.
Иногда необходимо, чтобы какая-то переменная была доступна всем процедурам формы. Такие переменные называют переменными уровня формы или модуля. Переменные уровня формы также объявляются в разделе General с помощью операторов Private или Dim.
В больших проектах, в которых процедуры и формы хранятся в отдельных модулях, а не подключаются к форме, можно объявить глобальную переменную, доступную в любой части проекта.
Это делается в разделе Declarations любого модуля кода:
Public Amount As Single или Global Amount As Single
Когда VB вызывает процедуру обработки события, старые значения
локальных переменных уничтожаются. Они принимают значения по умолчанию.
Такие переменные называются динамическими. Но в некоторых случаях
необходимы статические переменные, которые не инициализируются повторно при
вызове процедуры. Часто такие переменные используются для счетчиков, их
используют, чтобы сделать элементы управления видимыми или невидимыми.
Чтобы объявить статическую переменную внутри процедуры необходим оператор
Dim заменить на Static.
Static Amount As Single, Is_Visible As Boolean.
Если необходимо, чтобы все переменные в процедуре были статическими, необходимо добавить
Static Private Sub cmdLom_Click()
Строки
Операция конкатенации для сложения нескольких строк + или &
Например, A$ = “Иванов”
B$ = “Иван”
C$ = “Иванович”
D$ = A$ & B$ & C$ или D$ = A$ + B$ + C$
Отличие. С помощью “&” можно объединять строковые и другие типы.
Например, C = A% & B$, изменится их тип на Variant.
Для перехода к новой строке при печати символов (перевод каретки) используется встроенная const VbCrLf. Например, чтобы разорвать строку в информационной панели или в многостроковом текстовом поле можно
Message $ = “1-я строка”
Message $ = Message $+VbCrLf + “2-я строка”
MsgBox Message $
Замечание. Если в программе используются числа и они не присваиваются переменной Variant, то VB полагает:
1) Если число не имеет десятичной точки и лежит в диапазоне от
-327686 +32767, то это Integer.
2) Если не имеет десятичной точки и лежит в диапазоне для Long
Integer, то это Long Int.
3) Если имеет десятичную точку и лежит в диапазоне для чисел с обычной точностью (7 цифр), то это Single precision.
4) Если имеет десятичную точку, но лежит вне диапазона, то это Double precision.
Такие приблизительные расчеты часто приводят к проблемам. Например, VB полагает, что тип результата с двумя целыми числами есть целое. Например результат Print 123456 (789 выходит за рамки целого и возникает ошибка переполнения. Тогда необходимо использовать идентификатор хотя бы для одной переменной Print 123456& (789.
Можно также использовать встроенные функции для преобразования типов,
например, LInt - округляет число до целого, Clong - до длинного целого,
Cvar - преобразует к Var.
Если производятся операции с переменными Variant, то не возникает проблем с преобразованием типов.
Помимо обычных, десятичных чисел, VB использует двоичные и
шестнадцатеричные. Последние обозначаются с префиксом &H. Например, число
49 = &H31.
Шестнадцатиричные цифры используются для кодирования различных цветов:
любой цветовой код состоит из 6 шестнадцатиричных цифр от &H000000& = 0 до
&HFFFFFF& (длинное целое) (16777215).
Вообще конкретный цвет определяется количеством красного R, зеленого G и синего цветов B во всевозможных сочетаниях. В коде цвета VB две последние цифры означают количество красного, две средние - количество зеленого, а две первые - количество синего, например
&H0000FF& - максимально красный
&H00FF00& - максимально зеленый
&HFF0000& - максимально синий
&H000000& - черный
&HFFFFFF& - белый
&H00FFFF& - желтый (красный + зеленый)
&H808080& - серый (равные количества цветов)
Константы
Для неизменных значений в программе используются константы. Константы объявляются аналогично переменным, по тем же правилам: имя содержит не более 200 символов, первый символ буква. Если в программе используется только одна форма, то константу можно объявить в разделе DeclarationHous для объекта General. Или же можно и непосредственно в процедуре, но это хуже. Константу объявляют через зарезервированные слова Const. Например,
Const Pi = 3?14159
Const Course = “Informatics”
VB5 имеет только набор встроенных констант, например, VbCrLf или
VbOrOnly. Их можно вставлять в текст программы из окна Object Browser (F2
или меню View). Чтобы вставить Const в программе:
Курсор должен быть в окне кода.
В окне Object Browser щелкнуть на кнопке Copy to Clipboard.
Перейти в программе на место вставки и нажать Ctrl+V.
Встроенные функции
Особое значение имеют строковые функции, т.к. в полях ввода информация хранится в текстовом формате или в формате ariant. Использование же неявных преобразований типов из Variant часто приводит к проблемам и является более медленным.
Строковые функции:
= Space (число пробелов) - выдает строку, состоящую из одних пробелов, причем число символов в строке определяется параметром в скобках.
= String (число, строковое выражение $) - формирует строку, содержащую одинаковые символы.
Например, X$=String (10, “z”) - 10z
= Len (строковое выражение) - длина текущей строки с проблемами и напечатанными символами.
= Mid (строка, начало [, длина])
Mid (“Visual Basic”, 1,6) = “Visual”
Mid (“Visual Basic”, 8,6) = “Basic”
Mid (“Visual Basic”, 8) = “Basic”
Пример. Подсчет числа точек в строке
Points % = 0
Length % = Len (Text $)
For I% = 1 to Length %
If Mid (Text $, I%, 1) = “.” then
Points $ = Points $ + 1
End If
Next I%
= Left (cтрока, № до позиции)
= Right (строка, с № позиции)
Функцию Mid можно использовать для изменения содержания внутри текущей строки. Например
X $ = “Best Basic”
Mid (X $,1,5) = “Quick” какое количество символов с какого символа будет взято из новой строки вставляется новая строка поверх части старой
= Insert ([начальная позиция], строка для поиска, подстрока) является ли данная строка частью другой строки, выдает номер позиции, с которой начинается подстрока.
Text $ = “QuickBasic”
X $ = Instr (1, Text $, “Basic”)=6.
Если подстрока не найдена Instr возвращает нулевое значение (False).
Пример.
If Instr (Text $, “(”) then
Print “символ найден”
Else
Print “Не найден”
End If
= LСase, = UСase - преобразует все символы строки в нижний (верхний) регистр
Вместо Lcase $ Ucase$
= Str lomp - для сравнения строк
Пусть X = StrComp (A$, B$) = [pic]
Если A$ или B$ пуста, то х=NULL
Если использовать StrComp (A$,B$,1) - регистр не учитывается, а если
StrComp (A$,B$,0) - регистр учитывается.
= Trim (строка $) - уничтожает пробелы начале и конце строки
LTrim (строка $) - уничтожает пробелы в левой части строки
RTrim(строка $) - уничтожает пробелы в правой части
Все строковые функции, за исключением Mid, не изменяют строку, а создают ее копию и потом с ней работают.
Управляющие структуры в программе
Определенные циклы
For ___ Next
For I% = 1 to 10 (% - целочисленный тип для ускорения работы цикла)
Print I%
Next I%
Цикл завершается, не в тот момент, когда значение счетчика равняется конечному, а когда оно превышает его.
Пример. Печать всеми доступными шрифтами экрана.
Private Sub Form_Click()
Dim I As Integer
For I=0 to Screen.FontCount - 1
FontName = Screen.Fonts (I)
Print “Это шрифт”; Screen.Fonts (I)
Next I
End Sub
Неопределенные циклы
Не выполняются фиксированное число раз. Цикл может выполняться или нет в зависимости от результата, вычисляемого внутри цикла
Do
Выражение
Loop Until выполняется условие
Пример. Проверка пароля
Private Sub Form_Load ()
Do
X$ = InputBox$ (“Пароль ?”)
Loop Until X$ = “VB”
End Sub
Для остановки бесконечного процесса используют клавиши “Break” или
Run|End или закрыть приложение. В программе можно использовать оператор
Exit Do (или Exit For), которые переводят программу к оператору следующему
после цикла.
Сложные неопределенные циклы
В неопределенных циклах проверка происходит в конце цикла и счетчика
увеличивается еще на 1. Иногда это вызывает лишнее обновление счетчика.
Можно передвинуть проверку условия на начало цикла:
Do Until условие
Тело цикла Выражение
Loop
Do While
Do
Loop Until аналогичен
Do
Loop While условие
Пример.
Do Do
Loop Until N>5 ( Loop While N =0 and N - следующая запись, >
- последующая запись), будет изменять содержимое связанного элемента
управления.
Другие свойства элемента управления Data.
Connect - определяет тип БД, например, FoxPro 3.0.
Exclusive = True - запрет доступа к БД, пока пользователь ее не закроет (после этого необходимо ... Share.exe)
ReadOnly (True/False)
RecordSetType - если RecordSet создается с помощью кода или элемента управления.
Метод Refresh- по этому методу все связанные элементы формы обновляют свое состояние в соответствии с текущим состоянием таблицы.
Data1.Refresh.
Он открывает БД, а также устанавливает указатель записи на первую строку в таблицу или сети просмотра.
Свойство RecordSet объекта Data - это воображаемая таблица, к которой подключен элемент Data. Это может быть реальная таблица из RecordSource или сетка просмотра, определяемая SQL-выражением.
Методы RecordSet
AddNew - очистка буфера копирования, содержащего данные, которые
должны быть записаны в БД, и перемещение текущей записи в конец. =
Добавление записи, которая становится текущей.
Data1.RecordSet.AddNew.
Delete - удаление текущей записи.
Update - реальная пересылка содержимого буфера копирования в таблицу или dynaset.
Edit - копирует текущую запись в буфер копирования для возможности ее редактирования.
MoveNext - перейти на следующую запись
MovePrevious - перейти на предыдущую запись
MoveLast - перейти на последнюю запись
MoveFirst - перейти на первую запись
BOF - начало файла.
EOF - конец файла.
RecordCount - количество записей с первой до текущей.
Пример. Удаление всех записей в таблице.
Data1.RecordSet.MoveFirst
Do While Data1.RecordSet.EOF
Data1.RecordSet.Delete
Data1.RecordSet.MoveNext
Loop
Свойство RecordSource - источник записей, позволяет помимо таблиц БД использовать операторы SQL, чтобы выделить подмножество записей, удовлетворяющих некоторым условиям. Это позволяет создавать программные элемента dynaset или snapshop.
Ввод следующий фраз:
Select - отбор информации из полей.
From - указывает имя таблицы.
Where - определяет условия выборки.
Group By - для распределения выбранных записей в определенные группы.
Having - определяет условие, которому должна удовлетворять следующая группа записей.
Order By - порядок сортировки выбранных записей.
Например.
Data1.RecordSource = “Select Name, Address From AdressBook ...
Data1.RecordSource = “Select Name, Address From AdressBook
Data1.RecordSource = “Select Name, Address From AdressBook Where Name
= ‘Иванов’‘’
“ . . . . Like ‘’Иван” (Ивасев, Иваницкий, Иванченко...)
Select Employers.Dept, MName From Supervisors, Employers Where
Employers.Dept = Supervisiors.Dept
Можно использовать переменные
Data1.RecordSource = “Select * From Telephone Where Name = ‘ “& A &”’”
Text1.Text
В фразе Where можно использовать конечные операции And, Or, Not для
соединения нескольких выражений или операции сравнения =, ,
Between, Like, In (для записей в БД)
Например
Data1.RecordSource = “Select * From Products
Where Tovar in (Select Tovar From_ Details Where Price>=25)”
Помимо запросов SQL можно изменять (Update, Set - новое значение
Where), добавлять (Insert into), удалять (Delete From) записи в таблице.
Например
Dim A As String
A = “Update Orders”
A = A + “Set Amount = Amount * 1.1, Cast = Cast * 0.97”
A = A+ ”Where Order = ‘Цемент’”
Data1.Database.Execute ... Query - запрос с воздействием
Свойство Value
Можно ссылаться на некоторое поле текущей записи, даже если на форме нет связанного элемента.
Например
Sub
Dim A As String
A = Data1.RecordSet.Fields(“Name”).Value
MsgBox “Фамилия: ” + A
End Sub
Объектная модель DAO
Объектная модель DAO - объектно - ориентированный интерфейс процессора БД Jet . Это иерархия классов, которые являются логическим представлением реляционной модели базы данных. Эти классы используются для создания объектов доступа к данным, обращающихся к конкретной базе данных.
DBEngine
Workspace
Database
TableDef QueryDef Recordset Container
Relation
Field Field Field
Document Field
Index Parameter
Error Field
Рис. Фрагмент объектной иерархии DAO.
Наличие объектной иерархии означает, что объекты могут содержать
другие объекты, которые, в свою очередь, могут содержать другие объекты.
Эта объектное включение реализуется через специальный вид объекта-
коллекцию. Основное назначение объекта- коллекции - содержать и
группировать другие объекты. Все объекты, содержащиеся в данной коллекции,
одного вида.
Элементы в иерархии DAO фактически классы, а не объекты. Это макеты для объектов, создаваемых при формировании приложения базы данных, Класс подобен типу данных в том смысле, что он описывает, к какому виду объекта происходит обращение. Например, в объявлении Dim Ws As устанавливается, что переменная Ws будет служить ссылкой на объект класса Workspace.
Наверху иерархии - объект DBEngine, непосредственно процессор базы
данных MS Jet. Он является владельцем коллекции Workspaces (рабочая
область), которая содержит объекты Workspace. Каждый объект Workspace
включает коллекцию Databases, которая содержит один или больше объектов
Database. Каждый объект Database включает коллекцию TableDefs, которая
содержит один или больше объектов TableDef (определение таблицы) и т.д.
Объекты члена коллекции индексируются, начиная с 0 и могут быть
доступны через этот индекс. Например, первый объект TableDef объекта
Database, именуемого Database1, будет адресоваться как Database1. TableDefs
(0). Второй TableDef того же объекта Database - Database1. TableDefs (1) и
т.д. Объекты в иерархии идентифицируются полным путем через вложенные
коллекции, к которым они принадлежат. Например,
DBEngine. Workspaces(0). Databases(0). ss TableDefs
(0).Fields(“Customer”) адресуется к полю Customer в первом TableDef коллекции TableDefs
первого Database коллекции Databases первого Workspace коллекции Workspaces
объекта DBEngine. Кроме того, для коллекции Fields можно вместо индекса
использовать свойство Name объекта Field коллекции. При явном обращении к
члену коллекции по именивместо точки используется восклицательный знак.
Например, ss
TableDefs (0).Fields(“Customer”) эквивалентно
TableDefs (0).Fields!Customer.
Большинство объектов доступа к данным имеет умолчательные коллекции.
Это позволяет упрощать программный код. Например, умолчательная коллекция,
которую содержит объект Recordset - коллекция Fields. Например, все 3
записи эквивалентны:
Cust= Recordset1! Customer
Cust= Recordset1 .Fields!Customer
Cust= Recordset1 . Fields(“Customer”).
Программирование с объектами DAO.
Программирование с объектами DAO заключается в создании объектных переменных и управления ими, вызове методов объектов и установке их свойств. Например,
Dim DB As Database, WS As Workspace(“account.mdb”) ‘ Объявления переменных
Set WS=DBEngine. Workspaces(0) ‘ Организуется рабочая область
(именнованный сеанс пользователя).
Set DB= WS.OpenDatabase(“account.mdb”) ‘ Метод OpenDatabase объекта
WS типа Workspace используется для открытия базы данных account.mdb и
присвоения ссылки на нее объектной переменной DB типа Database.
Set RS=DB.OpenRecordset(“Clients”) ‘ С помощью метода OpenRecordset объекта DB создается набор записей на основе таблицы Clients, ссылка на который присваивается переменной RS типа Recordset.
RS.Index=“ClientID” ‘ Свойству Index объекта RS присваивается значение ClientID.
Создание базы данных
Процедура построения базы данных Jet - это процесс создания и определения объектов доступа к данным, которые соответствуют таблицам, полям, индексам и отношениям структуры новой базы данных.
Пусть требуется создать библиографическую базу данных Biblio.mdb,
состоящую из 3-х таблиц “Авторы”(Authors), “Названия”(Titles),
“Издатели”(Publishers), связанных между собой следующими отношениями:
Titles Authors
Publishers
Title AU_ID
PubID
Year Published Author
Name
ISBN
Company
AU_ID
Address
PubID
...(10)
Необходимо создать объект Database , определить его логическую
структуру, добавив объекты TableDef и Field.
1. Для каждого объекта базы данных создаются новые объектные переменные:
Dim DB As DataBase, WS As Workspace ‘объект базы данных DataBase
Dim AuTd As TableDef, TitTd As TableDef, PubTd As TableDef ‘ объект ‘TableDef для каждой из 3-х таблиц
Dim AuFlds(2) As Field, TitFlds(5) As Field, PubFlds(10) As Field ‘ объект Field
‘для каждого поля каждой таблицы
Dim AuIdx AS Index, TitIdx As Index, PubIdx As Index ‘ объект Index для
‘каждого индекса каждой из 3-х таблиц
2.На основе метода CreateDatabase объекта Workspace создается новая база
данных:
Set Ws=DBEngine. Workspace(0)
Set
Db=Ws.CreateDataBase(“C:VBBiblio.mdb”,dbLangGeneral,dbVersion30) ‘
константа dbLangGeneral определяет языковую версию базы данных, а
dbVersion30- базу данных Jet версии 3.0
3. С помощью метода CreateTableDef объекта Database создаются объекты
Tabledef для каждой таблицы базы данных:
Set TitTd=DB.CreateTableDef(“Titles”)
Set AuTd= DB.CreateTableDef(“Authors”)
Set PubTd= DB.CreateTableDef(“Publishers”)
4. С помощью метода CreateField объекта TableDef создаются объекты Field для каждого поля каждой таблицы базы данных. Для каждого поля устанавливаются свойства, определяющие размер, тип данных и другие необходимые атрибуты. Например, для поля Author код будет выглядеть следующим образом:
Set AuFlds(0)=AuTd.CreateField(“AU_ID,dbLong)
‘ сделать поле счетчиком
AuFlds(0).Attributes=dbAutoIncrField
Set AuFlds(1)=AuTd.CreateField(“Author,dbText)
AuFlds(1)=50 ‘ длина поля
5.Используя метод Append добавить каждое поле к его таблице, а каждую таблицу - к базе данных:
AuTd.Fields.Append AuFlds(0)
AuTd.Fields.Append AuFlds(1)
DB.TableDefs.Append AuTd
6. Используя метод CreateIndex объекта TableDef, создать индексы для каждой
таблицы и установить их свойства. Например. для таблицы Authors:
Set AuIdx=AuTd.CreateIndex(“Au_ID”)
AuIdx.Primary=True ‘Первичный ключ
AuIdx.Unique=True ‘Уникальный ключ
7. Используя метод CreateField объекта Index, создать поля для каждого индексного объекта:
Set NewFld=AuIdx.CreateField(“Au_ID”)
8. Добавить поле к объекту Index, а объект Index к объекту TableDef:
AuIdx.Fields.Append NewFld
AuTd.Indexes.Append AuIdx
Вновь созданные поля объекта Index не становятся частью объекта
TableDef. Вместе с тем им дается то же самое свойство Name, что и у поля
объекта TableDef, которое они должны индексировать. Свойства Type и Size у
этих полей не определяются.
Связывание таблиц
Создание объектов TableDef, которые содержат первичный и внешний ключи, позволяют связывать записи в одной таблице с соответствующими записями в другой таблице, согласно общим значениям первичного/внешнего ключей. При добавлении или удалении записей важно поддерживать так называемую ссылочную целостность. Ссылочная целостность означает, что внешний ключ в любой ссылающейся таблице всегда должен ссылаться на достоверную запись в адресуемой таблице, содержащей первичный ключ. Для поддержания ссылочной целостности используется объект Relation.
1. Добавить отношение к базе данных :
Dim Au_Tit As Relation ‘ объект Relation
Set Au_Tit =Db.CreateRelation(“Authors_Titles”) ‘ создается объект
Relation с помощью метода .CreateRelation
Au_Tit.Table=“Authors” ‘ Устанавливаются свойства объекта Relation
Au_Tit.ForegnTable=“ Titles”
2. Создать поле, которое в отношении будет определять общее поле первичного/внешнего ключа:
DimTempField As Field
Set TempField = Au_Tit.CreateField(“Au_Id”) ‘ создается связующее поле с помощью метода CreateField
TempField. ForegnName =“Au_Id” ‘ Устанавливаются свойства объекта
Field
3. Добавить объект Fields к объекту Relation, а объект Relation к объекту Database с помощью метода Append:
Au_Tit.Fields.Append TempField
Db.Relations..Append Au_Tit
Связывание таблиц внешних баз данных
Кроме определения новых таблиц можно присоединять таблицы из любой поддерживаемой внешней базы данных или из другой базы данных Jet. При связывании таблицы информация соединения сохраняется во внутренней базе данных Jet, и соединение будет устанавливаться автоматически всякий раз при открытии этой базы данных. Сами же данные остаются во внешней базе данных.
Процедура связывания таблицы внешней базы данных подобна определению
и созданию новой внутренней таблицы, за исключением того, что при создании
объекта TableDef необходимо определить свойства SourceTableName и Connect.
Кроме того, для этой таблицы нельзя связывания создавать или добавлять
новые объекты Field и Index.
Для связывания внешней таблицы с базой данных необходимо:
Создать для связываемой таблицы новый объект TableDef, используя метод
CreateTableDef объекта Database. Назначить таблице новое имя (свойство
Name). Например, чтобы присоединить таблицу Сustomers из базы данных
Stocks.mdb к базе данных Biblio.mdb,можно записать:
Set NewTd=DB.CreateTableDef(“Customers”) ‘ Предполагается , что база
данных Biblio.mdb открыта методом OpenDatabase и ей назначена переменная
DB.
2. Установить свойства SourceTableName и Connect объекта TableDef:
NewTd. SourceTableName=“Customers”
NewTd. Connect=“;DATABASE=C:AccessStocks.mdb;”
3.Добавить новый объект TableDef к базе данных:
DB.TableDefs.Append NewTd
Модификация базы данных
Процедуры изменения базы данных подобны ее созданию. Используются те же методы Create и Append.
1. Для добавления таблицы к базе данных необходимо добавить новый объект TableDef к существующей коллекции TableDefs. Например:
Dim DB As DataBase
Dim NewTd As TableDef ‘ Создать новый объект TableDef
Dim NewFld As Field ‘Создать новый объект Field
Set Db=DBEngine. Workspace(0).OpenDatabase(“Biblio.mdb”)
Set NewTd=DB.CreateTableDef(“NewTable”)
Set NewFld= NewTd.CreateField(“NewField”,dbInteger)
NewTd.Fields.Append NewFld ‘добавить поле к таблице
DB.TableDefs.Append NewTd ‘добавить таблицу к базе данных
Db.Close ‘Закрыть базу данных
1. Для добавления поля к таблице необходимо добавить новый объект
Field к существующей коллекции Fields
Dim DB As DataBase
Dim Td As TableDef
Dim Fld As Field ‘Создать новый объект Field
Set Db=DBEngine. Workspace(0).OpenDatabase(“C:Biblio.mdb”)
Set Td=DB. TableDefs(“Authors”)
Set Fld= Td.CreateField(“NewField1”,dbText,30) ‘Создать первое новое поле
Td.Fields.Append Fld ‘добавить поле к коллекции Fields
Set Fld= Td.CreateField(“NewField2”,dbText,20) ‘Создать второе новое поле с помощью той же переменной
Td.Fields.Append Fld ‘добавить еще один объект к коллекции Fields
Db.Close ‘Закрыть базу данных
2. Для добавления таблицы к базе данных необходимо добавить новый объект TableDef к существующей коллекции TableDefs. Например:
Dim DB As DataBase
Dim NewTd As TableDef ‘ Создать новый объект TableDef
Dim NewFld As Field ‘Создать новый объект Field
Set Db=DBEngine. Workspace(0).OpenDatabase(“C:Biblio.mdb”)
Set NewTd=DB.CreateTableDef(“NewTable”)
Set NewFld= NewTd.CreateField(“NewField”,dbInteger)
NewTd.Fields.Append NewFld ‘добавить поле к таблице
DB.TableDefs.Append NewTd ‘добавить таблицу к базе данных
Db.Close ‘Закрыть базу данных
3. Для добавления индекса к таблице необходимо добавить новый объект
Index к существующей коллекции Indexes . Например:
Dim DB As DataBase, Td As TableDef, NewIdx As Index ,NewFld As Field
Set Db=DBEngine. Workspace(0).OpenDatabase(“C:Biblio.mdb”)
Set Td=DB. TableDefs(“Authors”)
Set NewIdx =Td.CreateIndex(“Address_Index”)
NewIdx.Unique=False
Set NewFld= NewIdx.CreateField(“Address”,)
NewIdx.Unique=False
NewIdx.Fields.Append NewFld ‘добавить поле к объекту Index
Td. Indexes.Append NewIdx ‘добавить объект Index к TableDef
Db.Close ‘Закрыть базу данных
4. Для удаления таблицы используется метод Delete коллекции
TableDefs. Этот метод удаляет из таблицы все поля, индексы и данные,
содержащиеся внутри таблицы. Например:
Db.TableDefs.Delete “Authors”
5. Для удаления поля (объекта Field) используется метод Delete объекта TableDef.
Для удаления индексированного поля необходимо сначала удалить индекс, а также созданные посредством этого индекса объекты Relation. После этого можно будет удалить объект Field или объект TableDef, который является частью отношения.
6. Для удаления индекса используется метод Delete коллекции
TableDefs.
Например:
Db.TableDefs(“Authors”). Indexes.Delete “Address_Index” ‘ Из коллекции Indexes в таблице Authors удаляется индекс “Address_Index”.
Нельзя удалять объект Index, который формирует объект Relation.
7. Для изменения поля необходимо создать новый объект TableDef, который отражает требуемые изменения в полях, и затем переместить данные в новую таблицу, удалив старую.
Модификацию базы данных можно также проводить с помощью специальных запросов SQL.
Работа с записями базы данных
Работа с записями базы данных(добавление, удаление, модификация,
поиск, сортировка) осуществляются DAO посредством объектов Recordset.
Объект Recordset представляет записи исходной таблицы или записи,
получаемые в результате выполнения запроса. Существуют 5 типов объектов
Recordset:
Объект Recordset типа table работает с локальной таблицей базы данных или
вешней базы данных, созданной MS Jet. Этот объект можно индексировать,
используя индекс, созданный для исходной таблицы, что намного ускоряет
сортировку и поиск по сравнению с другими типами объектов Recordset.
Объект Recordset типа dynaset (динамический набор) создается для локальных
или связанных таблиц или с результатами запросов. Фактически, это набор
ссылок на записи одной или более таблиц. С помощью dynaset можно получать и
модифицировать данные более, чем одной таблицы, включая связанные таблицы
из других баз данных. Набор dynaset и его исходные таблицы модифицируют
друг друга. Dynaset - наиболее гибкий и мощный тип набора записей, хотя
поиск в них работает не так быстро, как в случае table.
Объект Recordset типа snapshot (моментальный снимок) содержит фиксированную
копию данных в состоянии на момент создания snapshot. Snapshot, созданный
на базе источника данных MS Jet, не может быть обновлен. Snapshot требует
меньших затрат обработки, чем dynaset или table, и запросы в них
выполняются быстрее.
Объект Recordset типа forward- only (листаемый снимок, только вперед),
обеспечивает подмножество функций snapshot. Он предоставляет меньше всего
возможностей, но зато самое высокое быстродействие. Он не является
обновляемым, и он позволяет перемещаться по записям только в прямом
направлении.
Объект Recordset типа dynamic - результирующий набор запроса одной или
нескольких исходных таблиц, в котором можно добавлять, изменять или удалять
записи.
Выбор того или иного типа набора записей зависит от того, какие функции необходимо выполнить, нужно ли изменять или просто просматривать данные. Обычно Объект Recordset типа table почти всегда обеспечивает наивысшую эффективность.
Создание перемещений RecordSet
Для этого используется метод OpenRecordSet
Set rstNew = dbs.OpenRecordSet(“Customers”, dbs.Open RecordSet), где rstNew - переменная, dbs.OpenRecordSet(“Customers”, dbs.Open
RecordSet) - ссылка на объект, возвращаемый методом OpenRecordSet.
Этот метод доступен не толко для объекта Database, но и Connection,
TableDef, QueryDef и существующих наборов RecordSet.
Set rstNew = qdf.OpenRecordSet
Например, создается объект RecordSet из сохраненного в текущей БД запроса.
Dim dbs As Database, Rst As RecordSet
Set dbs=OpenDatabase (“Nwind.mdb”
[ Set rst = dbs.OpenRecordSet (“Сохраняет_Запрос”)] или если сохранение запроса не существует
Dim strQuerySQL As String
Set dbs=OpenDatabase (...
StrQuerySQL=“Select * From Products”_ & “Order by ProductName”
Set rst=dbs.OpenRecordSet (strQuerySQL)
Перемещение по набору записей
Методы MoveFirst, MoveLast, MoveNext, MovePrevious - перемещает указатель.
Move [n]
Переделы набора записей определяется свойствами BOF и EOF, количество записей свойством - RecordCount.
Найти определенную запись в наборе можно с помощью метода Seek (для
Table) и Find (dynaset, snapshop): FindFirst, FindLast, FindNext,
FindPrevious.
Например rstOrderDetails.Find “Order ID= ” & rstOrders.[Order ID] - для первой записи в Orders найти .... запись в OrderDetails
rst Suppliers.Index=“CompanyName” rst Suppliers.Seek “=” str CompanyNAme
If rst Suppliers. NoMatch Then ...
(используется текущий индекс таблицы, определенной свойством Index).
Свойство NoMatch используется для проверки найденной записи, критерий
поиска.
После создания объекта RecordSet типа table или dynaset в переменной
можно удавлять или добавлять, модифицировать новые записи (Update, Delete,
AddNew).
.... модификации намного эффективнее с помощью запросов SQL.
Dim dbs As DataBAse, qdfChangeTitles As QueryDef
Set dbs = Open Database (‘ Nwind.mbb)
Set qdfChangeTitles=dbs.Create QueryDef (“ “) qdf ChangeTitles.SQL=“Update Employers” & “Where Title = ‘Бухг’”
После извлечения записи можно обращаться к ее отдельным полям через коллекцию Fields объекта RecordSet по его свойству Name (имя столбца в таблицк) rst Employers.Fields (“LastName”) или rstEm.LastName или rstEm.Fields(0) - индексом в коллеции
Типы данных объекта Field: dbChar, bdByte, dbDouble, dbInteger, dbSingle, dbLong, dbText.
При работе с данными Field используется его свойство Value.
Sub Change Title( ) rstEmployces.LastName.Value=strName
Dim dbsSales As Database
Dim rstEmp As RecordSet, fldTitle As Field
Dim wspCurrent As WorkSpace
Set wspCurrent As WorkSpace
Set wspCurrent=dbEngine WorkSpace(0)
Set dbsSales=OpenDatabnase (“Nwind.mdb”
Set rstEmp=dbsSales.Open RecordSet(“Employes”, dbOpenTable)
Set fldTitle=rstEmp.Fields(“Title”) rst Emp.MoveFirst
Do Until rstEmp.EOF
If fldTitle=“Ком. предст.” Then rstEmp.Edit fldTitle=“Ком. агент” rstEmp.Update
End If rstEmp.MoveNext
Loop rstEmp.Close dbsSales.Close
End Sub
Создание запросов
Методв CreateQueryDef:
Set запрос = БД.CreateQueryDef ([имя] [, строка SQL])
- запрос - объектная переменная, в которых будет храниться ссылка на вновь создаваемый объект типа QueryDef
- БД - объектная переменная, хранящая ссылку на объект Database, в коором будет храниться создаваемый объект QueryDef
- имя - имя запроса
- строка SQL - выражение SQL, ..... объект QueryDef
Например,
Dim dbs As Database
Dim myqdf As QueryDef
SQL str = “Select * From Products”
SQL str = SQl str & “Where price >1000 and price