Рассылка статей | Выпуск 34. Классы и защита базы данных
Leadersoft.ru

Рассылка статей

Программирование и готовые решения

В этом разделе сайта дается информация от https://leadersoft.ru о статьях по программированию, ответах на вопросы и др. Статьи рассылаются подписчикам и публикуются на разных сервисах. Возможно некоторая информация устарела и ссылки не работают, но эти сведения могут быть полезны, если Вы серьезно занимаетесь разработкой баз данных

Выпуск 34. Классы и защита базы данных

  Новости
   29.01.2001. Добавился пример la_prot1.mdb в Access коды.
   03.01.2001. Вышли новые версии программ "Склад и Реализация" и "Курсы валют". Ведутся  разработки заказных проектов с использованием оригинальных новинок в интерфейсе. Подробное описание будет дано позднее.

Вопрос:  1687
Тема:      Защита mdw - бесполезна?
Сообщение:
   • На www.access.nm.ru узнал новость о том, что защита с помощью файла рабочих групп mdw вскрывается мгновенно (проверено лично).  Как защищать базы теперь?
   • Недавно мне попалась небольшая статья по модули классов в VBA (статья относилась к Access 2000). Технологию создания и использования классов я понял, но преимущества использования классов непосредственно в Access так и не понял.
Ответ.
 •
Вообще защиту базы, а именно, объектов и таблиц стандартными методами желательно не производить. Используйте, например, метод RSA для защиты данных в таблицах.
  Рассмотрим другой вариант защиты, а именно, объектов базы данных и программного кода. Например, необходимо создать файл mdb, который можно было изменять пользователю, а некоторые программы из формы изменить было бы нельзя. В данном примере создается внешний класс для формы и размещается в mde файле, который используется как библиотека.
 • Применение класса выгодно также за счет экономии времени на разработку  событий для стандартных кнопок: ОК, Отмена, Добавить, Печать и т.п. Если у Вас будет 5-10 форм это уже оправдывает создание класса и описание событий объектов.
 • Полный программный код дан в файле: la_prot1.mdb (см. пример 11 и класс: clsProtForm )

' Описание внутреннего класса для формы. Разместите его в вашей форме.
Private mFrm As clsProtForm

Private Sub Form_Open(Cancel As Integer)
Set mFrm = New clsProtForm ' Создаем класс
Set mFrm.Form = Me.Form ' Устанавливаем ссылку
End Sub

' Это внешний класс для формы. Сохраните его в текстовом файле, а потом импортируйте из VBA. Обратите внимание на использование объектов c событиями, и именно, формы, кнопок и группы. Все события класса будут срабатывать ПОСЛЕ работы с пользовательским классом  формы.
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "clsProtForm"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Compare Database
Option Explicit

' Объекты с событиями
Private WithEvents clsFrm As Form ' Форма класса
Attribute clsFrm.VB_VarHelpID = -1
Private WithEvents butCancel As CommandButton ' Кнопка класса
Attribute butCancel.VB_VarHelpID = -1
Private WithEvents GroupSelect As OptionGroup ' Группа
Attribute GroupSelect.VB_VarHelpID = -1

' Свойства форм
Public Property Set Form(Value As Form)
On Error GoTo 999
' События для формы
Set clsFrm = Value
clsFrm.OnLoad = "[Event Procedure]" ' Событие для загрузки

' События для клавиш
Set butCancel = clsFrm.Controls("butCancel") ' Ссылка на кнопку
butCancel.OnClick = "[Event Procedure]" ' Устанавливаем событие

' События для переключателя
Set GroupSelect = clsFrm.Controls("GroupSelect") ' Ссылка на группу
GroupSelect.AfterUpdate = "[Event Procedure]" ' Устанавливаем событие

Exit Property
999:
MsgBox Err.Description
Err.Clear
End Property
Public Property Get Form() As Form
Set Form = clsFrm
End Property

' События формы
Private Sub clsFrm_Load()
subProgress "clsFrm_Load" ' Загрузка
End Sub
' События кнопок
Private Sub butCancel_Click()
subProgress "butCancel_Click" ' Нажатие кнопки отмена
End Sub
' События группы
Private Sub GroupSelect_AfterUpdate()
subProgress "GroupSelect_AfterUpdate. Значение= " & clsFrm.Controls!GroupSelect
End Sub

' Сообщение. Вывод данных в форму
Public Sub subProgress(strMsg As String)
clsFrm.Controls("Progress") = _
clsFrm.Controls("Progress") & "clsProtForm: " & strMsg & vbNewLine
End Sub

Вопрос:  1689
Тема:      Поиск в таблице
Сообщение:
Есть форма, в которую вносятся значения серии и номера. По значениям указанным в этих двум полям нужно найти сведения в другой таблице и отобразить на форме. Каким образом это можно организовать? Таблица в которой должен осуществляться поиск может быть очень большой.
Ответ. Желательно таблицу с данными ограничить путем создания запроса на выборку. Поставьте этот запрос (например, SELECT * FROM [ВСЕ Книги] WHERE [Тип]=1) вместо таблицы (запроса) [Мои книги] в примерах указанных ниже.
Пример 1
. В данном варианте постоянно меняется запрос. Таким образом на экране всегда будут отображаться только те записи (книги), которые необходимо Вам просмотреть.
Private Sub myBooks_Change()
Dim s As String
s = Me.myBooks.Text 'Определяем текст
If Len(s) <> 0 Then s = " WHERE Left([Книга]," & Len(s) & ") = '" & s & "'"
Me.myFind3.Form.RecordSource = "SELECT Книга FROM [Мои книги]" & s
End Sub
Пример 2 . В данном варианте при вводе первых символов включается программа поиска и курсор останавливается на первой подходящей записи (книге).
Private Sub Books_Change()
Dim rst As Recordset, frm As Form
Set frm = Me.myFind3.Form 'Выбираем форму
Set rst = frm.RecordsetClone 'Выбираем запрос
rst.FindFirst "([Книга] Like '" & Me.Books.Text & "*')=True"
If rst.NoMatch = False Then frm.Bookmark = rst.Bookmark
End Sub
P.S. Описание контекстного поиска дано в файле la_form.mdb, 3 пример
Вопрос:  1690
Тема:      Обновление подчиненной формы
Сообщение: Есть форма "X", содержащая подчиненную форму "Y" (тип - ленточная) и есть форма "Z". "X" и "Z" открыты в окне базы. Как организовать обновление данных в подчиненной форме "Y" при закрытии формы "Z"?
Ответ. Обновление данных в форме (запроса содержащего записи) производится через подпрограмму Requery, которую имеет любой объект Form. Поэтому, чтобы не было проблем с объектами в программах используйте явные ссылки (например, Me.Form, DAO.Recordset и т.п. ) В данном случае программный код разместите в модуле класса формы Z.
Private Sub Form_Close()
Forms("X").Controls("Y").Form.Requery
End Sub

Добавить комментарий

Loading