При активізації форми UserForm2 відбувається ініціалізація комбінованих списків:
Private Sub UserForm_Activate()
ComboBox1.AddItem ("Базар")
ComboBox1.AddItem ("Охорона")
ComboBox1.AddItem ("Офіс")
…
Також описується технологія доступу до бази даних ADO:
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.ConnectionString = "D:\Central.mdb"
cn.Open
Далі встановлюються локальні буфери для збереження таблиць. Такі буфери використовуються багато разів. Наприклад, один з них описується так:
Dim rs As New ADODB.Recordset
rs.CursorType = adOpenKeyset
rs.LockType = adLockOptimistic
rs.Source = "SELECT * FROM Працівник"
Set rs.ActiveConnection = cn
Після встановлення буферу та його заповнення, заповнюються текстові поля та комбіновані списки та інші потрібні графічні елементи форми. Для цього розроблена окрема процедура ShowRecord():
Private Sub ShowRecord()
TextBox1.Text = rs.Fields(0).Value
ComboBox3.Text = rs.Fields(5).Value
CheckBox1.Value = rs.Fields(6).Value
…
End Sub
Для перегляду наступного, попереднього були створені кнопки, що обробляються схожим чином. Наприклад, текст процедури обробки кнопки наступного запису виглядає так:
If Not rs.EOF Then
rs.MoveNext
If Not rs.EOF Then
ShowRecord
Else
rs.MoveLast
End If
End If
Для виключення помилок при відсутності слідуючого чи попереднього запису виконується перевірка на предмет останнього чи першого запису відповідно.
Для організації додавання запису використовується допоміжні процедури ShowEmptyRecord() (обнулює поля форми) та FillRecord() (записує введенні дані в локальний буфер).
Видалення запису проходить наступним чином:
If rs.RecordCount >= 1 Then
rs.Delete
If rs.RecordCount > 0 Then
CommandButton8_Click
Else: ShowEmptyRecord
…
Де CommandButton8_Click імітує натиснення кнопки оновлення. Таким чином використовується процедура обробки кнопки оновлення без явного її використання.
Закриття форми призводить до виконання команд пов’язаних з обнуленням локального буферу та закриттям зв’язків з базою даних:
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing.
Більш детально текст програми можна побачити в додатку.
Реалізація обробки запитів
Робота з базою даних у формі для запитів проходить аналогічним чином як було розглянуто вище (див. п. 2.2). Тому розглянемо тільки особливості обробки запитів отриманих використанням мови SQL.
У даному вікні організовано роботу трьох видів запитів: по відділу, орендатору і працівникові. Назви відділів сталі, тому вони прописані при ініціалізації явно і не залежать від бази даних. Комбіновані списки орендаторів і працівників заповнюються при активації форми з бази даних за допомогою SQL-запитів. Приклад заповнення такого списку:
Do While Not rs2.EOF
ComboBox2.AddItem (rs2.Fields(0))
rs2.MoveNext
Loop
Для отримання будь-якого виду звіту досить тільки вибрати необхідну критерію в комбінованому списку на будь-якій вкладці. Обробка таких списків виконується при зміні вибору. Це виключає необхідність використовувати додаткові кнопки для формування запиту.
Як додатково, можна використати можливість виведення звіту запиту у документ Word:
Set WordApp = New Word.Application
WordApp.Visible = True
Set DocWord = WordApp.Documents.Add
DocWord.Activate
DocWord.Paragraphs(1).Alignment = wdAlignParagraphLeft
DocWord.Range(0,0).InsertAfter str1
Для цього спочатку створюється екземпляр додатку, далі відкривається в ньому новий документ. Після чого встановлюється властивість параграфу(в даному випадку вирівнювання) та виводиться текст у вказаний діапазон. Весь зміст звіту записаний в рядковій змінній str1 шляхом конкатенації.
Реалізація звітів
Форма для роботи зі звітами складається з двох частин, у перші знаходяться кнопки для безпосереднього формування звітів, а у другій список орендаторів та кнопка, яка автоматично формує договір з вибраним орендатором.
Для створення звітів і договору використовується SQL-запит.
Звіт має виводиться в документ Word у вигляді таблиці, автоматично обраховуючи потрібні величини. Для таблиці створюється заголовок. Документ створюється аналогічним чином як було описано вище (див. п. 2.3). Але деякі особливості.
Для створення заголовка таблиці використовується вирівнювання ліворуч та напівжирний тип шрифту:
DocWord.Paragraphs(1).Alignment = wdAlignParagraphRight
DocWord.Range(0, 20).Bold = True
Для створення таблиці наперед відомо тільки кількість стовпців, так як вони відображають незмінні характеристики. Кількість рядків таблиці невідома, вона залежить від кількості записів в базі даних, тому її потрібно підрахувати:
rs.MoveFirst
Do While Not rs.EOF
k = k + 1
rs.MoveNext
Loop
Далі проводяться оголошення необхідні для створення таблиці:
Dim tbl As Table
Set Table = DocWord.Tables.Add(Range1, k, 3)
Set tbl = DocWord.Tables(1)
Для табиці потрібно задати заголовки стовпців, стиль та дозволити малювання рамки:
DocWord.Tables(1).Borders.Enable = True 'створює розмітку таблиці
DocWord.Tables(1).AutoFormat (wdTableFormatList1)
DocWord.Tables(1).Cell(1, 1).Range = "П.І.П"
DocWord.Tables(1).Cell(1, 2).Range = "Відділ"
DocWord.Tables(1).Cell(1, 3).Range = "Сума грн."
Таблиця заповнюється по комірках, задаючи порядковий номер рядка і стовпця. Слід врахувати, що вони нумеруються з одиниці і перший рядок вже зайнятий для заголовків стовпців. Для кожного стовпця організований окремий цикл заповнення:
j = 1
For i = 2 To tbl.Rows.Count - 1
field = rs.Fields(0).Value
rs.MoveNext
tbl.Cell(i, j).Range.Text = field
Next i
rs.MoveFirst
Нижній рядок таблиці теж зайнятий для автосуми. Ширина стовпців встановлюється після малювання і заповнення таблиці. Таблиця перемальовується автоматично після встановлення ширини стовпців:
DocWord.Tables(1).Cell(i + 1, j).AutoSum
DocWord.Tables(1).Cell(i + 1, 1).Range = "ВСЬОГО ГРН."
DocWord.Tables(1).Columns(1).Width = 250
DocWord.Tables(1).Columns(2).Width = 100
DocWord.Tables(1).Columns(3).Width = 80