Головна сторінка Випадкова сторінка КАТЕГОРІЇ: АвтомобіліБіологіяБудівництвоВідпочинок і туризмГеографіяДім і садЕкологіяЕкономікаЕлектронікаІноземні мовиІнформатикаІншеІсторіяКультураЛітератураМатематикаМедицинаМеталлургіяМеханікаОсвітаОхорона праціПедагогікаПолітикаПравоПсихологіяРелігіяСоціологіяСпортФізикаФілософіяФінансиХімія |
КоментарДата добавления: 2015-08-27; просмотров: 594
Ми будемо з вами змінювати форму Покупки, таким чином, щоб вона стала дійсно зручною для роботи оператора при масовій обробці даних. Ця форма була створена Вами в попередній роботі за допомогою майстра (див. п.2 лабораторної роботи №2.2) 1. Створення обчислюваного поля. При купівлі товару треба автоматично формувати загальну вартість закупівлі, за виразом: [количество]*[цена покупки]. В нашій вправі, для виконання такої задачі, ми змінимо структуру таблиці Покупки. Відкрийте таблицю в режимі конструктора і створіть нове поле стоимость покупки з типом Вычисляемый. Відкриється вікно для побудови виразів. Створіть у ньому вираз, як показано на малюнку нижче. Крім того, нам потрібно відобразити на поточній формі Покупки інформацію із таблиці Товары, для запобігання помилок оператором. Це потребує зміни такої властивості форми, як Источник данных. Поки що ця властивість містить назву таблиці Покупки. Замість неї нам потрібно поставити запит: Включіть у запит: всі поля із таблиці Покупки та поля назв_товара, цена продажи, кол товара із таблиці Товары. Збережіть створений запит під ім’ям Закупки. Такими чином ми створимо новий об’єкт БД і він тепер буде використовуватись у якості джерела даних для форми Покупки. Для цього Вам потрібно виконати команду Сохранить объект как із меню Файл (деталі дивіться на малюнку нижче). З’явиться діалогове вікно, де потрібно вказати ім’я для нового об’єкту – вкажіть ім’я для нового запиту: Закупки. Закрийте конструктор запиту. З’явиться питання про збереження внесених змін – підтвердіть свої дії. Тепер будемо змінювати саму форму. Ось що у нас зробив майстер в попередній роботі: Для внесення додаткових даних (які з’явились при створенні нового джерела даних для форми) ми розширюємо заголовок форми і додаємо туди інформацію з таблиці Товары. А в область даних додаємо поле стоимость покупки, яке ми створили на початку цієї роботи. Закрийте доступ оператору до всіх полів, що знаходяться в заголовку форми (див. п.3.1. попередньої лабораторної роботи). Реалізація автоматичної перевірки даних, що вводяться в форму. Організуємо перевірку за ціною закупівлі. Вона не повинна перевищувати ціну, за якою ми продаємо товар. Для цього у властивість Условие на значение поля цена покупки встановіть наступний вираз: < [цена продажи] (менше ціні з таблиці Товары). Цей вираз можна написати вручну, або створити за допомогою Построителя выражений: Тепер, якщо оператор буде вводити в поле ціну, що дорівнює, або перевищує ціну продажу (що зберігається в таблиці Товары), то Access буде видавати стандартне повідомлення про помилку. Ми, як розробники форми, маємо змогу замінити стандартне повідомлення своїм, більш зрозумілим оператору. У значення властивості Сообщение об ошибке запишіть свій текст. Наприклад: "При такій закупівлі ми понесемо ЗБИТКИ! Встановіть меншу закупівельну ціну." 3. Реалізація автоматичної обробки даних із інших таблиць, в залежності від даних, що вводяться в поточну форму. Завдання: потрібно автоматично змінювати кількість товару, що зберігається в таблиці Товары в полі кол товара, зразу ж після введення даних про кількість закупленого товару у формі Покупки. Тут ми будемо використовувати групу властивостей События (Події). У поля количество покупки є властивість После обновления. Саме для цієї події ми створимо процедуру обробки. Після натискання кн. ОК, відкриється редактор коду: Private Sub количество_AfterUpdate()
End Sub Ви побачите таку процедуру обробки. Тут вже є початок та кінець процедури. Немає самого коду. Його будемо писати самі. Найпростіший варіант: це просто додати нову кількість товару до тієї, що зберігається в таблиці Товары. Але такий варіант не буде враховувати можливість виправлення помилки у існуючому записі. У загальному випадку, для підрахунку нового значення загальної кількості товару, можна застосувати формулу: New_k = Old_k + n_kol_p - s_kol_p де: New_k - нова кількість товару (для збереження в таб.Товары) Old_k - кількість товару, записана в таб.Товары до редагування запису у формі Покупки. n_kol_p - нове значення в полі количество покупки (по закінченню редагування) s_kol_p - старе значення поля количество покупки Нижче наведено чорновий варіант коду процедури, де видно всі кроки підрахунку: Private Sub количество_AfterUpdate() Dim New_k, Old_k, s_kol_p, n_kol_p Old_k = [кол товара] s_kol_p = [количество].OldValue n_kol_p = [количество].Value New_k = Old_k + n_kol_p - s_kol_p [кол товара] = New_k End Sub Пояснення до коду: · 1-й рядок: оголошення функції; · 2-й рядок: визначення змінних, що будуть використовуватись далі; · 3-й рядок: отримуємо в змінну кількість товару, яка є на поточний момент; · 4-й рядок: зчитуємо у змінну властивість поля OldValue (значення до редагування поля); · 5-й рядок: зчитуємо у змінну властивість поля Value (значення після редагування поля); · 6-й рядок: підрахунок нової кількості товару · 7-й рядок: заносимо підраховане значення у поле · 8-й рядок: закінчення функції Такий текс коду приведено для детального показу процесу обробки. Спрощений варіант коду отримаємо, якщо не використовувати змінні, а одразу провести підрахунок, взявши значення із полів: Private Sub количество_AfterUpdate() [кол товара] = [кол товара] + [количество].Value - [количество].OldValue End Sub Нажаль, така процедура не враховує ще деякі особливості підрахунку. А саме: поля можуть бути з невизначеним значення. Тобто, до того моменту, доки в поле не занесене якесь значення, поле в Access визначається як Null (значення не присвоєно). Математичні операції з таким полем виконувати не можна – це приведе до виникнення помилки. Для уникнення помилки, потрібно замінити можливе значення Null на арифметичний нуль. В Access таку операцію найпростіше виконати за допомогою функції Nz(). Синтаксис функції: Nz(об’єкт, значення_якщо_об’єкт_Null) Ця функція перевіряє об’єкт на значення Null і, якщо воно НЕ Null, то повертає сам об’єкт, а якщо Null, то повертає свій другий параметр. Таким чином: Nz([кол товара].OldValue, 0) поверне число, що внесене в це поле, або нуль, якщо поле не мало значення до початку редагування (така ситуація виникне при внесенні нового запису). Тепер ми можемо написати остаточний варіант коду процедури обробки для події После обновления поля количество покупки: Private Sub количество_AfterUpdate() [кол_товара] = Nz([кол_товара], 0) +[количество].Value - Nz([количество].OldValue, 0) End Sub Після внесення таких змін у форму, вона буде виконувати автоматичну обробку даних. На малюнку зображено стан запису до початку редагування: А ось після зміни кількості із 10 на 30: Поля кол товара і стоимость змінились автоматично, без участі оператора. Зверніть увагу: ми з вами внесли зміни в таблицю Товары, хоч працювали з формою Покупки. 4. Для підвищення продуктивності роботи оператора, створення механізму автоматичної зміни даних, які вносяться в форму за замовчуванням. Тепер займемося сервісом для користувача. Передбачимо можливість вносити в нові записи значення за замовчуванням. Наприклад, оператор обробляє накладну з номером "А-486/03". Потрібно зробити так, щоб цей номер автоматично вставлявся в кожний новий запис. Для початку, закрийте редагування форми Покупки і змініть структуру таблиці Покупки – додайте нове текстове поле накладная, для занесення в нього інформації про № накладної. Повертіться до редагування форми Покупки. Вставте нове поле в область даних перед полем Код фирмы. Далі переходимо в область Примечание формы. Створіть там елемент управління поле, який не буде приєднаний до джерела записів форми (вільний елемент). Через вікно властивостей задайте йому ім'я "u_nom": Тепер в поле u_nom користувач може записувати будь-який набір символів. Для того, щоб цей текст автоматично потрапляв в поле накладная, при створенні кожного нового запису, потрібно для поля накладная у властивість Значение по умолчанию записати вираз: = [u_nom].
Зверніть увагу – на малюнках зображені вікна властивостей РІЗНИХ елементів управління! Після того, як оператор запише що-небудь у поле u_nom, це значення буде автоматично вноситись у всі нові записи таблиці Покупки для поля накладная Оскільки ми створили поле накладная після інших полів на формі, це поле буде оброблятись формою не першим, хоча стоїть воно на початку рядка. Для того щоб змінити порядок переходів між елементами форми потрібно на закладці Меню в конструкторі форм скористатись меню Вид команда Переходы… Тут виділіть поле и перетягніть його вгору. Тепер останнім, при заповненні форми, буде отримувати фокус поле стоимость покупки. Для автоматизації заповнення форми, ми вже ввели в примітки форми поле u_nom, воно буде підставляти в поле накладная значення, які оператор внесе туди із однієї накладної. Але така накладна матиме ще декілька значень, які можна автоматично підставляти в записи форми Покупки. Це: фірма, від якої ми отримали накладну и дата накладної. Тому по аналогії з вільним полем u_nom, створіть ще два поля: u_firm та u_dat, значення, які будуть автоматично підставлятись в кожний новий запис форми. Специфіка створення поля u_firm полягає в тому, що потрібно створити не текстове поле, а список, що відкривається. Цей список повинен показувати назви фірм, а запам’ятовувати код фірми. Специфіка створення поля u_dat полягає в тому, що йому потрібно присвоїти формат календарної дати, тоді заповнення поля буде відбуватись за рахунок спеціального елементу для календарних дат. Тепер, оскільки всі нові записи повинні отримувати інформацію саме з цих додаткових полів, нам потрібно «примусити» оператора обов’язково заповнити ці додаткові поля. Для того, щоб «примусити» оператора заповнити поля в примітках форми перед внесенням нового запису в базу, потрібно скористатись властивістю форми: До вставки. Створимо тут процедуру: Private Sub Form_BeforeInsert(Cancel As Integer) If IsNull(u_nom) Then Me!u_nom.SetFocus ElseIf IsNull(u_firm) Then Me!u_firm.SetFocus ElseIf IsNull(u_dat) Then Me!u_dat.SetFocus End If End Sub Суть цієї процедури полягає у тому, що вона перевіряє створені поля на значення Null. Якщо хоча б одно із полів має таке значення, то фокус введення даних переміщається саме в це поле. А виконується ця процедура перед тим, як оператор почне вносити новий запис у форму. Далі закрийте доступ і заблокуйте поля накладная, Код фирмы, дата покупки, стоимость покупки (це поле, яке підраховується автоматично). Крім того, встановіть для цих полів фонову заливку, щоб оператор бачив їх недоступність (виконується у вікні властивостей полів на закладці Макет). Всі ці обмеження були зроблені для зручності вводу, адже тепер замість семи полів, які ми бачимо на формі, курсор введення попадає тільки у три поля. Такий режим значно підвищить продуктивність заповнення бази. Але бувають випадки, коли оператору потрібно отримати доступ до всіх полів. Для цього передбачимо спеціальну кнопку, яка буде надавати йому доступ до закритих полів. А після завершення редагування розблокованого запису, повернемо форму в початковий стан. Створюємо в кінці рядка даних кнопку без участі майстра, тому що ми будемо самі писати процедуру для цієї кнопки. Private Sub kn_edit_Click() Me![накладная].Enabled = True Me![накладная].Locked = False Me![накладная].BackColor = RGB(255, 255, 255) Me![код фирмы].Enabled = True Me![код фирмы].Locked = False Me![код фирмы].BackColor = RGB(255, 255, 255) Me![дата покупки].Enabled = True Me![дата покупки].Locked = False Me![дата покупки].BackColor = RGB(255, 255, 255) Me![накладная].SetFocus Me!kn_edit.Enabled = False End Sub Суть цієї процедури полягає в тому, що елементи управління накладная, код фирмы, дата покупки, розблоковуються і їм встановлюється білий фон. Далі фокус введення передається до поля накладная, а кнопка блокується. Тепер нам потрібно повернути форму в початковий стан, після редагування поточного запису. Для цього використаємо таку подію форми як Текущая запись (Current). Ця подія наступає в момент переходу поточного запису на інший запис. Private Sub Form_Current() Me![код товара].SetFocus Me![накладная].Enabled = False Me![накладная].Locked = True Me![накладная].BackColor = RGB(229, 205, 170) Me![код фирмы].Enabled = False Me![код фирмы].Locked = True Me![код фирмы].BackColor = RGB(229, 205, 170) Me![дата покупки].Enabled = False Me![дата покупки].Locked = True Me![дата покупки].BackColor = RGB(229, 205, 170) Me!kn_edit.Enabled = True End Sub 5. Створення активних елементів для сортування даних. Для цього використаємо елемент управління "выключатель". Такий елемент приймає різні значення, в залежності від свого стану. Якщо вимикач натиснуто (увімкнено) – True і навпаки, якщо вимкнено – False. Ці значення можна зчитувати і змінювати стан сортування форми в залежності від дій користувача. Крім того, ці значення можна і присвоювати елементу управління (в процесі виконання коду процедури обробки подій), тим самим примусово переводячи елемент управління в потрібний стан. Створіть в заголовку форми на місці напису накладная вимикач. Задайте наступні властивості цьому елементу управління: · властивість Имя = sort_nom · властивість Подпись = накладная На місці інших написів у заголовку створіть ще кілька вимикачів, дайте їм відповідно імена та підписи. Тепер нам потрібно написати процедури обробки подій. Наприклад: Private Sub sort_firm_Click() If Me!sort_firm Then Me.OrderBy = "[Код фирмы]" Me.OrderByOn = True Else Me.OrderByOn = False End If Me!sort_nom = False Me!sort_date = False - - - - - - - End Sub Пояснення до коду: · 1-й рядок: оголошення функції; · 2-й рядок: початок блоку перевірки стану вимикача; · 3-й і 4-й рядки виконуються, якщо вимикач знаходиться у натиснутому стані. 3-й –властивість OrderBy (сортувати по….) об’єкту форма змінюємо на текст, який містить назву потрібного поля (для кожної кнопки буде своє ім’я поля). 4-й рядок коду – активуємо сортування; · 5-й рядок: оператор, за яким починається друга частина блоку перевірки; · 6-й рядок виконується, якщо кнопку переведено у стан «вимкнено». В такому випадку потрібно зняти сортування з форми, що и виконується деактивацією властивості сортування форми; · 7-й рядок: оператор закінчення блоку перевірки; · 8-й, 9-й (і можуть бути ще рядки) – переводимо всі інші існуючі перемикачі у стан «вимкнено»; · кінець функції. 6.Самостійно змініть форму Продажи як показано на малюнку. Звичайно, при продажі, кількість відповідного товару на складі (таблиця Товары), повинна зменшуватись.
|