вторник, 10 сентября 2013 г.

Базы данных Access и VBA

Довелось мне как-то взяться за "лопату" и найти внятное описательное решение в Интернетах на простую тему "Как программно ковыряться в Access?".  Это получилось далеко не сразу, поэтому просто оставлю это здесь.

1. Создание новой таблицы средствами VBA
Есть некая, одна из многих типичных, база данных учета машин. Необходимо создать новую таблицу с тремя полями "Гаражный номер", "Расход бензина", "Стоимость бензина". Совсем несложный скрипт позволит решить это проблему.


В целом, вся система доступа к данным в БД осуществляется по логической цепочке: получаем доступ к текущей БД(переменная db типа DAO.Database указывает на текущую БД), далее мы получаем доступ к таблицам (создание, редактирование, что угодно, через переменную tdf типа TableDef), а далее - доступ к полям (через переменную fldl типа Field).

Собственно, создание новой таблицы (у меня она названа "Превышение"), осуществляется так:
Set tdf = db.CreateTableDef("Превышение")
А добавление в новую таблицу новых полей - вот так:
Set fld1 = tdf.CreateField("Гаражный_номер", dbText, 6)

Главное, про что стоит помнить: созданные поля нужно сохранять (Append нам в помощь после каждого добавленного поля),
tdf.Fields.Append fld1
а потом, собственно, тем же сохранить новую таблицу в БД
db.TableDefs.Append tdf

2. Копирование данных по условию в таблицу "Превышение" из другой таблицы
Просматривая таблицу "Авто" (с полями "Гаражный_номер", "Расход_бензина_л_км", "Стоимость_бензина"), пользователь потребовал скопировать данные в таблицу "Превышение" о тех машинах, которые превышают средний расход бензина, хранящийся в переменной sb.
Для начала, этот sb мы должны еще рассчитать.  Мы должны получить доступ к таблице "Авто" через рекорсет, затем должны посчитать сумму расхода бензина и разделить ее на количество записей. Данные манипуляции приведены на рис. ниже.
Видно, что рекордсет MyRec содержит все данные из таблицы "Авто", а обращение к конкретному полю в этом рекордсете осуществляется через !, например,
myRec!Расход_бензина_л_км
Следующим шагом, после вычисления среднего расхода, является сравнение переменной sb с каждой записью по полю "Расход_бензина_л_км", если превышение есть, всю строку необходимо скопировать в таблицу "Превышение". Ниже на рис. представлен код реализации.
Для того, чтобы иметь возможность что-то копировать в таблицу "Превышение", необходимо создать поля, куда должны скопироваться данные. Это можно осуществить, только получив доступ к таблице "Превышение" через рекорсет rstCurr. Параметр dbOpenDynaset обозначает динамический набор записей. 
После добавления данных, таблицу необходимо обновить, а после окончания работы с рекордсетами - обязательно их закрыть.

3. Редактирование существующих записей
Следующей задачей является изменение данных в поле "Стоимость_бензина" (увеличение их в 2 раза) в таблице "Превышение". 

Снова нам понадобится доступ к таблице "Превышение" через рекорсет myRec1. Реализация задачи приведена на рис. выше. После обновления данных выдается сообщение "Данные обновлены" и количество записей в таблице.

Комментариев нет:

Отправить комментарий