- •5.05150104 "Дизайн друкованої продукції"
- •Урок 8. Запис і читання даних
- •Робота з ascii -файлами
- •Мал. 8.1. Ascii - файл з роздільниками.
- •Послідовний доступ
- •Мал. 8.2. Зразок послідовного файлу.
- •Мал. 8.3. Перегляд результатів.
- •Довільний доступ
- •Двійковий доступ
- •Проста програма шифрування
- •Мал. 8.4. Запис в текстовому файлі.
- •Мал. 8.5. Форма для програми шифрування.
- •Мал. 8.6. Стандартне діалогове вікно.
- •Елементи даних
- •Використання елементу даних
- •Властивості елементу даних
- •Мал. 8.8. Властивості елементу даних
- •Анатомія бази даних
- •Створення баз даних в Visual Data Manager
- •Мал. 8.9. Вікно бази даних із розширеними властивостями
- •Створення таблиці
- •Конструювання таблиці
- •Мал. 8.10. Діалогове вікно Table Structure.
- •Створення полів
- •Мал. 8.11. Діалогове вікно AddField.
- •Введення даних
- •Створення запиту
- •Мал. 8.12. Діалогове вікно Query Builder.
- •Мал. 8.13. Результати запиту.
- •Первинні ключі
- •Лічильники
- •Числові поля
- •Грошові поля
- •Логічні поля
- •Поля Memo
- •Поля дати/часу
- •Зміна таблиці
- •Технологія ado (ActiveX Data Objects)
- •Мал. 8.14. Моделъ ado.
- •Використання елементу даних ado
- •Мал. 8.15. Діалогове вікно сторінок властивостей елементу даних ado
- •Puc. 8.16. Вибір провайдера
- •Мал. 8.17. Вибір файлу бази даних
- •Мал. 8.18. Завдання властивості RecordSource
- •Використання об'єктів підключення і набору записів ado
- •Puc. 8.19. Створення посилання на бібліотеку типів ado
- •Додавання записів
- •Оновлення записів
- •Видалення записів
- •Що нового ми дізналися?
- •9 Урок. Друкування
- •Виведення даних на друкування
- •Метод Print
- •Перегляд значень у вікні безпосередніх обчислень
- •Перегляд помилок у вікні безпосередніх обчислень
- •Мал. 9.1. Вікно безпосередніх обчислень з інформацією про помилку.
- •Виправлення помилки
- •Метод PrintForm
- •Колекція Printers
- •Мал. 9.2. Виведення вмісту колекції Printers. Використання Crystal Reports в Visual Basic
- •Мал. 9.4. Режим конструктора в Crystal Reports Установка Crystal Reports Pro
- •Створення звіту
- •Мал. 9.6. Зв'язки між таблицями
- •Мал. 9.7. Вкладка Fields
- •Puc. 9.8. Вибір поля для сортування
- •Мал. 9.9. Вкладка Total Мал. 9.10. Фільтрація записів в звіті
- •Мал. 9.11. Вибір стилю звіту
- •Мал. 9.12. Готовий звіт
- •Мал. 9.13. Режим конструювання
- •Використання звіту в додатку
- •Мал. 9.14. Звіт в режимі конструювання. Мал. 9.15. Діалогове вікно Property Pages для Crystal Reports 4.6.
- •Мал. 9.16. Додавання елементу Crystal Report.
- •Мал. 9.17. Виведення звіту з додатка. Друкування початкового тексту програми
- •Мал. 9.18. Діалогове вікно Print. Діалогове вікно Print
- •Перегляд результатів
- •Розшифровка лістингу
- •Що нового ми дізналися?
Властивості елементу даних
Почнемо з властивостей елементу даних (мал. 8.8). Властивість Connect вказує тип бази даних - за умовчанням вибирається Access. Властивість DatabaseName визначає ім'я файлу бази даних (строго кажучи, це справедливо тільки для баз даних Access; у інших базах даних досить вказати тільки каталог). Властивість RecordSet показує, звідки беруться дані - з таблиці, динамічного набору (dynaset) або знімка (snapshot). Зазвичай (хоча і не завжди) таблиця виявляється найбільш ефективним варіантом, якщо дані зберігаються в одній таблиці; динамічний набір - якщо дані є підмножиною записів таблиці або знаходяться в декількох таблицях, а знімок - якщо доступ до даних відбувається тільки для читання. У нашому прикладі властивість RecordsetType може мати будь-яке з трьох можливих значень. Властивість RecordSource визначає таблицю в базі даних (принаймні в Access; у інших базах даних воно звичайно визначає ім'я файлу). Щоб працювати з декількома таблицями в динамічному наборі, вам доведеться ввести SQL - оператор або заздалегідь створити цей набір у своїй програмі або Access.
Мал. 8.8. Властивості елементу даних
Сам по собі елемент даних не відображує інформацію - його доводиться зв'язувати з елементом іншого типу. У попередньому прикладі використовувалися два текстові поля. Для кожного з полів у властивості DataSource було задано ім'я елементу даних (у нашому прикладі - Datal), а в полі DataField - ім'я поля в наборі записів, властивістю RecordSource елементу даних. Можливість роботи з базами даних є однією з найсильніших сторін Visual Basic. Елементи даних мають колосальні можливості, але ви можете добитися ще більших результатів, якщо навчитеся писати процедури доступу до даних на Visual Basic. Навіть у недалекому минулому робота з даними не викликала особливих труднощів, але з появою ADO це завдання стало чи не одним з найпростіших! Ми детально розглянемо ADO в цьому уроці, а доки давайте познайомимося із структурою баз даних.
Анатомія бази даних
У Visual Basic передбачено багато можливостей для роботи з базами даних формату Microsoft Access (.MDB), а також SQL Server і Oracle. Хоча в Visual Basic існує немало способів отримати потрібні дані, ми розглянемо лише пару з них (додаткову інформацію можна знайти в книзі Джона Вейскаса "Ефективна робота з Microsoft Access 97" (Видавництво "Пітер")). На щастя, для роботи з базами даних Access необов'язково мати встановлену копію Access, тому що в Visual Basic входить ядро AccessJet Engine. Усе, що вам потрібне - це MDB - файл Access. Для створення бази даних зручніше користуватися Access, проте ми вдамося до послуг надбудови Visual Data Manager, тому що вона входить в Visual Basic.
База даних Access є файлом, що включає таблиці, індекси і запити. Таблицею називається набір даних, розбитих на рядки і стовпці. В термінах баз даних рядка називаються записами, а стовпці - полями. Індексом називається пов'язаний список покажчиків на записі таблиці. Він прискорює пошук в таблиці (подібно до того, як предметний покажчик книги прискорює пошук потрібної сторінки). Запитами називаються оператори SQL (Structured Query Language - структурована мова запитів), по яких з таблиці вибирається підмножина записів.
Таблиці
Якщо вам доводилося працювати з SQL, то ви знаєте, що таке таблиця. Якщо ви переходите на Visual Basic або Access c одній з традиційних систем управління базами даних, буде потрібно деякі пояснення. To, що в xBase вважається базою даних, в Access називається таблицею. У Visual Basic і Access таблиці складають лише частину компонентів, з яких складається база даних. Повноцінна база даних Access містить і інші об'єкти - інші таблиці, запити, форми і т. д. Таблиці не зберігаються в окремих файлах, а є невід'ємною частиною бази даних. Щоб відкрити таблицю, необхідно заздалегідь відкрити батьківську базу даних. Таблиці є найбільш важливим компонентом бази даних, саме в них зберігаються дані. Якщо вам не доводилося працювати з базами даних, але у вас є деякий досвід спілкування з Excel, можете розглядати таблицю як робочий лист. Якщо продовжити аналогію з електронними таблицями, рядки відповідають записам, а стовпці - полям. Я поясню сказане на прикладі простої таблиці.
-
Назва
Автор
за п'ять хвилин
Ф. Блоггз
Астрофізика для чайників
Дж. Доуу
Як заробити мільярд
Б. Гейтс
Якщо не рахувати назв стовпців, в таблиці є присутній три рядки, кожна з яких відноситься до окремої книги. Іншими словами, наша таблиця складається з трьох записів. Кожен запис має різні атрибути, або властивості - назву і ім'я автора. Полів всього два - "Назва" і "Автор". Зрозуміло, справжні бази даних містять набагато більше записів і складаються з більшої кількості полів.
У будь-яку базу даних повинна входити хоч би одна таблиця, інакше база не міститиме ніяких даних і виявиться абсолютно безглуздою. Отже, при створенні бази даних необхідно передусім створити хоч би одну таблицю і занести в неї дані. Ймовірно, з розширенням потреб програми вам доведеться додавати в базу даних і інші таблиці. Так, в наведеному раніше прикладі друга таблиця може містити інформацію про видавців книг з першої. Звичайно, першу таблицю можна доповнити і включити в неї відомості про видавця у вигляді окремого поля - але якщо видавці випускають по декілька книг, бажано винести в окрему таблицю. Тим самим ви забезпечите цілісність даних, а структура бази даних стане раціональнішою.
Запити
Запити служать для вибірки або зміни даних в таблицях. Ви звертаєтеся із запитом до існуючої бази даних і, якщо запит сформульований коректно, отримуєте відповідь. При цьому економиться немало часу, який довівся б витрачати на пошук відповіді іншими засобами. Існують і інші способи отримання даних з таблиць, але ми почнемо саме із запитів. Для зміни даних в таблицях теж можна користуватися іншими способами (наприклад, модифікувати таблицю вручну), проте запити дозволяють легко внести зміни відразу в декілька записів і полів. Припустимо, нас цікавить, які книги були написані Стівеном Блахом. Для цього ми визначимо на мові SQL запит, до якого увійдуть записи, що лише цікавлять нас. Поступіть наступним чином:
1. Відкрийте приклад з підрозділу "Використання елементу даних".
2. У вікні властивостей заміните значення властивості RecordSource наступним: select * from [Authors] where [Author] = "Blaha, Stephen"
3. Виконаєте команду Run > Start.
Результат запиту виглядає так:
-
Ім'я автора
Номер
Blaha, Stephen
9033
Результат запиту дуже схожий на таблицю; фактично він є підмножиною записів таблиці. У термінології Visual Basic і Access така підмножина називається "Динамічним набором". Дані, що входять в динамічний набір, насправді не існують - вони лише тимчасово витягаються з таблиці (чи таблиць), що цікавить вас, а при збереженні запиту записується лише критерій вибірки (у нашому прикладі критерій - це автор з ім'ям Stephen Blaha). Визначення "динамічний" означає, що при зміні таблиці склад набору може змінитися, але запит залишиться тим же. Оскільки динамічний набір є підмножиною записів існуючої таблиці, ви можете змінити що входять в нього дані - це приведе до зміни даних початкової таблиці. Слід врахувати, що на редагування даних в динамічних наборах накладаються деякі обмеження, наприклад забороняється вносити зміни, загрозливі цілісності даних. Наприклад, якщо таблиця з іменами авторів не повинна містити імен, що повторюються, ви не зможете створити новий запис для книги, написаної тим же автором.
Запити складають надзвичайно важливу частину Visual Basic і Access. Ви можете не лише змінювати дані в динамічному наборі, але і звертатися із запитом до самого запиту (сподіваюся, ви розумієте, що мається на увазі). Скажімо, якщо динамічний набір містить назви декількох книг, написаних Стівеном Блахом, критерій можна посилити і обмежити його однією-двома назвами. Виникає принципове питання - чом би не поставити назви книг на перше місце і не замінити два запити одним? Звичайно, це цілком допустимо, і більше того, в багатьох ситуаціях поступати слід саме так, Проте витонченість запитів Access якраз і полягає в тому, що послідовні запити дозволяють поступово звужувати динамічний набір і переглядати результати проміжних запитів. Запити стають "багатошаровими", а в багатьох ситуаціях саме це і потрібно.
Попутно виникає ще один, не менш важливе питання. Чи варто возитися із запитом, якщо ви можете проглянути таблиці і "вручну" вибрати з неї усі книги Стівена Блаха? Якщо таблиця складається всього з трьох записів, таке зауваження виглядає цілком обґрунтованим. Але якщо в базі зберігається декілька десятків, сотень і навіть тисяч записів, використання запитів дозволяє легко виділити інформацію, що цікавить вас. Зазвичай в запити входить інформація з декількох таблиць - це дозволяє переглядати і змінювати дані з логічно пов'язаних, але проте різних таблиць на одній формі Visual Basic.
