- •Информационные системы
- •Пользователи информационных систем
- •Преимущество и проблемы интеграции информации
- •Проектирование баз данных
- •Выбор субд
- •Дата логическое проектирование
- •4 Нормальная форма
- •Операции над рбк
- •Обработка отношений
- •Размещение данных в памяти эвм
- •Язык запросов sql
- •Субд Microsoft Access
- •Субд FoXPro
- •Команды управления
- •Структура системных команд foxpro
- •Индексирование баз данных
- •Index on fio to kadrsex // sex – половая принадлежность
- •If found() // а если найду?
- •Язык vba (Visual Basic Application)
If found() // а если найду?
select C // АКТИВАЦИЯ ТАБЛИЦЫ NALICHIE
locate for nom2=b->nom2 // поиск совпадений по коду препарата
if found()
do while found()
select A
locate for nom1=c.nom1 // поиск аптеки, в которой препарат есть
if found()
@ str,1 say ‘номер=’+nom1+’ Адрес=’+adr+‘ телефон=’+tel
else
@str,1 say “Аптеки с номером’+c.nom1+’нет в таблице аптек’
endif
select c
contunie
enddo
else
@str,1 say ‘Лекарства’+b.nom2+’ нет ни в одной аптеке’
else
@str,1 say ‘Лекарства'+nazvan+' нет в таблице лекарств’
endif
str=str+1
wait’ ‘
clear all //очистка экрана и выгрузка всех БД
Иначе говоря, программа делает примерно следующее:
- Назовите препарат:
- жопальгин
- Ищем по названию, если нашли жопальгин в списке лекарств, то:
Смотрим, есть ли он в наличии где-то, если есть, то
Смотрим, в какой аптеке и выдаем покупателю информацию о ней
Если нет, то поциент уходит и умирает через 2.5 дня
Если лекарства еще не существует, то прописываем плацебо и все довольны.
Язык vba (Visual Basic Application)
Многие задачи можно решить с помощью макросов. Но их возможности не всегда достаточны и необходимо использовать возможности языка VBA.
Он имеет все конструкции, необходимые для управления логикой программы.
Обеспечивает возможность перехватить сообщение об ошибке, возникающее при работе программы и написать программу обработки этой ошибки.
Поддерживает несколько механизмов для взаимодействия с другими приложениями (OLE – внедрение объектов)
При программировании на VBA необходимо помнить 2 момента:
VBA – объектно-ориентированный язык.
Модель программирования в access является событийно-управляемой.
Структура программ на VBA
Проект состоит из модулей, каждый модуль состоит из объявления (Declaration) и еще какой-то херни.
Модули могут быть стандартные, то есть находятся где угодно и не связаны ни с одним объектом и работают тогда, когда запустим.
И модули класса, содержат кроме процедур еще и описание объекта, и используются для создания объектов.
Типы данных VBA
Всего их 14
array – описание массивов
currency (@) – числа с заданным количеством знаком после запятой (для денег)
double (#) – числа с плавающей точкой и двойной точностью.
integer (%) – он и в Африке Integer
long (&) - длинное целое
single (!) – плавающая точка с обычной точностью
object – ссылки на объект
string ($) - строки
variant – любой тип, но это тормозит трансляцию и забивает память, т.к. требует определение типа на ходу
пользовательский
Описание переменных
Dim <имя перем>[As <тип данных>],[…
Dim a As string – переменная «а» строчного типа
Dim b% - переменная «b» типа Integer
Dim b%, c! – сам(а) посмотри что это значит, все описано выше :D
Const <имя к> [As <тип>] = выраж // выражение это число или формула
Например: Const C = 50
Замечание: Константа не может начинаться с префиксов ac, wd,xl, ol,vh.
Описание массивов
Dim <имя>(<размер1>,<размер2>…) [As <тип данных>]
Например: Dim a(15) As integer – целочисленный массив из 16 элементов
Dim b(3, 3)%
Dim c(1 to 7) As double // 7 чисел
Так описываются статические массивы. Но VBA позволяет работать с динамическими массивами, т.е. с такими, размер которых изменяется в процессе работы программы.
Dim <имя массива>() [As<тип>]
Redim[Preserve]<имя массива>(<размер>,<размер>…)
Preserve означает, что при новом определении длины массива старое содержание массива сохраняется.
Пример использования динамического массива
…
Dim Books() As integer
Dim n%
n=50
Redim Books(n)
… (заполнение массива)
Redim Preserve Books(n+10)
Тип, определяемый пользователем
…
type Person
name $
birthday As date
endtype
type book
title As string
content() As string
author As Person
endtype
…
Dim MyBook As Book
MyBook.title = “База данных”
Radim Content(1 to 10)
MyBook.content(1)=”Введение”
MyBook.content(2)=”Проектирование бд”
Управляющие конструкции VBA
Это команды, с помощью которых пишем программы
if <усл> then
<оператор 1>
[else
<оп 2>]
endif
select case <проверяемое выражение>
case <список значений 1>
<операторы 1>
case <список значений 2>
<операторы 2>
…
case else
<операторы n>
end Select
Список значение может быть:
<выражение>
<выр 1> to <выр 2>
Is <логич опер> <выр>
Если нужно определить какое число введено с клавиатуры:
Dim t As integer
t=InputBox(“Введите число”)
select Case t
case 0
MsgBox(“Это ноль”)
сase 1 to 100
MsgBox(“Это полож число”)
case -100 to -1
MsgBox(“Это отриц”)
case Is <-100, Is>100
MsgBox(“Большое число”)
case else
MsgBox(“Это не число”)
endselect
Операторы цикла
do while <усл> <операторы> loop
Начинается с 0
do <операторы> loop while <усл>
Начинается с 1
do until <усл> <операторы> loop
do <операторы> loop until <усл>
for … next [<счетчик>]
Цикл для обработки семейства однородных объектов
for each <элемент> In <семейство> <операторы> next [<элемент>]
Можем перебирать объекты, например, таблицы, формы и др.
Пример. Функция, проверяющая открыта ли форма.
Function IsLoaded*(FormName As string) As Boolean
Dim frm As Form // Объектная переменная типа Form
IsLoaded = false
for each frm In Forms //семейство открытых форм
if frm Name = FormName then IsLoaded = true
exit function
endif
next frm
endfunction
Для отладки и работы этого модуля напишем модуль 2
Sub Vizov()
Dim str As string
Dim a As Boolean
str = InputBox(“Введите имя формы”)
a=IsLoaded(str)
MsgBox(a)
endsub
Процедуры VBA
Они (проце дуры) бывают двух видов:
Обработки событий. Они связаны с некоторым объектом Access и хранятся в модуле этого объекта.
Общие. Могут хранится и в стандартных модулях и в модулях отчетов.
Подпрограммы:
Sub <имя подпрог> [<арг 1>, <арг 2>, …)] <операторы процедуры> endsub
Функции: function <имя функции> [(арг.тип) [As <тип функции>]] <операторы> <имя ф> = <возвращаемое значение> end function
Вызов осуществляется, как и в других программах.
Объявление процедур
Sub Int (arr() As Integer) Dim I%, str$ For I = LBound(arr) to ИBound(arr) str = “Введите след число” &i arr(i)=inputbox(str) next i endsub
LBound и UBound – верхние и нижние значения массива
& - функция сцепления, которая сначала преобразует i в строку.
Объявление функции, подсчитывающей сумму любого числа аргументов:
FunctionSumVar(ParamArray vararg() As variant) %
ParamArray означает, что количество аргументов – переменное число
Dim intSum %, numb As variant For each numb In vararg int Sum = int Sum + numb next numb SumVar = intsum endfunction
Фрагмент программы для вызова подпрограммы и функции
Dim intSl(1 to 38) As Integer Dim int S% Call Init (intSl) int S = Sum Var (1, 2, 7, 15, 27, 30)
Передача параметров может осуществляться по значению или по ссылке:
By Val – по значению By Ref – по ссылке Sub Refval((x,By Val Y, by ref z) x = x+1 y = y+1 z = z+1 MsgBox(x) MsgBox(y) MsgBox(z) Endsub
Sub MainCall() a = 10 b = 20 c = 30 Call Refval (a,b,c) MsgBox(a) MsgBox(b) MsgBox(c) Endsub
Пусть сначала запускается MainCall Результат: 11 20 31
Область видимости переменных и процедур
Переменная имеет 3 уровня видимости:
Переменная называется локальной и время её жизни от начала работы процедуры до окончания
Уровень модуля. Модульные переменные описываются в области Declaration
Уровни проекта. Глобальные переменные
Замечание:
Глобальные переменные лучше описывать в отдельном модуле
Глобальных переменных должно быть минимально количество, а лучше вообще скинуть их с обрыва, как это делают в СПАРТЕ!
Все вышесказанное относится и к константам, и к массивам. Локальную переменную можно объявить статически, тогда при каждом новом обращении к процедуре данная переменная сохраняет предыдущее значение
Уровни видимости процедур
Тут существует только 2 уровня:
Уровень модуля
Уровень проекта ( по умолчанию )
Описание некоторого модуля:
Public A1$
Private A2% Dim A3 As single Sub P~oel() // поел? Dim A4%, static 5% A1 = “Область видимости” A2 = 2 A3 = 3,14 A4 = A4 + 4 A5 = A5 + 5 MsgBox(A4) MsgBox(A5)
endsub
Sub Proc2()
Call Proc1
MsgBox(A1)
MsgBox(A2)
MsgBox(A3)
MsgBox(A4)
MsgBox(A5)
Call Proc1
endsub
Пусть сначала вызвается Proc2
Из proc1 будет напечатано 4 и 5
Из proc2 «Область видимости» 2 3,14 Пусто Пусто
Из proc1 A4 = 4 A5 = 10 – т.к. статическая
Создание функции или подпрограммы общего назначения
Открываем Access. Кнопка «Модуль» -> Создать
Insert -> Procedure Add -> Имя Add -> public/private
--------------------------- | Public Sub Proc3() | | Call Proc2 | | endSub | Save as Модуль 1
Что бы ввести предыдущий пример нажимаем Модуль-> Создать Declaration Public Private …. Save As Модуль2
Откроем proc3 и запустим кнопкой «Run»
Пример: Доступ к существующей БД и её таблицам
Sub Doctup()
Dim sW As WorkSpace // sW – ссылка на рабочую область
Dim aB as Database // ссылка на БД
Dim tb As Tabledel // Ссылка на таблицы
Set wS = DBEngine.Workspaces(0)
Set db = wS.Opendatabase(“C:\моёпорно\какясдавалтервер”)
For each tb in db.Tabledef
MsgBox(tb.Name)
Next td
db.Close
Set db = Nothing
Set td = Nothing
Set wS = Nothing
Endsub