Довідники. Частина 3., MS Office, Програмні керівництва, статті

У той час, коли створювалася ця розсилка, Валерій Крук знову здивував громадськість, запропонувавши дуже цікаву ідею. Коротенько суть його пропозиції в наступному:
Часто буває, що варіантів для підстановки значень у поле форми не багато і тому заводити для цього окрему таблицю – довідник не бажано. Вставляти ж заздалегідь всі значення в полі зі списком теж не вихід, адже іноді доводиться міняти вміст списку. Валерій ж пропонує компроміс – об’єднати довідкові дані для декількох списків в одну таблицю. А заодно запропонував оригінальний інтерфейс для введення / редагування даних.
Детально розповідати я не буду, інакше вийде плагіат, бажаючі можуть ознайомитись з прикладом за посиланням am.rusimport.ru/MSAccess/topic.aspx?id=598

    У попередній статті розглядався приклад додавання відсутнього значення в список підстановки. Але дані не зберігалися, бо для цього потрібна довідкова таблиця. Тепер я покажу аналогічний приклад, але вже з використанням довідкової таблиці, тим самим вирішиться проблема збереження нового значення в довіднику. Додавати дані, так само як і в попередньому прикладі будемо програмно. Для цього скористаємося DAO – Data Access Objects – об’єктна модель доступу до даних. Об’єкти доступу до даних створювалися, як об’єктно – орієнтований інтерфейс для ядра баз даних Jet фірми Microsoft як раз для того, щоб можна було програмно вносити, змінювати, видаляти дані в таблицях.
    Створимо функцію AppendLookupTable і помістимо в загальний модуль, щоб її можна було викликати з різних форм, для різних полів зі списками, а не тільки для конкретного.


    Для роботи з таблицею програмно (через DAO), спочатку необхідно оголосити об’єктну змінну і привласнити їй джерело даних (Recordset):



Dim rst As DAO.Recordset ‘оголошуємо змінну
Set rst = CurrentDb.OpenRecordset (ПолеСоСпіском.RowSource) ‘


а далі стандартна обробка Recordset


rst.AddNew ‘ДобавітьНовуюЗапісь
rst (i) = NewData ‘НовиеДанние
rst.Update ‘скоригувати (оновити джерело)
rst.Close ‘закрити джерело


    при роботі з таблицею / запитом через DAO після виконання дій з рядками обов’язково має бути оновлення джерела rst.Update. Інакше компілятор тут же видасть помилку. І не забуваємо закривати джерело після роботи – звільняємо пам’ять. В принципі це не обов’язково, при виході з процедури Access його все одно обнулить, але варто виробити таку гарну звичку – звільняти змінні в кінці процедур.


    Викликати функцію будемо аналогічно попередньому прикладу:



Private Sub Город_NotInList (NewData As String, Response As Integer)
Dim ctl As Control “Повертає об’єкт Control, який вказує на поле зі списком
    Set ctl = Me! Місто “призначаємо змінної ctl поточний контрол (поле зі списком)
“Запрошення підтвердити введення нового значення
    Response = AppendLookupTable(ctl, ctl.Text)
    Me.Город.RowSource = Me.Город.RowSource “оновлення списку (адже там з’явився новий елемент)
End Sub


    Повний текст функції наведено в Приклад 1. Варіант3.


Форми – довідники.


    Тепер займемося нарешті формами. Почнемо з простого: створимо табличну форму – довідник. На подію «Відкриття» форми вішаємо процедуру:



Private Sub Form_Open(Cancel As Integer)
    Form.Caption = Me.Form.Name “присвоюємо назвою форми її ім’я в базі
    DoCmd.MoveSize,, 5000, 3000 “задаємо розміри форми (ширина, висота)
    DoCmd.GoToRecord,, acNewRec “встановлюємо фокус на останній запис
End Sub


    Ми отримали просту форму довідник. Залишилося придумати, як же її викликати? Зазвичай застосовують два способи:



  1. Раз довідник – джерело поля зі списком, то чому б двічі не клацнути по відповідному списку для його відкриття? А щоб це як то узаконити, пофарбуємо список в синій (можна, зрозуміло, і в будь- інший) колір і оголосимо в довідці до програми, що при подвійному натисканні по полю синього кольору відкривається належна йому довідкова таблиця. Створюємо процедуру відкриття табличної форми:


Private Sub idРегіон_DblClick (Cancel As Integer)
    DoCmd.OpenForm “Довідник регіони”, acFormDS,,,, acWindowNormal
End Sub


    acFormDS – Вказівка ​​на те, що форма відкривається в режимі таблиці
    acWindowNormal – Вказуємо тип кордону (вид форми) – звичайна Windows («Нормальна» в конструкторі форм)


    Залишилося зробити ще одну важливу річ: оновити список при закритті довідника. Адже якщо ми внесли туди нові дані (або видалили) зміни бажано відразу відобразити у списку.



Private Sub Form_Close()
    If IsLoaded (“Приклад 1”) Then Forms! Прімер1.idРегіон.Requery “оновлюємо поле зі списком idРегіон на формі Приклад 1
End Sub


    IsLoaded – Ця функція перевірки, відкрита чи форма “Приклад 1”. Взято з бази «Борра».



  1. Створимо на головній формі список з іменами довідників, і будемо їх відкривати подвійним клацанням по потрібному назвою.

    Для організації подібного інтерфейсу нам знадобиться службова таблиця «ФормиПараметри» і функція fOpenForm. У цьому прикладі для різноманітності застосуємо інший вид форми.


    Довідник у нас буде складатися з двох форм: проста форма буде служити контейнером для табличній. Поле сірого кольору – поле фільтра. Почніть вводити в нього перші літери шуканого позначення – і вміст таблиці стане динамічно фільтруватися (за першими літерами). Фільтрація відбувається за допомогою функції «fFilForm».


    А тепер найцікавіше: я зробив тільки одну подібну форму довідник (основна форма «Довідник», полагоджена таблична «SubFrm»), а в списку їх у мене дві: Країни, Регіони. І в базі ви не знайдете форм «Довідник країни», «Довідник регіони». Звідки ж вони беруться? Все дуже просто. Розглянемо функцію «fOpenForm».



Function fOpenForm (КодФорми As String) As Boolean
On Error GoTo Err_
    strFormName = DLookup (“ІмяФорми”, “ФормиПараметри”, КодФорми)
    strTextFormName = DLookup (“ОбозначеніеФорми”, “ФормиПараметри”, КодФорми)
    strTableName = DLookup (“Таблиця”, “ФормиПараметри”, КодФорми)
    DoCmd.OpenForm strFormName
    fOpenForm = True
Exit_:
    Exit Function
Err_:
    MsgBox Err.Description
    Err.Clear
    fOpenForm = False
    Resume Exit_
End Function


    Тут ми бачимо процедуру присвоєння значень трьом змінним: strFormName, strTextFormName, strTableName. А тепер подивимося на самий верх модуля «Module1». Там ми побачимо



Public strFormName As String
Public strTextFormName As String
Public strTableName As String


    Тут ми підійшли до такого важливого поняття, як область видимості змінних. Раз ці три змінних оголошені в розділі General загального модуля з ключовим словом Public, то вони стають видимими для всіх модулів програми. Наприклад, їх “побачать” процедури модуля форми «Довідник» для того щоб привласнити формі відповідні параметри. Розглянемо їх.


    У таблиці «ФормиПараметри» є три поля: ІмяФорми (ім’я форми в додатку), ОбозначеніеФорми (текстове позначення форми, або просто заголовок форми), Таблиця (джерело даних форми – ім’я таблиці). В функції «fOpenForm» відбувається присвоєння цим змінним значень за допомогою



DLookup (“ІмяПоляТабліци / запиту”, “ІмяТабліци / запиту”, “Умова відбору”)


    як видно, значення беруться з полів службової таблиці «ФормиПараметри». А потім команда на відкриття форми DoCmd.OpenForm strFormName


    Тепер заглянемо в модуль форми «Довідник». Розглянемо процедуру, яка відбувається при відкритті форми:



Private Sub Form_Open(Cancel As Integer)
    Form.Caption = strTextFormName
    Set idField = Me.П1
    strSql = “SELECT [” & strTableName & “]. id, [” & strTableName & “]. Позначення FROM [” & strTableName & “]”
    strSql1 = “ORDER BY [” & strTableName & “]. Позначення”
    Subfrm.Form.RecordSource = strSql & strSql1
End Sub


    Відкриття форми відбувається після присвоєння значення глобальних змінних. Своє позначення і джерело даних форма отримує при відкритті.


    В результаті вийшов макет форми. При запуску формі присвоюється текстове позначення і чіпляється джерело рядків за допомогою глобальних змінних, значення для яких беруться з службової таблиці. Таким чином, стає можливим використовуючи всього один макет форми «створювати» безліч однотипних довідників. Для цього достатньо лише заповнити необхідними даними службову таблицю. Єдине умова: у всіх довідкових таблицях повинно бути два поля, називатися вони повинні однаково: id, Позначення. Це накладає обмеження на можливі варіанти довідників, але ж мова йде про прості довідкових формах.


    А тепер, спробуйте самі: “створіть” довідник «Міста», заповнивши відповідними даними таблицю «ФормиПараметри».


    До сих пір ми розглядали тільки найпростіші довідники. Але уявіть: у кожній країні десятки регіонів, в кожному регіоні десятки міст. Для країни міст вийде не одна сотня. Не зручно вибирати зі списку з декількома сотнями записів. Було б краще, якщо вибравши регіон, у списку міст відобразилися б тільки відповідні йому міста. Для цього будуть потрібні спеціального виду довідники: багаторівневі (Залежні). Про це в наступній статті.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*