Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bazy_dannykh.docx
Скачиваний:
3
Добавлен:
27.09.2019
Размер:
156.01 Кб
Скачать

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 момента:

  1. VBA – объектно-ориентированный язык.

  2. Модель программирования в 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

Это команды, с помощью которых пишем программы

  1. if <усл> then

<оператор 1>

[else

<оп 2>]

endif

  1. 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

Операторы цикла

    1. do while <усл> <операторы> loop

Начинается с 0

    1. do <операторы> loop while <усл>

Начинается с 1

    1. do until <усл> <операторы> loop

    2. do <операторы> loop until <усл>

    3. for … next [<счетчик>]

    4. Цикл для обработки семейства однородных объектов

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

Они (проце дуры) бывают двух видов:

  1. Обработки событий. Они связаны с некоторым объектом Access и хранятся в модуле этого объекта.

  2. Общие. Могут хранится и в стандартных модулях и в модулях отчетов.

Подпрограммы:

  1. Sub <имя подпрог> [<арг 1>, <арг 2>, …)] <операторы процедуры> endsub

  2. Функции: 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

  1. LBound и UBound – верхние и нижние значения массива

  2. & - функция сцепления, которая сначала преобразует 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

  1. Пусть сначала запускается MainCall Результат: 11 20 31

Область видимости переменных и процедур

Переменная имеет 3 уровня видимости:

  1. Переменная называется локальной и время её жизни от начала работы процедуры до окончания

  2. Уровень модуля. Модульные переменные описываются в области Declaration

  3. Уровни проекта. Глобальные переменные

Замечание:

  • Глобальные переменные лучше описывать в отдельном модуле

  • Глобальных переменных должно быть минимально количество, а лучше вообще скинуть их с обрыва, как это делают в СПАРТЕ!

  • Все вышесказанное относится и к константам, и к массивам. Локальную переменную можно объявить статически, тогда при каждом новом обращении к процедуре данная переменная сохраняет предыдущее значение

Уровни видимости процедур

Тут существует только 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

  1. Из proc1 будет напечатано 4 и 5

  2. Из proc2 «Область видимости» 2 3,14 Пусто Пусто

  3. Из proc1 A4 = 4 A5 = 10 – т.к. статическая

Создание функции или подпрограммы общего назначения

  1. Открываем Access. Кнопка «Модуль» -> Создать

  2. Insert -> Procedure Add -> Имя Add -> public/private

  3. --------------------------- | Public Sub Proc3() | | Call Proc2 | | endSub | Save as Модуль 1

  4. Что бы ввести предыдущий пример нажимаем Модуль-> Создать Declaration Public Private …. Save As Модуль2

  5. Откроем 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

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