Книга
Книга
ACCESS ТРЮКИ
Оригинальные решения задач по обработке данных
С^ПИТЕРС^ПИТЕР
С^ПИТЕР
С^ПИТЕР
O’REILLY’
Кен Блюттман
ACCESS ТРЮКИ
Оригинальные решения задач по обработке данных
Кен Блюттман
^ПИТЕР ‘
Москва ■ Санкт-Петербург • Нижний Новгород ■ ВоронежРостов-на-Дону ■ Екатеринбург ■ Самара ■ НовосибирскКиев ■ Харьков • Минск
2006
ББК 32 973.233-018
УДК 004.65
Б71
Блюттман К.
Б71 Access. Трюки. — СПб.: Питер, 2006. — 332 с.: ил.
ISBN 5-469-01187-9
Эта книга поможет преодолеть чувство потерян кости, которое зачастую испытывают пользователи, пытающиеся самостоятельно разобраться во всевозможных сложностях, встречающихся на их пути при освоении Microsoft Access. Для опытных программистов а этой книге предлагается уникальная подборка улучшенных методик работы и инструментов, позволяющих существснщ повысить качество и эффективность работы с базами данных. Для начинающих эта книга будет замечательным помощником в освоении программы.
ББК 32.973.233-018
УДК 004.65
Права на издание поручены по соглашению с O'Reilly,
Все права защищены Никакая часть данной книги не может быть воспроизведена а какой бы тс ни было форме без письменного разрешения владельцев авторских прав
Информация, содержащаяся а данной книге, получена из источников, рассматриваемых издательством как надежные Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство не может гарантировать абсолютную точность и полноту приводимых сведений и не несет ответственности за возможные ошибки, связанные с использованием книги
ISBN 0596009240 (англ )ISBN 5-469-01187-9ISBN 0596009240 (англ )ISBN 5-469-01187-9© 2005 O'Reilly Media, Inc.
ISBN 0596009240 (англ )
ISBN 5-469-01187-9
ISBN 0596009240 (англ )
ISBN 5-469-01187-9
© Перевод на русский язык ЗАО Издательский дом «Питер», 2006
© Издание на русском языке, оформление ЗАО Издательский дом «Питер», 2006
Введение .11
Глава 1. Использование ядра Access17
Трюки №1-12
Глава 2. Таблицы 45
Трюки №13-18
Глава 3. Ввод данных и перемещение по элементам управления 67
Трюки №19-27
Глава 4. Представление данных 93
Трюки №28-39
Глава 5. Запросы и SQL 131
Трюки №40-54
Глава 6. Решение проблем многопользовательской среды 177
Трюки №55-58
Глава 7. Внешние программы и данные 193
Трюки №59-71
Глава 8. Программирование 251
Трюки №72-91
Глава 9. Использование сторонних приложений 297
Трюки №92-95
Глава 10. Интернет 315
Трюки №96-100
Алфавитный указатель 325
Введение 11
Глава 1. Использование ядра Access17
Трюк№ 1. Облегчение поиска нужных объектов 17
Трюк №2. Индивидуальная настройка приложений Access 20
Трюк №3. Быстрая работа без опечаток 24
Трюк №4. Оптимизация процесса изменения данных 27
Трюк №5. Перенос данных между версиями Access 29
Трюк №6. Наведение порядка в макросах и придание им большей значимости .. 31
Трюк №7. Очистка базы данных от ненужного хлама 33
Трюк №8. Защита ценной информации 36
Трюк № 9. Работа с данными любого объема;.. 37
Трюк № 10. Ускорение поиска объектов базы данных 39
Трюк №11. Использование связующей таблицы 41
Трюк № 12. Сдерживание базы данных от непомерного разрастания 43
Глава 2. Таблицы 45
Трюк № 13. Создание поля счетчика с произвольным начальным значением 45
Трюк № 14. Копирование данных из одной таблицы в другую без использования запроса на добавление 48
Трюк № 15.Исключение системных таблиц изобработки51
Трюк № 16.Прячем информацию от посторонних 54
Трюк № 17.Имитация табличных триггеров 58
Трюк № 18.Ускоренное создание таблиц 63
Глава 3. Ввод данных и перемещение по элементам управления67
Трюк № 19. Упрощенное перемещение по длинным формам 67
Трюк № 20. Упрощение ввода дополнительного текста72
Трюк № 21. Предоставление возможности добавления собственных значений в существующие списки 76
Трюк № 22. Приемы заполнения и сортировки списков 78
Трюк № 23. Использование в форме дополнительных элементов управления 83
Трюк № 24. Подтверждение изменений, внесенных в запись перед ее сохранением .. 85
Трюк № 25. Отображение в форме показаний цифровых часов 87
Трюк № 26. Рационализация переходов по элементам 89
Трюк № 27. Выделение активного элемента управления91
Глава 4. Представление данных ., 93
Трюк № 28. Деление отсортированных по алфавиту записей на группы по буквам .... 94
Трюк № 29. Подсчет промежуточных итогов на основе определенных условий .... 99
Трюк № 30. Использование условного форматирования для выделения важных результатов 102
Трюк № 31. Создание прямой ссылки на отчет 105
Трюк № 32. Защита интеллектуальной собственности 107
Трюк № 33. Демонстрация слайдов в Access 112
Трюк № 34. Проигрывание видеоклипов в форме Access 117
Трюк № 35. Просмотр в отчетов в форме 12)
Трюк № 36. Нумерация строк отчета 123
Трюк № 37. Отчет с чередованием подкрашенных и обычных строк 121
Трюк № 38. Экономия бумаги за счет сокращения количества пустых мест 127
Трюк № 39. Включение в отчет даты, времени и нумерации страниц 12)
Глава 5. Запросы и SQL ,131
Трюк № 40. Получение выборки записей 13.
Трюк № 41. Защита от сбоев при проведении операции добавления записей ....131
Трюк № 42. Поиск записей без подчиненных по нескольким связанным полям...136
Трюк № 43. Вставка в запрос итоговой суммы 140
Трюк № 44. Сортировка по любому произвольному символьному фрагменту ....14
Трюк № 45. Суммирование сложных данных 14!)
Трюк № 46. Получение всех возможных сочетаний данных 153
Трюк № 47. Обезвреживание пустых данных 155
Трюк Ns 48. Использование в запросе своей собственной функции 160
Трюк Ns 49. Использование таблиц Access в сценариях SQL Server 162
Трюк Ns 50. Использование в запросах символов-заменителей 165
Трюк № 51. Упрощение условия отбора, в котором используется оператор Or...167
Трюк Ns 52. Упрощение условия отбора, в котором используется оператор And...169
Трюк Ns 53. Создание внешнего соединения 17(1
Трюк № 54. Использование в запросах Access регулярных выражений 177
Глава 6. Решение проблем многопользовательской среды ... 177’
Трюк № 55. Проверка на наличие дубликатов 171'
Трюк Ns 56. Распространение распределенной базы данных с заранее установленными ссылками на таблицы 178
Трюк № 57. Создание функции реагирования на простой 183
Трюк № 58. Получение уникальных имен пользователей 191
Глава 7. Внешние программы и данные 193
Трюк Ns 59. Импорт из Excel разрозненных диапазонов ячеек 193
Трюк № 60. Использование Excel для переориентации данных Access 198
Трюк № 61. Использование функций Excel в базе данных Access .202
Трюк № 62. Использование Word для сравнения данных двух таблиц Access205
Трюк № 63. Импорт в Access различных XML-данных 208
Трюк № 64. Рациональный способ экспорта данных в формат XML 216
Трюк № 65. Преодоление барьера преобразования при использовании VBA227
Трюк № 66. Повышение производительности SQL Server за счет вызова хранимых процедур 229
Трюк № 67. Управление документами Word из Access 232
Трюк №68. Использование Access в качестве интерфейсной части базы
данных MySQL235
Трюк № 69. Автоматическая отправка данных Access с помощью Outlook 240
Трюк № 70. Создание таблиц Access из других приложений 246
Трюк № 71. Написание кода VBA при помощи записи макросов в Word и Excel ... .249
Глава 8. Программирование 251
Трюк № 72. Хранение ранее выбранного значения для его выделения при последующих вызовах элемента управления 251
Трюк Ns 73. Отключение синтаксической проверки для ускоренного ввода кода программы 254
Трюк № 74. Замена агрегатных функций SQL доменными агрегатными функциями 255
Трюк Ns 75. Сокращение программного кода за счет использования подпрограмм 258
Трюк № 76. Сокращение программного кода за счет использования необязательных аргументов260
Трюк Ns 77. Защита программного кода от любопытных пользователей .262
Трюк Ns 78. Создание в приложении служебного входа для разработчика264 Трюк Ns 79. Облененный доступ к конкретной записи 266
Трюк № 80. Предотвращение игнорирования установленных вами
параметров запуска 270
Трюк № 81. Визуализация длительных процессов273
Трюк Ns 82. Предоставление пользователю возможности выбора серверной
базы данных 275
Трюк № 83. Отмена интервала времени ожидания 276
Трюк № 84. Хранение значений свободных элементов управления с целью их повторного использования 217
Трюк № 85.Сортировка записей случайным образом280
Трюк № 86.Пакетное обновление элементов управления формы 2Е1
Трюк № 87.Обеспечение полного управления даннымиXML для любых
версий Access 285
Трюк № 88.Использование собственных перечней288
Трюк № 89.Преобразование текста в нужный регистр289
Трюк № 90.Создание программной библиотеки 281
Трюк № 91.Автоматическое отслеживание обновленийтаблиц базыданных 2(4
Глава 9. Использование сторонних приложений297
Трюк № 92. Документирование базы данных с помощью программы Total Access Analyzer .. 257
Трюк № 93. Создание оболочки приложения при помощи программы EZ Application Generator 3(2
Трюк № 94. Загрузка в базу проверочных данных3(6
Трюк № 95. Использование Access в качестве базы данных XML3(8
Глава 10. Интернет315
Трюк № 96. Экспортирование отчета в формат HTML315
Трюк № 97. Использование браузера в приложении Access 318
Трюк № 98. Извлечение исходного HTML-кода из веб-сайта350
Трюк № 98. Загрузка файлов при помощи элемента управления Обозреватель веб-страниц (Microsoft) 351
Трюк № 100. Использование смарт-тега для открытия веб-страницы 354
Алфавитный указатель 325
Введение
Система управления базами данных Access — продукт поистине удивительный. Обладая широкими возможностями, она не требует особых усилий на разработку и сопровождение приложений. После установки на компьютер система может использоваться абсолютно бесплатно. Она подходит и для индивидуального применения, и для работы компьютерных систем целой компании. Имеющаяся в Access среда ускоренной разработки приложений (rapid application development, RAD) во многом превосходит подобные средства других систем (например, Visual Basic), отличается современностью и простотой использования.
Помимо всего прочего, Access — это полноценная прикладная система баз данных. Она объединяет в себе серверную и интерфейсную составляющие, избавляя разработчиков от необходимости задействовать два программных продукта. Между тем присущая ей гибкость дает возможность использовать файлы базы данных Access и в роли исключительно программного интерфейса, и в качестве сервера базы данных. Система Access позволяет также управлять данными внешних баз, таких как SQL Server и Oracle.
Стоит ли еще о чем-то говорить? Я думаю, чтобы осознать, насколько мощным продуктом является Access, вам не нужны дополнительные доводы, независимо от того, пробовали вы с ней работать или только собираетесь это сделать. Есть и еще одна приятная новость: в данной книге мы собираемся показать несколько дополнительных способов использования Access: в частности, как запускать запросы на объединение, проигрывать в Access видеоклипы, просматривать в ее среде веб-сайты и даже как управлять Access из других программных продуктов, — в данной книге есть трюки на любой вкус.
Книга Access. Трюки позволяет отойти от парадигмы всем известных таблиц, форм и отчетов и по-новому взглянуть на процесс создания более ценных и впечатляющих приложений базы данных. Я с большим удовольствием продемонстрирую вам новые способы работы с вашей излюбленной базой данных. Итак, включайте компьютер, мы приступаем к работе!
Об авторе
Кен Блюттман (Ken Bluttman) занимается разработкой оригинальных решений, связанных с применением Access, в течение многих лет. Свое мастерство программиста он оттачивает с тех времен, когда в наших домах только начали появляться первые персональные компьютеры. С появлением ранних версий Access он сумел по достоинству оценить все удобства этого нового средства управления базами данных. Кен Блюттман также преуспел и в разработке решений для Excell и других продуктов, входящих в Microsoft Office, Ему в равной степени удается разработка технологий, связанных с SQL Server, Интернетом и языками VB и VB.NET.
Остается только гадать, где он находит время на сон. Он является автором книг, посвященных разработкам решений для Microsoft Office, рецептам применения Excel для начинающих, которые выходили в разных издательствах. Его перу пр! - надлежат статьи и публикации об интернет-технологиях. Кроме того, Кен — натура музыкальная, он тонко чувствует природу, любит бродить по лесам с гитарой. Он живет в Нью-Йорке вместе с женой, сыном, собакой и некоторыми представителями отряда земноводных. Если вы желаете познакомиться с ним поближе, посетите его веб-сайт www.bluttman.com.
Сотрудники
Книга во многом появилась благодаря тому, что в ее создании приняли участи с и поделились своими идеями следующие специалисты:
■ Стив Конклин (Steve Conklin) — независимый разработчик программного обеспечения и владелец консультационной фирмы Ultra D.N.T. (разработка, сетевые решения и обучение), расположенной в районе Квинс, в Нью-Йорке. Kpj г его интересов включает разработку приложений на Access, Visual Basic, VB.NET и MS-SQL Server и их применение в мобильных решениях на базе PocketPC Он является автором ряда статей для журнала, посвященного технологиям Access VB и SQL, и преподает Microsoft Windows и Office в Нью-Йоркском общественном колледже. Связаться с ним можно по адресу UltraONT@Hotmail.com.
Стив Хаф (Steve Huff) разрабатывает Access-приложения более девяти ле". Занимаясь на вечерних курсах повышения квалификации разработчика информационных систем в Северном университете штата Кентукки, он получит ученую степень по информатике. В качестве консультанта он более сем 1 лет проработал над созданием решений на базе Microsoft Office для организации SARCOM. Стив и его жена Мелисса живут в штате Кентукки. Связаться с ними вы можете через веб-сайт www.huffs.us.
Кирк Ламб (Kirk Lamb) увлеченно занимается Access в течение многих лет. Являясь специалистом по гребле, он не упускает возможности оценить удачные решения в области управления базами данных. Кирк с женой Дил живет в штате Вашингтон.
Андреа Мосс (Andrea Moss) впервые столкнулась с Access, разрабатывая систему регистрации страховых исков. С того времени она прилагала свой худс- жественный талант к разработке форматов и цветовых схем различных графических пользовател ьских интерфейсов, включая формы Access и веб-сайть . Она внедрила в эту работу и ряд собственных трюков Access.
Майкл Шмальц (Michael Schmalz) работает в банковской системе и является консультантом по организации бизнеса и технологиям в различных промышленных областях. Он занимался в издательстве O’Reilly технической редактурой книг, посвященных Microsoft Office. Майкл имеет ученую степень по финансовым операциям от штата Неннсильвания, где он живет вместе с женой и дочерью.
Симон Сен-Лоран (Simon St. Laurent) живет в Итаке, Нью-Йорк, и являете! разработчиком интернет-проектов, сетевым администратором, автором компьютерных книг и крупным специалистом по XML. Его книги посвящены XML и всему, что связано с этой технологией. Он соредактор веб-сайта XMLhack.com и время от времени сотрудничает с создателями веб-сайта ХМL.corr.
■ Маргарет Левин Янг (Margaret Levine Young) работает на компьютерах с начала 1970-х годов. Она последовательно переходила от Unix на PDP-11 к Apple DOS на Apple И, затем работала в DOS, Windows и Unix на различных машинах. Она пропагандировала внедрение компьютерной техники, объясняя людям, что компьютеры не настолько таинственны и сложны, как это кажется на первый взгляд, при этом она внедряла компьютерные технологии на студии Columbia Pictures, обучала ученых и инженеров применению компьютеров, являлась автором и соавтором компьютерных пособий и книг, включая книги для начинающих. Маргарет обладает ученой степенью Йельского университета и живет с мужем и двумя детьми в штате Вермонт,
Благодарности
Эта книга является коллективным трудом, поэтому я хочу выразить свою благодарность всем, кто поделился со мной замечательными трюками, и вы, надеюсь, разделите со мной радость их изучения.
Особую благодарность я хочу выразить своему редактору, Митчу Таллочу ( Mitch Tulloch), прошедшему со мной через все перипетии рождения книги, за проявленное невероятное терпение и настойчивость. Митч, в свою очередь, благодарит компанию MTS Communications (www.mts.ca) за предоставление услуг Интернета и места для веб-сайта (www.mtit.com).
Спасибо Майклу Шмальну (Michael Schmalz) за техническую экспертизу материала, ускорившую выход книги.
Спасибо Брайану Соеру (Brian Sawyer) и всей замечательной команде издательства O’Reilly. Спасибо всем.
Спасибо моему агенту, Нилу Салки нду (Neil Salkind), и коллективу Studio В. Однажды в прошлом году именно Нил надоумил меня приступить к написанию «Трюков Access». Благодаря ему я познакомился и с Мичем Таллочем (Mitch Тulloch). Спасибо персоналу компаний Database Creations (www.databasecreations.com) и FMS (www.fmsinc.com) за предоставленные копии их замечательной продукции.
И не менее искреннюю благодарность я хочу выразить своей жене Гейле и сыну Мэттью. Во время моей напряженной работы над книгой они старались создать все условия для ее успешного завершения. Забавно было наблюдать, как семилетний малыш постигает компьютерные премудрости. Мэттью частенько восседал у меня на коленях и следил за тем, что я набираю на компьютере, и теперь он по праву может считать себя знатоком Access.
Как пользоваться данной книгой
Эту книгу не обязательно читать в строгой последовательности, но я буду рад, если вы прочтете ее буквально от корки до корки. Книга состоит из ста вполне самостоятельных трюков. Вы можете изучать их в любой последовательности. Некоторые трюки тематически перекликаются с другими, в таких случаях последовательность их рассмотрения отмечена особо. Хотя вы можете просто заглянуть в другой трюк и взять из него только то, что вас интересует. Одни трюки могут пригодиться вам для сегодняшних проектов, другие, возможно, пригодятся позже.
Структура книги
Каждая глава концентрируется на определенном аспекте Access. Это позволяет черпать вдохновение в интересующих вас областях. Если вам нужна помощь i о запросам и SQL, обратитесь к главе 5. Если вас интересуют трюки программирования, изучите главу 8. Ниже приводится содержание каждой из глав.
■ Глава 1. «Использование ядра Access*. В этой главе изложены основы — от структуры объектов базы данных до работы с данными. В представленных здесь трюках рассматриваются способы, призванные помочь обычным пользоват?- лям. добиться преодоления несовместимости версий и даже заставить Access работать с любыми объемами данных.
■ Глава 2. «Таблицы*. Таблицы — ключевой объект любой базы данных. В этой главе вы найдете трюки, позволяющие перемещать данные между таблицами, перезапускать Счетчик для начала отсчета с требуемого числа. Вы также научитесь различать системные таблицы и убирать их подальше, чтобы они г е мешали выполняемым задачам.
■ Глава 3. «Ввод данных и перемещение но элементам управления*. Эта глаг а поможет облегчить жизнь пользователей. Система управления базами данных должна не только хранить информацию, но и улучшать управление данными. В главе 3 много трюков, улучшающих работу с формами, поскольку именно с этими объектами базы данных пользователи работают чаще всего.
■ Глава 4. «Представление данных». Если данные введены и сохранены, остается лишь составить отчет. В этой главе показаны новые способы работы с отчетами. Вы можете изучить работу с водяными знаками, научиться применять сложные виды сортировки и обеспечивать вывод условных итогов. Не забудьте также ознакомиться с трюками, позволяющими просматривать слайды и bi ■ деоклипы!
■ Глава 5. «Запросы и SQL*. Выполнение запросов — значительная часть рабе ■ ты с базами данных. Многие трюки этой главы позволят вам отказаться от банальных решений при работе с Конструктором запросов. В процессе исследс ■ вания запросов на объединение вы сможете окунуться в основы языка SQL научится использовать операторы In и Not и изучить способы применения в запросах собственных функций. Приведен даже трюк, который научит вас создавать запрос с помощью несвязанных таблиц для получения всех комбинаций данных, имеющихся в двух полях.
■ Главаб. «Решение проблем многопользовательской среды*. Некоторые проблемы присущи только многопользовательской среде. В этой главе вы найдете трюки, позволяющие обойти наиболее распространенные проблемы, изучить способы автоматического завершения редактирования и методы безопасного распространения приложений баз данных.
■ Глава 7. «Внешние программы и данные». Система Access легко интегрируется с другими программами и протоколами. В этой главе показано множество способов использования Access с другими продуктами, включая Excel, Word, MySQ - и SQL Server. Если вы слабо представляете себе работу сданными в формате ХМ U вам пригодятся трюки, посвященные этому вопросу. Есть даже трюк, в котором показано создание таблиц Access без запуска самой системы Access.
Глава 8. «Программирование». Представлены приемы программирования. Сюда включены трюки, направленные на оптимизацию кода, его ускоренное создание и защиту. В некоторых трюках представлены краткие решения некоторых проблем: например, как добраться до определенной записи или обеспечить индикацию длительного процесса.
Глава 9. «Использование сторонних приложений». В этой главе содержится обзор нескольких продуктов, предоставляемых сторонними разработчиками и направленных на облегчение работы с базами данных. Вы сможете ознакомиться со средствами, предназначенными для создания оболочек баз данных, документирования созданной базы и даже создания данных для проверки работоспособности приложения. В заключение представлен обзор законченного решения по созданию приложения на основе технологии XML.
Глава 10. «Интернет». Трюки этой главы раскрывают способ создания HTML- файлов из Access. После проведения небольшой корректировки с использованием средств обработки HTML-файлов или текстового редактора вы сможете привести отчет, созданный в Access, к нужному формату, В этой главе вы найдете трюки, позволяющие помешать веб-браузер непосредственно в форму Access. Если вы хотите проверить, как работают ваши деньги, воспользовавшись информацией, имеющейся в Интернете, то это можно сделать, не выходя из базы данных.
Способы оформления, принятые в данной книге
В книге используется следующее оформление:
Курсив — служит для выделения определений, небольших фрагментов текста и слов с определенной «интонацией», а также для названий печатных изданий и ссылок на другие разделы.
Шрифт без засечек - применяется для оформления заголовков диалоговых окон, названий пунктов и команд меню, названий кнопок, флажков, переключателей и т. п., имен файлов и папок, клавиш клавиатуры, адресов электронной почты и Интернета, имен объектов базы данных.
Моноширинный шрифт — предназначен для оформления примеров программного кода, инструкций запросов, содержимого файлов, команд, операторов, переменных и текстов, вводимых с клавиатуры.
Меню и навигация. В этой книге для обозначения переходов в системах меню используются символы стрелок. Например, «Файл ► Печать» выглядит более лаконично, чем пространное описание вида: «Щелкните па надписи Файл Панели управления в верхней части экрана и выберите пункт Печать в раскрывающемся меню». Тем не менее если инструкцией предписывается щелкнуть на вкладке, выбрать пункт или щелкнуть на кнопке диалогового окна, то все это будет описано в явном виде.
и для экспертови для экспертовРядом с заголовком каждого трюка помещен ы значки гаечных ключей, обозначающие его сложность: для начинающих П, для опытных
и для экспертов
и для экспертов
Использование примеров кода
Эта книга призвана оказать вам практическую помощь. Вы можете использовать представленные здесь примеры программного кода в собственных разрабо " ■ ках и документации. Пока объем ваших заимствований незначителен, запрашивать разрешение на использование программного кода не требуется. Например, можно вполне свободно применять фрагменты кода из этой книги в собственной программе, А вот продавать или распространять компакт-диски с примерами i а книги можно только после получения разрешения издательства. Не нужно получать разрешение и в том случае, если в наших ответах на вопросы приводятся ссы; ки на книгу и цитируются примеры кода. Но на включение большого объема npi - меров кода, взятых из этой книги, в документацию вашего программного продукта разрешение все же потребуется.
Если вы посчитаете, что заимствуете чрезмерно большой объем примеров пре - граммногО кода, не стесняйтесь обратиться в издательство.
От издательства
Ваши замечания, предложения и вопросы отправляйте по адресу электронной пс - чты comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
Подробную информацию о наших книгах вы найдете на веб-сайте издательстве: http://www.piter.com.
ГЛАВА 1
Использование ядра Access
Трюки № 1-12
С системой управления базами данных Access работают люди многих специальностей, решая с ее помощью самые разнообразные задачи множеством различных способов. Среди них есть и новички, и те, кто пользуется каким-нибудь приложением Access уже не один год. По мере освоения Access возникает Желание усовершенствовать приложение, дополнив его какими-то необычными решениями, которые представляют интерес и для разработчиков приложений.
При этом все без исключения — и пользователи, и разработчики — стремятся максимально адаптировать приложения Access к своим нуждам. Добиться этой цели можно с помощью настроек Access или существующих в этой системе готовых решений, способствующих осуществлению общего замысла.
В этой главе содержится подборка трюков, осуществляемых исключительно средствами Access. Одни трюки помогут обогатить опыт обычных пользователей, другие позволят более опытным пользователям расширить границы применения имеющихся у них приложений Access. Часть трюков предназначается исключительно для разработчиков приложений. Чтобы разобраться в некоторых из них, достаточно элементарных познаний в языке VBA.
ТРЮК № 1ТРЮК № 1Облегчение поиска нужных объектов
ТРЮК № 1
ТРЮК № 1
Размещение ярлыков нужных объектов в группе Избранное, избавляющее пользователей от необходимости перебирать всю коллекцию объектов базы данных.
Не каждый способен без особого труда разобраться в содержимом окна базы данных Access. Поиск нужных объектов среди всех этих таблиц, запросов, форм и отчетов —■ задача порой не из легких. Иногда для завершения работы нужно иметь под рукой всего лишь небольшую подборку объектов, а их приходится выискивать в общей массе.
Решение этой проблемы не составляет труда. Окно базы данных Access позволяет создавать подборки из ярлыков нужных объектов. Причем ярлыки объектов базы данных Access по сути ничем не отличаются от ярлыков файлов, папок и приложений, размещаемых на Рабочем столе.
Стандартное окно базы данных
Используемое вамп приложение Access во время запуска, скорее всего, откроет навигационную (или основную) форму, из которой появится доступ ко всем его компонентам. Но не все приложения построены именно таким образом. На рис. 1.1 показано обычное довольно непривлекательное окно базы данных. Существуют такие приложения, которые при запуске открывают именно это, не вполне удоб ное, чисто служебное окно.
, Й^й ^ {М^Я^г : ti« ^«х .^r t™ xwn '■ *.. Г^
файл Омска .. -^д Ро^-й с®»ис 2^ 2»»е«аtte&Jti*?fc вопрос’ _ * к
Рис. 1.1. Стандартное окно базы данных Access
Конечно, и в этом окне вы можете получить доступ к любому нужному объекту: после щелчка на вкладке Запросы можно найти запрос, который нужно выполнить, а требуемый отчет найдется во вкладке Отчеты. Но не обязательно выискивать их именно там. Окно базы данных обладает одним весьма ценным свойством; оно предоставляет вам возможность создавать собственные группы объектов. Вполне очевидно, что в окне базы данных объекты отделены от групп. На рис. 1.1 в нижней половине левой части окна базы данных вы увидите хорошо различимый раздел групп.
Использование групп
Изначально имеется лишь одна группа Избранное, в которую вы можете поместить ярлыки любых объектов. Сделать это весьма просто. Надо лишь найти объект в какой-либо вкладке, подвести к нему указатель мыши и, удерживая нажатой левую клавишу, перетащить его в группу Избранное. На рис. 1.2 показано, что из этого может получиться. Группа Избранное заполнена ярлыками, указывающими на некоторые объекты базы данных. Заметьте, что это всего лишь ярлыки. Сами объекты остались на прежних местах, соблюдая свою принадлежность к категориям. Вы можете удалить ярлык, размещенный в группе Избранное, носам объект при этом сохранится.
Рис. 1.2. Размещение ярлыков в группе Избранное
Очевидно, что использование группы Избранное даст возможность собрать воедино все самое нужное. Но создание новых групп позволит усовершенствовать организацию объектов. Что, если создать отдельную группу для каждого пользователя или категории пользователей? Например, операторы ввода данных и диспетчеры
Рис. 1.3. Создание и использование своих собственных групп
могли бы пользоваться одним и тем же приложением базы данных, но использо вать различные объекты: при этом операторы работали бы с определенными фор нами, а диспетчеры и управляющие — с запросами и отчетами, отражающими полную картину событий.
Добавить новую группу довольно просто. Щелкните правой клавишей мыши нг области Группы, выберите в контекстном меню пункт Новая группа и наберите название группы. Теперь вы сможете перетащить в новую группу объекты. На рис. 1.3 показаны две новые группы, добавленные к приложению. Каждая из них содержит свой набор ярлыков.
Другое ценное качество групп заключается в том, что ссылки на одни и те же объекты могут присутствовать сразу в нескольких из них. Если нужно поместить ярлык, указывающий на один и тот же отчет, в три разные группы, Access не стане! этому препятствовать. На самом деле вы можете даже копировать ярлыки из одной группы в другую.
ТРЮК№2ТРЮК№2Индивидуальная настройка приложений Access
ТРЮК
№2
ТРЮК
№2
Придание приложению персонифицированных свойств методом применения системы индивидуальных настроек, повышающих эффективность работы конкретного пользователя.
Совсем незачем заставлять всех пользователей придерживаться единого метода работы с приложением. Способ обойти подобное ограничение не столь очевиден, поскольку Access в окне Параметры запуска дает возможность указать только одну форму, открываемую в начале работы приложения, и тут вы ничего не сможете изменить, пока не воспользуетесь обработкой событий, происходящих при открытии базы данных. Только тогда у вас появится возможность выбирать открываемую в начале работы форму, переопределять ее свойства и т. д. Вы сможете сделать все составляющие приложения уникальнымидля отдельных пользователей или их категорий. Приспособить таким образом можно следующие элементы:
Формы. Можно определить, какая из форм будет открыта, каким способом она будет отображена и какие функциональные возможности будут в ней задействованы.
Источники данных. Можно определить, какие таблицы персонификации, внутренние или внешние, понадобятся для решения задач каждого пользователя.
Отчеты. Можно определить отображаемые или игнорируемые элементы.
В этом трюке используется макрос AutoExec, запускаемый в начале работы приложения и обеспечивающий индивидуальную настройку пользовательского интерфейса. Чтобы заставить его работать в этом качестве, вам необходимо сначала создать таблицу базы данных для хранения личных параметров пользователя, азатем, в начале работы базы данных, у вас должна быть возможность идентифицировать для нее пользователя. Это можно сделать несколькими способами: например, во всплывающем окне ввода информации можно запросить имя или инициалы (а заодно, возможно, и пароль); также для идентификации пользователя можно применить переключатель командной строки, или, если применяются средства защи-
ты Access, идентификатор пользователя может быть получен из свойства текущего пользователя — CurrentUser.
Хранение личных параметров
Личные параметры пользователя хранятся в таблице, которая содержит поле для каждого из них. Например, поле с типом данных Длинное целое может хранить желаемый цвет фона, а поле с типом данных Текст может содержать имя формы, которую пользователь хочет открыть, и т. д. На рис. 1.4 показана такая заполненная таблица с соответствующим названием Личные параметры. Имена полей отражают предназначения личных параметров, а в самих полях содержатся соответствующие установки.
Рис. 1.4. Таблица, содержащая личные параметры отдельного пользователяРис. 1.4. Таблица, содержащая личные параметры отдельного пользователя
Рис. 1.4. Таблица, содержащая личные параметры отдельного пользователя
Рис. 1.4. Таблица, содержащая личные параметры отдельного пользователя
issjissj045414304541430454143:12E3225S:8454143'0454143:12E3225S:8454143'ЕвгенияЕвгенияМелкий Мелкий Крупный ^Мелкий МелкийМелкий Мелкий Крупный ^Мелкий МелкийРаспорядок ОбьектыРаспорядок Обьекты|БорисСюзаннаAdmin|БорисСюзаннаAdminГлавная формаПлатежи_ПлатежиГлавная формаПлатежи_ПлатежиРис. 1.5. Таблица, содержащая личные параметры нескольких пользователейРис. 1.5. Таблица, содержащая личные параметры нескольких пользователейПРИМЕЧАНИЕПРИМЕЧАНИЕ
issj
issj
0454143
0454143
0454143:
12E3225S:
8454143'
0454143:
12E3225S:
8454143'
Евгения
Евгения
Мелкий Мелкий Крупный ^Мелкий Мелкий
Мелкий Мелкий Крупный ^Мелкий Мелкий
Распорядок Обьекты
Распорядок Обьекты
|Борис
Сюзанна
Admin
|Борис
Сюзанна
Admin
Главная форма
Платежи_
Платежи
Главная форма
Платежи_
Платежи
Рис. 1.5. Таблица, содержащая личные параметры нескольких пользователей
Рис. 1.5. Таблица, содержащая личные параметры нескольких пользователей
ПРИМЕЧАНИЕ
ПРИМЕЧАНИЕ
Такая таблица вполне подойдет для баз данных, установленных на отдельных компьютерах, где конкретный экземпляр используется одним клиентом. Поэтому таблица рассчитана на хранение личных параметров единственного пользователя. Особенностью таблицы является наличие уникальной записи, в которой содержатся поля для каждого личного параметра.
При совместном использовании базы данных (когда все пользователи работают с ее сетевой копией) в таблицу необходимо добавить поле, идентифицирующее каждого пользователя. Количество записей в конечном счете будет соответствовать количеству пользователей плюс один — по одной записи на пользователя и еще одна запись, предназначенная по умолчанию для пользователя с идентификатором Admin. Подобная структура изображена на рис. 1.5.
Предусмотреть запись для пользователя Admin - весьма здравая мысль. Эта учетная запись используется Access по умолчанию даже в том случае;, когда система защиты не задействована. Если вход в систему защита не использовался, то свойство CurrentUser по умолчанию устанавливается в Admin.
Все, что надо для завершения этого трюка, — это предоставить пользователям спо ■ соб выбора личных параметров. Вряд ли кому-то захочется вводить абракадабру числового представления цвета. Значит, для ввода личных параметров нужно вое ■ пользоваться формой (ну а чем же еще!). Это будет специальная форма для установки личных параметров, не имеющая в базе данных никаких других функций. Внешний вид такой формы показан на рис. 1.6.
Рис. 1.6. Форма выбора личных параметров пользователей
После выбора личных параметров их можно будет занести в таблицу, щелкнув ш кнопке Сохранить параметры. Для таблицы, рассчитанной на одного пользователя этот трюк можно реализовать следующей простой командой SQL:
Update Личные_параметры Set ЦветФонаФормы=8454143, РазмерШрифта='Мелкий', ОткрываемаяФорма='Платежи’, ПодробностиОтчета=’Нет'
Для многопользовательской конфигурации в команду SQL добавлено еще оды поле:
Update Пичные_параметры Set ЦветФонэФормы-8454143. РазмерШрифта='Мелкий'. ОткрываемаяФррма=’Главная форма'. ПодробностиОтчета='Да' Where ИмяПользователя='Сюзанна'
Эти команды SQL составлены с использованием значений элементов управления формы. Для обновления значений таблицы использована технология доступ; к данным ActiveX Data Objects (ADO). После составления команды SQL обновление будет проведено методом Execute объекта Connection:
Private Sub cmdSavet, )
On Error GoTo err^end
Dim conn As ADODB.Connection
Set conn = CurrentProject.Connect!on
Dim ssql As String
ssqt = "Update Личные_параметры Set " & _
" ЦветФонаФормы-" & _
Me.groupFormColor & ", " & _
"РазмерШрифта='" & _
Choose(Me.groupFontSize, "Мелкий", "Крупный"} & "', "&_ "ОткрываемаяФорма=*" & Me.lstForms & '", " & _ "ПодробностиОтчета='" & _
Choose(Me.groupReportDetai1, "Да", "Нет") & "'"
conn.Execute s S q 1
conn.Close
Set conn = Nothing
MsgBox “Личные параметры обновлены!"
Exit Sub
err_end:
conn.Close
Set conn = Nothing
MsgBox Err .Description
End Sub
Реализация личных параметров
От проблемы сохранности личных параметров теперь нужно перейти к проблеме их реализации, поэтому давайте несколько расширим приложение. Один из личных параметров касается выбора формы, появляющейся при запуске приложения. Здесь применяется макрос AutoExec, запускающий функцию, в которой используются значения ранее сохраненных личных параметров. Как и раньше, если дело касается однопользовательской установки, используется упрощенный тип таблицы, а в многопользовательской конфигурации свою роль сыграет имя пользователя.
Далее представлены две функции, которые будут вызываться из макроса AutoExec. Параметром макрокоманды ЗапускПрограммы макроса AutoExec выступает имя функции. В обоих случаях функция DLookup извлекает значение имени открываемой формы, избранной пользователем, после чего открывается сама эта форма. Разница заключается в фильтре функции DLookup, настроенном на имя пользователя В первой функции, в отличие от второй, этот фильтр отсутствует: Function open_up_single( )
On Error GoTo err_end
Dim myform As String
myform = DLookup("ОткрываемаяФорма", "Личные_параметры")
If Not IsNull(myform) Then
DoCmd.OpenForm myform
Else
DoCmd.OpenForm "Объекты"
End If
Exit Function
err_end:
MsgBox Err.Description
End Function
Function open_up_multi_user( )
On Error GoTo err_end
Dim myform As String
Dim username As String
myform = _
DLookup("ОткрываемаяФорма", "Пичные_параметры", "ИмяПользователя='" &_ Currentuser & "’")
If Not IsNull(myform) Then
DoCmd.OpenForm myform
Else
DoCmd.OpenForm "Объекты"
End If
Exit Function
err_end;
MsgBox Err.Description
End Function
Заметьте, что блок If... Else в случае возвращения нулевого значения обеспе чит открытие формы Объекты, которая выступает в роли формы, открываемой п< ■ умолчанию.
Вам нужно обеспечить реализацию и других личных параметров, таких как вы бор степени детализации отчета или использование различных размеров шрифта, там, где это уместно. Например, вот так вы сможете изменить цвет фона формы воспользовавшись событием формы Открытие:
Private Sub FormOpen(Cancel As Integer)
Me.Detail,BackColor = DLookup("ЦветФонаФормы", "Личные_параметры")
End Sub
Использование трюка
Все, что теперь остается сделать, — это решить, как открывать форму, предназна ченную для задания личных параметров. Ее можно открыть через панель инстру ментов, из меню или с использованием макроса. Неплохим решением станет размещение ярлыка, указывающего на эту форму, в специально созданной группе часто используемых объектов. Как создать собственную группу объектов, вь можете узнать, вернувшись к трюку «Облегчение поиска нужных объектов» (Трюк № 1).
ТРЮК№3ТРЮК№3Быстрая работа без опечаток
ТРЮК
№3
ТРЮК
№3
Экономия времени и избавление от ошибок путем использования простых сочетаний клавиш для ввода даты, времени и других часто используемых данных.
Мышь — вещь хорошая, но ничто так не ускоряет работу с приложением, как клавиши быстрого вызова. Широкоизвестны сочетания Ctrl+C для копирования, CtrL+V для вставки и т. д. Л что известно о сочетаниях для ввода даты, времени и других; данных? Использование подобных сочетаний приведет к существенной экономии времени, особенно в спешке завершающей стадии проекта. Да и когда мы, соб ственно, не испытывали дефицита времени?
Сочетания клавиш быстрого вызова
В табл. 1.1 собраны сочетания клавиш, используемые в приложениях Access. Это далеко не исчерпывающий список. Все полезные сочетания можно найти в сира войной системе Access. Представленные в таблице сочетания касаются только вво да данных.
Таблица 1.1. Сочетания клавиш быстрого вызова для ввода данных
Действие
Комбинация клавиш
Вставка текущего времени
Ctrl+:
Вставка текущей даты
Ctrl+SHIFT+;
Вставка значения из того же поля предыдущей записи
Ctrl+’
Вставка в поле значения по умолчанию
Ctrl+Alt+пробел
Вставка новой строки в текст или в поле memo
Ctrl+Enter
Вставка новой записи
С1г1+«плюс»
Вставка содержимого буфера обмена Windows
Ctrl+V
Эти сочетания действительно имеют практическую ценность. Вы когда-нибудь забывали, какое сегодня число, когда нужно было ввести его в поле? Ну а теперь все, что требуется запомнить, это сочетание клавиш для вставки текущей даты. После чего можно переходить к следующему шагу.
Использование макроса AutoKeys
Макрос AutoKeys позволяет назначить собственные сочетания клавши для вызова действий, совершаемых в приложении базы данных. Вы можете назначить действия, совершаемые при нажатии функциональных клавиш, сочетаний клавиш, таких как Ctrl+A, а также при нажатии клавиш Insert и Delete. При этом нужно строго придерживаться синтаксиса, в котором знак возведения в степень (Л) представляет клавишу Ctrl, а знак плюс (+) представляет клавишу Shift. Обычные клавиши вводятся как есть, а функциональные и специальные клавиши (Insert и Delete) заключаются в фигурные скобки ({}). Вот несколько примеров:
ЛА — назначает действие сочетанию Ctrl+A.
(F9) — назначает действие функциональной клавише F9.
+ {F 9} — назначает действие сочетанию Shift+F9.
(INSERT) — назначает действие клавише Insert.
При назначении собственных сочетании клавиш взамен сочетаний, существовавших по умолчанию, последние будут утрачены. Вы даже можете переназначить действия, вызываемые общепринятыми сочетаниями клавиш, такими как Ctrl+V (вставка).
Синтаксические выражения помещаются в столбец Имя макроса, а соответствующие сочетанию клавиш действия — в столбец Макрокоманда. Остается только выполнить еще одно требование — присвоить макросу имя AutoKeys,
Напоминание об установленных сочетаниях клавиш
Чтобы запомнить набор сочетания клавиш, требуется время, поэтому следующим разумным шагом станет создание сводного списка сочетаний в виде памятки. Надо сделать так, чтобы список сочетаний клавиш был доступен в виде формы, которую можно будет вызвать в любой момент при помощи — как вы, наверное, уже догадались — специально для этого предназначенной клавиши быстрого вызова. Разумеется, такую форму нужно создать.
На рис. 1.7 показана форма, в которой содержится памятка о сочетаниях клавши Источником записей этой формы служит таблица, в которой в двух полях содержатся описания сочетаний клавиш и вызываемых ими действий. Еще одним решением может стать использование элементов управления формы типа Надпись содержащих сведения о сочетаниях клавиш и действиях, совершаемых с их помощью.
Сочетания кл авишГ
Описание Сочетание
Вставка текущего времени Ctrl-:
Вставка текущей даты Ctrl-SHIFT- ;
Вставка значения из того же поля предыдущей Ctrl-' записи
Вставка в поле значения по умолчанию Ctrl-Alt-spacebar
Вставка новой строки в текст или в поле memo Ctrl-Enter
Вставка новой записи Ctrl-+
Вставка содержимого буфера обмена Windows Ctrl-V
Рис. 1.7. Форма быстрой ссылки для сочетаний клавиш
Поскольку проще всего запомнить какую-нибудь функциональную клавишу, то для вызова этой формы вполне подойдет клавиша F9, которая обычно остается невостребованной. Не стоит выбирать уже задействованные клавиши, например клавишу F1, которая обычно используется для вызова справочной системы. Для установки собственных сочетаний клавиш служит специальный макрос AutoKey;, который запускается в начале работы приложения, подобно макросу AutoExec.
Рис. 1.8. Использование макроса AutoKeys для назначения собственных сочетаний клавиш быстрого вызова
На рис. 1.8 показан процесс создания макроса AutoKeys, в котором задается несколько собственных сочетаний клавиш. Юта ниша F9 предназначена для открытия формы frmKeyboardshortcuts, показанной на рис. 1.7.
ТРЮК№4ТРЮК№4Оптимизация процесса изменения данных
ТРЮК
№4
ТРЮК
№4
Избавление от ручной коррекции данных во всех связанных таблицах путем установки каскадного обновления и удаления.
Предположим, изменяется какая-то учетная единица. Почему бы не предусмотреть такую возможность в вашем приложении? Возьмем реальный пример: клиент поменял свое имя. Если вы достаточно давно занимаетесь бизнесом, то такой случай должен быть предусмотрен при работе с вашей базой данных Изменения данных должно осуществляться одним из двух способов. Если данные не используются в качестве первичного ключа таблицы или внешнего ключа, вам нужно внести изменения в данные везде, где они встречаются в ваших таблицах. Хорошо, если эти данные встречаются только в одном месте. Если схема базы данных составлена правильно, то определенные данные, такие как имя клиента, она содержит только в одном месте. Если такие данные содержатся в нескольких местах, то, вероятно, у вас была для этого веская причина. Приложения со временем разрастаются, а в их разработке в разное время принимают участие разные специалисты. Такое случается довольно часто.
Рис. 1.9, Связанные таблицыРис. 1.9, Связанные таблицы
Рис. 1.9, Связанные таблицы
Рис. 1.9, Связанные таблицы
Если в вашем приложении базы данных одни и те же данные можно найти повсюду, схему данных требуется привести в порядок. Что, если поместить данные в ключевое поле таблицы? Но такое решение будет мешать повсеместному внесению изменений в том случае, если множество дочерних таблиц используют те же данные в качестве внешнего ключа. И так будет до тех нор, пока вы не предусмотрите в схеме связи таблиц каскадное обновление.
При создании связей между таблицами вы можете, в частности, выбрать установку каскадного обновления. На рис. 1.9 показаны две таблицы данных. Таблица tblCustomers, размещенная вверху, содержит сведения о клиентах. Значения ключевого поля, CustomerlD, представляют собой инициалы имен компаний. В нижней таблице, tbllnvoices, поле CustomerlD служит внешним ключом.
На рис. 1.10 показаны связи между таблицами. Линия соединяет поле CustomerlE таблицы tblCustomers и поле CustomerlD таблицы tbllnvoices. Цифра 1, стоящая над той частью линии, которая примыкает к таблице tblCustomers, свидетельствует о том, что эта таблица является родительской. Символ бесконечности (=°), кото рый находится над той частью линии, которая примыкает к таблице tbllnvoices, свидетельствует о том, что эта таблица является дочерней. Такое отношение меж ■ ду таблицами называется один-ко-многим. Таблица tbllnvoices имеет к тому же и другие связи.
Рис. 1.10. Окно схемы данных
Диалоговое окно Изменение связей, показанное на рис. 1.11, позволяет устанавливать связи между таблицами. Чтобы открыть это окно, следует дважды щелкнуть на линии, соединяющей две таблицы. Обратите внимание на флажок Каскадное обновление связанных полей. Когда он установлен, то изменения, вносимые в значение ключевого поля родительской таблицы, влекут за собой автоматические и з* менения связанных полей в дочерней таблице. Просто замечательно! Когда у клиента меняется имя, все, что вам следует сделать, — это изменить имя в ключе. Все связанные значения, имеющиеся в дочерней таблице, будут скорректированы автоматически,
В примере, показанном на рис. 1.9, если компания «Best Equipments изменит свое название на «Best Tools», значение поля CustomerlD должно быть изменено на В Г.
Рис. 1.11. Выбор каскадного обновления связанных полей и удаления связанных записейРис. 1.11. Выбор каскадного обновления связанных полей и удаления связанных записей
Рис. 1.11. Выбор каскадного обновления связанных полей и удаления связанных записей
Рис. 1.11. Выбор каскадного обновления связанных полей и удаления связанных записей
Единственное изменение, внесенное в таблицу tblCustomers, приведет к автоматическому обновлению всех связанных записей в таблице tbllnvoices.
ПРИМЕЧАНИЕ
В диалоговом окне Изменение связей (рис. 1.11) можно также установить каскадное удаление связанных записей, при котором удаление записи в родительской таблице приведет к удалению всех связанных записей в дочерней таблице. Когда этот флажок не установлен, вам придется сначала удалить все записи в дочерней таблице, и только после этого вы сможете удалить записи в родительской таблице.
Если не установлен флажок каскадного обновления связанных полей, вам придется изменять каждую запись таблицы по отдельности. Сделать вы это сможете только после предварительного удаления связи, поскольку Access не позволяет изменять значения ключевого поля в обеих таблицах, если имеются какие-нибудь связанные записи. Попытка внесения изменений подобным образом приводит к полной неразберихе.
ТРЮК№5ТРЮК№5Перенос данных между версиями Access
ТРЮК
№5
ТРЮК
№5
Прощание с проблемой несовместимости версий.
За многие годы корпорация Microsoft выпустила более шести версий Access. Некоторые люди и организации приобретают каждое обновление, некоторые делают это время от времени, но есть и такие, кто упорно держится за ставшую им дорогой и близкой версию, приобретенную еще в прошлом веке! При работе в полной изоляции и вам, и вашей организации все равно, с какой именно версией вы работаете, но когда вы начинаете обмениваться информацией со сторонними организациями, несовместимость версий может обернуться для вас большой неприятностью.
Скажем, у вас установлена версия Access 2003 и вы отсылаете поставщику базу данных, заполненную заказами. А у поставщика установлена версия Access 95. И как бы вы ни сокрушались, но поставщик не сможет открыть вашу базу данных. В настоящее время в компьютерном мире появились протоколы обмена данными, не зависящие от применяемых платформ. Одним из них является протокол XML,
всерьез претендующий на средство устранения проблемы несовместимости данных. При всех его преимуществах он доступен только в самых последних версиях Access.
Есть другой, хорошо зарекомендовавший себя на практике, простой и не требую щий применения высоких технологий способ обмена данными: экспортирован и хранить данные в текстовом виде. Несмотря на то что существуют различия в - подходах к хранению текста, имеющего разделители, выбору символа-разделп теля, спецификации текста, фиксации ширины и т, д., — все версии Access способ ны читать и записывать текстовые файлы. На рис. 1.12 показан мастер Экспор' текста, позволяющий установить параметры экспортируемого текста. Если вы бу дете экспортировать таблицу или запрос и при этом укажете текстовый файл в качестве типа файла, этот мастер будет запущен автоматически.
Рис. 1.12. Пример использования мастера Экспорт текста
Вообще-то экспорт и импорт данных в текстовом формате далеко не идеальный выход из положения, особенно если ведется интенсивный обмен таблицами данных. Но куда хуже будет ситуация, в которой выгода будет потеряна вами именно из-за того, что клиент не смог открыть вашу базу данных.
Появлением формата XML была подготовлена почва для облегчения обмена данными между различными версиями и системами. Этот формат довольно неплох а поддерживается в Access 2003, в меньшей степени эта поддержка реализована в Access 2002 и Access 2000. Если работа с текстовыми файлами больше не отвечает вашим запросам, вы всегда сможете применить XML, воспользовавшись отдельным внешним XML-парсером (программой, предназначенной для анализа содержимого текстового документа, соответствующего спецификаци л XML).
См. также «Обеспечение полного управления данными XML для любых версий Access» (Трюк № 87) и «Использование Access в качестве базы данныхXML» (Трюк № 951.
Трюк № 6. Наведение порядка в макросах и придание им большей значимости 31
ТРЮК№6ТРЮК№6Наведение порядка в макросах и придание им большей значимости
ТРЮК
№6
ТРЮК
№6
Оптимизация макросов путем сокращения их числа, использования дополнительных имен и столбцов условий.
Считается, что управлять сложными процессами способна лишь программа, составленная на VBA, а макросы в основном являются средством решения весьма простых задач. Пора избавляться от этого мления. На самом деле макросы вполне способны справляться с весьма объемными задачами, имеющими развитую логическую структуру, поскольку у них имеется столбец условий, то есть механизм проверки, аналогичный структуре If.. .Then, имеющейся в VBA. В этом трюке показан способ превращения единственного макроса в многоцелевой базовый компонент приложения.
Условные макрокоманды
У макроса имеется единственный обязательный столбец: Макрокоманда. При этом макрос может состоять из одной и более команд. Но у него есть также и дополнительный столбец Условие, использование которого способно в значительной мере увеличить эффективность всего процесса выполнения макроса. Для отображения этого столбца в окне конструктора нужно воспользоваться меню Вид.
Проверяться на соблюдение условия может значение поля, результат, возвращаемый функцией, и даже значение, возвращаемое диалоговым окном. В условных выражениях могут применяться и логические операторы, включая И-ИЛИ.
На рис. 1.13 показан макрос, при выполнении которого происходит ряд различных действий, часть из которых возможны только при соблюдении сопоставлен-
Рис, 1ЛЗ. Пример использования условий в макрокомандеРис, 1ЛЗ. Пример использования условий в макрокоманде
Рис, 1ЛЗ. Пример использования условий в макрокоманде
Рис, 1ЛЗ. Пример использования условий в макрокоманде
ных с ними условий. Например, функция и отчет с одинаковыми пометками в примечании Конец месяца включаются в процесс выполнения только в первый день месяца (возможно, для подведения итогов прошедшего месяца). Для определения факта наступления первого дня месяца использованы функции Day и Now.
Отчет с пометкой в примечании Премии служащим будет запушен только в том случае, если будут соблюдены условия, проверяемые с помощью функции Dlookup. Макрокоманды, не имеющие сопоставленных им условий, выполняются всегд;. Даже если дойдет черед до такой макрокоманды, чье условие нс будет выполненс, макрос не станет на ней останавливаться, и процесс выполнения продолжится.
Создание группы макросов
Макросы могут быть объединены в группы, известные как группы макросов. Путем создания таких групп вы сможете сократить общее число макросов и собрать в одном месте однотипные макрокоманды. Коренное отличие обыкновенного макроса от группы макросов состоит в использовании дополнительного столбца Имя макроса.
Для его появления в окне конструктора макросов вам следует воспользоваться меню Вид. На рис. 1.14 показана группа макросов под названием ГенерацияОтчета Эта группа предназначена для выполнения задач по запуску нескольких отдельных отчетов. Важно отметить, что эти отчеты не будут запускаться одновременно. За каждым именем макроса скрывается отдельный макрос в составе большой группы.
Рис. 1.14. Использование столбца Имя макроса
Когда нужно будет выполнить конкретный макрос, следует указать имя группы, символ точки в качестве спецификатора и имя из столбца Имя макроса:
DoCmd.RunMacro "ГенерацияОтчета.Состояние_запасов"
Выполнение макроса начнется со строки с его именем. Команды будут выполняться до тех пор, пока не встретится следующее имя макроса. Еще одно преимущество группы макросов состоит в том, что значение в столбце Имя макроса ге
обязательно должно присутствовать во всех строках. В единую конструкцию помещается любое количество небольших наборов макрокоманд. Преимущество такой реализации макросов состоит в удобстве управления и упорядоченности.
ТРЮК№7ТРЮК№7Очистка базы данных от ненужного хлама
ТРЮК
№7
ТРЮК
№7
Применение журнала использования объектов с целью очистки непомерно разросшейся базы данных путем анализа действий пользователя и удаления невостребованных объектов.
Некоторые приложения базы данных порой становятся монстрами. Если вам приходилось когда-нибудь просматривать базу данных, содержащую несметное количество форм и отчетов, то вы поймете, что я имею в виду. Зачастую базы разрастаются в силу утраченной единой политики пользования: формы, созданные для каждого случая и по любому поводу, отчеты на каждый день недели и множество подобных вещей.
Ко всему прочему вы еще и не в состоянии сразу определить, какие из этих объектов по-настоящему кем-то используются. Но способ навести порядок в приложении и избавиться от ненужного хлама все же есть.
Суть задачи сводится к выявлению невостребованных объектов. Пользователи нередко создают формы и отчеты, о которых после однократного применения больше и не вспоминают. Обнаружив подобные объекты, вы сможете удалить их из базы данных. Возможно, от этого приложение станет работать быстрее, а после того, как вы проведете сжатие базы данных, снизится загруженность оперативной памяти. Для выполнения этого замысла потребуется создать список используемых объектов, азатем удалить объекты, не вошедшие в этот список.
Отслеживание востребованности объектов
У каждой формы или отчета есть событие под названием Открытие. Поместив в строку обработки этого события вызов несложной функции, вы сможете вести журнал, содержащий имена открываемых объектов. Вначале нужно создать для этого журнала таблицу, в которую будут заноситься имена объектов. Сложности здесь ни к чему, но хотя бы одно поле для размещения имен все же понадобится. К нему можно добавить поле с отметкой времени открытия, поле с типом объекта и т, д.
На рис. 1.15 показана структура такой таблицы. Одно ее поле предназначено для имени объекта, а другое — для его типа. Как только будет открыт какой-нибудь новый объект, в таблицу будет добавлена запись.
Для того чтобы запись добавлялась в таблицу, объект должен содержать небольшую процедуру обработки события Открытие. Следующий фрагмента кода можно применить для обработки события открытия формы Клиенты:
Private Sub Form_Open(Cancel As Integer)
Dim conn As ADODB.Connect)on
Set conn = CurrentProject.Connect)on
Dim ssqt As String
ssql = "Insert Into 1ЫЖурнал_объектов Values ('Клиенты'. 'Форма')"
Рис. t.15. Таблица для протоколирования открытий объектов
conn.Execute ssql
conn.Close
Set conn = Nothing
End Sub
В момент открытия формы в журнал будет добавлена запись, содержащая ими формы и тип объекта. Подобный код нужно поместить в обработчики событи i открытия всех форм и отчетов. Через некоторое время использования базы да) - вых посмотрите, как проходит заполнение журнала. По прошествии определенного времени — скажем, педели пли месяца, в зависимости оттого, какой срок ва и покажется достаточным, — изучите журнальную таблицу. Перед вами откроется множество записей. Если вы нс создавали поле регистрации времени, то вы стог - кнетесь с множеством одинаковых записей. Для просмотра результата, исключающего дубликаты, вам следует воспользоваться запросом, в котором используется групповая операция Group By.
Выявление невостребованных объектов
На рис, 1.16 показан выполненный запрос на основе данных таблицы Журнал, объектов. В данный список попали только те объекты, которые открывались пользователями, Вам нужно сравнить этот список с полным перечнем форм и отчегоз, имеющимся в базе данных, после чего можете безо всякой опаски удалить не попавшие в этот список объекты, при условии, если вы уверены в том, что но продолжительности исследованный вами период времени был вполне достаточен для этого. Да, и не забудьте после удаления сжать базу данных!
Трюк в трюке
Частью данного трюка является добавление кода обработки событий открыт) я всех форм и отчетов. Добавлять код вручную — весьма нудное занятие. Однако эту работу можно автоматизировать. Следующий пример кода предназначен дг я
Трюк № 7. Очистка базы данных от ненужного хлама
ИмяОбьектвИмяОбьектвКлиенты п о ре гио нам Форы аКлиенты п о ре гио нам Форы аГлавная формаГлавная формаФормаФормаПродажи по регионам ОтчетПродажи по регионам ОтчетОтгрузиОтгрузиСтимуляция торговли Форма Клиенты по продажам Отчет Уволенные служащие ОтчетСтимуляция торговли Форма Клиенты по продажам Отчет Уволенные служащие ОтчетАдминистрация КлиентыАдминистрация КлиентыФормаФормаФормаФормаРис. 1.16. Перечень востребованных объектов базы данныхРис. 1.16. Перечень востребованных объектов базы данных
ИмяОбьектв
ИмяОбьектв
Клиенты п о ре гио нам Форы а
Клиенты п о ре гио нам Форы а
Главная форма
Главная форма
Форма
Форма
Продажи по регионам Отчет
Продажи по регионам Отчет
Отгрузи
Отгрузи
Стимуляция торговли Форма Клиенты по продажам Отчет Уволенные служащие Отчет
Стимуляция торговли Форма Клиенты по продажам Отчет Уволенные служащие Отчет
Администрация Клиенты
Администрация Клиенты
Форма
Форма
Форма
Форма
Рис. 1.16. Перечень востребованных объектов базы данных
Рис. 1.16. Перечень востребованных объектов базы данных
внесения изменений в обработку событий открытия всех отчетов, имеющихся в базе данных:
Public Sub insert_open_report_event( )
’ !! Перед запуском следует закрыть все запущенные отчеты !1
Dim rpt As AccessObject
For Each rpt In CurrentProject.All Reports
DoCmd.OpenReport rpt.Name, acViewDesign
With Reports(O).Module
On Error Resume Next
open_proc_start = .ProcBodyLine("Report_Open", vbext_pk_Proc)
If Error <> 0 Then
'Если обработчик отсутствовал, он будет создан
Err,Clear
open_prac_start = .CreateEventProc("Open", "Report")
End If
.InsertLines open_proc_start + 1, _
"Dim conn as ADODB.Connect!on"
.InsertLines open_proc_start + 2,
"Set conn =CurrentProject.Connection"
.InsertLines open_proc_start + 3, _
"Dim ssql as String"
.InsertLines open_proc_start + 4. _
"ssql = ""Insert Into ЬЬ1Журнал_объектое ValuesC" &_
Reports(0).Name & "'. 'Отчет'}"""
.InsertLines openjroc_start + 5, _
"conn.Execute ssql"
.InsertLines open_proc_start * 6, _
"conn.Close"
.InsertLines open_proc_start + 7. _
"Set conn = Nothing"
End With
DoCmd.Close acReport. Reports(0).Name, acSaveYes
Next
MsgBox "Изменения внесены во все отчеты"
End Sub
Эта процедура работаете программными модулями отчетов. Фактически мы имеем дело с кодом VBA, который создает такой же код VBA1 В процессе работы процедуры каждый отчет открывается в режиме конструктора, после чего в его программный модуль вставляется новый фрагмент кода. Вы можете создать подобную процедуру и для форм — для этого нужно будет вместо All Reports обратиться к коллекции AllForms.
ТРЮК№8ТРЮК№8Защита ценной информации
ТРЮК
№8
ТРЮК
№8
Защита данных с использованием переключателя командной строки «только для чтения», не позволяющим пользователям вносить какие-либо изменения.
Создание на Рабочем столе ярлыка для базы данных открывает новые, малоизвестные возможности, В частности, вы можете скрытно использовать переключатели командной строки, и обнаружить факт их использования сможет далеко нс каждый.
Используя этот прием, можно легко настроить ярлык на запуск базы данных в режиме «только для чтения» и защитить таким образом ваши данные и описанI'я объектов. Осуществляется все это добавлением в свойствах ярлыка в конце строки поля Объект переключателя / го. Учтите, что полная строка, указывающая I а запускаемый объект, н данном случае содержит не только указание пути к приложению базы данных. Она должна начинаться с указания пути к исполняемому файлу Access, затем должен следовать путь к приложению базы данных, а уде после него должен указываться переключатель командной строки.
Применительно к Access 2003, который по умолчанию обычно находится в каталоге Program Files/Microsoft Office/Office 11, полная строка указания на объект будет выглядеть следующим образом:
"C:\Program FllesXMicrosoft Office\OFFICEIl\MSACCE55.EXE" “C:\Sales Summaries\Sales2005.mdb" /го
После щелчка на ярлыке Рабочего стола база данных откроется в режиме «только для чтения». При запуске будет выведено подтверждающее сообщение, предстат - ленное на рпс. 1.17. Добавление, удаление или изменение данных в таком режиме работы будет невозможным.
Рис. 1.17. Напоминание о работе в режиме только для чтенияРис. 1.17. Напоминание о работе в режиме только для чтения
Рис. 1.17. Напоминание о работе в режиме только для чтения
Рис. 1.17. Напоминание о работе в режиме только для чтения
Данный способ хорош для распространения информации без опасений за целостность данных. Способ распред едения доступа к приложению базы данных, использующий создание или модификацию существующего ярлыка, гарантирует запус с приложения в предназначенном режиме,
И все же, на всякий случай
Разумеется, некий сообразительный пользователь может просто запустить исполняемый файл Access и открыть базу данных, воспользовавшись диалоговым окном Открытие файла базы данных, проигнорировав, таким образом, созданный на Рабочем столе ярлык. После чего база данных будет открыта в режиме работы безо всяких ограничений, если только на это случай не предусмотрена какая-нибудь хитрость.
Справиться с проблемой поможет простая операция вставки данных SQL Insert., помещенная в процедуру, вызываемую при открытии базы данных. Для обеспе-
чения работы этой процедуры вы можете включить в структуру базы данных специальную дополнительную таблицу. Если операция окажется успешной, пользователь будет предупрежден, что нужно воспользоваться ярлыком Рабочего стола (рис. 1.18), после чего база данных будет закрыта.
Рис. 1.18. Предупреждение при попытке обойти использование ярлыка на Рабочем столеРис. 1.18. Предупреждение при попытке обойти использование ярлыка на Рабочем столе
Рис. 1.18. Предупреждение при попытке обойти использование ярлыка на Рабочем столе
Рис. 1.18. Предупреждение при попытке обойти использование ярлыка на Рабочем столе
Код процедуры
Процедура, проверяющая возможность вставки данных командой SQL Insert:
Public Function test_mode( )
On Error GoTo err_end
Dim conn As ADODB.Connect!on
Set conn = Currentproject.Connection
Dim ssql As String
ssql = "Insert Into tblHodeTest Values ('test')”
conn.Execute ssql
conn.Close
Set conn = Nothing
'если выполнение процедуры дошло до этого места,
’база данных не находится в режиме только для чтения 'предупреждаем пользователя и выходим из приложения MsgBox "База данных открывается с помощью ярлыка на Рабочем стопе" DoCmd.Quit
Exit Function
err_end:
*все в порядке, попытка вставки данных не удалась
End Function
А вот в чем заключается суть этой уловки: предполагается, что база данных должна быть открыта в режиме «только для чтения», поэтому оптимальный результат будет при неудачной попытке записи. При этом программа перейдет к метке обработчика ошибки. Если все так и произойдет, значит, все в порядке и никакие действия предприняты не будут. Если вставка будет успешной, на экран будет выведено предупреждение и база данных будет закрыта командой Quit. Эта процедура должна быть вызвана в макросе AutoExec, тогда она будет выполнена сразу же после открытия базы данных.
ТРЮК№9ТРЮК№9Работа с данными любого объема
ТРЮК
№9
ТРЮК
№9
Проектирование архитектуры, состоящей из нескольких баз данных и предназначенной для работы с любым объемом данных, вплоть до гигабайтов и даже терабайтов!
Единственное ограничение на объем информации в Access относится к таблицам, в которых не может содержаться более 1 Гбайта данных. Даже если это и так, то все возможности еще далеко не исчерпаны. Разумеется, Access способна справиться
с громадными информационными объемами, но вопрос, не в этом. Если в следующем году на вашем рабочем месте нс собираются устанавливать SQLServer или Oracle, то вы можете воспользоваться преимуществами гибкости архитектуры Access, позволяющими оперировать любыми объемами данных.
Для этого нужно придумать такую структуру данных, в которой они будут распределены по разным таблицам и файлам базы данных. Не существует правила, по которому приложение Access должно полностью размещаться только в одном файле. Оно может быть разделено на интерфейсную и прикладную части. То ест i формы, отчеты и запросы будут находиться в интерфейсной части, асами данные будут помещены в отдельный файл прикладной части. Затем таблицы с данными будут связаны с интерфейсной частью. Па рис. 1.19 показан такой стандартный подход, являющийся, по сути, простейшим примером клиент-серверной архитектуры.
Интерфейсная частьИнтерфейсная частьПрикладная часть 1Прикладная часть 1
Интерфейсная часть
Интерфейсная часть
Прикладная часть 1
Прикладная часть 1
ДанныеДанныеЗапросы Формы Отчеты Макросы VBA
Данные
Данные
Рис. 1.19. Простейшая конфигурация, состоящая из интерфейсной и прикладной частей
Распределение данных
Содержать всю прикладную часть в одном-едииствешюм файле нет никакого смысла. Как именно разбить данные по частям, подскажет их фактическая структура. Например, если вы работаете с огромной базой клиентов, то можете разбит , ее на несколько таблиц по количеству букв алфавита, с которых начинаются фамилии клиентов. Подобная конфигурация данных показана на рис. 1.20.
Вы можете также разбить список клиентов по городам, областям и другим географическим признакам. Опять же, получившиеся слишком большие наборы данных вы можете разбить на более мелкие наборы (благо букв в алфавите достаточно). Вся суть данного трюка и состоит в разбиении дивных па части. Вам нужно хорошенько проанализировать имеющиеся данные и выработать соответствующий замысел. Возможно, данные будут связаны с календарными датами. Тогда их можно будет разбить по месяцам, дням или по другим имеющим смысл признакам.
Работа с распределенными данными
У распределенных данных есть одна неприятная особенность. Когда данные разбиты на несколько таблиц, теряется простота установки их связей с другими табли-
Файлы прикладной частиФайлы прикладной частиРис. 1.20. Использование в прикладной части нескольких баз данныхРис. 1.20. Использование в прикладной части нескольких баз данных
Файлы прикладной части
Файлы прикладной части
Рис. 1.20. Использование в прикладной части нескольких баз данных
Рис. 1.20. Использование в прикладной части нескольких баз данных
нами. К примеру, у вас главная таблица клиентов связана с таблицей покупок. Вы разбиваете таблицу клиентов па десять маленьких таблиц. Что тогда станет со связями? Обойти данную проблему можно двумя способами.
Первый способ предусматривает связь таблицы покупок со всеми десятью таблицами клиентов. Второй вообще не предусматривает использования связей, а взамен проводит скрытую обработку данных, каждый раз сопоставляя их в соответствии с теми условиями, которые задаются в интерфейсной части приложения.
Не так уж все и сложно, как может показаться на первый взгляд. В двух словах, VBA и ADO работают вместе, выискивая соответствия клиентов и покупок по заданному в интерфейсной части приложения критерию поиска. Реальный подход к поиску соответствующих товаров заключается в создании на основе таблицы товаров набора записей или массива записей и в последующем поиске соответствий ключевым полям во всех десяти таблицах. Конечно, это не самый впечатляющий и далеко не самый эффективный способ обработки данных, но такова цена успешной работы Access с гигабайтными объемами данных.
ТРЮК№10ТРЮК№10Ускорение поиска объектов базы данных
ТРЮК
№10
ТРЮК
№10
Использование описаний в свойствах форм, запросов и отчетов, избавляющих пользователей от необходимости разгадывания значений их имен.
Многие придерживаются соглашения, касающегося присвоения имен при создании объектов базы данных. В сообществе разработчиков выработано соглашение, в рамках которого считается само собой разумеющимся использование префиксов th], frm. rpt и им подобных. Это считается неотъемлемой частью работы по созданию приложений. Например, имя tbLStaff принадлежит таблице, frmAdmin — форме, a rptContacts — отчету.
Однако после того как разработка базы данных, состоящей из ряда объектов, нт ■ званных в соответствии с существующим соглашением, будет завершена, рядовс ■ му пользователю будет нелегко разобраться в именах объектов. На рис. 1.21 пок; - зан типичный пример базы данных, содержащей несколько форм.
Но существует способ выхода из этого затруднительного положения, не затрат; ■ вающнй привычной для разработчиков системы присвоения имен. Каждому объет -
Рис. 1.21, Непонятные имена форм способны запутать пользователя
Рис. 1.22. Ввод описания
ту базы данных может быть дано описание. При этом сто можно ввести, не открывая объект в режиме конструктора.
Для этого нужно в окне базы данных щелкнуть правой клавишей на значке объекта и в появившемся меню выбрать пункт Свойства. Для ввода описания, составленного из обычных слов, откроется небольшое диалоговое окно, показанное на рис. 1.22.
После ввода описаний для всех объектов нужно будет изменить форму представления списка объектов и перейти от значков к таблице. Тогда в списке появятся описания. На рис. 1.23 показано, как набор форм, отображенный выше на рис. 1.21, приобрел вполне понятный вид.
Рис. 1.23. Выбор форм по описаниямРис. 1.23. Выбор форм по описаниям
Рис. 1.23. Выбор форм по описаниям
Рис. 1.23. Выбор форм по описаниям
Кроме всего прочего, данный подход дает возможность предупредить пользователя о том, что некоторые объекты вообще не должны открываться. В частности, это может пригодиться при использовании подчиненных форм, которые не должны открываться напрямую, поскольку они появляются в составе других форм. Описание может содержать соответствующее предупреждение.
ТРЮК№11ТРЮК№11Использование связующей таблицы
ТРЮК
№11
ТРЮК
№11
Правильное моделирование отношения многие-ко-многим
Впасть в заблуждение, что все связи между таблицами относятся к типу один-ко- многим, довольно легко. Действительно, многие данные связаны между собой именно по такому образцу. К примеру, один человек может вообще не иметь ни одного телефонного номера или иметь множество таких номеров. Однако не все
данные подпадают под эту модель.
Взаимоотношения студентов с пре подавателями могут послужить неплохим примером того, как данные, на первый взгляд укладывающиеся в модель отношений один-ко-многим, на самом деле не соответствуют такой схеме отношений. С одной стороны, у одного преподавателя может быть много студентов, что доказывает существование отношения один-ко-многим. С другой стороны, и у студента может быть много преподавателей, что также подпадает под модель отношения один ■ ко- м I югим. Казалось бы, в чем тут проблема?
Па рис. 1.24 показан один из вариантов схемы отношений преподавателей и студентов. Таблице Преподаватели принадлежит метка «единица», а таблице Студер ты — метка «бесконечность». Преподаватели и студенты собираются вместе наз i- пятня. При всей состоятельности данной модели из нее следует, что преподавате/ и и студенты находятся на разных уровнях, что на самом деле не соответствует действительности.
Рис. 1.24. Неподходящее отношение один-ко-многим
На рис. 1.24 таблице Студенты в качестве внешнего ключа требуется поле Пperi ода в ательЮ. Это вполне приемлемо, но, судя по связям таблицы Занятия, к занятиям причастны только студенты, а на самом деле к ним имеют отношение и преподаватели.
На рис. 1.25 показано решение этой проблемы. Поскольку к занятиям имеют с т- ношение и преподаватели и студенты, схема должна быть построена именно так. Таблица Занятия выступает в роли связующего звена между преподавателями И студентами.
Связующая таблица становится общей для двух или более таблиц. Все ключев де поля отдельных таблиц становятся внешними ключами связующей таблицы, которая может содержать любые другие подходящие по смыслу поля. В данном пр и- мере у связующей таблицы имеются поля для размещения дней и часов занятий, на которых будут встречаться преподаватели и студенты. Теперь в таблице Студенты уже нет внешнего ключа П ре пода вате льЮ, а между студентами и преподавателями не существует никакой подчиненности, в соответствии с чем отсутству от и взаимные связи один-ко-многим.
Рис. 1.25. Более удачная схема данныхРис. 1.25. Более удачная схема данных
Рис. 1.25. Более удачная схема данных
Рис. 1.25. Более удачная схема данных
ТРЮК№ 12ТРЮК№ 12Сдерживание базы данных от непомерного разрастания
ТРЮК
№ 12
ТРЮК
№ 12
Установка флажка Сжимать при закрытии позволяет сдерживать разрастание базы данных.
Базы данных Access склонны к разрастанию, особенно при иптенсиином обмене данными. Например, если приложение систематически импортирует данные, обрабатывает их, а затем экспортирует результат, база данных способна разрастись до громадных размеров, порядка нескольких мегабайт. Подобное может случиться даже при весьма незначительных объемах перемещаемой информации.
Вернуть базу данных к ее истинным размерам вам поможет процесс сжатия. По не стоит ожидать, что сами пользователи смогут оптимизировать размер базы данных, тем более когда они даже не представляют себе, как эго можно сделать. Это
Рис. 1.26. Установите флажок Сжимать при закрытииРис. 1.26. Установите флажок Сжимать при закрытии
Рис. 1.26. Установите флажок Сжимать при закрытии
Рис. 1.26. Установите флажок Сжимать при закрытии
л ни к чему, поскольку система Access способна сжимать базу данных в процессе завершения своей работы. Такая функция отсутствовала в ранних версиях системы, но она доступна в Access 2002 и Access 2003.
На рис. 1.26 показано диалоговое окно Параметры (Сервис ► Параметры) с открытой вкладкой Общие. Обратите внимание на флажок Сжимать при закрытии.
Access отличается от других систем управления базами данных, таких как SQL Server, тем. что не даст возможност и регулировать размер самой базы. Установи i флажка, позволяющего сжимать базу данных при каждом завершении работы с ней, устраняет эту извечную проблему Access.
ГЛАВА 2
Таблицы
Трюки № 13-18
Известно, что без таблиц данные хранить было бы негде. Но какие могут быть трюки с таблицами, если их структура предельно проста? Все, что в них есть, — это строки и столбцы, или, соответственно, записи и поля.
Тем нс менее даже незначительные настройки конструктора таблиц могут сыграть весьма заметную роль.
Изменив значения по умолчанию, установленные для различных типов данных, и ряд других свойств, вы сможете ускорить разработку приложения. Без вашего вмешательства длина текстовых полей будет устанавливаться по умолчанию в 50 символов. Хорошо это или плохо — зависит от конкретного проекта.
Может быть, вам хочется использовать триггеры по примеру SQL Server? Пожалуйста! При помощи встроенных в формы событий вы добьетесь тех же результатов. Вам нужно скрыть данные? Для этого тоже найдется подходящий трюк!
Создание поля счетчика с произвольным начальным значением
Полю счетчика совсем не обязательно иметь начальное значение, равное единице.
Вы можете изменить исходную схему автонумерации Access, приспособив ее под ваши нужды. Поле счетчика — весьма ценный вклад Access в процесс создания таблиц. В поле этого типа для первой записи устанавливается значение 1, которое затем автоматически увеличивается на единицу для каждой последующей добавляемой записи. Ничего более сложного или значительного в этом поле не содержится. Его основное предназначение — служить ключевым полем и обеспечивать, таким образом, уникальность каждой записи.
Вставьте поле в структуру таблицы и определите для него тип данных Счетчик. Обычно нолю этого т ипа присваивается имя с пометками, отражающими его назначение, — ID или Num, скажем, Клиент ID или ЗаписьМит. Учтите, что в таблице может быть только одно ноле счетчика.
Тем не менее при всех положительных качествах у этого поля есть один недостаток: его начальное значение всегда равно единице. В большинстве случаев проблем не возникает, поскольку совсем не важно, какое именно значение имеет это поле. Главное, что это значение уникально. Ну а если вам нужно иметь возрастающую автонумерацию с произвольным начальным значением, возможно ли такое? Конечно возможно!
Начало автонумерации с числа по выбору
У поля с типом данных Счетчик отсутствует свойство, в котором можно было б я задать начальное значение. На рис. 2.1 показан конструктор таблиц. Нетрудно заметить, что первое поле таблицы — это поле счетчика, и присущие ему свойстт а вводятся в левой нижней части окна конструктора таблиц. Заметьте, что начальное значение счетчика вводить просто некуда.
Ы Начальное значение счетчикаЫ Начальное значение счетчикаflNSERTlNTOC л^ VALUES (100):flNSERTlNTOC л^ VALUES (100):Рис. 2.1. Счетчик, поле с автонумерациейРис. 2.1. Счетчик, поле с автонумерацией
Ы Начальное значение счетчика
Ы Начальное значение счетчика
flNSERTlNTOC л^ VALUES (100):
flNSERTlNTOC л^ VALUES (100):
Рис. 2.1. Счетчик, поле с автонумерацией
Рис. 2.1. Счетчик, поле с автонумерацией
Если быть точнее, то таблица имеет свойство Новые значения, но в нем лишь задается способ формирования нового значения — либо оно будет приращением предыдущего, либо будет выбрано случайным образом. В этом свойстве никак не о ■ ражастся выбор начального значения автонумерации. Поэтому первой записи будет присвоен номер 1, второй записи — номер 2 и т. д.
Чтобы подавить начальное значение по умолчанию, нужно воспользоваться запросом на добавление и вставить другое начальное значение. После создания таблицы в нее нужно поместить начальное значение. На рис. 2.2 показан запрос 1 а добавление, предназначенный для присвоения значения полю счетчика. В результате его выполнения к таблице буде т добавлена запись, в которой полю счетчика будет присвоено указанное значение.
Рис. 2.2. Использование запроса для указания начального значения счетчика
Заметьте, что этот запрос следует открывать в режиме SQL, поскольку непоня-- но, как то же самое можно было бы сделать в режиме конструктора (с использованием сетки построения запроса), в котором обычно составляются запросы на добавление данных одной таблицы к данным другой. Мы же добавляем значение к полю таблицы, не используя какую-нибудь другую таблицу (в крайнем случае вы, конечно, можете включить в конструкцию другую таблицу с нужным вам значением, но вряд ли стоит так делать).
На рис. 2.3 показан результат выполнения запроса на добавление. Пустовавшая ранее таблица Служащие приобрела свою первую запись со значением счетчика, равным 100.
Рис. 2.3. Первая запись с указанным начальным значением счетчика
Заметьте, что все остальные поля остались пустыми. Если нужно заполнить значениями и другие поля, то в запрос следует внести соответствующие указания. Например, можно изменить запрос и заполнить еще и ноля Служащий и Должность: INSERT INTO Служащие (СлужащийЮ, Служащий, Должность)
VALUES (IBS. "Кузнецов Иван Иванович", "Контролер");
На рис. 2.4 показан результат выполнения обновленного запроса. На первый взгляд нам удалось убить сразу двух зайцев — запустить счетчик с требуемого начального значения и не использовать при этом запись-пустышку (изображенную на рис. 2.3). Тем не менее такой подход не вполне корректен. Вряд ли стоит заполнять таким образом первую запись, учитывая, ч то все последующие записи будут заполняться либо из формы, либо но результатам обработки данных, либо иным способом. Дело в том, что не принято заполнять первую запись каким-то способом, отличающимся от способа заполнения всех остальных записей.
Рис. 2.4. Использование запроса для заполнения поля счетчика вместе с другими полями
Но как тогда можно инициировать счетчик нужным значением без записи-пустышки в таблице? Выход из положения заключается в таком же заполнении первой записи с использованием запроса, но с присвоением счетчику значения, на единицу меньше требуемого. Затем можно будет удалить эту запись, а счетчик будет увеличен на единицу при добавлении следующей записи. А это значит, что у первой настоящей записи, введенной предназначенным для этого способом, будет требуемый номер счетчика. Затем, как и ожидалось, этот номер будет возрастать с каждой повой записью.
В нашем примере запрос должен добавить в таблицу единственную запись, в которой полю счетчика будет присвоено значение 99. Эта запись затем будет удалена (неважно, как: вручную или каким-нибудь другим способом). Когда будет добавлена первая ио-настоящему нужная запись, значение поля счетчика у нее будет равно 100.
Трюк в трюке
Вы можете переключить исходное значение счетчика когда угодно. Это не повлс - чет за собой изменений существующих записей, но нумерация новых начнется с нового исходного значения. Для этого нужно всего лишь выполнить запрос на добавление, подобный показанному на рис. 2.2 (настроенный, как это уже объяс - нялосъ, па соответствующие значения и поля), но при этом новое исходное значт - пне счетчика должно быть больше самого большого из имеющихся в таблице. Например, если у последней введенной записи было значение счетчика 220, нуж - но переключить значение на какое-нибудь еще большее число. Понятно, что сле дующее за ним число будет пропущено, иначе и не стоило бы затевать счет с новс - го исходного значения.
При этом открывается новая возможность управления данными. Можно придатт, группам записей в таблице не вполне очевидный, но все же родственный атрибу-. Например, вы можете переключать исходное значение счетчика в начале каждого года. Тогда данные будет легко отличить друг от друга по годам. К примеру, все записи, относящиеся к 2005 году, будут нумероваться в диапазоне 5000-5999, а записи 2006 года получат номера из диапазона 6000-6999 и т. д.
ТРЮК№ 14ТРЮК№ 14Копирование данных из одной таблицы в другую без использования запроса на добавление
ТРЮК
№ 14
ТРЮК
№ 14
Использование добавления из буфера для упрощенного копирования данных между таблицами.
Для добавления данных из одной таблицы в другую пользователи Access часто применяют запрос на добавление. В производственной среде, в условиях постоянного обмена данными, использование запросов на добавление становится рутиной. Всякий раз при составлении нового запроса требуется сопрягать поля ис ходной и целевой таблиц. Хорошо, когда поля названы одинаково, но если это не так, приходится выполнять операцию вручную.
Если запрос составлен и сохранен, а исходная и целевая таблицы имеют неизмег ную структуру, проблем не возникает. Но если в именах полей случайно будет какой-нибудь лишний или пропущенный символ, запрос либо не будет выпо; - ней, либо станет требовать ввода значения для каждого неопознанного поля. И в я ничего не сможете с этим поделать.
Как все же справиться с подобной ситуацией? Хорошо, что существует другой способ копирования данных между таблицами: с помощью команды Добавить t з буфера.
Добавление записей из одной таблицы в другую
Система Access обладает уникальным методом вставки — команда Добавить из буфера позволяет добавлять содержимое буфера обмена к таблице базы данных. Данные должны совпадать по структуре, но совпадения имен полей при этом 1 е
требуется. Согласитесь, такой способ намного лучше, чем утомительный ввод данных в сетку построения запроса. Надо отдать должное и запросам на добавление: у них есть одно весомое преимущество — использование условий добавления позволяет Добавлять записи из какого-нибудь набора выборочно. В отличие от этого добавить из буфера можно только все подряд. 'Гем не менее, если выборка не нужна, добавление из буфера имеет явное преимущество.
На рис. 2.5 показаны две таблицы, одна из которых содержит сведения о состоявшихся клиентах, а другая — о потенциальных, которые нужно добавить к таблице состоявшихся. Записи таблицы ЬЫ_Потен циальные_клиенты подлежат добавлению к записям таблицы tbl_Kn центы. Назначения и типы полей обеих таблиц, в отличие от имен, совпадают.
^^‘ Травка Вид Вставка ;Формат Записи Сервис ^яо ^правка?гглитавре*:^^‘ Травка Вид Вставка ;Формат Записи Сервис ^яо ^правка?гглитавре*:Ад^Ад^Мих айл овм ч.СтавропольМих айл овм ч.Ставрополь630007667000305041123481335008'630007667000305041123481335008'Петрович Викторович Михайлович СеменовичПетрович Викторович Михайлович СеменовичФамилияJМатвеев[Crapes jФедотов:,Семенов;ФамилияJМатвеев[Crapes jФедотов:,Семенов;[Лочтовы^имдекс ■ 620090156055 443122 ?21Й01 : 6290812 77 601600 153002 607190[Лочтовы^имдекс ■ 620090156055 443122 ?21Й01 : 6290812 77 601600 153002 607190Николай■Андрей Василий■ Алекс ейНиколай■Андрей Василий■ Алекс ейиндекс 454018 Б5ОО54 350016индекс 454018 Б5ОО54 350016Фрунзе 12-9Волошина 55-34 Энтузиастов 2-35 Громобол 22-18Юности 11-7Фрунзе 12-9Волошина 55-34 Энтузиастов 2-35 Громобол 22-18Юности 11-7Техническая 31-18Мира 12-67Ташкентская 23-41Техническая 31-18Мира 12-67Ташкентская 23-41фамилия Васильев .Ярии^^ Смирное Тарасов Зуев Жуков Ефимовфамилия Васильев .Ярии^^ Смирное Тарасов Зуев Жуков Ефимов*"имя " I С^честаоВикторПетровичВладимирИвановичАлександрНиколаевич■ ПетрСергеевич*"имя " I С^честаоВикторПетровичВладимирИвановичАлександрНиколаевич■ ПетрСергеевичАстахов Березкин ДмитриевПетровАстахов Березкин ДмитриевПетровГороГ f Екатеринбург ' Кострома ■ I Самара СмоленскуКемеровоIАлександров .' ИвановоIСаровГороГ f Екатеринбург ' Кострома ■ I Самара СмоленскуКемеровоIАлександров .' ИвановоIСаровL ИМЯ .• Виктор; Олег■Андрейi Анатолий Семен: Виктор Андрей^ АлексейL ИМЯ .• Виктор; Олег■Андрейi Анатолий Семен: Виктор Андрей^ АлексейАнатольевич , Челябинск Алексеевич Барнаул Петрович . Краснодар Григорьевич Новосибирск;Иванович. Благовещенск;Сергеевич Курск Васильевич МоскваАнатольевич , Челябинск Алексеевич Барнаул Петрович . Краснодар Григорьевич Новосибирск;Иванович. Благовещенск;Сергеевич Курск Васильевич Москва■ адрес /' 4ф-тиллер яств 40-21 Автотранспортная 78-34 Южная 8-45 Фабричная 56-9 Амурская 12-32 Льва Толстого 56*23 Планерная 12-78 Осипенко 76-49■ адрес /' 4ф-тиллер яств 40-21 Автотранспортная 78-34 Южная 8-45 Фабричная 56-9 Амурская 12-32 Льва Толстого 56*23 Планерная 12-78 Осипенко 76-49Рис, 2.5. Добавление схожих данных из одной таблицы в другуюРис, 2.5. Добавление схожих данных из одной таблицы в другую
^^‘ Травка Вид Вставка ;Формат Записи Сервис ^яо ^правка?гглитавре*:
^^‘ Травка Вид Вставка ;Формат Записи Сервис ^яо ^правка?гглитавре*:
Ад^
Ад^
Мих айл овм ч.Ставрополь
Мих айл овм ч.Ставрополь
630007
667000
305041
123481
335008'
630007
667000
305041
123481
335008'
Петрович Викторович Михайлович Семенович
Петрович Викторович Михайлович Семенович
ФамилияJ
Матвеев[
Crapes j
Федотов:,
Семенов;
ФамилияJ
Матвеев[
Crapes j
Федотов:,
Семенов;
[Лочтовы^имдекс ■ 620090
156055 443122
?21Й01 : 6290812 77 601600 153002 607190
[Лочтовы^имдекс ■ 620090
156055 443122
?21Й01 : 6290812 77 601600 153002 607190
Николай
■Андрей Василий
■ Алекс ей
Николай
■Андрей Василий
■ Алекс ей
индекс 454018 Б5ОО54 350016
индекс 454018 Б5ОО54 350016
Фрунзе 12-9
Волошина 55-34 Энтузиастов 2-35 Громобол 22-18
Юности 11-7
Фрунзе 12-9
Волошина 55-34 Энтузиастов 2-35 Громобол 22-18
Юности 11-7
Техническая 31-18
Мира 12-67
Ташкентская 23-41
Техническая 31-18
Мира 12-67
Ташкентская 23-41
фамилия Васильев .Ярии^^ Смирное Тарасов Зуев Жуков Ефимов
фамилия Васильев .Ярии^^ Смирное Тарасов Зуев Жуков Ефимов
*"имя " I С^честао
ВикторПетрович
ВладимирИванович
АлександрНиколаевич
■ ПетрСергеевич
*"имя " I С^честао
ВикторПетрович
ВладимирИванович
АлександрНиколаевич
■ ПетрСергеевич
Астахов Березкин Дмитриев
Петров
Астахов Березкин Дмитриев
Петров
ГороГ f Екатеринбург ' Кострома ■ I Самара Смоленску
КемеровоI
Александров .' ИвановоI
Саров
ГороГ f Екатеринбург ' Кострома ■ I Самара Смоленску
КемеровоI
Александров .' ИвановоI
Саров
L ИМЯ .
• Виктор
; Олег
■Андрей
i Анатолий Семен
: Виктор Андрей^ Алексей
L ИМЯ .
• Виктор
; Олег
■Андрей
i Анатолий Семен
: Виктор Андрей^ Алексей
Анатольевич , Челябинск Алексеевич Барнаул Петрович . Краснодар Григорьевич Новосибирск;
Иванович. Благовещенск;
Сергеевич Курск Васильевич Москва
Анатольевич , Челябинск Алексеевич Барнаул Петрович . Краснодар Григорьевич Новосибирск;
Иванович. Благовещенск;
Сергеевич Курск Васильевич Москва
■ адрес /' 4ф-тиллер яств 40-21 Автотранспортная 78-34 Южная 8-45 Фабричная 56-9 Амурская 12-32 Льва Толстого 56*23 Планерная 12-78 Осипенко 76-49
■ адрес /' 4ф-тиллер яств 40-21 Автотранспортная 78-34 Южная 8-45 Фабричная 56-9 Амурская 12-32 Льва Толстого 56*23 Планерная 12-78 Осипенко 76-49
Рис, 2.5. Добавление схожих данных из одной таблицы в другую
Рис, 2.5. Добавление схожих данных из одной таблицы в другую
Проще всего выбрать все записи в таблице 1Ы_П стен циальные клиенты (CtrL+A), скопировать записи, перейти к таблице 1Ы_Клиенты и воспользоваться командой Правка * Добавить из буфера (рис. 2.6).
Заметьте, что пр» добавлении записей не нужно беспокоиться об именах полей. Тем не менее есть еще более простой способ, при котором таблицу, содержащую добавляемые записи (в данном примере это ТЫ_Потенциальные_клиенты), открывать не обязательно! Нужно просто выделить и скопировать закрытую таблицу прямо в окне базы данных. Затем нужно открыть таблицу, предназначенную для
добавления записей (в данном примере это 1Ы_Клиенты), и. как и раньше, выбратг пункт меню Добавить из буфера.
Рис. 2.6. Использование команды Добавить из буфера
И все-таки этот метод имеет один изъял. Он прекрасно работает, если имена полей совпадают. Однако если хотя бы одно из имен будет отличаться, то он вег равно с ] работает, но имена полей копируемой таблицы могут быть вставлены в виде записи!
Понятно, ч то сами по себе имена полей имеют текстовую природу, поэтому, если таблица, принимающая данные, содержит не только текстовые поля, то при добавлении из буфера имена полей вставляться не будут. Вы можете получить предупреждение об ошибке несовпадения типов данных, но, как пи странно, на него не стоит обращать внимания.
В конце концов, даже если вы знаете, что будет вставлена запись с именами полей вместо данных, метод добавления из буфера остается предпочтительней создания запроса на добавление, поскольку куда проще удалить одну запись из таблицы, чем создавать запрос с нуля.
Добавление записей из одной базы данных в другую
Прием, рассматриваемый в этом трюке, работает не только в отдельно взя том приложении базы данных, он также позволяет переносить данные из одной базы данных в другую. То есть вы можете выбрать и скопировать записи из таблицы одной базы данных, а затем вставить их в таблицу другой базы данных. Разумеется, для этого обе базы данных должны быть открыты.
На рис. 2.7 показаны две базы данных, расположенные рядом на Рабочем с толе.
Таблицу 1Ы_Потенциальные_клиенты из базы данных, отображенной слепа, надо просто перетащить в открытое окно таблицы УЯ_Клиенты базы данных, отображенной справа. Таблица 1:Ы._Потенциальные_клценты будет скопирована, а не перемещена, при этом ее оригинал в первой базе данных останется нетронутым. Для завершения операции добавления записей клавишу мыши следует отпустить.
_»(^№ ^^^оо iH^S .■06w*TM;Сояан* таб.и._»(^№ ^^^оо iH^S .■06w*TM;Сояан* таб.и..3.<ОИ^./Cr-X мкА/ <ф\ . --^ О^У^В®^^^.3.<ОИ^./Cr-X мкА/ <ф\ . --^ О^У^В®^^^■ТЗ '&*«'• ПРЖэ ^ИД tkTjre.^ фосфит Заох-и Cflwn: (экк, Справка■ТЗ '&*«'• ПРЖэ ^ИД tkTjre.^ фосфит Заох-и Cflwn: (экк, Справка^:&#Й&^^:&#Й&^[ПСЧ^ЮвЫЙ:[ПСЧ^ЮвЫЙ:№ йей#№ йей#Го£»ДГо£»ДВикторович „ Александров Энтуэяестм 2-35 ,Викторович „ Александров Энтуэяестм 2-35 ,Микаилович ИвановоМикаилович ИвановоСеменовичСеменовичМ*ФОСЫМ*ФОСЫГруппыГруппы133 :133 :h®ИЗh®ИЗГромобоя 22-18Юности 11-7Громобоя 22-18Юности 11-7i Создание таблицы в режим конструктораi Создание таблицы в режим конструктораАлександр 'Александр 'НиксданАндрейВасилин 'Алексей ■НиксданАндрейВасилин 'Алексей ■629061601600153002607190629061601600153002607190Смд»*е таб via* С помощью настераСо>д»*«е таблицу путей ввода данныхТЫ_КлиентыД-^ Г10т№а4и,э.г^,^^_ ^Смд»*е таб via* С помощью настераСо>д»*«е таблицу путей ввода данныхТЫ_КлиентыД-^ Г10т№а4и,э.г^,^^_ ^Николаевич СамараСергеевич СмоленскПетрович КемеровоНиколаевич СамараСергеевич СмоленскПетрович КемеровоТашкентская 23-41 443122Фрунзе 12-9214М1Волошина 56-34Ташкентская 23-41 443122Фрунзе 12-9214М1Волошина 56-341МНЛИЛ | Рм*-■веевВиктор щрев Владимир1МНЛИЛ | Рм*-■веевВиктор щрев ВладимирПетровичЕкатеринбург Техническая 31-18/6 20090 |ИвановичКостромаМира 12-87156055'ПетровичЕкатеринбург Техническая 31-18/6 20090 |ИвановичКостромаМира 12-87156055'Рис. 2.7. Добавление записей из одной базы данных в другуюРис. 2.7. Добавление записей из одной базы данных в другую
_»(^№ ^^^оо iH^S .
■06w*TM;Сояан* таб.и.
_»(^№ ^^^оо iH^S .
■06w*TM;Сояан* таб.и.
.3.<ОИ^./Cr-X мкА/ <ф\ . --^ О^У^В®^^^
.3.<ОИ^./Cr-X мкА/ <ф\ . --^ О^У^В®^^^
■ТЗ '&*«'• ПРЖэ ^ИД tkTjre.^ фосфит Заох-и Cflwn: (экк, Справка
■ТЗ '&*«'• ПРЖэ ^ИД tkTjre.^ фосфит Заох-и Cflwn: (экк, Справка
^:&#Й&^
^:&#Й&^
[ПСЧ^ЮвЫЙ:
[ПСЧ^ЮвЫЙ:
№ йей#
№ йей#
Го£»Д
Го£»Д
Викторович „ Александров Энтуэяестм 2-35 ,
Викторович „ Александров Энтуэяестм 2-35 ,
Микаилович Иваново
Микаилович Иваново
Семенович
Семенович
М*ФОСЫ
М*ФОСЫ
Группы
Группы
13
3 :
13
3 :
h®
ИЗ
h®
ИЗ
Громобоя 22-18
Юности 11-7
Громобоя 22-18
Юности 11-7
i Создание таблицы в режим конструктора
i Создание таблицы в режим конструктора
Александр '
Александр '
Никсдан
Андрей
Василин '
Алексей ■
Никсдан
Андрей
Василин '
Алексей ■
629061
601600
153002
607190
629061
601600
153002
607190
Смд»*е таб via* С помощью настера
Со>д»*«е таблицу путей ввода данных
ТЫ_Клиенты
Д-^ Г10т№а4и,э.г^,^^_ ^
Смд»*е таб via* С помощью настера
Со>д»*«е таблицу путей ввода данных
ТЫ_Клиенты
Д-^ Г10т№а4и,э.г^,^^_ ^
Николаевич Самара
Сергеевич Смоленск
Петрович Кемерово
Николаевич Самара
Сергеевич Смоленск
Петрович Кемерово
Ташкентская 23-41 443122
Фрунзе 12-9214М1
Волошина 56-34
Ташкентская 23-41 443122
Фрунзе 12-9214М1
Волошина 56-34
1МНЛИЛ | Рм*-
■веевВиктор щрев Владимир
1МНЛИЛ | Рм*-
■веевВиктор щрев Владимир
ПетровичЕкатеринбург Техническая 31-18/6 20090 |
ИвановичКостромаМира 12-87156055'
ПетровичЕкатеринбург Техническая 31-18/6 20090 |
ИвановичКостромаМира 12-87156055'
Рис. 2.7. Добавление записей из одной базы данных в другую
Рис. 2.7. Добавление записей из одной базы данных в другую
ТРЮК№15ТРЮК№15Исключение системных таблиц из обработки
ТРЮК
№15
ТРЮК
№15
Исключение системных таблиц из подсчета общего количества и из обработки программными процедурами, позволяющее избежать неверных результатов.
Сколько таблиц содержится в вашей базе данных? Вы, наверное, думаете, что для ответа на этот вопрос нужно просто сосчитать их количество во вкладке Таблицы окна базы данных. Как бы не так!
Для своих внутренних нужд Access использует системные таблицы. Обычно они скрыты от обозрения, но, тем не менее, существуют. На рис 2.8 показана база данных, содержащая несколько таблиц.
Рис. 2.8. Подсчет количества таблицРис. 2.8. Подсчет количества таблиц
Рис. 2.8. Подсчет количества таблиц
Рис. 2.8. Подсчет количества таблиц
Похоже, что в базе данных имеется 8 таблиц, не так ли? Давайте подсчитаем их количество другим способом. В редакторе VB активизируем окно непосредствен-
нога ввода команд — Immediate (Ctrl+G). Затем введем в него следующий кодовый фрагмент и нажмем клавишу Enter:
?Appli cat ion.CurrentData.A;iTables.Count
На рис. 2.9 показано окно Immediate, содержащее команду и результат ее выполнения. Для базы данных, отображенной на рис. 2.8, результат будет равен 15, то есть Access сообщает, что в базе данных на данный момент содержится 15 таблиц, хотя на вкладке Таблицы видны только 8.
Рис. 2.9. Подсчет количества всех таблиц
Команда сообщает правду: эта база данных действительно содержит 15 таблиц поскольку системные таблицы для вас пока остаются невидимыми. Давайте включим их отображение.
Вернемся к самой базе данных (выйдем из редактора VB) и для отображения диалогового окна Параметры выберем команду меню Сервис > Параметры. Теперь выберем вкладку Вид. На рис. 2.10 видно, что н области Отображать имеется флажок Системные объекты. Установим этот флажок, чтобы включить отображение системных объектов.
Рис, 2.10. Включение отображения системных объектов
Снова взгляните на вкладку Таблицы, изображенную на рис. 2.11, — теперь на ней можно увидеть и системные таблицы.
Рис. 2.11. Отображение всех таблиц, включая системные
Заметьте, что вес имена системных таблиц начинаются с префикса MSys. Этот атрибут, присущий именам всех системных таблиц, облегчит исключение их из подсчета.
Код
Но зачем это нужно? Дело в том, что в приложении может понадобиться осуществить перебор всех имеющихся в базе данных таблиц, возможно, для того, чтобы добавить им какое-то свойство, найти поле или данные, изменить каким-то образом их структуру и т. л. В таком случае системные таблицы следует исключить из обработки. Поможет это сделать простая процедура, которая предназначена для исключения тех таблиц, чьи имена начинаются с префикса MSys:
Sub count-tables( }
"вывод перечня таблиц базы данных
Dim tabie_num As Integer
Dim tbl_count As Integer
With Application.CurrentData
For tbl_count = 1 To ,AllTables.Count
If Left(.AlITables(tbl_count - l).Name, 4) о "MSys" Then
Debug,Print .AllTables(tbl_count * 1).Name
End If
Next tbl_count
End With
End Sub
Данная процедура перебирает все таблицы базы данных и выводит в окно отладки (Immediate) имена таблиц, в которых не было префикса MSys. Для использования процедуры в других целях следует заменить строку вывода имен на любую другую операцию обработки всех Таблиц.
Выполнение кода
На рис. 2.12 иоказан результат работы данной процедуры. Окно Immediate запот ■ нено именами только тех таблиц, которые имеют непосредственное отношение к приложению базы данных, что, собственно, и требовалось получить.
Рис. 2,12, Список только тех таблиц, в которых содержатся данные самого приложенияРис. 2,12, Список только тех таблиц, в которых содержатся данные самого приложения
Рис. 2,12, Список только тех таблиц, в которых содержатся данные самого приложения
Рис. 2,12, Список только тех таблиц, в которых содержатся данные самого приложения
Отделив, таким образом, таблицы данных от системных таблиц, вы сможете де лать с таблицами данных все что угодно, не опасаясь при этом нанести приложе нцю какой-нибудь вред.
ТРЮК№16ТРЮК№16Прячем информацию от посторонних
ТРЮК
№16
ТРЮК
№16
Придание таблицам свойства невидимости вставкой в их имена префикса Usys.
Этот трюк, скрывающий данные от любопытных глаз, прост и легок в исполнении. Конечно, разгадать этот секрет знатокам Access особого труда не составит, но обычным пользователям он, скорее всего, окажется не под силу. Используя этот прием, можно скрыть своп таблицы, полностью сохранив работоспособность приложения. Выбранные вамп таблицы будут невидимы при просмотре соответствующей вкладки окна базы данных, но все запросы, формы, отчеты, макросы и программные модули будут работать по-прежнему.
Сделать это можно вставкой в имена таблиц префикса USys. Для Access это станет признаком, благодаря которому такие таблицы Приобретут смешанные свойства и станут как бы и системными, и пользовательскими. При этом появится возможность их скрывать или отображать, используя встроенные механизмы Access. Па рис. 2.13 показан результат использования таких свойств: в открытой форме явно отображаются данные, а во вкладке Таблицы окна базы данных никаких таблиц нет!
glMjcwoft'AcctM*glMjcwoft'AcctM*: $»in Главка ^тд бетита Форуаг Записи Сервис £кмо ^правкабъ^ди.г-, ■«•>-,: $»in Главка ^тд бетита Форуаг Записи Сервис £кмо ^правкабъ^ди.г-, ■«•>-,КлиентыКлиентыФамилияФамилияИмяИмяАлександрАлександрПет?Пет?НиколайНиколай: Дмитриев: ДмитриевВасилийВасилийЗагжь:Загжь:fkjcv>4 едfkjcv>4 едСоздание таблицы в pe*ww конструктораСоздание таблицы с помощью мастераСоздание табт>шы путем ввода данкахСоздание таблицы в pe*ww конструктораСоздание таблицы с помощью мастераСоздание табт>шы путем ввода данках,^О1и?*»ть *£ Конструктор □ Создать ! >" ],^О1и?*»ть *£ Конструктор □ Создать ! >" ]3 Клиенты:3 Клиенты:______ Михайловым Иваново —______ Михайловым Иваново —Петрович , ВикторовичПетрович , ВикторовичОбъектыГХ^яЪ Л Запросы ■ ?$ ФормыОбъектыГХ^яЪ Л Запросы ■ ?$ ФормыС РКкяАоДС РКкяАоДРис. 2.13. Форма, имеющая источником записей скрытую таблицуРис. 2.13. Форма, имеющая источником записей скрытую таблицу
glMjcwoft'AcctM*
glMjcwoft'AcctM*
: $»in Главка ^тд бетита Форуаг Записи Сервис £кмо ^правкабъ^ди.г-, ■«•>-,
: $»in Главка ^тд бетита Форуаг Записи Сервис £кмо ^правкабъ^ди.г-, ■«•>-,
Клиенты
Клиенты
Фамилия
Фамилия
Имя
Имя
Александр
Александр
Пет?
Пет?
Николай
Николай
: Дмитриев
: Дмитриев
Василий
Василий
Загжь:
Загжь:
fkjcv>4 ед
fkjcv>4 ед
Создание таблицы в pe*ww конструктора
Создание таблицы с помощью мастера
Создание табт>шы путем ввода данках
Создание таблицы в pe*ww конструктора
Создание таблицы с помощью мастера
Создание табт>шы путем ввода данках
,^О1и?*»ть *£ Конструктор □ Создать ! >" ]
,^О1и?*»ть *£ Конструктор □ Создать ! >" ]
3 Клиенты:
3 Клиенты:
______ Михайловым Иваново —
______ Михайловым Иваново —
Петрович , Викторович
Петрович , Викторович
Объекты
ГХ^яЪ Л Запросы ■ ?$ Формы
Объекты
ГХ^яЪ Л Запросы ■ ?$ Формы
С РКкяАоД
С РКкяАоД
Рис. 2.13. Форма, имеющая источником записей скрытую таблицу
Рис. 2.13. Форма, имеющая источником записей скрытую таблицу
Форма на рис. 2.13 имеет свойство Источник записей, указывающее на таблицу Usys_Клиенты. Флажок, включающий отображение системных объектов, можно найти на вкладке Вид (команда Сервис > Параметры) (рис. 2.14). При установке флажка Системные объекты все таблицы с префиксом имени Usys становятся видимыми.
На рис. 2.15 отображены все системные объекты, среди которых присутствуют как Usys-, так и MSys-таблицы (см. трюк № 15).
Рис. 2.14. Выбор отображения таблиц с префиксом имен USys
Рис. 2.15. Отображение всех Usys- и MSys-таблиц
Префикс нечувствителен к регистру, поэтому вы можете использовать сочет ания USYS, USys, usys и т, д. - все они будут работать в качестве отличительного признака таблицы.
Альтернативный вариант
Другой способ скрыть объекты базы данных состоит в том, чтобы щелкнуть на значке объекта правой клавишей мыши и выбрать в контекстном меню пункт Свой-
^У^йгк ^Ьонстсшт* ЭСоматб i X j *1^У^йгк ^Ьонстсшт* ЭСоматб i X j *1■^. Модули'■^. Модули';65$<В "^/Г:^-;65$<В "^/Г:^-^■.Зигтгоы7И ОХ»*,Й ■ Олеум ' ^' СТММ^Ы ;:^: Макросы^■.Зигтгоы7И ОХ»*,Й ■ Олеум ' ^' СТММ^Ы ;:^: МакросыСоздание таблицы в режиме конструктора Создание гзбпмцы с помощью мастера Создание таблицы путем ввода дажых ТЫ_Клменты 1Ы_ГЪз сенцие пьнь-е.Создание таблицы в режиме конструктора Создание гзбпмцы с помощью мастера Создание таблицы путем ввода дажых ТЫ_Клменты 1Ы_ГЪз сенцие пьнь-е.aJfcteWhu VaJfcteWhu VРис. 2.16. Установка атрибута СкрытыйРис. 2.16. Установка атрибута Скрытый: S3: S3' rtryr»w " ' Pip иубрлнное' rtryr»w " ' Pip иубрлнное.клиенты.клиенты
^У^йгк ^Ьонстсшт* ЭСоматб i X j *1
^У^йгк ^Ьонстсшт* ЭСоматб i X j *1
■^. Модули'
■^. Модули'
;65$<В "^/Г:^-
;65$<В "^/Г:^-
^■.Зигтгоы
7И ОХ»*,
Й ■ Олеум ' ^' СТММ^Ы ;:^: Макросы
^■.Зигтгоы
7И ОХ»*,
Й ■ Олеум ' ^' СТММ^Ы ;:^: Макросы
Создание таблицы в режиме конструктора Создание гзбпмцы с помощью мастера Создание таблицы путем ввода дажых ТЫ_Клменты 1Ы_ГЪз сенцие пьнь-е.
Создание таблицы в режиме конструктора Создание гзбпмцы с помощью мастера Создание таблицы путем ввода дажых ТЫ_Клменты 1Ы_ГЪз сенцие пьнь-е.
aJfcteWhu V
aJfcteWhu V
Рис. 2.16. Установка атрибута Скрытый
Рис. 2.16. Установка атрибута Скрытый
: S3
: S3
' rtryr»w " ' Pip иубрлнное
' rtryr»w " ' Pip иубрлнное
.клиенты
.клиенты
ства, открыв тем самым одноименное окно (рис. 2.16). Установка флажка Атрибуты: скрытый приведет к исчезновению объекта из окна базы данных.
Для включения отображения скрытых объектов надо просто установить флажок Скрытые объекты в области Отображать вкладки Вид диалогового окна Параметры, как это ранее было показано на рис. 2.14. Заметьте, что, присвоив именам объектов префикс Usys и установив для них атрибут Скрытый, вы становитесь чуточку хитрее и опаснее для окружающих. Если объекты не видны, это не означает, что их вовсе не существует!
Трюк в трюке
Хотя в данном трюке рассматривался способ сокрытия таблиц, позволяющий уберечь не предназначенные для всеобщего обозрения данные от пользовательского доступа, вы можете установить атрибут Скрытый для всех объектов базы данных, в результате при просмотре вкладок окна базы данных никто абсолютно ничего не увидит. Присвоив имени стартовой формы префикс Usys, вы сможете получить полностью работоспособное приложение. Переименовав соответствующим образом все объекты базы данных, вы можете создать готовое приложение без единого видимого объекта во вкладках окна базы данных. Безусловно, объекты становятся видимы во время открытия, но при соблюдении определенных мер отстранения пользователей от элементов базы данных вы сможете распространять «невидимые» базы данных.
ТРЮК№17ТРЮК№17Имитация табличных триггеров
ТРЮК
№17
ТРЮК
№17
Включение в приложения Access возможностей, схожих с имеющимися в SQL Server или Oracle.
Ни Access 2003, ни более ранние версии не поддерживают события в таблица!. Триггер представляет собой событие в таблице, возникающее при операциях вставки, редактирования или удаления, которое можно обработать с помощью собственной функции. Примером полезного применения может послужить обработк i события редактирования до сохранения его результатов с целью организации хранения прежнего состояния данных, то есть для помещения прежней версии записи в резервную таблицу. Таким образом, сохранится возможность провести ревизию изменения данных. Если но каким-то причинам возникнут проблемь , связанные с изменением данных, всегда можно будет вернуться к их первоначальному варианту.
Та же логика применима и к удалениям. Используя триггеры, вы можете вклиниться в процесс удаления и поместить данные в архив, вместо того чтобы потерять их безвозвратно. В случае вставок (когда в таблицу добавляется новая запись) вы можете перепроверить данные, прежде чем позволить им попасть в таблицу.
К сожалению, Access нс позволяет совершать подобные действия напрямую, пр [ работе непосредственно с таблицами. Но вы можете проделывать то же самое, работая с таблицами из форм. В формах можно обрабатывать множество событий, получая гот же результат, что и при использовании настоящих триггеров, и > работая при этом вместо таблиц с формами.
Ведение контрольного журнала
Чтобы показать этот механизм в действии, создадим в базе данных еще одну таблицу для зеркального отображения существующей таблицы данных и ведения контрольного журнала изменений, вносимых в таблицу. Осуществим задуманное, добавив два дополнительных поля: одного — для хранения типа операции, а другого — для хранения времени ее проведения. На рис. 2.17 показаны две таблиць : таблица данных (1Ы_Клиенты) и таблица, предназначенная для хранения записе i первой таблицы в том состоянии, в котором они находились до внесения изменений или удаления (1Ы_Клиенты_контрольный_журнал).
Обратите внимание на следующие особенности:
Таблица журнала содержит два дополнительных поля: Операция и Время„опе- рации.
Если для таблицы данных поле КлиентЮ является первичным ключом, то для таблицы журнала оно преднамеренно таким ключом не является. Так сделан) потому, что в таблице журнала может содержаться несколько записей, относящихся к одному и тому же клиенту (и с одним и тем же значением поля КлиентЮ).
Рис. 2.17. Использование таблицы контрольного журнала для хранения записей
Отслеживание событий формы
Теперь вы можете воспользоваться стандартной формой для просмотра записей, их добавления, редактирования и удаления из таблицы данных. На рис. 2.18 показана обычная форма, имеющая в качестве источника записей таблицу tbl_ Клиенты.
Фамилия
Клиенты
Имя
Отчество
Город
Адрес
' Индекс
| Тед от се
[Александр
(Николаевич
[Самара
[Т ащкеигская 23-41
|W1ZZ
(Семенов
{Петр
(Сергеевич
(Смопенок
(Фрунзе 12-9
(214001
[Астахов
(Николай
(Петрович
(Кемерово
(Волошта 56^34
(629083
[Березкин
(Андрей
(Викторович
[Алек мнаров
(Энтузиастов 2 35
|ЫП60О
[Дмитриев
(Василий
[Михайлович
(Иваново
(Громобоя 22-19
|15Э0(й
(Петров
(Алексей
(Семенович
(Сарое
(Юности 11-7
(607190
[Матвеев
(Виктор
[Петрович
(Екатеринбург
' |Т екническая 31 -18
1620030
[ ►
jCjxapeE
(Владимир
[Иванович
(Кострома
[Мира 12-67
[1560SS
[Антонов
(Семен .
[Петрович
(Улан-Удэ
[Жукова 10-5
ДбТфМ
™> о$Ш1
Рис. 2.18. Операции вставки, обновления и удаления могут осуществляться с помощью формы
Разумеется, форма содержит встроенный программный модуль, обрабатывающий два события: До обновления и Удаление. Обработчиком события До обновления обслуживаются и вставки, и обновления, а обработчик события Удаление работает только по прямому предназначен ню, В частности, при вставке новых данных обработчик события До обновления проверяет приемлемость данных (то есть, скажем, наличие фамилии). Если данные не пройдут проверку, свойство Cancel будет установлено в True, что приведет к отмене события.
В процессе обновления (редактирования) завись, подвергаемая изменениям, сначала копируется в таблицу журнала, то есть сохраняется в нем в своем прежнем виде. Перед удалением запись также попадает в таблицу журнала.
Код
Этот код должен быть помещен во встроенный программный модуль формы. Поле Операция таблицы журнала получает одно из двух значений: Обновленке или Удаление. Оба обработчика событий используют одну общую функции (build_sql):
Private Sub Form_BeforeUpdate(Cancel As Integer)
On Error Goto err_end
Dim ssql As String
Dim conn As ADODB.Connection
Set conn = Currentproject.Connection
If NewRecord - False Then
ssql = build_sql(КлиентЮ, "Обновление")
conn.Execute ssql
conn.Close
Set conn = Nothing
Else
If IsNull(ClientLastName) Or ClientLastName = "* Then MsgBox "Нужно ввести фамилию" Cancel = True
End If
End If
Exit Sub
err_end:
MsgBox Err.Description
End Sub
Private Sub Form_Delete(Cancel As Integer)
On Error GoTo err_end
Dim ssql As String
Dim conn As ADODB.Connect!on
Set conn = Currentproject.Connection
ssql = bui ld_sql (КлиентЮ. "Удаление")
conn.Execute ssql
Exit Sub
err_end:
MsgBox Err.Description
End Sub
Function build_sql(client_id As Long, operation As String) As String build_sql = "Insert Into 1Ы_Клиенты_контрольный_журнал Values (" build_sql = build_sql & КлиентЮ & ", " build_sql = build_sql & & _
DLookup("Фамилия", ntbl—Клиенты", "КлиентЮ=" &_ client_id) & “”, " build_sql = build_sql & """ &_
DLookup("Имя", "1Ы_Клиенты", "Клиент10=" & _ client_id) & "". " bu1ld_sql - build_sql & & _
DLookup("Отчество", НЬ1_Клиенты", "КлиентЮ=" & client—id) & "". " build_sql = build_sql & & _
DLookup("Адрес", "1Ь1_Клиенты", "Клиент10=" &_ client_id) &"
build_sql = build—sql & '"'" &_
DLookup("Город". "1Ы_Клиенты", "Клиент1С=” & _ cl1ent_id) & "", " build_sql = build_sql & & _
DLookup ("Почтовыйиндекс", " 1Ы_Клиенты", "Клиент10=” &_ client_id) & "" , "*
build_sql = build_sql & & _
DLookup("Телефон", " 1Ы_Клиенты", "Клиент10=" & _ client Ш) & "“, "
build-Sql = build_sql & & operation & "". "
build_sql = build_sql & "dr & Nom( ) & "#)"
End Function
Выполнение кода
Код выполняется в том случае, когда в форме совершаются операции вставки, обновления и удаления. При этом никаких особых дополнительных действий — скажем, щелчков на кнопке — нс требуется. Журнал ведется во время работы пользователей. В журнальной таблице регистрируются все изменения и даже хранятся многократные изменения, произведенные в записи клиента. Функция build_sql формирует команду SQL Insert. В эту команду, в зависимости от функции, осуществившей вызов (и передавшей в виде аргумента слово «Обновление» или «Уда-ление»), включается в качестве одного из регистрируемых параметров либо Обновление, либо Удаление. Строка, содержащая команду SQL, возвращается в функцию, осуществившую вызов, а затем эта функция выполняет команду на вставку данных.
Все это может пригодиться на практике. Например, клиент переехал (изменился адрес) или вступил в брак (изменилась фамилия), переметнулся к конкуренту (его запись нужно удалять) и т. д. На рис. 2.19 показана таблица регистрационного журнала, содержащая несколько записей. В каждой записи отражена операция и время ее проведения.
■ *-V4*W<№¥йу^^^у^ё^м™»W■ *-V4*W<№¥йу^^^у^ё^м™»W' ^Кл^^Т^УДЦи'лнТ! . tТмй~и^ЦрЛ^т^ЕДйр' jАдре<; ' ‘^П°'чТР«1^^'нД^]^'7е^^й"~^?^Й^зц1к^' ^Кл^^Т^УДЦи'лнТ! . tТмй~и^ЦрЛ^т^ЕДйр' jАдре<; ' ‘^П°'чТР«1^^'нД^]^'7е^^й"~^?^Й^зц1к^9 Матвеев Виктор Петрович Екатеринбург Техническая 31-16 62СС939 Матвеев Виктор Петрович Екатеринбург Техническая 31-16 62СС9390; СухаревВладимир ИвановичКостромаМира 12-6790 Сухарев Влади мир , _ ИвановичКостром»Мнр а 12-6790; СухаревВладимир ИвановичКостромаМира 12-6790 Сухарев Влади мир , _ ИвановичКостром»Мнр а 12-67106 Семенов Петр106 Семенов Петр117 Астахов117 АстаховСергеевич Смоленск. Фрунзе 12-9Сергеевич Смоленск. Фрунзе 12-9156055156065214001156055156065214001(342)3854267 Обновление 1210.200517 42 00:(342)3854267 Обновление 1210.200517 42 00:(0942)245537 i Обновление 13 10 2005 16.13 СС< (0942)245537 О бнОеленив 14 10 2005 11:32.00;(0942)245537 i Обновление 13 10 2005 16.13 СС< (0942)245537 О бнОеленив 14 10 2005 11:32.00;Николай Петрович КемеровоВолошина £6-3 4629001Николай Петрович КемеровоВолошина £6-3 4629001(08122)67326 ; Удаление10 10 2005 15' 23 ОО;(08122)67326 ; Удаление10 10 2005 15' 23 ОО;(3642)379219 каление 16 10 2006 15 -18.00:(3642)379219 каление 16 10 2006 15 -18.00:
■ *-V4*W<№¥йу^^^у^ё^м™»W
■ *-V4*W<№¥йу^^^у^ё^м™»W
' ^Кл^^Т^УДЦи'лнТ! . tТмй~и^ЦрЛ^т^ЕДйр' jАдре<; ' ‘^П°'чТР«1^^'нД^]^'7е^^й"~^?^Й^зц1к^
' ^Кл^^Т^УДЦи'лнТ! . tТмй~и^ЦрЛ^т^ЕДйр' jАдре<; ' ‘^П°'чТР«1^^'нД^]^'7е^^й"~^?^Й^зц1к^
9 Матвеев Виктор Петрович Екатеринбург Техническая 31-16 62СС93
9 Матвеев Виктор Петрович Екатеринбург Техническая 31-16 62СС93
90; СухаревВладимир ИвановичКостромаМира 12-67
90 Сухарев Влади мир , _ ИвановичКостром»Мнр а 12-67
90; СухаревВладимир ИвановичКостромаМира 12-67
90 Сухарев Влади мир , _ ИвановичКостром»Мнр а 12-67
106 Семенов Петр
106 Семенов Петр
117 Астахов
117 Астахов
Сергеевич Смоленск. Фрунзе 12-9
Сергеевич Смоленск. Фрунзе 12-9
156055
156065
214001
156055
156065
214001
(342)3854267 Обновление 1210.200517 42 00:
(342)3854267 Обновление 1210.200517 42 00:
(0942)245537 i Обновление 13 10 2005 16.13 СС< (0942)245537 О бнОеленив 14 10 2005 11:32.00;
(0942)245537 i Обновление 13 10 2005 16.13 СС< (0942)245537 О бнОеленив 14 10 2005 11:32.00;
Николай Петрович КемеровоВолошина £6-3 4629001
Николай Петрович КемеровоВолошина £6-3 4629001
(08122)67326 ; Удаление10 10 2005 15' 23 ОО;
(08122)67326 ; Удаление10 10 2005 15' 23 ОО;
(3642)379219 каление 16 10 2006 15 -18.00:
(3642)379219 каление 16 10 2006 15 -18.00:
Рис. 2.19. Каждая запись перед изменением или удалением попадает в таблицурегистрационного журнала
Метод, применяемый в данном трюке, имитирует все то же самое, что предоставляется SQL Server, Oracle и другими системами управления базами данных пр 1 использовании триггеров. Не стоит позволять элите мира баз данных считать, чтз Access в чем-то им уступает!
В таблице клиентов и таблице регистрационного журнала содержится множеств з записей и благодаря замечательному свойству регистрации времени сохраняете г вся последовательность их изменений.
Трюк в трюке
Данный трюк был написан с учетом того, что о структуре таблицы и о типе ее полей уже все известно. Поэтому я заранее знал, где расставлять одинарные кавычки вокруг текстовых значений в функции build_sql. Адаптируя этот трю< к собственным нуждам, возможно, вы заранее будете знать, какие типы данны < следует ожидать, но если это не получится, то для определения тина данных вы можете обратиться к библиотеке ADOX. Эта библиотека предоставляет способ сканирования всех полей таблицы и определения их типов (впрочем, как и все< других свойств). Вот стандартная процедура сканирования отдельной таблицы и получения имен и типов каждого поля:
Sub get_fields( )
Dim cat As ADOX.Catalog
Set cat = New ADOX.Catalog
Dim fid As ADOX.Column
cat.ActiveCohnection = CurrentProject.Connect!on
For Each fid In cat.ТаЫе5("1Ы_Клиенты")-Columns
Debug.Print fid.Name & " " & fid.Type
Next
Set cat = Nothing
End Sub
Учтите, что для использования библиотеки ADOX вы должны установить с ней связь. Для этого, впрочем, как и для установки любых других связей, необходимо перейти в редактор VB и воспользоваться командой меню Tools ► References, с по-
Рис, 2.20. Установка связи с библиотекой ADOX
мощью которой вы сможете открыть диалоговое окно References (рис, 2.20). Библиотека называется Microsoft ADO Ext. 2.7 for DDL and Security. Установите флажок, расположенный напротив этого имени и, чтобы закрыть окно, щелкните на кнопке ОК.
Процедура возвратит для каждого типа поля числовую константу. Например, значение 202 относится к текстовому полю (хотя на малопонятном жаргоне ADOX это число сопоставлено с символьным нолем переменной длины — adVarWChar). Чтобы узнать значения этих чисел, нужно просмотреть в Object Browser (браузере объектов) коллекцию констант DataTypeEnum Эта коллекция станет доступной только после установки связи с библиотекой ADOX. На рис. 2.21 показан браузер
Рис. 2.21. Обзор констант типов данныхРис. 2.21. Обзор констант типов данных
Рис. 2.21. Обзор констант типов данных
Рис. 2.21. Обзор констант типов данных
объектов, настроенный на обзор списка констант типов данных. В нижней области окна браузера отображается числовое значение выделенной константы.
Используя структуру Select Case или набор операторов If со вставками числовых кодов ADOX, взятых из этой области, вы сможете написать процедуру, которая не будет опираться на предварительные сведения о типах полей.
ТРЮК№18ТРЮК№18Ускоренное создание таблиц
ТРЮК№18
ТРЮК№18
Оптимизация конструктора таблиц путем выбора подходящих параметров по умолчанию.
Текстовое поле состоит из 50 символов. Числовому полю по умолчанию присваивается тип Длинное целое со значением 0. Знакомо, не правда ли? Часто ли вам приходится отвлекаться на изменение этих установок? А вот если вы воспользуетесь этим трюком, то больше не придется.
В диалоговом окне Параметры (Сервис ► Параметры) на вкладке Таблицы и запросы вы найдете элементы управления, с помощью которых можно задать такие установки по умолчанию, как размер текстового поля, размер числового поля (целое, длинное целое, одинарное с плавающей точкой и т. д.) и даже тип поля по умолчанию. На рис. 2.22 показано это диалоговое окно с примерами установок.
Рис. 2,22. Изменение значений по умолчанию для полей
На рис. 2.22 размер текстового поля по умолчанию был изменен на 100. Значит, если в конструкторе таблиц будут добавляться новые текстовые поля, их размер по умолчанию будет устанавливаться в 100 символов. Размерность числового поля была также изменена на Одинарное с плавающей точкой. При добавлении нового числового поля оно по умолчанию будет иметь именно такую размерность. Тип поля по умолчанию был изменен на Числовой, поэтому при добавлении в конструкторе таблиц нового поля его тип по умолчанию будет установлен в Числовой, а размерность — в Одинарное с плавающей точкой.
Выбор новых значений по умолчанию может оказаться весьма полезным. К прг ■ меру, если вы создаете таблицу, которая в основном содержит даты, установите значение типа поля по умолчанию в Дата/время, и вам не придется постоянно выбирать тип поля. Все вновь вводимые поля будут иметь по умолчанию тип Дата/ время. Вам нужно будет скорректировать свойства только некоторых полей, не относящихся к данному типу.
Установка значений по умолчанию
В настройках диалогового окна Параметры можно установить типы полей, но нельзя установить значение по умолчанию. Иначе говоря, вы можете выбрать тип числе ■ вого поля Одинарное с плавающей точкой, но не можете назначить ему значение пэ умолчанию 1,25 (к примеру) для всех новых записей, добавляемых в таблицу.
Тем не менее настроечный параметр, в котором можно указать значение поля ла умолчанию, все же существует. На рис. 2.23 для поля, обозначенного в третьей строчке создаваемой таблицы, вручную было установлено значение 1.25, и именно оно станет его значением по умолчанию.
Рис. 2.23. Установка для поля значения по умолчанию
Код
А что, если сотня других полей нуждается в установке такого же значения по умолчанию? Мои пальцы начинают болеть только при мысли о предстоящем ручном вводе! Автоматизация этой задачи позволит спасти жизнь или, по крайней мере, пальцы. Спасение заключается в небольшом кодовом фрагменте:
Sub change_field_defsuits( )
Dim cat As ADOX,Catalog
Set cat = New ADOX.Catalog
Dim fid As ADOX.Column
cat.ActlveConnection = CurrentProject.Connection
For Each fid In cat.Tables("мояНоваяТаблица").Columns
If fid.Type = adSingle Then
fid.Properties("Default").Value = 1.25
End If
Next
Set cat = Nothing
End Sub
В этом фрагменте для работы с полями указанной таблицы использована библиотека ADOX (см. трюк № 17). В данном примере имя таблицы указано внутри процедуры, но оно, конечно же, может быть передано и в виде аргумента. В данном программном примере сканируются все поля, и сели встречается поле с числовым типом Одинарное с плавающей точкой (выявляемое с помощью константы adSingle), его значение по умолчанию устанавливается в 1,25.
Вы можете дополнить эту процедуру фрагментами установки значений по умолчанию для всех возможных типов ноле)!. Более того, вы можете установить значения по умолчанию для комбинаций типов полей и имен полей. Например, поте с именем locaHate может иметь числовой тип Одинарное с плавающей точкой, и в я сможете установить для пего значение по умолчанию 0,25; точно так же вы може те установить значение по умолчанию равным 0.5 для поля с именем national_raie и таким же числовым типом данных.
ГЛАВА 3
Ввод данных и перемещение по элементам управления
Трюки № 19-27
Успех приложения зависит от признания пользователей. Осознав эту истину, стоит подумать, как сделать интерфейсную часть приложения приятнее на вид и удобнее в работе.
Порой на впечатления пользователя от работы с приложением не обращается никакого внимания. Разработчики тратят уйму времени, создавая поля и таблицы, устанавливая связи, придумывая хитрые SQL-команды и т. д. Думаете, для рядового пользователя все это что-нибудь значит? Ровным счетом ничего!
Давайте посмотрим правде в глаза. Access — это больше, чем просто база данных. Эта система, ко всему прочему, обладает встроенными средствами разработки интерфейса. Конечно, таблицы являются ядром базы данных, ио создание форм и отчетов — основное предназначение инструментального комплекса. У системы Access имеются обе составляющие, поэтому нужно постараться успешно разработать каждую из них.
Трюки этой главы подбирались в расчете на обычного пользователя, основным занятием которого считается ввод данных, и предназначены для того, чтобы сделать это нудную и утомительную работу хоть чуточку приятнее.
ТРЮК№19ТРЮК№19Упрощенное перемещение по длинным формам
ТРЮК
№19
ТРЮК
№19
Использование элемента управления Разрыв страницы и кнопок управления, избавляющих пользователя от прокрутки длинных форм ввода данных.
Информация — вещь замечательная. Чем больше вы знаете, тем больше сможете сделать и спланировать, если только вы не застряли на этапе ввода данных. Тогда все, что вы можете спланировать, — это постучать по клавишам и поводить указателем мыши по экрану.
На рис. 3.1 показана очень длинная форма ввода информации. Эта форма содержит столько полей ввода, что они не помещаются на одном экране, о чем свидетельствует полоса прокрутки справа. При работе с такой формой до нижних полей приходится добираться с помощью полос прокрутки или клавиш перехода.
Рис. 3.1. Форма, перегруженная полями вводаРис. 3.1. Форма, перегруженная полями ввода
Рис. 3.1. Форма, перегруженная полями ввода
Рис. 3.1. Форма, перегруженная полями ввода
СОВЕТ
Если форма содержит большое количество элементов управления, лучше всего при ■ менить вкладки. Но данный трюк продиктован реальной жизненной ситуацией. Однажды я работал над проектом, где операторы должны были вводить данные со стандартных форм, и экран ввода информации должен был структурно соответство вать именно этим формам.
Клавиши Page Up и Page Down помогают прокручивать форму, но задать количе ство прокручиваемых строк вы не можете. Шансы на то, что при использовании клавиши Page Up или Page Down форма будет устанавливаться в нужном положе пии, крайне малы.
Но способ останавливать форму в нужном положении все же есть. Для этого требуется всего лишь вставить в форму элементы управления Разрыв страницы. Вы не знаете, что это такое? На рис. 3.2 отображена панель инструментов с указателем установленным на элемент управления Разрыв страницы. Размещая в соответствие с общим замыслом разрывы страниц в конструкторе форм, вы получите управляемую прокрутку при использовании клавиш Page Up и Page Down.
Рис. 3.2. Элемент Разрыв страницы на панели инструментов
На рис. 3.3 форма изображена в режиме конструирования. Элемент управления Разрыв страницы был помещен прямо над группой элементов Личные данные. Выглядит этот элемент в режиме конструирования весьма скромно, в виде ряда точек. В режиме просмотра он и вовсе становиться невидимым.
Рис. 3.3. Добавление элементов Разрыв страницы
Теперь, при использовании клавиши Page Down, прокрутка будет останавливаться в том месте, где находится Разрыв страницы. На рис. 3.4 показано, как при прокрутке форма остановилась в начале группы элементов Личные данные.
Управляемый переход
Использование клавиш Page Up и Page Down — неплохой способ прокрутки формы, но можно сделать кое-что получше. Представьте, что форма содержит несколько разделов и вам нужно иметь к ним произвольный доступ. Многократно нажимать клавишу Page Up или Page Down для того, чтобы добраться до нужного раздела, — крайне нерациональное занятие. Для решения этой задачи вы можете разместить ряд кнопок управления в заголовке или в примечании формы. И заголовок, и примечание всегда на виду, поскольку прокрутка их не касается. На рис. 3.5 показана форма в режиме конструирования. В ее заголовке размещены кнопки управления для мгновенного перехода к нужным разделам.
Код
Рис. 3.4. Управляемая прокрутка
Рис. 3.5. Кнопки, облегчающие переход к разделам формы
Трюк состоит в том, что обработка события щелчка на каждой кнопке генерирует имитацию нажатия клавиш Page Up и Page Down. Достигается это использованием
оператора SendKeys. Каждая из четырех новых кнопок, размещенных в форме, инициирует работу серии операторов SendKeys:
Private Sub сгпЬ_Место_работы_С1ick( )
' 4 раза вверх, 1 вниз
переходы 4. 1
End Sub
Private Sub стЬ^Личные^данные^!ick ()
' 4 раза вверх. 2 вниз
переходы 4, 2
End Sub
Private Sub стб_Подробности_общения_С11ck( )
' 4 раза вверх. 3 вниз
переходы 4, 3
End Sub
Private Sub cmd_3aказы_Click( )
' 4 раза вверх, 4 вниз
переходы 4, 4
End Sub
Sub переходы(и As Integer, d As Integer)
For вверх = 1 To u SendKeys "{PGUP}"
Next вверх
For вниз = 1 To d
SendKeys "{PGDN}"
Next вниз
End Sub
Процедура обработки каждого щелчка генерирует определенное количество мнимых нажатии клавиш Page Up и Раде Down, которое требуется для прокрутки формы к нужному разделу. Эта имитация нажатия клавиш приводит к переходам на элементы Разрыв страницы, ранее расставленные в форме. По щелчку на кнопке программа сразу же посылает четыре имитации нажатия клавиши Page Up. Это число обусловлено количеством разделов в данном примере. Тем самым обеспечивается переход в начало формы. Конечно, четыре имитации нажатия клавиши Page Up на самом деле требуются только в том случае, если форма находится на последней метке Разрыв страницы, но зато это число приводит к нужному результату независимо от текущего положения формы.
Затем код имитирует уже конкретное число нажатий клавиши Page Down, Это число для всех кнопок разное и зависит от расположения раздела, к которому нужно перейти. Иными словами, кнопка Место работы имитирует одно нажатие клавиши Page Down, кнопка Личные данные — два, и т. д.
Использование данного приема позволяет перейти к любому разделу длинной формы одним щелчком, избавляя пользователя от прокрутки всей формы.
ТРЮК№ 20ТРЮК№ 20Упрощение ввода дополнительного текста
ТРЮК
№ 20
ТРЮК
№ 20
Установка текстового курсора в конце текста, имеющегося в поле, в целях немедпеннс- го ввода дополнительной информации.
Этот прием часто и незаслуженно игнорируется. Вы когда-нибудь, работая сданными формы, замечали, что при переходе к любому полю в нем выделяется веса текст? А ведь это обстоятельство может привести к случайной перезаписи данных. На рис. 3.6 показано полностью выделенное ноле адреса. Теперь предположим, что вам нужно дополнить поле данными (а не переписать его содержимое), для этого потребуется переместить указатель мыши в конец текста и щелкнуть клавишей, чтобы снять выделение.
Рис. 3.6. Автоматическое выделение данных создает угрозу их случайного удаления или перезаписиРис. 3.6. Автоматическое выделение данных создает угрозу их случайного удаления или перезаписи
Рис. 3.6. Автоматическое выделение данных создает угрозу их случайного удаления или перезаписи
Рис. 3.6. Автоматическое выделение данных создает угрозу их случайного удаления или перезаписи
Не плохо было бы обойтись без этого щелчка, снимающего выделение, тем более что есть подходящий способ, не требующий глубоких познаний в программировании.
Многие элементы управления, включая поля, имеют событие Вход, которое возникает при щелчке на элементе управления или при переходе к этому элементу. В процедуру обработки события можно поместить код, устанавливающий курсор в конец строки еще до того, как появится доступ к вводу данных. Следующий фрагмент кода относится к элементу управления Адрес_организации1: Private Sub Адрес_организации1_Еп1ег( )
Dim длина_текста As Integer
длина_текста = 1ел(Ме. Адрес_организации1)
Me. Адрес_организации!.SelStart = длина_текста
End Sub
Функция Len определяет длину текста, которая затем передается свойству SelStart. Все предельно просто.
При необходимости подобную процедуру можно добавить в программные модули всех полей формы. Решение, куда именно поместить такой код, остается за вами, поскольку только вы можете определить, где в приложении данные чаще всего переписываются и где в поля не вводится дополнительный текст. В данном примере дополнение было внесено в первое адресное поле (рис. 3.7).
Рис. 3.7. Дополнительная информация, не предназначенная для замены существовавшего текста
Свойство SelStart не одиноко в своем семействе, существуют еще два свойства: Sellength и SelText. Все три свойства, касающиеся выделенного текста, вместе или порознь, предоставляют неплохую возможность для обработки текста, содержащегося в полях и полях со списком.
Мы уже показывали, как использовать свойство SelStart для установки текстового курсора на место ввода текста. Но однажды мне нужно было предоставить пользователю простой способ менять местами в наборе записей имена и фамилии. Там порой попадались и инициалы, и отчества, в общем, вариантов было достаточно. Если вам приходилось когда-нибудь создавать процедуру обработки имен, то вы поймете, что все предусмотреть совсем не просто.
Нов данном случае перестановку требовалось проводить только время от времени, поэтому создавать сложную, универсальную процедуру нс имело смысла. Вместо этого я воспользовался свойствами выделенного текста, а часть работы оставил за пользователем. Вот как все это работало.
Я поместил фамилии и имена деловых партнеров, требующие перестановки, в форму, представленную на рис. 3.8.
Дорошенко А ВЛазарев Алексей Харитонов К. Н__ Заварзин Роман Дмитриевич ,Дорошенко А ВЛазарев Алексей Харитонов К. Н__ Заварзин Роман Дмитриевич ,: Бурлаков Антон _Терентьев ПА ,: Бурлаков Антон _Терентьев ПА ,Рис. 3.8. Фамилии и имена, требующие перестановкиРис. 3.8. Фамилии и имена, требующие перестановкиАстахов Николай Петрович Березкин АндрейВикторойич Дмитриев Василий Петров Алексей Се;
Дорошенко А В
Лазарев Алексей Харитонов К. Н
__ Заварзин Роман Дмитриевич ,
Дорошенко А В
Лазарев Алексей Харитонов К. Н
__ Заварзин Роман Дмитриевич ,
: Бурлаков Антон _
Терентьев ПА ,
: Бурлаков Антон _
Терентьев ПА ,
Рис. 3.8. Фамилии и имена, требующие перестановки
Рис. 3.8. Фамилии и имена, требующие перестановки
Матвеев Виктор Пе Сухарев Владимир Антонов Семен Пет Симонов АП.
Фиников Николай
Пользователь выделял имя, инициалы или имя и отчество и т, и., а затем нажима; клавишу Tab или Enter (рис. 3.9).
ИЗ 4/,ИЗ 4/,тт&Т®тт&Т®И мя_обр чтившегося
ИЗ 4/,
ИЗ 4/,
тт&Т®
тт&Т®
Федотов Александр Николаевич Семенов Петр
Астахов Николай ПетровичАстахов Николай ПетровичБерезкин Анд рей Ви кторови ч Дмитриев $535ЯЕ
Астахов Николай Петрович
Астахов Николай Петрович
П втро в Ал ексей С ем е но вин ,, Матвеев Виктор Петрович Сухарев Владимир Иванович Антонов Семен Петрович Симонов АП.
Фиников Николай
Самохин Александр Иванович
Дунаев Юрий
Леров Саша
Александров Владимир Сергеевич Дорошенко А В Лазарев Алексей Харитонов К Н _ ,
Заварзин, Роман Дмитр и ев ич Бурлаков Антон Терентьев ПА
у^^-ВПаЛу^^-ВПаЛРис. 3.9. Выделенное имя
у^^-ВПаЛ
у^^-ВПаЛ
Вот и все, что от него требовалось! Все остальное приводилось в действие за счет свойств выделенного текста при обработке события Выход, относящегося к тек-
стоврму полю. В примере использовано поле под названием Имя,обратившегося. Рассмотренная ранее процедура обработки события Вход также нашла свое применение в этом примере:
Private Sub Имя_обратившегося_Еп1ег( )
1 Снятие выделения
'и установка тектового курсора в конец текста
Dim длина_текста As Integer
длина^текста - Len(Имя—обратившегося)
Имя_обратившегося.SelStart = длина_текста End Sub
Private Sub Имя_обратившегося_Ех11(Cancel As Integer)
'Если есть выделенный текст и он
'короче, чем весь текст, то
’если выделение начинается не с первого символа, то
'переместить выделенную часть текста в начало
Dim новый_текст As String
If Имя_обратившегося.Sellength > 0 And _
Имя_обратившегося.Sellength < 1еп(Имя_обратиешегося) Then
If Имя_обратиешегося.SelStart > 1 Then
новый_текст = Имя_обратившегося.SelText & " " & _
Left(Имя_обратившегося, ten(Имя_обратившегося) - _
Имя_обрати0шегося.Sellength)
Имя_обратившегося.Text = Тг1т(новый_текст)
End If
End If End Sub
Процедура обработки события Вход снимает для удобства дальнейшей работы первоначальное выделение текста. Пользователь выделяет имя, или имя и отчество, или инициалы, если они есть, а затем выходит из поля по клавише Tab или
Имч_о6ругие^егося:Имч_о6ругие^егося:■Александр Николаевич Федотов
Имч_о6ругие^егося:
Имч_о6ругие^егося:
Петр Семенов
Николай Петрович Астахов
Андрей Викторович Березкин
Василий Дмитриев
Алексей Семенович Петров Виктор Петрович Матвеев
Вл адимир Иванов и ч Сухарев
Семен Петрович Антонов
А. Л Симонов
Николай Фиников
Александр Иванович Самохин
Юрий Дунаев
Саша Перов
Владимир Сергеевич Александров
А В Дорошенко
Алексей Лазарев
К.Н Харитонов
Роман Дмитриевич Заварзин
Антон Бурлаков
П.А. Терентьев ,
^430
КТЗеЬОКМщЙйтаЯ^КГ KgCTSftfttffrWgjgAlft ХКЯ - л ГЯ “-"" " Г?"."..XW2 Л2Л"
Рис. 3.10. Все имена и фамилии переставлены местами
нажимает клавишу Enter. В результате возникает событие Выход, при обработке которого текст проверяется на наличие выделения, на то, что оно не совпадает с длиной всего текста, и на то, что оно начинается не с первого символа.
Затем процедура меняет местами выделенную и невыделенную части текста (фл- милию и имя) и возвращает их текстовому полю. Результат показан на рис. 3.10. В процедуре использованы все три свойства выделенного текста: $е (Start, SelLength и SeLText. Эти свойства дают все необходимое для работы с выделенными фра > ментами текста. Но если сравнивать их с родственными свойствами и методами обработки простого текста — Text, Len, Left, Right, Mid и т. д., то можно заметить, что предоставляемые ими возможности по обработке текста весьма скромны.
ТРЮК№21ТРЮК№21Предоставление возможности добавления собственных значений в существующие списки
ТРЮК
№21
ТРЮК
№21
Снятие ограничений на выбор значения только из предопределенных элементов списка путем добавления процедуры обработки новых значений.
При работе с формами пользователям нередко приходится выбирать одно из пре - допределенных значений из поля со списком. Но иногда может возникнуть нс- требность ввести в эго поле отсутствовавшее ранее значение. К примеру, во время работы с данными нового клиента, еще нс занесенного в соответствующую таблицу, или при исправлении значения, внесенного в список с ошибками.
Свойство Ограничиться списком управляет разрешением па ввод в поле со списком нового значения. Если свойство имеет значение Нет, пользователь может- ввести в это поле новое значение. Все бы хорошо, но есть одно «но*: если нужно дополнить список новым значением, то простой ввод его в поле не приведет к желаемому результату. Если нужно дать возможность пользователям приложения дополнять источник данных поля со списком, следует воспользоваться другой технологией. Сначала установите значение свойства Ограничиться списком в Да. (Тогда ввод нового значения будет запрещен, но оно будет считываться!) Суть данного трюка заключается во включении нового элемента в процессе обработки события Отсутствие в списке, а это событие возникает только при включенном со стоянии свойства Ограничиться списком.
На рис. 3.11 показана форма в режиме конструирования. Эта форма содержит поле со списком, а рядом с ней изображена таблица с перечнем свойств этого ноля, в которой значение свойства Ограничиться списком установлено в Да.
При попытке пользователя добавить новое значение в поле со списком возникает событие Отсутствие в списке. А новое значение добавляется к списку в процессе обработки этого события.
Код
Код процедуры не отличается сложностью. В процедуру обработки события передаются два аргумента: NewData и Response. Аргументы вам создавать не нужно это делается автоматически:
Рис. 3.11. Свойство «Ограничиться списком», установленное в *Да»
Private Sub стЬ_Клиенты_№11пИstCNewData As String, _ Response As Integer) Dim ctl As Control Set ctl = Me.стЬ^Кпиенты Response = acDataErrAdded ctl.RowSource = ctl.RowSource & ";" & NewData
End Sub
Значение, присваиваемое переменной Response, определяет для Access характер последующих действий. В данном случае введенное значение будет добавлено к списку. Это достигается присвоением переменной Response значения константы acDataErrAdded. После этого новое значение (содержащееся в аргументе NewData) будет добавлено к источнику строк.
Трюк в трюке
Пока в данном трюке был использован источник строк типа Список значений. Но если в этом качестве выступает Таблица или запрос, то вам следует дополнить процедуру командой на добавление нового значения к основному источнику данных. Тогда процедура обработки события Отсутствие в списке дополнит новым значением исходную таблицу.
В коде измененной процедуры предполагается, что исходная таблица называется 1Ь1_Способыдоставки, а поле этой таблицы — СпособДоставим:
Private Sub стЬ_Способ_доставки_МоНп11st(NewData As String. _ Response As Integer)
Dim новые_данные As String
Dim conn As ADODB.Connection
Set conn = Currentproject.Connection
'удвоение всех апострофов перед операцией Insert
новые^данные = Replace(NewData. "1" , )
Response = acDataErrAdded
conn.Execute "Insert Into " &_
" ТЫ_Способы_доставки (СпособДоставки) ValuesC & новые_данные & ’")"
End Sub
ТРЮК№ 22ТРЮК№ 22Приемы заполнения и сортировки списков
ТРЮК
№ 22
ТРЮК
№ 22
Использование трех необычных методов для заполнения и сортировки списков.
Списки являются штатным элементом конструктора форм. Правда, нс всем формам они подходят, но там, где их можно применить, выбор значения из списка упрощает работу, избавляя от ручного ввода данных. К тому же их использование позволяет избежать опечаток.
В данном трюке представлены три способа заполнения и сортировки списков. В каждом примере ключевыми элементами являются исходные таблицы и структура. В примерах демонстрируются способы сортировки данных из двух источников в алфавитном порядке, сортировка па основе ключевого элемента, сортировка с применением операторов команды SQL и даже сортировка на основе отслеживания востребованности самих элементов списка, Ключевым звеном в реализации большинства способов служит SQL-оператор Union.
Форма
На рис. 3.12 изображена фирма с тремя списками, условии названными Список 1 Список 2 и Список 3.
Рис. 3.12. Форма, содержащая три элемента СписокРис. 3.12. Форма, содержащая три элемента Список
Рис. 3.12. Форма, содержащая три элемента Список
Рис. 3.12. Форма, содержащая три элемента Список
Источником заполнения списков служат две таблицы: 1Ь1_Фрукты и СЫ_Овощи (рис. 3.13). Обратите внимание, что у них два одинаковых поля: Сортировочный- Номер и Наименование. Такая общая структура выбрана неспроста, в чем вы скоро убедитесь сами.
Рис. 3.13. Две таблицы, используемые для заполнения списков
Заполнение списка в алфавитном порядке из двух источников
Список 1 содержит значения, взятые из двух таблиц и отсортированные ио алфавиту уже после объединения. Суть трюка заключается в управлении списком, использующем записи двух таблиц в свойстве Источник строк. Записи объединены за счет выполнения запроса, содержащего оператор Union, На рис, 3.14 показана форма в режиме конструирования с раскрытым списком свойств, относящихся к элементу Список 1.
Рис. 3.14. Список 1: свойство "Источник строк»
Команда SQL в свойстве Источник строк выглядит следующим образом:
Select Наименование from 1Ь1_Фрукты UNION Select Наименование from 1Ы_0вощи;
Оператор Union объединяет значения двух таблиц в том случае, если структура и тип данных в них совпадают. Другими словами, в команде SQL используются поля Наименование каждой из таблиц. При использовании оператора Union нужно, чтобы каждый оператор Select запрашивал одно и то же количество полей. Запрос не сможет работать, если количество полей, к которым открывается доступ в каждой таблице, будет разным.
В результате объединенные записи проходят сортировку, как будто они принадлежали единому источнику (что технически так и есть — благодаря запросу, использующему команду Union). Поэтому различия между фруктами и овощам ) искусственно стерты и спаржа следует за персиком, брокколи — за бананом и т. д. Такая технология может пригодиться в тех случаях, когда требуется предоставить элементы списка, составленного из нескольких источников. В следующем фрагменте будет рассмотрена возможность собирать воедино данные из любого необходимого количества источников с помощью нескольких операторов Union.
Управление сортировкой списка, составленного из нескольких источников
На рис. 3.12 в элементе Список 2 отображается результат раздельной сортировки фруктов и овощей. Список включает также разделительные строки и значения, которых нет в исходных таблицах: Все, Все фрукты и Все овощи. Как же все это могло попасть в список?
Запрос, содержащий оператор Union, осуществляет заполнение списка. Используются два источника данных —СЫ_Фрукты и СЫ_Овощи, по теперь их данные не перемешиваются и не сортируются в алфавитном порядке, вместо этого сорти ровка осуществляется по содержимому поля СортировочныйНомер.
Здесь ключевым моментом служит различие диапазонов числовых значений поли СортировочныйНомер в СЫ_Фрукты и в СЫ_Овощи. Операция Union фактически приводит к объединению данных из обоих источников в единый, отсортированный список, но разница в диапазонах числовых значений поля СортировочныйНомер приводит к разделению общего списка на две части.
На рис. 3.15 показана форма в режиме конструирования с перечнем свойств, при надлежащих элементу Список 2. Команда SQL, определяющая содержимое свой ства Источник строк, показана в окне Область ввода.
Рис. 3.15. Содержимое свойства «Источник строк» для элемента «Список 2»
Вот содержимое этой команды SQL:
Select "Все" as а, -2 as СортировочныйНомер from ТЫ_Фрукты
Union Select "—" as a, -1 as СортировочныйНомер from 1Ь1_Фрукты
Union Select "Все фрукты" as a, 0 as СортировочныйНомер from 1Ы_Фрукты
Union Select Наименование. СортировочныйНомер From 1Ы_Фрукты
Union Select '* — ” as a. 99 as СортировочныйНомер from 1Ы_0вощи
Union Select "Все овощи" as a,
100 as СортировочныйНомер from ТЫ_0вощи
Union Select Наименование, СортировочныйНомер From 1Ы_0вощи
Order By СортировочныйНомер
Ничего сложного для понимания здесь не происходит. В общем, команда SQL объединяет в список строки, полученные из исходных таблиц, со строками, получаемыми из самой команды SQL. Все строки связаны воедино значением ноля СортировочныйНомер. Команда SQL использует оператор Union несколько раз, и вы можете убедиться, что все операторы Select указывают на одинаковое количество полей. В данном примере это количество равно двум.
Команда SQL начинается с размещения слова «Все» в начале списка при помощи следующего фрагмента кода:
Select "Все" as а, -2 as СортировочныйНомер
В этом кодовом фрагменте желаемое достигается за счет сопоставления со словом «Все» наименьшего значения поля СортировочныйНомер (-2). Здесь следует пояснить, что ни само слово «Все», ни значение -2 не являются данными исходной таблицы. Тем не менее структура их размещения в команде SQL совпадает со структурой других операторов Select, встречающихся в команде, что позволяет им объединяться с другими значениями, получаемыми этой командой.
Команда SQL использует оператор Union для объединения значений, полученных из таблиц со значениями, созданными в процессе работы самой команды. В команде SQL представлены следующие значения, создаваемые в процессе выполнения команды:
Select "Все" as а. -2 as СортировочныйНомер from 1Ы_Фрукты
Select " —" as а, -1 as СортировочныйНомер from 1Ы_Фрукты
Select "Все фрукты" as а, 0 as СортировочныйНомер from 1Ь1_Фрукты
Select "—" as а, 99 as СортировочныйНомер from 1Ь1_0вощи
Select "Все овощи" as а. 100 as СортировочныйНомер from 1Ы_0вощи
Каждый из этих фрагментов команды SQL внедряет в список какое-нибудь из значений: Все, Все фрукты, Все овощи или —. Ни одно из этих значений из таблиц не берется. Тем не менее всем им сопоставлен сортировочный номер, согласно которому они занимают свое место в последовательности элементов списка.
С элементами, создаваемыми в процессе работы команды, должны сопоставляться сортировочные номера с учетом сортировочных номеров элементов, получаемых из таблиц (см. рис. 3.13). Сортировочные номера для овощей начинаются со значения 101. Поэтому словосочетанию «Все овощи» сопоставлен номер 100. Это обстоятельство приводит к его появлению в списке перед перечнем овощей.
Имейте в виду, что такой список, как этот, с рядом доступных для пользовательского выбора элементов, требует соответствующего функционального обеспечения, предназначенного для обработки выбранного элемента. Если выбор пользователя падет на отдельный фрукт или овощ, то приложение, скорее всего, продолжит нормальную работу. А что, если он выберет «Все фрукты»? Функции
82 Глава 3, Ввод данных и перемещение по элементам управления программного модуля должны будут обработать все фрукты, занесенные в таблицу 1Ы_Фрукты.
Следует также заметить, что в список внесены разделительные знаки (---), разбивающие длинный список значений на отдельные части. Эта группа символов помогает ориентироваться при прокрутке длинных списков, но ведь пользователь может остановить свой выбор и на ней! Поэтому нужно предусмотреть проверку правильности пользовательского выбора и соответствующую реакцию систем >1 на неподходящий! выбор. Обычно если пользователь выбирает разделительные знаки, он должен быт ь предупрежден, что следует выбрать другой элемент.
Сортировка списка элементов по степени их востребованности
Бывает довольно трудно предположить заранее, какие из элементов окажутся наиболее востребованными. Вы можете воспользоваться полем с сортировочными номерами и выстроить элементы списка в нужной последовательности, но эту задачу все же лучше решить по-другому.
Почему бы не дать возможность самому пользователю влиять на процесс сортировки списка? Памятуя о том, что легче всего отсортировать список, используя поле с числовыми значениями, можно прийти к выводу, что значение числового поля должно отражать востребованность того или иного элемента списка.
Проще всего этого сделать путем обновления того поля, по значениям которого ведется сортировка, при каждом выборе соответствующего элемента. На рис. 3.1G показана форма в режиме конструирования с перечнем свойств, относящихся к элементу Список_3.
Рис. 3.16. СписокЗ: Свойство «Источник строк*
В качестве источника строк для элемента Список_3 послужит следующая команда SQL:
SELECT Востребованность, Наименование FROM ТЫ_Фрукты ORDER BY Востребованность DESC:
В данном списке используется только таблица 1Ы_Фрукты. В ней имеется дополнительное поле Востребованность, определяющее характер сортировки записей в списке. Обратите внимание на свойство Источник строк: записи попадают в список на основании значений поля Востребованность, будучи выстроенными по убыванию. Чтобы все это приобрело какой-то смысл, нужно найти способ обновления значений поля Востребованность. Обновление этого поля должно происходить при обработке выбранного из списка значения в соответствии с избранным в приложении способом, В учебных целях, для достижения наглядности, в форму помещена специальная кнопка. Вот процедура обработки события щелчка на этой кнопке: Private Sub стй_0бноепение_счетчика_С11ск( )
'получение текущего состояния счетчика для указанного элемента
Dim счетчик_текущего_элемента As Integer
If Not IsNulI(Me. Список_3) Then счетчик_текущего_элемемта = _ ОСоокирС’Востребоаанность", "1Ы_Фрукты", "Наименование^'" &_ Me.Список_3 & "*")
'увеличение показания счетчика на единицу и внесение изменений в таблицу счетчик_текущего_элемента = счетчик_текущего„элемента + 1
DoCmd.SetWarnings False
DoCmd.RunSQL ("Update 1Ь1_Фрукты Set Востребованность^' & _ счетчик_текущего_элемента & " Where Наименование^'" & _ Ме.Список_3 & "’”)
Me ,Список_3.Requery
End If
End Sub
В двух словах, функция DLookup находит текущее значение поля Востребованность, относящееся к выбранному элементу, и присваивает его переменной счетчик_те- кущего„элемента. Значение переменной увеличивается на единицу, a SQL-команда Update записывает измененное значение на место ранее извлеченного из таблицы. Затем список обновляется, что приводит к перестраиванию порядка следования его элементов.
В результате всех этих операций, когда выбирается один из элементов списка, он «всплывает» ближе к началу этого списка. Вы сможете это заметить, сравнивая расположение элементов в Списке_3 на рис. 3.12 со значениями поля Востребованность в таблице на рис. 3.13. Например, Малина стоит первой в Списке_3 потому, что у нее наивысшее значение в поле Востребованность.
ТРЮК№ 23ТРЮК№ 23Использование в форме дополнительных элементов управления
ТРЮК
№ 23
ТРЮК
№ 23
Забудем об обычных формах управления Access и откроем новые возможности разработки.
Если у вас уже имеется достаточный опыт разработки приложений Access, значит, освоено и содержимое Панели элементов, и знакомы не только сами элементы, но и методика их применения. При этом вы не могли не заметить, что на панели
есть еще одна кнопка, открывающая доступ к дополнительным элементам. Расположение этой кнопки показано на рис. 3.17.
Рис. 3.17. Дополнительные элементы управлений
Выбрать новый элемент можно из списка, который открывается по щелчку на кнопке Другие элементы. Я не предлагаю перепробовать все элементы из этого списка, поскольку не все из них пригодятся в Access. Тем не менее, если прокрутить список до элементов Microsoft, можно будет найти несколько интересных экземпляров, которые следует попробовать применить в форме. Давайте рассмотрим, ка< можно будет воспользова ться некоторыми из этих дополнительных элементов.
Добавление дополнительного элемента к элементам формы
Список дополнительных элементов на разных компьютерах может быть разнь™, но элементы управления Microsoft Forms должны в нем присутствовать обязательно, поскольку они устанавливаются вместе с Microsoft Office.
Рис. 3.18. Элемент SpinSutton, установленный в форме
В качестве примера я поместил в форму элемент Microsoft Forms 2.0 Spin Button (рис. 3.18). Делается это очень просто: элемент выбирается из списка, а затем его границы прорисовываются на форме с помощью мыши.
Этот элемент управления имеет настраиваемое свойство минимального и максимального значения счетчика, поэтому его можно использовать для циклического изменения значений в диапазоне 1-100 или 128-133 либо в любом другом подходящем по смыслу диапазоне. Доступ к значению счетчика можно получить в программном модуле, воспользовавшись тем же способом, который применялся при работе с другими управляющими элементами.
Затем я поместил в форму элемент Microsoft Date and Time Picker Control 6.0 (рис. 3.19). Этот эффектный элемент управления находится в свернутом состоянии до тех пор, пока на нем не щелкнуть кнопкой мыши, после чего он раскрывается в календарь с прокруткой. Его использование облегчает работу, избавляя пользователя от ручного ввода даты. Преимущество этого элемента управления в том, что он в неактивном состоянии занимает совсем мало места.
Рис. 3.19. Упрощение выбора датыРис. 3.19. Упрощение выбора даты
Рис. 3.19. Упрощение выбора даты
Рис. 3.19. Упрощение выбора даты
Вам будет полезно ознакомиться с некоторыми новыми элементами управления и включить их в свой арсенал. Тем самым вы расширите горизонты конструирования форм и обогатите свой личный опыт.
См. также: «Проигрывание видеоклипов в форме Access* (Трюк № 34), «Использование браузера в приложении Access* (Трюк № 97).
Подтверждение изменений, внесенных в запись перед ее сохранением
Предоставление пользователям возможности пересмотреть внесенные изменения перед сохранением записи.
При работе с формой учетных карточек измененные данные сохраняются автоматически при переходе к другой записи. Такой подход считается нормальным и, в большинстве случаев, более предпочтительным, чем сохранение после подтверждения. Но иногда имеет смысл прервать этот процесс и дать возможность пользователю пересмотреть внесенные изменения. Ведь после обновления прежние дан-
ные утрачиваются, если только не предусмотрены какие-нибудь меры наподобие резервного копирования.
И тут нам на помощь может прийти одно из средств управления процессом — сс- бытие До обновления. Используя обработку этого события, можно запросить у полг - зователя разрешение на окончательное обновление данных. Если будет получе i отрицательный ответ, изменения будут отменены.
Пользователи могут выбирать, где именно получать запрос на подтверждение внесенных изменений, поскольку излишние запросы могут изрядно надоесть. Hi рис. 3.20 показана форма с флажком в правом верхнем углу, позволяющим установить запрос на внесение изменений.
Рис. 3.20. Флажок, предназначенный для установки запроса на внесение изменений
Событие До обновления наступает при условии, если в данные действительно вно сились изменения. При обработке этого события проверяется состояние флажка и, если он установлен, выводится запрос на подтверждение (рис. 3.21).
Если пользователь щелкнет на кнопке Да, изменения будут записаны, а если он выберет кнопку Нет, будет выполнена команда отмены изменений. В процедуру обработки события следует ввести следующий код:
Private Sub Form_BeToreOpdate(Cancel As Integer)
If Me.сЬК_Подтверждение = True Then
продолжение = MsgBox("Хотите сохранить внесенные изменения?", vbYesNo, _ "Запись изменений")
If продолжение = vbNo Then
DoCmd. RunCommand acCmdUndo
End If
End If
End Sub
В данном трюке важно то, что пользователь сам решает, получать запрос или нет Постоянные запросы на подтверждение изменений могут вызвать нервное рас стройство. Поэтому лучше дать возможность пользователю самому включать запрет при внесении изменений и поля, содержащие важную информацию, например в поля имен и адресов, и выключать его, когда изменения вносятся во второстепенные поля.
99940U75SA99940U75SAТопотаТопота№rorto№.«[№rorto№.«[j Общ ап стоичость'j Общ ап стоичость'Регион:Тепе4жн оабсннй- Ы-5Щ1г эпектрс***^ адрес ।Регион:Тепе4жн оабсннй- Ы-5Щ1г эпектрс***^ адрес ।]Год высока мю 2000]Год высока мю 2000№«r: J Александр Отчество: ■ : ■■ Николаевич . Адр^г; 7дижентская 23-41 ПОЧТОВЫЙ ИНДЕКС:; ;«Э 122Телефон моби^ньи: 8-913-345-67-89№«r: J Александр Отчество: ■ : ■■ Николаевич . Адр^г; 7дижентская 23-41 ПОЧТОВЫЙ ИНДЕКС:; ;«Э 122Телефон моби^ньи: 8-913-345-67-893«eb;[MJ - I п'Й^Й)^ Счета:.'j Дэта счета | Статус[Ном*3«eb;[MJ - I п'Й^Й)^ Счета:.'j Дэта счета | Статус[Ном*Изготовительг :ТойотаИзготовительг :Тойота[..KS^TjПечать истории . сделок[..KS^TjПечать истории . сделокГород:Телефон: 23-56-79Город:Телефон: 23-56-79Рис. 3.21. Запрос на сохранение измененийРис. 3.21. Запрос на сохранение измененийОтображение в форме показаний цифровых часовОтображение даты и времени для нескольких часовых поясов.Отображение в форме показаний цифровых часовОтображение даты и времени для нескольких часовых поясов.ST Р ю к
99940U75SA
99940U75SA
Топота
Топота
№rorto№.«[
№rorto№.«[
j Общ ап стоичость'
j Общ ап стоичость'
Регион:
Тепе4жн оабсннй- Ы-5Щ1г эпектрс***^ адрес ।
Регион:
Тепе4жн оабсннй- Ы-5Щ1г эпектрс***^ адрес ।
]Год высока мю 2000
]Год высока мю 2000
№«r: J Александр Отчество: ■ : ■■ Николаевич . Адр^г; 7дижентская 23-41 ПОЧТОВЫЙ ИНДЕКС:; ;«Э 122
Телефон моби^ньи: 8-913-345-67-89
№«r: J Александр Отчество: ■ : ■■ Николаевич . Адр^г; 7дижентская 23-41 ПОЧТОВЫЙ ИНДЕКС:; ;«Э 122
Телефон моби^ньи: 8-913-345-67-89
3«eb;[MJ - I п'Й^Й)^ Счета:.'
j Дэта счета | Статус[Ном*
3«eb;[MJ - I п'Й^Й)^ Счета:.'
j Дэта счета | Статус[Ном*
Изготовительг :Тойота
Изготовительг :Тойота
[..KS^Tj
Печать истории . сделок
[..KS^Tj
Печать истории . сделок
Город:
Телефон: 23-56-79
Город:
Телефон: 23-56-79
Рис. 3.21. Запрос на сохранение изменений
Рис. 3.21. Запрос на сохранение изменений
Отображение в форме показаний цифровых часов
Отображение даты и времени для нескольких часовых поясов.
Отображение в форме показаний цифровых часов
Отображение даты и времени для нескольких часовых поясов.
№ 25
Используя события Таймер и Интервал таймера, а также системные часы, вы можете отобразить показания электронных часов в форме.
Рис. 3.22. Форма с изображением текущего времениРис. 3.22. Форма с изображением текущего времениНа рис. 3.22 показаны часы, помещенные в заголовок формы. Они неспроста размещены в заголовке, а не в области данных, поскольку это делает их независимыми от особенностей каждой записи.
Рис. 3.22. Форма с изображением текущего времени
Рис. 3.22. Форма с изображением текущего времени
Вы можете заниматься своими делами, перелистывать записи, вносить в них из менения и т. д„ а показания времени будут изменяться своим чередом.
Создание часов
Создать часы не составит труда. Сначала нужно поместить в форму элемент управления Надпись. Затем установить н свойствах значение элемента Интервал времени в 1000 (что соответствует одной секунде). И наконец, поместить кодовую строчку в процедуру обработки события формы под названием Таймер:
Me.1Ь1_Часы.Caption = Format(Now( ), "hh:mm:ss")
В данном случае предполагается, что элемент Надпись получил имя 1Ы_Часы. Функция Now возвращает системное время, а функция Format придает отображени о времени желаемый вид. Применять функцию форматирования нс обязательно. Без нее будет возвращено полное значение даты и времени. А в предложенном варианте функция форматирования возвращает только показания времени; формат hh:mm:ss относится к часа (hh), минутам (mm) и секундам (ss).
Трюк в трюке
Вы можете значительно расширить привлекательность и функциональные возможности цифровых часов. Вот первая идея: вы можете демонстрировать текущее время для городов, находящихся в разных часовых поясах. На рис. 3.23 показана форма с двумя циферблатами. На одном из них отображается время для Москвы, а на другом — для Нижнего Новгорода.
Рис. 3.23. Двойное отображение времени в форме
Нижний Новгород отстоит от Москвы на один часовой пояс. Эту разницу в покт - заниях часов можно высчитать с помощью функции DateAdd. Дополненный кот процедуры обработки события Таймер должен выглядеть следующим образом:
Me ЛЫ_Часы_Москва . Capti on - Format(Now( ), "hh : mm: ss")
Me.1Ы_Часы_Нижний_Новгород.Caption = Format(DateAdd("h", 1, Now( )), _ "hh:mm:ss")
Функция DateAdd способна прибавлять или вычитать значения времени. В данном случае значение 1 приводит к прибавлению одного часа.
А вот вторая идея: предоставить пользователю способ самостоятельно изменять формат отображения. Реализовать ее поможет глобальная переменная и процедура обработки двойного щелчка па элементе типа Надпись. При открытии формы
глобальная переменная тип_формата получает значение 1. При каждом двойном щелчке на циферблате значение этой переменной возрастает на единицу. Когда оно достигнет четырех, происходит сброс и значение возвращается к единице. Процедура обработки события Таймер проверяет значение переменной вариант, формата и устанавливает формат, соответствующий этому значению. Далее представлен программный модуль формы, реализующий данный замысел, в его полном варианте:
Option Compare Database
Public варианТ-формата As String
Private Sub Form_Open(Cancel As Integer) вариант_формата = 1
End Sub-
Private Sub Form_T1mer( )
Select Case вариант_формата
Case 1
Me ЛЫ_Часы,Caption = Format(Now( ), "hh:mm:ss")
Case 2
Me.lbl_4acM.Caption = Format(Now( ), "hh:mm ")
Case Else
Me. 1Ы_Часы. Capti on = Format(Now( ), "dd/mm hh:mm ")
End Select
End Sub
Private Sub 1Ь1_Часы_0ЫС11ck(Cancel As Integer)
аариант_формата = вариант,формата + 1
If вариант_формата = 4 Then вариант_формата = 1
End Sub
Теперь у пользователя будет возможность двойным щелчком на циферблате подбирать формат отображения даты и времени по собственному усмотрению. Разумеется, увеличить количество доступных форматов особого труда не составит.
ТРЮК№ 26ТРЮК№ 26Рационализация переходов по элементам
ТРЮК
№ 26
ТРЮК
№ 26
Совершенствование последовательности переходов, позволяющее сразу попадать в нужные поля.
Конструируя форму, вы вряд ли обращаете особое внимание на порядок перемещения по элементам, поскольку для его определения не требуется ни особых раздумий, ни глубокого анализа. Обычно этот порядок определяется в самом конце работы, когда все элементы управления уже расставлены по местам. Честно говоря, я порой даже забывал об установке последовательности переходов по элементам в созданных мною формах. Конечно, коллектив пользователей тут же указывал мне на это упущение.
Тогда я задумался: если последовательность перехода в форме так уж важна для пользователей, то почему бы не подойти к решению этого вопроса более рационально? В некоторых формах данные вводятся только в часть имеющихся полей.
Разумно было бы в таком случае настроить переходы в форме с учетом тех полей, которые могут быть пропущены.
Смысл в этом появится при возникновении определенных условий или при подчинении содержимого текстовых полей определенной логике. Например, при вводе сведений о новом клиенте вы обычно заполняете каждое поле. Но если вы вводите какую-то информацию, касающуюся ранее зарегистрированного клиента, то, скорее всего, ряд полей вы пройдете вхолостую.
На рис. 3.24 показана форма, в которой осуществляется выбор значения для поля со списком, названного Статус и имеющего четыре варианта значения: Зарегистрированный, Без направления, Телефоны и Обновление.
Рис. 3.24. Выбор варианта перехода из поля со списком
В процедуре обработки события Выход программного модуля поля со спискем используется структура Select Case,с помощью которой, в зависимости от выбора, сдел анно го в этом ио ле, фо ку с у стан а в л и вается на раз л ич ные управл яющие эл в- ментыформы. Например,статус Без направления предназначен для людей, не прешедших регистрацию и прибывших без предписания. Их нужно как-то классифицировать, поэтому следует перейти к полю ввода Источник_направления. Ест и будет выбран статус Зарегистрированный, то программа осуществит переход к полю Заметки. Вот код процедуры обработки события Выход:
Private Sub Crajyc_Ex1t(Cancel As Integer}
Select Case статус
Case "Зарегистрированный"
He.1х1_3аметки.SetFocus
Case "Без направления"
Me.ЬхТ_Мсточник_направленИя.SetFocus
Case "Обновление"
He.1хТ_Фамилия_студента.SetFocus
End Select
End Sub
Суть данного подхода состоит в том, что вы можете адаптировать правила перехода к любой конкретной ситуации, К примеру, если вы работаете с базой данных фирменного автосалона и к вам обратился клиент, уже купивший машину, то раз-
дел, в котором зафиксированы желания клиента в отношении марки и комплектации приобретаемого автомобиля, можно опустить. Если раздел о новом автомобиле содержит двенадцать нолей, то при отсутствии системы рационального перехода продавцу придется пройти все зги поля вхолостую. Вместо этого некоторые другие управляющие элементы формы могут использоваться в качестве индикатора, позволяющего осуществить продуманный переход. Использование события Выход открывает большие возможности для совершенствования технологии ввода информации и повышения уровня организации труда.
ТРЮК№ 27ТРЮК№ 27Выделение активного элемента управления
ТРЮК
№ 27
ТРЮК
№ 27
Предоставление визуального ориентира в заполненной форме за счет выделения активного элемента
Если вы, переходя от элемента к элементу, вводите данные, то порой бывает трудно сориентироваться, какой из элементов в данный момент активен. Чем больше в форме элементов, тем проще в них заблудиться. В этом трюке демонстрируется способ выделения активного поля.
В трюке № 26 «Рационализация переходов по элементам» показан способ перехода к определенным элементам формы в зависимости от обстоятельств и в нем применялась процедура обработки события Выход, Данный трюк использует обработку не только события Выход, ио и события Вход. Все элементы управления, предназначенные для ввода информации, имеют процедуры обработки обоих событий.
На рис. 3.25 показана форма, предназначенная для ввода информации, имеющая обрамление поля Фамилия. По мере переходов пользователя к следующим элементам формы или щелчков на этих элементах активный элемент неизменно получает обрамление, которое есть в любой момент времени только у него.
Рис, 3.25. Обрамление, возникающее вокруг активного элементаРис, 3.25. Обрамление, возникающее вокруг активного элемента
Рис, 3.25. Обрамление, возникающее вокруг активного элемента
Рис, 3.25. Обрамление, возникающее вокруг активного элемента
Чтобы осуществить данный замысел, нужно установить во всех элементах формы свойство Оформление в состояние обычное. Вы можете использовать и другие установки, позволяющие иметь обрамление, например, с тенью, но оптимальным яь - ляется обычный вариант оформления. При использовании варианта с тенью во; - никает нежелательный эффект: когда обрамление исчезает, его тень все равно остается.
На рис. 3.26 показан принадлежащий форме программный модуль. В его верхней части помещаются две процедуры: Вход_в_активный_элемент и Выход_из_активнс- го_эле мента, которые работают по вызову из процедур обработки событий Вход и Выход, принадлежащих элементам управления формы. Процедура Вход_в_эктие- ный_элемент предписывает активному элементу независимо от его предыдущего состояния включить тон кое красное обрамление. Стиль границы имеет значение . соответствующее сплошной линии. Ширина границы имеет значение 2, соответствующее тонкой линии. Затем устанавливается красный цвет границы.
Option Compare DatabaseOption Compare DatabasePrivate Sub дход_»_аг>тивиый_элемент ()Private Sub дход_»_аг>тивиый_элемент ()tilthtilthEndEndEndEndi Me.IctiveControl.Properties("BorderStyle") .Properties ("Borderwidth**) ■ 2 .Properties("BorderColor") • vbRed With Subi Me.IctiveControl.Properties("BorderStyle") .Properties ("Borderwidth**) ■ 2 .Properties("BorderColor") • vbRed With SubPrivate Suh выхад^хв_аг;тивного_элемеп'Та (|Me.ActIveControl.Properties("BorderStyle") = □ End Sub Private Sub Фамилкя_Епсег() вход в аптивнык з! лене нт End subPrivate Suh выхад^хв_аг;тивного_элемеп'Та (|Me.ActIveControl.Properties("BorderStyle") = □ End Sub Private Sub Фамилкя_Епсег() вход в аптивнык з! лене нт End sub, Private Sub ФамилияЕхit(Cancel As Integer), Private Sub ФамилияЕхit(Cancel As Integer)выход мэахтивного^зленента End Sub ~ ~Private Sub №w_Enter()вход_в_активхмЙзлемемтEnd SuhPrivate Sub Ймя_Ехit(Cancel As Integer)выход^мЗ-актмвногО-ЭлемемтаEnd Sub~„Private Sub Апрес_домлдний_1_Enter ()вход_»_активммй_здеме1гтEnd Subвыход мэахтивного^зленента End Sub ~ ~Private Sub №w_Enter()вход_в_активхмЙзлемемтEnd SuhPrivate Sub Ймя_Ехit(Cancel As Integer)выход^мЗ-актмвногО-ЭлемемтаEnd Sub~„Private Sub Апрес_домлдний_1_Enter ()вход_»_активммй_здеме1гтEnd Sub
Option Compare Database
Option Compare Database
Private Sub дход_»_аг>тивиый_элемент ()
Private Sub дход_»_аг>тивиый_элемент ()
tilth
tilth
End
End
End
End
i Me.IctiveControl
.Properties("BorderStyle") .Properties ("Borderwidth**) ■ 2 .Properties("BorderColor") • vbRed With Sub
i Me.IctiveControl
.Properties("BorderStyle") .Properties ("Borderwidth**) ■ 2 .Properties("BorderColor") • vbRed With Sub
Private Suh выхад^хв_аг;тивного_элемеп'Та (|
Me.ActIveControl.Properties("BorderStyle") = □ End Sub Private Sub Фамилкя_Епсег() вход в аптивнык з! лене нт End sub
Private Suh выхад^хв_аг;тивного_элемеп'Та (|
Me.ActIveControl.Properties("BorderStyle") = □ End Sub Private Sub Фамилкя_Епсег() вход в аптивнык з! лене нт End sub
, Private Sub ФамилияЕхit(Cancel As Integer)
, Private Sub ФамилияЕхit(Cancel As Integer)
выход мэахтивного^зленента End Sub ~ ~
Private Sub №w_Enter()
вход_в_активхмЙзлемемт
End Suh
Private Sub Ймя_Ехit(Cancel As Integer)
выход^мЗ-актмвногО-Элемемта
End Sub~„
Private Sub Апрес_домлдний_1_Enter ()
вход_»_активммй_здеме1гт
End Sub
выход мэахтивного^зленента End Sub ~ ~
Private Sub №w_Enter()
вход_в_активхмЙзлемемт
End Suh
Private Sub Ймя_Ехit(Cancel As Integer)
выход^мЗ-актмвногО-Элемемта
End Sub~„
Private Sub Апрес_домлдний_1_Enter ()
вход_»_активммй_здеме1гт
End Sub
Рис, 3.26. Программный код для включения и отключения обрамления
Процедура Выход_из_активного_элемента содержит одну-единственную строку кода, которая переводит обрамление в прозрачное состояние.
Каждый вход в элемент управления означает, что произошел выход из другого элемента. Поэтому две процедуры выполняются в паре. Процедура выхода отклк - чает обрамление одного элемента, процедура входа включает обрамление другого.
Использование технологии, рассмотренной в данном трюке, дает возможность пользователю ясно различать активный элемент на фоне неактивных.
ГЛАВА 4
Представление данных
Трюки № 28-39
При всей сложности приложения базы данных, в котором содержится множество специально созданных функций, искусно составленных запросов и прочих изощренных решений, в конечном итоге от него требуется обеспечить извлечение сведений, выстраиваемых на основе имеющейся в базе информации. И тут на первый план выступают формы и отчеты. Чтобы построить наше взаимодействие с - базой данных, требуется разработать эффективный интерфейс приложения. Система Access предоставляет для решения этой задачи массу возможностей.
Конструктор отчетов Access представляет собой средство разработки с богатым функциональным набором. В него включены инструменты форматирования, группировка и сортировка записей, обширная палитра управляющих элементов, а также возможность перехвата событий и разработки необычных решений с использованием VBA. Формы также способны реагировать на события, имеют варианты форматирования и массу различных свойств. Использование всего этого арсенала невозможно охватить в одной главе. Поэтому здесь будут освещены лишь некоторые стимулирующие фантазию способы работы с формами и отчетами.
Методы использования форм для просмотра записей базы данных уже были рассмотрены. А что, если их использовать и для просмотра фотографий или видеоклипов? Как это делается, показано в разделах «Демонстрация слайдов в Access» (Трюк № 33) и «Проигрывание видеоклипов в форме Access» (Трюк № 34).
Обычно наилучшими бывают первые впечатления. Поэтому создаваемые вами отчеты должны радовать глаз. Часть трюков этой главы посвящена рациональной группировке и форматированию данных в отчетах. В разделе «Создание прямой ссылки на отчет» (Трюк №31) показан прием, позволяющий слишком занятым пользователям щелчком на ярлыке распечатать отчет, не связываясь с самой базой данных. В разделе «Просмотр отчетов в форме» (Трюк № 35) объясняется способ просмотра образов отчетов в форме.
ТРЮК№ 28ТРЮК№ 28Деление отсортированных по алфавиту записей на группы по буквам
ТРЮК
№ 28
ТРЮК
№ 28
Новые возможности представления данных, появляющиеся при установке свойства группировки в состояние По первым знакам.
В сортировке по алфавиту нет ничего нового, она на самом деле настолько привычна, что воспринимается как нечто само собой разумеющееся. Но просма-- ривать десятки и сотни распечатанных страниц в поисках одной-единствеи- ной записи — крайне утомительное занятие, даже если данные отчета следуют в алфавитном порядке.
Становится понятным, что записи в отчете нужно еще и разбить по алфавиту, С а рис. 4.1 показана страница отчета, в которой список отсортированных записей представлен единым блоком, без выделений или разбиений. Хотя записи и отсортированы, но они представлены в таком виде, что найти что-либо нужное крайне сложно.
Рис. 4.1. Отчет, представленный в однообразном видеРис. 4.1. Отчет, представленный в однообразном виде
Рис. 4.1. Отчет, представленный в однообразном виде
Рис. 4.1. Отчет, представленный в однообразном виде
Сама конструкция отчета проста и понятна. В области данных содержатся поля, которые превращаются в строки отчета. В представленном варианте отчета группировка нс используется, что, собственно, и придает ему такой однообразный в и 1. На рис. 4.2 показан отчет в режиме конструирования.
Разбиение по буквам
Использование группировки в структуре отчета позволяет разбить непрерывный список, состоящий из однообразных строк. На рис. 4.3 показано, как нужно изменить конструкцию отчета, чтобы добавить в него группировку.
^.шнва... 1$* НИЖХ1Й колонтитул^.шнва... 1$* НИЖХ1Й колонтитулi^^TOgti^^TOgt(Клиенты(КлиентыОтчество Адпес:Отчество Адпес:...1 Ина....1 Ина..1 Гл™ ...1 Гл™ ..•"Страниир"3[Рвде]8"мз " 8 pegesl :•"Страниир"3[Рвде]8"мз " 8 pegesl :Эмилия;—_имя^< Область д»и*4>Эмилия;—_имя^< Область д»и*4>. ^1Ч.естр9..„„J iAaP.^f.. ^1Ч.естр9..„„J iAaP.^f.Рис. 4.2. Отчет, в котором не используются сортировка и группировкаРис. 4.2. Отчет, в котором не используются сортировка и группировкаРис. 4.3. Отчет, использующий сортировку и группировкуРис. 4.3. Отчет, использующий сортировку и группировку
^.шнва... 1$
* НИЖХ1Й колонтитул
^.шнва... 1$
* НИЖХ1Й колонтитул
i^^TOgt
i^^TOgt
(Клиенты
(Клиенты
Отчество Адпес:
Отчество Адпес:
...1 Ина.
...1 Ина.
.1 Гл™ ..
.1 Гл™ ..
•"Страниир"3[Рвде]8"мз " 8 pegesl :
•"Страниир"3[Рвде]8"мз " 8 pegesl :
Эмилия;—_имя^
< Область д»и*4>
Эмилия;—_имя^
< Область д»и*4>
. ^1Ч.естр9..„„J iAaP.^f.
. ^1Ч.естр9..„„J iAaP.^f.
Рис. 4.2. Отчет, в котором не используются сортировка и группировка
Рис. 4.2. Отчет, в котором не используются сортировка и группировка
Рис. 4.3. Отчет, использующий сортировку и группировку
Рис. 4.3. Отчет, использующий сортировку и группировку
9595Трюк № 28. Деление отсортированных по алфавиту записей по буквам
95
95
Группировка и сортировка проводятся по содержимому поля Фамилия. Группировка имеет следующие ключевые особенности:
Используется заголовок, и нс используется примечание. Заголовок группы и Примечание группы установлены в диалоговом окне Сортировка и группировка соответственно В Да и Нет.
Свойство Группировка в диалоговом окне Сортировка и группировка установлено в состояние По первым знакам, а свойство Интервал установлено в 1.
В заголовок группы вставлено свободное текстовое поле, а его свойство Данные содержит выражение.
При создании отчета выражение, помещенное в свободное текстовое поле, приведет к тому, что создание группы будет зависеть не от появления каждой новой
фамилии, а от появления в начале фамилии новой буквы алфавита. В результате будут собраны в группы все фамилии, начинающиеся на А, на Б и т. д. Достигается это использованием функции Left, возвращающей первую букву:
=Left([Фамилия]:1)
На рис. 4.4 показан отчет, разбитый на группы по буквам.
Рис, 4.4. Список клиентов, разбитый на группы по первым буквам фамилий
Более крупный и жирный шрифт букв, а также подчеркивание позволяют четко различать группы при просмотре отчета.
Трюк в трюке
Обратите внимание, что на странице отчета, показанной на рис. 4.4, отсутствуют фамилии клиентов, начинающиеся на букву «Й». Отсутствие записей на эту 6yi ву может для кого-то тоже иметь значение. Я однажды слышал, как возмущается начальник, который вопреки своим ожиданиям не нашел того, чего и не могло быть в списке: «А где запись о клиенте по фамилии Йонсон?» В таких случаях можно только указать, что записей, отвечающих определенным условиям, не найдено, тогда станет понятным, что «потерявшихся» записей просто не существовало.
В частности, было бы полезно указать в отчете, что записей, начинающихся с бук вы «Й», не найдено. Нам нужен способ, при котором в отчете будет отображена эта буква алфавита, но при существующей конструкции отчета опа появиться те сможет. Любые фигурирующие в отчете буквы связаны с существующими записями о клиентах, чьи фамилии начинаются на эти буквы.
Чтобы в отчете появились все буквы, независимо от наличия соответствующих записей, в конструкцию отчета нужно включить список букв алфавита, который
будет сравниваться с данными имеющихся записей. Используемый при этом подход заключается в том, чтобы связать таблицу клиентов с таблицей символов, вместо того чтобы создавать отчет только на основе таблицы клиентов.
К базе данных добавляется таблица, состоящая из единственного поля Буква. В таблице содержится 30 записей, по количеству букв алфавита от А до Я, с которых могут начинаться фамилии. На рис. 4.5 показана таблица, названная 1Ы_Буквы.
Рис. 4.5. Таблица, заполненная буквами алфавита
Неплохо было бы включить в таблицу еще и цифры от 0 до 9, особенно если работа ведется с названиями компаний.
Раньше свойство отчета Источник записей содержало ссылку на таблицу клиентов (1Ы_Клиенты). Теперь же источником записей для отчета послужит запрос. Вот команда SQL, по которой он будет создан:
SELECT ГЫ Клиенты. Фамилия . 1Ы_Клиенты. Имя , ГЫ^Клиенты. Отчество, ТЫ_Клиенты .Адрес , 1Ы_Клиенты. Город, 1Ы_Буквы. Буква FROM 1Ы_Клиенты RIGHT JOIN ТЫ_Буквы ON left(ТЫКлиенты.Фамилия;1) = ТЬ1_Буквы.Буква:
Особенностью этой команды является присутствие оператора RIGHT JOIN, использованного для установки связи между таблицами. Тем самым гарантируется присутствие всех записей из таблицы с буквами (ТЫ_5уквы). Иными словами, отчету станет доступна каждая буква, даже если и не будет начинающихся с нее фамилий.
Конструкцию отчета также следует подвергнуть незначительным изменениям. Теперь основанием для группировки уже не служит содержимое ноля Фамилия, вместо этого группировка базируется на содержимом поля Буква. А в свободней текстовом ноле используется новое выражение. Все внесенные изменения отображены на рис. 4.6.
Рис. 4.6. Группировка на основе букв алфавита
^ Сортирам» по фа#1нпнк :
лает’" ": Л"'
Завьялова
Евгения
Александровна
Фрунзе 12-9
Смоленск
Зеленце® е
Наталья
Ивановна
Мира 12-67
Кострома
Зорина
Надежда
Васильевна
Автсгенны 87-45
Чита
Зимин
Александр
Николаевич
Ташгентская 23-41
Самара
Зябликов
Василий
Сергеевич
Прибрежная 23-41
Красноярск
Захаров
Бюст ор
Петрович
Т ехнмческал 31-18
Екатеринбург
Зелин
И
Сергей
Иванович
2-й Сетуньский пр. 12-35
Москва
Исаков
Сергей
Петрович
П арков ах 34-81
Пермь
Ивченко
Полина
Михайловна
Ш актерская 34-112
Кемерово
Ивин
Валерий
Иванович
Алтуфьевсжое шоссе 112-2
Москва
Иванов
Владимир
Васиаевич
Индустриальная 128-32
Новосибирск
Записи иа букву Й отсутствуют
К
Киселев
Владимир
Б аперьеьич
Судаке» а 23-15
Москва
Колобов
Михаил
Викторович
С мол ейская 12-56
Липецк
Капустин
Виктор
Иванович
Приморская 40-31
Находка
Рис. 4.7. Включение в отчет сообщения об отсутствии записей на определенную букву
Трюк Ne 29. Подсчет промежуточных итогов на основе определенных условий 99
Выражение, помещенное в текстовое поле, возвращает одно из двух возможных значений. Если хотя бы одна запись содержит фамилию, начинающуюся с заданной буквы, то выводится эта самая буква, а если таких записей нет, выводится сообщение, что на заданную букву записи отсутствуют. Для выполнения данной задачи задействованы функции IIF и Count:
= IIf(Count([Фамилия])>0,[Буква] , "No records for " & [Буква])
В результате отчет получает в качестве заголовков групп все буквы алфавита, независимо от того, существуют ли соответствующие им записи (см. рис. 4.7).
Вы можете по-разному приспособить этот трюк под собственные нужды. Например, можно скрыть область данных и изменить выражение в заголовке, чтобы при отсутствии записей выводился прочерк. Тогда в отчете будут отображены только сообщения об исключениях.
ТРЮК№ 29ТРЮК№ 29Подсчет промежуточных итогов на основе определенных условий
ТРЮК
№ 29
ТРЮК
№ 29
Деление общего итога на имеющие смысл составляющие с использованием сумм с накоплением и выражений.
Общий замысел состоит в создании двух наборов итоговых данных, подлежащих сравнению. При создании отчетов эта задача входит в число типовых. Можно сгруппировать данные на основе различий в значениях одного из полей. Неплохим примером могут послужить данные за определенный год. Если в отчет включено поле Год, вы можете включить подсчет промежуточных итогов в примечание группы. То есть вы можете получить итоговое значение (для содержимого любых других полей) за каждый год.
Но когда появляется потребность вывести итоговые значения с учетом нескольких условий, возникает неразбериха. Вы можете создать две группы, но тогда придется решать, какая из них будет размещаться внутри другой. Такое решение не всегда бывает достаточно очевидным. Сюда добавляются еще и различные варианты размещения данных. Если вы хотите расположить промежуточные итоги в произвольном порядке, выйдя за рамки каскадной расстановки, то вам не удастся добиться этого до тех нор, пока вы не задействуете свойства суммы с накоплением и вычисляемые элементы управления.
На рис. 4.8 показан отчет, отображающий общий итог за каждый год, под которым размещены годовые Итоги по отдельным регионам.
Разумеется, отчет, подобный тому, что изображен на рис. 4.8, можно создать с использованием других методов: например, воспользоваться подчиненным отчетом. Использование суммы с накоплением как основной идеи данного трюка - всего лишь один из возможных вариантов решения проблемы включения в отчет итоговых значений, зависящих от нескольких условий.
В данном трюке используется пример из ветеринарной практики, в нем анализируются данные о визитах к врачу за два года и о клиентах, приезжавших из пяти разных штатов. Источником записей для отчета служит запрос на объединение, составленный из двух идентичных запросов на выборку, различающихся лишь
гадами, к которым относятся записи: в одном используются записи за 2003, а в др ^ гом — за 2004 год. Итак, источником записей служит следующая команда:
SELECT * FROM чгу_Визиты_2003
Union SELECT * FROM цгу_Визиты_2004
На рис. 4.9 показал запрос ягу_Визиты_2003. У каждого клиента может быть от ну; я до нескольких животных, и каждое животное может быть на приеме у врача от нуля до нескольких раз. Следует иметь в виду, что в отчете отражаются толью состоявшиеся визиты к врачу. Вид животного не имеет значения, но в схеме данных затребовано обращения к таблице, содержащей сведения о животных (tb._ Животные).
Рис, 4.9. Запрос сведений о визитах к ветеринарному врачу
Трюк № 29. Подсчет промежуточных итогов на основе определенных условий 101
Использование суммы с накоплением
В этом отчете обрабатываются сотни записей, по поскольку свойство Вывод на экран раздела Область данных установлено в Нет. на экране появляются только итоговые данные. Несмотря на это, раздел Область данных играет1 существенную роль: в нем размещается набор текстовых полей, использующих суммирование с накоплением. На рис. 4.10 показан отчет в режиме конструирования.
£3 ^.'нРН„ 2&0 L.Х'С * Ci Vi *
♦ Верхний колонтитул♦ Верхний колонтитулСравнительные сведенияio визитах клиентов по штатам в 2003 и 2004 годахСравнительные сведенияio визитах клиентов по штатам в 2003 и 2004 годахtxtCT2004txtCT2004< Область данных :.•Wrarj ЙтатДат э _...•:-.= а Дат».«ЙЗштвтрХF AndУе^дётё jw^»i>2t&^And Ve^< Область данных :.•Wrarj ЙтатДат э _...•:-.= а Дат».«ЙЗштвтрХF AndУе^дётё jw^»i>2t&^And Ve^визигавизигаМаске вводе . . , Сунна: накоплением Смарт-тегиМаске вводе . . , Сунна: накоплением Смарт-тегимаi20041Вгего еничие: 1 "11х!СТ?И)3]»[ЫМАГВсего визитов; r|tx(Cr2004HtxtMA2Все/О ВИЗИТОВ В CL !l-piitcrao^"""')[всего визитов в С7:|-,1х(СГ2004||Всего визитов в МД: |pjtxtMA2O03|iBcero визитов в МД:-11х,МА20Ы1|Всего визитов в HJ:Q^fc^SZl[Всего визитов в NJ:]-|lx,HJZU04||Всего визитов в NY:I-I1X1NY20O3)[Всего визитов в NY;jh[txtNY2W*| |... Яс«Т.П. "1* Л»тип, •*. р А *.. ^rx.^nxinnii.. ЧАП'^ пимч-глп п ПЛ‘X..ru-«wui Пмаi20041Вгего еничие: 1 "11х!СТ?И)3]»[ЫМАГВсего визитов; r|tx(Cr2004HtxtMA2Все/О ВИЗИТОВ В CL !l-piitcrao^"""')[всего визитов в С7:|-,1х(СГ2004||Всего визитов в МД: |pjtxtMA2O03|iBcero визитов в МД:-11х,МА20Ы1|Всего визитов в HJ:Q^fc^SZl[Всего визитов в NJ:]-|lx,HJZU04||Всего визитов в NY:I-I1X1NY20O3)[Всего визитов в NY;jh[txtNY2W*| |... Яс«Т.П. "1* Л»тип, •*. р А *.. ^rx.^nxinnii.. ЧАП'^ пимч-глп п ПЛ‘X..ru-«wui П■ .;' . .—"т;т-""г=г^г—.■,.. -и. . ..'-^ь^-тт:: . ■ —-i mzr^T~^r_: _/_. —™ t»lUi^»x«.>3<i»wcowxe«ii>wca»^-Bfi|UJT0T)N“MA-And Ув»(1Дета_Визигвр.2003,1,0) [ -ИЙ|Шт»т].*МА" And Уеаг((Датб~Е^зит^2ОО4Л0^«пармит^-ш ^ri ен.| Дэт^Риа ..,| -2,103 ид -гг||Ш1Ут|-Т4Г And ее»! | дагч>-?„, а]1- 2» ы. 1 Д iIA-J* ,LI i'-;[L.r <- Л ' i 1И7«| 1=2001 1.1,*11(^тат]^А-And Уез^Да^^| [^n(LUw)^A^Ard^ 0иэйтаЬ<ЮО4ЛоГ]■ .;' . .—"т;т-""г=г^г—.■,.. -и. . ..'-^ь^-тт:: . ■ —-i mzr^T~^r_: _/_. —™ t»lUi^»x«.>3<i»wcowxe«ii>wca»^-Bfi|UJT0T)N“MA-And Ув»(1Дета_Визигвр.2003,1,0) [ -ИЙ|Шт»т].*МА" And Уеаг((Датб~Е^зит^2ОО4Л0^«пармит^-ш ^ri ен.| Дэт^Риа ..,| -2,103 ид -гг||Ш1Ут|-Т4Г And ее»! | дагч>-?„, а]1- 2» ы. 1 Д iIA-J* ,LI i'-;[L.r <- Л ' i 1И7«| 1=2001 1.1,*11(^тат]^А-And Уез^Да^^| [^n(LUw)^A^Ard^ 0иэйтаЬ<ЮО4ЛоГ]♦ Миш-ниикоПОИТНТУП♦ Миш-ниикоПОИТНТУПРис. 4.10. Свойство «Сумма с накоплением», установленное в состояние «Для всего»Рис. 4.10. Свойство «Сумма с накоплением», установленное в состояние «Для всего»Сорелня. Другие t SeeСорелня. Другие t See. -П1(£Шга1. -П1(£Шга1Для всего .уДля всего .у
♦ Верхний колонтитул
♦ Верхний колонтитул
Сравнительные сведения
io визитах клиентов по штатам в 2003 и 2004 годах
Сравнительные сведения
io визитах клиентов по штатам в 2003 и 2004 годах
txtCT2004
txtCT2004
< Область данных :.•
Wrarj ЙтатДат э _...•:-.= а Дат».
«ЙЗштвтрХF AndУе^дётё jw^»i>2t&^And Ve^
< Область данных :.•
Wrarj ЙтатДат э _...•:-.= а Дат».
«ЙЗштвтрХF AndУе^дётё jw^»i>2t&^And Ve^
визига
визига
Маске вводе . . , Сунна: накоплением Смарт-теги
Маске вводе . . , Сунна: накоплением Смарт-теги
маi
2004
1
Вгего еничие: 1 "11х!СТ?И)3]»[ЫМАГ
Всего визитов; r|tx(Cr2004HtxtMA2
Все/О ВИЗИТОВ В CL !
l-piitcrao^"""')
[всего визитов в С7:|
-,1х(СГ2004||
Всего визитов в МД: |
pjtxtMA2O03|
iBcero визитов в МД:
-11х,МА20Ы1|
Всего визитов в HJ:
Q^fc^SZl
[Всего визитов в NJ:]
-|lx,HJZU04||
Всего визитов в NY:
I-I1X1NY20O3)
[Всего визитов в NY;j
h[txtNY2W*| |
... Яс«Т.П. "1* Л»тип, •*. р А *.
. ^rx.^nxinnii
.. ЧАП'^ пимч-глп п ПЛ‘
X..ru-«wui П
маi
2004
1
Вгего еничие: 1 "11х!СТ?И)3]»[ЫМАГ
Всего визитов; r|tx(Cr2004HtxtMA2
Все/О ВИЗИТОВ В CL !
l-piitcrao^"""')
[всего визитов в С7:|
-,1х(СГ2004||
Всего визитов в МД: |
pjtxtMA2O03|
iBcero визитов в МД:
-11х,МА20Ы1|
Всего визитов в HJ:
Q^fc^SZl
[Всего визитов в NJ:]
-|lx,HJZU04||
Всего визитов в NY:
I-I1X1NY20O3)
[Всего визитов в NY;j
h[txtNY2W*| |
... Яс«Т.П. "1* Л»тип, •*. р А *.
. ^rx.^nxinnii
.. ЧАП'^ пимч-глп п ПЛ‘
X..ru-«wui П
■ .;' . .—"т;т-""г=г^г—.■,.. -и. . ..'-^ь^-тт:: . ■ —-i mzr^T~^r_: _/_. —™ t»lUi^»x«.>3<i»wcowxe«ii>wca»^
-Bfi|UJT0T)N“MA-And Ув»(1Дета_Визигвр.2003,1,0) [ -ИЙ|Шт»т].*МА" And Уеаг((Датб~Е^зит^2ОО4Л0^
«пармит^-ш ^ri ен.| Дэт^Риа ..,| -2,103 ид -гг||Ш1Ут|-Т4Г And ее»! | дагч>-?„, а]1- 2» ы. 1 Д i
IA-J* ,LI i'-;[L.r <- Л ' i 1И7«| 1=2001 1.1,
*11(^тат]^А-And Уез^Да^^| [^n(LUw)^A^Ard^ 0иэйтаЬ<ЮО4ЛоГ]
■ .;' . .—"т;т-""г=г^г—.■,.. -и. . ..'-^ь^-тт:: . ■ —-i mzr^T~^r_: _/_. —™ t»lUi^»x«.>3<i»wcowxe«ii>wca»^
-Bfi|UJT0T)N“MA-And Ув»(1Дета_Визигвр.2003,1,0) [ -ИЙ|Шт»т].*МА" And Уеаг((Датб~Е^зит^2ОО4Л0^
«пармит^-ш ^ri ен.| Дэт^Риа ..,| -2,103 ид -гг||Ш1Ут|-Т4Г And ее»! | дагч>-?„, а]1- 2» ы. 1 Д i
IA-J* ,LI i'-;[L.r <- Л ' i 1И7«| 1=2001 1.1,
*11(^тат]^А-And Уез^Да^^| [^n(LUw)^A^Ard^ 0иэйтаЬ<ЮО4ЛоГ]
♦ Миш-ниикоПОИТНТУП
♦ Миш-ниикоПОИТНТУП
Рис. 4.10. Свойство «Сумма с накоплением», установленное в состояние «Для всего»
Рис. 4.10. Свойство «Сумма с накоплением», установленное в состояние «Для всего»
Сорелня. Другие t See
Сорелня. Другие t See
. -П1(£Шга1
. -П1(£Шга1
Для всего .у
Для всего .у
Помимо полей, связанных с существующими данными, раздел Область данных содержит 10 свободных текстовых полей, для каждого из которых свойство Сумма с накоплением установлено в состояние Для всего (см. таблицу свойств на рис. 4.10).
В 10 текстовых полях фигурируют 10 возможных условий. Данные обобщаются по двум годам и пяти штатам, для получения общего итога с 10 возможными промежуточными итогами. В каждом свободном текстовом поле ведется подсчет по отслеживаемому в нем источнику. Например, текстовое поле txtCT2004 содержит следующее выражение*
=IIf([Штат]="СТ” And Year([Дата_Визита])=2004;1:Q)
В соответствии с ним накопление суммы возни кает только в том случае, если поле Штат имеет значение «СТ», а год, извлеченный из данных поля ДатаПриема, равен 2004. Каждое текстовое поле устроено таким же образом и допускает накопление суммы при появлении определенного сочетания штата и года приема.
Имена, присвоенные этим текстовым нолям, играют существенную роль, поскольку на них ссылаются другие элементы управления, расположенные в нижнем колонтитуле отчета. Выглядят эти имена следующим образом: txtCT2003, txtCT2OO4, txtMA2003,txtMA2004 ит. д. В общем, в них используются буквенные индексы пяти штатов: СТ, МА, NY, NJ л РА.
Нижний колонтитул отчета разбит на две области, в одной из которых содержится итоговое значение за каждый год. Эти области разделены для наглядности нисколькими элементами Линия. На самом деле никаких установок на разбиение нижнего колонтитула на части не существует. Все текстовые поля нижнего колонтитула являются свободными и содержат ссылки на текстовые ноля из раздала Область данных. Например, в текстовом поле нижнего колонтитула, отображающем итоговое значение для штата СТ за 2003 год, содержится простая ссылка на текстовое поле txtCT2OO3, в котором формируется сумма с накоплением:
=[txtCT2003]
Точно так же устроены все десять полей нижнего колонтитула, отображают! е итоговые данные для разных штатов за разные годы. Каждое из них содержит ссылку на конкретное текстовое поле из раздела Область данных. В двух общих итогах, помещенных в нижний колонтитул, каждый из которых основан на показаниях за отдельный год, просто суммируются значения имеющих к ним отношение пяти текстовых полей из раздела Область данных. Например, в текстовом поле, отображающем общий итог за 2004 год, содержится следующее выражение, вобравшее в себя значения элементов управления, имеющих к нему отношение:
=[txtCT2004]+[tXtHA2004]+[txtNY2004]+|txtNJ2004]+[txtPA2004]
Осуществляя подсчет итогов в разделе Область данных я ссылаясь затем на текстовые поля, в которых формируется сумма с накоплением, вы получаете возможность размещать выходные данные отчета произвольным образом, по своему усмотрению.
Трюк в трюке
Схема данных, показанная в этом трюке (см. риг. 4.9), включает таблицу животных. Л что, если пользователь захочет получить отчет но годам, штатам и животным? Предположим, что в данных встречаю гея 10 видов животных (коты, собаки, птицы и т. д.), тогда у вас будет сто вариантов условий: данные за дна года, п т пяти штатам на десять видов животных. Вы можете, конечно, создать отчет пт методике, рассмотренной в этом т рюке, но это будет слишком утомительным занятием. При таком большом наборе условий лучше воспользоваться отчетом m основе перекрестного запроса. В примере из раздела «Суммирование сложных данных» (Трюк № 45) для демонстрации работы запроса такого типа используется модель данных, взятая из этого трюка.
См. также «Суммирование сложных, данных» (Трюк № 45) и «Использование условного форматирования для выделения важных результатов» (Трюк № 30).
ТРЮК№ 30ТРЮК№ 30Использование условного форматирования для выделения важных результатов
ТРЮК
№ 30
ТРЮК
№ 30
Использование функции условного форматирования и собственной функции, выполни - ющей ту же задачу, созданной без особых усилий в среде VBA.
Результаты и выводы, имеющие особо важное значение, должны быть преподне сены с особой выразительностью. Вместо того чтобы выводить результаты отчета
в виде простого текста, нужно использовать возможности условного форматирования, позволяющие привлечь внимание читателей к важным новостям. Если это хорошие новости, нужно их умело преподнести и обозначить тем самым свои притязания на возможное повышение по службе. Если новости плохие, нужно подобрать такой стиль отображения, который сдерживал бы желание расправиться с тем, кто о них сообщит.
В разделе «Подсчет промежуточных итогов на основе определенных условий» (Трюк № 29) рассмотрено создание отчета на основе данных за два года с использованием промежуточных итоговых значений. Этот прием хорош для проведения анализа путем сравнения результатов одною прошедшего года с результатами следующего и оценки наступивших изменений (включая определение положительных или отрицательных тенденций).
В некоторых отчетах выводится еще и третий столбец, показывающий процентное изменение на основе сравнения двух величии. Хотя такой вариант нами не разбирался, вы можете примени ть условное форматирование, рассматриваемое в данном трюке, для текстовых полей, отражающих процентные изменения, если сочтете нужным включить их в отчет.
Стандартное условное форматирование
Система Access предоставляет неплохую утилиту форматирования, позволяющую легко изменять атрибуты шрифта, цвет букв и фона при наступлении заданных условий. Па рис. 4.11 показано диалоговое окно Условное форматирование. В данном примере в качестве условий выступают некоторые выражения. Вместо них вы можете использовать фактические значения данных.
Рис. 4.11. Цвета шрифта, изменяющиеся в зависимости от условий
Окно Условное форматирование открывается но команде меню Формат ► Условное форматирование. Оно позволяет одновременно форматировать только один элемент, поэтому перед тем, как получить доступ к команде меню, следует выбрать этот элемент управления. Пункт меню остается недоступным и в том случае, если элемент управления нс может быть подвергнут условному форматированию.
На рис. 4.11 показано условное форматирование, установленное для текстово -о поля txtCT2004_Hror. В частности, для этого элемента установлены три условия форматирования, в которых рассматривается процентная разница итогов 2003 и 2004 годов:
Больше 20 %:
([txtCT26e4]-[tXtCT2903])/[txtCT2093J>9.2
Больше или равна 15 % и равна или меньше 20 %: ([txtCT2904]-[txtCT2003]) / [txtCT2003]<=9.2 And ([txtCT29941-[txtCT2093])/(txtCT2903)>0.15
Больше 10 % и равна или меньше 15 %: ([txtCT2904]-[txtCT2003])/{txtCT2003]<=9.15 And ([txtCT2094]-[txtCT2003})/[txtCT2903]>0.1
Наступление каждого из условий вызывает форматирование поля в соответствии с установками, сделанными в диалоговом окне Условное форматирование. Все бы хорошо, да вот количество условий ограничено всего тремя, из-за чего могут потребоваться иные подходы к решению этой задачи.
Способ условного форматирования с применением VBA
Используя процедуры обработки событий отчета, вы можете задать форматы, нед< - ступные стандартной функции условного форматирования. У стандартной функции есть два основных ограничения: проверка не более трех условий и недс - ступ ность некоторых приемов форматирования.
Эти ограничения можно обойти, создав собственное условное форматирование с помощью VBA. На рис. 4.12 показан отчет, в котором ясно выделяется итоговое количество визитов за 2004 год, оформленное с использованием обрамления.
Рис. 4.12, Условное форматирование, осуществленное с помощью кода VBA
Такое оформление стало следствием совпадения условий, проверяемых при выполнении программного кода, помещенного в процедуру обработки события Печать, относящегося к нижнему колонтитулу:
Private Sub НижнИйКопонтитул_Рг1п1 (Cancel As Integer, Printcount As _ Integer)
Dim визиты_изменения As Single
визиты_изменения = ([txt2S04_HTor] - [txt2003_HTor]) / [txt2003_HTor]
Select Case визиты_изменения
Case Is > 0.25
Me.txt2004_Hror,Praperties("ForeColar") = vbBlue
Me.txt2004_Hjor.Properties("Borderstyle") = 1
Me , txt2Q04_Hror. PropertiesfBorderColOr") = vbBIack
Me.txt2904_HTor.Properties("Font Italic") = I
Case Is <= 0.25, Is > 0.2
He.txt2004—итог.Properties("foreColor”) = vbSlue
Case Is <= 0.2, Is > 0.15
Me.txt2004_Hror.Properties("ForeColor") = vbGreen
Case Is <- 6.15. Is > 0.1
Me.txt2004_Hror.Properties("ForeColor") = vbMagenta
Case Is <= 0.1, Is > 0
Me.txt2004_HTor.Properties("ForeColor") = vbBIack Case Is <= G
Me.txt2004_Hjor.Properties("Borderstyle") = 1
Me.txt2004_Hror.Properties("BorderColor"} = vbRed
End Select
End Sub
В процессе выполнения процедуры отслеживаются процентные изменения, а затем операторы группы Select Case обеспечивают реализацию различных установок форматирования в зависимости от степени наступивших изменений. В примере обеспечивается проверка шести условий, но на самом деле их количество ничем не ограничено и должно отвечать задачам приложения. Способы форматирования определяются возможностями VBA и практически также ничем не ограничены.
ТРЮК№ 31ТРЮК№ 31Создание прямой ссылки на отчет
ТРЮК
№ 31
ТРЮК
№ 31
Создание на Рабочем столе ярлыка для работы с отчетом, независимо от работы с самой базой данных.
Избавление от процесса открытия базы данных может существенно облегчить работу менеджера или сотрудника, испытывающего сложности в работе с базой. Вы можете без особых усилий облегчить им работу, создав ярлык, указывающий непосредственно на отчет, и поместив его на Рабочий стол.
Создание ярлыка
Для создания такого ярлыка нужно сначала открыть окно базы данных, азатем щелкнуть правой клавишей на значке избранного отчета. Появившееся контекстное меню будет содержать пункт Создать ярлык (рис. 4.13).
После выбора пункта Создать ярлык появится диалоговое окно, в котором нужно выбрать место для ярлыка. По умолчанию будет предложено сохранить его на Рабочем столе текущего пользователя (рис. 4.14).
Рис. 4.13. Создание ярлыка для отчета
Рис. 4.14. Выбор места для ярлыка
После щелчка на кнопке ОК требуемый ярлык будет создан. Теперь по щелчку на этом ярлыке будет открыта база данных, а в ней открыт отчет, но, к сожалению, после этого база данных так и останется открытой.
Распечатка отчета и закрытие базы данных одним щелчком
Лучше было бы дать возможность одним щелчком на ярлыке автоматически распечатать отчет и закрыть после этого базу данных. Похоже, что без макроса здес i не обойтись!
На рис. 4.15 показана простая макрокоманда, распечатывающая отчет, а затем закрывающая базу данных.
Главная задача — открыть отчет. Важно также выбрать для свойства Режим значение Печать, а не Просмотр или Конструктор. Тогда отчет вместо вывода на экран бу-
Рис. 4.15. Использование макрокоманды для запуска отчета и закрытия базы данных
дет сразу же отослан на принтер. Следующее действие — Выход — приведет к закрытию базы данных.
Учтите, что если отчет генерируется на основе выбора параметров из формы, то нужно будет создавать ярлык, указывающий на эту форму. Подобные ярлыки можно создавать для любых объектов базы данных.
ТРЮК№ 32ТРЮК№ 32Защита интеллектуальной собственности
ТРЮК
№ 32
ТРЮК
№ 32
Защита конфиденциальных и авторских материалов путем включения в отчет «водяных знаков».
Если кто-то покушается на вашу интеллектуальную собственность, то вы вряд ли найдете от этого стопроцентные меры защиты. Но здравый смысл подсказывает, что нужно предпринять все возможное, чтобы отстоять свою интеллектуальную собственность. Часто в этих целях на страницу, в верхний пли нижний колонтитул отчета, помешают какую-нибудь фразу, свидетельствующую о конфиденциальности материала. Но такой способ нс дает гарантии, что сообщение будет сразу бросаться в Глаза.
В качестве дополнительной меры можно поместить в отчет водяные знаки, которые пройдут прямо по тексту отчета на всех страницах. Сообщение, выбранное в качестве водяных знаков, следует сделать прозрачным, не затеняющим текст, и поместить прямо под ним. Для заметности оно должно быть набрано большими буквами и следовать по всему листу.
На рис. 4.16 показан отчет, в котором водяные знаки занимают пространство данных. Слово «Конфиденциально» следует по диагонали с нижнего левого в верхний правый угол. Текст отчета выглядит напечатанным поверх водяных знаков.
Создание водяных знаков
Водяные знаки создаются при помощи изображения, помещаемого в отчет, в свойство Рисунок. Для его создания вам понадобится программа работы с гра-
Рис. 4.16. Использование водяных знаков в виде диагонального сообщения
фикой. Среди имеющихся программ, работающих с изображениями, я предпоч! ■ таю хорошую и вполне доступную программу Paint Shop Pro компании Corel Corp (www.jasc.com). Любая используемая в наших целях программа должна выполнять следующее:
работать с текстом в графическом режиме;
растягивать и разворачивать изображения;
регулировать прозрачность изображения.
В готовом рисунке прозрачность изображения должна достигать 75 %. Наилучшего результата можно добиться методом проб и ошибок.
Подбор размера изображения
Создавая изображение, нужно растянуть его почти на весь лист бумаги. Каким будет но размеру созданное изображение, таким оно и появится в отчете (в зависимости от состояния свойств, рассматриваемых далее в этом трюке).
Сохранять изображение следует в файле с расширением .jpg, .bmp и т. д.
ПРИМЕЧАНИЕ
Вы можете использовать для файла любой формат, подходящий для вставки изображений в свойство отчета Рисунок.
Рис. 4.17. Водяные знаки в графическом файлеРис. 4.17. Водяные знаки в графическом файлеПроцесс создания изображения в данном трюке не рассматривается, но к вашему сведению, изображение на рис. 4.16 имеет’ 70 % прозрачности и было сохранено в формате .jpg. Размер картинки может быть 10-18 см. Внешний вид созданного изображения показан на рис. 4.17.
Рис. 4.17. Водяные знаки в графическом файле
Рис. 4.17. Водяные знаки в графическом файле
Использование водяных знаков
После создания файла с водяными знаками переходите в режим конструирования отчета. В списке свойств нужно щелкнуть на свойстве Рисунок и выбрать в окне обзора графический файл (рис. 4.18).
Со свойством Рисунок связано еще несколько важных установок, описанных ниже.
Тип рисунка
Можно выбрать одно из двух значений: Внедренный и Связанный. Правильно будет выбрать внедренный тип рисунка. Если выбрать связанный тип, то при генерации отчета будет предприниматься попытка открыть внешний графический файл.
® ■!Й^': or«ilir® ■!Й^': or«ilirКлиент:Клиент:< Обметь A**t>'X< Обметь A**t>'XКлиентКлиентСчетчик визитов;Счетчик визитов;, , . Фрагмент, , . .По цен тру, , . Фрагмент, , . .По цен тру‘ Вс е‘ Вс еКнопки размеров окна . . Кнопка мкрытий , . ,,РисунокTwi рисунка ■ . . Масштабы рисуиса Вь^завниван*™ рисунка . . Мозаисте заполнение . , , . Странны с рисунком . . ,<т-<::-: i,»::»:,-^».;!!,:;;!^;:^»^.;,; ■.: .:>,..,. ,.;.. .... . .....Кнопки размеров окна . . Кнопка мкрытий , . ,,РисунокTwi рисунка ■ . . Масштабы рисуиса Вь^завниван*™ рисунка . . Мозаисте заполнение . , , . Странны с рисунком . . ,<т-<::-: i,»::»:,-^».;!!,:;;!^;:^»^.;,; ■.: .:>,..,. ,.;.. .... . .....Рис. 4.18. Установка а отчете свойства РисунокРис. 4.18. Установка а отчете свойства Рисунок^Г^^^^^^^уд^Г^^^^^^^удКоличествоКоличество* Нижний колонгмтуп* Нижний колонгмтуп, . 13j097ch. ,Ок)ррсЦр^, , .Внедре*1ый, . 13j097ch. ,Ок)ррсЦр^, , .Внедре*1ыйВсе страницыВсе страницы
® ■!Й^': or«ilir
® ■!Й^': or«ilir
Клиент:
Клиент:
< Обметь A**t>'X
< Обметь A**t>'X
Клиент
Клиент
Счетчик визитов;
Счетчик визитов;
, , . Фрагмент
, , . .По цен тру
, , . Фрагмент
, , . .По цен тру
‘ Вс е
‘ Вс е
Кнопки размеров окна . . Кнопка мкрытий , . ,,
Рисунок
Twi рисунка ■ . . Масштабы рисуиса Вь^завниван*™ рисунка . . Мозаисте заполнение . , , . Странны с рисунком . . ,
<т-<::-: i,»::»:,-^».;!!,:;;!^;:^»^.;,; ■.: .:>,..,. ,.;.. .... . .....
Кнопки размеров окна . . Кнопка мкрытий , . ,,
Рисунок
Twi рисунка ■ . . Масштабы рисуиса Вь^завниван*™ рисунка . . Мозаисте заполнение . , , . Странны с рисунком . . ,
<т-<::-: i,»::»:,-^».;!!,:;;!^;:^»^.;,; ■.: .:>,..,. ,.;.. .... . .....
Рис. 4.18. Установка а отчете свойства Рисунок
Рис. 4.18. Установка а отчете свойства Рисунок
^Г^^^^^^^уд
^Г^^^^^^^уд
Количество
Количество
* Нижний колонгмтуп
* Нижний колонгмтуп
, . 13j097ch
. ,Ок)ррсЦр^
, , .Внедре*1ый
, . 13j097ch
. ,Ок)ррсЦр^
, , .Внедре*1ый
Все страницы
Все страницы
Размеры рисунка
Можно выбрать один из трех вариантов: Фрагмент, Вписать в рамку и По размеру рамки. Каждый из них представляет собой различные способы размещения график i в отчете. Понять суть каждого варианта можно экспериментальным путем. Тем не менее, как уже было отмечено ранее, если размер создаваемого рисунка был выбран правильно, следует выбрать вариант Фрагмент. Правильный подход к созданию рисунка избавит вас от необходимости подбирать способ размещения его в отчете.
Выравнивание рисунка
Вы можете выбрать один из пяти вариантов: Сверху слева, Сверху справа, По центру, Снизу слева, Снизу справа. Большинство предпочитают выбирать установку По центру, но вашим нуждам может лучше соответствовать и другой вариант.
Мозаичное заполнение
Вы можете выбрать либо Да, либо Нет. Если установить Нет, рисунок будет поме щен на страницу один раз. Если Да — его копии заполнят все пространство стра липы наподобие мозаики. Вы можете попробовать оба варианта и выбрать наиболее подходящий. Если выбрать Да, водяные знаки станут выглядеть бо лее насыщенно. Возможно, именно это и будет отвечать вашим вкусам.
Страницы с рисунком
Это свойство позволяет определить, на каких страницах будут появляться водяные знаки. Есть три варианта: Все страницы. Первая страница п Отсутствует.
ВНИМАНИЕ
Если выбрать последний вариант, водяных знаков вы просто не увидите!
Возможно, что вам также придется изменить в отчете состояние свойства Тип фона. Может быть, вам придется это сделать из-за того, что водяные знаки появляются за текстом, а текстовые поля могут занимать больше места, чем заполняющий их текст. На рис. 4.19 показаны неприятные последствия подобной ситуации. Прямоугольники текстовых полей перекрывают час ть водяных знаков. Границы текстовых полей остаются невидимыми, но прямоугольные площади, занимаемые ими, частично накладываются на водяные знаки. И хотя текстовое наполнение в этих местах отсутствует, прямоугольники полей становятся видны на фоне расположенных под ними водяных знаков.
Рис. 4.19. Текстовые поля, перекрывающие водяные знакиРис. 4.19. Текстовые поля, перекрывающие водяные знаки
Рис. 4.19. Текстовые поля, перекрывающие водяные знаки
Рис. 4.19. Текстовые поля, перекрывающие водяные знаки
Чтобы устранить этот эффект, нужно войти в режим конструирования отчета. Для всех текстовых нолей, проецирующихся на водяные .знаки, следует изменить состояние свойства Тип фона с Обычного на Прозрачный, Тогда в текстовых полях будет пропечатываться только текст, к чему мы, собственно, и стремились. Па рис. 4.20 показан внешний вид отчета после установки прозрачности фона текстовых полей.
Рис. 4.20. Водяные знаки, проступающие через текстовые поляРис. 4.20. Водяные знаки, проступающие через текстовые поля
Рис. 4.20. Водяные знаки, проступающие через текстовые поля
Рис. 4.20. Водяные знаки, проступающие через текстовые поля
ТРЮК№ 33ТРЮК№ 33Демонстрация слайдов в Access
ТРЮК
№ 33
ТРЮК
№ 33
Использование изображений и события Таймер для создания управляемой демонстрации слайдов.
Встраивание в Access изображений приводит к весьма впечатляющим результатам. Появляется возможность поместить в приложение изображения товаров, фотографии сотрудников и заменить любые текстовые описания наглядными иллюстрациями. Обычно полные имена графических файлов хранятся и поле таб ■ липы. Таким образом изображения связаны с данными, хранящимися в таблице При отображении записи в форме управляющий элемент Рисунок может быть за полнен изображением, найденным в указанном месте.
В данном трюке не используется сценарий, основанный на хранении данных Вместо этого в нем применяется свободная форма, в которой отображается про извольный набор изображений. Решение, в котором задействованы сохраненные данные, может быть скомбинировано с той технологией, которая здесь рассматривается. Например, в форме могут отображаться записи базы данных, а произвольные изображения могут помещаться в заголовок или примечание формы.
В данном трюке для вывода на экран изображения и демонстрации способа егс автоматической замены на другое с периодичностью в несколько секунд использу-
ется элемент управления Рисунок. Кроме этого, в трюке применяется ручной способ замены изображения.
Графика
В примере, иллюстрирующем суть данного трюка, все изображения собраны в одном каталоге, путь к которому жестко задан в программе. Но небольшое дополнение программного кода даст возможность использовать множество каталогов, задавать нужный каталог в диалоговом режиме и т. д. А теперь предположим, что подборка файлов с расширением .jpg размещается в каталоге, показанном на рис. 4.21.
Рис. 4.21. Каталог, содержащий файлы изображений
Не обязательно выбирать файлы формата J PG. Вы можете использовать и другие форматы, например BMP и TIF (указав их расширения в коде программы).
Конструкция формы
На рис. 4.22 показана форма в режиме конструирования. Она содержит ряд элементов управления; несколько элементов Кнопка, элементы Флажок и Рисунок. В элементе Рисунок содержится начальное изображение, которое будет заменяться другими в процессе демонстрации слайдов.
Нетрудно заметить, что пользователю доступен как автоматический, так и ручной режим просмотра слайдов. Кнопки Следующее и Предыдущее при отключенном режиме автоматического просмотра позволяют передвигаться вперед и назад по коллекции изображений. Щелчки на этих кнопках вызывают циклический
Рис. 4.22. Конструкция формы для демонстрации слайдов
перебор коллекции, созданной средствами VBA, и замену ссылки на изображение в свойстве управляющего элемента Рисунок.
Элемент управления Флажок используется для задания режима просмотра. При установке этого флажка начинается непрерывный показ. Независимо от состоя нпя флажка, для начала демонстрации необходимо щелкнуть на кнопке Пуск. Тем самым пользователь имеет возможность запускать процесс просмотра.
Поскольку имеется кнопка Пуск, то должна быть и кнопка Стоп. С ее помощью всего-навсего изменяется значение логической глобальной переменной стоп_по каз с false на true.
Код
Для работы приложения необходимо воспользоваться событием Таймер. В следу ющем далее программном фрагменте интервалу таймера присваивается значение 2000, чем вызывается наступление события Таймер каждые две секунды. Изменят это значение, вы можете подобрат ь другой временной интервал:
Option Compare Database
Public стоп_показ As Boolean
Public рисунки As Collection
Public номер As Integer
Private Sub Form_Open(Cancel As Integer)
'Установка начальных свойств
He.сЬк_НепрерывныЙПросмотр ~ False
Me. c»d_Cneдующее. Enabled = False
Me.cmd-Предыдущее.Enabled = False
End Sub
Private Sub cmd_nycK_Click( )
'считывание путей графических файлов в коллекцию
'отображение первого изображения
Me.Timerinterval = 2000
стол_показ = False
If Me. сЬк_Непрерывный(1росмотр = False Then
Me.стЬ_Следующее.Enabled = True
Me.стб_Предыдущее.Enabled = True
End If
в следующей строке нужно указать собственный путь!! рис_путь = "С:\0бразцы товаров фото"
Set рисунки = New Collection
Set fs = Application.Fi leSearch
With fs
.Lookin = рис_путь
.EileName = "*.jpg"
If .Execute! ) > 0 Then
For 1 = 1 To .foundfiles.Count
рисунки.Add Item:=.foundfiles(i)
Next 1
Else
MsgBox "Файлы не найдены!"
End If
End With
'загрузка первого изображения
Me.1те_Рисунок1.Picture = рисунки(1)
номер = 1
End Sub
Private Sub стР_Следующее_С11ск( )
'переход к следующему изображению
'коллекции
If номер = рисунки.Count Then
номер = 1
Else
номер = номер + 1
End If
Me img_PMcyHOKl.Picture = рисунки(номер)
End Sub
Private Sub стб_Предыдущее_С11ск( )
'переход к предыдущему изображению
'коллекции
If номер = 1 Then
номер = рисунки.Count
Else
номер = номер - 1
End If
Me.img-Рисунок],Picture = рисунки(номер)
End Sub
Private Sub cmd_Cron_Click( )
‘установка глобальной переменной в True
'отключение действия кнопок Следующее и Предыдущее
стоппоказ = True
Me.стО_Следующее.Enabled = False
Me.стЬ_Предыдущее.Enabled = False
End Sub
Private Sub Form_Timer( )
'При включенном непрерывном просмотре и если не было щелчка на кнопке 'Стоп продолжить циклический показ изображений
If Me.сЬк_НепрерывныйПросмотр = True _
And стоп_показ = False Then cmd_Cnедующее_С11ск End Sub
Данный фрагмент состоит из нескольких процедур. В процедуре обработки собь - тия Открытие (в тексте программы — Open) формируется коллекция ссылок на изображения, обнаруженные в указанном каталоге. При этом в программе жестка задаются как тип файлов с изображениями, так и имя каталога. Объект FileSearcт использует эти значения для поиска файлов с изображениями. Вы можете расширить сферу поиска на несколько каталогов и (или) несколько типов файлов. Ка < это сделать, можно узнать в описании объекта FileSearch, помещенном в справочной системе, или в Интернете.
Характер работы приложения после его запуска определяет состояние флажка сКк_НепрерывныйПоказ. Если он сброшен, то для перехода от одного изображения к другому служат кнопки Следующее и Предыдущее. При щелчке на любой из них индекс коллекции увеличивается или уменьшается на единицу, а свойству Рисунок (фигурирующему в коде программы как Picture) присваивается значение конкретного элемента коллекции.
Если флажок сйк_НепрерывныйПоказ установлен, кнопки Следующее и Предыдущее становятся недоступными и показ слайдов будет происходить автоматически. Периодичность смены изображений зависит от значения интервала таймера. По ■ каз будет идти до тех пор, пока не последует щелчок на кнопке Стоп. После этого щелчка переменной стоп_показ будет присвоено значение true. Процедура обра ботки события Таймер (в тексте программы — Timer) при таком значении пере менной прекратит циклический показ изображений, поскольку он возможен толь ко при значении false.
Трюк в трюке
Вы можете усовершенствовать это приложение несколькими способами. Заметьте, изображение не имеет сопроводительного текста. Если по-прежнему придерживаться произвольного подхода к выбору изображений, то одним из вариантог решения этой проблемы станет вывод сведений об изображении по щелчку нг самом рисунке. Управляющий элемент Рисунок имеет обрабатываемое событие Нажатие кнопки, которым можно воспользоваться для вывода значения свойства Рисунок (рис. 4.23).
Рис. 4.23. Использование события «Нажатие кнопки», относящегося к элементу управления «Рисунок»Рис. 4.23. Использование события «Нажатие кнопки», относящегося к элементу управления «Рисунок»
Рис. 4.23. Использование события «Нажатие кнопки», относящегося к элементу управления «Рисунок»
Рис. 4.23. Использование события «Нажатие кнопки», относящегося к элементу управления «Рисунок»
Поскольку демонстрируемое изображение способно вернуть имя своего файла, вы можете воспользоваться событием Нажатие кнопки для поиска и отображения любой информации, касающейся этого изображения. Например, если можно выделить имя файла изображения, то можно и собрать дополнительные сведения о нем из текстового файла или из других источников.
Сам собой напрашивается еще один подход к решению рассматриваемой задачи: связать элемент управления Рисунок с полными именами файлов, размещенными в таблице. Тогда соседние поля каждой записи могли бы содержать комментарии к рисунку. На самом деле такой подход считается более естественным. Ранее я не заострял на нем внимание из-за трудоемкости его реализации: обновление полных имен файлов в записях табл 11 цы преподнести сложнее, чем просто задать один- еди нетленный путь непосредственно в коде профам мы. К тому же если вы будете приспосабливать программу для работы с файлами, путь к которым определяется самим пользователем, то независимый подход будет предпочтительнее, поскольку не потребует предварительного ввода в базу данных полных имен файлов.
ТРЮК№ 34ТРЮК№ 34Проигрывание видеоклипов в форме Access
ТРЮК
№ 34
ТРЮК
№ 34
Внедрение мультимедийного способа подачи информации с использованием Проигрывателя Windows Media.
Внести разнообразие в приложения базы данных можно весьма эффектным способом — придать им способность воспроизведения видеоклипов. Хотя может показаться, что в «серьезном» деле развлечения неуместны, демонстрация видеоклипов — один из самых наглядных способов подачи информации. Существует
несколько способов встраивания в идеотех пологий в базу данных. Можно связать видеоклипы с записями и проигрывать их параллельно с выводом па экран соответствующих данных. Л можно проигрывать видеоклипы независимо от работы остальных компонентов приложения, по мере необходимости (для чего потребуется использование кнопки или других способов управления началом воспроизведения). Чтобы воспроизводить видеоклипы, потребуется включить в форму специально предназначенный для этого элемент управления. Существует несколько подоб- пых элементов, наиболее известным из которых является Проигрыватель Windows Media, используемый в данном трюке.
Включение в форму проигрывателя
Сначала нужно добавить в форму Проигрыватель Windows Media. Поскольку он не входит в перечень стандартных элементов управления, доступ к нему нужно пол) - чить через кнопку Другие элементы, расположенную на Панели элементов (рис. 4.24).
Рис. 4.24. Поиск дополнительных элементовРис. 4.24. Поиск дополнительных элементов
Рис. 4.24. Поиск дополнительных элементов
Рис. 4.24. Поиск дополнительных элементов
После щелчка на кнопке Дополнительные элементы появится длинный перечень элементов управления и библиотек. Прокрутите список вниз и найдите Window:; Media Player (рис. 4.25).
TSHOOTCtrl Class
VConvnard Class
VDr.t Class
VidaoReriderCtl Gass
WebCommand Control
Wetiviewfotierlcon Class
WebVrewFukler Icon Class
W1A Video Preview Gass
Windows Media Player
Обозреватель веб-страмиг (Microsoft) Оболочка - маршрутизатор просмотра папок Объект |Wg аГюл Wizard 0С6Ё Automation Панель ссылок
Рис. 4.25. Выбор Проигрывателя Windows Media
После щелчка на элементе управления прорисуйте указателем мыши его контуры на форме. На рис. 4.26 показана форма, содержащая Проигрыватель Windows Media, список и кнопку. В данной конфигурации в списке отображается перечень доступных видеоклипов. После щелчка на кнопке Воспроизвести начнется воспроизведение выбранного видеоклипа.
Режин формыРежин формыW Доп ■ Qp-vstf» ■ ^щ рстдвке Фордот сервис Qkmo QipewaW Доп ■ Qp-vstf» ■ ^щ рстдвке Фордот сервис Qkmo QipewaРис. 4.26. Конструирование формы, содержащей Проигрыватель Windows MediaРис. 4.26. Конструирование формы, содержащей Проигрыватель Windows Media|3№<1нте ы,ч>х|3№<1нте ы,ч>х
Режин формы
Режин формы
W Доп ■ Qp-vstf» ■ ^щ рстдвке Фордот сервис Qkmo Qipewa
W Доп ■ Qp-vstf» ■ ^щ рстдвке Фордот сервис Qkmo Qipewa
Рис. 4.26. Конструирование формы, содержащей Проигрыватель Windows Media
Рис. 4.26. Конструирование формы, содержащей Проигрыватель Windows Media
|3№<1нте ы,ч>х
|3№<1нте ы,ч>х
На рис. 4.26 список заполнен именами файлов видеоклипов с расширениями .mpg. Список состоит из двух столбцов. В первом столбце содержатся полные имена файлов. Его ширина установлена в ноль, поэтому он не виден пользователю. А во втором, видимом, столбце содержатся имена видеоклипов в произвольной форме. После выбора видеоклипа пользователь щелкает на кнопке Воспроизвести и запускает просмотр. По сути, это пример реализации простейшего списка воспроизведения. На рис. 4.27 показана форма в рабочем режиме перед запуском воспроизведения.
Воспроизведение видеоклипа
Как же воспроизвести видеоклип? На самом деле весьма просто: передать свойству URL Проигрывателя Windows Media полное имя файла с видеоклипом, и воспроизведение начнется автоматически. В следующей процедуре обработки события Нажатие кнопки полный путь к файлу с видеоклипом берется из элемента Список_клилов и передается элементу Проигрыватель:
Рис. 4.27. Выбор видеоклипа
Private Sub спЩ_Воспроиз0едение_С1ick( )
If Not IsNull(Me.Список_клипов) Then
Me.Проигрыватель.URL = Me,Список_кпипов
Else
MsgBox "Сначала нужно выбрать видеоклип!"
End If
End Sub
Функции воспроизведения, остановки, перемотки и паузы являются встроенными и доступны через кнопки на самом проигрывателе. Благодаря им пользователь может управлять воспроизведением видеоклипа.
Проигрыватель Windows Media имеет множество обрабатываемых событий. Немного фантазии и смекалки откроют широкие возможности по внедрению видео ■ клипов в ваши приложения. В этом трюке представлены лишь основы техноло пш воспроизведения видеоклипов, но вы можете поэкспериментировать с программ ным кодом и найти множество новых способов работы с проигрывателем.
См. также Windows Media Support Center (http://support.microsoft.com/defauLt.asp>: ?scid=fh;en-us;wmp).
ТРЮК№ 35ТРЮК№ 35Просмотр в отчетов в форме
ТРЮК
№ 35
ТРЮК
№ 35
Просмотр текущих или ранее созданных отчетов непосредственно в рабочей форме.
Система Access считается одним из наиболее развитых инструментальных средстг составления отчетов из всех имеющихся на рынке программных продуктов Начиная с Access 97 корпорация Microsoft декларировала возможность создавать
образы отчетов с целью их просмотра в свободно распространяемом средстве Snapshot Viewer, которое можно загрузить с веб-сайта Microsoft (http://www. microsoft.com/downloads).
Разработчики приложений базы данных Access могут повысить качество создаваемых программных продуктов за счет использования средства ActiveX Snapshot Viewer для просмотра отчетов в рабочей форме.
Создание формы
В состав формы включены поле со списком и ActiveX Snapshot Viewer. В поле со списком содержится перечень отчетов, имеющихся в базе данных. Это поле заполняется при открытии формы, во время работы процедуры обработки события Загрузка:
Private Sub Form_Load( )
Dim obj As Accessobject. dbs As Object
Dim strList As String
Set dbs = Application.Currentproject
For Each obj In dbs.AllReports
strList = strList & obj.Name & “;"
Next obj
cboReports,RowSourceType = "Value List"
cboReports.RowSource = strList
End Sub
Для вставки в форму управляющего элемента ActiveX Snapshot Viewer следует щелкнуть на значке Другие элементы, расположенном на Панели элементов (рис. 4.28), прокрутить вниз появившийся список и выбрать Snapshot Viewer Control 11.0. Учтите, что в зависимости от установленной у вас версии Access это средство может быть более ранней версии, чем 11.0.
Рис. 4.28. Добавление в форму элемента ActiveX Snapshot ViewerРис. 4.28. Добавление в форму элемента ActiveX Snapshot Viewer
Рис. 4.28. Добавление в форму элемента ActiveX Snapshot Viewer
Рис. 4.28. Добавление в форму элемента ActiveX Snapshot Viewer
Размер рамки для элемента управления Snapshot Viewer следует выбрать приблизительно равным по ширине размеру бумаги, используемой для распечатки отчетов, тогда при просмотре отчета не придется пользоваться горизонтальной
прокруткой. На рис. 4.29 показана форма в режиме конструирования с размещенным в ней средством просмотра отчетов Snapshot Viewer.
Рис. 4.29. Подбор размера для элемента Snapshot Viewer
После того как элемент Snapshot Viewer будет вставлен в форму, в процедуру обработки события Изменение (в программном коде — Change), относящуюся к пол о со списком, нужно поместить следующий код, при этом название элемента формы Snapshot Viewer должно соответствовать названию, использованному в программном коде:
Private Sub cboReports_Change( )
DoCmd.OutputTo acOutputReport, cboReports, acFormatSNP, _ Application.Currentproject.path & "\temp.snp"
SnapshotViewerl. Snapshotpath =_
Application.Currentproject.path & "Xtemp. snp“
End Sub
В приведенном примере создается временный образ отчета, названный temp.sn т, который помещается в рабочий каталог базы данных. Затем отчет temp.snp загружается в Snapshot Viewer. Файл temp.snp при выборе для просмотра нового отче та переписывается. Если вы работаете с удаленного места с общей базой дампы ;,
Рис. 4.30. Отображение отчета
Трюк № 36. Нумерация строк отчета 123 то хранить временный файл, во избежание проблем, связанных с многопользовательской средой, следует не на сетевой машине, а на локальном компьютере.
В готовой форме па рис. 4.30 отображается выбранный в иоле со списком отчет под названием Счет.
Данный трюк позволяет иметь в приложении единое средство для просмотра выбранного отчета перед его выводом на печать. Обратите внимание на то, что управляющий элемент ActiveX Snapshot Viewer имеет кнопку Печать, расположенную рядом с кнопками навигации.
Трюк в трюке
Образы отчетов, в отличие от настоящих отчетов, относящихся к динамичным объектами Access, являются статичными объектами, что позволяет сохранять их в папках, а затем просмат ривать как архивные документы в Snapshot Viewer. Вы можете внести изменения в программный код, позволяющие просматривать в Snapshot Viewer архивные отчеты из заданной папки, поместив в поле со списком имена файлов, в которых хранятся образы отчетов.
ТРЮК№ 36ТРЮК№ 36Нумерация строк отчета
ТРЮК
№ 36
ТРЮК
№ 36
Использование свойства суммы с накоплением для включения в отчет счетчика.
< $wn.: QpaSK# : feu бСТ^КД:. Формат OgpBiTC ЙО» утр*К8< $wn.: QpaSK# : feu бСТ^КД:. Формат OgpBiTC ЙО» утр*К8<5 541 ft<5 541 ft< Верхний колонтитул< Верхний колонтитулКлиент:Клиент:4 Облаете» данных4 Облаете» данных;Оргамиза1>1я;Оргамиза1>1я<Нп>1Ю1Й*М^<Нп>1Ю1Й*М^-№К ,^J^v;«^teй>1я . . ЬМНумераиияСгрок-№К ,^J^v;«^teй>1я . . ЬМНумераиияСгрокФормат погч.Числе десяти*»1ых знаков . - .Маска ввода -Формат погч.Числе десяти*»1ых знаков . - .Маска ввода -Вывод на игранПо вертикали . , . .НИ! ВЫВОДИТ^. НОВ Т ОрыВывод на игранПо вертикали . , . .НИ! ВЫВОДИТ^. НОВ Т ОрыИмя идеи?ифмкатсод, использованного в быражбннн, макросе, гюсиедуреИмя идеи?ифмкатсод, использованного в быражбннн, макросе, гюсиедуреРис. 4.31. Текстовое поле, предназначенное для нумерации строкРис. 4.31. Текстовое поле, предназначенное для нумерации строкКогда-нибудь у вас может возникнуть потребность в нумерации строк отчета. Делается это очень просто. Весь трюк состоит в том, чтобы включить в отчетсво-
< $wn.: QpaSK# : feu бСТ^КД:. Формат OgpBiTC ЙО» утр*К8
< $wn.: QpaSK# : feu бСТ^КД:. Формат OgpBiTC ЙО» утр*К8
<5 541 ft
<5 541 ft
< Верхний колонтитул
< Верхний колонтитул
Клиент:
Клиент:
4 Облаете» данных
4 Облаете» данных
;Оргамиза1>1я
;Оргамиза1>1я
<Нп>1Ю1Й*М^
<Нп>1Ю1Й*М^
-№К ,^J^v;«^te
й>1я . . ЬМНумераиияСгрок
-№К ,^J^v;«^te
й>1я . . ЬМНумераиияСгрок
Формат погч.
Числе десяти*»1ых знаков . - .
Маска ввода -
Формат погч.
Числе десяти*»1ых знаков . - .
Маска ввода -
Вывод на игран
По вертикали . , . .
НИ! ВЫВОДИТ^. НОВ Т Оры
Вывод на игран
По вертикали . , . .
НИ! ВЫВОДИТ^. НОВ Т Оры
Имя идеи?ифмкатсод, использованного в быражбннн, макросе, гюсиедуре
Имя идеи?ифмкатсод, использованного в быражбннн, макросе, гюсиедуре
Рис. 4.31. Текстовое поле, предназначенное для нумерации строк
Рис. 4.31. Текстовое поле, предназначенное для нумерации строк
бодное текстовое поле, выбрать значение Для группы или Для всего в его свойстве Сумма с накоплением и присвоить его свойству Данные стартовое значение.
На рис. 4.31 показан отчет в режиме конструирования. Текстовое поле, размещенное слева, является свободным и в нем, в процессе генерации отчета, будет отображаться номер строки. В диалоговом окне свойств этого ноля показано, что свойству Данные присвоено начальное значение-1.
На рис. 4.32 показано, как выглядит сгенерированный отчет.
Значение, присвоенное свойству Данные, является не только исходным, но и зад i- ет шаг приращения нумерации. Если используется значение 1, счет начинается с единицы и ведется с единичным приращением. Но вы можете использовать и другие значения, например 19. Тогда счет начнется с десяти и будет вестись через десяток (рис, 4.33).
Отчет с чередованием подкрашенных и обычных строк
Улучшение внешнего вида отчета за счет использования подкраски каждой второй строки.
Простым способом улучшить читаемость отчета считается чередование подкрашенных и обычных строк. Хотя специальных функций или свойств для решения этой задачи не существует, вы можете улучшить внешний вид отчета без особых усилий. Для выполнения задуманного следует воспользоваться свободным текстовым полем, в котором содержится сумма с накоплением. По мере вывода строк
Рис. 4.33. Сроки, пронумерованные через десяток
значение этого поля будет поочередно представлять собой четное и нечетное число, и этим обстоятельством можно воспользоваться.
Свойство Цвет фона раздела Область данных можно изменять в зависимости от значения суммы с накоплением. Изменение этого значения с нечетного на четный повлечет за собой и изменение применяемого цвета фона.
Для реализации этого замысла нужно выполнить несколько настроек:
в раздел отчета Область данных следует включить свободное текстовое поле и установить его свойство Данные в =1, свойство Вывод на экран в Нет, а для свойства Имя набрать txt_B отрастающая Сумм а;
установить свойство Тип фона всех текстовых полей и надписей, находящихся в разделе Область данных, в Прозрачный.
Код
В разделе Область данных в процедуру обработки события Форматирование нужно поместить следующий код:
Dim чет_нечет As Integer
Me.ОблаетьДанных.BackColor = vbWhite
чет_нечет = Me.txt—ВозрастающаяСумма Mod 2
If чет_нечет = 0 Then
Me.ОбластьДанных.BackColor = vbYellow
End If
Для определения четности или нечетности значения суммы с накоплением используется оператор Mod, возвращающий остаток от операции деления. Когда четное число делится на два, остаток равен нулю. Результат операции Mod присваивается переменной чет_нечет.
Результаты
В начале выполнения процедуры устанавливается белый цвет фона. Если значение переменной чет_нечет не равно нулю, то цвет фона изменяется на желтый. Е а рис. 4.34 показан внешний вид сгенерированного отчета.
Рис. 4.34. Отчет с чередующейся подкраской строк
Трюк в трюке
Вы можете слегка переделать этот трюк. К примеру, если вам необходимо подкрасить каждую третью строку, можно проверить условие деления суммы с накоплю - нием на три. Если сумма будет кратной трем, то на три она будет делиться без остатка.
Также для задания цвета вы можете воспользоваться функцией RGB, название которой составлено из первых букв слон красный (red), зеленый (green) и сипни (Ыне). Работа функции основана на смешении трех цветов, насыщенность кажде - го из которых имеет значение от 0 до 255. С функцией RGB стоит познакомиться поближе, обратившись к справочной системе Access. Для использования ее в это ,1 трюке нужно изменить строку, в которой задается свойство Цвет фона:
Me.Detai I.BackColor = RGB(200, 200. 260)
Вы можете поэкспериментировать с различными установками аргументов этол функции, но при этом нужно иметь в виду следующее:
при установке всех трех аргументов функции RGB в 0 она возвращает черны i цвет;
при установке всех трех аргументов функции RGB в 255 она возвращает белы 1 цвет.
Все остальные цвета можно получить, устанавливая различные сочетания значений аргументов функции.
ТРЮК№ 38ТРЮК№ 38Экономия бумаги за счет сокращения количества пустых мест
ТРЮК
№ 38
ТРЮК
№ 38
Использование свойства Сжатие для уплотнения отчетов.
Наличие пустых нолей при распечатке объемных отчетов может привести к серьезным проблемам. Представьте себе список из 1000 обращений, поступивших от потенциальных клиентов, в котором только половина записей имеет зарегистрированные телефонные номера, внесенные в соответствующее поле. Если это поле попало в отчет, то в распечатке вы увидите 500 пустых мест, отведенных под несуществующие телефонные номера. Если пустыми окажутся и другие поля, то ситуация усугубится.
Пустые места могут занять в отчете, в зависимости от его компоновки, в общей сложности до 50 и более лишних страниц. Па рис. 4.35 показан отчет, имеющий подобный недостаток. Хотя часть контактной информации отсутствует, под нее все равно отводится место.
Рис. 4.35. Отчет, неэкономно расходующий бумагуРис. 4.35. Отчет, неэкономно расходующий бумагу
Рис. 4.35. Отчет, неэкономно расходующий бумагу
Рис. 4.35. Отчет, неэкономно расходующий бумагу
На рис. 4.36 показан отчет в режиме конструирования, у которого в разделе Область данных имеется группа полей. Как показано на рис. 4.35, некоторые из этих полей остаются пустыми.
В перечне свойств следует придать свойству Сжатие значение Да. Это касается не только свойств всех полей в разделе Область данных, но и свойств самого раздела.
■■■- «т■■■- «тМт№,=£8»*!№,Д№^Мт№,=£8»*!№,Д№^•ОбпастьДашы) ."Отсутствует•ОбпастьДашы) ."Отсутствует: ИМЯ . .: ИМЯ . .Конец строимыНсеая строка ит столбецНе раэрыв-зтьВывод на экран.......Расширение , . , Сжатие-.ВысотаЦвет фонаКонец строимыНсеая строка ит столбецНе раэрыв-зтьВывод на экран.......Расширение , . , Сжатие-.ВысотаЦвет фонаья Owed ; отчетья Owed ; отчет2,399см 16777215-*f „^м..2,399см 16777215-*f „^м..!=(Феми лил] £1 & 1Имя|\ ’' £ |фт^стео|!=(Феми лил] £1 & 1Имя|\ ’' £ |фт^стео|:^ Рл?дал: Ьб-ж тьДляим»:^ Рл?дал: Ьб-ж тьДляим»ОблвстьДанныхОблвстьДанных♦ Нижний колсмтнтул♦ Нижний колсмтнтул;Адцес ifopoA ТТомтоеый_1'чдекс ; Телефон;Адцес ifopoA ТТомтоеый_1'чдекс ; ТелефонРис. 4.36. Настройка свойства СжатиеРис. 4.36. Настройка свойства СжатиеВНИМАНИЕПри использовании свойств Расширение и Сжатие настраивать следует как свях н- ные элементы управления, так и сам раздел Область данных.ВНИМАНИЕПри использовании свойств Расширение и Сжатие настраивать следует как свях н- ные элементы управления, так и сам раздел Область данных.При включенном свойстве Сжатие незаполненные поля данных уже не будут занимать место в отчете. На рис. 4.37 показан улучшенный вариант отчета.При включенном свойстве Сжатие незаполненные поля данных уже не будут занимать место в отчете. На рис. 4.37 показан улучшенный вариант отчета.Рис. 4.37. Более компактный вариант отчетаРис. 4.37. Более компактный вариант отчета
■■■- «т
■■■- «т
Мт№,=£8»*!№,Д№^
Мт№,=£8»*!№,Д№^
•ОбпастьДашы) ."Отсутствует
•ОбпастьДашы) ."Отсутствует
: ИМЯ . .
: ИМЯ . .
Конец строимы
Нсеая строка ит столбец
Не раэрыв-зть
Вывод на экран.......
Расширение , . ,
Сжатие-.
Высота
Цвет фона
Конец строимы
Нсеая строка ит столбец
Не раэрыв-зть
Вывод на экран.......
Расширение , . ,
Сжатие-.
Высота
Цвет фона
ья Owed ; отчет
ья Owed ; отчет
2,399см 16777215
-*f „^м..
2,399см 16777215
-*f „^м..
!=(Феми лил] £1 & 1Имя|\ ’' £ |фт^стео|
!=(Феми лил] £1 & 1Имя|\ ’' £ |фт^стео|
:^ Рл?дал: Ьб-ж тьДляим»
:^ Рл?дал: Ьб-ж тьДляим»
ОблвстьДанных
ОблвстьДанных
♦ Нижний колсмтнтул
♦ Нижний колсмтнтул
;Адцес ifopoA ТТомтоеый_1'чдекс ; Телефон
;Адцес ifopoA ТТомтоеый_1'чдекс ; Телефон
Рис. 4.36. Настройка свойства Сжатие
Рис. 4.36. Настройка свойства Сжатие
ВНИМАНИЕ
При использовании свойств Расширение и Сжатие настраивать следует как свях н- ные элементы управления, так и сам раздел Область данных.
ВНИМАНИЕ
При использовании свойств Расширение и Сжатие настраивать следует как свях н- ные элементы управления, так и сам раздел Область данных.
При включенном свойстве Сжатие незаполненные поля данных уже не будут занимать место в отчете. На рис. 4.37 показан улучшенный вариант отчета.
При включенном свойстве Сжатие незаполненные поля данных уже не будут занимать место в отчете. На рис. 4.37 показан улучшенный вариант отчета.
Рис. 4.37. Более компактный вариант отчета
Рис. 4.37. Более компактный вариант отчета
128128Глава 4. Представление данных
128
128
На этом рисунке можно заметить ряд записей без номеров телефонов и даже вообще без дополнительных сведений. Во всех случаях пропуски подверглись сж1- тию. При сравнении отчета на рис. 4.37 с отчетом на рис. 4.35 можно отметить, что даже на первой странице уместилось большее количество записей. Как только бь .1
прекращен неэкономный расход рабочего пространства, число страниц отчета значительно сократилось.
Свойство Расширение отвечает за обратный эффект. При конструировании отчета следует рационально размещать элементы управления. Но при этом не исключены случаи, когда длина выводимых строк может превысить длину связанных с ними полей. Устанавливая свойство Расширение в Да, вы позволите полю увеличить установленные для него размеры и вместить в себя все выводимые на печать данные.
ТРЮК№ 39ТРЮК№ 39Включение в отчет даты, времени и нумерации страниц
ТРЮК
№ 39
ТРЮК
№ 39
Быстрая вставка нужной информации в верхние и нижние колонтитулы с использованием общих выражений.
Вставка в отчет времени его создания послужит, возможно, единственным показателем новизны изложенных в нем сведений. Расстановка номеров страниц тоже не будет лишней, поскольку незнание порядка следования страниц в объемном от чете становится сильн ым раздражающим фактором.
В Access есть весьма простой способ включения в отчет этих нужных и порой упускаемых из виду элементов. Список общих выражений содержится в диалоговом
^ Л' " ':‘‘' " '-"'• ■•3®S: файл Правке Энд Вставка Формат Судане Qkho ^правкаСиди’# t . про•^ Л' " ':‘‘' " '-"'• ■•3®S: файл Правке Энд Вставка Формат Судане Qkho ^правкаСиди’# t . про•КонструкторКонструкторРис. 4.38. Использование Построителя выражений для вставки в поле общего выраженияРис. 4.38. Использование Построителя выражений для вставки в поле общего выражения
^ Л' " ':‘‘' " '-"'• ■•3®S
: файл Правке Энд Вставка Формат Судане Qkho ^правкаСиди’# t . про•
^ Л' " ':‘‘' " '-"'• ■•3®S
: файл Правке Энд Вставка Формат Судане Qkho ^правкаСиди’# t . про•
Конструктор
Конструктор
Рис. 4.38. Использование Построителя выражений для вставки в поле общего выражения
Рис. 4.38. Использование Построителя выражений для вставки в поле общего выражения
окне Построитель выражений. Лучший способ вызвать это окно при конструировании отчета — вставить свободное текстовое поле в верхний или нижний колонтитул (туда, где в этом есть смысл), азатем щелкнуть на многоточии (...), которое следует за описанием свойства Данные, принадлежащего этому свободному полю. Открывающееся после этого окно Построитель выражений показано на рис. 4.38.
В перечень доступных общих выражений входят нумерация страниц, вставка даты и времени и вставка сведений о текущем пользователе. Самое практичное —выражение нумерации страниц Страница N из М. при использовании которого страницы пс просто нумеруются, а содержат сообщение вида: «Страница 15 из 40». После выпора нужного выражения его можно вставить в свободное текстовое пол?, щелкнув на кнопке ОК. При генерации в отчете появится нумерация страниц (пли результат работы другого общего выражения).
ГЛАВА 5
Запросы и SQL
Трюки № 40-54
Используя стандартный Конструктор запросов, можно получить неплохие результаты. но создавая запросы непосредственно в окне ввода инструкций SQL, можно добиться гораздо большего. Запросы делятся на две категории: запросы на выборку (пассивные) и запросы на изменение. Запросы на выборку используются для извлечения данных из таблиц, а запросы на изменение используются для операций над данными. Вы можете создавать запросы обеих категорий в стандартном Конструкторе запросов, поесть и исключения. Например, создание запросов на объединение возможно только с помощью инструкций SQL. Эти же инструкции служат для создания сложных запросов на изменение.
В данной главе рассматриваются все варианты использования SQL, как в стандартном Конструкторе запросов, так и без его применения. Например, в разделе «Получение выборки записей» (Трюк№ 40) рассмотрен способ извлечения небольшого набора записей с использованием Конструктора запросов, а задача «Вставка в запрос итоговой суммы» (Трюк № 43) решена исключительно с помощью SQL. В конечном итоге все рассмотренные в данной главе трюки посвящены неординарным и. порой, вполне реальным задачам, над решением которых вы, возможно, уже давно ломаете голову. При разработке собственных проектов освоение языка SQL воздастся сторицей. Конструктор запросов поначалу удерживает от изучения SQL, но но прошествии времени в этом возникает объективная необходимость, вызванная функциональной неполноценностью стандартного средства. Будем надеяться, что трюки этой главы активизируют ваше мышление и послужат своеобразным трамплином для более углубленного подхода к разработке баз дан п ых.
ТРЮК№40ТРЮК№40Получение выборки записей
ТРЮК
№40
ТРЮК
№40
Использование свойства Набор значений для получения независимой выборки записей.
Чаще верго запрос на выборку используется для получения всех записей, отвечающих определенным критериям. Как правило, возвращаемый набор записей мень-
132
ше по объему, чем таблица или таблицы, послужившие источником данных, п)- скольку не нее записи отвечают заданным критериям и подходящих записей всегда меньше их общего числа в исходной таблице.
В некоторых случаях вам может понадобиться всего лишь выборка записей, для которой не имеет смысла определять какой-либо критерий отбора. Эта выборка совсем не похожа на отбор некоторых записей, отвечающих вполне определенн )- му критерию. Например, в целях статистических исследований может понадобит ься выборка, па основе которой можно составить общее представление обо всем наборе данных. Неважно, где находятся исходные данные, в простой таблице и; и в наборе Записей, полученном в результате фильтрации по определенному критерию, здесь ключевым пунктом является то, что па следующей стадии производится выборка без каких-нибудь предварительных условий. Вот тут-то и пригодитс я свойство Набор значений, или, на языке SQL, — предикат Тор.
Набор значений работает по одному из двух, вариантов:
возвращает определенное количество записей;
возвращает указанный процент записей.
Использование свойства Набор значений
Набор значений извлекает выборку из числа первых записей набора данных. Если вы хотите получить выборку из числа последних записей набора данных, то сначала следует отсортировать набор в порядке убывания, а не возрастания значений. В любом случае, при каждом выполнении запроса вы будете получать одну и ту же выборку записей. Чуть позже мы рассмотрим способ получения выборки, состоящей из случайных записей.
На рис. 5.1 показан запрос в режиме Конструктора, в котором число возвращаемых записей указывается в списке свойств. Свойство Набор значений предлагает на выбор несколько значений. Вы можете воспользоваться одним из этих предлс - жений или ввести свое собственное значение.
Если будет выбрано значение 25, то из начала набора запрос извлечет, как и ожидалось, 25 записей (рис, 5.2).
ч^н^н .- j^np^L и.
Ъ^^ННЧЙ
10Q 5% 25%
Все
Считывание Пзказання
Рис. 5.1. Выбор значения для свойства «Набор значений»
!Счмтъеаь*че
^Свойства«преса?
Общие
Описание ,,
Режим по умолчанию , . ,
^я таблицы;
Сортировка;
Вывод на экран:Успоеиеотборз:
Вывод всех попей Набор значений Уникальные значения . , , Уникальные записи . . , При запуске предоставляются права . База данных-нсточник ,,.,., Строка подключение-источник Блокировка записей Тип набора записей Время ожидания ODBC . . , Фильтр. , Порядок сортировки
, . Режин таблицы
Нет
Рис. 5.2. Возвращение заданного числа записей
Интересно посмотреть, какую инструкцию SQL сгенерирует стандартный Конструктор запросов Access. Переключив Вид в режим SQL, мы увидим следующее: SELECT ТОР 25 Показания.Считывание FROM Показания:
Предикат Тор помещен сразу же после инструкции Select и указывает на количество возвращаемых записей. Чтобы возвратить определенный процент записей, нужно просто добавить слово Percent к инструкции SQL после указания числа: SELECT ТОР 25 PERCENT Показания.Считывание FROM Показания;
Если используется Конструктор запросов, то к числу, которое присвоено свойству Набор записей, нужно добавить знак процента (%) (рис. 5.3).
И«ЯТ4И«ЯТ4.^Отсутствует 'Динамический набор..^Отсутствует 'Динамический набор.Ссфтн@с#*а: Вывод на экран;. Условие отбору).Ссфтн@с#*а: Вывод на экран;. Условие отбору).J$ '-S^W !х>^-' гид^^К е^З'Х ^у^ОДО 3J$ '-S^W !х>^-' гид^^К е^З'Х ^у^ОДО 3*™**!Г"Общие •ОписаниеРежим по умолчанию Вьвод всех попей . . . Набор эначенп-1Уникальные значенияУникальные записи ..При запуске предоставляются права база данных-нстомчикСтрока подключе**19-источник . . ,,Блокировка затеей ,, .Тип наборе записейВремя ожидания ODBCФИЛЬТР,„Порядоксортир........ ?, ... . ,*™**!Г"Общие •ОписаниеРежим по умолчанию Вьвод всех попей . . . Набор эначенп-1Уникальные значенияУникальные записи ..При запуске предоставляются права база данных-нстомчикСтрока подключе**19-источник . . ,,Блокировка затеей ,, .Тип наборе записейВремя ожидания ODBCФИЛЬТР,„Порядоксортир........ ?, ... . ,Icwmew*Icwmew*Рис. 5.3. Задание на возврат определенного процента записейРис. 5.3. Задание на возврат определенного процента записей
И«ЯТ4
И«ЯТ4
.^Отсутствует 'Динамический набор.
.^Отсутствует 'Динамический набор.
Ссфтн@с#*а: Вывод на экран;. Условие отбору).
Ссфтн@с#*а: Вывод на экран;. Условие отбору).
J$ '-S^W !х>^-' гид^^К е^З'Х ^у^ОДО 3
J$ '-S^W !х>^-' гид^^К е^З'Х ^у^ОДО 3
*™**!Г"
Общие •
Описание
Режим по умолчанию
Вьвод всех попей . . .
Набор эначенп-1
Уникальные значения
Уникальные записи ..
При запуске предоставляются права база данных-нстомчик
Строка подключе**19-источник . . ,,
Блокировка затеей ,, .
Тип наборе записей
Время ожидания ODBC
ФИЛЬТР,
„Порядоксортир........ ?, ... . ,
*™**!Г"
Общие •
Описание
Режим по умолчанию
Вьвод всех попей . . .
Набор эначенп-1
Уникальные значения
Уникальные записи ..
При запуске предоставляются права база данных-нстомчик
Строка подключе**19-источник . . ,,
Блокировка затеей ,, .
Тип наборе записей
Время ожидания ODBC
ФИЛЬТР,
„Порядоксортир........ ?, ... . ,
Icwmew*
Icwmew*
Рис. 5.3. Задание на возврат определенного процента записей
Рис. 5.3. Задание на возврат определенного процента записей
Трюк в трюке
Свойство Набор записей или предикат Тор хорошо справляются с извлечением небольшой выборки записей, но эта выборка всегда будет одной и той же. Если даже к исходным записям нс применялась сортировка, то они располагаются в порядке их занесения в таблицу.
Для возвращения случайного набора записей требуется при сортировке записей применить функцию Rnd. Обычно сортировка сама по себе не способна верну-ь случайный набор записей. Но сортировка на основе случайного значения позв )- ляет оспорить это утверждение. Для проведения именно такой сортировки в инструкцию SQL следует внести следующие изменения:
SELECT ТОР 25 Показания.Считывание
FROM Показания
ORDER BY RND([Считывание]);
В качестве аргумента функции Rnd используется имя поля. При каждом выполнении запроса возвращается случайная выборка записей.
ТРЮК№ 41ТРЮК№ 41Защита от сбоев при проведении операции добавления записей
ТРЮК
№ 41
ТРЮК
№ 41
Предупреждения отказов, возникающих при добавлении записей, и обеспечение зан з- сения в таблицу всех предназначенных данных.
SQL-инструкция Insert используется для добавления записей к таблице. Чаще всего она неплохо справляется со своей работой, но склонность к сбоям все же имеет. В данном трюке рассматриваются дна метода проверки данных на пригодность к использованию в инструкции Insert. Перед разбором этих методов создадим простую таблицу, показанную на рис, 5.4.
Рис. 5.4. Таблиид для хранения сведений об именах и возрасте пациентовРис. 5.4. Таблиид для хранения сведений об именах и возрасте пациентов
Рис. 5.4. Таблиид для хранения сведений об именах и возрасте пациентов
Рис. 5.4. Таблиид для хранения сведений об именах и возрасте пациентов
Таблица состоит из двух полей:
Пациент — хранит имена пациентов; размер поля установлен в 10 символов;
Возраст — хранит возраст пациентов.
Решение проблемы превышения размеров поля
Попытка разместить в текстовом поле данные, превышающие его длину, приведет к сбою в работе инструкции Insert, Следующая инструкция Insert будет работать без сбоя:
"Insert Into Пациенты (Пациент, Возраст) Values ('Петр', 22)"
Имя Петр легко помещается в текстовом ноле Пациент. А теперь рассмотрим такую инструкцию:
"Insert Into Пациенты (Пациент, Возраст) Values (’Пантелеймон’, 22)"
Выполнение этой инструкции приведет к сбою, поскольку имя Пантелеймон состоит из одиннадцати букв, а поле Пациент способно вместить максимум десять. Исправить подобные инструкции проще всего вставкой функции Left, урезающей текст до десяти символов.
К примеру, в следующей процедуре записи из таблицы НовыеПациенты добавляются в таблицу Пациенты. Функция left, укорачивающая имена до десяти символов, помещена в середину инструкции Insert:
Dim myDB As ADODB.Connection
Set myDB = CurrentProject.Connection
Dim гз_НовыеПациенты As ADODB,Recordset
Set г5_НовыеПациенты = New ADODB.Recordset
г5_НовыеПациенты.0реп ("Select * from НовыеПациенты "), myDB
Do Until гз_НовыеПациенты.EOF
myDB. Execute ("Insert Into Пациенты Values ('’’ &_
Left(Г5_НовыеПациенты.Fields("Пациент"), 18) & _
’", " & г5_НовыеПациенты.Fields ("Возраст") & ")") г$_НовыеПациенты.MoveNext
Loop
гз_НовыеПациенты.Close
myDB.Close
Set myDB = Nothing
Другим вариантом решения этой проблемы может стать увеличение размера поля таблицы.
Отслеживание появления апострофов в исходных данных
Ничто так не вредит работе инструкции Insert, как непарный апостроф или одинарная кавычка. Полностью исключить их появление в данных невозможно, но для инструкции SQL, содержащей Insert, одиночная кавычка означает границу текстовой строки. Поэтому без небольшого исправления следующая инструкция вставки работать не сможет:
"Insert Into Patients (Patient, Age) Values (Lef t(10' Rei Uy ’ ,10), 22)"
Проблема заключается в том, что при выполнении инструкции одинарная кавычка, размещенная перед буквой «О», откроет текстовую строку, а одинарная кавычка после буквы *0» эту текстовую строку закроет. В результате этого оставшаяся часть имени Reilly — останется нераспознанной.
Удвоение одиночной кавычки приведет к устранению проблемы, а помочь в этом сможет функция Replace, которая заменит каждую одинарную кавычку двойной Следующая процедура представляет собой модифицированную версию ранее рас ■ смотренной процедуры:
Dim myDB As ADODB.Connection
Set myDB = CurrentProject.Connection
Dim г5_Новь!еПациенты As ADODB. Recordset
Set г5_НовыеПациенты = New ADODB.Recordset
г5_НовыеПациенты.Ореп ("Select * from НовыеПациенты "), myDB
Do Until Г5_НовыеПациенты.EOF
myDB.Execute ("Insert Into Patients Values ('" &_
Кер1асе(г5_НовыеПациенты. FleldsC'DaLtweHT") , , ’"'") & _
"’. " & Г5_НовыеПациенты. FleldsC’Boapacj") & “)") гб_НоеыеПациенты.MoveNext
Loop
г 5_НовыеПациенты.Close
myDB.Close
Set myDB = Nothing
А вот пример использования функции Replace:
Repl асе(г5_НовыеПациенты.Fields("Patient"), , )
Эта функция проверяет наличие в текстовой строке одного или нескольких сих - волов. Если искомая подстрока будет найдена, то ее заменит другая подстрока, состоящая из одного или нескольких символов. Функции передаются три аргумента;
строка, в которой производится поиск;
искомые символы;
символы, предназначенные для замены найденных символов.
Все данные, получаемые из поля Пациент таблицы НовыеПациенты, проверяются на наличие одинарной кавычки, которая заменяется двойной кавычкой. В результате получается работоспособная инструкция SQL, осуществляющая вставку.
Сочетание двух проверок на приемлемость
Все хорошее я приберег напоследок. Вам ведь нужно проверять данные и на превышение длины, и на наличие одинарных апострофов. А нельзя ли сделать это одновременно? Ну конечно же можно! Нужно только разместить одну функцию внутри другой, как это сделано в следующем примере:
myDB.Execute ("Insert Into Пациенты Values ('" & _
Left(Кер1асе(г5_НовыеПациенты.Fl elds("Пациент"), "*", ), 10) &_
" & г5_НовыеПациенты.Р1е1с1£("Возраст") & ")")
ТРЮК№ 42ТРЮК№ 42Поиск записей без подчиненных по нескольким связанным полям
ТРЮК
№ 42
ТРЮК
№ 42
В мастере запросов на выборку записей без подчиненных в другой таблице задает: я только одно связанное поле. Вы можете приспособить этот вид запроса для работы с несколькими связанными полями.
Если нужно выбрать из одной таблицы записи, у которых нет связанных записей в другой таблице, то проще всего воспользоваться встроенным в Access мастером
запросов Записи без подчиненных. На рис. 5.5 показано диалоговое окно Новый запрос, из которого вызывается мастер.
Рис. 5.5. Запуск мастера запросов «Записи без подчиненных»
Запрос составляется поэтапно, в нескольких окнах, выводимых мастером. Вам нужно выбрать две таблицы и метод работы запроса. Например, вам нужно знать, какие записи Таблицы А не имеют связанных с ними записей в Таблице Б или, наоборот, какие записи Таблицы Б не имеют связанных с ними записей в Таблице А. В любом случае, непременным условием для выполнения задачи должна быть установленная связь между таблицами.
Точнее говоря, отобранные в этот запрос таблицы не обязательно должны иметь формальную связь, установленную в диалоговом окне Схема данных. Достаточно того, чтобы анализируемые на соответствие ноля содержали одинаковые данные, иначе все без исключения записи будут возвращены в качестве записей без подчиненных.
Таблицы могут быть связаны по одному или нескольким полям. К сожалению, мастер дает возможность установить связь между таблицами только по одному полю (рис. 5.6).
Рис. 5.6. Выбор единственного поля для включения в поиски соответствия
Для этого следует выбрать по одному полю из каждой таблицы, справа и слева, а затем щелкнуть на кнопке между таблицами и установить соответствие, исполь-
зуемое запросом. Мастер создает запрос, сохраняемый в базе данных. Это очень удобно, поскольку запрос можно использовать многократно, не создавая его заново. В запрос также можно вносить изменения, что и бу,дет рассмотрено далее
Разбор запроса
В используемом примере производится поиск покупателей, нс имеющих подчиненных записей в таблице покупок. Использование мастера Записи без подчиненных позволяет выявлять таких покупателей на основе их фамилий. На рис. 5 7 показан запрос, созданный в режиме Конструктора.
Рис. 5.7. Создание запроса для поиска записей без подчиненных
Для извлечения всех записей о покупателях, чья фамилия отсутствует в таблице покупок, используется ключевое слово LEFT JOIN. В режиме SQL запрос имеет следующий вид:
SELECT ТЫ_ПокупателиЗ .Фамилия, 1Ы_ПокупателиЗ. Имя
FROM 1Ы_ПокупателиЗ LEFT JOIN ТЫ_ПокупкиЗ ON
ТЫПокупателиЗ.Фамилия = тЫПокупкиЗ.Фамилия
WHERE (((1Ы_ПокупкиЗ. Фамилия) Is Null));
Но здесь может возникнуть проблема однофамильцев. Стоит только одному покупателю иметь запись в таблице покупок, как все остальные с такой же фамил 1- ей будут исключены изданных, возвращаемых запросом, даже если должны были в них попасть.
На рис. 5.8 проиллюстрирована эта ситуация. Слева направо расположены таблица покупателей, таблица покупок и результат выполнения запроса, осуществлявшего поиск покупателей, не совершавших покупок. В левой таблице есть д за однофамильца: Алексей Петров и Виктор Петров. В расположенной посредине таблице покупок фигурирует Виктор Петров. В списке, полученном в результате выполнения запроса, Алексей Петров в качестве покупателя без покупок не появляется, хотя на самом деле должен там быть.
Поскольку проверка ведется только по фамилиям, все клиенты-однофамильцы, в том случае, если хотя бы один из них совершил покупку, в итоговом списке те фигурируют. Результат выполнения запроса не отвечает поставленной задаче.
Асташ ко в АлександрАсташ ко в АлександрВолков ГригорийКлимов КириллПетров Виктор Боярский Владимир Петров АлексейСухов ВиталийМатвеев НиколайАндреев Сергей Курмэзов АлександрВолков ГригорийКлимов КириллПетров Виктор Боярский Владимир Петров АлексейСухов ВиталийМатвеев НиколайАндреев Сергей Курмэзов АлександрСоловьевСоловьевТарасовТарасовВикторАндрейВикторАндрейБыковБыковАнатолийАнатолийСлавинСлавинЛеонидЛеонидФамилия! Имя ( Дата Д СУММ^Петров Виктор 12 05 2005 1 200,ООрСтепанов 'Александр | 09,03 2005 2 345,ООрРоманов i Александр J 02 04.2005' 234,00р.Фамилия! Имя ( Дата Д СУММ^Петров Виктор 12 05 2005 1 200,ООрСтепанов 'Александр | 09,03 2005 2 345,ООрРоманов i Александр J 02 04.2005' 234,00р.Курмэзов Александр [ 23 12.2004654,ООрЗавьялов Александр [ 26 07.2005: 975,ООрКурмэзов Александр [ 23 12.2004654,ООрЗавьялов Александр [ 26 07.2005: 975,ООрЧельцое Алексей; 12 06.2005 1 324 ,DOpКириллов АлексейI 12.11.2004. 3 200,00р.:0,00рЧельцое Алексей; 12 06.2005 1 324 ,DOpКириллов АлексейI 12.11.2004. 3 200,00р.:0,00рАсташ ков Волков Климов БоярскийМатвеевАндреев СоловьевТарасов , Быков _ Славин Дорохов КазаковАсташ ков Волков Климов БоярскийМатвеевАндреев СоловьевТарасов , Быков _ Славин Дорохов КазаковАлександр •Григорий JКирилл•Владимир ■Виталий : : Николай■: Сергей:: Виктор ^Андрей ■Анатолий 'Леонид: Владимир: ИГОрЬАлександр •Григорий JКирилл•Владимир ■Виталий : : Николай■: Сергей:: Виктор ^Андрей ■Анатолий 'Леонид: Владимир: ИГОрЬДороховКазаковДороховКазаковВладимирИгорьВладимирИгорьЭллис*; (® Л ГЭллис*; (® Л ГяйН^яйН^
Асташ ко в Александр
Асташ ко в Александр
Волков Григорий
Климов Кирилл
Петров Виктор Боярский Владимир Петров Алексей
Сухов Виталий
Матвеев Николай
Андреев Сергей Курмэзов Александр
Волков Григорий
Климов Кирилл
Петров Виктор Боярский Владимир Петров Алексей
Сухов Виталий
Матвеев Николай
Андреев Сергей Курмэзов Александр
Соловьев
Соловьев
Тарасов
Тарасов
Виктор
Андрей
Виктор
Андрей
Быков
Быков
Анатолий
Анатолий
Славин
Славин
Леонид
Леонид
Фамилия! Имя ( Дата Д СУММ^Петров Виктор 12 05 2005 1 200,ООрСтепанов 'Александр | 09,03 2005 2 345,ООрРоманов i Александр J 02 04.2005' 234,00р.
Фамилия! Имя ( Дата Д СУММ^Петров Виктор 12 05 2005 1 200,ООрСтепанов 'Александр | 09,03 2005 2 345,ООрРоманов i Александр J 02 04.2005' 234,00р.
Курмэзов Александр [ 23 12.2004654,ООр
Завьялов Александр [ 26 07.2005: 975,ООр
Курмэзов Александр [ 23 12.2004654,ООр
Завьялов Александр [ 26 07.2005: 975,ООр
Чельцое Алексей; 12 06.2005 1 324 ,DOp
Кириллов АлексейI 12.11.2004. 3 200,00р.
:0,00р
Чельцое Алексей; 12 06.2005 1 324 ,DOp
Кириллов АлексейI 12.11.2004. 3 200,00р.
:0,00р
Асташ ков Волков Климов Боярский
Матвеев
Андреев Соловьев
Тарасов , Быков _ Славин Дорохов Казаков
Асташ ков Волков Климов Боярский
Матвеев
Андреев Соловьев
Тарасов , Быков _ Славин Дорохов Казаков
Александр •
Григорий J
Кирилл•
Владимир ■
Виталий : : Николай■
: Сергей:
: Виктор ^Андрей ■Анатолий '
Леонид
: Владимир
: ИГОрЬ
Александр •
Григорий J
Кирилл•
Владимир ■
Виталий : : Николай■
: Сергей:
: Виктор ^Андрей ■Анатолий '
Леонид
: Владимир
: ИГОрЬ
Дорохов
Казаков
Дорохов
Казаков
Владимир
Игорь
Владимир
Игорь
Эллис*; (® Л Г
Эллис*; (® Л Г
яйН^
яйН^
Кириллов Алексей
Рис. 5.8. Просмотр таблиц и результата выполнения запроса на отсутствие подчиненных записей
Внесение изменений в запрос
Рис. 5.9. Теперь в запросе на поиск записей без подчиненных проверка будет вестись по двум ПОЛЯМРис. 5.9. Теперь в запросе на поиск записей без подчиненных проверка будет вестись по двум ПОЛЯМВсе, что нужно изменить в запросе, — это устроить проверку записей не только по фамилиям, но и по именам. Сделать это можно как в режиме Конструктора запросов, так и в режиме SQL. На рис. 5.9 показана измененная конструкция запроса.
Рис. 5.9. Теперь в запросе на поиск записей без подчиненных проверка будет вестись по двум ПОЛЯМ
Рис. 5.9. Теперь в запросе на поиск записей без подчиненных проверка будет вестись по двум ПОЛЯМ
При этом важно соблюсти следующие требования:
нужно добавить Is Null в условие отбора, чтобы обозначить отсутствие в таблт ■ це имени покупателя;
между таблицами нужно установить еще одну, вторую, связь по новому, включенному в запрос полю; присмотритесь к различиям в связях таблиц, используемых в запросе, сравнивая конструкцию па рис. 5.7 с конструкцией на рис. 5J;
нужно сбросить флажки Вывод на экран в столбцах полей, представляющих подчиненную таблицу (в данном случае — таблицу покупок), поскольку эти поля не должны отображаться на экране.
На рис. 5.[О показано, что теперь в результате работы запроса покупатель Алексей Петров попал в список не совершавших покупок, а с ним заодно туда попали еще несколько ранее пропущенных покупателей.
Рис. 5.10. Исправленный список записей без подчиненныхРис. 5.10. Исправленный список записей без подчиненных
Рис. 5.10. Исправленный список записей без подчиненных
Рис. 5.10. Исправленный список записей без подчиненных
ТРЮК№ 43ТРЮК№ 43Вставка в запрос итоговой суммы
ТРЮК№ 43
ТРЮК№ 43
Использование запроса на объединение для вывода записей, содержащих некоторое данные, и их итоговой суммы.
Вам предлагается простои способ вывода списка записей таблицы, в конце которого помешается итоговая сумма всех значений. Для этого сначала нужно при помощи инструкции Select создать запрос на выборку и извлечь записи из табл i- цы, а затем, используя инструкцию Union, объединить эти записи с итоговой су и- мой значений. Итоговое значение возвращается функцией Sum. Естественно, подразумевается, что данные, с которыми ведется работ а, имеют числовой или денежный формат.
Поскольку Конструктору запросов не под силу справиться с запросом на объединение, его нужно ввести в режиме SQL. В следующем примере инструкция SQL объединяет записи о продажах с суммой продаж:
SELECT ТЫ_Продажи.Сумма
FROM ГЫ_Продажи
UNION ALL SELECT Sum (1Ы_Продажи. Сумма) AS СуммаПродаж
FROM 1Ь1_Продажи;
На рис. 5.11 показана нижняя часть списка возвращенных запросом записей. Очевидно, что в последней строке выведена итоговая сумма.
Рис. 5.11. Включение в данные итоговой суммыРис. 5.11. Включение в данные итоговой суммы
Рис. 5.11. Включение в данные итоговой суммы
Рис. 5.11. Включение в данные итоговой суммы
Трюк в трюке
Этот запрос нетрудно изменить для вывода других совокупных значений, например каких-нибудь вычислений или средней величины:
SELECT 1Ы_Продажи. Сумма
FROM ЕЫ-Продажи
UNION ALL SELECT Avg(1Ы_Продажи.Сумма) AS СредняяСумма
FROM СЫ Продажи:
Сортировка по любому произвольному символьному фрагменту
Конструктор запросов Access неплохо справляется с сортировкой данных, но для сортировки по группе символов, расположенных в середине поля, он без вашей помощи не справится.
Мне нравится работать с Конструктором запросов. С его помощью можно задавать все виды сортировки. Но, наверное, вы замечали, что текстовые данные он всегда сортирует по всему содержимому поля. Такой подход вполне логичен и отвечает обычным требованиям к сортировке. Но если нужно применить необычный способ сортировки, скажем, по первым пять символам или по последним трем, тут уже возникнет проблема.
Подобная задача становится особенно актуальной, если Access использует данные, полученные от других систем, особенно от систем учета. В них зачастую в поле фиксированной ширины помещаются собранные воедино разнородные данные. Л вот другой классический пример: у вас есть список людей, чьи имена -1 фамилии помещены в одном поле, а вам нужно отсортировать этот список только по фамилиям.
Сортировка по символам внутри строки
На рис. 5.12 показана таблица, заполненная записями о продажах. Все записи имеют фиксированный формат. Два первых символа содержат код продавца, шест ь следующих — дату, а последние символы — сумму покупки, причем последние два символа являются десятичной частью числа. Поэтому первая запись поля Продажи (СТ2310044595) означает следующее:
код продавца —• СТ;
дата покупки — 23 октября 2004 года (в поле формат даты представлен в виле мм-дд-гг);
сумма покупки — 45 рублей 95 копеек.
С 72310044595ВС2Э070412819 ШД15120410375 0128030416ЭБ4 ШД27О10417066 1ВС1310041354Б 012912048504 МР2210044662 АВ151204437ЭШД01040417368 МР24060416517 ВС12И044861 АВ26050410576 MP24O2Q415019 СТ21050414354 ШД16060414418 мягвотгом!ШД21030410344 ШД1909048653В С1109041017ВС 72310044595ВС2Э070412819 ШД15120410375 0128030416ЭБ4 ШД27О10417066 1ВС1310041354Б 012912048504 МР2210044662 АВ151204437ЭШД01040417368 МР24060416517 ВС12И044861 АВ26050410576 MP24O2Q415019 СТ21050414354 ШД16060414418 мягвотгом!ШД21030410344 ШД1909048653В С1109041017ВРис. 5.12, Код продавца, дата и сумма покупки, собранные в одном полеРис. 5.12, Код продавца, дата и сумма покупки, собранные в одном поле
С 72310044595
ВС2Э070412819 ШД15120410375 0128030416ЭБ4 ШД27О10417066 1ВС1310041354Б 012912048504 МР2210044662 АВ151204437Э
ШД01040417368 МР24060416517 ВС12И044861 АВ26050410576 MP24O2Q415019 СТ21050414354 ШД16060414418 мягвотгом!
ШД21030410344 ШД1909048653
В С1109041017В
С 72310044595
ВС2Э070412819 ШД15120410375 0128030416ЭБ4 ШД27О10417066 1ВС1310041354Б 012912048504 МР2210044662 АВ151204437Э
ШД01040417368 МР24060416517 ВС12И044861 АВ26050410576 MP24O2Q415019 СТ21050414354 ШД16060414418 мягвотгом!
ШД21030410344 ШД1909048653
В С1109041017В
Рис. 5.12, Код продавца, дата и сумма покупки, собранные в одном поле
Рис. 5.12, Код продавца, дата и сумма покупки, собранные в одном поле
Предположим, вам нужно отсортировать записи по дате. В каждой записи да"а покупки начинается с третьей позиции и занимает шесть символов (рис. 5.12). Вам когда-нибудь приходилось работать с такими данными? Без знания структуры разобраться в них невозможно. Попробуй догадайся, из каких именно чисел складывается дата.
Для решения нашей задачи лучше всего подойдет функция Mid, одна из функций обработки текстовых данных. Она возвращает часть текстовой строки, но для этого
ей необходимо передать три параметра: строку данных, стартовую позицию и число извлекаемых символов. А вот так выглядит ее синтаксис:
Mid(строка, начальная позиция, длина)
Хотя по замыслу в данном примере работа ведется с датой, информация, хранящаяся в таблице, представлена в текстовом виде. Поэтому с работой легко справляются стандартные строковые функции.
На рис. 5.13 показан запрос в режиме Конструктора, в котором используется функция Mid. В первом столбце расположено поле Продажи само по себе, а во втором — вычисляемое поле, использующее функцию Mid. Внутри строки вызова функции название поля Продажи взято в скобки. Это стандартный прием размещения имени поля в функции. Аргументы функции Mid указывают на извлечение шести символов, начиная с третьей позиции (то есть даты).
8№8$ЙЯй5&^^8№8$ЙЯй5&^^Имя таблицы:Сортировке: 6bfD04 Tia 2КРДН1 Условие отборе:Имя таблицы:Сортировке: 6bfD04 Tia 2КРДН1 Условие отборе:Рис. 5.13. Использование функции Mid для извлечения даты, по которой происходит сортировкаРис. 5.13. Использование функции Mid для извлечения даты, по которой происходит сортировка
8№8$ЙЯй5&^^
8№8$ЙЯй5&^^
Имя таблицы:
Сортировке: 6bfD04 Tia 2КРДН1 Условие отборе:
Имя таблицы:
Сортировке: 6bfD04 Tia 2КРДН1 Условие отборе:
Рис. 5.13. Использование функции Mid для извлечения даты, по которой происходит сортировка
Рис. 5.13. Использование функции Mid для извлечения даты, по которой происходит сортировка
При выполнении запроса второй столбец содержит именно дату, поскольку функция Mid извлекает символы, размещенные с третьей по восьмую позицию. Во втором столбце к тому же должна быть включена сортировка, поскольку в итоге, нам нужно отсортировать данные по дате. Поэтому на пересечении строки Сортировка и второго столбца следует установить сортировку по возрастанию, выбрав соответствующий пункт из раскрывающегося меню.
Обратите внимание, что на рис. 5.13 флажок Вывод на экран для вычисляемого поля не установлен. При выполнении запроса этот столбец не нужно выводить на экран. Он используется только для осуществления сортировки, поэтому его появление на экране не обязательно.
На рис. 5.14 показан результат выполнения запроса. Теперь записи о продажах отсортированы по дате. В первой возвращенной записи (МР0104047О11) содержится фрагмент 010404, соответствующий 4 января 2004 года.
Сортировка по нескольким фрагментам поля
А что, если нужно будет отсортировать данные и по дате, и по сумме покупки? Причем сортировать по дате в возрастающем порядке, а по сумме покупки — в убывающем. Обычно требуется отсортировать суммы покупок именно по убыванию. Можно ли вообще такое сделать?
144144. ПродажиMP0104Q47G11. ПродажиMP0104Q47G11ШД3109047657 СТОП 2049883 АВП112041966 ВС01130413548 МР0113045511 СТ0116047332 MPD116049684МР01160413676 АВ0121046361ШДО122044545 ШДО123043535 'МРО1230415679 СТО 124042П1ШДО1270417068 А0О128046693ВС02010413772 МР02060414351АВ02120410473 CTD21204104154ШД3109047657 СТОП 2049883 АВП112041966 ВС01130413548 МР0113045511 СТ0116047332 MPD116049684МР01160413676 АВ0121046361ШДО122044545 ШДО123043535 'МРО1230415679 СТО 124042П1ШДО1270417068 А0О128046693ВС02010413772 МР02060414351АВ02120410473 CTD21204104154Рис. 5.14. Записи, отсортированные по датеРис. 5.14. Записи, отсортированные по дате
144
144
. Продажи
MP0104Q47G11
. Продажи
MP0104Q47G11
ШД3109047657 СТОП 2049883 АВП112041966 ВС01130413548 МР0113045511 СТ0116047332 MPD116049684
МР01160413676 АВ0121046361
ШДО122044545 ШДО123043535 '
МРО1230415679 СТО 124042П1
ШДО1270417068 А0О128046693
ВС02010413772 МР02060414351
АВ02120410473 CTD21204104154
ШД3109047657 СТОП 2049883 АВП112041966 ВС01130413548 МР0113045511 СТ0116047332 MPD116049684
МР01160413676 АВ0121046361
ШДО122044545 ШДО123043535 '
МРО1230415679 СТО 124042П1
ШДО1270417068 А0О128046693
ВС02010413772 МР02060414351
АВ02120410473 CTD21204104154
Рис. 5.14. Записи, отсортированные по дате
Рис. 5.14. Записи, отсортированные по дате
Конечно можно! Для этого следует поместить выражения в дна столбца, для дат,! и для суммы. На рис. 5.15 показано, как это сделать, если сумма начинается с девятой позиции. Параметр длины, передаваемый функции Mid, обрабатывающей сумму, равен 5. Учитывая, что точная длина известна не всегда, в данном примере суммы в записях могут состоять из четырех или из пяти цифр, поэтому установка длины в пять символов будет работать для всех записей.
Рис. 5.15. Запрос, созданный для сортировки по двум фрагментам поляРис. 5.15. Запрос, созданный для сортировки по двум фрагментам поля
Рис. 5.15. Запрос, созданный для сортировки по двум фрагментам поля
Рис. 5.15. Запрос, созданный для сортировки по двум фрагментам поля
В данном примере, как и раньше, при выполнении запроса на экран выводится только само поле Продажи. Поэтому для второго и третьего столбцов флажки Вн- вод на экран не установлены. В обоих столбцах используется функция Mid, извлекающая фрагменты из одной и тон же строки, содержащейся в поле Продажи.
Но теперь результат несколько отличается от предыдущего. На рис. 5.16 показаны возвращенные запросом данные. Сравнивая этот результат с тем, что изобра-
жен на рис. 5.14, вы можете заметить, что записи с 6 по 8 подверглись перестановке. У этих записей одинаковые даты — 16 января 2004 года (011604), но теперь суммы, содержащиеся в них, следуют в порядке, определенном условиями запроса.
Рис. 5.16. Сортировка по дате и сумме, изменившая порядок записей
Сортировка по фрагменту с неизвестной начальной позицией
Нередко данные, импортированные из внешних систем, должны подвергаться обработке перед их использованием в вашем приложении. Подобные проблемы часто связаны с именами и фамилиями. В вашей базе данных для имени и фамилии могут быть предусмотрены отдельные поля, поэтому сортировка по фамилиям не вызовет затруднений. Но представьте, насколько все усложнится, если вам представлены данные, в которых полные имена помещены в одно поле. А что, если сначала идет имя, а потом фамилия? В отличие от предыдущего примера о продажах вы не можете заранее знать, с какой позиции каждой записи начинается фамилия.
Вся хитрость сортировки по фамилии заключается в предварительном вычислении позиции пробела. Для этого наряду с функцией Mid используется и функция InStr. Теперь изменяющаяся позиция пробела возвращается функцией InStr.
Эта функция обнаруживает начальную позицию первого появления отдельного фрагмента в строке. В данном примере строкой, в которой ведется поиск, служит содержимое поля Клиент, а искомым фрагментом является пробел. Строка вызова функции InStr имеет следующий вид:
InSt г([Клиент];" ")
Функция InStr служит для передачи функции Mid той позиции, с которой она должна начать извлечение фрагмента. При этом вызов функции InStr расположен внутри вызова функции Mid. Это сочетание имеет следующий вид:
Midf[Клиент]; In5tr([Клиент];" "}*1;161
Следует заметить, что функция InStr возвращает позицию пробела, а нас интересует начальная позиция фамилии, отстоящая от пробела на один символ вправо, поэтому к значению, возвращаемому функцией InStr, добавлена единица, после чего эта сумма используется в качестве параметра начальной позиции для функции Mid.
Па рис. 5.17 показано, как создать запрос, используя эти вложенные друг в друга функции. В качестве длины фамилии выбрано произвольное значение 10. Фамилии отличаются но длине, но использования для сортировки первых 10 символов вполне достаточно для получения приемлемого результата.
Рис. 5.17. Использование вложенных функций для сортировки
На рис. 5.18 показан результат выполнения запроса. Клиенты отсортированы по фамилиям внутри единственного поля, в котором содержатся имена и фамилии. Что, собственно, и требовалось сделать.
Рис. 5.18. Список клиентов, отсортированный по фамилиям
Трюк в трюке
Сортировка по именам и фамилиям не вызывает затруднений, когда приходится работать исключительно с ними. А как быть со вторыми именами, формами обращения и примечаниями? Как в таком случае можно справиться с задачей? Давайте поднимем планку сложности данного трюка и включим в состав запроса собственную функцию.
Нам нужна функция, которая для определения позиции пробела исследует имена, хранящиеся в ноле Клиент. Вся загвоздка в том, что теперь в именах может быть несколько пробелов. Например, имя Ken S. Bl Littman содержит два пробела — по одному с каждой стороны от инициала. Некоторые имена содержат три, четыре или даже пять пробелов. Предназначением функции будет вычисление нужного пробела, определение его позиции и передача результата функции Mid.
Сначала нужно поместить код функции в программный модуль VBA. Для этого в окне базы данных нужно выбрать вкладку Модули, выбрать создание нового модуля и ввести в него следующий код:
Function поиск_пробела(имя_клиента As String)
Dim длина^имени As Integer
Dim цикл_пробепов As Integer
Dim счетчик_пробелов As Integer
Dim фрагмент_имени As String
Dim позиция_первого_пробела As Integer
'подсчет пробелов в полном имени
счетчикпробелов = 0
длина_имени = Ееп(имя_клиента)
For циклиробелов = 1 То длина_имени
If Mid(имя_клиента, цикп_пробелов, 1) = " * Then счетчик_пробепов = счетчик^пробелов * 1
End If
Next цикл—пробелов
'раэбор полного имени, с предположением в каждом ветвлении Case
Select Case счетчиК—Пробелов
Case 0
'пробелы не обнаружены!
'возврат 1 в качестве начальной позиции поиск_пробела = 1
Case 1
'имя и фамилия,
'разбиение по первому пробелу
поиск_пробела = InStr(имя_кпиента, " ")
Case 2, 3
'предполагается наличие имени, второго имени и фамилии (2 пробела) 'или имени, втрого имени, фамилии и примечания (3 пробела), 'разбиение по второму пробелу
лоиск_лробела = InStr(имя_клиента, " ") позициялервого-пробела = поиск_пробела фрагмент_имени = _
Mid(имяклиента, поиск_пробела, длинаимени - лоиск_пробела) поиск_пробела = InStr(фрагментимени. " ") + позиция_первого_пробела - 1 Case Else
'структура имени не поддается разбору
'разбиение по первому пробелу
Поиск_пробела = InStr(имя_клиента, " ")
End Select
End Function
В двух словах, функция анализирует имя клиента, подсчитывая, сколько в цен пробелов, а затем определяет наиболее подходящий пробел, возвращая его поэт - цию, как и раньше, функции Mid.
В режиме Конструктора вызов функции поиск_пробела встроен в вызов функции Mid:
Mid([Клиент]:поиск_пробепа([Клиент])+1;13)
Как создать запрос, показано на рис, 5,19.
Рис. 5.19. Функция Mid, использующая функцию поискпробела
При выполи ей и и запроса имя каждого клиента анализируется функцией поиск_п робела, которая возвращает позицию наиболее подходящего пробела, после чего происходит сортировка по фамилиям. На рис. 5.20 показан результат работы запроса.
: но *к66р*1: но *к66р*1Ruben Baylis Betty Bearman Rusty Bearman Jr Jannice Beasley Clay Beeken Laursen Bennet Kristie BennetRuben Baylis Betty Bearman Rusty Bearman Jr Jannice Beasley Clay Beeken Laursen Bennet Kristie BennetPaine a Kaput skaPaine a Kaput ska^SE Г^SE Г7 ГП re Я7 ГП re ЯTravis AdamsEmily AJandaleHenry Aibrecht Sal Antelman, Jr Dana ArmstrongTravis AdamsEmily AJandaleHenry Aibrecht Sal Antelman, Jr Dana ArmstrongAlex Avakian 111 Seth 6. Alpaugh Ri az Baldwin Alan Barandes Evan Barbee Rosie BaucomAlex Avakian 111 Seth 6. Alpaugh Ri az Baldwin Alan Barandes Evan Barbee Rosie BaucomMatti BennettKirk BeverMatti BennettKirk BeverTammie Jill AdamiLahnng Judd Joyce K. Garonzic Terry KantolaTammie Jill AdamiLahnng Judd Joyce K. Garonzic Terry KantolaРис. 5,20. Сортировка по фамилии при наличии в полном имени второго имени и дополнительных пометокРис. 5,20. Сортировка по фамилии при наличии в полном имени второго имени и дополнительных пометок
: но *к66р*1
: но *к66р*1
Ruben Baylis Betty Bearman Rusty Bearman Jr Jannice Beasley Clay Beeken Laursen Bennet Kristie Bennet
Ruben Baylis Betty Bearman Rusty Bearman Jr Jannice Beasley Clay Beeken Laursen Bennet Kristie Bennet
Paine a Kaput ska
Paine a Kaput ska
^SE Г
^SE Г
7 ГП re Я
7 ГП re Я
Travis Adams
Emily AJandale
Henry Aibrecht Sal Antelman, Jr Dana Armstrong
Travis Adams
Emily AJandale
Henry Aibrecht Sal Antelman, Jr Dana Armstrong
Alex Avakian 111 Seth 6. Alpaugh Ri az Baldwin Alan Barandes Evan Barbee Rosie Baucom
Alex Avakian 111 Seth 6. Alpaugh Ri az Baldwin Alan Barandes Evan Barbee Rosie Baucom
Matti Bennett
Kirk Bever
Matti Bennett
Kirk Bever
Tammie Jill Adami
Lahnng Judd Joyce K. Garonzic Terry Kantola
Tammie Jill Adami
Lahnng Judd Joyce K. Garonzic Terry Kantola
Рис. 5,20. Сортировка по фамилии при наличии в полном имени второго имени и дополнительных пометок
Рис. 5,20. Сортировка по фамилии при наличии в полном имени второго имени и дополнительных пометок
Приглядевшись к результату, вы сможете заметить, что проблем при сортировке избежать не удалось. Функция создавалась из расчета, что если в полном имени имеется два пробела, значит, оно состоит из имени, фамилии и дополнения. Такое предположение работаете именами вида Alex Avakian III. Работа функции строится на предположении, что фамилия начинается после первого пробела.
К сожалению, имя вида Tammy Jill Adams не попадает в категорию фамилий, начинающихся на букву «А». В функции строится предположение, что наилучшим будет первый пробел, и полное имя подвергается сортировке, как будто фамилия начинается на букву «J». А у Tammy фамилия начинается со второго пробела, поэтому перед ним стоит извиниться.
Разбиение имен на части всегда было трудной задачей. Некоторые имена упорно не поддаются даже самым лучшим программам по разбору имен на составные части. Может, именно поэтому я продолжаю получать каталоги, адресованные некой личности, именуемой Мг. Кёп.
См. также «Использование в запросе своей собственной функции» (Трюк № 48).
ТРЮК№ 45ТРЮК№ 45Суммирование сложных данных
ТРЮК№ 45
ТРЮК№ 45
Использование преимуществ перекрестных запросов для просмотра разнообразных данных.
Если вам нужно собрать воедино данные, структура которых не поддается простой группировке, то лучшим средством послужат перекрестные запросы. В разделе «Подсчет промежуточных итогов на основе определенных условий» (Трюк Ns 29) показан способ условного суммирования, примененный в отчете. Он работоспособен до тех пор, пока количество условий не превышает возможности этой технологии.
В примере этого трюка при формировании промежуточных итогов фигурируют пять штатов и два года. Но в схеме данных есть еще и таблица Животные (схема моделирует пример из ветеринарной практики), привлечение которой создает множество вариантов: например, сколько котов было принято врачом в штате Нью- Йорк в 2003 году или сколько собак было принято в Пенсильвании в 2004 году, и т. д. На рис, 5.21 показана дополненная схема данных, приспособленная для данного трюка.
В схеме данных присутствуют семь видов животных (птицы, коты, собаки, хорьки, лошади, обезьяны и змеи), пять штатов (СТ, МА, NJ, NY и РА), и два года, за которые собирались сведения (2003 и 2004). Из этого количества данных можно составить 70 комбинаций. Лучшим способом подсчета количества визитов при различных сочетаниях и комбинациях условий будет применение перекрестного запроса.
Для начала нужно создать запрос на выборку, чтобы объединить различные таблицы и получить поля, необходимые для перекрестного запроса. Обратите внимание, что запрос на выборку содержит вычисляемое поле, извлекающее год из поля Дата_визита. На рис. 5.22 показан запрос на выборку в режиме Конструктора.
Рис. 5.21. Схема данных, включающая таблицу Животные
Рис. 5.22. Запрос на выборку, на основе которого будет выполняться перекрестный запрос
Введение в перекрестный запрос
В Access имеется мастер создания перекрестных запросов, который проведет вас по всем этапам этой работы. На рис. 5.23 показано диалоговое окно Новый запрос, с которого начинается создание перекрестного запроса.
В данном примере в первом окне мастера нужно выбрать запрос цгу_ШтатыЖи- вотныеДаты (рис. 5,24).
В следующем окне нужно выбрать два поля для строк. В перекрестном запросе строки играют роль групп. Обратите внимание, что после выбора двух полей для строк должно оставаться по крайней мере еще два поля. В качестве заголовке и строк нужно выбрать поля Штат и Вид.
Рис. 5.23. Создание перекрестного запроса
Рис. 5.24. Выбор запроса на выборку
Рис. 5.25. Выбор поля Год в качестве заголовка столбца
Следующее окно позволяет выбрать ноле, значения которого будут использоваться в качестве заголовков столбцов. В перекрестном запросе требуется выбрать для столбца хотя бы одно поле. Здесь нужно выбрать поле Год, как показано на рис. 5.25 (заметьте, что на рисунке изображено третье, а не второе, по счету окно мастера).
В последнем окне остается одно иоле. Здесь нужно выбрать тип составного вычисления, и данном случае должна быть выбрана сумма (рис. 5.26), поскольку паи нужно вычислить суммарное количество визитов. Также нужно сбросить флажок Да под вопросом <Вычислить итоговое значение для каждой строки?», Если фл; ЖОК оставить, сумма будет подсчитываться только для сочетания штата и вида
•к•кРис. 5.26. Выбор возвращаемой суммыРис. 5.26. Выбор возвращаемой суммы'- -..--,. -- . * А)г« А »-.<vX.«№«^^^^.-^ « У<^'•у ^тат**^ М8ВТМ »ю Даты пе рек рестн мй :■ перекрестный мп рос■'- -..--,. -- . * А)г« А »-.<vX.«№«^^^^.-^ « У<^'•у ^тат**^ М8ВТМ »ю Даты пе рек рестн мй :■ перекрестный мп рос■СТ •ст ст ст ст стСТ . МА МА МА МА’ МА МА МА NJ NJNJ NJNJ NJ Ml NYNY NY NY NYСТ •ст ст ст ст стСТ . МА МА МА МА’ МА МА МА NJ NJNJ NJNJ NJ Ml NYNY NY NY NYШтат_ |Штат_ |ВидВидПтица Кот Собака Хорек Лошадь Обезьяна: Птица : Кот ; СобакаПтица Кот Собака Хорек Лошадь Обезьяна: Птица : Кот ; СобакаХорек Лошадь Обезьяна ЗмеяХорек Лошадь Обезьяна Змея*"*™цаН -пСобака:XQpeK: Лошадь Обезьяна. Кот _СобакаХорек , Лошадь*"*™цаН -пСобака:XQpeK: Лошадь Обезьяна. Кот _СобакаХорек , Лошадь2929Э7:38:0Э7:38:06:6:51923.2351923.2357.306057.30605417914 12;17 й 62;9125417914 12;17 й 62;9123449449663449449665222530" 226738776919105222530" 2267387769191017177683131776831317
•к
•к
Рис. 5.26. Выбор возвращаемой суммы
Рис. 5.26. Выбор возвращаемой суммы
'- -..--,. -- . * А)г« А »-.<vX.«№«^^^^.-^ « У<^'
•у ^тат**^ М8ВТМ »ю Даты пе рек рестн мй :■ перекрестный мп рос■
'- -..--,. -- . * А)г« А »-.<vX.«№«^^^^.-^ « У<^'
•у ^тат**^ М8ВТМ »ю Даты пе рек рестн мй :■ перекрестный мп рос■
СТ •ст ст ст ст ст
СТ . МА МА МА МА’ МА МА МА NJ NJ
NJ NJ
NJ NJ Ml NY
NY NY NY NY
СТ •ст ст ст ст ст
СТ . МА МА МА МА’ МА МА МА NJ NJ
NJ NJ
NJ NJ Ml NY
NY NY NY NY
Штат_ |
Штат_ |
Вид
Вид
Птица Кот Собака Хорек Лошадь Обезьяна
: Птица : Кот ; Собака
Птица Кот Собака Хорек Лошадь Обезьяна
: Птица : Кот ; Собака
Хорек Лошадь Обезьяна Змея
Хорек Лошадь Обезьяна Змея
*"*™ца
Н -п
Собака
:XQpeK
: Лошадь Обезьяна
. Кот _
Собака
Хорек , Лошадь
*"*™ца
Н -п
Собака
:XQpeK
: Лошадь Обезьяна
. Кот _
Собака
Хорек , Лошадь
29
29
Э7:
38:0
Э7:
38:0
6:
6:
5
19
23.
23
5
19
23.
23
5
7.
30
60
5
7.
30
60
54
17
9
14 12;
17 й 62;
9
12
54
17
9
14 12;
17 й 62;
9
12
34
49
44
9
6
6
34
49
44
9
6
6
5
22
25
30
" 2
2
6
7
38
77
69
19
10
5
22
25
30
" 2
2
6
7
38
77
69
19
10
17
17
76
83
13
17
76
83
13
17
Рис. 5.27. Результат выполнения перекрестного запроса
Трюк № 46. Получение всех возможных сочетаний данных 1 53 животного (для полей, являющихся заголовками строк), но наша задача состоит в другом: подсчитать сумму для сочетания штата, вида животного и года.
Когда запрос будет создай, станут доступны все суммарные значения. На рис. 5.27 показан результат выполнения запроса, в котором представлены суммы для всех комбинаций штатов, видов животных и лет.
В результате получается 35 записей, поскольку в качестве заголовков строк выступают штаты и виды животных, а в качестве заголовков столбцов — годы. В совокупности представлены все 70 уникальных сочетаний, поскольку и 2003, и 2004 год имеют собственные столбцы.
См. также «Подсчет промежуточных итогов на основе определенных условий* (Трюк Ns 29).
ТРЮК№ 46ТРЮК№ 46Получение всех возможных сочетаний данных
ТРЮК
№ 46
ТРЮК
№ 46
Удаление ключевого слова Join из инструкции SQL с целью возврата декартова произведения (возврата всех возможных комбинаций).
Если убрать ключевое слово Join из инструкции SQL, то количество возвращенных записей будет равно произведению количества всех записей в таблицах. К примеру, если взять две таблицы и назначить для вывода на экран по одному полю из каж-
Рис. 5.28. Две несвязанные таблицыРис. 5.28. Две несвязанные таблицы
Рис. 5.28. Две несвязанные таблицы
Рис. 5.28. Две несвязанные таблицы
дой, то количество записей, возвращенных запросом на выборку, будет равно произведению количества записей двух таблиц.
Получается, что запрос соответствует всем комбинациям данных. Если в каждой таблице содержатся сотни или тысячи записей, то счет возвращенным записям может идти на миллионы. Если подобный результат не соответствовал замы с/ у запроса, он может навредить работе приложения. Тогда для чего же нужны подобные запросы? Они создаются для получения всех возможных комбинаций Если требуется получить именно такие всеобъемлющие данные, то не стоит возиться с программированием на VBA. достаточно создать запрос, который все сд ?- лает за вас. На рис. 5.28 показаны дне таблицы: одна - с именами двенадцати человек, а другая — с восемью возможными занятиями.
Нужно создать запрос на выборку, содержащий две таблицы, и выбрать из каждой по одному полю для вывода на экран. На рис. 5.29 показан запрос в режиме Конструктора. Обратите внимание, что между таблицами намеренно не установлено никакой связи.
Несложный подсчет на калькуляторе даст в результате 96 комбинаций людей и занятий. В результате выполнения запрос вернет 96 записей (см. рис. 5.30).
Результаты выполнения запроса могут быть скопированы, экспортированы и т д. Это быстрый и простой способ получения всех комбинаций данных. Следуя да/ ь- ше, нужно добавить к запросу третью таблицу, в которой в двух полях будут < о- держаться части дня: утро И после обеда. В результате работы запроса (рис. 5.51) будет возвращено 192 записи, это количество получается после перемножения чисел 12, 8 и 2.
Хотя обработка несвязанных данных считается нерациональной, по крайней мс ре при работе с базами данных, подобный набор возможных комбинаций применяется в обзорах, контрольных перечнях и т. д.
ИмяИмяАндрейАндрейАндрейАндрейАндрейАндрей Андрей АндрейАндрейАндрей Андрей АндрейТур^мТур^мЗанятиеЗанятиеПрикладное искусство КулинарияПрикладное искусство КулинарияМузицирование Занятия спортом Пересказ историй.Музицирование Занятия спортом Пересказ историй.АндрейАндрейПлаваниеПлаваниеАндрей БорисБорисБорисБорисАндрей БорисБорисБорисБорисПлетениеПлетениеБорисБорисБорисБорисБорис БорисБорис БорисПрикладное искусство ;КулинарияТуризм МузицированиеЗанятия спортом iПересказ историйПрикладное искусство ;КулинарияТуризм МузицированиеЗанятия спортом iПересказ историйПлаваниеПлаваниеПлетениеПлетениеДмитрий • Прикладное искусствоДмитрий • Прикладное искусствоДмитрийДмитрийДмитрий Дмитрий Дмитрий Дмитрий _ ДмитрийДмитрий Дмитрий Дмитрий Дмитрий _ ДмитрийКулинарияКулинария1№М„..Музицирование Занятия спортом1№М„..Музицирование Занятия спортомП^Й^Я^У^РиАП^Й^Я^У^РиАПлаваниеПлаваниеДмитрийДмитрийПлетениеПлетениеДанилаДанилаДанилаДанила; При клад ное искус стер , Кулинария; При клад ное искус стер , КулинарияИмяАндрей Андрей Андрей .Андрей Андрей Андрей Андрей „ Андрей АндрейИмяАндрей Андрей Андрей .Андрей Андрей Андрей Андрей „ Андрей Андрейз из леденил : уЗанятие 'i ■■з из леденил : уЗанятие 'i ■■i Прикладное искусство i Прикладное искусство Кулинария .Кулинария ТуризмТур*™. . Музицирование : Музицирование ■ Занятия спортомi Прикладное искусство i Прикладное искусство Кулинария .Кулинария ТуризмТур*™. . Музицирование : Музицирование ■ Занятия спортомАндрейЗанятия спортомАндрей . Пересказ историйАндрей.Пересказ историйАндрейЗанятия спортомАндрей . Пересказ историйАндрей.Пересказ историйАндрей Андрей АндрейАндрей Андрей Андрей-ндрей,-ндрей,■Плавание ; Плавание : Плетение i Плетение■Плавание ; Плавание : Плетение i ПлетениеБорисБорисПрикладное искусствоПрикладное искусствоБорис : Прикладное искусствоБорис-КулинарияБорисКулинарияБорис : Прикладное искусствоБорис-КулинарияБорисКулинария.Борис.Борис<: Борис<: Борис{ТуризмТуризм,{ТуризмТуризм,Борис МузицированиеБорис МузицированиеБорисБорисМуэи^ррваниеМуэи^ррваниеБорис [Занятия спортомБорис [Занятия спортом.Борис.БорисЧас^л^' ■ ^=Час^л^' ■ ^=iTresiTresПосле обедаУтроПосле обедаПосле обедаУтроПосле обедаУтроПосле обедаУтроПосле обедаУтроriii<.После обедаУтроriii<.После обедаУтро..После обедаПосле обедаУтро..После обедаПосле обедаУч™..Уч™..После обедаПосле обедаУтр» После обедаУтроПосле обеда т?»После обедаУтро ,,Утр» После обедаУтроПосле обеда т?»После обедаУтро ,,После обедаПосле обедаУтроПосле обеда„Утро,,УтроПосле обеда„Утро,,Занятия спортом После обеда1из 192Занятия спортом После обеда1из 192
Имя
Имя
Андрей
Андрей
Андрей
Андрей
Андрей
Андрей Андрей Андрей
Андрей
Андрей Андрей Андрей
Тур^м
Тур^м
Занятие
Занятие
Прикладное искусство Кулинария
Прикладное искусство Кулинария
Музицирование Занятия спортом Пересказ историй.
Музицирование Занятия спортом Пересказ историй.
Андрей
Андрей
Плавание
Плавание
Андрей
Борис
Борис
Борис
Борис
Андрей
Борис
Борис
Борис
Борис
Плетение
Плетение
Борис
Борис
Борис
Борис
Борис Борис
Борис Борис
Прикладное искусство ;
Кулинария
Туризм Музицирование
Занятия спортом i
Пересказ историй
Прикладное искусство ;
Кулинария
Туризм Музицирование
Занятия спортом i
Пересказ историй
Плавание
Плавание
Плетение
Плетение
Дмитрий • Прикладное искусство
Дмитрий • Прикладное искусство
Дмитрий
Дмитрий
Дмитрий Дмитрий Дмитрий Дмитрий _ Дмитрий
Дмитрий Дмитрий Дмитрий Дмитрий _ Дмитрий
Кулинария
Кулинария
1№М„..
Музицирование Занятия спортом
1№М„..
Музицирование Занятия спортом
П^Й^Я^У^РиА
П^Й^Я^У^РиА
Плавание
Плавание
Дмитрий
Дмитрий
Плетение
Плетение
Данила
Данила
Данила
Данила
; При клад ное искус стер , Кулинария
; При клад ное искус стер , Кулинария
Имя
Андрей Андрей Андрей .Андрей Андрей Андрей Андрей „ Андрей Андрей
Имя
Андрей Андрей Андрей .Андрей Андрей Андрей Андрей „ Андрей Андрей
з из леденил : уЗанятие 'i ■■
з из леденил : уЗанятие 'i ■■
i Прикладное искусство i Прикладное искусство Кулинария .
Кулинария
Туризм
Тур*™. . Музицирование : Музицирование ■ Занятия спортом
i Прикладное искусство i Прикладное искусство Кулинария .
Кулинария
Туризм
Тур*™. . Музицирование : Музицирование ■ Занятия спортом
АндрейЗанятия спортом
Андрей . Пересказ историй
Андрей.Пересказ историй
АндрейЗанятия спортом
Андрей . Пересказ историй
Андрей.Пересказ историй
Андрей Андрей Андрей
Андрей Андрей Андрей
-ндрей,
-ндрей,
■Плавание ; Плавание : Плетение i Плетение
■Плавание ; Плавание : Плетение i Плетение
Борис
Борис
Прикладное искусство
Прикладное искусство
Борис : Прикладное искусство
Борис-Кулинария
БорисКулинария
Борис : Прикладное искусство
Борис-Кулинария
БорисКулинария
.Борис
.Борис
<: Борис
<: Борис
{ТуризмТуризм,
{ТуризмТуризм,
Борис Музицирование
Борис Музицирование
Борис
Борис
Муэи^ррвание
Муэи^ррвание
Борис [Занятия спортом
Борис [Занятия спортом
.Борис
.Борис
Час^л^' ■ ^=
Час^л^' ■ ^=
iTres
iTres
После обеда
Утро
После обеда
После обеда
Утро
После обеда
Утро
После обеда
Утро
После обеда
Утроriii<.
После обеда
Утроriii<.
После обеда
Утро..
После обеда
После обеда
Утро..
После обеда
После обеда
Уч™..
Уч™..
После обеда
После обеда
Утр»
После обеда
Утро
После обеда т?»
После обеда
Утро ,,
Утр»
После обеда
Утро
После обеда т?»
После обеда
Утро ,,
После обеда
После обеда
Утро
После обеда
„Утро,,
Утро
После обеда
„Утро,,
Занятия спортом После обеда
1из 192
Занятия спортом После обеда
1из 192
Рис. 5.30. Возврат комбинированныхзаписейРис. 5.30. Возврат комбинированныхзаписейРис. 5.31. Возврат комбинаций записей трехнесвязанных таблиц
Рис. 5.30. Возврат комбинированныхзаписей
Рис. 5.30. Возврат комбинированныхзаписей
ТРЮК№47ТРЮК№47Обезвреживание пустых данных
ТРЮК
№47
ТРЮК
№47
Смешивание пустых и реально существующих данных иногда приводит к неверным результатам. Здесь рассматривается ряд рекомендаций по предотвращению подобных ситуаций.
При работе с данными Access можно подумать, что пустые поля совершенно безвредны. Между тем пустое поле, содержащее пустое строковое значение, существенно отличается от пустого поля со значением null То же самое относится и к числовым полям, в которых поле, содержащее 0, следует отличать от поля, содержащего значение null Данный трюк поможет в работе со значениями null.
Первые неприятности со значением null возникнут при использовании следующей программной строки, возвращающей Заполнено, даже если значение поля равно null:
11F([Сумма]=NulI,"Пусто","Заполнено")
Так получается из-за того, что в логическом выражении присутствие данных любой категории, чьи значения сопоставимы со значением Null, приводит к возврату значения False.
Эту ситуацию легко исправить, применив имеющуюся в Access функцию ISNUL.. Она возвращает логическое значение и позволяет успешно провести эту провер ку. Предыдущий пример нужно переделать следующим образом:
I IF (ISNULL([Сумма]),"Пусто","Заполнено")
Проблема решена, и каждое встреченное значение null теперь будет преобразовано в Пусто.
Значение null в числовых полях
] [редположим, существует таблица, содержащая поле под название Сумма. Вы ш i ■ таетесь вычислить среднеарифметическое значение содержимого этого поля (предположим также, что эта средняя величина не должна быть взвешенной). В запрос. осуществляющий попытку вычислить среднеарифметическое значение, нуж! о вставить следующую инструкцию SQL:
SELECT Avg (ТЫСумыа. Сумма) AS СредняяСумма
FROM сЫ_Сумма;
В результате ее работы будет возвращено среднеарифметическая величина значений, содержащихся в этом поле. Но если какие-нибудь значения будут равны null, то запрос их проигнорирует. Итак, если значения поля последовательно равны 8, null, 8, null, 8, null, среднеарифметическое значение будет равно 8. А если значения поля последовательно равны 8,0,8, 0,8,0, среднеарифметическое знач: ■ ние будет равно 4. В соответствии с назначением запроса вам в любом случае хотелось бы получить четыре, а не восемь.
При желании заменить значение null значением 0 следует воспользоваться фун к- цией IS NULL, включив ее в следующую программную строку:
IIP(ISNULL([Сумма]) ,0,[Сумма])
Но есть еще более простой способ. В Access существует функция NZ. использующая два параметра: в одном содержится значение, а во втором — то, во что ою превратится в случае, если будет пустым (null). Эту функцию можно использовать внутри числовых и строковых функций. Программная строка, использующая функцию NZ, приобретет следующий вид:
SELECT Avg(NZ([Сумма],В)) AS СредняяСумма
FROM СЫ_Сумма;
Нетрудно заметить, что строка получается короче, чем при использовании в тех же целях структуры IIF.
Теперь давайте взглянем на пример, использующий строковую функцию. Предположим, вы живете в таком месте, где растут сосны, и занимаетесь исследованием, для которого тип дерева вводится только в том случае, если это не сосна; в противном случае вводится только количество деревьев (плохо составленная программа, но я видел и похуже), а поле Порода je рева остается пустым (null).
Теперь предположим, что вы продолжаете использовать это приложение и намерены работать с ним в других частях страны. Поэтому вам захотелось обвош ть все пустые значения поля Порода_дерева и поместить в них значение Сосна. Фут к- ция NZ поможет вам справиться с этой задачей. Вот как будет выглядеть соответствующая инструкция SQL:
UPDATE 1Ы_ПородыДеревьее SET 1Ь1_ПородыДеревьев.Порода_дерева = nz([Порода_дерева]."Сосна"):
Эта инструкция вполне работоспособна, но нам ведь нужно обновить каждую запись. Если использование выражения Порода_дерева = Null не имеет смысла, возникает вопрос, а нельзя ли использовать null в качестве условия отбора в запросе. Вы можете воспользоваться одним из двух способов, но проще применить тот, в котором в качестве условия отбора используется специальный оператор IS NULL. Предыдущий запрос при использовании IS NULL будет выглядеть следующим образом:
UPDATE tbl_ ПородыДеревьев SET tbl_ ПородыДеревьев.Tree_Type = "Pine Tree” WHERE (((tbl_ ПородыДеревьев.Tree_Type) Is Null));
Предотвращение появления значений Null
Иногда подавление появления значений null или строк нулевой длины в вашей базе данных может стать приоритетной задачей. В качестве примера можно привести поле имени или почтового индекса. Добиться поставленной цели можно как при создании таблиц, так и при создании форм ввода данных.
Конструкция таблицы, в которой невозможно появление значения null и строк нулевой длины
При конструировании таблицы вы можете установить несколько свойств, помогающих справиться с появлением пустых полей (рис. 5.32).
Рис. 5.32. Установка свойств поля, подавляющих появление пустых значений и строк нулевой длины
Сначала рассмотрим свойство Обязательное поле. Если его значение установлено в Да, то Access не сможет сохранить значение поля до тех пор, пока в него не будут введены какие-нибудь данные. Но это не спасет от заполнения поля строкой нулевой длины. Установка значения свойства Пустые строки в Нет заставит вводить
в поле ненулевую строку. Если установить значение в Да, желая избавиться лип ь от значений null (и осуществлять проверку на незаполненные поля с помощьо выражения вида [Поле]= ""), то можно установить значение свойства Значение г о умолчанию в "",
При правильной установке значений этих двух свойств вы обеспечите заполнение всех полей и избавитесь от необходимости обрабатывать в приложении ну :- тыс значения. Такой же подход применим и к числовым полям: значение свойства Обязательное поле должно быть установлено в Да, а кроме этого, мож] о воспользоваться свойством Значение по умолчанию, которое обычно в числовых полях устанавливается в 0. Но если вам нужно убедиться в том, что пользователь не проигнорировал поле, а ввел в него значение, вам нужно удалить 0 из свойства Значение по умолчанию и установить значение свойства Обязательное поле в Да. Такой прием гарантирует запрет на сохранение записи до тех пор, пока пользователь нс введет в иоле какое-нибудь значение (может быть введен и 0, если только вами не установлены правила проверки, исключающие такую возможность).
Управление null-значениями с помощью свойств формы
Если вы не установили контроль над появлением пустых значений в таблице, но хотите все же получить гарантии того, что значения были введены, то это можно сделать и в формах Access. При создании формы становятся доступны несколько свойств текстовых полей, с помощью которых можно гарантировать наполненность данных (см. рис. 5.33).
Рис. 5.33. Подавление появления пустых значений с помощью свойств элементов формы
Если вам нужно всего лишь избежать появления значений null, вы можете установить значение свойства Значение по умолчанию, разрешающее появление строки нулевой длины.
Кроме этого, можно ввести программный код в процедуру обработки события Потеря фокуса, поскольку событие До обновления может возникнуть и при холост dm проходе поля, а событие После обновления возникает после реального внесения в поле каких-нибудь изменений. Вот как должен выглядеть программный код для поля с именем Пол el:
Private Sub nonel_LostFocus( )
If IsNull(Me.Поле1.Value) Then
MsgBox "В данное поле требуется ввести значение", vbOKOnly, "Внимание!"
Me. Поле2.SetFocus
Me.Поле!.SetFocus
End If
End Sub
Вас может удивить двойной вызов события Получение фокуса (в тексте процедуры — SetFocus). Это связано с необходимостью убрать фокус с текстового поля, а затем вернуть его обратно, иначе фокус не будет установлен на поле. Также может вызвать удивление, что здесь не использовано свойство Условие на значение. Дело в том, что это свойство задействуется только при внесении изменений, поэтому при холостом проходе поля оно не сработает.
Существуют ограничения и на использование события Потеря фокуса в том случае, если пользователь использует мышь и не щелкает на каждом поле. Это ограничение можно обойти, установив значение Текущая запись для свойства Цикл табуляции вкладки Другие диалогового окна свойств формы (рис. 5.34), а затем установив значение Нет для свойства Кнопки перехода во вкладке Макет того же диалогового окна (рис. 5.35).
Рис. 5.34. Установка значения «Текущая запись» для свойства «Цикл табуляции»
Рис. 5.35. Установка значения «Нет» для свойства «Кнопки перехода»
Проделав все это, вы можете создать собственные кнопки, позволяющие пользователю переходить к следующей записи, и поместить в обработку событий, возникающих при щелчке на этих кнопках, программный код, проверяющий приемлз- мость заполнения полей. В любом случае, намного проще установить ограничен!:я при создании таблицы, но зачастую об этом просто забывают.
ТРЮК№48ТРЮК№48Использование в запросе своей собственной функции
ТРЮК
№48
ТРЮК
№48
Создание собственной функции для работы с разнообразными форматами данных.
Когда в запросе понадобится сложное управление данными, то для этого иногда проще создать собственную функцию и избежать сложных функциональных построений внутри запроса. Тем не менее вы сами должны определить целесообразность создания функции. Если речь идет о сравнительно простом объединении нескольких полей, то я бы посоветовал создать функцию внутри запроса. По если нужно будет выполнить что-нибудь более сложное, что может при годить :я и в других местах приложения, то создание собственной функции позволит сэкономить массу времени.
Создание новой функции
Для создания функции нужно перейти к вкладке Модули и создать новый модуль. После входа в новый модуль (вы можете также войти в режиме Конструктора и в существующий модуль) выберите команду Insert ► Procedure (Вставить ► Процедуру). Присвойте функции имя. в группе Туре (Тип) выберите переключатель Function (Функция), а в группе Scope (Сфера применения) выберите переклю1 а- тель Public (Общедоступная). После появления заготовки функции вы можете пол е- стить в скобках переменные. 11ослс скобок присвойте функции тип, наберите As тип_ данных. Тем самым вы обеспечите возврат функцией данных заданного типа.
Управление датами
Даты приходят от разных систем в различных форматах, включая ггггммдд. мм/ дд/rrrr и ммддгггг. Если дата нужна в другом формате, например при импорте zu н- пых из вычислительных центров или в виде текстовых файлов заданной длит ы, в которых дата передается в виде текста, возникают сложности. В первом примере предполагается, что дата импортируется в формате ггггммдд или ггммдд. Фуг к- ция принимает строку в качестве аргумента, а для создания даты наряду с фут к- цией Cdate используются функции Left, Right и Mid:
Public Function ПолучениеДаты(Дт As Variant) As Date Dim MH As String
Dim ДД As String
Dim ГГГГ As String
If VBA.InStrd, Дт, "/") > 0 Then Дт = ""
Select Case VBA.LenlAccess.Nz(Дт, ""))
Case 8
ГГГГ = VBA.Left(Дт, 4)
ММ = VBA.Mid(Дт, 5. 2)
АД = VBA.Right(AT. 2)
ПолучениеДаты = VBA.CDate(MM & "/" & ДД & "/" & ГГГГ)
Case 6
ГГГГ = VBA.Left(Ar, 2)
ММ = VBA.Mid(Дт, 3, 2)
ДД = RightUT, 2)
ПопучениеДаты = VBA.CDate(MM & "/" & ДД & "/" & ГГГГ)
Case Else
ПолучениеДаты = #1/1/1900#
End Select
End Function
Обратите внимание, что строка передается этой функции как тип данных variant, поэтому переданное значение можно проверить на null или воспринять как настоящую дату. Если переменная будет объявлена типом данных string, значение null вызовет ошибку. В данном варианте, если будет передана настоящая дата, значение null или что-нибудь еще, отличное от формата ггммдд или ггггммдд, функция вернет дату 1/1/1900. Вы можете вместо этой даты выбрать другое значение. Строка If InStr.. .Then проверяет наличие косой черты (/) в составе переменной Дт. Если косая черта будет найдена, переменной Дт будет присвоена пустая строка.
Теперь предположим, что вам нужно получить обратное преобразование. У вас есть поле даты и нужно превратить его содержимое в строку фиксированной длины. Вот как может выглядеть требуемая для этого функция:
Public Function ПолучениеСтроковойДаты(Дт As Date) As String Dim MH As String Dim ДД As String Dim ГГГГ As String
MM = VBA.Right(DatePart("m", Дт) -t 100, 2)
ДД = VBA.Right (DatePartC'd", Дт) + 100, 2)
ГГГГ = VBA.DatePart("yyyy", Дт)
ПолучениеСтроковойДаты = ГГГГ & ММ & ДД
End Function
Этой функции передается переменная типа date. Если будет передано значение null или значение, отличное по типу от date, функция вернет ошибку (#Етгог). Такой результат является реакцией функции на передачу ей в качестве даты неподходящего значения.
Обратите также внимание, что в функции используется функция Right, в которую вложена функция Date Part, результат работы которой суммируется с числом 100. Тем самым гарантируется, что при извлечении месяца или дня будут возвращены две цифры. Если этого не сделать, то функция будет работать только на тех компьютерах, где дата устанавливается с лидирующими нулями. Подобное решение вы можете применять везде, где в числах, выраженных строкой, нужны лидирующие нули. Если нужно получить пять лидирующих нулей, используйте программную строку ri ght(x + 106090,5).
Теперь может возникнуть вопрос: «А как же использовать эти самостоятельно созданные функции'?»- Вы можете вызывать такие функции из запроса так же, как и любые другие функции. Вы можете использовать эти функции в формах, отчетах и т. л. Предположим, у вас есть таблица под названием Вй_Персональ- чыеДанные, в которой есть поле Дата Приема, имеющее тип Дата/время. Если вам нужно поместить в запрос поле с форматом даты ггггммдд, введите в Конструкторе запросов следующую строку:
ДатаПриема_текст: ПопучениеСтроковойДаты([ДатаПриема])
Вот и все, что нужно сделать Дата будет преобразована в строку в нужном фоэ- мате. Важно отметить, что все, что делает функция, вы могли бы сделать прямо в запросе. Но тогда вы бы лишились возможности многократно использовать ос у- шествлясмое функцией преобразование в других местах приложения.
ТРЮК№ 49ТРЮК№ 49Использование таблиц Access
ТРЮК
№ 49
ТРЮК
№ 49
в сценариях SQL Server
В SQL Server пишутся сценарии, создающие таблицы. Незначительное редактирование позволит сделать их работоспособными и в Access.
Переносу данных из Access на SQL Server уделяется достаточно много внимания. Причина состоит в том, что базы данных в конечном итоге имеют тенденцию к разрастанию, а не к уменьшению в объеме. Но этот трюк не имеет отношения к данным, в нем идет речь о создании их структуры. Иногда у вас может возникать потребность дублирования схемы данных, используемой в SQL Server, в Access. Это может быть вызвано намерением подготовить базу данных Access к миграции на платформу SQL Server.
Если вы уже знакомы с SQL Server, то, наверное, знаете, что SQL Server Enterprise Manager способен генерировать SQL-сценарии для создания новых таблиц на основе уже существующих. Если для вас это ново, то давайте приступим к освоению данной технологии.
Освоение Enterprise Manager
Enterprise Manager, показанный на рис. 5.3G, представляет собой утилиту управления системой SQL Server.
Па левой панели доступна база данных Pets. Эта база содержит различные объекты. Список таблиц базы отображен на правой панели. Три последние таблицы — tblAppointments.tblClients и tbtPets — являются пользовательскими. Это значит, ч го они созданы самим пользователем. Аналогичное понятие используется и в Access. Для создания SQL-сценария нужно щелкнуть правой клавишей мыши на таблице tbldients и выбрать команду AU Tasks > Generate SQL Seri pt (Задачи > Создать сценарий SQL) (рис. 5.37). После выбора места для хранения сценария будет создан его файл.
163
Рис. 5.36. Исследование Enterprise Manager
lufriHS P*8 ^«.^tib»»
Д*в»# ■ VW '. twit. Wallow; tM?
Н»|М1Г||П
Щм» New PteMkati*»..
i^kpUy Oey* Mewti#*.-
twen i *M# Ор#й leMe
*Aa
|6rfr*e
, 53Sf ГЯ#«И $4#* t»!iM.
№WMM»« ПАЗЛ» LW^*M iW^>^t»*w I^Stltfit :»U* WiWS f -2*42 **
$№i№i ^ SS aM ^M9$t^:$S»« М*Ж! t А «ЛИ U«We>:6e<^^
tatyMt tW.., EwyeH DatA...
■ i#itn»$6 Mt<iexet-.
»*<r^* Т4^е»*„.
M»>ii»^.<5 PetfH^eie^-,
.4 g #km s Й ы«е<к
^yW^^lfA;'• ■■
1ууЧЯ«*й' twS-fvxi ttufex TxH* *
^3<-^**l Help
.^^ —
: Я^-яНняниея
' . ц^|йЙ1
: ^st^w^r
. £3«т*<*гй»
■ ^3r*;r<wtfet
: S$stsMI»«ir R«a*№*
■StilMkes* :$£>M«*V
& -Q Si«l8*t S*fN*to № ■ ij >М+4М*$лк«л«
€o#y
(kW
Рис. 5.37. Подготовка к созданию SQL-сценария
Созданный системой SQL Server текстовый файл состоит из инструкций SQL. На рис. 5.38 показан созданный сценарий, открытый в Блокноте.
Файл Правка' Формат §нд ^правка
if exists (select • from dbo.sysobjects where id = object s_td(N‘[dbo] .[tblClients]1) and OBJECTPROPERTY (id, N'lsUserTable1) = 1)
drop table [dbo].[tblC1ients] GO
CREATE TABLE [dbo] [tbiClients] (
[ClientlD] [inti NOT NULL ,
[ClientFirstName] [nvarchar] (50) COLLATE SQL_Latml_GeneraLCPl_CI_AS NULL , [ClientLastName] [nvarchar] (50) COLLATE SQL_Latinl_GeneraLCPl_CI_AS NULL . [ClientAddress 1] [nvarchar] (50) COLLATE SQL_Latinl_General_CPl_CI_AS NULL , [Clientcity] [nvarchar] (50) COLLATE SQL_Latinl_GeneraLCPl_CLAS NULL , [ClientState] [nvarchar] (50) COLLATE SQL_Latinl_General_CPl_CI_AS NULL , [Clientzip] [nvarchar] (50) COLLATE SQL_Latinl_GeneraLCPi_Cl„AS NULL, [ClientPhone] [nvarchar] (50) COLLATE SQL_.Latinl_General_CPl_CL.A5 NULL ,
) ON [PRIMARY]
GO
Рис. 5.38 Созданный сценарий
В таком виде этот сценарий, если его запустить в Access, работать не сможет. Интересующая нас информация расположена посредине текста и начинается с инст-
Рис. 5.39. Создание управляющего запроса
рукции Create Table. Хотя эта инструкция распознается в Access, но типы полей не соответствуют принятым стандартам и требуют внесения исправлении. Чтобы выполнить эту работу, требуются небольшие познания в SQL, отсутствие которых полезно будет восполнить.
После внесения исправлений в инструкцию SQL и подготовке ее к использованию в Access нужно вызвать создание управляющего запроса. На рис. 5.39 показано, как получить доступ к этому специализированному виду запроса Access.
После выбора типа запроса вы попадете в окно ввода инструкций SQL. На рис. 5.40 показано окно с отредактированной инструкцией SQL, готовой к работе в Access. Без сомнения, при запуске этого сценария будет создана новая таблица tblClients. Итак, вы можете не только воссоздать в Access схему данных SQL, но и отредактировать сгенерированный системой SQL Server сценарий для реализации этой задачи.
Рис. 5.40. Сценарий SQL, подготовленный к запуску в AccessРис. 5.40. Сценарий SQL, подготовленный к запуску в Access
Рис. 5.40. Сценарий SQL, подготовленный к запуску в Access
Рис. 5.40. Сценарий SQL, подготовленный к запуску в Access
ТРЮК№ 50ТРЮК№ 50Использование в запросах символов- заменителей
ТРЮК
№ 50
ТРЮК
№ 50
Применение оператора Like в том случае, если точно воспроизвести написание элемента данных не представляется возможным.
Когда вы в состоянии вспомнить лишь часть каких-нибудь сведений, в поиске записей в базе данных вам поможет SQL-оператор Like. Сочетание этого оператора с символами-заменителями позволяет создавать эффективные запросы.
Представьте, к примеру, что у вас есть таблица базы данных, заполненная записями о клиентах, и вам нужно найти клиента, чья фамилия начинается на «Де», поскольку это все, что вы смогли о нем вспомнить.
На рис. 5.41 показан запрос, в котором используется символ-заменитель звездочка (*), предназначенный для поиска всех клиентов, чьи фамилии начинаются с сочетания «Де». Звездочка заменяет любое количество символов. В результате выполнения запроса будут возвращены записи о клиентах, чьи фамилии начинаются на «Де».
Рис. 5.41. Поиск клиентов с применением символа-заменителя «звездочка»
Рис. 5.42. Поиск клиентов с применением символов-заменителей «вопросительный знак»
Теперь предположим, вы запомнили, что фамилия начинается на «Д» и состогт из шести букв. В 'таком случае больше подойдет символ-заменитель «вопросительный знак» (?). Он применяется для замены любого одного символа. На рис. 5.42 показаны пять вопросительных знаков, использованных для заполнения пяти знакомест после буквы «Д». На рис. 5.43 показан результат выполнения запрос ч. Возвращены фамилии всех клиентов, состоящие из шести букв и начинающиеся с буквы «Д».
Использование символов-заменителей позволяет применить творческий подход к выборке данных. Вы можете вспомнить первую или последнюю букву фамилии либо ГО, что она состоит из пяти букв, и при этом нс помнить ни одной из этих букв. В этом случае использование условия отбора Like "?????" позволит вернуть список всех клиентов, чьи фамилии состоят из пяти букв (рис. 5.44).
Рис. 5.43. Записи, возвращенные с использованием символов- заменителейРис. 5.43. Записи, возвращенные с использованием символов- заменителейРис. 5.44. Возвращение списка всех клиентов с фамилиями из пяти буквРис. 5.44. Возвращение списка всех клиентов с фамилиями из пяти букв
Рис. 5.43. Записи, возвращенные с использованием символов- заменителей
Рис. 5.43. Записи, возвращенные с использованием символов- заменителей
Рис. 5.44. Возвращение списка всех клиентов с фамилиями из пяти букв
Рис. 5.44. Возвращение списка всех клиентов с фамилиями из пяти букв
ТРЮК№ 51ТРЮК№ 51Упрощение условия отбора, в котором используется оператор Or
ТРЮК
№ 51
ТРЮК
№ 51
Использования оператора In для избавления от многострочной структуры в Конструкторе запросов.
Конструктор запросов Access предназначен для облегчения работы по их составлению и справляется со своей задачей неплохо. Безусловно, Конструктор служит и основным средством обучения, помогая понять работу запросов и методику их использования.
При создании запроса, содержащего условие отбора с оператором Or (Или), Конструктор запросов можно использовать двумя способами. На рис. 5.45 показан обычный способ создания запроса, возвращающего записи, в которых фигурируют те штаты, которые имеют отношение к одному из шести возможных значений. Очевидно, что при добавлении в перечень штатов еще нескольких аббревиатур для работы с запросом уже понадобится использовать вертикальную прокрутку.
Рис. 5.45. Создание запроса, основанного на использовании оператора Ог (Или)
На рис. 5.46 показан альтернативный способ включения оператора От в условия отбора. Указанные штаты помещены в одну строку и разделены по всей ее длг не операторами Or. Но эта конструкция при добавлении новых штатов тоже будет становиться все более громоздкой. Каждый добавленный штат потребует добавление еще одного оператора Or, удлиняя в целом все выражение.
Решение дилеммы состоит в использовании оператора In, как нельзя лучше подходящего для составления условия отбора. Если в примере на рис, 5.46 включение каждого штата требует собственного оператора Or, то для примера на рис. 5 47 потребуется только один оператор In,
Рис. 5.46. Слишком длинная инструкция для условия отбора
Использование оператора In облегчает добавление состоянии в условие отбора. Все сокращенные наименования штатов следует обязательно разделить точками с запятой.
ТРЮК№ 52ТРЮК№ 52Упрощение условия отбора, в котором используется оператор And
ТРЮК
№ 52
ТРЮК
№ 52
Избавление от многократного применения оператора And за счет применения сочетания операторов In и Not.
Иногда условия отбора настраиваются не на включение, а на исключение определенных записей из выводимого запросом списка. Применение такой обратной логики имеет смысл в том случае, если нужно вернуть основное количество записей за некоторым исключением. В разделе « Упрощение условия отбора, в котором используется оператор Ог» (Трюк № 51) рассматривалось применение оператора In для усовершенствования инструкции условия отбора, использующей оператор Or. А при настройке условия отбора на исключение используется оператор And (И). Например, замысел запроса может звучать так: «Вывести все записи, за исключением тех, которые относятся к штатам Калифорния (СА) и Нью-Мексика (NM)». На рис. 5.48 показан запрос в режиме Конструктора, в котором исключаются все записи, имеющие отношение к любому из шести штатов. При дополнении списка исключаемых штатов требуется добавлять и очередной оператор And. В конце концов этот способ, требующий ввода множества операторов And, становится утомительным и вынуждает к применению горизонтальной прокрутки для прочтения всей инструкции.
Рис. 5.48. Многократное использование оператора And для пропуска определенных записейРис. 5.48. Многократное использование оператора And для пропуска определенных записей
Рис. 5.48. Многократное использование оператора And для пропуска определенных записей
Рис. 5.48. Многократное использование оператора And для пропуска определенных записей
Как тут нс вспомнить о способе использования оператора In для сокращения длинной инструкции условия отбора. Но в этом условии отбор ведется по исключи ю- щему принципу. Решение заключается в использовании сочетания оператороЕ In и Not. Оператор Not относится к разряду логических: он приводит к обращению условия на противоположное. Включение его в инструкцию вместе с оператором In приводит к исключению из условия отбора значении, находящихся в списке,
Рис. 5.49. Использование сочетания Not и InРис. 5.49. Использование сочетания Not и In
Рис. 5.49. Использование сочетания Not и In
Рис. 5.49. Использование сочетания Not и In
что и требовалось получить в данном запросе. На рис. 5.49 показан улучшенный вариант запроса, из которого удалены все операторы And.
Запрос с такой усовершенствованной инструкцией вернет те же записи, что и п редыдущий.
ТРЮК№ 53ТРЮК№ 53Создание внешнего соединения
ТРЮК
№ 53
ТРЮК
№ 53
Система Access не поддерживает создание внешнего соединения, но это ограничение нетрудно обойти.
При стандартном соединении двух таблиц возвращаются записи па основе поля пли полей, выбранных в качестве ключей. Такая связь называется внутренней.
Например, указание вроде «нужно вернуть список всех покупателей и записи об их покупках» обычно означает возвращение всех записей о покупках и записей о покупателях, которым принадлежат записи о покупках.
Иногда бывает востребовано левое (left join) или правое (right join) внешнее соединение. Например, «нужно вернуть список всех покупателей и любых покупок, возможно, совершенных ими» — это требование установить левое внешнее соединение. Иными словами, это требование вернуть все записи из левой таблицы (покупателей) и любые записи о продажах, которые им соответствуют.
На рис. 5.50 показано, как выглядят записи, возвращенные в результате работы запроса, использующего левое внешнее соединение (left join). В данном примере покупателей представлено больше, чем календарных дат совершения покупок. Некоторые покупатели ничего не покупали, поэтому для них данные в правом столбце отсутствуют.
Рис. 5.50. Записи, возвращенные запросом с левым внешним соединением
При установке правого внешнего соединения (right join) возвращаются все записи из правой таблицы, и только те записи из левой таблицы, которые соответствуют ключу. Создание трех типов соединений — внутреннего, левого и правого - не представляет особого труда. При существующей связи между таблицами внутреннее соединение устанавливается по умолчанию.
Установить тип соединения можно как в окне Схема данных, так и в Конструкторе запросов, дважды щелкнув налипни, соединяющей две таблицы. На рис. 5.51 показано диалоговое окно Параметры объединения, появляющееся после двойного щелчка на линии. В нем можно выбрать один из трех типов объединения.
Нетрудно заметить, что создание внешней связи, при которой возвращаются все записи из обеих таблиц, как имеющие соответствующие ключевые поля, так и не
Рис. 5.51. Установка параметров объединения
имеющие их, ис предусмотрено. Для решения этой задачи используется трюк, в котором все три доступных типа соединения объединены в один запрос. В это и итоговом запросе используется оператор Union, объединяющий результаты всех трех запросов.
Запрос на объединение может быть создан только в виде инструкции SQL. В >. можете ввести всю инструкцию непосредственно в новый запрос или облегчить себе задачу, скопировав сгенерированные инструкции SQL из запросов, созда! • пых по всем трем типам соединений, и вставив их в новый запрос. Все, что ост; - нется сделать в новом запросе, — это поставить впереди второго и третьего фрагмента инструкции SQL-операторы Union:
SELECT 1Ь1_Покупатели.Фамилия. ГЫ_Покупки.Дата
FROM 1Ы_Покупатели INNER JOIN ГЫ_Покулки ON
ТЫ_Покупатели. ПокупательЮ = СЫ_Покупки. Покупатель_Ю
Union
SELECT 1Ы_Покупатели.Фамилия. ГЬ1_Покулки.Дата
FROM СЫ_Покупатели LEFT JOIN 1Ы_Покупки On
1Ы_Покупатели. ПокупательЮ = 1Ы_Покупки. Покупатель_Ю
Union
SELECT Ю1_Покупатели.Фамилия. 1Ы_Покулки.Дата
FROM 1Ы_Покупатели RIGHT JOIN 1Ы_Покупки ON
1Ы_Покупатели . ПокупательЮ = СЫ_Покулки, Покупатель_Ю;
На рис. 5.52 показаны результаты выполнения инструкции SQL.
Оба столбца (взятые из разных таблиц) наряду со строками, заполненными заш - сями, имеющими соответствия, имеют и пропуски в тех местах, где их записям не находится соответствий в другой таблице.
ФамилияФамилия23.12.2004;23.12.2004;03.06.200 '21.06 20013.08.29027.09.20010 10 20019 10 20003.06.200 '21.06 20013.08.29027.09.20010 10 20019 10 200Андреев Асташков БоярскийАндреев Асташков Боярский11 09.2005 05 03.2005] 23 09 2005 07 02 2005 12 11.200411 09.2005 05 03.2005] 23 09 2005 07 02 2005 12 11.2004Дата11 12.200 05.02.200 14.04 200 17 04 200Дата11 12.200 05.02.200 14.04 200 17 04 200[Быков ВолковВаронов Дорохов Евсеев Казаков Кириллов Климов Курмаэов[Быков ВолковВаронов Дорохов Евсеев Казаков Кириллов Климов КурмаэовРис. 5.52. Результат выполнения запроса с внешним соединениемРис. 5.52. Результат выполнения запроса с внешним соединением
Фамилия
Фамилия
23.12.2004;
23.12.2004;
03.06.200 '21.06 200
13.08.290
27.09.200
10 10 200
19 10 200
03.06.200 '21.06 200
13.08.290
27.09.200
10 10 200
19 10 200
Андреев Асташков Боярский
Андреев Асташков Боярский
11 09.2005 05 03.2005] 23 09 2005 07 02 2005 12 11.2004
11 09.2005 05 03.2005] 23 09 2005 07 02 2005 12 11.2004
Дата
11 12.200 05.02.200 14.04 200 17 04 200
Дата
11 12.200 05.02.200 14.04 200 17 04 200
[Быков Волков
Варонов Дорохов Евсеев Казаков Кириллов Климов Курмаэов
[Быков Волков
Варонов Дорохов Евсеев Казаков Кириллов Климов Курмаэов
Рис. 5.52. Результат выполнения запроса с внешним соединением
Рис. 5.52. Результат выполнения запроса с внешним соединением
ТРЮК№ 54ТРЮК№ 54Использование в запросах Access регулярных выражений
ТРЮК№ 54
ТРЮК№ 54
Иногда возможностей символов-заменителей уже не хватает. Проявив смекалку, вы сможете использовать в запросах регулярные выражения.
Хотя в Access допускается использование довольно мощных механизмов сравнения строк (см. «Использование подстановочных знаков при сравнении строк* в справочной системе Access), все же время от времени требуется использовать что-нибудь более мощное. Возможность использования регулярных выражения была добавлена корпорацией Microsoft в Windows Scripting Engine еще в версии 5.0, в дополнение к JavaScript. Вся мощь этой технологии может быть использована и в запросах Access.
Хотя в данном трюке используются не самые простые элементы регулярных выражений, приводимый здесь пример может стать для новичков первым шагом в их изучении.
Отсутствие встроенных регулярных выражений во многих случаях можно компенсировать за счет применения символов-заменителей Access, многократного вызова строковых функций Left, Mid, Right, Len и т. д. Но как только вы увидите, на что способна специально созданная функция, то наверняка сможете оценить и преимущества ее применения, и полученную при этом экономию времени.
Создание своей собственной функции
Сначала нужно создать функцию, связанную с исполняемой библиотекой Microsoft Scripting, которую можно будет вызвать из запроса Access.
Использование данного трюка предполагает наличие последней версии Micros aft Scripting Engine, установленной на вашем компьютере. Если вы не уверены в ее наличии, посетите веб-сайт http://www.microsoft.com/scripting.
В следующем программном фрагменте используется функция CreateObject, поэтому его можно использовать в другой базе данных без проверки установлен)! ях ссылок на объекты:
Public Function RegExp(str_CTpoKa As String, _
str_PerB As String, Optional Ьо1_ИгнРег As Boolean = False) As Boolean
Dim re As Object
Set re = CreateObjectfvbscri pt. RegExp")
re.Pattern = str_PerS
re.IgnoreCase = bol^HrHPer
If re.Test(str„CTpOKa) Then
RegExp = True
Else
RegExp = False
End If
End Function
У функции есть два обязательных параметра: строка, подлежащая сравнению, и строка, содержащая регулярное выражение. Третий, необязательный, параметр может заставить функцию при проведении сравнения игнорировать регистр буев; по умолчанию регистр будет учитываться.
Создание запроса, используемого в качестве примера
В качестве примера рассмотрим процесс проверки учетных номеров комплектующих, направленный на выявление номеров, не отвечающих заданным критериям. Нередко данные, получаемые от разных людей, работающих на различных компьютерных платформах, необходимо очистить перед вводом в главную бгзу данных. Предположим, что номера комплектующих деталей, предназначенных для фабрики, должны отвечать следующим критериям:
они должны начинаться с заглавных букв PN или заглавной буквы Р;
следующие две позиции должны быть цифрами;
следующая позиция должна быть заглавной буквой (A-Z);
следующие три или четыре позиции должны быть цифрами;
следующие пять позиций должны быть заглавными буквами (A-Z).
Примеры учетных номеров, отвечающих этим критериям: PN12W123ABCDE и P12W123ABCDE. Примеры, не отвечающие критериям: PN12W13ABCDE (только две цифры после W) и 12W123ABCDE (не начинается с PN или Р).
С учетом набора критериев, которым должны отвечать номера комплектующих, регулярное выражение должно иметь следующий вид:
"Л(PNJР)(0-9)[0-9][A-Z][0-91{3.4}[A-Z][5,6}$"
Как уже упоминалось ранее, подобные регулярные выражения могут быть вам непонятны до тех пор, пока вы не приобретете достаточного опыта работы с ними. Если они вам незнакомы, я настоятельно рекомендую дополнительно почитать соответствующую литературу и научиться полностью использовать их возможности. Чтобы лучше понять, о чем идет речь, разберем наше выражение:
Л — предписание вести поиск соответствия с начала строки;
(РN | Р) — задание соответствия символам PN или символу Р;
[6-9] [0-9] — задание соответствия двум цифрам, обе из которых находятся в диапазоне от 0 до 9;
[ A- Z ] — задание соответствия одиночному си мволу в диапазоне от А до Z;
[0-9] {3,4} — задание соответствия одиночной цифре от 0 до 9, которая повторяется от трех до четырех раз;
[ A-Z] {5,6} — задание соответствия одиночному символу от А до Z, который повторяется от пяти до шести раз.
На рис, 5.53 показана компоновка запроса на поиск номеров комплектующих, не отвечающих нашим критериям.
Рис. 5.53. Вызов функции RegExp из запроса
При выполнении запроса, изображенного на рис. 5.53, будут возвращены номера комплектующих, не соответствующие заданным критериям, чтобы их можно было просмотреть перед тем, как отправить в главную базу данных. Хотя то же самое можно сделать и без обращения к возможностям регулярных выражений, но при этом придется использовать более громоздкие решения.
Трюк в трюке
В процессе исследования эффективности применения регулярных выражений вы можете прийти к выводу, что они вполне подходят ко всем видам обработки текста. Другим полезным трюком станет использование регулярных выражений для
проверки вводимого в форму текста. Реализовать его можно вызовом функци t RegExp из процедуры обработки события До обновления, принадлежащего тексте - вому полю. Если функция возвратит false, нужно установить переменную Gansel переданную в качестве параметра процедуры, в True, что приведет к очистке пол в от введенного в него значения.
Вы даже можете придать своему приложению новые возможности, позволяющие пользователю осуществлять поиск на основе определяемых им же регулярных выражений.
ГЛАВА 6
Решение проблем многопользовательской среды
Трюки № 55-58
Базы данных Access могут устанавливаться не только в виде отдельных приложений, но и в качестве многопользовательских систем. Работа с общедоступной базой данных при всей своей эффективности может сопровождаться возникновением проблем, связанных с доступом пользователей к данным друг друга. В этой главе представлено несколько приемов интеграции Access в многопользовательскую среду с обеспечением сохранности данных. «Создание функции реагирования на простой* (Трюк № 57) позволяет определить и завершить простаивающий режим редактирования записи, открывая тем самым возможность вносить изменения в эту запись другим пользователям. «Проверка на наличие дубликатов* (Трюк № 55) раскрывает способ проверки данных, не позволяющий пользователями дублировать записи друг друга. В главе также рассматриваются способы распространения приложений (Трюк№ 56), упрощающие передачу баз данных с распределенной структурой с машины разработчика на машины клиентов, вместе со ссылками на таблицы, в соответствии со структурой сети.
ТРЮК№ 55ТРЮК№ 55Проверка на наличие дубликатов
ТРЮК
№ 55
ТРЮК
№ 55
Прежде чем вставлять в главные таблицы данные, введенные несколькими операторами в условиях интенсивного приема информации, нужно проверить данные на наличие дублей при помощи специально созданной функции.
Размещение самой базы данных на сервере не означает, что там же должно размещаться и все приложение. Обычно данные размещаются в серверной базе данных, а формы устанавливаются в отдельных файлах Access на клиентских машинах. Такова типичная для Access версия построения клиент-серверного приложения.
Поскольку у клиентов установлена полная версия базы данных Access, использование в клиентской среде таблиц открывает новые возможности. Можно воспользоваться технологией предварительного ввода данных в локальные таблицы с последующей вставкой всей введенной информации в главную таблицу на сервере.
Суть данной технологии заключается в том, что у операторов, занятых вводом данных, имеются локальные таблицы, являющиеся точной копией таблиц, размещенных на сервере. Формы ввода данных связаны с локальными таблицами, и вес j процесс ввода носит локальный характер. В конце рабочего дня или в другое определенное время предусмотрено перемещение данных с локальных таблиц в таблицы на сервере.
И в этом есть свои преимущества. В процессе вставки данных, непосредственно перед самой вставкой в серверные таблицы, происходит сбор информации со все < клиентских таблиц, принадлежащих операторам, и ее проверка на наличие дублен. Обычно такая промежуточная проверка не имеет особого смысла, поскольку данные, как правило, проверяются н процессе ввода. Но главным здесь являете т не столько проверка в смысле правильности содержимого, сколько поиск записей-двойников, получаемых в процессе вставки.
Такая технология применима в деятельности, связанной с предоставлением услуг, торговлей или приемом заказов по телефону. Например, при обработке телефонных звонков вполне возможно, что некая дама сделает какой-нибудь заказ а, скажем, через час то же самое сделает ее муж. Если их заказы принимались раз - ными операторами, никто из них не сможет догадаться о том, что заказ продублирован. Эти две записи, созданные в результате приема заказов, не являются полным i копиями, поскольку по крайней мере имена заказчиков в них будут разными. Но пр т использовании специально разработанной процедуры проверки они могут быть идеи - тифицированы как дубли, потому что в них, как минимум, совпадают адреса.
Такую проверку па частичные совпадения можно провести и на сервере, поэтом у возникает вопрос; зачем тогда возиться с отдельными таблицами для ввода данных? Это делается для повышения производительности. Если всю входящую информацию направлять непосредственно в таблицы на сервере и вести проверку на дубликаты, используя именно эти, большие по объему таблицы, мы столкнемся с проблемой существенного падения скорости работы всей системы.
Другой заслуживающей рассмотрения проблемой будет установка срока, в течение которого записи могут рассматриваться как дубли. При локальном вводе дан - ных проверка будет проводиться не реже раза в день и охватывать всю введенную задень информацию. Вовлекать в проверку более ранние записи серверных таблиц, скорее всего, нс имеет смысла. Если заказ был сделан дважды за день, то он скорее всего, продублирован. Л если он похож на заказ, сделанный на прошло! неделе или в прошлом месяце, то, вероятно, это уже повторный заказ.
ТРЮК№ 56ТРЮК№ 56Распространение распределенной базы данных с заранее установленными ссылками на таблицы
ТРЮК
№ 56
ТРЮК
№ 56
Если вы выберете этот весьма интересный способ распространения, пользователям те првдется устанавливать связи файлов своей базы данных с таблицами данных системы.
Технология, известная как распределенные базы данных, получила распространение достаточно давно. Она использует таблицы только в виде сетевых файлов
Access общего доступа, размещенных на сервере. А копии интерфейсных файлов Access (содержащих формы, отчеты и т. д.) размещаются на диске С: каждого пользователя и используют связанные таблицы. Преимущества такой клиент-серверной конфигурации базы данных широко известны и достаточно хорошо документированы.
Однако при частых обновлениях, особенно в процессе доработки системы, справиться с распределенными базами данных может быть весьма непросто. У некоторых пользователей установка офисного пакета не содержит Диспетчер связанных таблиц, поэтому при попытке обновить или внести изменения в связи им может быть предложено использовать установочный компакт-диск офисного пакета. Другие пользователи могут испытывать затруднения или недостаток знаний для работы со связанными таблицами. Частые изменения связей проблематичны особенно для тех, кто привык пользоваться общими ресурсами базы данных, размещенными в одном месте.
В начальной стадии разработки, когда конечным пользователям постоянно предлагаются доработанные и исправленные версии продукта, имеет смысл содержать весь проект в одном файле. По когда схема данных будет отработана, наступит время для того, чтобы разбить базу данных на части. Сделать это можно будет двумя способами:
Скопировать базу данных, для того чтобы иметь под рукой два абсолютно одинаковых экземпляра. В одном из них удалить все таблицы. В другом, наоборот, удалить все, кроме таблиц.
Воспользоваться утилитой Разделение баз данных (Сервис к Служебные программы). С ее помощью в один прием будет создан файл Access, содержащий только таблицы, и удалены эти же таблицы из базы данных, запустившей утилиту.
Затем прикладная (или серверная) база данных (содержащая только таблицы) становится общедоступной по сети, а интерфейсная часть базы данных распространяется среди пользователей и работает на их компьютерах. Суть проблемы заключается в том, что интерфейсная база данных должна быть связана с таблицами серверной базы. Моделирование этих связей на компьютере разработчика перед распространением интерфейсной части базы данных и является предметом нашего рассмотрения. Если вам удастся установить связи, соответствующие реальной рабочей среде, то пользователи будут избавлены от необходимости самостоятельно устанавливать связи на своих компьютерах.
Иными словами, вы сможете распространять интерфейсную часть с предустановленными связями. В целом решение основано на единой для всех пользователей схеме использования логических дисков.
Копирование сетевого диска на компьютер разработчика
Для копирования сетевого диска на машину разработчика вам понадобится команда DOS SUBST, которая будет использована для создания схемы, отвечающей потребностям отдельного пользователя.
Сначала нужно создать на компьютере каталог, который будет представлять общую папку, содержащую серверную часть базы данных. Если сетевой путь будет
содержать подкаталоги, то его структуру следует повторить на вашем рабочем компьютере.
Синтаксис команды SUBST требует указания буквы нового виртуального диска и пути, которому этот диск будет сопоставлен:
SUBST «Буква нового виртуального диска*: «Путь, сопоставляемый этой букве* Например, если в папке C:\Client5 содержится подпапка XYZ_Corp и вы хотите сопоставить ее виртуальному диску $:, выберите команду Пуск * Выполнить, наберите command (Windows 98, Me) или CMD (Windows NT, 2000, XP) и щелкните на кнопке ОК. Затем введите в командную строку следующую команду:
SUBST S: C:\Clients\XYZ_Corp
На рис. 6.1 показано, как это сделать в окне командного процессора.
Рис. 6.1, Использование команды SUBST
Если пользователи будут получать доступ к подпапке, используя диск S:, то соответствующие имена папок надо указать в качестве сопоставляемых диску S:. Разместите серверную часть базы данных в соответствующей папке.
Теперь, при установке связей с таблицами серверной части в работающей интерфейсной части базы данных, выйдите на свой новый диск 5: и найдите серверную часть базы данных, устанавливая, таким образом, те связи, которые пригодятся другим пользователям. Когда обновление будет послано пользователям, им уже не придется вносить в связи какие-либо изменения. Созданный виртуальный диск будет виден и в папке Мой компьютер, существуя до следующей перезагрузки системы. Если вы решите избавиться от него, то можете воспользоваться той же командой с ключом /d:
SUBST 5: /d
Важно отметить, что при этом указанный виртуальный диск всего лишь удаляется из дисковой схемы, а сопоставленная ему папка со всем ее содержимым остается в неприкосновенности. Также имейте в виду, что команду SUBST нельзя будет применить, используя букву диска, уже задействованную в схеме. То есть если вы подключили брелок флэш-намяти и он использует букву диска G:, то, прежде чем использовать в команде SUBST такую же букву для сопоставления какой-нибудь папке, вы должны осуществить безопасное извлечение устройства памяти.
Конечно, подобная технология работает только в абсолютно стабильной среде, где для общих ресурсов каждого пользователя назначена одна и та же буква диска. Несмотря на то что диск S: может работать в вашем первичном соединении, другие пользователи приложения могут иметь другую букву диска, сопоставленную размещению серверных таблиц, или вообще могут не использовать сопоставленные буквы диска. Они могут получать доступ к папке через имя вида \\Имя_
сервера\Имя_общей_папки, соответствующее соглашению об универсальном назначении имен (Universal Naming Convention — UNC). В таком случае вы должны эмулировать подобную среду на вашем компьютере до тех пор, пока это отвечает вашим целям, и переименовать компьютер, присвоив ему серверное имя (позднее вы всегда сможете все снова изменить).
Использование подстановки UNC
Если вы хотите использовать подстановку UNC, вам нужно будет переименовать свой компьютер. Сначала нужно узнать сетевое имя сервера, используемое на стороне клиента, и полный путь с указанием всех папок и подпапок к общему ресурсу, содержащему файл с прикладными данными. Для переименования компьютера с целью имитации сервера нужно вызвать диалоговое окно Свойства системы, щелкнув правой клавишей мыши на значке Мой компьютер, и выбрать в контекстном меню пункт Свойства. Затем следует выбрать вкладку Имя компьютера и щелкнуть на кнопке Изменить. В появившемся окне Изменение имени компьютера, показанном на рис. 6.2, нужно ввести требуемое имя компьютера. Для вступления изменений в силу компьютер нужно перезапустить. Разумеется, при этом вы заведомо создаете имя, конфликтующее с сетевым окружением. Предполагается, что компьютер, на котором вы ведете разработку, не относится к рабочей сети. Но если это так, то на время работы сетевое подключение нужно разорвать.
Рис. 6.2. Изменение имени компьютера
Итак, если сервер корпорации XYZ, названный ServerName, содержит папку DeptShare, в которой размещена подпапка DataFolder с файлом данных, то имя компьютера следует изменить па ServerName, Затем в корневом каталоге диска С: следует создать папку DeptShare, а в ней подпапку DataFolder.
После создания структуры папок нужно войти в папку DeptShare, щелкнуть правой клавишей мыши на незанятом пространстве окна и выбрать пункт Свойства. Затем нужно выбрать вкладку Доступ и установить флажок Открыть общий доступ к этой папке (рис. 6.3).
Рис. 6.3. Установка общего доступа к папке
Теперь нужно открыть папку Сетевое окружение и щелкнуть на Добавить новый элемент в сетевое окружение. В первом окне мас тера следует щелкнуть на кнопке Далее, после чего мастер запросит, где создавать новый элемент. Нужно выбрать пункт Выберите другое сетевое размещение и щелкнуть на кнопке Далее, после чего в поле Сетевой адрес или адрес в Интернете ввести \\ServerName\Dept5hare. Затем нужно щелкнуть на кнопке Далее. Система Windows запросит имя для этогэ места в сетевом окружении; если имя в поле отсутствует, введите Dept Share н : ServerName. Щелкните на кнопке ОК, а затем на кнопке Готово,
И наконец, вернитесь в файл приложения Access и удалите все связанные таблицы. Теперь установите новые связи с таблицами, для чего укажите в диалоговом окне Связь на Мое сетевое окружение и перейдите к файлу с данными или наберите с той же цел ью\\s е г v е г n a m е\d е р t s h а г е. То гда Access создаст сс ылки с исполт • зованием соглашения об универсальном назначении имен (UNC). Если вы используете ярлык для общих документов в панке Мой компьютер. Access распознает, что обращение происходит с локального компьютера, и для создания связ 1 использует путь, привязанный к диску С:. Чтобы убедиться, что связь использует UNC, в окне немедленного выполнения команд введите следующую строку:
?Currentdb.TableDef5("<имя вашей таблицы»") .Connect
Вместо фрагмента <имя вашей таблицы» введите имя одной из связанных таблиц Ответ будет выглядеть примерно так:
;DATABASE=t\Servername\DeptShare\DataFolder\Prpject_dat.mdb
Учтите, что на самом деле вы увидите не Project_dat.mdb, а истинное имя вашет базы данных. Но вы можете увидеть и следующий ответ:
:DATABASE=C:\DeptShare\DataFolder\Ргоjесt_dat.mdb
Тогда нужно все проделать заново, следуя к файлу с данными в точности через существующую сеть, рабочую группу, имя компьютера и имя общей пайки. Как
только все будет сделано правильно, конечным пользователям не придется переделывать связи с таблицами, независимо от того, сопоставляли они или нет какую-нибудь букву диска с сетевым размещением таблиц.
Создание функции реагирования на простой
Обеспечение записи данных на диск и их доступности для других пользователей. Блокирование записей, не находящихся в процессе внесения изменений.
Вы можете поднять телефонную трубку, пли понять, что уже опаздываете па важную встречу, или отвлечься от работы по другому поводу. Такое случается с каждым из нас. К сожалению, при этом мы иногда забываем выйти из открытых на наших компьютерах файлов.
А ведь для многопользовательской базы данных это может вылиться в серьезную неприятность. В зависимости от используемого типа блокировки записей, если редактирование записи осталось незавершенным, другие пользователи могут лишиться возможности вносить в нее свои изменения. На рис. 6.4 показано неприятное сообщение, которое может получить пользователь при попытке внести изменения в ту запись, которая оставлена открытой другим пользователем.
Рис. 6.4. Результат того, что запись кем-то оставлена в режиме редактированияРис. 6.4. Результат того, что запись кем-то оставлена в режиме редактирования
Рис. 6.4. Результат того, что запись кем-то оставлена в режиме редактирования
Рис. 6.4. Результат того, что запись кем-то оставлена в режиме редактирования
Хотя в окне сообщения второму пользователю предоставляется право выбрать устраивающий его вариант, лучше, по возможности, все же не попадать в подобные ситуации. Действенной мерой для дайной ситуации может послужить закрытие формы, с которой нс работают в течение определенного периода времени. Иными словами, если первый пользователь не закончил внесение в запись каких- нибудь изменений за определенное время, форма просто-напросто закроется. С закрытием формы будет завершен и процесс редактирования записи, и все внесенные изменения будут автоматически сохранены. Другим решением может послужить сброс всех сделанных изменений, рассматриваемый в конце данного раздела.
О времени
У форм имеется встроенный таймер и событие с таким же названием. Если вам злаком Visual Basic, то вы знаете, как можно осуществить управление таймером формы. В Access это управление уже задействовано в форме, хотя вы об этом можете и не догадываться. Использование таймера заключается в установке в спис-
ке свойств значения для свойства Интервал таймера и в определении каких-нибудь действий в процедуре обработки события Таймер,
Для отображения списка свойств откройте форму в режиме Конструктора и нажмите клавишу F4. Убедитесь, что в окне отображаются свойства самой формы, а не одного из ее элементов управления или одной из ее областей. Если нужно, выберите для этого в раскрывающемся списке в верхней части окна свойств пункт Форма.
На рис. 6.5 показан перечень, установленный на демонстрацию свойств формы. Свойства Таймер и Интервал таймера доступны в двух вкладках; События и Все.
Рис. 6.5. Настройка обработки событий Таймер и Интервал таймера
Вывести на экран список свойств можно несколькими путями. Можно нажать клавишу F4 или нажать сочетание клавиш ALt+Enter. Также можно воспользоваться меню Вид ► Свойства или просто щелкнуть на кнопке Свойства панели инструментов Конструктора форм.
Свойство Интервал таймера воспринимает значения от 0 до 2 147 483 647 миллисекунд. Число 1000 эквивалентно одной секунде. Установка 10 000, показанная на рис. 6.5, эквивалентна 10 секундам. Кстати, самое большое из возможных значений — 2 147 483 647 — эквивалентно почти что 25 дням. Да, вы можете составить расписание работы Access на 25 дней вперед!
Свойство Таймер содержит ссылку на макрокоманду или программную процедуру. В данном примере используется программная процедура. Скоро мы рассмотрим эту процедуру, но сначала проанализируем конструкцию формы.
В хорошей форме
На рис. 6.6 показаны форма в режиме Конструктора, список полей и список свойств. Обратите внимание на свободное текстовое поле в заголовке формы. Перечень свойств настроен на свойства этого свободного поля, названного Гх1_Время, и его свойство Вывод на экран установлено в Нет, Иными словами, если форма будет в режиме просмотра, то поле 1х1_8ремя будет невидимым.
Рис. 6.6. Свободное текстовое попе, предназначенное для хранения метки времени
Поле txt_BpeMfl предназначено не для ввода данных, а для хранения показаний компьютерных часов на момент включения формы. Для реализации данного замысла в процедуру обработки события Включение, относящегося к форме, следует поместить небольшую программу.
Для получения доступа к процедуре обработки события надо войти в список свойств, щелкнуть на правом углу поля, относящегося к описанию события Вклю- чение, и в раскрывающемся меню выбрать пункт [Процедура обработки событий]. Затем нужно щелкнуть на находящейся рядом кнопке с многоточием (рис. 6.7). Вы попадете в программный модуль формы прямо в начало процедуры обработки события Включение (в программном варианте — Activate). Удобно, не правда ли?
Рис. 6.7. Переход к процедуре обработки события из списка свойств
А вот программный фрагмент, помещаемый в процедуру обработки события Включение:
Private Sub Form_Activate( ) Me.txt_0peMS = Now
End Sub
Процедура обработки события Таймер содержит функцию DateDiff, предназначенную для определения разницы в секундах между известным временем включения формы и текущим временем. Из списка свойств вызовите раскрывающееся меню события Таймер и выберите пункт [Процедура обработки событий]. Щелкните на кнопке с многоточием и введите следующий программный код: Private Sub Form_Timer( )
If DateDiff("s“. Me.1х1_Время, Now) > 5 Then
DoCrnd .Close
End If End Sub
Первый параметр функции DateDiff показывает, в каких интервалах времени проводить сравнение. В данном случае s означает, что проверка будет вестись в секундах. Функция проверяет, не превышает ли разница во времени от включения формы и до настоящего момента 5 секунд. Вам следует понять, что здесь нужно согласовать два значения: интервал таймера и количество секунд, являющееся критерием проверки.
В данном примере интервал настроен на возникновение события проверки каждые 10 секунд, а у нас устанавливается различие в 5 секунд, но эти цифры можно изменить. Например, для пользователя может быть удобнее, если значение интервала будет установлено в 30 секунд. Здесь нужно найти разумный компромисс Если пользователи довольно часто редактируют подобные записи, интервал можне уменьшить.
ПРИМЕЧАНИЕ
Функция Now() возвращает системное время. На каждом компьютере имеются действующие внутренние часы. При использовании событий времени нужна какая-тс точка отсчета. Функция Now() снимает показания времени, которые затем буду сравниваться с более поздними показаниями. Разница между первыми и вторымь показаниями и дает прешедший период времени. Кстати, компьютерные часы так же используются в программах, которые позволяют вводить «сегодняшнее число» Иногда часы нуждаются в корректировке времени.
Если мы оставим без изменения существующие установки, то форма закроется через 10 секунд после открытия, при первом возникновении события Таймер (про исходящем каждые 10 секунд после открытия формы). Разница во времени воз никновения этого события превышает искомые 5 секунд, поэтому будет запуще на команда DoCrnd.Close, закрывающая форму. Ио наша задача заключается в том, чтобы не просто закрыть форму, а сделать это только в случае бездействия цользо вателя.
Подход к решению этой задачи заключается в создании процедур обработки события Изменение для разнообразных полей ввода данных, размещенных в форме. В данном примере форма содержит поля для редактирования имени работника, названия отдела, специальности и т. д. В процедуру обработки события Изменение
187
каждого поля вводится одна программная строка, с помощью которой происходит обновление значения, хранящегося в поле txt_BpeMH, до текущего показания компьютерных часов. Иными словами, при каждом внесении изменений в текстовые поля значению поля Тх^Время (как вы помните, оно не выводится на экран) присваивается время, возвращаемое функцией Now:
Private Sub Отдел_СЬапее.( )
Me.txt_8peMH = Now
End Sub
Событие Изменение возникает всякий раз, когда в поле вводится или из него удаляется какой-нибудь символ. Поэтому, как только пользователь что-нибудь вводит в одно из текстовых полей, значение поля Ш_Время обновляется на текущее показание часов. Затем, при возникновении события Таймер, функция DateDi'ff возвращает разницу во времени, не превышающую 5 секунд, и форма остается открытой. Форма закрывается только в том случае, если время бездействия превысит 5 секунд.
На рис. 6.8 показано, как может выглядеть программный модуль формы после ввода текста процедур. При этом не важно, в какой последовательности будут расположены процедуры обработки событий.
Рис. 6.8, Программный код, управляющий бездействующей формой
Трюк в трюке
Существует множество способов реализации данного трюка. До сих пор все, что мы научились делать, — это перезапускать точку отсчета времени при вводе каж-
лого символа с клавиатуры. Также единственным действием после окончания периода ожидания ввода было закрытие формы. Теперь рассмотрим несколько других идей.
Перезапуск точки отсчета при перемещении мыши
Помимо перехвата событий, связанных с работой на клавиатуре и используемых для перезапуска точки отсчета времени, есть смысл сделать то же самое и в отношении работы с мышью. Некоторые люди привыкли работать с мышью, и перемещение мыши сохранит форму в открытом состоянии. Бывает, что и я перемещав мышь время от времени, не позволяя запуститься экранной заставке.
В формах Access можно использовать также и событие Перемещение указателя Вставить программный код в процедуру обработки этого события можно рассмотренным ранее способом. Преследуемая при этом цель остается прежней: обновить значение невидимого текстового поля, присвоив ему значение текущего вр ?- мен и, возвращаемое функцией Now.
Private Sub Title_MouseMove(Button As Integer. —
Shift As Integer, X As Single, Y As Single) Me.txt_BpeMfl = Now
End Sub
Если мышь будет перемешаться не реже чем раз в 10 секунд, форма закрываться не будет.
Предоставление пользователю возможности выбора интервала времени
У каждого пользователя свой стиль работы, не говоря уже о скорости ее выполнения. Так почему бы вместо жестко заданного интервала таймера не дать возможность самому пользователю решать, какая установка ему больше подходит? Реализуя этот замысел, вы должны создать средство выбора интервала в форме (или где-нибудь еще, где вводятся предпочтения пользователя). На рис. 6.9 показан способ модификации формы путем добавления к ней поля со списком, которое позволит пользователю осуществить выбор из списка возможных значений.
Рис. 6.9. Предоставление возможности выбора времени ожидания перед закрытием формы
Программный код также подвергается обновлению. Свойство Тип источника строк, относящееся к полю со списком, названному стЬ_€екунды, установлено в Список значений, а в свойстве Источник строк содержится список для выбора: 10,20,30,40, 50 и 60. При выборе пользователем значения из поля со списком процедура обработки события Изменение обновляет свойства формы Интервал таймера, присваивая ему значение, эквивалентное выбранному. К тому же в процедуре обработки события Включение, относящегося к форме, устанавливается исходное время ожидания активности — 20 секунд (рис. 6.10).
До выбора пользователем нового значения или при условии, что он вообще не станет его выбирать, установка исходного значения просто необходима. И наконец, теперь проверяемое количество прошедших секунд всегда на единицу меньше, чем интервал, выбираемый в поле со списком. Обновленный программный модуль формы показан на рис. 6.10.
Рис. 6.10. Установка значения свойства «Интервал таймера» а процедуре обработки события «Изменение», относящегося к полю со списком
Сохранение записей без закрытия формы
Тот факт, что запись отображается в форме, еще не означает, что она находится в стадии редактирования. Свойство Dirty, возникающее при внесении изменений, получает значение true при редактировании данных или имеет значение false, если данные не находятся в процессе редактирования. Для проверки состояния свойства Dirty вы можете внести изменения в процедуру обработки события Таймер. Если они имеет значение true, запись сохраняется и появляется сообщение, пока-
занное па рис. 6.11. Если оно имеет значение false и запись не редактируется, то ничего и не происходит. В любом случае, форма остается открытой.
Рис. 6.11. Сообщение о сохранении записи
В новом коде процедуры обработки события Таймер используется пара вложенных операторов If. Если в первом из них установлено, что истекшее время превышает предопределенный интервал, вступает в силу второй оператор И, проверяющий состояние свойства Dirty. Если его значение установлено в true, запиш сохраняется и выводится сообщение: Private Sub Form_Timer( )
If DateDiff("s", He.txt_BpeMs, Now) > He.стЬ_Секунды - 1 Then
If Me.Dirty Then
DoCmd.RunCommand acCmdSaveRecord
MsgBox "Изменения сохранены!"
End If
End If
End Sub
Если вы приступили к редактированию, но не завершили его, программа сделает это за вас. Если форма находится в режиме редактирования, никакого вреда при ■ чинено не будет.
Закрытие формы без сохранения записи
До сих пор рассматривались варианты трюка, основанные на сохранении записи, редактирование которой было прервано на полпути. Это вполне разумный подход, поскольку даже если человек ушел с работы, вы не можете доподлинно знать, стоит сохранять введенные им данные или нет. На всякий случай его работа со хранястся.
Разумеется, существуют аргументы и в пользу того, чтобы не сохранять отредактированные данные. Сбросить результаты редактирования легче всего при помощи команды Undo. Вот фрагмент кода, помещаемого в процедуру обработки собы - тия Таймер:
Private Sub Form_Timer ()
If DateDiff("s", Me. txt_BpeMS, Now) > 10 Then
If He.Dirty Then
DoCmd.RunCommand acCmdUndo
DoCmd.Close
End If
End If
End Sub
Суть в том, что если запись не находится в своем первоначальном состоянии (что подтверждается состоянием свойства Dirty), программа запускает команду Und) и закрывает форму без сохранения записи. Это всего лишь один из способов прекращения незавершенного редактирования.
Другим усовершенствованным вариантом может стать сохранение значений, содержащихся в форме, во временной таблице или даже в текстовом файле. При этом на экран можно выставить сообщение, предупреждающее пользователя, что все введенные им данные были сброшены, но он может найти результаты своей работы в том месте, где они были вами временно сохранены.
ТРЮК№ 58ТРЮК№ 58Получение уникальных имен пользователей
ТРЮК
№ 58
ТРЮК
№ 58
Даже при отключенной системе защиты Access, когда всем пользователям присваивается имя Admin, вы все же можете предоставить им уникальные имена.
Система защиты Access хорошо проявляет себя во многих ситуациях, связанных с многопользовательской средой, поскольку дает возможность назначать права пользователям или их группам. Но в некоторых ситуациях в ее использовании нет особой необходимости. Для небольшой группы пользователей, работающей с одними и теми же объектами, применение системы защиты не дает заметных преимуществ.
Отказ от использования системы защиты плох тем, что все пользователи получают имя Admin. Вы можете убедиться в этом, работая с незащищенной базой данных, если перейдете в окно ввода команд Immediate (нажав в режиме редактора VB комбинацию клавиш Ctrl+G) и введете следующую строку:
?CurrentUser
Свойство CurrentUser содержит имя, присвоенное пользователю при подключении к базе данных. При включенной системе защиты каждый пользователь имеет свое собственное имя. А при выключенной защите всем пользователям присваивается имя Admin.
Довольно простой способ использования собственных имен в незащищенной базе данных заключается в обязательном вводе пользователями своих имен в начале работы и использовании этих имен в течение всего сеанса работы. Применение такой технологии оправданно только в такой конфигурации, при которой каждый пользователь работает с локальной базой данных, содержащей формы, а таблицы с данными по-преяснему содержатся в прикладной базе данных на сервере. При запуске интерфейсной части клиент-серверного приложения у каждого пользователя запрашивается имя. Создать для этого специальное поле труда не представляет. Как только имя будет введено, произойдет выход из цикла и введенное значение передается свойству Дополнительные сведения (в программном коде — Тад), принадлежащему главной форме. Лучше, если главная форма будет открываться автоматически, при запуске пользователем базы данных. Следующий программный фрагмент следует поместить в процедуру обработки события Открытие, принадлежащего главной форме:
Private Sub Form_Open(Cancel As Integer)
Dim имя As String имя = ""
Do Until имя <> "*
имя = InputBox("Пожалуйста, введите Ваше имя", "Ввод имени")
Loop
Me.Tag = имя
End Sub
В течение всего рабочего сеанса имя пользователя будет всегда доступно посредством простой ссылки на свойство Дополнительные сведения (Tag) главной формы. Если форма названа бт_Гла8ная, то ссылка выглядит следующим образом: Formslfгт_Глааная.Tag
Вместо этого имени можно подставить реальное имя формы. Поскольку прил 1- жение построено таким образом, что каждый пользователь работает с собственной локальной версией главной формы, ссылка на свойство Дополнительные сведения всякий раз возвращает уникальное имя пользователя.
Вот, собственно, и все, что требовалось. Получая доступ к имени пользователя данным способом, вы сможете использовать это имя в отчетах, запросах, для заполнения текстовых полей — иными словами, везде, где это может понадобиться в вашем приложении..
Внешние программы и данные
Трюки № 59-71
Приложение Access — не одинокий островок в компьютерном мире, оно легко интегрируется со многими программами. Вполне очевидно, что у него имеются общие черты с другими офисными продуктами, поэтому в разработки на базе Access относительно легко включить файлы Word, Excel, Outlook и PowerPoint. Именно этому посвящены некоторые трюки данной главы. Например, «Импорт из Excel разрозненных диапазонов ячеек» (Трюк № 59) и «Использование функций Excel в базе данных Access» (Трюк № 6I) относятся к интеграции с Excel. В разделе «Управление документами Word из Access» (Трюк №67) раскрывается способ использования в программных разработках объектной модели Word, а в разделе «Использование Word для сравнения данных двух таблиц Access» (Трюк № 62) показан интересный способ независимого применения Word для тестирования данных.
В главе также рассматриваются трюки, направленные на использование данных в формате XML, интегрирование с MySQL и использование хранимых процедур SQL Server. Представлено множество технических приемов, открывающих реальную возможность поднять уровень ваших разработок.
ТРЮК№ 59ТРЮК№ 59Импорт из Excel разрозненных диапазонов ячеек
ТРЮК
№ 59
ТРЮК
№ 59
Стандартная процедура позволяет одновременно импортировать только один диапазон ячеек. Здесь представлено несколько способов обхода этого ограничения и повышения функциональности приложения.
При импортировании данных из книги Excel в базу данных Access вы можете выбрать для импорта рабочий лист или диапазон ячеек. Причем последний можно выбрать только при условии, что в рабочей книге имеются именованные диапазоны ячеек. На рис. 7.1 показано первое окно Мастера импорта электронной таблицы, вызванное командой Файл к Внешние данные ► Импорт и выбором файла Excel.
Рис, 7.1. Импорт данных из электронной таблицы Excel
Не важно, что именно импортируется — рабочий лист или диапазон ячеек, проблема заключается в том, что вы можете выбрать только лист или один из его элементов. Отдельные рабочие листы обычно импортируются потому, что на листе вмещается достаточный объем данных. Другое дело — диапазон ячеек. Одного диапазона может оказаться недостаточно, а запускать снова и снова мастер импорта электронной таблицы — слишком скучное занятие.
Использование макроса для многократного импортирования
Ограничение импорта одним диапазоном за один сеанс работы легко обойти путем применения макроса, использующего несколько макрокоманд Преобразовать- Электро ннуюТабл и цу. При каждом вызове этой команды импортируется один диапазон ячеек, но в одном макросе можно создать последовательность этих макрокоманд. Вы должны реши ть, куда именно будут импортированы диапазоны ячеек; либо каждый из них попадет в отдельную таблицу, либо все они попадут в одну таблицу.
Импортирование данных Excel в отдельные таблицы
На рис. 7.2 показан макрос, импортирующий пять диапазонов ячеек в пять таблиц. Каждый импортированный фрагмент попадает в отдельную таблицу Access. Имя каждой таблицы указывается в аргументе Имя таблицы каждой макрокоманды ПреобразоватьЭлектронну «Таблицу. Первые пять макрокоманд удаляют существующие таблицы перед импортированием данных. Данные Excel при импортировании помещаются в таблицы с именами ранее удаленных таблиц.
Тем самым устраняется потенциальная проблема: если таблицы не будут удалены заранее, то данные будут в них добавлены, поскольку таблицы уже существуют, и это, скорее всего, будет нежелательным результатом. Предварительное удаление таблиц гарантирует, что они будут созданы заново и заполнены только что импортированными данными.
Рис. 7.2. Макрос, создающий отдельные таблицы Access
Макрокоманды ПреобразоватьЭлектроннуюТаблицу настраиваются так, чтобы каждая из них обращалась к разным диапазонам ячеек Excel. При настройке используется аргумент Диапазон, показанный на рис. 7.2. В результате получается вполне приемлемый способ сбора данных из разных диапазонов ячеек Excel.
Импортирование данных Excel в одну таблицу
Если данные из разных диапазонов ячеек Excel нужно собрать в одну таблицу Access, аргумент Имя таблицы для каждой макрокоманды ПреобразоватьЭлектрон- нуюТаблицу должен указывать на одну и туже таблицу. Таблица, принимающая данные, предварительно должна быть очищена. В данном макросе это достигается включением макрокоманды ЗапускЗапроса501, которая выполняет простую инструкцию:
Delete * From инвентаризация_общая
Предварительно нужно отключить сообщения, чтобы процесс нс прерывался на запрос с требованием подтверждения процесса.
После очищения таблицы инвентаризация_общая в результате выполнения инструкции Delete макрокоманды ПреобразоватьЭлеитроннуюТаблицу заполняют эту таблицу данными, которые добавляются в нее последовательно. На рис. 7.3 показана структура данного макроса.
Импортирование разрозненных данных из электронной таблицы Excel без использования диапазона ячеек
Макрос удобен в использовании, но ограничен в возможностях. Мы видели, что импорт диапазона ячеек особого труда не представляет. Вы даже можете импортировать фрагменты рабочего листа, используя адресацию. Иными словами, вы
Рис. 7.3. Макрос, заполняющий одну и ту же таблицу Access
Рис. 7.4. Данные Excel, подлежащие импортированию
можете задать импортируемую часть вводом координат диапазона: Al: 015. Вог, собственно, и все. Макрос ни на что более сложное нс способен. Дальше уже не обойтись без VBA.
На рис. ТА показан рабочий лист Excel, в котором содержатся данные о количестве изделий, разбитые по годам и кварталам.
Чтобы импортировать, скажем, только данные, относящиеся ко второму кварталу каждого года, нужен процесс, проверяющий каждую строку на наличие в столбце Квартал записи К2. Предназначенная для этого процедура выглядит следующим образом:
Sub get_excel( )
Dim проверка^квартала As Integer
Dim conn As ADODB.Connection
Set conn = CurrentProject.Connection
Dim xl As Object
Set xl = GetObject("С:ХИнвентаризацияХИнвентаризация . xls") ‘удаление существующих записей conn.Execute "Delete * From инвентаризация_общая" With xl
With .Worksheets("Данные”)
For проверка_квартапа =2 To 25 'известное количество строк листа If .Cells(проверка^квартала, 2) = "К2" Then
ssql = "Insert Into инвентаризация_общая Values("
5sql =ssql&.Cells(проверка_квартала,1)&", "
ssql =ssql&"1" & .Cells(проверка_квартала,2) &"
ssql =ssql&.Cells(проверка_квартала,3)&", "
ssql =ssql&.Cells(проверка_квартапа,4)&", "
ssql =ssql&.Cells(проверка_квартала,5)&")"
conn.Execute ssql
End If
Next проверка_квартапа
End With
End With
xl.Close
Set xl = Nothing MsgBox "Готово!" End Sub
Программа автоматически создает объект Excel и устанавливает фокус объекта на рабочий лист. Затем осуществляется перебор строк рабочего листа. Содержимое второго столбца проверяется на наличие К2. Если столбец содержит такое значение, пять столбцов текущей строки вставляются в таблицу Access инвента- ризация^общая.
Разумеется, для проверки других условий в этот код можно вносить изменения. Можно также не задавать жестко проверку на К2. На рис. 7.5 показана таблица Access, заполненная записями, относящимися только ко второму кварталу.
Небольшая по объему программа способна на многое. Использование функции GetObject упрощает создание ссылки на рабочую книгу Excel. После того как программа получит доступ к рабочей книге, вы получите массу возможностей для манипулирования данными, даже если нс слишком хорошо знаете программную модель Excel,
Рис. 7.5. Заполнение таблицы фрагментами рабочего листа ExcelРис. 7.5. Заполнение таблицы фрагментами рабочего листа Excel
Рис. 7.5. Заполнение таблицы фрагментами рабочего листа Excel
Рис. 7.5. Заполнение таблицы фрагментами рабочего листа Excel
ТРЮК№ 60ТРЮК№ 60Использование Excel
ТРЮК
№ 60
ТРЮК
№ 60
для переориентации данных Access
Использование функции Excel, осуществляющей специальную вставку с транспонирэ- ванием для поворота данных на 90°,
Рассмотрим простой способ, позволяющий поменять местами столбцы со строками (пли строки со столбцами, в зависимости от того, как на это посмотреть). На рис. 7.G показана таблица, заполненная данными, состоящая из 8 полги и 100 строк.
Дмшъю : таблица""
Фамилий.
Имя •
Опгпва ■
Профессия
■ Город ■
Адрес
Количеств оЗ=
Потр аченнаяС уимй $
►
Климов
Кирилл
Кондратьев и-'
Продавец
Самара
Ташкентская 23-41
1
81 № й
Ярцев
Евгений
Сергеевич
Финансовый
Смоленск
Фрунзе 12-9
7
i34OTi^i]
Боярский
Петров
Владимир
Алексей
Семенович
Александров!
Консультант
Менеджер
Кемерово
Александров
Волошина 56-34
Энтузиастов 2-35
4
2
78,00^
94,00р |
Сухов
Виталий
Сергеевич
Бухгалтер
Иваново
Громобоя 22-18
12
63 № |
Матвеев
Николай
Петрович
Коммерчески
Саров
Юности 11-7
9
245 ОТ к
Андреев Сергей Курмазов Александр Соловьев i Виктор
Иванович
Михайлович
Семенович
Рекламный а
Региональны
Веб-разработ
Екатеринбург
Кострома
Улан-Удэ
Техническая 31-1Е
Мира 12-67
Жукова 10-5
12
2
2
2ЮОТ Я
421 Д)р 1
2ЮОТ ]
Тарасов
Андрей
Васильевич
Предприним
Москва
2-й Сетуньский пр
12
329 ОТ
Быков
Анатолий
Алексеевич
Системный а. Чита
Автогенная 87-45
8
190,00г У
Славим
Леонид
Андреевич
Водитель
Саратов
Красноармейская
8
411 ОТ- |
Кириллов
Алексей
Александров
Программист Красноярск
Прибрежная 23-41
12
42ОТ= |
Дорохов
Владимир
Сергеевич
Бухгалтер
Новосибирск
Индустриальная 1
6
359 ОТ 1
Казаков
Игорь
Викторович
Адвокаг
Москва
Алтуфьевское шот
9
161 ОТ
Евсеев
Андрей
Николаевич
Лредприним, Кемерово
Шахтерская 34-11^
13
92.ОТ )
Капустин
Владимир
Сергеевич
Врач
Пермь
Парковая 34-81
1
>67»У
аник ПО
АМ^.^_
Рис. 7.6. Таблица с данными в 8 столбцах
Вполне возможно, что пользователю понадобится просматривать данные с вертикальным расположением записей о клиентах, что для пользователей Excel не является чем-то необычным. В данном трюке показан способ, позволяющий сделать именно это: поместить данные в электронную таблицу Excel и повернуть их.
Сначала нужно выбрать данные в таблице Access, а затем занести их в открытую рабочую книгу Excel. Войдите в пустой рабочий лист и вставьте в него данные. Обратите внимание, что я специально вставил данные в строку 12. Скоро вы поймете, зачем я это сделал. На рис. 7.7 показано размещение данных в Excel.
■;^.:&^:<[jp^ ^д Bcrg^ Форяет СбР»к банные ^но Справка■;^.:&^:<[jp^ ^д Bcrg^ Форяет СбР»к банные ^но Справка: ^^г^■ бйМД^ГН ЗЫ1^С- w в X: ^^г^■ бйМД^ГН ЗЫ1^С- w в X
■;^.:&^:<[jp^ ^д Bcrg^ Форяет СбР»к банные ^но Справка
■;^.:&^:<[jp^ ^д Bcrg^ Форяет СбР»к банные ^но Справка
: ^^г^
■ бйМД^ГН ЗЫ1^С- w в X
: ^^г^
■ бйМД^ГН ЗЫ1^С- w в X
После вставки данные остаются выделенными, и это весьма кстати. Пускай так все и останется, но если выделение пропадет, нужно будет его восстановить. .Затем нужно будет скопировать данные, воспользовавшись либо командой Правка ► Копировать, либо комбинацией клавиш Ctrl+C. Копирование данных — необходимый шаг. Может создаться впечатление, что данные уже находятся в буфере обмена. Хотя э го и так, но они находятся там не в том виде, который нам нужен, поэтому нужно скопировать их еще раз, теперь уже из Excel.
йпвдиг* мшекк
3
вставить
О^ОргтуГхЫ
^Кондратьвви];.
13.
9L00p
^Климов Кирилл
О оропус^тъ пустые ячейки
Сергеевич
1Э4,00р
боярский Владимир
78,00?
A^n/'n^/rxfi/
Рис. 7.8. Диалоговое окно Специальная вставка
О формату
<}:Гф№еуаНМЯ
Х4
Ярцев Евгений
:Полошим
Семенович Консультант :Кемерово.а 56-34
Александ Эмтузиас
■'^ $*^ Qo^e &нл Эставко Формат Сервис Данные Qmo Справка
6:
ft £жяН - ttnwrtH
спруты .
■ Ову-гекль :
О j^nooHR наЗнечежя :06еЗ,раи5И ■ 'v;
О шири* ётолбиве
О феону gw н форматы чисел О тначвмид и форматы чисел
0у®«*нть .. ■ О ь^-дегень
$й№Т QPW3 Вид вставка Формат сервис Д®»** Окно ^правке
№бД!гге e-anpo-v* _ fl X
^iiMa^ai
S Фамилия
, Матвее а
'Андрее ^
Николай
Сергей
Петрович
Иванович
Саров.
24№1р?
9f№
250<ЮргШМ
Ташкенте
м ч к ><\Лист1/Лист2 /ГИ:тЗ /
Сумм-11669
: Алоксан,:"
j Михаиле
: Ал екс анд i Сергеев и Семенович ipoewHw ...
■ Финансовый
Пр"Д»бвд директор _ _
: Региона
: ^предста# Рекламный- агент '^мвль; ■;
Екатеринбург . ^ J Костром
Менедже Бухгалте
^^ХА*'!?^!,—. - . JP.и—..:
Алексенд
:Кемероео рое'Иваново
fjMupa.U
Юности 11-7 ■ . 1 Техническая :ЗМ 8 Ш'
^^^..„......ЙР.1!^® .
Ташкентека^Волошина Энтузиас Громобоя
я 23-41 |фрунзе 12-9156-34|М2-|| ^22-18 ,:
Боярский ■ ; Петров Сухов
Владимир 'Алексей ;Виталий
Рис. 7.9. Транспонированные данные
10
(Кйр><^ц1 ' т^вг^Й ..Кфйдратьее! .:
ич: Сергеевич
йСамара-Смоленск
Коммерческий кет
После того как данные будут скопированы в формате Excel, щелкните на ячейке А1. При этом выделение данных будет снято, но теперь именно это нам и нужно, поскольку для следующего тага выделение должно быть снято, а отдельная ячейка активирована.
Теперь нужно открыть диалоговое окно Специальная вставка (рис. 7.8), воспользовавшись командой Правка ► Специальная вставка,
На рис. 7.8 следует обратить внимание на несколько моментов. Как уже упоминалось, выделение с данных снято, а ячейка А1 является активной. Следующим шагом будет вставка данных, но важным предварительным условием будет установка флажка транспонировать, расположенного в нижней части окна Специальная вставка. Для завершения процесса щелкните на кнопке ОК. На рис, 7.9 показано, как данные разместятся в верхней части рабочего листа. Ранее первая вставка была сделана начиная с 12-й строки именно для того, чтобы осталось достаточно места для второй вставки. Заранее было известно, что данные размешались в 8 полях, а теперь они заняли 8 строк рабочего листа. Хотя на рис. 7.9 этого не видно, но данные простираются на 100 столбцов вправо.
Теперь данные из первой вставки уже не нужны и их можно удалить. Небольшая корректировка формата придаст данным более привлекательный вид и подготовит их к дальнейшему использованию. На рис. 7.10 показано, как они будут выглядеть после изменения внешнего вида и проведения над ними небольшой аналитической операции.
:;£$ $айд -QMBK6 ^ : йстднка Формат Свреис Данные Окно правке:;£$ $айд -QMBK6 ^ : йстднка Формат Свреис Данные Окно правкеРис. 7.10. Работа с данными, повернутыми на 90°Рис. 7.10. Работа с данными, повернутыми на 90°
:;£$ $айд -QMBK6 ^ : йстднка Формат Свреис Данные Окно правке
:;£$ $айд -QMBK6 ^ : йстднка Формат Свреис Данные Окно правке
Рис. 7.10. Работа с данными, повернутыми на 90°
Рис. 7.10. Работа с данными, повернутыми на 90°
ТРЮК№ 61ТРЮК№ 61Использование функций Excel в базе данных Access
ТРЮК
№ 61
ТРЮК
№ 61
Применение 8 приложении Access мощных функций, принадлежащих Excel.
В Excel имеется множество мощных встроенных функций для проведения финансового п статистического анализа. Если вам захочется провести такой же анализ и в Access, вы можете сделать это тремя способами: купить готовое программное средство, написать собственную аналитическую программу или воспользоваться автоматическим вызовом функции Excel из Access. В данном трюке показан способ автоматического извлечения из Excel и использования функций электронных таблиц, позволяющий, кроме всего прочего, сэкономить ваше время и деньга. В данном трюке Access работает совместно с Excel, поэтому последний обязател i- ио должен быть ус тановлен на том компьютере, на котором запущена база данных. Такое соседство этих двух офисных компонентов в корпоративной среде предположить совсем не трудно.
Простая функция Excel
Встроенная в Excel функция БС (будущая стоимость), или FV, при вызове ее из программы вычисляет будущую стоимость инвестиции на основе периодических постоянных (равных по величине сумм) платежей и постоянной процентной ста з- ки. Следующая функция VBA воспринимает те же параметры, что и Excel-функция БС, и возвращает такой же результат, что и функция будущей стоимости, примененная непосредственно в Excel:
Public Function БС(НЫ_ставка As Double, int^Knep As Integer, _
□ Ы^плт As Double, dbl_nc As Double. _
1пТ_тип As Integer) As Double
Dim xl As Object
Set xl = CreateObject("Excel.Application")
БС = xl.WorksheetFunction.FV(ЦЫ_ставка, int_Knep.Dbl_nnr, — dbl nc, Int_Twn)
Set xl = Nothing
End Function
Свойство WorksheetFunction. принадлежащее объекту Excel.Application, служит ключом к вызову функций Excel из программы, размещенной не только в Access, г о даже и в среде V В А, принадлежащей самой Excel. Благодаря этому свойству практически любая функция электронной таблицы Excel становится доступной д; я встраивания в ваши разработки.
На рис. 7.11 показана форма, в которую пользователь вводит данные, азатем, шел 1ком на кнопке Вычислить будущую стоимость, вызывает функцию Б С.
После щелчка па кнопке Вычислить будущую стоимость выполняется следующая процедура:
Private Sub cmd_BC_Q1ck( )
Dim dbl_BC As Double
Dbl_BC = BC(tXt_ставка / 12, txt_Knep, txt_nnT, txt_nc, Ггт_тип)
MsgBox “BC = " & dbl_BC, vblnformation. "Будущая стоимость"
End Sub
Рис. 7.11. Вызов из формы функции БС
Из этой процедуры, обрабатывающей событие щелчка, вызывается функция Б С и выводится окно сообщения, изображенное на рис. 7.12. Вы можете внес ти изменения в программу, чтобы записать результат в таблицу или вывести его непосредственно в самой форме.
Рис. 7.12. Окно сообщения, выводимое процедурой cmdBCCIick
Функция Excel с параметром, содержащим массив
В примере вычисления будущей суммы электронной таблице Excel требовалось передать пять параметров, а результат мы получали благодаря магии автоматического вызова. Но что будет, если одним из этих параметров должен стать массив, так широко используемый в Excel?
Если функция Excel требует массива или таблицы массивов, вы можете передать ей простой или многомерный массив, созданный в Access, и получить обратно необходимый результат. Давайте рассмотрим программу, используемую для вызова функции рабочего листа Excel Персентиль. Эта функция при вызове из программы должна быть названа Percentile и в результате своей работы вернуть ^-ю персентиль значений, содержащихся в переданном ей массиве:
Public Function Персентипь(strTbl As String,strFld As String, k As Double) _ As Double
Dim rst As ADODB.Recordset
Dim dblData( ) As Double
Dim xl As Object
Dim x As Integer
Set xl = CreateObject ("Excel.Application”)
Set rst = New ADODB.Recordset
rst.Open "Select * from " & strTbl, Currentproject.Connection, _ adOpenStatic
ReDim dblData(rst.RecordCount - 1)
For X = 0 To (rst.RecordCount - 1)продолжение ^
dblData(x) = rst(strFld) rst.MoveNext
Next x
Персентиль = xl.WorksheetFunction.Percent!Ie(dblData, k)
rst,Close
Set rst = Nothing
Set xl = Nothing
End Function
Функции передаётся имя таблицы и имя поля, значения из которого будут считываться в массив Access, Этот массив наряду со значением персентили — к, поиск которой будет вестись для значений массива, передается Excel-функции Percentile, Ничего плохого не произойдет и в том случае, если функции будет переда! ю не имя таблицы, а имя запроса, если это будет необходимо сделать по сценарию работы вашего приложения.
На рис. 7.13 показана форма, имеющая подчиненную форму, связанную с таблицей tbl-Данные, в которой выводятся значения поля ПримерДанных в режиме таблицы.
Рис. 7.13. Вызов функции Персентиль из формы
В данном примере при щелчке на кнопке Вычислить персентиль вычисляется 30-я персентиль для списка значений 1, 2, 3, 4, 5, 14, 13, 13, 16, 15, 16, 156. Го щелчку на кнопке выполняется следующая программа: Private Sub стр_Персентиль_С11ск< )
Dim йЬ1_Персентиль As Double
0Ь1_Персентиль = Персентиль (" 1Ы_Даннь|е". "ПримерДанных", txtK)
HsgBox "Персентиль = " & ЦЫ_Персентиль, vblnformation, "Персентиль"
End Sub
В результате работы программы выводится окно сообщения, изображенное на рис. 7.14.
То, что ранее уже рассматривалось по отношению к функции БС, справедливо и дт я этой функции — вы можете вернуть полученное значение в таблицу или отобразить его в форме. Функции БС и Персентиль можно также вызывать из запроса или использовать В отчете.
Рис. 7.14. Окно сообщения, выводимое процедурой стб_Персентиль_СИск
Использование других функций электронной таблицы Excel
Используя автоматику метода WorksheetFu action, принадлежащего Excel-объекту, вы сможете вызвать более 100 функций. Имейте в виду, что некоторые из этих функций дублируют встроенные функции Access: например, Excel-функция ISNUMBER аналогична Access-функции I5NUM8ER, тоже самое касается функций ISERR и ISNA, поэтому, если вы не намерены воспользоваться какими-нибудь расширенными возможностями автоматического подключения к электронной таблице, использование таких функций не имеет смысла.
Вы также должны взвешенно подходить к автоматическому использованию внешних функций. В некоторых случаях использование оптимизированной собственной функции может оказаться более эффективным решением. Тем не менее применение готовых функций, таких как Персентиль, в условиях, когда на создание собственной функции не хватает времени, позволяет добиться существенной экономии времени.
ТРЮК№ 62ТРЮК№ 62Использование Word для сравнения данных двух таблиц Access
ТРЮК
№ 62
ТРЮК
№ 62
Простой способ поиска различий, использующий утилиту Word Сравнение и объединение исправлений.
Время от времени возникает ситуация, требующая провести сравнение данных двух таблиц Access. Обычно это сравнение касается одной и той же таблицы, полученной из разных копий базы данных. Данные этих таблиц могут различаться. Например, в одной из них они могли быть изменены, и теперь вам нужно найти несоответствия.
Сделать это можно несколькими способами. Можно воспользоваться запросами, но если полей много, конструкция запроса может стать слишком сложной. Можно также составить программу считывания данных из обеих таблиц и поиска несоответствий. Это действенный, но требующий долгой отладки способ.
Есть более интересный способ: в Word имеется встроенная функция, проводящая сравнение двух документов и высвечивающая различия.
Сначала нужно экспортировать таблицы Access в виде текстовых файлов. Затем они будут использованы для проведения сравнения. На рис. 7.15 показаны две таблицы, сохраненные в виде текстовых файлов. Нетрудно заметить, что они выглядят одинаково.
;:У Ш$№ «^ £< I ^
<1£Йк Qp*ti М Вету» Срыс Qjsho Справка
j ctswl главка Фо^агг Вад Словца
Рис. 7.15. Две таблицы, сохраненные в ваде текстовых файлов
^ ?Ъ’ г< чч «ты ?h^№
2001;Климов;Кирилл,Кондратьевич.Продавец;Самара; Ташкентская 23-41; 1,91,00р.
2002,Ярцев, Евгений; Сергеевич; Финансовый директор;Смоленск;Фрунзе 12-9; 7; 134,ООр
Р2003;Боярский;Владимир; Семенович;Консультант;Кемерово;Волошина 56-34;4; 79,00р.
;; 2004, Петров; Алексей; Александрович; Менеджер;Александров;Энтузиастов 2-35; 2; 94,ООр, i■ 2005;Сухов;Виталий;Сергеевич; Бухгалтер;Иваново;Громобоя 22-18; 12;63,ООр.
2006;Матвеев;Николай,Петрович;Коммерческий директор; Саров;Юности 11-7;9; 245,ООр,
•; 2007; Андреев; Сергей; Иванович; Рекламный агент;Екатеринбург; Техническая 31-18; 12;250,00р.
к2000;Курмазов; Александр; Михайлович;Региональный представитель;Кострома; Мира 12-6 7; 2;421,ООр.
Li 2009; Соловьев; Виктор, Семенович; Веб-разработчик; Улан-Уд э; Жукова 10-5; 2; 283,00р.
2010;Тарасов; Андрей;Васильевич;Предприниматель;Москва; 2-й Сетуньский пр. 12-35; 12;329,00р.
п 2011; Быков; Анатолий; Алексеевич;Системный администратор;Чита;Автогенная 87-4 5;8; 190,00р.
|2001;Климов;Кирилл; Кондратьевич; Продавец; Самара, ташкентская 23-41; 1; 91,ООр.
2002;Ярцев;Евгений;Сергеевич;Финансовый директор; Смоленск;Фрунзе 12-9; 7; 134,00р.
2003; Боярский; Владимир; Семенович; Консультант; Кемерова; Волошина 56-34; 4; 78,ООр, 2004; Петров; Алексей; Александрович; Менеджер; Александров; Энтузиастов 2-35;2:94,00р.
.2005;Сухов;Виталий;Сергеевич;Бухгалтер;Иваново;Громобоя 22-19; 12;63,00р.
i2006;Матвеев;Николай; Петрович;Коммерческий директор;Саров;Юности 11-7;9; 245,ООр, i 2007; Андреев; Сергей; Иванович; Рекламный агент;Екатеринбург;Техническая 31-18; 12; 250,00р.
:2008;Курмаэов; Александр; Михайлович;Региональный представитель;Кострома;Мира 12-67;2;421,00р.
i 2009; Соловьев; Виктор; Семенович; Веб-разработчик; Улан-Удэ; Жукова 10-5; 2; 283,00р.
>2010; Тарасов; Андрей Васильевич; Предприниматель; Моска а; 2-й Сетуньский пр. 12-35; 12; 329,00р.
|2011;Быков; Анатолий,Алексеевич;Системный администратор;Чита;Автогенная 87-45;8; 190,00р.
i l^/^gff^^^
О Документы для сравнения
Рабо'** стоп
ООр.
Иия файле
21 а
Мое сетевое окружение J Тип файлов? : Текстовые файлы
1:1: '■ф1_Кл*ИТЫ
. ^^1Ы_Клиенты Мои последние : = § ttiJC гменты2 дежументы •
^: :: 1. К Л № » Г г: У.^< 1 ■ -3Bf 1 W3 4 ?
t ^айе оравке §,КД вставка Формат сервис Ia6m*i» йена Справка
00р. Р-
Si
1
документы
: Мэн к«<1ыотер
12-
1 а 3
. v | Q верные строки ^ч Й К^и Фх^т .
2011; Быков;Анатолий;Алексеевич;Сметенный администратор;Чите 45;8;190,00р.
2012; Славин;Леонид;Андреевич;Водитель;Саратов;Красноармейск^
Объединить
Ц Объединить в текущий документОбъединить в уовый документ
2013; Кириллов;Алексей;Александрович;Программист;Красноярск; Прибрежная 23- 41;12;42,00р.
ЯЛ 1 4 ; Ллплхпв:. Бла лимит: С мп гя г в и hi.Rvx^r п.т.еп:. Новлеиби пек. :.Ич пугттгя.пт-няа . Д.?Я -
1 ^ ^ : Л:?ЬЙ5Зц;:1:1 ,•:• •: .■.■;•;:■::;::..::;.:.:)::«^.- г?.. г.?;-м1;::.:-..-■• V^w'-svix^MiS’il.lv^:-.:^<«и^^<-:-йШт^А? ■:^x<v:ii^i:- ■ №": ::-:1:l:l,^ :
Стр. 1 Разд I
1/1 На 1,9см Ст 1 Kott 1. ..<- s
■.-: русский (Ро
Трюк № 62. Использование Word для сравнения данных двух таблиц Access 207
Откройте в Word один из текстовых файлов. Затем воспользуйтесь меню Сервис > Сравнить и объединить исправления и найдите второй текстовый файл. На рис. 7.16 показаны возможности выбора способов сравнения и объединения документов. Я всегда выбираю пункт Объединить в новый документ, позволяющий оставить без изменения исходные файлы.
Как только будет создан новый документ, вы сразу же столкнетесь с проблемой. Автоматическая функция проверки орфографии и грамматики повсюду расставит свои пометки, поскольку экспортированные из Access данные не содержат разделительных пробелов. Для самих данных они значения не имеют, но для Word такая структура окажется неожиданной. Поэтому следующим шагом нужно отключить грамматическую и орфографическую проверку в диалоговом окне Параметры (рис. 7.17). Кстати, открытый первым текстовый файл не имел пометок, свидетельствующих об ошибках, поскольку он был всего лишь текстовым файлом. Созданный заново документ, в отличие от этого, является полноценным документом Word.
:$) t Н 5< ?(^ я f^ M^irito^"War #:$) t Н 5< ?(^ я f^ M^irito^"War #&» Л^ О&» Л^ ООрфог рафииОрфог рафии. С^эвэрн... С^эвэрн..же; Мире 12-же; Мире 12-Средства прсе^^зСредства прсе^^з! древеса ^]! древеса ^]» а ^3 69-у» а ^3 69-урусский (Рорусский (Ро00р.7; 9;245,00р.1Я 31*00р.7; 9;245,00р.1Я 31*|2;283,00р. ф пр. 12-|2;283,00р. ф пр. 12-91,00р.9;7;134,00р.1;4;78,00р.91,00р.9;7;134,00р.1;4;78,00р.Г pew 3 ТНК J +НЫ—г,О автоматически проверять грамматику:<":' 5^:ч<-14 : Г:гх! ЛЦ -Ъг!1^ -УН;@ т вк^с проверять орфографиюО статистика удобоутаемостиГ pew 3 ТНК J +НЫ—г,О автоматически проверять грамматику:<":' 5^:ч<-14 : Г:гх! ЛЦ -Ъг!1^ -УН;@ т вк^с проверять орфографиюО статистика удобоутаемостифайл Правка Ёпд ЭстаУ» «Кчтавт у. CBWfr..: Люблина ■ Окно Справкафайл Правка Ёпд ЭстаУ» «Кчтавт у. CBWfr..: Люблина ■ Окно Справка,2001; Клинов i 2002;Ярцев;2003;Воярсв| 2004; Петров :: 35; 2;94,00р| 2005; Сухов; :: 2006;Матвее ' :2007;Андрее 18; 12; 250, СТ:2 0 0 Й ; Кури a at; 5 67;2;421, ОоУ 2009; Соловь<: 2010; Тарасов ' 35; 12; 32 9,0^1 2011; Бык oe^j 45; 8; 190,00^.. 2012;Славив 2013; Кирилл;! . 41; 12; 42,00^,2001; Клинов i 2002;Ярцев;2003;Воярсв| 2004; Петров :: 35; 2;94,00р| 2005; Сухов; :: 2006;Матвее ' :2007;Андрее 18; 12; 250, СТ:2 0 0 Й ; Кури a at; 5 67;2;421, ОоУ 2009; Соловь<: 2010; Тарасов ' 35; 12; 32 9,0^1 2011; Бык oe^j 45; 8; 190,00^.. 2012;Славив 2013; Кирилл;! . 41; 12; 42,00^Стр, • ■ Разд I 1/1 На 1,9см Ст I Кол I :.Стр, • ■ Разд I 1/1 На 1,9см Ст I Кол I :.О Автоматически проверять орфографию^ «?. ?&te«te.Tf% ьМй-з ■: twi^i»!КЭ бсвгдв предлагать замену□ предлагать только из основного словаря0 пропускать с нова ю прописных букв(Й пропускать снова с ццфраммй пропускать адреса Интернета и имена файловО Автоматически проверять орфографию^ «?. ?&te«te.Tf% ьМй-з ■: twi^i»!КЭ бсвгдв предлагать замену□ предлагать только из основного словаря0 пропускать с нова ю прописных букв(Й пропускать снова с ццфраммй пропускать адреса Интернета и имена файлов„ ^1--; 8 ; 411,0 0 р ♦J LS2£2_J^ 23-„ ^1--; 8 ; 411,0 0 р ♦J LS2£2_J^ 23-Набор правил::Для деловой перегмскнНабор правил::Для деловой перегмскнРис. 7.17. Выключение грамматической и орфографической проверки WordРис. 7.17. Выключение грамматической и орфографической проверки Word
:$) t Н 5< ?(^ я f^ M^irito^"War #
:$) t Н 5< ?(^ я f^ M^irito^"War #
&» Л^ О
&» Л^ О
Орфог рафии
Орфог рафии
. С^эвэрн..
. С^эвэрн..
же; Мире 12-
же; Мире 12-
Средства прсе^^з
Средства прсе^^з
! древеса ^]
! древеса ^]
» а ^3 69-у
» а ^3 69-у
русский (Ро
русский (Ро
00р.
7; 9;245,00р.
1Я 31*
00р.
7; 9;245,00р.
1Я 31*
|2;283,00р. ф пр. 12-
|2;283,00р. ф пр. 12-
91,00р.
9;7;134,00р.
1;4;78,00р.
91,00р.
9;7;134,00р.
1;4;78,00р.
Г pew 3 ТНК J +НЫ—г,
О автоматически проверять грамматику
:<":' 5^:ч<-14 : Г:гх! ЛЦ -Ъг!1^ -УН;
@ т вк^с проверять орфографию
О статистика удобоутаемости
Г pew 3 ТНК J +НЫ—г,
О автоматически проверять грамматику
:<":' 5^:ч<-14 : Г:гх! ЛЦ -Ъг!1^ -УН;
@ т вк^с проверять орфографию
О статистика удобоутаемости
файл Правка Ёпд ЭстаУ» «Кчтавт у. CBWfr..: Люблина ■ Окно Справка
файл Правка Ёпд ЭстаУ» «Кчтавт у. CBWfr..: Люблина ■ Окно Справка
,2001; Клинов i 2002;Ярцев;
2003;Воярсв| 2004; Петров :: 35; 2;94,00р| 2005; Сухов; :: 2006;Матвее ' :
2007;Андрее 18; 12; 250, СТ:
2 0 0 Й ; Кури a at; 5 67;2;421, ОоУ 2009; Соловь<: 2010; Тарасов ' 35; 12; 32 9,0^1 2011; Бык oe^j 45; 8; 190,00^.. 2012;Славив 2013; Кирилл;! . 41; 12; 42,00^
,2001; Клинов i 2002;Ярцев;
2003;Воярсв| 2004; Петров :: 35; 2;94,00р| 2005; Сухов; :: 2006;Матвее ' :
2007;Андрее 18; 12; 250, СТ:
2 0 0 Й ; Кури a at; 5 67;2;421, ОоУ 2009; Соловь<: 2010; Тарасов ' 35; 12; 32 9,0^1 2011; Бык oe^j 45; 8; 190,00^.. 2012;Славив 2013; Кирилл;! . 41; 12; 42,00^
Стр, • ■ Разд I 1/1 На 1,9см Ст I Кол I :.
Стр, • ■ Разд I 1/1 На 1,9см Ст I Кол I :.
О Автоматически проверять орфографию
^ «?. ?&te«te.Tf% ьМй-з ■: twi^i»!К
Э бсвгдв предлагать замену
□ предлагать только из основного словаря
0 пропускать с нова ю прописных букв
(Й пропускать снова с ццфрамм
й пропускать адреса Интернета и имена файлов
О Автоматически проверять орфографию
^ «?. ?&te«te.Tf% ьМй-з ■: twi^i»!К
Э бсвгдв предлагать замену
□ предлагать только из основного словаря
0 пропускать с нова ю прописных букв
(Й пропускать снова с ццфрамм
й пропускать адреса Интернета и имена файлов
„ ^1--; 8 ; 411,0 0 р ♦
J LS2£2_J^ 23-
„ ^1--; 8 ; 411,0 0 р ♦
J LS2£2_J^ 23-
Набор правил:
:Для деловой перегмскн
Набор правил:
:Для деловой перегмскн
Рис. 7.17. Выключение грамматической и орфографической проверки Word
Рис. 7.17. Выключение грамматической и орфографической проверки Word
Как только вы увидите весь документ целиком, вы сможете заметить те места, где данные имели различия, поскольку для них будет использовано форматирование с перечеркиванием символов (рис, 7.18).
Теперь будет нетрудно просмотреть все данные, быстро найти различия и принять решение о том, как с ними поступить.
®МвЯЩ§®МвЯЩ§$»йр Орэвка ::Вид- Вставка Формат Сужк Гайлица ^юю ^правка$»йр Орэвка ::Вид- Вставка Формат Сужк Гайлица ^юю ^правкаЙМДИГе* МроСЙМДИГе* МроСi.Исправления в измененном документе j У^У?/^ ..^..^д4^Л,.^^ ,?*4 ^,^4^<&i.Исправления в измененном документе j У^У?/^ ..^..^д4^Л,.^^ ,?*4 ^,^4^<&■ТЯМ^ТИ■ТЯМ^ТИM^MteJiM^MteJi■ I - Ч ► * ‘ 10 • I • п - ' • 12 • I • 13 ■ 1 * 1* 1 I ■ IS - I - 1Ь■ I - Ч ► * ‘ 10 • I • п - ' • 12 • I • 13 ■ 1 * 1* 1 I ■ IS - I - 1Ь202 1; Климов; Кирилл; Кандратьевич; Продавец: Самара .‘Ташкентская 23-41; 1;91, ООр *2 02 2; Ярцев;Евгений;Сергеевич:Финансовый директор;Смоленск;Фрунзе 12-9;7; 13 4,00р.2 02 3;Боярский;Владимир;Семенович;Консультант;Кемерово;Волошина 5 6-3 4;4;7В,00р.2024;Петров;Алексей;Александрович;Менеджер;Александров;Энтузиастов 2- 35:2:94,00р.2025;Сухов;Виталий;Сергеевич;Бухгалтер;Иваново;Лаона» 23—1£Громойоя 22-18;12;63,00р.2026;Матвеев;Николай;Петрович;Коммерческий директор:Саров;Юности 11-7/9:245,ООр, 2027; Андреев; Сергей;Иванович; Рекламный агент; Екатеринбург;-Наберажнвд—154— ^Техническая 31-18; 12; 250, ООр.202 1; Климов; Кирилл; Кандратьевич; Продавец: Самара .‘Ташкентская 23-41; 1;91, ООр *2 02 2; Ярцев;Евгений;Сергеевич:Финансовый директор;Смоленск;Фрунзе 12-9;7; 13 4,00р.2 02 3;Боярский;Владимир;Семенович;Консультант;Кемерово;Волошина 5 6-3 4;4;7В,00р.2024;Петров;Алексей;Александрович;Менеджер;Александров;Энтузиастов 2- 35:2:94,00р.2025;Сухов;Виталий;Сергеевич;Бухгалтер;Иваново;Лаона» 23—1£Громойоя 22-18;12;63,00р.2026;Матвеев;Николай;Петрович;Коммерческий директор:Саров;Юности 11-7/9:245,ООр, 2027; Андреев; Сергей;Иванович; Рекламный агент; Екатеринбург;-Наберажнвд—154— ^Техническая 31-18; 12; 250, ООр.2028;Курназов;Александр;Михайлович;Кенед*др пред с тавитель;Кострома;Мира 12-67;2;421,ООр.2028;Курназов;Александр;Михайлович;Кенед*др пред с тавитель;Кострома;Мира 12-67;2;421,ООр.*»иьнРе гиомал ь кый*»иьнРе гиомал ь кый10-5:2;283,00р.2030;Тарасов;Андрей;Васильевич;Предприниматель;Москва;2-й Сетуньский пр. 12- 35;12;329,ООр.2031;Быков;Анатолий;Алексеевич;Системный администратор;Чита;Автогенная 87-45/8;190,00р..2032;Славин:Леонид:Андреевич;Водитель;Саратов;Красноармейская 15-34:8:411,ООр. 2033;Кириллов;Алексей;Александрович;Программист;Красноярск;Прибрежная 2341; 12; 42, ООр.203 4; Дорохов;Владимир;Сергеевич;Бухгалтер;Новосибирск;Индустриальная 128-32;6;Э59,00р.2035; Казакев;Игорь;Викторович;Адвокат;Москва;Алтуфьевское шоссе 112- 207;9;161,00р.10-5:2;283,00р.2030;Тарасов;Андрей;Васильевич;Предприниматель;Москва;2-й Сетуньский пр. 12- 35;12;329,ООр.2031;Быков;Анатолий;Алексеевич;Системный администратор;Чита;Автогенная 87-45/8;190,00р..2032;Славин:Леонид:Андреевич;Водитель;Саратов;Красноармейская 15-34:8:411,ООр. 2033;Кириллов;Алексей;Александрович;Программист;Красноярск;Прибрежная 2341; 12; 42, ООр.203 4; Дорохов;Владимир;Сергеевич;Бухгалтер;Новосибирск;Индустриальная 128-32;6;Э59,00р.2035; Казакев;Игорь;Викторович;Адвокат;Москва;Алтуфьевское шоссе 112- 207;9;161,00р.^^Я?6 е V«i«yСтр. 1 Разд! 1/1 Н» ЙО*Я?6 е V«i«yСтр. 1 Разд! 1/1 Н» ЙО*э • :»э • :»№34^:. W:№>-'^*ii6M№ АЖ -■№34^:. W:№>-'^*ii6M№ АЖ -■
®МвЯЩ§
®МвЯЩ§
$»йр Орэвка ::Вид- Вставка Формат Сужк Гайлица ^юю ^правка
$»йр Орэвка ::Вид- Вставка Формат Сужк Гайлица ^юю ^правка
ЙМДИГе* МроС
ЙМДИГе* МроС
i.Исправления в измененном документе j У^У?/^ ..^..^д4^Л,.^^ ,?*4 ^,^4^<&
i.Исправления в измененном документе j У^У?/^ ..^..^д4^Л,.^^ ,?*4 ^,^4^<&
■ТЯМ^ТИ
■ТЯМ^ТИ
M^MteJi
M^MteJi
■ I - Ч ► * ‘ 10 • I • п - ' • 12 • I • 13 ■ 1 * 1* 1 I ■ IS - I - 1Ь
■ I - Ч ► * ‘ 10 • I • п - ' • 12 • I • 13 ■ 1 * 1* 1 I ■ IS - I - 1Ь
202 1; Климов; Кирилл; Кандратьевич; Продавец: Самара .‘Ташкентская 23-41; 1;91, ООр *
2 02 2; Ярцев;Евгений;Сергеевич:Финансовый директор;Смоленск;Фрунзе 12-9;7; 13 4,00р.
2 02 3;Боярский;Владимир;Семенович;Консультант;Кемерово;Волошина 5 6-3 4;4;7В,00р.
2024;Петров;Алексей;Александрович;Менеджер;Александров;Энтузиастов 2- 35:2:94,00р.
2025;Сухов;Виталий;Сергеевич;Бухгалтер;Иваново;Лаона» 23—1£Громойоя 22-
18;12;63,00р.
2026;Матвеев;Николай;Петрович;Коммерческий директор:Саров;Юности 11-7/9:245,ООр, 2027; Андреев; Сергей;Иванович; Рекламный агент; Екатеринбург;-Наберажнвд—154— ^Техническая 31-18; 12; 250, ООр.
202 1; Климов; Кирилл; Кандратьевич; Продавец: Самара .‘Ташкентская 23-41; 1;91, ООр *
2 02 2; Ярцев;Евгений;Сергеевич:Финансовый директор;Смоленск;Фрунзе 12-9;7; 13 4,00р.
2 02 3;Боярский;Владимир;Семенович;Консультант;Кемерово;Волошина 5 6-3 4;4;7В,00р.
2024;Петров;Алексей;Александрович;Менеджер;Александров;Энтузиастов 2- 35:2:94,00р.
2025;Сухов;Виталий;Сергеевич;Бухгалтер;Иваново;Лаона» 23—1£Громойоя 22-
18;12;63,00р.
2026;Матвеев;Николай;Петрович;Коммерческий директор:Саров;Юности 11-7/9:245,ООр, 2027; Андреев; Сергей;Иванович; Рекламный агент; Екатеринбург;-Наберажнвд—154— ^Техническая 31-18; 12; 250, ООр.
2028;Курназов;Александр;Михайлович;Кенед*др пред с тавитель;Кострома;Мира 12-67;2;421,ООр.
2028;Курназов;Александр;Михайлович;Кенед*др пред с тавитель;Кострома;Мира 12-67;2;421,ООр.
*»иьнРе гиомал ь кый
*»иьнРе гиомал ь кый
10-5:2;283,00р.
2030;Тарасов;Андрей;Васильевич;Предприниматель;Москва;2-й Сетуньский пр. 12- 35;12;329,ООр.
2031;Быков;Анатолий;Алексеевич;Системный администратор;Чита;Автогенная 87-
45/8;190,00р..
2032;Славин:Леонид:Андреевич;Водитель;Саратов;Красноармейская 15-34:8:411,ООр. 2033;Кириллов;Алексей;Александрович;Программист;Красноярск;Прибрежная 2341; 12; 42, ООр.
203 4; Дорохов;Владимир;Сергеевич;Бухгалтер;Новосибирск;Индустриальная 128-
32;6;Э59,00р.
2035; Казакев;Игорь;Викторович;Адвокат;Москва;Алтуфьевское шоссе 112- 207;9;161,00р.
10-5:2;283,00р.
2030;Тарасов;Андрей;Васильевич;Предприниматель;Москва;2-й Сетуньский пр. 12- 35;12;329,ООр.
2031;Быков;Анатолий;Алексеевич;Системный администратор;Чита;Автогенная 87-
45/8;190,00р..
2032;Славин:Леонид:Андреевич;Водитель;Саратов;Красноармейская 15-34:8:411,ООр. 2033;Кириллов;Алексей;Александрович;Программист;Красноярск;Прибрежная 2341; 12; 42, ООр.
203 4; Дорохов;Владимир;Сергеевич;Бухгалтер;Новосибирск;Индустриальная 128-
32;6;Э59,00р.
2035; Казакев;Игорь;Викторович;Адвокат;Москва;Алтуфьевское шоссе 112- 207;9;161,00р.
^
^
Я?6 е V«i«y
Стр. 1 Разд! 1/1 Н» ЙО*
Я?6 е V«i«y
Стр. 1 Разд! 1/1 Н» ЙО*
э • :»
э • :»
№34^:. W:№>-'^*ii6M№ АЖ -■
№34^:. W:№>-'^*ii6M№ АЖ -■
Рис. 7.18. Идентификация несовпадающих данных
ТРЮК№ 63ТРЮК№ 63Импорт в Access различных ХМ L-данных
ТРЮК
№ 63
ТРЮК
№ 63
База данных Access неплохо справляется с импортом простых XML-данных, но иногда возникает потребность импортировать данные, которые не а полной мере отвечают да ожиданиям.
Access позволяет импортировать данные из файлов XML в свои таблицы. Предположим, к примеру, что база данных содержит таблицу с перечнем книг. 1 а рис. 7.19 показана эта таблица в режиме Конструктора. Она состоит из шести полей трех разных типов.
Для начала в таблице содержатся сведения о нескольких книгах (рис. 7.20).
Простейший способ увидеть XML-формат, который ожидает Access при импорте данных в эту таблицу, - это экспортировать часть данных путем выделения таблицы в базе данных и выбора из меню Файл пункта Экспорт. В результате мы получим экспортированные данные именно в том XML-формате, который нам нуж: о будет предложить Access для автоматического импорта. Иными словами, записи, экспортированные в ХМL, демонстрируют структуру XML-узлов, которая должна быть у любых данных, реимпортируемых в Access. Экспортированные данные показаны в примере 7.1.
209209ISBNISBN.МвИ»«’й&Н!.’..МвИ»«’й&Н!.’.Международный стандартмыт нонер книгиМеждународный стандартмыт нонер книгиТ*™*.Попе МЕНО Пог»! МЕНОТ*™*.Попе МЕНО Пог»! МЕНОН«*«Подмео*»*: Крн.кое огнсееие Псдпсоиое™™ ЦЕНЕ .Н«*«Подмео*»*: Крн.кое огнсееие Псдпсоиое™™ ЦЕНЕ .■прожги». Доя ;сф»ц|г>г' : . й«нантг*н нагенетч' iMumiyFL■прожги». Доя ;сф»ц|г>г' : . й«нантг*н нагенетч' iMumiyFLжги г» и: И :.*Ч*«Х уметанжги г» и: И :.*Ч*«Х уметанДа (Совпадежя не допускаются?Да (Совпадежя не допускаются?Нет игонтро та' 7 ■НетНет игонтро та' 7 ■Нет: Размер поля• - Формат поля;| Маска вводаj Подпись:; Значение по умолчанию; Условие мд значение; Сообщение об ошибке' ] Обязательное поле■: ПуСТЬв СТРОКИ1 Индексированное полеj Сжатие Юникодч Режим IME; Режин предложежй IME} Смарт-теги: Размер поля• - Формат поля;| Маска вводаj Подпись:; Значение по умолчанию; Условие мд значение; Сообщение об ошибке' ] Обязательное поле■: ПуСТЬв СТРОКИ1 Индексированное полеj Сжатие Юникодч Режим IME; Режин предложежй IME} Смарт-тегиНет ДаНет ДаРис. 7.19. Простая таблица, предназначенная для импорта данныхРис. 7.19. Простая таблица, предназначенная для импорта данных1$BN^‘1*'T На^амТ*}^Mf^7kS^S"o^^1$BN^‘1*'T На^амТ*}^Mf^7kS^S"o^^Запись; Гм") 4 fЗапись; Гм") 4 fРис. 7.20. Исходные тестовые данные таблицы КнигиРис. 7.20. Исходные тестовые данные таблицы Книги► 5318005284 ; Oracle Ри501;Для профессии Полное руководе Данная книга является май 525,00р.- 5469003906 i Access. С6ори; Для профессии Сборник идей пр Эта книга — не справочни!. 675,00р," 5947239280 C++. С правом*-: Полное руково Справочник по яз В книге «C++ Справочник 390ДОр* ' djoop
209
209
ISBN
ISBN
.МвИ»«’й&Н!.’.
.МвИ»«’й&Н!.’.
Международный стандартмыт нонер книги
Международный стандартмыт нонер книги
Т*™*.
Попе МЕНО Пог»! МЕНО
Т*™*.
Попе МЕНО Пог»! МЕНО
Н«*«
Подмео*»*: Крн.кое огнсееие Псдпсоиое™™ ЦЕНЕ .
Н«*«
Подмео*»*: Крн.кое огнсееие Псдпсоиое™™ ЦЕНЕ .
■прожги». Доя ;сф»ц|г>г' : . й«нантг*н нагенетч
' iMumiyFL
■прожги». Доя ;сф»ц|г>г' : . й«нантг*н нагенетч
' iMumiyFL
жги г» и: И :.*Ч*«Х уметан
жги г» и: И :.*Ч*«Х уметан
Да (Совпадежя не допускаются?
Да (Совпадежя не допускаются?
Нет игонтро та' 7 ■Нет
Нет игонтро та' 7 ■Нет
: Размер поля
• - Формат поля
;| Маска ввода
j Подпись
:; Значение по умолчанию
; Условие мд значение
; Сообщение об ошибке
' ] Обязательное поле
■: ПуСТЬв СТРОКИ
1 Индексированное поле
j Сжатие Юникод
ч Режим IME
; Режин предложежй IME
} Смарт-теги
: Размер поля
• - Формат поля
;| Маска ввода
j Подпись
:; Значение по умолчанию
; Условие мд значение
; Сообщение об ошибке
' ] Обязательное поле
■: ПуСТЬв СТРОКИ
1 Индексированное поле
j Сжатие Юникод
ч Режим IME
; Режин предложежй IME
} Смарт-теги
Нет Да
Нет Да
Рис. 7.19. Простая таблица, предназначенная для импорта данных
Рис. 7.19. Простая таблица, предназначенная для импорта данных
1$BN^‘1*'T На^амТ*}^Mf^7kS^S"o^^
1$BN^‘1*'T На^амТ*}^Mf^7kS^S"o^^
Запись; Гм") 4 f
Запись; Гм") 4 f
Рис. 7.20. Исходные тестовые данные таблицы Книги
Рис. 7.20. Исходные тестовые данные таблицы Книги
Пример 7.1. Новые, приемлемые для импорта данные
<?xml version="1.0" encoding="UTF-8" ?>
<dataroot>
<Книги>
<ISBN>5469002144</ISBN>
<Название>0гас1е SQL*Plus*/Название>
<Подзаголовок>Карманный справочник/Подзаголовок* <Краткое_х0020_описание*Решение задач в среде SQL*PLus</ Краткое_х0020_описание>
<Подробное_х0е20_описание*В книге очень подробно рассказано, почему имеет смысл решать все свои задачи с помощью SQL*Plus. Вы узнаете, как писать и выполнять файлы сценариев, генерировать и форматировать отчеты, получать информацию из баз данных, запрашивать таблицы словарных данных, настраивать для своих целей среду 5QL*Plus, применять механизмы администрирования SQL*Plus.</Подробное_х002О_описание>
<Цена>74</Цена>
</Книги>
<Книги>
<ISBN>5947234823</ISBN*продолжение ^
Пример 7,1 Продолжений
<Нэзвание>Рег1 & ХМ1</Название>
<Подза головок>Библиотека программиста*/Подза головок’ <Краткое_х0029_описание>Создание XHL-приложений средствами языка Perl*/ Краткое_х0020_описание>
<Подробное_х0020_описание>Книга посвящена всестороннему рассмотрению особенностей создания XML-приложений средствами языка Perl. Рассматриваются теоретические основы генерирования и синтаксического разбора XML-документов, обработка XML-деревьев, объектная модель документов (DOM). работа с потоками событий, а также Perl-модули различного назначения. Серьезный теоретический материал иллюстрируется большим количеством практических примеров. Книга рассчитана на программистов, имеющих опыт работы на языке Perl.*/ Подробное_х0020_описание> <Цена>135*/Цена> </Книги> <Книги’
<15BN>5469010082</ISBN>
<Название’Жепезо ПК. Хитрости</Название>
<Подзаголовок>Как перестать ковыряться в компьютере и начать на нем работать*/Подзаголовок’
<Краткое_х0020_описание’Решение проблем компьютерного оборудования*/ Краткое_х0020_описание>
<Подробное_х0020_описание>Эта книга посвящена укрощению строптивого компьютерного оборудования. В ней рассматриваются сложные ситуации и проблемы, связанные с драйверами, дисплеями, принтерами, сканерами, оперативной памятью, микросхемами, материнскими платами и другими устройствами, которые спрятаны внутри или подключены снаружи ваших настольных или переносных компьютерных систем. Для понимания изложенного в книге материала не требуется быть компьютерным знатоком, книга сама поможет вам в осмыслении некоторых основных понятий. Желательно только уметь пользоваться операционной системой Windows ХР и знать, каким концом держать в руках отвертку. И неважно, кто вы - опытный пользователь с двадцатйлетним стажем или новичок, только что с радостью отыскавший порт для подключения мыши на своем первом в жизни компьютере.</Подробное„х0620_олисание> <Цена’270*/Цена> </Книги> </dataroot>
Описание структуры данных начинается с элемента data root, хотя для Access ни самом деле название этого контейнерного элемента не играет никакой роли. Элемент Книги сообщает Access, что информация поступает н таблицу Книги, a ISBN, Название, Подзаголовок и другие элементы внутри каждого элемента Книги содержат информацию, поступающую в поля таблицы Книги. Единственная особенност, касается полей Краткое описание и Подробное описание, которые Access предпочитает в виде Краткое_х0020_описание и Подробное_х0020_описание, поскольку ХМ], не воспринимает пробелы в именах тегов. Для Access безразличен порядок следования полей, но распознать их система сможет лишь в виде дочерних элементов, но никак не атрибутов.
Для начала нужно выбрать из меню Файл пункт Внешние данные, а затем выбрать пункт Импорт. Появится диалоговое окно, изображенное на рис. 7.21.
Изначально ожидается импорт в формате Access, поэтому в раскрывающемся меню Тип файлов, расположенном в нижней части окна, возможно, понадобится выбрат,
Рис. 7.21. Начальное диалоговое окно Импорт
Рис. 7.22. Диалоговое окно Импорт, отображающее структуру документа XML
значение XML. После этого выделите файл и щелкните на кнопке Импорт. Появится диалоговое окно Импорт XML, показанное на рис. 7.22.
Для просмотра структуры элемента Книги можно щелкнуть на знаке плюс, расположенном слева от него. Если щелкнуть на кнопке OK, Access создаст новую таблицу для импортирования данных XML в Access с именем Книги! (или с именем, имеющим другой подходящий номер), которое не будет конфликтовать с именем предыдущей таблицы с импортированными данными ХМ L.
Может быть, это и к лучшему, поскольку теперь можно сравнить новые данные со старыми, перед тем как собрать их воедино. Между тем Access предоставляет еще две возможности: создать новую таблицу, основанную на структуре XML-файла, и добавить данные из XML-файла в существующую таблицу. В последнем случае, зная, что новые книги отличаются от старых, нужно щелкнуть на кнопке Параметры и выбрать параметр добавить данные в таблицы (рис. 7.23).
Если теперь щелкнуть на кнопке ОК, к существующей таблице Книги будут добавлены новые записи о книгах (рис. 7.24).
212
Рис. 7.23. Диалоговое окно Импорт, отображающее более сложную структуру XML-документа и выбор параметра импорта, связанного с добавлением данныхРис. 7.23. Диалоговое окно Импорт, отображающее более сложную структуру XML-документа и выбор параметра импорта, связанного с добавлением данныхТщ! Фв^л Пр«жз ^1А Вст^кв Фррудт : ЗАПИСИ Сдои: Окно СправкаТщ! Фв^л Пр«жз ^1А Вст^кв Фррудт : ЗАПИСИ Сдои: Окно Справка№аДЯ = 8 вопйх№аДЯ = 8 вопйхв Xв X/.ISBN.. г/.ISBN.. гНазваниеНазвание5469002144 5469003906 5469010082 5947234823 59472392805469002144 5469003906 5469010082 5947234823 5947239280Oracle PL/SQLOracle SQL*Plus .Access Сборник рецептов.Железо ПК. ХитростиPerl &XML .2'.™—C++. СправочникOracle PL/SQLOracle SQL*Plus .Access Сборник рецептов.Железо ПК. ХитростиPerl &XML .2'.™—C++. Справочник■ТЛодзапй?7кж[Крутй^^ ПадроВйо» от™й^1'Г ■■ Йёб^■ТЛодзапй?7кж[Крутй^^ ПадроВйо» от™й^1'Г ■■ Йёб^:Для профессис Полное рукоеодс Данная книга является наи i Карманный cn.fi Решение задач в В книге очень подробно ра . Для профессией Сборник идей по Эта книга — не справочник Как перестать ^Решение проблем Эта книга посвящена укрог ;Библиотека npi:Создание XML-np: Книга посвящена всесторс Полное руково Справочник по яз В книге <С++, Справочник/:Для профессис Полное рукоеодс Данная книга является наи i Карманный cn.fi Решение задач в В книге очень подробно ра . Для профессией Сборник идей по Эта книга — не справочник Как перестать ^Решение проблем Эта книга посвящена укрог ;Библиотека npi:Создание XML-np: Книга посвящена всесторс Полное руково Справочник по яз В книге <С++, Справочник/525,00р.74,00р675.00р. 270jaip 1Э5ДОр' 390ДОр.ОДОр.525,00р.74,00р675.00р. 270jaip 1Э5ДОр' 390ДОр.ОДОр.Рис. 7.24. Результат импортирования документа с добавлениемРис. 7.24. Результат импортирования документа с добавлением
Рис. 7.23. Диалоговое окно Импорт, отображающее более сложную структуру XML-документа и выбор параметра импорта, связанного с добавлением данных
Рис. 7.23. Диалоговое окно Импорт, отображающее более сложную структуру XML-документа и выбор параметра импорта, связанного с добавлением данных
Тщ! Фв^л Пр«жз ^1А Вст^кв Фррудт : ЗАПИСИ Сдои: Окно Справка
Тщ! Фв^л Пр«жз ^1А Вст^кв Фррудт : ЗАПИСИ Сдои: Окно Справка
№аДЯ = 8 вопйх
№аДЯ = 8 вопйх
в X
в X
/.ISBN.. г
/.ISBN.. г
Название
Название
5469002144 5469003906 5469010082 5947234823 5947239280
5469002144 5469003906 5469010082 5947234823 5947239280
Oracle PL/SQL
Oracle SQL*Plus .
Access Сборник рецептов.
Железо ПК. Хитрости
Perl &XML .2'.™—
C++. Справочник
Oracle PL/SQL
Oracle SQL*Plus .
Access Сборник рецептов.
Железо ПК. Хитрости
Perl &XML .2'.™—
C++. Справочник
■ТЛодзапй?7кж[Крутй^^ ПадроВйо» от™й^1'Г ■■ Йёб^
■ТЛодзапй?7кж[Крутй^^ ПадроВйо» от™й^1'Г ■■ Йёб^
:Для профессис Полное рукоеодс Данная книга является наи i Карманный cn.fi Решение задач в В книге очень подробно ра . Для профессией Сборник идей по Эта книга — не справочник Как перестать ^Решение проблем Эта книга посвящена укрог ;Библиотека npi:Создание XML-np: Книга посвящена всесторс Полное руково Справочник по яз В книге <С++, Справочник/
:Для профессис Полное рукоеодс Данная книга является наи i Карманный cn.fi Решение задач в В книге очень подробно ра . Для профессией Сборник идей по Эта книга — не справочник Как перестать ^Решение проблем Эта книга посвящена укрог ;Библиотека npi:Создание XML-np: Книга посвящена всесторс Полное руково Справочник по яз В книге <С++, Справочник/
525,00р.74,00р
675.00р. 270jaip 1Э5ДОр' 390ДОр.
ОДОр.
525,00р.74,00р
675.00р. 270jaip 1Э5ДОр' 390ДОр.
ОДОр.
Рис. 7.24. Результат импортирования документа с добавлением
Рис. 7.24. Результат импортирования документа с добавлением
Access отказывается импортировать данные XML, которые вызывают конфликт < существующими ключевыми связями. К примеру, если вы еще раз попытаетест импортировать тот же документ тем же способом, то получите в результате таблицу' Ошибки Им порта, показанную на рис. 7.25.
^ СЗ 8*^ ОР**6 Вид встаем .. Формат Зап Юи Сдонс ,^но ^правкаS»r^urr<i«k*ifXK * _ fl X^^i^^\ >-^Сообщения рб ошибке ^"_ • | РетУ^тат"Уштампjpi^ СЗ 8*^ ОР**6 Вид встаем .. Формат Зап Юи Сдонс ,^но ^правкаS»r^urr<i«k*ifXK * _ fl X^^i^^\ >-^Сообщения рб ошибке ^"_ • | РетУ^тат"УштампjpiMicrosoft JET Database Engine Изменения не были успешно внесены из-за повторяющее иные не есЮ5 17 36Microsoft JET Database Engine Изменения не были успешно внесены из-за повторяющее иные не есЮ5 17 36Microsoft JET Database Engine Изменения нв были успешно внесены из-за повторяющ* Данные не вс:Ю5 17.36 Microsoft JET Database Engine. Изменения нв были успешно внесены из-за повторяющие Данные не вс J05 17.36.Microsoft JET Database Engine Изменения нв были успешно внесены из-за повторяющ* Данные не вс:Ю5 17.36 Microsoft JET Database Engine. Изменения нв были успешно внесены из-за повторяющие Данные не вс J05 17.36.^№1^№1Рис. 7.25. Результат импортирования документа с попыткой добавления уже имевшихся данныхРис. 7.25. Результат импортирования документа с попыткой добавления уже имевшихся данных
^ СЗ 8*^ ОР**6 Вид встаем .. Формат Зап Юи Сдонс ,^но ^правкаS»r^urr<i«k*ifXK * _ fl X
^^i^^\ >-^Сообщения рб ошибке ^"_ • | РетУ^тат"Уштампjpi
^ СЗ 8*^ ОР**6 Вид встаем .. Формат Зап Юи Сдонс ,^но ^правкаS»r^urr<i«k*ifXK * _ fl X
^^i^^\ >-^Сообщения рб ошибке ^"_ • | РетУ^тат"Уштампjpi
Microsoft JET Database Engine Изменения не были успешно внесены из-за повторяющее иные не есЮ5 17 36
Microsoft JET Database Engine Изменения не были успешно внесены из-за повторяющее иные не есЮ5 17 36
Microsoft JET Database Engine Изменения нв были успешно внесены из-за повторяющ* Данные не вс:Ю5 17.36 Microsoft JET Database Engine. Изменения нв были успешно внесены из-за повторяющие Данные не вс J05 17.36.
Microsoft JET Database Engine Изменения нв были успешно внесены из-за повторяющ* Данные не вс:Ю5 17.36 Microsoft JET Database Engine. Изменения нв были успешно внесены из-за повторяющие Данные не вс J05 17.36.
^№1
^№1
Рис. 7.25. Результат импортирования документа с попыткой добавления уже имевшихся данных
Рис. 7.25. Результат импортирования документа с попыткой добавления уже имевшихся данных
Использование кнопки Преобразовать (см. рис. 7.23) позволяет также осуществлять преобразования, облегчающие импорт данных, которые поступают в неожи-
данной для Access форме. Предположим, к примеру, что информация о новых книгах поступила в форме, показанной в примере 7.2.
Пример 7,2. Книги.хт!, импортируемый ХМ L-документ, имеющий атрибутную информационную основу
<?xml version="1.0" encoding="UTF-8" ?>
<дополнение>
«книги rSBN="5947239256" Ha38aHi4e="Windows ХР. Трюки" Подзаголоеок="100 приемов укрощения операционной системы" Краткое_х0020_описание="8 книге собрано 10В полезных приемов." Подробное_х0Э20_описание="В книге собрано ровно 100 приемов — полезных, часто забавных, с помощью которых вы сможете сберечь многие часы, быстро и эффективно выполняя важные для вас задачи." Цена="197.0В" /> </дополнение>
Все данные в примере 7.2 хранятся в атрибутах, но Access в процессе импорта внимания на них не обращает. Для извлечения информации в Access нужно с помощью таблицы стилей, показанной в примере 7.3, провести универсальное преобразование и превратить все атрибуты в дочерние элементы.
Пример 7.3. ch0813.xsl, таблица стилей, преобразующая атрибуты в элементы
<?xml versiоп-"1.0" encoding®"UTF-8"?>
<xsl:stylesheet version®"1,6" xmlns:xsl="http:Z/www, w3.org/1999/XSL/ Trans form">
<!--Oerived from recipe 6.1 of Sal Mangano's XSLT Cookbook-->
<xsl:output method="xml" version®"1.8" encoding="UTF-8" indent="yes"/>
xxsl:template match="@*">
xxsI:element name®"{local-name(.)}" namespace®"{namespace-uri(..)}"> <xsl:value-pf select®"."/>
</xsl:element>
</xsl:templatex
<xsl:template match="node( )">
<xsl:copy>
<xsl: apply-tempiates select®"®* | node( )"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheetx
Применение таблицы стилей из примера 7.3 к данным примера 7.2 приведет к легко импортируемому в Access результату, показанному в примере 7.4.
ПРИМЕЧАНИЕ
Напомним еще раз, что для Access безразлично имя корневого элемента, поэтому имя дополнение выбрано по смыслу.
Пример 7.4. Версия примера 7.2 в переложении на элементы
продолжение ^продолжение ^<?xml version®"1.0" encoding="UTF-8"?> кдополнениех
продолжение ^
продолжение ^
Пример 7.4 ^продолжений
<книси>
<ISBN>5947239256</ISBN>
<Название> Windows ХР. Тркжи</Назеание>
<Подзагоповок>100 приемов укрощения операционной системы </Подзаголовок> <Краткое_хВ926-описание>8 книге собрано 109 полезных приемов,</ Краткое_х0020_описание>
<Подробное_х0020_описание>В книге собрано ровно 10В приемов - полезных, часто забавных, с помощью которых вы сможете сберечь многие часы, быстро и эффективно выполняя важные для вас задачи.</Подробное_хВВ20_описание> <Цена»197.00</Цена» <7книги>
^дополнение»
Если указать Access в качестве источника импортирования книги.xml, то есть файл из примера 7.2, в диалоговом окне Импорт XML вам не придется делать какой-либо дополнительный выбор (рис. 7,26).
Рис. 7.26. Первичная реакция Access на документ, хранящий информацию в атрибутах
Рис. 7.27. Выбор таблицы стилей для преобразования
Обращение к команде Параметры к Преобразовать... позволит добавить таблицу стилей, как это делалось и для экспортных преобразований. Добавьте таблицу стилей к списку преобразований, исполняемых до импорта, и выберите ch0813 (рис. 7.27).
После щелчка на кнопке OK Access осуществит преобразование документа, изменяя вид компонентов. Результат работы показан на рис. 7.28.
Рис. 7.28. Преобразованный документ, подготовленный к импортированиюРис. 7.28. Преобразованный документ, подготовленный к импортированию
Рис. 7.28. Преобразованный документ, подготовленный к импортированию
Рис. 7.28. Преобразованный документ, подготовленный к импортированию
В данном случае таблица уже существует, поэтому надо выбрать параметр добавить данные в таблицы. После щелчка на кнопке ОК данные из примера 7.4 будут добавлены в таблицу Книги (рис. 7.29).
р ^"^^ и . т^ „ ^ ^^-^? ■;р ^"^^ и . т^ „ ^ ^^-^? ■;НазваниеНазвание531800528454690021445469003906531800528454690021445469003906Oracle PUSQLLOracle SQUPIus Access. Сборник рецептов.;,Oracle PUSQLLOracle SQUPIus Access. Сборник рецептов.;,ПодзагоЛов^Для профессис Полное руководс Данная книга является наи: Карманный сп^ Решение задач в В книге очень подробно ре Для профессис Сборник идей по Эта книга — не справочник Как перестать Решение проблем Эта книга посвящена укрогПодзагоЛов^Для профессис Полное руководс Данная книга является наи: Карманный сп^ Решение задач в В книге очень подробно ре Для профессис Сборник идей по Эта книга — не справочник Как перестать Решение проблем Эта книга посвящена укрогЦена 525,00р. 74,00р.675.00р. 270,00рЦена 525,00р. 74,00р.675.00р. 270,00р■■5469010082 Железо ПК Хитрости5469010082 Железо ПК ХитростиРис. 7.29. Результат импортирования преобразованного документаРис. 7.29. Результат импортирования преобразованного документа5947234823Part i, XML5947239256 ЩЕЕЕВЗВЭВИ5947299200С** Справочник5947234823Part i, XML5947239256 ЩЕЕЕВЗВЭВИ5947299200С** СправочникБиблиотека пр- Создание XML-np Книга посвящена есесторс 135,00р 100 приемов В книге собрано 1 0 книге собрано ровно 100 197,00р Полное рукоео Справочник по яз В книге <С-н- Справочник . Э90,00рБиблиотека пр- Создание XML-np Книга посвящена есесторс 135,00р 100 приемов В книге собрано 1 0 книге собрано ровно 100 197,00р Полное рукоео Справочник по яз В книге <С-н- Справочник . Э90,00р
р ^"^^ и . т^ „ ^ ^^-^? ■;
р ^"^^ и . т^ „ ^ ^^-^? ■;
Название
Название
5318005284
5469002144
5469003906
5318005284
5469002144
5469003906
Oracle PUSQLL
Oracle SQUPIus Access. Сборник рецептов.;,
Oracle PUSQLL
Oracle SQUPIus Access. Сборник рецептов.;,
ПодзагоЛов^
Для профессис Полное руководс Данная книга является наи: Карманный сп^ Решение задач в В книге очень подробно ре Для профессис Сборник идей по Эта книга — не справочник Как перестать Решение проблем Эта книга посвящена укрог
ПодзагоЛов^
Для профессис Полное руководс Данная книга является наи: Карманный сп^ Решение задач в В книге очень подробно ре Для профессис Сборник идей по Эта книга — не справочник Как перестать Решение проблем Эта книга посвящена укрог
Цена 525,00р. 74,00р.
675.00р. 270,00р
Цена 525,00р. 74,00р.
675.00р. 270,00р
■
■
5469010082 Железо ПК Хитрости
5469010082 Железо ПК Хитрости
Рис. 7.29. Результат импортирования преобразованного документа
Рис. 7.29. Результат импортирования преобразованного документа
5947234823Part i, XML
5947239256 ЩЕЕЕВЗВЭВИ
5947299200С** Справочник
5947234823Part i, XML
5947239256 ЩЕЕЕВЗВЭВИ
5947299200С** Справочник
Библиотека пр- Создание XML-np Книга посвящена есесторс 135,00р 100 приемов В книге собрано 1 0 книге собрано ровно 100 197,00р Полное рукоео Справочник по яз В книге <С-н- Справочник . Э90,00р
Библиотека пр- Создание XML-np Книга посвящена есесторс 135,00р 100 приемов В книге собрано 1 0 книге собрано ровно 100 197,00р Полное рукоео Справочник по яз В книге <С-н- Справочник . Э90,00р
Преобразование представляет собой довольно мощный инструмент, используемый почти во всех областях разработки XML. Применение XSLT, технологии, по общему признанию, нс самой простой в изучении, позволяет осуществлять структурные преобразования, которые требуются для использования данных в Access. См. также «Рациональный способ экспорта данных в формат XML> (Трюк № 64) и «Преодоление барьера преобразования при использовании УВЛ» (Трюк №65).
216216
216
216
Т Р Ю К I№ 64Т Р Ю К I№ 64Рациональный способ экспорта данных в формат XML
Т Р Ю К I
№ 64
Т Р Ю К I
№ 64
Решение проблем экспорта взаимосвязанных данных в XML-формат.
Данные, получаемые в результате экспорта в XML-формат отдельно взятой таблицы, могут быть легко использованы в дальнейшем. Ио при экспорте нескольких таблиц полученные данные могут быть неприемлемы для других приложений. Все зависит от структуры таблиц и установленных между ними связей. Решить эту проблему можно двумя способами: изменить структуру данных или воспользоваться запросом для экспорта неупорядоченных данных.
Для начала рассмотрим базу данных с таблицей, содержащей перечень книг. Нз рис. 7.30 показана такая таблица в режиме Конструктора. Она состоит из шест 1 полей трех разных типов.
Рис. 7.30. Простая таблица для экспортаРис. 7.30. Простая таблица для экспорта
Рис. 7.30. Простая таблица для экспорта
Рис. 7.30. Простая таблица для экспорта
Чтобы не усложнять процесс исследования, таблица содержит минимум инфо] - мании. Экспорт таблиц, заполненных тысячами записей, приведет к созданию больших по объему XML-файлов, подходящих к реальной обстановке, но слоя-
ISBN .' I Название । Подзаголовок [Краткое описа^^
*0596002378 SAX2*0596002378 SAX2Эффективная с Эта небольшая Эта неболыиаг:2£:
*0596002378 SAX2
*0596002378 SAX2
0596002920Справочник по Настольный сп Это новое офш Это новое офит35
0596005365Основы приме Интеграция Off. Microsoft добае Microsoft добаь34;-
^У® • I ‘ФМлП^™3 ■■
Рис. 7.31. Экспериментальные данные таблицы Книги
ных для начального анализа. На рис. 7.31 показан неполный вид содержимого экспериментальной таблицы.
Экспорт этой таблицы в XML-формат происходит в несколько этапов, большинство из которых уже знакомы разработчикам, ранее занимавшимся экспортом данных из базы Access. Начинается этот процесс с выделения таблицы Книги в базе данных и выбора пункта Экспорт... в меню Файл. В появляющемся после этих действий диалоговом окне, показанном на рис. 7.32, в раскрывающемся списке Тип файлов нужно выбрать XML (*.xml).
Рис. 7.32. Выбор вида информации, получаемой е результате экспорта
В процессе экспорта данных Access может создать не только XML-файл, но и другие файлы, размещаемые в том же каталоге. После щелчка на кнопке Экспорт всех появится небольшое диалоговое окно, содержащее основные параметры (рис. 7.33).
Рис. 7.33. Основные параметры экспорта
На данном этапе мы согласимся с параметрами, предложенными ио умолчанию, и щелкнем на кнопке ОК. В результате будут созданы два файла: книги .xml и книги-xsd. Файл книги.хт! содержит информацию, полученную из таблицы, а файл книги.xsd состоит из описания XML-схемы этого содержимого, с небольшим комментарием, характерным для Access и его процессора обработки данных Jet.
Файл книги.хт1, показанный в примере 7.5, в точности отражает структуру и содержимое таблицы-прототипа.
Пример 7.5. Результат экспорта простой таблицы
<?xml version^"!.0" encoding="UTF-8" ?>
«dataroot xmlns:od-"urn:schemas-microsoft-com:officedata" xmlns:xsi="http:// www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Книги.xsd" generated="2005-12-11T11:04:53"? «Книги?
<IS8N?0596005385</ISBN>
<Название>0сновы применения XML в Office 2003</Название> «Подзаголовок?Интеграция Office в мировую информационную среду</ Подзаголовок?
«Краткое_х0026—Описание?М1crosoft добавила обширную функциональную поддержку XML не только в Word. Excel и Access, но и в новое приложение. Microsoft InfoPath. Книга призвана побудить читателей использовать эти новые возможности,</Краткое_х0020_описание?
<Подробное_х6020_описание>М1сго5ОТt добавила обширную функциональную поддержку XML не только в Word, Excel и Access, но и в новое приложение, Microsoft InfoPath. Книга призвана побудить читателей использовать эти новые возможности.</Подробное_х0020_описание?
<Цена>34,95</Цена>~
«/Книги? «Книги?
<IS8N>9596002920</ISBN>
«Название?Справочник по XHL. 2-е издание«/Название?
<Подзаголовок?Настопьный справочнике/Подзаголовок?
<Краткое_х0020_описание?Это новое официальное издание Справочника по XML предоставляет разработчикам законченное руководство, помогающее быстро освоить язык ХМ1«/Краткое_х0020_олисание>
<Подробное_х0020_описание?Это новое официальное издание Справочника по XML предоставляет разработчикам законченное руководство, помогающее быстро освоить язык XML, Тематика рассчитана на профессиональных пользователей XML, которые смогут найти асе необходимое для своей работы, включая основные правила синтаксиса, подробности создания DTD и XML-схем, XSLT-преобразований и API, использующихся для обработки XML-документов. Проще говоря, этот справочник — единственный в своем роде в семействе книг по XML</ Подробное_х0020_описание>
<Цена?39,95</Цена?
«/Книги?
«Книги?
<ISBN>0596002378</ISBN?
«Название?5АХ2</Название>
<Подзаголовок?Эффективная обработка XML средствами Зама«/Подаагоповок> <Краткое_х0020_описание>Эта небольшая книга предоставляет все необходимые сведения по эффективному применению Simple API для XML. основного интерфейса прикладного программирования, предназначенного для обработки XML средствами языка Java,</Краткое_х0020_описание>
<Подробное_х0020_описание?Эта небольшая книга предоставляет все необходимые сведения по эффективному применению Simple API для XML, основного интерфейс а прикладного программирования, предназначенного для обработки XML средствами языка Java.</Подробное_хВ029_описание?
<Цена>29,95</Цена> «/Книги?
</dataroot?
Корневой элемент документа, dataroot, является единственной его частью, в которой отражается специфическая информация Access:
«dataroot xmlns:od="urn:schemas-microsoft-com:officedata" xmlns:xsi="http:// www.w3.org/2001/XML Schema -1nstarice"
xsi:noNamespaceSchemaLocation="Книги.xsd" generated="2005-12-11T11:04:S3">
В нем объявляется пространство имен для префикса od, который на самом деле не используется н данном документе. В него также включен указатель на XML-схему, описывающую структуру документа. Поскольку существующие названия элементов не принадлежат какому-либо пространству имен, в документе использован атрибут xsimoNamespaceSchemalocation для установки схемы, применимой для всех элементов документа, не имеющих принадлежности пространству имен. Корневой элемент содержит также скромные метаданные, заключенные в атрибуте generated и отражающие время и дату создания данного XML-документа.
Элемент dataroot содержит три дочерних элемента Книги, каждый из которых является отображением строки таблицы Книги. В свою очередь их содержимое буквальным образом отражает имена и значения столбцов таблицы:
<Книги>
< IS В N > 0596002 920 < /1S BN >
<Назеание>Справочник па XML, 2-е издание</Название> <Подзаголовок>Настольный справочник*/Подзаголовок> <Краткое_х0020_описание>Это навое официальное издание Справочника по XML предоставляет разработчикам законченное руководство, помогающее быстро освоить язык ХМЬ</Краткое_х0020_описание>
<Подробное_х0020_описание>Это новое официальное издание Справочника по XML предоставляет разработчикам законченное руководство, помогающее быстро освоить язык XML. Тематика рассчитана на профессиональных пользователей XML , которые смогут найти все необходимое для своей работы, включая основные правила синтаксиса, подробности создания DTD и XML-схем, XSLT-преобраэований И API, использующихся для Обработки XML-документов. Проще говоря, этот справочник - единственный в своем роде в семействе книг по XML<2 Подробное_х0020_описание>
<Цена>39.95</Цена>
</Книги>
Единственные существенные изменения касаются имен столбцов, в которых имеются пробелы. Вместо имени Краткое описание теперь фигурирует имя Краткое_ х0020_описание, соответствующее конвенции разработчиков Microsoft, касающейся представления пробелов в именах XML-элементов.
ПРИМЕЧАНИЕ
Запрет на использование пробелов в именах XML-элементов связан с трудностями, которые их присутствие вызвало бы при отделении имени элемента от атрибутов, поэтому Access использует для обозначения пробела шестнадцатеричное число х0020 (его значение в кодировке Unicode),
При всей востребованности экспорта отдельных таблиц иногда нужно экспортировать несколько таблиц с сохранением существующих между ними связей. Access позволяет экспортировать набор таблиц, хотя, конечно, проще иметь дело всего с двумя таблицами.
Экспорт данных из таблиц, имеющих связь один-ко-многим
Для рассмотрения первого примера добавим таблицу, содержащую информацию (весьма надуманную) о планах продвижения на рынке различных книг. На рис. 7.34 показано, как выглядит эта таблица.
®oli®oli1-Обэбакж1-ОбэбакжНазвание।Подарочный пальмовый котНазвание।Подарочный пальмовый кот2!0596002378Бесплатные фильтры2!0596002378Бесплатные фильтры3 0596005305 "брелоки3 0596005305 "брелоки««юа»««юа»ЙЖОЙЙЙЖОЙЙг^!ф(^>№^.Х-.^Х#1фр1у^.1^»Х«в№^'?^6»Э4№:'*№*Ь»Яе№^^Место ряспростран^ Описание ^^'раскудн.' ^5Во всех местах про: Изготовленная: 10000г^!ф(^>№^.Х-.^Х#1фр1у^.1^»Х«в№^'?^6»Э4№:'*№*Ь»Яе№^^Место ряспростран^ Описание ^^'раскудн.' ^5Во всех местах про: Изготовленная: 10000Интернет/Safari КонференцииИнтернет/Safari КонференцииВсем разработО Брелок с оттис 1000Всем разработО Брелок с оттис 1000
®oli
®oli
1-Обэбакж
1-Обэбакж
Название।
Подарочный пальмовый кот
Название।
Подарочный пальмовый кот
2!0596002378Бесплатные фильтры
2!0596002378Бесплатные фильтры
3 0596005305 "брелоки
3 0596005305 "брелоки
««юа»
««юа»
ЙЖОЙЙ
ЙЖОЙЙ
г^!ф(^>№^.Х-.^Х#1фр1у^.1^»Х«в№^'?^6»Э4№:'*№*Ь»Яе№^
^Место ряспростран^ Описание ^^'раскудн.' ^5
Во всех местах про: Изготовленная: 10000
г^!ф(^>№^.Х-.^Х#1фр1у^.1^»Х«в№^'?^6»Э4№:'*№*Ь»Яе№^
^Место ряспростран^ Описание ^^'раскудн.' ^5
Во всех местах про: Изготовленная: 10000
Интернет/Safari Конференции
Интернет/Safari Конференции
Всем разработО Брелок с оттис 1000
Всем разработО Брелок с оттис 1000
Рис. 7.34. Таблица стимуляции продаж
Таблица продвижения связана с таблицей книг через поле КнигаЮ (рис. 7,35).
Рис, 7.35. Связь таблиц Книги и ПродвижениеРис, 7.35. Связь таблиц Книги и Продвижение
Рис, 7.35. Связь таблиц Книги и Продвижение
Рис, 7.35. Связь таблиц Книги и Продвижение
Экспорт этой пары таблиц потребует нескольких дополнительных этапов, поскольку Access даст возможнос ть выбора режима экспортирования. От выбора базовой таблицы для экспорта во многом зависит получаемый результат, поэтому в следующих примерах мы испытаем оба способа экспортирования.
Начнем опять же с экспорта таблицы Книги, но на этот раз воспользуемся кнопкой Дополнительно... из диалогового окна, изображенного на рис. 7.36.
Рис. 7.36. Основные параметры экспортаРис. 7.36. Основные параметры экспорта
Рис. 7.36. Основные параметры экспорта
Рис. 7.36. Основные параметры экспорта
Щелчок на этой кнопке приведет к вызову более крупного диалогового окна с множеством дополнительных выбираемых параметров (рис. 7.37).
В данном случае вся необходимая нам информация размещена в первой вклад хе Данные. Установка флажка напротив элемента Продвижение и щелчок на кнопке 0К станут командой для Access на экспорт как таблицы Книги, так и связанных записей из таблицы Продвижение, в данном случае это коснется всех имеющихся записей. В примере 7.6 показана сокращенная версия экспортированных данных с новым содержимым из таблицы Продвижение.
Рис. 7.37. Полная версия диалогового окна Экспорт XML
Пример 7.6. Экспортированные связанные таблицы
<?xml version="1.0" encoding=’’UTF-8"?>
«dataroot xmlns:od="urn: schemas-mi crosoft-com: officedata’’ xmlns:xs1="http:// www.w3.org/2001/XMLSchema-1nstance"
xsi: noNamespaceSchemalocation=’’KHwrw. xsd" generated="2006-03- 16T1S:43: 22" > «Книги»
<ISBN>0596005385«/ISBN>
<Название>0сновы применения XML в Office 2003</Название»
«Подзаголовок»Интеграция Office в мировую информационную среду</ Подзаголовок»
<Краткое_х0020_описание»М1crosoft добавила обширную функциональную поддержку XML не только в Word, Excel и Access, но и в новое приложение. Microsoft InfoPath. Книга призвана побудить читателей использовать эти новые возможности.</Краткое_х0020_описание>
<Подробное_х0020_описание»М1сгозо1t добавила обширную функциональную поддержку XML не только в Word, Excel и Access, но и в новое приложение, Microsoft InfoPath. Книга призвана побудить читателей использовать эти новые возможности,</Подробное_х0020_описание>
«Цена»34.95</Цена>
«Продвижение»
«ПродвижениеID>1</ПродвижениеID»
«Книга1О>0596005385«/Книга1О>
«Название»Подарочный пальмовый кот«/Название>
<Место_х0020_распространения»Во всех местах продажи</
Место_.х0020_распространения»
<0писание»Изготовпенная методом трафаретной печати по размерам обложки открытка с изображением игрушечного пальмового кота, прилагаемая к каждому экземпляру книги.«/Описание»
«Расходы» 10000</Расходы»
«/Продвижение»
«Продвижение»
<Продвижение10»3«/Продвижение10»
<КнигаЮ>6596065385</Книга1О>
«Название»Брелоки</Название»
«Место_х062О_распространения»Конференции«/Место_х0020_распространения>
<0писание»6релок с оттиском красочного изображения пальмового кота и названием книги.«/Описание»_л
продолжение д'
Пример 7.6 ^продолжений
<Расходы*1000</Расходы*
«/Продвижение*
«/Книги*
«Книги*
<ISBN*0596002920*/ISBN*
<Название*Справочник по XML, 2-е издание«/Название>
<Подзаголовок*Настольный справочник*/Подзаголовок*
<Краткое_х0020_описание*Это новое официальное издание Справочника по XML предоставляет разработчикам законченное руководство, помогающее быстро освоить язык ХМ1</Краткое_х0020_описание>
<Подробное_х0026_описание*Это новое официальное издание Справочника по XML предоставляет разработчикам законченное руководство, помогающее быстро освоить язык ХМ1«/Подробное_х0020_описание>
<Цена>39,95</Цена>
«/Книги*
«Книги*
<ISBN*0596002378</ISBN>
«Название*5АХ2«/Название*
«Подзаголовок*3ффективная обработка XML средствами Jауа«/Подзаголовок* <Краткое_х0020_описание*Эта небольшая книга предоставляет все необходимые сведения по эффективному применению Simple API для XML, основного интерфейса прикладного программирования, предназначенного для обработки XML средствами языка Java.</Краткое_х0029_описание>
<Подробное_х0020_описание*Эта небольшая книга предоставляет все необходимые сведения по эффективному применению Simple API для XML. основного интерфейса прикладного программирования, предназначенного для обработки XML средствами языка Java.</Подробное_х0020_описание>
<Цена*29,95</Цена>
«Продвижение*
<ПродвижениеЮ>2</Продвижение!О*
«Книга1О*0596002378«/КнигаЮ>
«Название*Бесплатные фильтры*/Название*
<Место_х0020_распространения*Интернет/5аСari </Место_х0020_распространения* <Описание*Всем разработчикам, посетившим веб-сайт, посвященный книге 5АХ2, -■ SAX-фипыры, имеющие лицензию открытого программного продукта, в подарок.*/ Описание*
«Расходы*0</Расходы*
«/Продвижение*
«/Книги*
«/dataroot*
Общая структура представленных в примере данных во многом похожа на структуру данных, экспортированных из таблицы Книги, отличие заключается в появлении внутри каждого элемента Книги от нуля до нескольких элементов Продвижение, у которых вложенный элемент КнигаЮ содержит такое же значение, что и элемент ISBN, вложенный в элемент Книги. Точно так же и внутри корневого элемента dataroot может появиться от нуля и до нескольких элементов Книги. Внутри каждого элемента Продвижение присутствуют все столбцы таблицы, облегчая реконструкцию информации, имеющейся в таблице Продвижение, или обработку информации в виде полного информационного блока, относящегося к каждсй книге. При реконструкции исходных таблиц вам не понадобится вычислять связи первичного и внешнего ключей.
Как только вы выйдете за рамки связи один-ко-многим, вам уже будет не хватать простого включения данных одной таблицы в данные другой.
Экспорт данных из таблиц, имеющих связь многие-ко-многим
Связь многие-ко-многим, осуществляемая с использованием промежуточной таблицы (рис. 7.38), приводит к созданию XML-данных, которые, скорее всего, могут пригодиться лишь для реимпорта их в Access для последующей обработки.
Рис. 7.38. Таблицы, связанные отношением многие-ко-многим, выраженным через два отношения один-ко-многим
Access позволяет прослеживать эту связь в экспорте ХМ L (рис. 7.39). Теперь экспорт использует элемент [Данные подстановки], который указывает, что простое включение данных в структуру документа XML работать не будет. Связи один- ко-многим представлены включением данных, а связи многие-ic-одному представлены обособленными фрагментами данных. В нашем случае связь многие- ко-многим содержит оба этих варианта.
Рис. 7.39. Экспорт связанных таблиц, имеющих отношение многие-ко-многим
Элемент [Данные подстановки] служит предупреждением, что обратная сборка некоторых из этих связей потребует дополнительной поисковой работы со стороны приложения, воспринимающего эти данные.
Если данные будут реимпортированы в Access, работа по обратной сборке будет проделана без проблем. В примере 7.7 доказаны результаты экспорта данных.
Пример 7.7. Экспортированные данные, имевшие связь многие-ко-многим, сочетают включенит и подстановки
<?xml version="1.6" encoding="UTF-8"?>
<dataroot xml ns: od=’’urn; schemas-microsoft-com: off Icedata" xml ns :xsi="http:Л www.w3,org/2001/XML5chema-instante"
xsi:noNamespace Schema Lotatiоп="Книги. xsd" generated="2006-03-10T21: 42 :55">
<Книги>
<I5BN>0596005385</ISBN>
<Название>0сновы применения XML в Office 2603</Название> «ПодзаголовокхИнтеграция Office в мировую информационную средук/ Подзаголовок^
<Краткое_х0020_описание>М1crosoft добавила обширную функциональную поддержиV XML не только в Word, Excel и Access, но и в новое приложение, Microsoft InfoPath, Книга призвана призвана побудить читателей использовать эти новые возможности.</Краткое_х0020_описание>
<Подробное_х0020_описание>М1сrosoft добавила обширную функциональную поддержку XML не только a Word. Excel и Access, но и в новое приложение, Microsoft InfoPath. Книга, призвана побудить читателей использовать эти новы; возможности.«/Подробное_х0020_описэние>
<Цена>34,95</Цена>
<СвязьАвтораКниги>
<15ВМКниги>05960053В5</15ВНКниги>
«Автор!0>1</Автор1С>
</СвязьАетораКниги>
к/Книгих
<Книги>
<ISBN>0596002920</I5BN>
<Название>Спраеочник по XML, 2-е издание</Название>
<Подзаголовок>Настольный справочник</Подзаголовок!
<Краткое_х0020_описание!Это новое официальное издание Справочника по XML предоставляет разработчикам законченное руководство, помогающее быстро освоить язык ХМ1</Краткое_х6020_описание>
кПодробное_хВ020_описание>Это новое официальное издание Справочника по XML предоставляет разработчикам законченное руководство, помогающее быстро освоить язык ХМ1</Подробное_х0020_описание>
<Ценах39,95</Цена>
<СвязьАвтораКниги>
<15ВМКниги>059Б002920</16ВМКниги>
«Автор! 0>3</АаторЮ!
</СвязьАвтораКниги>
<СвязьАвтораКниги>
<15ВНКниги>0596002920</1$В«Книги>
<Автор!0>4</Автор! D>
</СвязьАвтораКниги>
</КНИГИ!
<Книги>
<I5BN>0596002378</I5BN>
<Название>5АХ2</Название!
<Подзаголовок>Эффективная обработка XML средствами Зауа</Подзаголовок> <Краткое_х8020_описание>Эта небольшая книга предоставляет все необходимые сведения по эффективному применению Simple API для XML, основного интерфейса прикладного программирования, предназначенного для обработки XML средствами языка Java.</Краткое_Х0020_описание!
<Подробное_х0020_описание>Эта небольшая книга предоставляет все необходимые сведения по эффективному применению Simple API для XML, основного интерфейса прикладного программирования, предназначенного для обработки XML средствами языка Java,</Подробное_х002В_описание>
<Цена>29,95</Цена>
<СвязьАвтораКниги>
<15ВНКниги>0596002378</15ВНКниги>
<Автор10>2</Автор!D>
</СаязьАвтораКниги>
</Книги>
<Авторы>
<Автор10>1</Автор!D>
<Имя>Симон</Имя>
<Фамилия>Сен-Поран</Фамилия>
<Полное_хЭ020_имя>Симон Сен-Поран</Попное_хВ020_имя>
</Авторы>
<Авторы>
<АвторЮ>2</АвторЮ>
<Имя>Дэвид</Имя>
«Фамилия>Браунелл</Фамилиям
<Полное_х0020_имя>Дэвид Браунепл</Полное_х0020_имя>
</Авторы>
<Авторы>
<АвторЮ>3</АвторЮ>
<Имя>Эллиот</11мя>
<Фамилия>Харольд</Фамипия>
<Полное_х9620_имя>Эллиот Расти Харольд</Полное_х0020_имя>
</Авторы>
<Авторы>
«АвторW>4</Автор!D>
<Имя>Скотт</Имя>
<Фамипия>Минз</Фамилиях
<Полное_х0020_имя>В. Скотт Минз</Полное_хВВ2В_имя> «/Авторы^
</dataroot>
Теперь каждый элемент Книги содержит один или несколько элементов СвязьАв- тораКниги, в каждом из которых имеется вложенный элемент’ Автор! D. Значение этого элемента АвторЮ соотносится со значением элемента АвторЮ, вложенного в элемент Авторы, Хорошо, если данные возвращаются в Access, но если они попадают в другое приложение, возможно в Excel, или будут преобразованы при помощи XSLT в HTML, используемый в браузере, тут уже дела пойдут не так гладко.
Может показаться, что в таблицах намеренно хранились повторяющиеся (неупорядоченные) данные. Чтобы избежать такого впечатления, есть более достойный выбор: экспортировать данные не из таблицы, а из запроса.
Формирование структуры экспортируемых данных на основе запроса
Запросы сами по себе не обеспечивают вложенный просмотр, но они, безусловно, облегчают представление некоторых видов информации, особенно имеющей связи многие-ко-многим. Механизм экспортирования запросов во многом похож на экспорт отдельных таблиц, получаемые при этом результаты также схожи.
ВНИМАНИЕВНИМАНИЕПоскольку запросы в формате SQL являются функциональной основой Access, в тем, что эта система их поддерживает, сомневаться не приходится. А вот другие стандарты, используемые для составления запросов, такие как XQuery, Access не псд- держивает.
ВНИМАНИЕ
ВНИМАНИЕ
Для примера экспортируем SQL-запрос под названием КнигиПоАвторам, в котором для создания перечня книг, отсортированного ио авторам, используются таблицы Книги, Авторы и СвязьАвтораКниги. В инструкции SQL, составленной для этого запроса, отражены связи между таблицами, которые при иных обстоятельствах ирги пл ось бы учитывать самому процессору XML:
SELECT Авторы,Имя, Авторы.Фамилия, Книги.ISBN. Книги.Название
FROM Книги INNER JOIN (Авторы INNER JOIN СеязьАвтораКниги ON Авторы.АеторЮ = СвязьАвтораКни г и.Автор ID) ON Книги.ISBN = СвязьАвтораКниги.ИВККниги ORDER BY Авторы.Фамилия;
Для экспорта запросов используется тот же интерфейс, что и для экспорта таблиц, за исключением того, что в нем отсутствует возможность включения в экспортируемые данные связанной информации. Вся предназначенная для экспорта информация должна быть представлена в экспортируемом запросе. Результат экспорта данных из запроса показан в примере 7.8.
Пример 7.8. Экспортированный запрос
<?xml ver sion="1.0" encoding="UTF-8"?*
«dataroot xmlns:od=’'urn: schemas - mi crosoft - com :officedata" xmlns: xsi="http: / / www. w3 . org/2001/XMLSchenia- i nstance"
xsi:noNamespaceSchemaLocation="КнигиПоАвторам.xsd" generated="2S06-03- 11TM:26:57">
«КнигиПоАвторам*
<Имя>Дэвид«/Имя>
«Фамилия>Браунелл«/Фамилия*
«ISBN*0596002378«/ISBN>
<Название*5АХ2</Название*
«/КнигиПоАвторам*
«КнигиПоАвторам*
<Имя*Скотт</Имя>
«Фамилия*Минз«/Фамилия*
<I5BN>0596002920</ISBN*
<Название*Справочник по XML, 2-е издание«/Название*
«/КнигиПоАвторам*
«КнигиПоАвторам*
<Имя*Симон</Имя *
<Фамилия*Сен-Лоран«/Фамилия*
<ISBN*0596005385</ISBN>
<Название>0сновы применения XML в Office 2003</Название>
«/КнигиПоАвторам*
«КнигиПоАвторам*
«Имя>Элпиот</Имя>
<Фамилия*Харольд</Фамипия>
<I5BN*0596002920«/ISBN>
<Название*Слравочник no XML, 2-е издание«/Название>
«/КнигиПоАвторам*
«/dataroot*
В экспортированных данных существуют те же повторы, что и в табличном представлении запроса: обратите внимание на ISBN и название книги Справочник по XML, 2-е издание, которая написана двумя авторами. Если вы отправляете данные приложению, которое не в состоянии определить установленную Access связь между таблицами, данный подход позволит упростить поставленную задачу.
См. также «Импорт в Access различных XML-данных» (Трюк № 63) и «Преодоление барьера преобразования при использовании VBA» (Трюк № 65).
ТРЮК№ 65ТРЮК№ 65Преодоление барьера преобразования при использовании VBA
ТРЮК
№ 65
ТРЮК
№ 65
Как ни странно, Access поддерживает XSLT-преобразование только при использовании графического интерфейса, но не дает такой возможности при автоматизации процесса с помощью VBA. Это же относится и к выводу данных. Тем не менее вы можете решить згу проблему, вызвав MSXML-napcep напрямую.
Примеры из раздела «Импорт в Accessразличных XML-данных» (Трюк № 63) дают некоторое представление о том, как можно поместить информацию в таблицы Access, даже если она поступает в неожиданном для Access формате, который допускает размещение данных не только внутри XML-элементов. Но если такие данные поступают регулярно, вам, скорее всего, не захочется каждый раз щелкать на кнопках форм, используемых для импорта.
К сожалению, автоматизация всех стадий этого процесса средствами VBA весьма проблематична, поскольку функция ImportXML не предусматривает каких-либо преобразований. Как оказалось, на это не способна и функция ExportXML.
Функция ImportXML использует следующий синтаксис:
Application.ImportXML (ИсточникДанных, РежимИмпорта)
Она воспринимает только сведения об источнике данных, то есть имя импортируемого X ML-файл а и путь к нему, а также константу режима импорта — acAppendData, acStructureAndData (используется по умолчанию) или acStructureOnly. Выбор режима XSLT-преобразованпя отсутствует. Функция ExportXML использует следующий синтаксис:
Application.ExportXML (ObjectType, DataSource, DataTarget, SchemaTarget, PresentationTarget. ImageTarget, Encoding, OtherFlags)
Аргумент PresentationTarget имеет некоторое отношение к преобразованиям, но они касаются только вывода данных. Он определяет, куда Access поместит таблицу стилей для преобразования XML в HTML, основанную на своих, а не на ваших ожиданиях.
Решить эту проблему можно двумя способами. Во-первых, вы можете написать собственный код. Для импорта данных можно применить XML-napcep (возможно, MSXML), считать содержимое документа, который, по вашему мнению, подходит для этих целей, а затем воспользоваться ADO, DAO или SQL-запросом Update для того, чтобы поместить данные в таблицу. Экспортная версия будет считывать данные из базы и записывать их в структуру дерева MSXML DOM в требуемом виде.
Такой подход может оказаться приемлемым в более сложных ситуациях, но эн потребует слишком объемного кода для решения нашей, сравнительно несложной, проблемы. Кроме того, вы не сможете протестировать работу такой процедуры (или воспользоваться ею) вне среды Access.
Если вы действительно должны работать с XSLT, предпочтительнее добавление еще одного этапа перед импортом или после экспорта, в течение которого будет проведено дополнительное преобразование. Поскольку Access не позволяет передавать объекты для импортирования или получать экспортируемые объекты, для получения желаемого результата придется работать с временными файлами. Удсб- ство заключается в том, что вы сможете использовать одни и те же функции в обоих случаях.
Простая версия такой функции выглядит следующим образом:
Private Sub Transform(sourceFile, stylesheetFile. resultFile)
Dim source As New M5XML2.DOMDocumentSS
Dim stylesheet As New MSXML2.DOHDocument30
Dim result As New M5XML2,DOMDocument33
' Загрузка данных.
source.async = False source.Load sourcefile
* Загрузка таблицы стилей.
stylesheet.async = False
stylesheet.Load stylesheetFile
If (source.parseError.errorCode <> B) Then
MsgBox ("Ошибка загрузки исходного документа: " _
& source .parseError.reason) Else
If (stylesheet.parseError.errorCode <> 0) Then
MsgBox ("Ошибка загрузки таблицы стилей документа: " _
& stylesheet.parseError.reason) Else
' Преобразование.
source.transformNodeToObject stylesheet, result result.Save resultFile
End If
End If
End Sub
Функция Transform воспринимает три аргумента: путь к исходному файлу, содержащему подлинник XML, путь к файлу таблицы стилей, содержащему XSLT, который будет использован для преобразования первого файла, и путь, который будет использован для хранения документа, полученного в результате преобразования. Целесообразно вызвать функцию Transform перед использованием принадлежащей Access функции ImportXML или после использования функции ExportXML.
Например, вы сможете напрямую импортировать XML-файлы в таблицу с помощью следующего вызова функции:
Application.ImportXML "http://simonst1.com/ora/updateBook, xml". acAppendDa :a
Но если в XML-файле данные будут храниться в атрибутах элементов и вы захотите преобразовать эти данные перед их импортированием в Access, то вместо этого вам нужно сделать следующее:
Transform "http://simonstl.com/ora/updateBook.xml", _ "C:\xslt\attsToElem.xsl", _ "C:\temp\templmport.xml"
Application.ImportXML "C:\temp\templmport.xml", acAppendData
Также вы можете применить преобразование после экспорта данных, превращая их в HTML-файл:
Application,ExportXML acExportTable, "books", "C:\temp\tempExport.xml" Transform "C:\temp\tempExport.xml", _
"C:\xslt\booksToHTML.xsl", _
"C:\export\exportedBooks.html"
Запись документов формата XML в файлы с их последующим приведением к другому синтаксису трудно признать эффективным решением, но в данном случае именно этот прием позволяет закрыть брешь, оставленную в интерфейсе прикладного программирования Access в вопросах импорта и экспорта XML. Пока вы не столкнетесь с громадными объемами данных или с постоянной необходимостью использования импортно-экспортных операций, пользователи вашей базы данных, скорее всего, не заметят большой задержки от создания промежуточных файлов. В принципе, операции импорта и экспорта никогда не выполнялись быстро.
См. также «Импорте Access различных XML-данных» (Трюк № 63) и «Рациональный способ экспорта данных в формат XML» (Трюк №64).
ТРЮК№ 66ТРЮК№ 66Повышение производительности SQL Server за счет вызова хранимых процедур
ТРЮК
№ 66
ТРЮК
№ 66
Повышение производительности работы при использовании данных SQL Server,
Разработчики, создающие приложения Access, используемые в качестве интерфейса для баз данных SQL Server, могут выбрать один из двух вариантов. Компания Microsoft рекомендует воспользоваться проектом Access data project (ADP), который напрямую связан с базой данных SQL Server. В результате автономного режима подключения OLE DB получается компактный, высокоскоростной интерфейс, способный напрямую использовать средства просмотра SQL, хранимые процедуры, а также функции, созданные пользователем. Разработчики также могут напрямую создавать серверные объекты (не используя Enterprise Manager).
Несмотря на все эти преимущества, в традиционных для Access MDB-файлах разработчики зачастую вынуждены использовать таблицы, связь с которыми устанавливается через ODBC. Главным образом это обусловлено возможностью создавать локальные таблицы в MDB (в A DP на сервере могут присутствовать только таблицы, представленные в главном окне) и возможностью подключаться к другим источникам данных (таким, как другие базы данных Access, таблицы Excel, текстовые файлы и т. д.). Выбор в качестве интерфейсной части формата MDB
еще не означает, что вы должны отказаться от возможностей использования потенциала хранимых в SQL Server процедур.
Подключение с использованием ODBC
Когда в Access MDB используются ODBC-связи с SQLServer, вся обработка да т- ных ведется на стороне клиента, то есть па рабочем месте вод управлением Access. Если установленный в форме список подвергается фильтрации на основе значения, выбранного из поля со списком, все записи но сети возвращаются Access, а затем Access их фильтрует. Использование вместо этого хранимых процедур позвэ- лит повысить производительность Access MDB за счет передачи серверу задачи ио фильтрации данных. Мощность хранимых процедур основана на сочетании возможностей объединения данных, присущих запросам Access или просмотрам SQL, с возможностями VBA-процедур по восприятию параметров, организат и циклов и обработке данных.
Используемая в Microsoft SQL Server версия языка SQL — T-SQL - несколько отличается от версии SQL. используемой в Jet (ядре Access). Она также во многом отличается и от VBA. Тем не менее если вы освоили создание запросов Access и функций VBA, то научитесь создавать и хранимые процедуры SQL. Приобре :- ти достаточную квалификацию в работе с Т-SQL для повышения производится >- ности своих приложений не так уж и сложно. Независимо оттого, что именно вы установите на компьютере — MSDE (упрощенную версию SQL Server, поставляемую с Microsoft Office) или сам SQL Server, для начала вы можете просмотреть хранимые процедуры, имеющиеся в базе данных Борей (Northwind).
Одним из способов выполнения хранимых процедур в Access является использование библиотеки ADO. В VBА это делается с помощью выполнения метода Execute объекта Command, который в свойстве CommandText содержит имя процедуры. Сначала нужно создать объект Connection в базе данных SQL Server. В программном коде примера 7.9 выполняется хранимая процедура CustOrdersOrders, поставляемая с базой данных Борей (Northwind), предъявляющая несколько необычное значение для индекса customerid — ALFKI, используемое для заполнения набора записей ADO всеми заказами, сделанными клиентом по имени Alfreds Futterkiste.
Пример 7.9. Запуск хранимой процедуры
Dim cn As ADODB.Connection
Dim sp As ADODB.Command
Dim rs As ADODB.Recordset
Set cn = Mew ADODB.Connection
cn.Connect!onString = Cur tentDb.TabieDefs("dbo_customers").Connect
cn.Open
Set sp = New ADODB,Command
sp.ActiveConnection = cnSQL
sp.CommandType = adCmdStoredProc
sp.CommandText = "CustOrdersOrders11
sp.Parameters.Refresh
sp.Parameters("@customerid") = "ALFKI"
Set rs = sp.Execute
Но в данной ситуации Access не может использовать наборы записей ADO. Хотя с выпуском каждой новой версии Access становится намного ближе к ADO.
Access 2003 по-прежнему слишком привязана к технологи и DAO — Microsoft даже вернула связь с DAO в VBA по умолчанию, после того как исключила эту связь из Access 2002 (ХР). Информационной основой формы ввода, имеющей в качестве источника записей связанную таблицу, может служить набор записей, для создания которого применена не ADO, a DAO. Такие элементы управления, как поля со списками или списки в свободных или связанных с DAO формах, также нуждаются в наборе записей DAO.
Создание запроса к серверу
Access может воспользоваться мощностью хранимых процедур и получить набор записей DAO, заполненный данными, подобранными в результате работы хранимой процедуры, с помощью редко используемого свойства под названием запрос к серверу. Создание запроса к серверу является относительно простой задачей, в результате выполнения которой будет получен набор записей DAO, пригодный для использования в объекте или элементе управления Access, воспринимающем запрос в качестве источника данных.
Для создания запроса к серверу нужно в окне базы данных выбрать раздел Запросы и щелкнуть на команде Создать. Затем выбрать режим создания Конструктор и щелкнуть на кнопке ОК. Чтобы сразу попасть в режим Конструктора, в окне Добавление таблицы щелкните на кнопке Закрыть. В меню Запрос щелкните на пункте Запрос SQL, а затем на пункте К серверу (рис, 7.40).
Рис, 7.40. Создание запроса к серверу
Конструктор запросов переключится на режим просмотра инструкции SQL, в котором можно вводить только эти инструкции. Введите в окне просмотра инстру к- ций SQL строку CustOrdersOrders 1 ALFKI *. При сохранении запроса присвойте ему имя qry_Cust0rder$0rders_pt
На данном этапе Access еще не знает, куда направить этот запрос. При его первом выполнении вам будет предложено выбрать источник данных. Выберите тот :ке источник данных, который использовался для связи с таблицами SQL. После выбора подходящего источника данных Access пошлет строку SQL, содержащу ося в запросе, на сервер, и SQL запустит хранимую процедуру и вернет Access результаты, показанные на рис. 7.41.
1064325 08 200522 09 203502 09,20051069203.10.2005Э1 10 200513.10.20051070213 10.200524.11 200521.10 2005108351501 200612 02 200.' 21.01.20061095216 03 200627 04 200624.03.20061101109 04 200607 05 200613.04.20061064325 08 200522 09 203502 09,20051069203.10.2005Э1 10 200513.10.20051070213 10.200524.11 200521.10 2005108351501 200612 02 200.' 21.01.20061095216 03 200627 04 200624.03.20061101109 04 200607 05 200613.04.2006ЮдЗа^за "} ДатаЗаказа ^рсиЩогтавки ГДа^аДоставкиЮдЗа^за "} ДатаЗаказа ^рсиЩогтавки ГДа^аДоставкиРис. 7.41. Данные, возвращенные хранимой процедуройРис. 7.41. Данные, возвращенные хранимой процедурой’ ЕОи.И « 6’ ЕОи.И « 6
10643
25 08 2005
22 09 2035
02 09,2005
10692
03.10.2005
Э1 10 2005
13.10.2005
10702
13 10.2005
24.11 2005
21.10 2005
10835
1501 2006
12 02 200.
' 21.01.2006
10952
16 03 2006
27 04 2006
24.03.2006
11011
09 04 2006
07 05 2006
13.04.2006
10643
25 08 2005
22 09 2035
02 09,2005
10692
03.10.2005
Э1 10 2005
13.10.2005
10702
13 10.2005
24.11 2005
21.10 2005
10835
1501 2006
12 02 200.
' 21.01.2006
10952
16 03 2006
27 04 2006
24.03.2006
11011
09 04 2006
07 05 2006
13.04.2006
ЮдЗа^за "} ДатаЗаказа ^рсиЩогтавки ГДа^аДоставки
ЮдЗа^за "} ДатаЗаказа ^рсиЩогтавки ГДа^аДоставки
Рис. 7.41. Данные, возвращенные хранимой процедурой
Рис. 7.41. Данные, возвращенные хранимой процедурой
’ ЕОи.И « 6
’ ЕОи.И « 6
ТРЮК№ 67ТРЮК№ 67Управление документами Word из Access
ТРЮК
№ 67
ТРЮК
№ 67
Использование объектной библиотеки Word для копирования данных Access непосредственно в документ Word.
Как и все программные продукты, относящиеся к Microsoft Office, Word содержит множество готовых к использованию открытых объектов и методов, часть из которых заслуживает изучения.
В данном трюке создается процедура, помещающая данные из Access в табли ту документа Word. Замысел трюка обращен также и к другим вариантам использования Word. Возможно, его изучение станет для вас неким трамплином для достижения новых высот в создании приложений в среде Microsoft Office.
Привязка к Word
Мы намерены поместить в программный модуль Access процедуру, работающею с существующим документом Word. Для упрощения поставленной задачи мы создадим ссылку на объектную библиотеку Word. Для этого нужно, находясь в Access, войти в редактор VB и воспользоваться диалоговым окном References, вызываемым по команде Tools ► References (рис. 7.42). Учтите, что имеющаяся у вас версия библиотеки Word может отличаться от указанной, поэтому используйте ту версию, которая есть в вашем распоряжении.
Код
Теперь следует набрать программный код. Его нужно поместить в программный модуль Access:
Рис. 7.42. Установка ссылки на объектную библиотеку Word object library
Sub Access_to_Word( )
Dim conn As ADODB.Connection
Set conn = CurrentProject.Connection
Dim recset As ADODB.Recordset
Set recset = New ADODB.Recordset
Dim row_num As Integer
Dim col_num As Integer
Dim word_doc As Object
'Предполагается, что документ Word находится в том же каталоге.
'если это не так - задайте правильное имя и путь
Set worddoc = GetObject(Application.CurrentProject.Path & "ХКлиенты.бос")
’получение данных из таблицы Access
recset.Open "Select * From Клиенты Where КодРегиона='99'", _
conn, adOpenKeyset. adLockOptimistic
'получение числа записей для использования при создании таблицы Word recset.MoveLast
recset .MoveFirst
With worddoc
'переход к закладке Word и создание таблицы
'количество строк таблицы совпадает с показанием счетчика записей
'количество столбцов таблицы совпадает с количеством полей набора записей .ВооктагкзС'Клиенты") .Select
.Tables.Add Range:=Selection.Range, _
NumRows:=recset.RecordCount. NumColumns: = recset.Fields.Count
For row_num = 1 To recset.RecordCount
For col_num = 1 To recset.Fields.Count
.Tables(.Tables.Count).Cel I(row_num. col_num).Select
Selection.TypeText recset.Fields(col num - 1),
234
Next colnum
'переход к следующей записи
recset.MoveNext
Next row_num
End With
recset.Close
Set recset = Nothing
Set worddoc = Nothing
MsgBox "Гotobo!"
End Sub
Основные особенности представленного программного кода:
Данные Access переносятся в набор записей (recordset).
Функция GetObject создает указательна существующий документ Word. Имейте в виду: в примере предполагается, что база данных и документ находятся в одном и том же каталоге. К тому же и имя документа жестко задано в программе, но вы, при необходимости, можете изменить эти установки.
В документе имеется заранее созданная закладка, названная Клиенты. Она служит указателем места создания таблицы.
При создании таблицы Word в качестве ее размеров но строкам и столбцам выступают соответствующие данные набора записей. Тем самым обеспечивается правильный размер вновь создаваемой в Word таблицы, позволяющий уместить в ней все данные.
:^ Клиенты Ак Mkrnstah Word" ’ ^'-^^- -.>- ^^^v^. vr^^.^w:
;,^.. 5^^^ *^ № Л -—- - -—- ^7 9WlBn;,^.. 5^^^ *^ № Л -—- - -—- ^7 9WlBnЯЛЫМдВЩМЯЛЫМдВЩМ1289МатвеекВикторПетровичСерпуховТрудовая 3148993245СухаревВладимирИвановичЧеховМира 12-67992 706ФедотовАлександрНиколаевичНогинскСадовая 23-41998720. СеменовПетрСергеевичНарифо.мыискБереговая 12-9. 995187АстаховНиколайПетровичБалашихаФруктовая 56-34992765Беретки»АндрейВикторовичПодольскЖуком 2-35994109ДмитриевВасилий: МихайловичКрасногорскВесенняя 22-18993961ПетровАлексей■ СеменовичЭлектростальЮности 11-71289МатвеекВикторПетровичСерпуховТрудовая 3148993245СухаревВладимирИвановичЧеховМира 12-67992 706ФедотовАлександрНиколаевичНогинскСадовая 23-41998720. СеменовПетрСергеевичНарифо.мыискБереговая 12-9. 995187АстаховНиколайПетровичБалашихаФруктовая 56-34992765Беретки»АндрейВикторовичПодольскЖуком 2-35994109ДмитриевВасилий: МихайловичКрасногорскВесенняя 22-18993961ПетровАлексей■ СеменовичЭлектростальЮности 11-7Список клиентовСписок клиентова™?^?^^^^^^_и |I ;',$ *।■ t,। ।:•।. i:н л ।।‘. ■а™?^?^^^^^^_и |I ;',$ *।■ t,। ।:•।. i:н л ।।‘. ■
;,^.. 5^^^ *^ № Л -—- - -—- ^7 9WlBn
;,^.. 5^^^ *^ № Л -—- - -—- ^7 9WlBn
ЯЛЫМдВЩМ
ЯЛЫМдВЩМ
1289
Матвеек
Виктор
Петрович
Серпухов
Трудовая 3148
99
3245
Сухарев
Владимир
Иванович
Чехов
Мира 12-67
99
2 706
Федотов
Александр
Николаевич
Ногинск
Садовая 23-41
99
8720
. Семенов
Петр
Сергеевич
Нарифо.мыиск
Береговая 12-9
. 99
5187
Астахов
Николай
Петрович
Балашиха
Фруктовая 56-34
99
2765
Беретки»
Андрей
Викторович
Подольск
Жуком 2-35
99
4109
Дмитриев
Василий
: Михайлович
Красногорск
Весенняя 22-18
99
3961
Петров
Алексей
■ Семенович
Электросталь
Юности 11-7
1289
Матвеек
Виктор
Петрович
Серпухов
Трудовая 3148
99
3245
Сухарев
Владимир
Иванович
Чехов
Мира 12-67
99
2 706
Федотов
Александр
Николаевич
Ногинск
Садовая 23-41
99
8720
. Семенов
Петр
Сергеевич
Нарифо.мыиск
Береговая 12-9
. 99
5187
Астахов
Николай
Петрович
Балашиха
Фруктовая 56-34
99
2765
Беретки»
Андрей
Викторович
Подольск
Жуком 2-35
99
4109
Дмитриев
Василий
: Михайлович
Красногорск
Весенняя 22-18
99
3961
Петров
Алексей
■ Семенович
Электросталь
Юности 11-7
Список клиентов
Список клиентов
а™?^?^^^^^^_
и |I ;',$ *।■ t,। ।:•।. i:н л ।।‘. ■
а™?^?^^^^^^_
и |I ;',$ *।■ t,। ।:•।. i:н л ।।‘. ■
8* * Т«:^:
Рис. 7.43. Данные из Access, помещенные а таблицу Word
■ Таблица Word заполняется последовательно, по ячейкам, в процессе циклического перебора набора записей. Внешний циклический процесс перебирает строки набора записей, а внутренний — поля.
Цельное размещение данных
После запуска программного кода в документе появляется таблица, показанная на рис. 7.43. Учтите, что обратной связи с Access не существует, и, по сути, данные являются частью документа Word.
Заметьте, что данный упрощенный пример имеет ряд допущений: наличие закладки, отсутствие заранее существующей таблицы и умеренное количество записей и полей таблицы Access, что и определяет требуемую компактность таблицы Word.
Несмотря на это, данный трюк служит кратким вводным курсом по внедрению в объекты редактора Word. Поскольку ссылка на объектную библиотеку уже установлена, вы сможете изучить объекты Word с помощью специального средства Object Browser.
ТРЮК№ 68ТРЮК№ 68Использование Access в качестве интерфейсной части базы данных MySQL
ТРЮК
№ 68
ТРЮК
№ 68
MySQL - широко распространенное открытое программное средство для управления базами данных, часто работающее на веб-серверах под управлением ОС Linux, a Access способна стать замечательным интерфейсом для ввода данных и составления отчетов.
MySQL представляет собой весьма успешно применяемую открытую базу данных, основанную на языке SQL, которая работает на большинстве веб-серверов под управлением Linux. Эта база данных замечательно справляется с задачей хранения информации для веб-сайтов, которые строят свою работу на ее использовании, поскольку для чтения данных из базы MySQL и отображения ее на веб-страницах можно применять язык программирования PHP. Фактически комбинация из Linux, Apache (открытый веб-сервер, работающий под управлением Linux), MySQL и PHP стала настолько популярной, что приобрела собственную аббревиатуру: LAMP.
Е io когда дело доходит до форм и отчетов. MySQL не идет ни в какое сравнение с Access. MySQL не имеет встроенного редактора форм или генератора отчетов. Вместо этого для ввода, редактирования и отображения информации приходится набирать в командной строке команды или составлять программы (зачастую в виде составных частей веб-страниц па основе PHP).
Но кому захочется создавать программы, отображающие формы ввода данных для каждой таблицы? Вот здесь-то и понадобится Access. Именно Access поможет добавить к вашей базе данных MySQL удобный интерфейс. Поскольку база данных Access способна создавать связи с таблицами другой базы данных Access, можно организовать связь с таблицами базы данных MySQL, находящимися на вашем веб-сервере, по локальной сети или через Интернет. После установки связи с таблицами вы (или пользователи вашего приложения) можете использовать
формы Access для ввода или редактирования данных MySQL и отчеты Access для отображения этих данных.
Установка инструментария MySQL
В MySQL есть утилита, работающая под управлением Windows, которую можно использовать для создания и редактирования структуры таблиц в этой базе да I- ных. Более ранняя версия программы называлась MySQL Control Center и была заменена программой MySQL Query Browser. Обе программы вы можете свободно загрузить с веб-сайта MySQL (http://dev.mysqL.com/downloads/). Руководство по использованию программы MySQL Query Browser доступно по адресу http:// dev.mysqL.com/doc/query-browser/en/, вы также можете загрузить его в формате РЕК или файла справки Windows.
При запуске MySQL Query Browser вы должны указать сервер, на котором запущена MySQL, свое регистрационное имя и пароль. После установки связи вы увидите список таблиц, к которым вам открыт доступ, и сможете просматривать и редактировать данные или структуру этих таблиц (рис. 7.44).
Рис. 7.44. Окно программы MySQL Query Browser
Программа MySQL Query Browser при всем своем удобстве не может быть инст рументальным средством, предназначенным для передачи пользователям базы данных, К примеру, вы не можете создавать формы с проверкой правильности вносимых данных, поля со списком или подчиненные формы, а также формат - зованные отчеты. Для этого вам нужна база данных Access,
Для подключения Access к базе данных MySQL потребуется установить драйвер MySQL Connector/ODBC (называемый также MySQL ODBC или MyODBC driver). Этот драйвер откроет возможность взаимодействия с MySQL через Орет DataBase Connectivity (ODBC). Вы можете свободно загрузить драйвер MySQ- ODBC с веб-сайта http://dev.mysql.com/downloads/. 11осле его установки в окне базы
данных Access появится новая возможность для создания связи с внешними таблицами.
Не нужно устанавливать программу MySQL Query Browser на каждый компьютер, на котором работает ваша база данных Access. Она понадобится только в том случае, если вы планируете просматривать или изменять структуру таблиц в базе данных MySQL. Но на каждом компьютере с вашей базой данных Access нужно установить драйвер MySQL ODBC, поскольку Access использует его всякий раз при открытии связанной таблицы MySQL.
Если вы планируете подключаться к базе данных MySQL по Интернету, ваши запросы, возможно, должны будут пройти через один или несколько брандмауэров. Связь с драйвером MySQL ODBC осуществляется с использованием порта 3306, поэтому данный порт должен быть открыт на всех брандмауэрах на пути между вашим компьютером и сервером MySQL. В том случае, если ваш MySQL- сервер настроен на использование порта с нестандартным номером, вы можете при создании ссылки из Access на MySQL назначить другой порт.
Создание связи с таблицами MySQL
После установки драйвера MySQL ODBC создание связи Access с таблицами MySQL проводится в два этана: проверка таблиц на наличие нужных полей и установка связи. Работоспособность связи Access/MySQLnpH редактировании данных, содержащихся в таблицах, предполагает наличие в каждой из таблиц следующих двух полей (название которых не имеет значения):
Счетчик (AutoNumber)
В MySQL это поле типа INT (integer) размером в 11 знаков и установленными флажками UNSIGNED и AUTO INC (автоувеличение). Это поле должно быть ключевым.
Дата (Date)
Это поле обновляется автоматически при каждом редактировании записи. В MySQL это поле имеет тип TIMESTAMP.
У большинства таблиц эти поля уже имеются; при создании таблиц использование поля счетчика в качестве первичного ключа является правилом хорошего тона. Тем не менее, если эти поля отсутствуют, вам следует воспользоваться программой MySQL Query Browser или каким-нибудь другим инструментом для их создания.
Создание связи в Access не займет много времени. Откройте диалоговое окно Связь, выбрав команду Файл ► Внешние данные ► Связь с таблицами. В раскрывающемся списке Типы файлов выберите пункт Базы данных ODBS(), после чего появится диалоговое окно Выбор источника данных со списком ранее использовавшихся баз данных ODBS в виде файлов Data Source Name (DSN), в которых содержится информация, необходимая базе данных для установки связи. Если вы открываете таблицу, принадлежащую ранее использовавшейся базе данных, щелкните на кнопке ОК и выберите таблицу, с которой устанавливается связь.
Если вы устанавливаете связь с базой данных MySQL впервые, щелкните на кио 1- ке Создать в окне Выбор источника данных, выберите из списка драйверов MySQL ODBC Driver (ближе к концу), щелкните на кнопке Далее, укажите имя DSN-файла, создаваемого для хранения информации о подключении, и щелкните на кнопке Гэ- тово. Вы увидите диалоговое окно MySQL ODBC Driver DSN Configuration, показанное на рис. 7.45.
Рис. 7.45. Указание сведений, необходимых для установки подключения к базе данных MySQ.Рис. 7.45. Указание сведений, необходимых для установки подключения к базе данных MySQ.
Рис. 7.45. Указание сведений, необходимых для установки подключения к базе данных MySQ.
Рис. 7.45. Указание сведений, необходимых для установки подключения к базе данных MySQ.
Введите имя узла, на котором находится сервер MySQL, имя базы данных, содержащей таблицы, с которыми устанавливается связь, и ваше имя и пароль для подключения к MySQL. Если ваш MySQL-сервер нс осуществляет связь через порт 3306 (по умолчанию), введите также и номер порта. Если вы хотите убедиться в правильности введенной информации, щелкните на кнопке Test Data Source (Проверить источник данных), и Access попытается связаться с базой данных MySQL и сообщит вам результат.
После щелчка на кнопке OK Access выведет диалоговое окно Связь с таблицами (аналогичное тому, что появляется при установке связи с таблицами другой базы данных Access). Но в дополнение к списку таблиц вы можете установить флажок Сохранить пароль. Этот элемент назван неверно, поскольку Access в любом случае сохраняет пароль MySQL; данный флажок управляет сохранением имени, пэд которым осуществляется вход па MySQL-сервер. Если флажок не будет установлен, вам придется вводить это имя при каждом подключении базы данных Access к базе данных MySQL.
СОВЕТ
Если вы озабочены защищенностью информации, имеющейся в таблицах, не усга- навливайте флажок Сохранить пароль при установке связи с таблицей MySQL. Если вы сохраните в Access и пароль, и имя входа в MySQL то любой, кто спосйюн открыть базу данных Access, сможет внести изменения в базу данных MySQL
Таблицы базы данных MySQL, с которыми установлена связь, появятся в окне базы данных Access с голубовато-зеленым значком глобуса вместо обычного прямоугольного значка. Вы не сможете изменять структуру таблиц, с которыми установлена связь, а также создавать связи, нарушающие целостность ссылочных данных между таблицами, но зато вы можете использовать данные, как будто они принадлежат вашей базе данных Access. Если структура таблицы MySQL будет изменена, вы должны обновить установленную с ней связь, выбрав команду Сервис > Служебные программы ► Диспетчер связанных таблиц.
Трюк в трюке
Всю указанную вами информацию о базе данных MySQL Access хранит в создаваемом DSN-файле, который помещается в папку C:\Program Files\Common Files\ ODBC\Data Sources (предполагается, что ОС Windows установлена надиске С:). Как ни странно, Access также хранит эту информацию и в файле базы данных (MDB), поэтому она не перечитывает DSN-файл после его создания. Если вы провели настройку базы данных Access, имеющую связи с базой данных MySQL, а затем переместили эту базу на другую машину, вам нужно лишь установить драйвер MySQL ODBC. Перемещать DSN-файл не требуется.
Access хранит информацию о подключении к MySQL в виде строки подключения следующего вида (перевод на новую строку после каждой точки с запятой здесь использован исключительно для лучшей читаемости):
ODBC;
DRIVER={MySQL ODBC 3.51 Driver}:
DESC=;
DATABASE=finaneial:
SERVER=data.gurus.com;
UID=odbc-margy;
PAS5WORD=ziast1;
P0RT=;
CPTION=;
5TMT=;
TABLE=Categories
Для просмотра строки подключения к связанной таблице нужно выбрать таблицу в окне базы данных, щелкнуть на значке Конструктор, затем щелкнуть на кнопке Да. когда Access выведет предупреждение о том, что структура этой таблицы доступна только для чтения, щелкнуть правой клавишей на любом свободном месте окна Конструктора и выбрать в появившемся меню пункт Свойства. Обратите внимание, что и имя (если вы установили флажок Сохранить пароль) и пароль появятся в обычном текстовом виде, что никак не вяжется с понятием защищенности данных. Строку подключения редактировать невозможно, поскольку невозможно редактировать структуру таблицы.
Если вы откроете в Блокноте или в другом текстовом редакторе DNS-файл, вы увидите ту же самую строку подключения, но без точек с запятой. Вы можете отредактировать этот файл, но это никак не повлияет на существующие связанные таблицы; это возымеет эффект только для тех таблиц, связь с которы ми будет установлена с помощью DSN-файла в дальнейшем.
См. также документацию по MySQL на веб-сайте http://dev.mysqlcom/doc/, документацию по драйверу MySQL Connector/ODBC на веб-сайте http://dev.mysr I. com/doc/mysql/en/ODBC_Connector.html, документацию по PHP на веб-сайте http:// www.php.net/docs.php.
ТРЮК№ 69ТРЮК№ 69Автоматическая отправка данных Access с помощью Outlook
ТРЮК
№ 69
ТРЮК
№ 69
Пересылка данных по электронной почте с помощью подключения к объектам Outlot к.
Хранение информации и создание отчетов — основное предназначение больши т- ства приложений базы данных. Также довольно часто приходится рассылать отчеты, созданные в базе данных, нескольким пользователям. Этот процесс не должен осуществляться вручную. При вызове функций Microsoft Outlook из программного модуля Access появляется возможность автоматической генерации отчетов с последующей их отправкой по электронной почте.
Сначала нужно принять решение об отправке электронной почты только тем адресатам, которые занесены в адресную книгу. Тогда вам не придется перенастраивать Outlook и вы сможете пользоваться настройками по умолчанию. Разумеется, если вы захотите послать почту по какому-нибудь другому адресу, вам понадобится внести в Outlook изменения.
При отправке электронной почты Outlook по умолчанию автоматически проверяет адреса. При выполнении этой функции в автоматическом режиме вы будете получать ошибки при попытке работы с адресами электронной почты, которые ie включены в вашу адресную книгу. Для отключения функции в Outlook выбери те команду Сервис к Параметры.
Рис, 7.46. Диалоговое окно Outlook Параметры
В диалоговом окне Параметры, показанном на рис. 7.46, на вкладке Настройки щелкните на кнопке Параметры почты, азатем щелкните на кнопке Дополнительные параметры (рис. 7.47).
В результате появится диалоговое окно, разделенное на три области: «Сохранение сообщений», «При получении сообщений в папку Входящие» и «При отправке сообщения» (рис. 7.48).
Рис. 7.47. Диалоговое окно Параметры электронной почты
Рис. 7.48. Изменение в Outlook порядка обработки имен и адресов электронной почты
В области При отправке сообщений находится флажок Автоматически проверять имена (см. рис. 7.48). Если вы хотите, чтобы Outlook проверял адреса, установите этст флажок, а если хотите посылать сообщения без этой проверки — сбросьте флг - жок.
После того как вы приняли решение о способе обработки адресов в Outlook, моя - но приступать к встраиванию механизма отправки электронной почты в ваше приложение. Хотя со временем вам захочется создавать отчеты на основе парп- метризированных запросов и рассылать их различным пользователям, в да! - ном примере показано, как посылать индивидуальные отчеты множеству получателей.
Следует отметить, что для того, чтобы справиться с растущим количеством проблем, вызванных вирусами, Outlook предлагает пользователю разрешить доступ к адресной книге и отправить сообщения. Хотя это и создает препятствие для автоматической отправки электронной почты, все же дать разрешение намного легче, чем каждый раз делать всю работу вручную. В прежних версиях Outlook рассылки допускались в автоматическом режиме.
Для выполнения задачи по отправке электронной почты создайте таблицу иод названием tbl_Email с двумя текстовыми полями: Emaii_Address (50 символое) и Report_Name (25 символов). Если нужно, вы можете сделать поля длиннее. Если применяется автоматическая проверка имен, вам нужно ввести в поле EmaiLAddre: s имя того человека, которому вы хотите послать сообщение. Если вы не использ^ - ете автоматическую проверку, нужно вводить полный адрес электронной почты Введите в таблицу две-три записи для проверки.
В обычной среде приложения вам захочется управлять всем процессом из фор мы, но в данном примере все сообщения электронной почты просто передаются процедуре. Для создания этой процедуры перейдите в окне базы данных Access на вкладку Модули и щелкните на пункте меню Создать. После входа в пустой мс ■ дуль выберите команду Insert ► Procedure, установите переключатели в положе- HtieSub и Public и заполните поле Name значением SendOutlookEmai I. ВрезультЕ- те этого для вашей процедуры будет создана оболочка.
Теперь вам нужно создать ссылку на Microsoft Outlook, выбрав команду Tools г References и установив флажок напротив названия той версии Outlook, которая установлена на вашей машине. Теперь вы сможете ссылаться на объектную мс- дель Outlook. Если вы используете версию Access, отличную от Access 2003, вам может понадобиться установить флажок для ссылки на объектную модель Micr< - soft Data Access Objects (которая находятся в Microsoft DAO 3.6 Object Library i После этого можно приступать к созданию программного кода.
Код
Код показан в примере 7.10.
Пример 7.10. Код Access VBA для отправки электронной почты
Public Sub SendOutlookEmaiI( )
Dim db As DAO.Database
Dim ReportRs As DAO.Recordset
Dim EmallRS As DAO,Recordset
Dim olApp As Outlook.Application
Dim olMail As Outlook.Mai I Item
Dim EmailColl As Collection
Dim varEmail As Variant
Dim Filename As String
’ Outlook разрешает иметь не более одного открытого экземпляра одновременно,
поэтому объект создается с параметром New и используется экземпляр, ' который уже создавался. Я предлагаю заранее открыть Outlook, чтобы * не получать запросы на имя пользователя и пароль.
Set olApp = New Outlook.Appl1 cation
Set db = CurrentDb
Set ReportRs = db.OpenRecordset( _
"Select Report_Name from tbl_Email Group by Report_Name")
ReportRs.MoveFiг st
While Not ReportRs.EOF
Set EmailColl = New Collection
Set EmailRS = db.OpenRecordset( _
"Select Email_Address from tbl_Email Where Report_Name = " & &_
ReportRs. Fields(Q) .Value & """" & ";")
EmaiIRS.MoveFirst
While Not EmailRS.EOF
EmailColl.Add EmaiIRS.Fields(0).Value EmailRS.MoveNext
Wend
EmailRS.Close
Set EmailRS = Nothing
Set olMail = olApp.Create!tem(olMailitem)
olMaiI.subject = "Ежемесячный отчет "
For Each varEmail In EmailColl
olMaiI.Reci pients.Add varEmail
Next
olMail.Body = "Отчет прикреплен к сообщению "
FileName = "C:\ReportsV & ReportRs.Fields(0).Value & ".rtf’
DoCmd.OutputTo acReport, ReportRs.Fields(0).Value, _ acFormatRTF, FileName
' Если у вас несколько прикреплений, вы можете добавлять их по одному olMaiI.Attachments.Add FileName, olByValue. 1. "Ежемесячный отчет" olMail.Send
Set olMail = Nothing
Set EmailColl = Nothing
ReportRs.MoveNext
Wend
ReportRs.Close
Set ReportRs = Nothing
Set olApp = Nothing
' Вы можете закрыть Outlook командой olApp.Quit, но поскольку я ' предложил не делать этого, я его здесь и не закрываю
Set db = Nothing
End Sub
Как только код будет запущен, вам сразу же станут мешать различные запросы н i подтверждение действий. Как уже говорилось, это лучше, чем все делать вручную, но должен существовать и более удобный способ.
ПРИМЕЧАНИЕ
В примере 7.10 видно, что в программном коде востребован ряд переменных дл1 объектов Outlook и объектов данных. Данный пример использует также объект Collection, но вы можете отказаться от его создания и воспользоваться только набс- ром записей. Я использую в своих разработках объект Collection с целью автс- матизизации приложения электронной почты, поэтому поместил его в процедуру электронной почты для работы с именами отчетов и адресами электронной почть. Такой подход позволяет мне применять одни и те же процедуры в других приложениях Microsoft Office, таких как Excel или Word, где я могу и не использовать наборы записей. Процедура сохраняет отчеты в каталоге C:\Reports; если такой каталог отсутствует в вашей системе, его нужно создать или хранить отчеты в другом каталоге.
Упрощенный способ
Теперь, когда вы уже познакомились с возможностью отправки сообщений по электронной почте с использованием Outlook, рассмотрим более простой способ решения этой задачи. Поскольку для его реализации потребуются две стадии, от, видимо, подойдет только для выполнения объемных заданий.
Процедура Access в примере 7.11 отличается от предыдущей процедуры из примера 7.10 тем, что инструкции по отправке электронной почты из ADO.Recordset сохраняются в XML-файле. Этот файл затем обрабатывается в Outlook. Вам нужно будет создать ссылки на ADO для среды Outlook и для среды Access VBA.
Пример 7.11. Создание файла XML из набора записей ADO
Public: Sub CreateOutlookXMLC )
Dim db As DAO.Database
Dim ReportRs As DAO.Recordset
Dim EmailRS As DAO.Recordset
01m saveRS As ADODB.Recordset
Set saveRS = New ADODB.Recordset
saveRS.Fields.Append "Ema11_Address", adVarChar, 50, adFldFixed
saveRS . Fl elds. Append "File-Name", adVarChar, 56, adFldFixed saveRS.Open
Dim FileName As String
Set db = CurrentDb
Set ReportRs = db.OpenRecordset( _
''Select Report_Name from tbl-Email Group by ReportName")
ReportRs.MoveFirst
While Not ReportRs.EOF
FileName = "C:\ReportsA" & ReportRs.F1elds(0).Value & ’’.rtf"
Set EmalLRS = db.OpenRecordset( _
"Select Ema1l_Address from tbl_Email Where Report_Name = " & & _
ReportRs.Fields(0).Value & & ";")
EmaiIRS.MoveFirst
While Not EmailRS.EOF
saveRS.AddNew
saveRS.Fields(0).Value = EmaiIRS.Ftelds(0).Value
saveRS.Fields(1).Value = FileName
saveRS.Update
EmaiIRS.MoveNext
Wend
EmaiIRS.Close
Set EmailRS = Nothing
DoCmd.OutputTo acReport, ReportRs.Fields(0).Value, _ acFormatRTF, FileName
ReportRs.MoveNext
Wend
saveRS.Save "C:\Reports\Ema1lF1le.xml", adPersistXML
saveRS.Close
Set saveRS = Nothing
ReportRs.Close
Set ReportRs = Nothing
Set db = Nothing
End Sub
В этой процедуре использованы преимущества несвязанного набора записей ADO. Используя ADO, вы можете с ходу создать набор записей, не подключаясь к базе данных. Вы также могли заметить, что в этой процедуре создаются все файлы, которые затем будут отправлены с помощью Outlook. При желании вы можете вставить в самое начало процесса еще один этап, создающий XML-файл без записей, а затем запустить несколько процедур, дополняющих XML-файл сведениями, позволяющими обработать его в Outlook в конкретно указанное время.
Макрос в Outlook
Теперь вам необходимо создать процедуру в Outlook. Для этого нужно к вашей среде Outlook добавить макрос. Находясь в Outlook, выберите команду Сервис ► Макрос ► Редактор Visual Basic и щелкните на объекте ThisOutlookSession в Project Explorer. Теперь введите код из примера 7.12.
Пример 7.12. Обработка набора записей ADO в Outlook
Public Sub Ema1lTest( )
Dim mi As Hailitem
Dim varltm As Variant
Dim adors As ADODB.Recordset
Set adors = New ADODB.Recordset
adors .Open "Ci\Reports\EmailFile.xml"
adors.HoveFi rst
While Not adors.EOF
Set mi = Application.CreateItem(olMailitem)
mi .Recipients.Add adors . Fields (0). Valueпродолжение^
Пример 7,12 ^продолжение',
mi.Subject = "Ежемесячный отчет"
mi.Body = "Отчет прикреплен к сообщению."
mi.Attachments.Add adors.Fields(1).Value, olByValue, 1. "Ежемесячный отчет" mi.Send
Set mi = Nothing
adors.MoveNext
Wend
adors.Close
Set adors = Nothing
End Sub
Эта процедура отошлет все вагин сообщения по электронной почте без запросов на подтверждение каких-нибудь действий. Хотя для этого пришлось разбивать процесс на два этапа, зато вам нс надо щелкать на кнопке при отправке каждого сообщения. Вы сможете оценить всю пользу от этого, когда столкнетесь с необхе - димостьто отправки большого объема почтовых сообщений. Если нужно, вы смс - жете хранить дополнительные поля для темы и текста сообщения в наборе записей, придав и этим двум элементам изменяемый характер.
К недостаткам этой процедуры можно отнести то, что она посылает для каждой имеющейся записи отдельное почтовое сообщения. Вы можете усовершенствс ■ вать ее, введя просмотр всего набора записей для определения возможности груп - пировки почтовых сообщений, хотя в этом нет особой необходимости. Кроме того вы можете также создать несколько XML-файлов для каждого отправляемого почтового сообщения и ввести циклическую процедуру обработки XML-файлов а затем переместить эти файлы, когда закончится их обработка (однажды я разрг - ботал для клиента подобную процедуру).
Если вы хотите использовать процедуру повторно, вам нужно сохранить ее, щель - нув на значке Save в среде Visual Basic. В зависимости от настройки системы безе - пасности при каждом открытии Outlook и попытке его использования вы можете получать запрос на разрешение работы этого макроса.
Использование обоих подходов, безусловно, поможет организовать авТоматиче - скую отправку почтовых сообщений. Если вас интересует только отправка самих сообщений, вы можете воспользоваться первой процедурой и удалить из неестрс - ки, касающиеся прикреплений. В любом случае, очевидно, что применение VBA в Microsoft Office придает мощь всей системе.
ТРЮК№ 70ТРЮК№ 70Создание таблиц Access из других приложений
ТРЮК№ 70
ТРЮК№ 70
Для использования Access не обязательно присутствовать в ее среде.
Сценарий таков: у вас есть разработка на Excel, в которой нужно заполнить таблицу Access. Причем данные нужно поместить в новую таблицу. Вы можете под; - мать, что заполнение таблицы с помощью ADO или других технологий потребует создания этой таблицы вручную, возврата в Excel и запуска процедуры заполнена . На самом деле вам не нужно переходить в Access и создавать таблицу, это можно сделать прямо из программного модуля Excel. Все очень просто, вам всего лишь понадобится задействовать библиотеку ADOX.
Установите в Excel ссылку на ADOX, выбрав команду Tools ► References, и установив флажок напротив названия этой библиотеки в диалоговом окис References (рис. 7.49).
Рис. 7.49. Установка ссылки на ADOXРис. 7.49. Установка ссылки на ADOX
Рис. 7.49. Установка ссылки на ADOX
Рис. 7.49. Установка ссылки на ADOX
Код
Теперь нужно создать небольшой фрагмент кода, использующий программную модель ADOX. Введите в программный модуль Excel следующий код:
Dim cat As New ADOX.Catalog
Dim tbl As New ADOX.Table
Dim db_file_path As String
'указание пути к базе данных
db_file_path = ActiveWorkbook.Path & "\abc.mdb"
'подключение к базе данных Access
cat.ActiveConnection - "Provider=Micrpsoft.Jet.OLEDB.4.0;” & _
"Data 5ource=" & db_file_path
'создание таблицы
With tbl
.Name = "Потенциальные_клменты"
' Сначала добавляем поля к объекту table.
1 затем добавляем объект table к коллекции Tables .Columns.Append "Имя", adVarWChar
.Columns.Append "Организация", adVarWChar
.Columns.Append "Телефон", adVarWChar
.Columns.Append "Адрес", adVarWChar
продолжение ^продолжение ^End With
продолжение ^
продолжение ^
cat.Tables.Append tbl
Set cat = Nothing
MsgBox "Таблица создана!"
Теперь не забудьте поменять конкретно заданные в программе имя файла базы данных и путь к ному. В результате работы данного фрагмента программы в базе данных Access будет создана таблица Потенциальные_клиенты, состоящая из четырех нолей. Метод Append свойства Columns воспринимает имя поля и константу, обозначающую тип поля. Константы типов полей отличаются от тех, с которыми вы встречались в Access, хотя имеют такое же назначение. Для просмотра всех констант воспользуйтесь средством Object Browser, в котором выберите настройку фильтра на библиотеку ADOX (рис. 7.50).
Рис. 7.50. Отображение констант ADOX
Трюк в трюке
В данном трюке используется общедоступная внешняя библиотека ADOX. Также легко вы можете запускать программный код данного трюка из Word, PowerPoint, Outlook и других программ. Суть трюка заключается именно в том, что вы можете создавать таблицы Access и работать с ними, не запуская саму систему Access.
ТРЮК№ 71ТРЮК№ 71Написание кода VBA при помощи записи макросов в Word и Excel
ТРЮК
№ 71
ТРЮК
№ 71
Использование автоматической генерации кода для ускорения процесса программирования.
Представим, что вам нужно работать с Word или Excel из Access и ваш проект требует создания программного фрагмента на VBA для этих приложений, который будет автоматически использоваться в Access. Вопреки ожиданиям, для этого вам не понадобится углубляться в учебный процесс, поскольку и Word, и Excel способны автоматически генерировать код V ВА.
Для этого вы должны сначала включить запись макроса, проделать в приложении некие действия, а затем остановить запись. Для включения записи макроса вам необходимо выбрать команду Сервис ► Макрос ► Начать запись (рис. 7.51),
После запуска записи вы можете совершить действия по вводу данных и созданию диаграммы. После остановки записи (в процессе записи для этого будет выведена панель инструментов с кнопкой Остановить запись) созданный код попадет в программный модуль Excel. На рис. 7.52 показан пример кода, сгенерированного Excel.
Обычно сгенерированный код требует доработки. В нем жестко заданны ссылки на ячейки, что для вашего приложения может и не подойти. Тем не менее
Рис. 7.52. Код, сгенерированный в Excel в автоматическом режиме
использование записи макроса позволяет создать основную часть требуемого кода который затем в процессе редактирования доводится до работоспособного сост< ■ яния. Код, работающий в Excel, будет нормально работать и из приложения Асеев, при условии, что в нем имеются ссылки набиблиотеку Excel (аналогичные утвер - жДения применимы и к Word). Хотя полученный код нуждается в доработке, мы все равно экономим немало времени па его создании.
ГЛАВА 8
П рограммирование
Трюки № 72-91
VBA, ADO, DAO, SQL, XML: разработчики живут в мире акронимов. Главное, чтобы все технологии, скрывающиеся за ними, хорошо и дружно работали в наших разработках. С некоторыми из этих технологий вы, возможно, уже знакомы, но, изучив данную главу, вы обогатите свои знания.
Здесь вы сможете найти трюки, помогающие оптимизировать код программы за счет удаления номеров строк и сокращения повторяющихся подпрограмм. В разделе «Замена агрегатных функций SQL доменными агрегатными функциями» (Трюк № 74) показан способ сокращения программного кода за счет отказа от использования функции SQL. В других трюках рассматриваются способы защиты программного кода и отстранения пользователей от доступа к элементам Конструктора. В одном из разделов — «Защита программного кода от любопытных пользователей» (Трюк № 77) — показан способ установки парольной защиты на разработанный вами программный код.
Глава также содержит трюки, обогащающие опыт обычных пользователей. К примеру, раздел «Облегченный доступ к конкретной записи» (Трюк № 79) поможет быстро отыскать нужную информацию среди множества записей. А раздел «Хранение значений свободных элементов управления с целью их повторного использования» (Трюк Ns 84) предоставит пользователям способ восстановить все, что было ими выбрано в форме во время предыдущего сеанса работы.
ТРЮК№ 72ТРЮК№ 72Хранение ранее выбранного значения для его выделения при последующих вызовах элемента управления
ТРЮК
№ 72
ТРЮК
№ 72
Для хранения данных, связанных с элементом управления, вполне можно использовать свойство Дополнительные сведения (Тад),
Поля со списком или списки предоставляют пользователям возможность выбрать какой-нибудь элемент списка. После выбора значение выбранного элемента при-
сдаивается свойству элемента управления Value (Значение), которое можно использовать в коде программы:
If IsNulI(сшЬ_Уровень) Then
MsgBox "Значение не выбрано"
Else
MsgBox сгоЬ—Уровень.Value
End If
Вы даже можете обратиться непосредственно к самому элементу управленш , не используя свойство Value (Значение):
If IsNulI(стЬ_Уровень) Then
MsgBox "Значение не выбрано"
Else
MsgBox стр_Уровень
End If
Обратите внимание, что оба программных фрагмента начинаются с проверки на значение null Список или ноле со списком изначально могут иметь значение null поэтому избежать неприятностей, связанных с этим значением, никогда не поме - тает.
Как только пользователи щелчком выберут какой-нибудь элемент из списка, эл( - менту управления (список или поле со списком) будет присвоено значение вь - бранного элемента списка. Ну а если нужно будет восстановить в списке прежнее значение или самое первое выбранное значение? Пользователь может забыт ь о своем предыдущем выборе и захочет вернуться к этому значению. Чтобы ветре i- ить в приложение механизм для решения этой задачи, нужно сначала найти способ хранения прежнего выбора.
Конечно, его можно сохранить в таблице, но это нерациональный подход. В дат- ном трюке рассматривается другой способ хранения прежнего выбора — непосред ственно в самом элементе управления! И список, и поле со списком имеют свойство Дополнительные сведения (Tag), предназначенное для краткого описания объекта управления.
ПРИМЕЧАНИЕ
Свойство OLdValue (Прежнее значение), как ни удивительно, в наших целях применить нельзя, поскольку оно хранит старый вариант значения в процессе редактир)- вания. Оно помогает получить в процессе выбора значения «до и после» и храни значение, предшествующее самому последнему выбору, поэтому, после нескольких изменений, его уже невозможно использовать для получения более давнее значения.
На рис. 8.1 показана форма, содержащая поле со списком, список и кнопку. Свойство Тип источника строк для поля со списком (стЬ_Уровень) и для списка (lis:_ Регион) установлено на Список значений. В поле со списком имеются четыре знач > ния: Начальный, Средний, Опытный и Эксперт. Список состоит из пяти строк: Восток, Запад, Север, Юг и Центр. Прежний выбор, сделанный в этих элементах управления, хранится в свойстве Дополнительные сведения (Tag),
Рис. 8.1. Форма, содержащая поле со списком, список и кнопку
Элементы управления являются свободными, и при открытии формы они не содержат никаких значений. В процедуре обработки события Открытие (Open) (относящегося к форме) свойству Дополнительные сведения (Tag) каждого из элементов присваивается значение строки нулевой длины. Вот как выглядит полный код модуля формы:
Private Sub Form_Open(Cancel As Integer) стЬ_Уровень.Tag = "" ItstPerHOH.Tag = "*
End Sub
Private Sub стЬ—Уровень_АТterUpdate( )
If стЬ_Уровень.Tag = "" Then
Cmb_ypoeeHb.Tag = стЬ_Уровень
End If
End Sub
Private Sub list_Peгион_АГterUpdate( )
If Ii51_Регион.Tag = "" Then
L1st_PerMOH.Tag - 11з1_Регион
End If
End Sub
Private Sub стЬ_Перезапуск_С11ск( )
СтЬ_Уровень = стЬ_Уровень.Tag
List_PernoH = 11st_PerHOH.Tag
End Sub
При первом выборе значения, как в элементе стЬ_Уровень, так и в элементе list. Регион, свойство Дополнительные сведения (Tag) проверяется на строку нулевой длины. Если результат будет положительным (true), то свойству Дополнительные сведения (Tag) будет присвоено текущее значение элемента. Все эти действия совершаются во время обработки события После обновления (AfterUpdate), поскольку
для их осуществления требуется самое последнее значение элемента управления, которое превращается в текущее значение только после обновления.
Положительный результат тестирования свойства Дополнительные сведения (Tag) на строку с нулевой длиной возникает только при первой проверке. Все последующие проверки, проводимые при новом выборе, дадут отрицательный результат, поскольку это свойство уже будет содержать прежде выбранное значение.
После щелчка на кнопке перезапуска обоим элементам управления присваиваются прежние значения, сохраненные в их собственных свойствах Дополнительны; сведения (Tag).
В данном трюке продемонстрирован только способ хранения прежнего выбор;. а применение этого способа зависит от задач вашего приложения. Трюк хорой тем, что его легко внедрить в любое приложение. Поскольку таблицы в нем не используются, нужно лишь скопировать программный код в процедуры обработки событий элементов управления и изменить ссылки на имена этих элементов
Отключение синтаксической проверки для ускоренного ввода кода программы
Избавление от назойливых предупреждений Access, возникающих в процессе ввола программного кода.
Вы, так же как и я, наверное, замечали, что иногда ваши пальцы не в состояни ч угнаться за ходом мысли. Зачастую при вводе кода программы я мысленно опере ■ жаю процесс на несколько строк и ввожу текст с максимально возможной скорс - стью. При этом совершенно не хочется утратить нить размышлений, но если я дс ■ пущу несколько опечаток пли забуду вставить ключевое слово или переменную, Access тут же начнет ругаться и выводить предупреждения.
Наглядный пример подобной ситуации отображен на рис. 8.2. В процессе созд; - нпя структуры Select Case я еще нс знаю, каким будет проверяемое выражение, но удерживаю в памяти все блоки операторов, помещаемых за отдельными Case-элементами, и хочу как можно быстрее ввести их в текст программы. Но Access буквально связывает меня по рукам, тормозя работу на строчке Select Case.
Я помню, что кое-что отложил «на потом», и сделал это намеренно, чтобы не], нуться и доделать все чуть позже, и, когда работа внезапно прерывается, я ничего, кроме раздражения, не испытываю.
Поэтому я научился отключать назойливые предупреждения, перед тем как вводить большие программные блоки. На рис. 8.3 показано диалоговое окно Options (Параметры), вызываемое в редакторе VB командой меню Tools ► Options (Сервис > Параметры).
На вкладке Editor (Редактор) нужно сбросить флажок Auto Syntax Check (Автоматическая проверка синтаксиса) и тем самым ускорить процесс ввода программного кода. При выключенной проверке синтаксиса ввод кода не будет прерываться. Ошибки по-прежнему будут подсвечиваться определенным цветом (строки с ошибками будут менять свой цвет), но раздражающие окна предупреждени к которые нужно будет закрывать, перестанут появляться.
^ УЧ'ГП^иЛ ViSil'H ^ЧК H^lilUllilWn k# (.,«.‘1 OfflW 1<<.:'". ^d d Г: ? f^lkh ' А^ЖУ :;=# Ek Edi yew ^»rt e«bug 8^ lock add-Ins yfindow Help- в X
Рис. 8.2. Постоянно раздражающее предупреждение
Рис. 8.3. Выключение проверки синтаксиса
Как только ввод программного кода будет завершен, все прежние установки принято восстанавливать.
ТРЮК№74ТРЮК№74Замена агрегатных функций SQL доменными агрегатными функциями
ТРЮК
№74
ТРЮК
№74
Сокращение количества вводимого программного кода безо всякого ущерба.
Подключение к объектам ADO и использование инструкций SQL для запроса данных из базы стало нормой программирования в среде VBA. Поскольку SQL фактически стал стандартным средством запроса данных, такая тенденция вполне понятна. Тем не меиее этот способ запроса подходит не всегда.
К примеру, если необходима обработка каждой записи, применение ADO и SQL. вполне оправданно. Созданный набор записей обычно подвергается перебору с ш - пользованием метода Move Next и цикл теской структуры Do Until (или ей подобной) Между тем ADO и SQL и когда служат для получения составных значений из набора записей. При этом доступ к отдельным записям не нужен, поскольку осуществляется поиск суммарной величины: суммы, количества или среднею значения.
Код
В примере 8.1 показана процедура, в которой ADO и SQL используются для получения суммы итоговых значений нескольких счетов.
Пример 8.1. Использование ADO и SQL для получения суммы
Sub get_SQL_Sum{ )
Dim conn As ADODB,Connection
Set conn = Currentproject.Connection
Dim rs As New ADODB.Recordset
rs.Open “Select Зит(Итог) As СуммаИтогов From Счета" & _
" Where ДатаСчета=#12/10/04#”, _
conn, adOpenKeyset, adtockOptimistic
MsgBox rs. Е1е105("СуммаИтогов") rs.Close
Set rs = Nothing
Set conn = Nothing
End Sub
Инструкция SQL включает в себя агрегатную SQL-функцию Sum, а сумма итогов извлекается из набора записей, фильтрующихся по конкретной дате составления счета — 12/10/04. В примере 8.1 создаются объекты ADO, которые впоследствии уничтожаются (путем присвоения нм значения Nothing).
А вот использование доменной агрегатной функции позволяет свести програм и- ный код к одной-единственной строке.
Упрощение программного кода
Доменные агрегатные функции дают те же результаты, что и агрегатные функции SQL. Но в отличие от этих функций, требующих поиска способа их внедрен 1я в инструкцию SQL, доменные агрегатные функции используются в коде программы в чистом виде,
В примере 8.2 показано, как короткая процедура, использующая доменную агрегатную функцию Dsum, заменяет программный код примера 8.1.
Пример 8,2. Использование DSum для получение суммы
Sub get_Domain_Sum( )
Dim СуммаИтогов As Single
СуммаИтогов = DSumC [Итог]", "Счета". " [ДатаСчета] = #12710/04#")
MsgBox СуммаИтогов
End Sub
Кроме объявления переменной и вызова окна сообщения для демонстрации результата процедура состоит всего лишь из одной команды:
СуммаМтогов = DSum("[Итог]", "Счета”, "[ДатаСчета] - #12/19/04#")
Передаваемые функции DSum аргументы представляют собой поле, чьи значения подвергаются суммированию, домен (таблицу или запрос на выборку) и выражение, задающее условия фильтрации данных. Третий аргумент работает аналогично условию Where, применяемому в инструкциях SQL.
В качестве третьего аргумента можно даже использовать составной критерии. Например, следующая программная строка вернет сумму итогов всех счетов, имеющих дату 12/10/04, фамилию клиента Андреев и место выставления счета — Москву или Псков:
amount = DSum("[Итог]", "Счета". "[ДатаСчета] = #12/10/04# And [Клиеит] = * Андреев' And ([Место] = ’Москва 1 ог (Место]='Псков')")
Доменные агрегатные функции
Это семейство представлено следующими функциями:
DAvg — используется для получения среднего значения подмножества, содержащегося в поле, указанном в качестве первого аргумента;
DCount — служит для получения количества записей;
DLookup — предназначена для получения значения указанного поля, принадлежащего первой же записи, которая отвечает критериям, заданным в третьем аргументе;
DFirst и DLast — применяются для получения значения поля, указанного в качестве первого аргумента и принадлежащего первой или последней записи;
DMin и DM ах — используются для получения из всего подмножества записей минимального или максимального значения поля, указанного в качестве первого аргумента;
DStDev и DStDevP — предназначены для получения среднеквадратичного отклонения значений поля, указанного в качестве первого аргумента; функция DStDev применяется для работы с выборкой подмножества, а функция DstDevP — со всем подмножеством значений;
DSum — служит для получения суммы значений поля, указанного в качестве первого аргумента;
DVar и DVarP — применяются для получения дисперсии значений поля, указанного в качестве первого аргумента; функция DVar используется для работы с выборкой подмножества, а функция DVarP — со всем подмножеством значений.
Все доменные агрегатные функции используют одни и те же три аргумента: поле, значения которого используются в вычислении, домен и критерий. Дополнительные сведения об этих функциях можно найти в справочной системе Access. Их применение в ваших процедурах — весьма эффективный способ быстрого получения составных значений из набора записей с использованием только одной программной строки.
ТРЮК№ 75ТРЮК№ 75Сокращение программного кода за счет использования подпрограмм
ТРЮК
№ 75
ТРЮК
№ 75
Попрощайтесь с длинным и неудобным для последующих доработок программным к )- дом, поместив все повторяющиеся процессы в подпрограммы.
Все приложения подвергаются доработке и постепенно разрастаются. Аппетит приходит во время еды. Как только пользователи освоятся с первоначальным вариантом приложения, они начинают требовать доработок. По мере развития объем программы возрастает. Подпрограммы часто подвергаются копированию с последующим незначительным изменением некоторых литералов, имен переменных и критериев. В итоге программа получает массу сходных процедур.
Пример 8.3 содержит три одинаковые подпрограммы, отличающиеся друг от друга только тем, что обращение в них идет к разным штатам.
Пример 8.3. Несколько почти одинаковых подпрограмм
Sub попучение_Н¥_записей()
‘получение записей о клиентах штата New York
Dim conn As ADODB.Connect 1 on
Set conn = Currentproject.Connect! on
Dim recset As ADODB.Recordset
Set recset = New ADODB,Recordset
recset.Open "Select * From Клиенты Where Штат='МУ'", conn Do Until recset.EOF
‘‘Здесь размещается код обработки записей recset.MoveNext
Loop
recset.Close
Set recset = Nothing
End Sub
Sub лолучение_СТ_записей( )
’получение записей о клиентах штата Connecticut
Dim conn As ADODB.Connect!on
Set conn = Currentproject.Connect!on
Dim recset As ADODB.Recordset
Set recset = New ADODB.Recordset
recset.Open “Select * From Клиенты Where Штат^'СР". conn Do Until recset.EOF
''Здесь размещается код обработки записей recset.MoveNext Loop recset.Close Set recset = Nothing
End Sub
Sub получение_МА_записей( )
'получение записей о клиентах штата Massachusetts
Dim conn As ADODB.Connection
Set conn = Currentproject.Connect Ion
Dim recset As ADODB.Recordset
Set recset = New ADODB.Recordset
recset,Open "Select * From Клиенты Where Штат=’МА’", conn
Do Until recset,EOF
’’Здесь размещается код обработки записей
recset.MoveNext
loop
recset.Close
Set recset = Nothing
End Sub
Программный код примера 8.3 крайне избыточен. Создав подпрограмму, принимающую аргумент, вы сможете оптимизировать этот код. Одинаковый для всех подпрограмм фрагмент кода помещается в отдельную подпрограмму, которой затем передается аргумент, содержащий конкретное обрабатываемое значение.
В примере 8.3 фрагменты кода различаются только названиями штатов: к примеру, в следующем операторе фигурирует выборка записей, относящихся к штату Massachusetts (МА):
recset.Open ‘Select * From Клиенты Where Штат='МА|", conn
В примере 8.4 показано, как можно изменить код, используя подпрограмму. Теперь повторяющийся фрагмент кода помещен в отдельную подпрограмму, названную получен ие_зап и сей_ штата. Эта подпрограмма принимает строковый аргумент под названием штат.
Пример 8.4. Повторяющийся код, помещенный в подпрограмму
Sub попучение_М¥_запиСей( )
'получение записей о клиентах штата New York получение_записей_штата "NY"
End Sub
Sub получение_СТ_записей( )
‘получение записей о клиентах штата Connecticut получение_залисей_и1тата "СТ"
End Sub
Sub получение_МА_записей( )
'получение записей о клиентах штата Massachusetts попучение_записей_штата "МА"
End Sub
Sub получение_записей_штата(штат As String)
Dim conn As ADODB.Connection
Set conn = Currentproject,Connection
Dim recset As ADODB.Recordset
Set recset = New ADODB.Recordset
recset.Open "Select * From Клиенты Where Штат-1" & штат & "'", conn
Do Until recset.EOF
''Здесь размещается код обработки записей
recset.MoveNext
Loop
recset.Close
Set recset = Nothing
End Sub
Теперь каждая отдельная подпрограмма, такая как получение^Дозаписей, зан 1- мается только лишь тем, что вызывает универсальную для всей группы подпрограмму и передает ей в качестве аргумента условное сокращение названия штата. Этот вызов умещается в одной строке:
получение_записей_штата "МА"
Общая подпрограмма получение_записей_штата принимает переданный аргумент и использует инструкцию SQL, открывающую набор записей:
recset.Open "Select * From Клиенты Where Штат='” & штат & “'”, conn
Нетрудно заметить, насколько сократился код примера 8.4 по сравнению с кодом примера 8.3.
Годами программисты хвастались тем, что написали не одну тысячу строк программного кода. А я думаю, что пора ввести моду на разговоры о том, на сколько строк удалось этот код сократить!
ТРЮК№ 76ТРЮК№ 76Сокращение программного кода за счет использования необязательных аргументов
ТРЮК
№ 76
ТРЮК
№ 76
Универсализация подпрограмм за счет приема разного количества аргументов.
В разделе «Сокращение программного кода за счет использования подпрограмм* (Трюк № 75) показан способ оптимизации кода за счет использования универсальной подпрограммы. Теперь давайте сделаем еще один шаг вперед. Подпрограммы могут использовать и необязательные аргументы. При вызове подпрограмм нм требуется передать лишь обязательные аргументы, а необязательны.1, как следует из их названия, передавать совсем не обязательно.
В примере 8.5 показано несколько подпрограмм, из которых вызывается одна и та же подпрограмма.
Пример 8.5. Набор подпрограмм, вызывающих одну и ту же подпрограмму
Sub попучение_М¥_записей( )
'получение записей о клиентах штата New York получение записей_Штата "NY"
End Sub
Sub получение_СТ_записей( )
'получение записей о клиентах штата Connecticut получение_записей_щтата "СТ"
End Sub
Sub получение_МА_записей( )
'получение записей о клиентах штата Massachusetts получение_записей_штата "МА", "Boston" End Sub
Sub получение_записей_штата(штат As String, Optional город As String) Dim conn As ADODB.Connect ion
Set conn = CurrentProject.Connect)on
Dim recset As ADODB.Recordset Set recset = New ADODB.Recordset If штат = "MA" Then
recset.Open "Select * From Клиенты Where Штат='" & штат —
& "' And Города'" & город & , conn Else
recset.Open "Select * From Клиенты Where Штат='" & штат & , conn
End If Do Until recset.EOF
1'Здесь размещается код обработки записей
recset.MoveNext
loop
recset.Close
Set recset = Nothing
End Sub
Подпрограмме передаются два аргумента: обязательный — штат и необязательный — город. Ключевое слово Optional размещается перед именем аргумента: Sub получение_записей_штата(штат As String, Optional город As String)
ПРИМЕЧАНИЕ
Для обязательного аргумента ключевое слово не требуется. Все аргументы считаются обязательными до тех пор, пока перед ними не будет стоять ключевое слово Optional. Следует также учесть, что необязательные аргументы должны следовать за обязательными. Необязательных аргументов может быть несколько, но каждый из них должен предваряться ключевым словом Optional.
Предположим, что требования изменились, и теперь могут использоваться любые записи, относящиеся к штатам NY или СТ, но из записей, относящихся к штату Massachusetts (МА), нам нужны только те, которые относятся к городу Boston. Подстроиться под новые требованиям можно за счет применения подпрограмм: одной, принимающей единственный аргумент — штат, и другой, принимающей два аргумента — штаг и город. Цель будет достигнута, но программный код будет избыточным.
Но если передать город в качестве необязательного аргумента, можно будет обойтись и одной подпрограммой для всех штатов. Доступ к записям штата Massachusetts будет осуществляться при передаче двух аргументов:
получение^записей_штата "МА", "Boston"
Записи штатов New York и Connecticut будут доступны при передаче единственного обязательного аргумента:
получение_записей_штата "СТ”
Подпрограмма претерпела изменения, позволяющие выполнять два вида запроса, один — с единственным критерием отбора и второй — использующий оба критерия;
If Штат = "МА" Then
recset.Open "Select * From Клиенты Where Штат='" & штат _
& '" And Город='" & город & ,conn
Else
recset.Open "Select * From Клиенты Where Штат=’" & штат & "'", conn
End If
Вот и все! После внесения небольших изменений в имевшуюся подпрограмму вторая подпрограмма становится ненужной.
ТРЮК№ 77ТРЮК№ 77Защита программного кода от любопытных пользователей
ТРЮК
№ 77
ТРЮК
№ 77
Если программный код представляет для вас особую ценность, установите на ваий модули парольную защиту.
Я думаю, вы не станете возражать, что разработанный вами программный код представляет собой определенную ценность, поскольку на его создание, равно как и на обновление, затрачены время и силы. Поэтому, как и любой ценности, ему не помешает небольшая защита. Разумеется, нельзя не упомянуть о необходимое-и первым делом создать резервную копию исходного материала. Но если даже у в тс задействована система резервного копирования, любая порча программного кота, использующегося в производственной среде, повлечет за собой затраты на остановку процесса, необходимую для восстановления кода.
Хорошо, что есть весьма простой способ защиты программного кода. В данном трюке показано, как уберечь код от просмотра посторонними лицами, не знающими установленного пароля. Для установки защиты нужно в редакторе VB выбрать команду Tools ► Properties (Сервис ► Свойства) (рис. 8.4). В данном случае пун ст меню выглядит как Клиенты Properties (Клиенты Свойства), поскольку програм л- ный проект назван Клиенты. Это имя и отражается в пункте меню.
ПРИМЕЧАНИЕПРИМЕЧАНИЕИзначально имя программного проекта совпадает с именем базы данных. Переименовать проект можно на вкладке General (Общие) диалогового окна Project Properties (Свойства проекта) (Tools > Properties (Сервис ► Свойства}).Изначально имя программного проекта совпадает с именем базы данных. Переименовать проект можно на вкладке General (Общие) диалогового окна Project Properties (Свойства проекта) (Tools > Properties (Сервис ► Свойства}).ЙМНгб»еП Visual Вла к - К аденин [design] [Medutet (Code)jЙМНгб»еП Visual Вла к - К аденин [design] [Medutet (Code)jO' References,O' References,Клиенты Propy ties, digital Stature,..Клиенты Propy ties, digital Stature,..К менты (Кженгы)-^ ModulesA №хкЫA ModsHEК менты (Кженгы)-^ ModulesA №хкЫA ModsHEРис. 8.4. Доступ к свойствам проектаРис. 8.4. Доступ к свойствам проекта
ПРИМЕЧАНИЕ
ПРИМЕЧАНИЕ
Изначально имя программного проекта совпадает с именем базы данных. Переименовать проект можно на вкладке General (Общие) диалогового окна Project Properties (Свойства проекта) (Tools > Properties (Сервис ► Свойства}).
Изначально имя программного проекта совпадает с именем базы данных. Переименовать проект можно на вкладке General (Общие) диалогового окна Project Properties (Свойства проекта) (Tools > Properties (Сервис ► Свойства}).
ЙМНгб»еП Visual Вла к - К аденин [design] [Medutet (Code)j
ЙМНгб»еП Visual Вла к - К аденин [design] [Medutet (Code)j
O' References,
O' References,
Клиенты Propy ties, digital Stature,..
Клиенты Propy ties, digital Stature,..
К менты (Кженгы)
-^ Modules
A №хкЫ
A ModsHE
К менты (Кженгы)
-^ Modules
A №хкЫ
A ModsHE
Рис. 8.4. Доступ к свойствам проекта
Рис. 8.4. Доступ к свойствам проекта
Для включения защиты и установки пароля нужно выбрать вкладку Protection (Защита) диалогового окна Project Properties (Свойства проекта). Введите пароль и щелкните на кнопке ОК (рис. 8.5). Не забудьте, что пароль чувствителен к регистру.
Рис. 8.5. Защита проекта
Изменения не вступят в силу, пока вы не закроете и заново нс откроете базу данных. При входе в редактор VB список в окне проекта будет свернут в самый верхний уровень. При попытке раскрыть список (щелчком на знаке плюс) появится диалоговое окно для ввода пароля (рис. 8.6).
Рис. 8.6. Запрос пароля для просмотра программного кода
И это все, что можно будет получить, не зная пароля. Защита позволяет решатьдвоякую задачу: уберечь код от порчи и сделать его невидимым. К тому же будут
защищены авторские права на ваш код. Если вам удалось разработать весьма уда т- ные программные решения, не предназначенные для распространения, вы можете быть спокойны: их не смогут ни скопировать, ни просмотреть.
ТРЮК№ 78ТРЮК№ 78Создание в приложении служебного входа для разработчика
ТРЮК
№ 78
ТРЮК
№ 78
Отстранение пользователей от конструкции приложений с возможностью входа для самого разработчика.
Некоторые пользователи слишком любопытны и от нечего делать наверняка станут ковыряться в конструкции вашей базы данных. Бороться с этим явлением можно несколькими способами. Например, задействовать систему защиты, преобразовать базу данных в MDE-версию, не допускающую никаких изменений, или закрыть доступ к конструктивным элементам приложения.
Последний вариант, хотя и не такой стойкий, как система защиты Access, тем I е менее часто применяется для защиты самой разработки от излишне любопытных пользователей. Настройки в диалоговом окне Параметры запуска помогают услоя; нить проникновение пользователей в конструкцию базы данных (рис. 8.7):
Выберите форму, запускаемую при открытии базы данных.
Сбросьтефлажок Окнобазы данных.
Сбросьте флажок Встроенные панели инструментов.
Сбросьте флажок Изменение панелей ин струментов/меню.
Рис. 8.7. Изменение параметров запускаРис. 8.7. Изменение параметров запуска
Рис. 8.7. Изменение параметров запуска
Рис. 8.7. Изменение параметров запуска
Дополнительные настройки можно сделать в форме, в режиме Конструктора.
Установите значение свойства Контекстные меню в Нет.
Установите значение свойства Разрешить изменение макета в Только режим конструктора.
Назначьте форме строку меню, не имеющую доступа к элементам проекта.
Эти меры вынудят пользователей заняться своим прямым делом. К сожаленик, в этом случае доступ к проекту базы данных будет затруднен и для вас. В данном
трюке создается скрытый и известный только разработчику доступ к элементам проекта базы данных.
На рис. 8.8 показана форма в режиме Конструктора, имеющая кнопку управления, специально помещенную там, где пользователю вряд ли придет в голову щелкать мытью. Она отображена в верхнем левом углу формы и не похожа на обычную кнопку, хотя на самом деле именно ею является. Она выглядит плоской, поскольку ее свойство Прозрачный имеет значение Да. Если кнопка прозрачна, все надписи на ней исчезают. Поэтому она выглядит как контур прямоугольника.
Рис. 8.8. Форма, содержащая прозрачную кнопку
Событие двойного щелчка на кнопке имеет процедуру обработки. Обычно двойной щелчок для кнопок не используется, поскольку реакция ожидается уже после одинарного щелчка. При переходе в режим формы кнопка не видна. Хотя ее свойство Вывод на экран имеет значение Да, прозрачность его аннулирует.
Обратите внимание, что при прохождении над прозрачной кнопкой указатель мыши не меняет своего внешнего вида. При этом кнопка остается доступной. Не зная этого, пользователь может случайно щелкнуть на ней, поэтому, из соображений безопасности, вместо одиночного щелчка используется двойной. Этот метод не застрахован от случайностей, но все же защищает программный код от запуска по случайному щелчку.
Код
При двойном щелчке на прозрачной кнопке происходит запуск кода и запрос пароля:
Dim pw As String
ри = InputBox$("Введите пароль". "Пароль")
If ри = "Access неприступен!" Then
DoCrod.SelectObject acTable, , True
Else
MsgBox "Ошибка ввода пароля"
End If
Если будет введен верный пароль, отобразится окно базы данных.
На рис. 8.9 показана форма после двойного щелчка па кнопке. Сама кнопка остаетс т невидимой, поэтому нужно знать, на каком месте произвести двойной щелчок.
Рис. 8.9. Ввод пароля для открытия окна базы данныхРис. 8.9. Ввод пароля для открытия окна базы данных
Рис. 8.9. Ввод пароля для открытия окна базы данных
Рис. 8.9. Ввод пароля для открытия окна базы данных
ЯТ Р ю к№ 79ЯТ Р ю к№ 79Облегченный доступ к конкретной записи
ЯТ Р ю к
№ 79
ЯТ Р ю к
№ 79
Облегчение просмотра объемной базы данных путем предварительной группировки записей о клиентах.
Пользователям иногда приходится тратить уйму времени на поиски клиента в длинном списке записей. К примеру, при загрузке имен клиентов в поле со спис ■ ком или в список пользователи теряют время на прокрутку.
Предлагаемая технология призвана устранить часть рутинного труда. В качестве первого шага предлагается способ, при котором работа ведется со списком более мелких групп клиентов. На рис. 8.10 показана форма, имеющая четыре кнопки (слева, в группе Просмотр клиентов), по которым осуществляется переход к работе с клиентами, чьи фамилии начинаются с букв в диапазонах А-Д, Е-Л, М-Р и С-Я.
Деление клиентов на четыре группы весьма условно. Вы можете поделить их на группы по буквам, с которых могу начинаться фамилии, и получить три десятка кнопок. Чем больше клиентов, тем мельче должны быть группы. Нужно помнить что главное — сократить просматриваемый синеок клиентов. Если их тысячи, тс, группа А-Д будет представлять собой неприемлемо длинный список.
Щелчок на любой из четырех кнопок приведет к открытию формы, отфильтро ванной ио фамилиям пользователей, которые начинаются с буквы из выбранной группы. Например, процедура обработки события щелчка на кнопке А-Д выгля дит следующим образом:
Рис. 8.10. Просмотр клиентов в алфавитных группах
Private Sub стЬ_АД_СПск( )
DoCmd.OpenForm "fгт_ПросмотрКлиентов". acNormal, , _
"Фамилия Like'A*’ or Фамилия Like 'Б*' or " & _
’’Фамилия Like'B*’ or Фамилия Like * Г*' or " & _
"Фамилия Like'A*'"
End Sub
Метод OpenForm открывает форму ^т_ПросмотрКлиентов с применением фильтра на записи соответствующих клиентов. На рис. 8.11 показана форма, открытая для просмотра списка клиентов в диапазоне фамилий А-Д.
■ 3 $айл й>а>к» вид
Встдвка
®ОРВ»Т
Записи Сирене ' ; Окна ^правка
г)е*Антт awwx.
- _ fl X
Tahoma
il8
^М^»М
^ Ж Ж ' 2* -J
А' &
Просмотр списка клиентов (двойной щелчок
• полная запись)зе^ып. |
Фамилия
'Имя
Отчество
Город
Телефон,
Антонова
Наталья
Ивановна
Кострома
234-543
Алексеев
Александр
Николаевич
Самара
573-691
Агеева
Евгения
Александровна
Снепенек
376-687
Александров
Миколаи
Петрович
Кемерово
62-56-12
Акинфеев
Андрей
Викторович
Александров
985-602
^Алтухое
Василий
Мтхай ловим
Иычж
655-765
Ашурова
Бера
Сергеевна
Саров
112-453
Азаров
Сергей
ЯМИОвИЧ
Москва
654-04-96
Березкина
Надежда
Васильевна
Чита
45-12-11
Марков
Михаил
Львович
Саратов
56-76-23
пакетов
Василий
Сергеевич
Красноярск
712-654
заранее
Владимир
Васильевич
Новосибирск
31-02-56
зугрое
Валерии
Иоанович
Москва
381-09-41
Белова
Полина
Михайловна
Кемерово
23-50-91
Бурков
Сергей
Петрович
Пе$н"Ь
59-32-18
Красин
Александр
Викторович
Владивосток
35-56-73
аузмикин
Виктор
Иванович
Находка
76-03-29
Бирюков
Владимир
Валерьевич
Москва
234-45-18
За сильев
^хаил
Викторович
Пппецк
50-65-96
Викторова
Светлана
Федоровна
Вологда
675-345
¥
> :
Рис. 8.11. Форма, содержащая отфильтрованный список клиентов
268
Форма, изображенная на рис. 8.11, служит для просмотра списка. Пользователям все еще недоступны все данные записи о клиенте. Для просмотра всей информации нужно дважды щелкнуть на любой записи в форме просмотра, после чего откроется полная запись клиента. Форма, отображающая полную запись, использует фильтрацию по конкретной записи, выбранной в форме, показанной парне. 8.11. Для этого необходим ключ, в качестве которого используется иоле типа Счетчик с именем Клиент! D, присутствующее в форме просмотра в невидимом состояв in . Па рис. 8.12 показана форма просмотра в режиме Конструктора. На ней вы можете увидеть ключевое поле.
..ДЖТОЯЛАСТТТ? flЯЛ Вп1У:ясгрКли»*п1* . pliWw] '
Ф^ Ф^ш дряе^ Вид Вст^кй -Форййт Сервис ^кио ' £я|М8К88^ Дм-:а ^>трф* _ 5 х i
:L$ -^ч ^ лЫ О ^П X Q<—>-1 ,йебйЙййЫб^х ■Зда^^им-^,ле. _ * кь» .. ^. №ййШ$1я№ Ж; ОрластьДанмь v )X •* —Нг Д- . =№« <* ^■^Wi^‘l^9^^AS^dM^^^-S^M»»^™.w ij • • • 1 ■ » • г • ) • < • 5 • • 6 I • 7 - ■ i < 9 - Ю ; itV-^ -I}"” ■ и ' W^i ■ В • -17 I ®:L$ -^ч ^ лЫ О ^П X Q<—>-1 ,йебйЙййЫб^х ■Зда^^им-^,ле. _ * кь» .. ^. №ййШ$1я№ Ж; ОрластьДанмь v )X •* —Нг Д- . =№« <* ^■^Wi^‘l^9^^AS^dM^^^-S^M»»^™.w ij • • • 1 ■ » • г • ) • < • 5 • • 6 I • 7 - ■ i < 9 - Ю ; itV-^ -I}"” ■ и ' W^i ■ В • -17 I ®Рис. 8,12, Форма просмотра списка клиентов в режиме КонструктораРис. 8,12, Форма просмотра списка клиентов в режиме Конструктора
:L$ -^ч ^ лЫ О ^П X Q
<—>-1 ,йебйЙййЫб^х ■Зда^^им-^,ле. _ * кь» .. ^. №ййШ$1я№ Ж
; ОрластьДанмь v )X •* —Нг Д
- . =№« <* ^■^Wi^‘l^9^^AS^dM^^^-S^M»»^™.w i
j • • • 1 ■ » • г • ) • < • 5 • • 6 I • 7 - ■ i < 9 - Ю ; itV-^ -I}"” ■ и ' W^i ■ В • -17 I ®
:L$ -^ч ^ лЫ О ^П X Q
<—>-1 ,йебйЙййЫб^х ■Зда^^им-^,ле. _ * кь» .. ^. №ййШ$1я№ Ж
; ОрластьДанмь v )X •* —Нг Д
- . =№« <* ^■^Wi^‘l^9^^AS^dM^^^-S^M»»^™.w i
j • • • 1 ■ » • г • ) • < • 5 • • 6 I • 7 - ■ i < 9 - Ю ; itV-^ -I}"” ■ и ' W^i ■ В • -17 I ®
Рис. 8,12, Форма просмотра списка клиентов в режиме Конструктора
Рис. 8,12, Форма просмотра списка клиентов в режиме Конструктора
Все поля в форме просмотра имеют процедуру обработки двойного щелчка. Из этих процедур вызывается подпрограмма открыть_запись_клиента, из которой ог крывается форма, отображающая все данные о клиенте. Теперь значение клюна используется методом OpenForm для открытия формы с подробными сведениям к На рис. 8.13 показан программный модуль, принадлежащий форме просмотра. Двойной щелчок на записи в форме просмотра приведет к вызову формы с подробными сведениями о клиенте Форма, содержащая эти сведения, показана i а рис. 8.14.
В общем, при работе с большим количеством клиентов (или с другими однотипными данными) пользователи могут получить достаточно быстрый доступ к н-?- обходимым им подробным снедениям, если записи будут разбиты на небольшие группы, которые можно будет просмотреть. Затем из промежуточной формы Просмотра они могут перейти к детальной информации о клиенте. Примени-
ние данной технологии позволяет получить полные сведения о клиенте всего за несколько щелчков, избавляя пользователей от необходимости прокрутки длинных списков.
Рис. 8.13. Программный модуль формы просмотраРис. 8.13. Программный модуль формы просмотра:^"'£Не ЕЛ View: Insert. £ebug ^un 1«& ■ SidTIns Window ijelp JiW-A-rr-s:»^:^"'£Не ЕЛ View: Insert. £ebug ^un 1«& ■ SidTIns Window ijelp JiW-A-rr-s:»^Рис. 8.14. Форма с подробными сведениями о клиентеРис. 8.14. Форма с подробными сведениями о клиенте«с1я^ёТЙЖ' ХййЯг«с1я^ёТЙЖ' ХййЯг
Рис. 8.13. Программный модуль формы просмотра
Рис. 8.13. Программный модуль формы просмотра
:^"'£Не ЕЛ View: Insert. £ebug ^un 1«& ■ SidTIns Window ijelp JiW-A-rr-s:»^
:^"'£Не ЕЛ View: Insert. £ebug ^un 1«& ■ SidTIns Window ijelp JiW-A-rr-s:»^
Рис. 8.14. Форма с подробными сведениями о клиенте
Рис. 8.14. Форма с подробными сведениями о клиенте
«с1я^ёТЙЖ' ХййЯг
«с1я^ёТЙЖ' ХййЯг
ТРЮК№ 80ТРЮК№ 80Предотвращение игнорирования установленных вами параметров запуска
ТРЮК
№ 80
ТРЮК
№ 80
Исключение возможности вызова окна базы данных путем удержания клавиши Shift в нажатом состоянии.
После того как на разработку приложения базы данных ушла масса времени и установлены все параметры запуска, совсем не хочется, чтобы кто-нибудь мог, престо удерживая клавишу Shift при запуске, получить возможность ковырятьс 1 в вашем приложении. В данном трюке рассматриваются два разных способа предотвращения этой возможности: отключение обработки кода нажатия клавиш i Shift для баз данных Access (MDB) и то же самое для проектов Access (ADP).
Access MDB
При работе с файлами MDB трюк заключается в добавлении к объекту базы данных свойства, названного AUowBypassKey. Установка для свойства значения Fais? выключает действие клавиши Shift, а возврат к значению True включает его снов.-. Вам нужно решить, какое именно событие послужит для значения этого свойств i переключателем. Это может быть вход в базу данных определенного пользователя или, как в приводимом далее примере, присутствие в каталоге базы данных файла с именем РазрешениеОбхода.ТхТ:
public Function УстановкаОбхода( )
If ten(DIr(Currentproject. Path & "\Разрешение0бхода.txt ")} = 0 Then ИзменениеСвойства "AUowBypassKey", DB_BOOLEAN. False, True
Else
ИзменениеСвойства "AUowBypassKey’’, DB^BOOLEAM, True, True End If
End Function
Public Function ИзменениеСвойства(sТг_ИмяСвойства As String.
Уаг^ТипСвойства As Variant, _ Уаг_ЗначениеСвойства As Variant, _ BolDDL as Boolean) As Boolean
Dim Свойство As Variant
Const соп_ОшибкаОтсутствияСвойства = 3270
On Error GoTo ИзмСвойства_ошибка
CurrentDb.Properties(51г_ИмяСеойства) = Уаг_ЗначениеСвойства ИзменениеСвойства = True
ИзмСеойства_выход:
Exit Function
ИзмСвойства_ошибка:
If Err = соп_ОшибкаОтсутствияСвойства Then 'Свойство не найдено Set prp = CurrentDb.CreateProperty(Stг_ИмяСвойствa, _
Vaг^ТипСвойства, _
Уаг_ЗначениеСвойства. bolDDL) CurrentDb.Properties.Append prp
Resume Next
Else
’Неизвестная ошибка
MsgBox Err.Description
ИзменениеСвойства = False
Resume ИзмСвойства_выход
End If
End Function
После того как программа проверит наличие файла РазрешениеОбхода-txt, она вызовет функцию ИзменениеСвойства и передаст ей значение False, если файл не будет найден, или True, если он будет найден.
Сначала функция ИзменениеСвойства попытается присвоить переданное ей в переменной уаг^ЗначениеСвойства значение свойству 51г_ИмяСвойства, в качестве которого в данном случае выступает AllowBypassKey. Ошибка под номером 3270 возникает при первом вызове этой функции с именем нового свойства, поскольку это свойство еще не было добавлено к коллекции свойств базы данных. Функция перехватывает ошибку под этим номером и создает свойство во фрагменте обработки ошибки.
В данном примере используется метод CurrentDB, поэтому вам не требуется вручную устанавливать ссылку на библиотеку DAO для Access 2000 и 2002 (в Access 2003 эта ссылка устанавливается по умолчанию). Нужно отметить, что метод CurrentDB при использовании в файлах MDB 2000 или 2002 устанавливает скрытую ссылку на библиотеку объектных модулей Microsoft DAO 3.6.
Последний параметр, передаваемый функции ИзменениеСвойства (bolDDL), устанавливает DDL-параметр свойства AllowBypassKey. Параметр DDL определяет, может ли свойство быть изменено автоматически. Устанавливая значение этого параметра в True, вы не даете возможности кому-нибудь, к то знаком с программированием в среде VBA, автоматически переключить значение свойства.
После того как программный код будет введен в модуль Access, вам нужно обеспечить его запуск в начале работы базы данных. Лучше всего это сделать с помощью макроса AutoExec, который является не чем иным, как обыкновенным макросом, имеющим специальное имя. Ориентируясь на это имя, Access запускает его автоматически. Макрос AutoExec выполняется после открытия формы, объявленной в диалоговом окне Параметры запуска. Если вы используете Параметры запуска и, наряду с вызовом функции УстановкаОбхода, обрабатываете в макросе еще какие-нибудь события, нужно учесть некоторые обстоятельства.
Если вы вызываете функцию из макроса AutoExec и выводите форму в начале работы базы данных (вызывая се либо из макроса AutoExec, либо объявляя в окне Параметры запуска), нужно открыть базу данных, не удерживая клавишу Shift. Тогда свойство AllowBypassKey будет добавлено к базе данных.
Если файл Разрешен иеОбхода. txt и файл Access MDB будут находиться в одном каталоге и вы откроете базу данных Access, свойство AllowBypassKey приобретет значение True, но обход параметров запуска при первом открытии базы данных разрешен не будет. Для обхода параметров запуска, включая макрос AutoExec, база данных Access должна быть запущена вторично, с удерживаемой в нажатом состоянии клавишей Shift, поскольку теперь внутреннее свойство AllowBypassKey имеет значение True. Удаление файла РазрешениеОбхода-txt из каталога базы данных переключит значение свойства в False при следующем запуске базы данных без удерживания клавиши Shift в нажатом состоянии, исключая возможность обхода параметрон запуска и макроса AutoExec следующим пользователем.
Если вы используете Access 2003 и уровень обеспечения безопасности макросе з не установлен в Низкий, то клавишу Shift нужно удерживать в нажатом состоянии во время щелчка на кнопке Открыть окна Предупреждение системы безопасности показанном на рис. 8.15.
Рис. 8.15. Предупреждение системы безопасности Access 2003
Access ADR
Поскольку большинство проектов ADP используют только ADO, разработчики корпорации Microsoft предоставили способ нейтрализации клавиши Shift без обращения к библиотеке DAO прямым или косвенным путем. Этот способ добавления AllowBypassKey намного проще, но, к сожалению, он работает только в проектах ADP. Следующий пример программного кода работает аналогично фрагменту, относящемуся к Access MDB, но не требует использования функции наподобие ИзменениеСвойства:
Public Function УстановкаОбхода( )
If LenfDiг(CurrentProject.Path & "\AllowByPass.txt’’)) = 0 Then CurrentProject.Properties.Add "AllowBypassKey’’. False
Else
Currentproject.Properties Add "AllowBypassKey", True End If
End Function
Хотя этот метод настройки свойства AllowBypassKey короче и, наверное, его прок е использовать в проектах ADP, у него есть существенный недостаток: он не предоставляет возможности исключить автоматическое изменение свойства AllowBypas;- Кеу путем установки параметра DDL.
Будьте осторожны
Учитывая действенность данной технологии нейтрализации клавиши Shift, вам самим нужно обезопаситься от блокировки базы данных. Видимо, следует найти способ программного изменения в среде Access MDB параметра DDL на False, чтобы при необходимости иметь возможность автоматического изменения режима блокировки. Если вы все же заблокировали себе доступ к базе данных, всегда можно будет создать новую базу данных и импортировать в нее все объекты заблокированной базы, после чего заново установить параметры запуска и заменить 31- блокированную базу новой.
ТРЮК№ 81ТРЮК№ 81Визуализация длительных процессов
ТРЮК
№ 81
ТРЮК
№ 81
Если программа осуществляет долгую циклическую обработку данных и вы не предусмотрели какую-нибудь визуализацию процесса, пользователи могут подумать, что система зависла.
Когда щелчком на кнопке запускается какой-нибудь процесс, требующий для выполнения некоторого времени, пользователь не знает, идет ли этот процесс или система зависла. Представьте, что вы щелкнули на кнопке формы и не заметили никаких изменений. Возможно, что в течение пяти или деся ти минут система будет невосприимчива к командам.
Представляете, насколько неприятна подобная ситуация для пользователя, сидящего за компьютером? Он должен решать, стоит ли прервать процесс или дать системе возможность и дальше пребывать в состоянии, похожем на зависание. С другой стороны, если он остановит нормально идущий процесс, ему придется запускать его заново.
Не стоит оставлять пользователей в столь затруднительном положении. Это вы знаете, что идет обработка 100 000 записей, требующая некоторого времени. Но пользователи могут этого и не знать и пребывать в полном недоумении.
В данном трюке используются возможности метола SysCmd, позволяющего во время интенсивной работы процессора помещать сообщения в строку состояния даже в том случае, если обновление экрана отключено. На рис. 8.16 показана форма (в простейшем виде). Кнопка уже нажата, и процесс обработки записей запущен. Обратите внимание на левый нижний угол экрана. В нем расположено постоянно обновляемое сообщение.
Рис. 8.16. Сообщение, связанное с ходом процесса, размещенное в строке состоянияРис. 8.16. Сообщение, связанное с ходом процесса, размещенное в строке состояния
Рис. 8.16. Сообщение, связанное с ходом процесса, размещенное в строке состояния
Рис. 8.16. Сообщение, связанное с ходом процесса, размещенное в строке состояния
Сообщение в строке состояния содержит информацию ^ Обработано 2741 записей из 8500». Программисту нетрудно понять, что присутствие в сообщении общего числа обрабатываемых записей означает использование свойства количества записей.
Код
Процедура обработки события щелчка на кнопке использует следующий программный код:
Private Sub стЬ_0бработкаПродаж_С11ск( )
Dim conn As ADODB.Connection
Set conn = Currentproject.Connection,A
продолжение зУ
Dim recset As New ADODB.Recordset
Dim всего^записей As Long
Dim номер_записи As Long
номер_записи = Q
recset.Open "Select * From Продажи", conn, adOpenKeyset. adLockOptimistic всего_записей = recset.RecordCount Do Until recset.EOF
recset.Fields("Доход") = recset.F1elds("Продажи") _
- recset.Fl elds("Издержки")
номер_записи = номер_записи + 1
сообщение = "Обработано " & номер_записи & "записей из " & всего_записей SysCmd acSysCmdSetStatus, сообщение
recset,MoveNext
Loop
recset.Close
Set recset = Nothing
SysCmd acSysCmdClearStatus
End Sub
Программа создает набор записей и осуществляет циклический перебор. До запуска цикла переменной всего^загисей присваивается значение свойства Record- Count, а во время циклического перебора записей другая переменная. номер_запи(и, получает приращение. Обе эти переменные используются при создании сообщения:
сообщение = "Обработано " & номер_записи & "записей из " & всего_записей Затем это сообщение используется в методе SysCmd:
SysCmd acSysCmdSetStatus, сообщение
Ио окончании обработки строка состояния очищается путем передачи методу SysCmd соответствующей константы:
SysCmd acSysCmdClearStatus
Трюк в трюке
Предоставление информации о ходе процесса в том виде, который здесь рассматривается, поможет оценить продолжительность всей работы. Если сообщение содержит лишь номер обрабатываемой записи, без указания их общего количесп а, вы не поймете, сколько продлится процесс, К примеру, сообщение вида «Обрабатывается запись 2471» нс позволяет установить, пройдена ли половина процесс а, близок ли он к завершению или находится лишь в начальной стадии.
Разумеется, сообщение вида «Обработано X записей из XX» работает только в цикле. Другие длительные процессы могут не иметь связи с циклом. Сложны и запрос может занять достаточно много времени, особенно если для его выполнения требуется обработать массу записей. Так же легко внедриться в процесс выполнения запроса, как в цикл, не представляется возможным, поэтому в строку состояния нужно поместить время начала процесса.
Функция Now возвращает показание системных часов. Отображая его в стро <е состояния, вы, по крайней мере, сообщаете пользователю о времени начала процесса, позволяя ему сравнивать это время с показаниями часов в области уведо л- лений в правой части панели задач Windows.
Трюк № 82. Предоставление возможности выбора серверной базы данных 275
ТРЮК№ 82ТРЮК№ 82Предоставление пользователю возможности выбора серверной базы данных
ТРЮК
№ 82
ТРЮК
№ 82
Хранение строк подключения отрытого доступа к данным (ODBC) в таблице в полностью готовом к использованию виде.
Некоторые системные приложения предоставляют возможность взаимодействия с несколькими базами данных. До тех пор, пока структура различных баз данных и (или) их таблиц будет отвечать общей схеме, у вас будет возможность переключаться между ними. Простым способом реализации этой возможности станет предоставление пользователям списка доступных подключений, из которого они смогут выбрать базу данных для текущей работы.
Нарве. 8.17 показана таблица, которая содержит строки подключения ODBS.
ЭобДИте Wx«rz.ЭобДИте Wx«rz.OD6C;MTABASE=DerrorttUID^PWD=vD8f^ODBC;DATABASE=To(onto,UIO=SA,PWCH‘DSN=SQLServer-Toronto б№С;рАТАВД№То^OD6C;MTABASE=DerrorttUID^PWD=vD8f^ODBC;DATABASE=To(onto,UIO=SA,PWCH‘DSN=SQLServer-Toronto б№С;рАТАВД№То^Н^мер строкя под/шюя^мл^ .1 имя страхи под«л^очуния : Лондон2."■_ Париж_3„и w_.Н^мер строкя под/шюя^мл^ .1 имя страхи под«л^очуния : Лондон2."■_ Париж_3„и w_.___27Р£К5кЛОД^ODBС; DATABAS Е=Lon don, У ID* SA,PW|>; DSN^SQLSeiver E urope OD6C,DATABASE=Pans.UID-SA.PWO.DSN=SQLServ9f-Europe___27Р£К5кЛОД^ODBС; DATABAS Е=Lon don, У ID* SA,PW|>; DSN^SQLSeiver E urope OD6C,DATABASE=Pans.UID-SA.PWO.DSN=SQLServ9f-EuropeРис. 8.17. Таблица, заполненная строками подключения ODBSРис. 8.17. Таблица, заполненная строками подключения ODBS
ЭобДИте Wx«rz.
ЭобДИте Wx«rz.
OD6C;MTABASE=DerrorttUID^PWD=vD8f^
ODBC;DATABASE=To(onto,UIO=SA,PWCH‘DSN=SQLServer-Toronto б№С;рАТАВД№То^
OD6C;MTABASE=DerrorttUID^PWD=vD8f^
ODBC;DATABASE=To(onto,UIO=SA,PWCH‘DSN=SQLServer-Toronto б№С;рАТАВД№То^
Н^мер строкя под/шюя^мл^ .1 имя страхи под«л^очуния : Лондон
2."■_ Париж_
3„и w_.
Н^мер строкя под/шюя^мл^ .1 имя страхи под«л^очуния : Лондон
2."■_ Париж_
3„и w_.
___27Р£К5кЛОД^
ODBС; DATABAS Е=Lon don, У ID* SA,PW|>; DSN^SQLSeiver E urope OD6C,DATABASE=Pans.UID-SA.PWO.DSN=SQLServ9f-Europe
___27Р£К5кЛОД^
ODBС; DATABAS Е=Lon don, У ID* SA,PW|>; DSN^SQLSeiver E urope OD6C,DATABASE=Pans.UID-SA.PWO.DSN=SQLServ9f-Europe
Рис. 8.17. Таблица, заполненная строками подключения ODBS
Рис. 8.17. Таблица, заполненная строками подключения ODBS
В форме выбора подключений пользователи видят простые и понятные имена, взятые из второго столбца (первый столбец служит для сортировки списка). На рис. 8.18 показаны форма и поле со списком, предназначенные для выбора подключения.
Рис. 8.18. Выбор подключаемой базы данныхРис. 8.18. Выбор подключаемой базы данных
Рис. 8.18. Выбор подключаемой базы данных
Рис. 8.18. Выбор подключаемой базы данных
Значение, выбранное в поле со списком, используется в программе для установки свойств a Conn ection для объекта подключения ADO:
Dim conn As ADODB.Connection
Set conn = New ADOOB.Connection
conn.Connectionstring = He.cmblonnections
conn.Open
Этим способом Пользователи могут по собственному желанию легко заменить рабочую базу данных.
ТРЮК№ 83ТРЮК№ 83Отмена интервала времени ожидания
ТРЮК
№ 83
ТРЮК
№ 83
Б занятой сетевой среде иногда необходимо проявлять терпение.
При использовании Access для подключения к внешней базе данных производт - тельность зависит от ряда факторов. Один из них относится непосредственно к характеристикам сети: полосе пропускания и загруженности. Полоса пропуска ■ пия может быть постоянной, но, под воздействием часто меняющейся загруженности канала, порой трудно определить ее ожидаемое значение.
Для обеспечения надежного завершения запущенного вами вычислительного Пре - цесса, особенно если он затягивается, вы можете выключить свойство ADO, определяющее лимит времени ожидания, — CommandTimeout. Изначально это свойство имеет значение 30 секунд. Это означает, что если сервер не ответит вашему приложению в течение 30 секунд, будет сделано предположение, что он вовсе перестал отвечать на запросы. При этом вы сможете увидеть соответствующее сообщение, показанное на рис. 8.19.
Рис. 8.19. Сообщение об ошибке превышения лимита времени ожиданияРис. 8.19. Сообщение об ошибке превышения лимита времени ожидания
Рис. 8.19. Сообщение об ошибке превышения лимита времени ожидания
Рис. 8.19. Сообщение об ошибке превышения лимита времени ожидания
Установка лимита времени ожидания в 0 приводит к отключению данного свой ства. После этого ваше приложение будет дожидаться ответа бесконечно. Пред полагая, что объект подключения ADO, названный сопл, уже используется, уста новить это значение можно следующим образом:
conn.CommandTimeout = 0
Недостаток такого подхода в том, что иногда вы действительно можете ждать дс бесконечности. Если кто-нибудь выдернул разъем на сервере, вы можете об этом и не узнать. Возможно, имеет смысл поэкспериментировать с различными значениями лимита времени. Учтите, что используемое число означает секунды, поэтому значение 300 будет равно пятиминутному ожиданию. Лучше знать, что ожидание успешного или аварийного завершения продлится не более 5 минут, чем ждать до бесконечности.
ТРЮК№ 84ТРЮК№ 84Хранение значений свободных элементов управления с целью их повторного использования
ТРЮК
№ 84
ТРЮК
№ 84
Предоставление пользователям возможности автоматического воссоздания варианта заполнения формы, избавляющего их от необходимости повторного ввода информации.
Значения свободных элементов управления при закрытии формы, как правило, теряются.
Представьте, что форма имеет несколько свободных элементов управления, а пользователь выбирает в них значения, сочетание которых может ему пригодиться в последующем. Если сохранить это сочетание в каком-нибудь узнаваемом виде и повторно вызвать его, то можно будет сэкономить массу времени. Давайте назовем такое сочетание значений схемой.
Сохранение в таблице значений свободных элементов управления ни с чем их не связывает, поскольку ведется программным способом. На рис. 8.20 показана форма с тремя свободными списками.
Рис. 8.20. Форма, хранящая схемы значений элементов управленияРис. 8.20. Форма, хранящая схемы значений элементов управления
Рис. 8.20. Форма, хранящая схемы значений элементов управления
Рис. 8.20. Форма, хранящая схемы значений элементов управления
Нужно выбрать значения в каждом списке, ввести имя схемы и щелкнуть на кнопке Добавить / Изменить. В результате будет создана схема, сохраняющая значения списков.
Код
Процедура обработки щелчка на кнопке Добавить / Изменить выглядит следующим образом:
Dim conn As ADODB.Connection
Set conn = CurrentProject.Connection Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset
ssql = "Insert into 1Ы_Схемы Values("
ssql = ssql ssql = ssql ssql = ssql ssql = ssql
&& Me.1х1_Имя_схемы & "1, "
& &Me.1151_Фипиалы & "'. "
& " "’ & Me.1151_Саедения &"
& "‘" & Me.list_Cnoco6 доставки & "’)"
'сначала удаление схемы
delete_ssql = "Delete * From 1Ы_Схемы Where Схема='” & schemename & conn.Execute (delete^ssql)
’теперь вставка схемы conn.Execute (ssql)
conn.Close
Set conn = Nothing
Me. lst_CxeMbi. Requery Exit Sub eгr_end;
MsgBox Err.Description
Чтобы не отвлекать вас от сути трюка, часть кода, относящаяся к проверке на зн э- чение null и т. п„ опущена.
Работа программы
Значения, выбранные в списках, и имя схемы становятся записью таблицы 1Ы_ Схемы (рис. 8.21).
Рис. 8.21. Значения элементов управления, сохраненные в таблице
Список слева наполняется по мере сохранения новых схем и позволяет вернуть значения любой схемы в форму. На рис. 8.22 показана форма, в которой уже доступно несколько схем.
Кнопки Загрузить и Удалить работают с таблицей записей и формой. Кнопка Загрузить устанавливает значения свободных элементов управления в соответствии :о схемой, выбранной в списке. Кнопка Удалить удаляет соответствующую запись чз таблицы.
Рис. 8.22. Выбор из нескольких схем
Трюк в трюке
Теперь стоит подумать и о том, как работать со свободными списками, в которых разрешено выделять несколько значений. В этом случае нужно хранить взаимосвязанные данные. Например, в какой-то схеме в списке сделан множественный выбор. Чтобы его сохранить, нужно создать набор связанных таблиц. В одной таблице будет храниться общая информация о схемах, а в каждой записи другой таблицы — отдельное значение списка. Таблицы связаны ключом, в качестве которого используется имя схемы. На рис. 8.23 показано, как все это можно реализовать.
Рис. 8,23. Хранение схем с множественными выборами в элементах управления
Во вспомогательной таблице хранятся имя схемы, имя элемента управления, значение элемента управления, позиция элемента в списке и сведения о выборе элемента. Каждый элемент списка сохранен вместе со своей позицией и состоянием выбран пости. Все эти параметры понадобятся для воссоздания списка и выделения в нем выбранных элементов при повторной загрузке схемы.
ТРЮК№ 85ТРЮК№ 85Сортировка записей случайным образом
ТРЮК
№ 85
ТРЮК
№ 85
Получение при необходимости уникального порядка следования записей.
Записи в таблице всегда размещаются в определенном порядке, для чего могут применяться первичный ключ или другие индексы. Даже после удаления всех индексов записи располагаются в порядке их внесения в таблицу.
Данный трюк применяется для получения действительно случайной последовательности записей. Сортировка на самом деле ведется на основе случайных значений! Чтобы трюк заработал, нужно добавить в таблицу еще одно поле. Затеи следует заполнить поле случайными значениями:
Sub Поле^случайной^сортировки( )
Dim conn As ADODB.Connection
Set conn = Currentproject.Connection
Dim ssql As String
Dim recset As New ADODB.Recordset
Dim tbl As String
tbl = ЧЫ_Клиентым 'имя таблицы должно передаваться в качестве аргумента
ssql = "Alter Table " & tbl & " Add Column СлучайнаяСортировка Long" 'если поле уже существует, нужно перехватить ошибку
On Error Resume Next
conn.Execute ssql
Randomize
recset.Open "select * From " & tbl, conn,. adOpenOynamic, adlockOptimistic
Do Until recset.EOF
recset.Fields("СлучайнаяСортировка") = Int(Rnd( ) * 50000)
recset.MoveNext
Loop
recset.Close
Set recset = noting
conn.Close
MsgBox "Готово!"
End Sub
Таблица — в данном примере 1Ы_Клиенты — получает новое поле, названное СлучайнаяСортировка. Имейте в виду, что поле уже может присутствовать в таблице в результате предыдущего запуска программы, поэтому операции предшествует инструкция On Error:
ssql = "Alter Table " & tbl & " Add Column СлучайнаяСортировка Long" 'если поле уже существует, нужно перехватить ошибку On Error Resume Next
conn.Execute ssql
Затем все записи таблицы перебираются в цикле, и поле СлучайнаяСортировка заполняется случайными значениями, получаемыми с помощью функции RND:
recset.Е1е1Ь5("СпучайнаяСортироека") =- Int(Rnd( ) * 50000)
Теперь таблица 1Ы_Клиенты может быть отсортирована по значениям поля СлучайнаяСортировка (рис. 8.24).
При каждом запуске подпрограммы значения поля СлучайнаяСортировка изменяются, обеспечивая новый порядок следования записей.
".■-vj"
КлиеиО
Фамилия
Ими Т" Отчество
Гирод
Адрес
СяучайндяСоемфаека
14
Александр
Николай Петрович
Кемерово
Волошина 56-34
1946
13
Баранов
Владимир Васильевич
Новосибирск
Индустриальная 128-32
4565
7
Алтуков
Василий Михайлович
Иваново
Громовой 22-18
S7B1
174
Линев
АндрейСеменович
Ставрополь
Колхозная 16-45
7154
176
Лукин
Евгений Борисович
Мурманск
Полярников 34-8
9607
11
Барков
Михаил Львович
Саратов
Красноармейская 15-34
10656
170
Коноплев
Алексей Анатольевич
Иркутск
Ангарская 8-12
10696
Ашурова
ВераСергеевна
Саров
Юности 11-7
12638
у'.
171
Копылов
Николай Васильевич
Новгород
Московская 26-9
17990
22
Кравцов
ОлегНиколаевич
Клин
Авиаторов 18
19360
12
Бекетов
Василий Сергеевич
Красноярск
Прибрежная 23-41
22879
3
Алексеев
Александр Николаевич
Самара
Ташкентская 23-41
23521
175
Лозовой
Александр Владимирович
Курган
Машиностроителей 12-25
23645
10
Березкина
Надежда Васильевна
Чита
Автогенная 87-45
24061
169
Куликова
Марина Петровна
Тверь
Советская 15-104
27703
20
Васильев
Михаил Викторович
Липецк
Смоленская 12-56
2806.9
19
Бирюков
Владимир Валерьевич
Москва
Судакова 23-15
28302
177
Лысенко
Анатолий Сергеевич
Архангельск
Заводская 19-43
29796
За
- Г ••••"
1 .^^^■■^ ” “”°
Рис. 8.24. Записи, идущие в случайном порядке
ТРЮК№ 86ТРЮК№ 86Пакетное обновление элементов управления формы
ТРЮК
№ 86
ТРЮК
№ 86
Извлечение свойств элементов управления с целью быстрого внесения изменений.
При работе с формой в режиме Конструктора свойства элементов управления обычно настраиваются с помощью таблицы свойств. Вы можете выбирать отдельные элементы управления и настраивать их свойства поочередно или же выбрать несколько элементов и изменять свойства для всех элементов сразу. При использовании последнего метода количество свойств сужается и в списке остаются только те свойства, которые присущи всем выбранным элементам.
В большинстве случаев все работает хорошо и настройка свойств сразу для нескольких элементов управления не представляет особого труда. Но что делать, если вам нужно оценить предыдущее состояние свойства, прежде чем принимать решение о его изменении? В такой ситуации список свойств вам не поможет. Если выбрано несколько элементов управления, он не в состоянии отобразить состояние свойств отдельных элементов. Значение свойства отображается только в том случае, если оно присутствует во всех выбранных элементах управления, но таге случается далеко не всегда.
Получение доступа к свойствам элементов управления в программе
Хорошо, что в Access имеется свойство Controls, принадлежащее объектам типа форма, и свойство Properties, относящееся к самим элементам управления. Благо-
даря этому есть возможность считывать и записывать значения свойств элемег - тов управления. Для начала в примере 8.6 показана подпрограмма, в которой пре - исходит чтение значений свойств элемента управления.
Пример 8.6. Чтение значений свойств элемента управлений
Sub список_свойстб_элемента_управления()
Dim имя_формы As String
Dim ctl As Control
Dim тип_списка As Integer
Dim номер_свойства As Integer
имя_формы = "fTml" ‘здесь введите нужное имя!
DoCmd.OpenForm (имя_формы), acDesign
тип_списка = 2 ‘внесите нужные изменения для работы с Select Case
Select Case тип_списка
Case 1
' список имен и значений свойств отдельного элемента
With Forms(имя_формы).Controls(l)
For номер_свойства - 0 То .Properties.Count - 1
Debug.Print .Name & ":"&_
.Properties(номер_свойства),Name & ":" & _
.Properties(номер_свойства).Value
Next
End With
Case 2
' список значении указанного свойства для всех элементов формы
With Forms(имя_формы)
For Each ctl In Forms(имя_формы).Controls
On Error Resume Next
Debug.Print ctl.Name & ": Подпись=" & _
ctl. PropertiesC'Caption")
Next
End With
End Select
End Sub
Подпрограмма примера 8.6 содержит два варианта считывания свойств элеми - тов управления, выбор одного из которых осуществляется присвоением переме! - ной тип^списка значения 1 или 2. Инструкция Select Case использует присвоенный номер для запуска того или иного фрагмента кода. Если значение переменной тип^списка равно 1, считываются свойства отдельного элемента управления. Имя каждого свойства и его значение выводятся в окне Immediate. Ссылка на отдельный элемент управления обозначена в примере 8.6 просто как .Controls(l). Вместо этого вы можете ввести имя реального элемента управления, поместив его в кавычки.
На рис. 8.25 показано, как в результате работы программы возвращены все имена свойств и их значения для отдельного элемента управления.
Если переменной тип_списка присвоить значение 2, будут извлечены данные обо всех элементах управления. При этом будет возвращено одно из свойств, обозначенное в следующей строке:
Debug.Print ctl.Name & ": Подпись=“ & ctl.PropertiesC'Caption")
Рис. 8.25. Возвращение списка свойств элемента управления
Обратите также внимание на инструкцию On Error Resume Next, предваряющую строку. Она включена в программу потому, что у некоторых элементов управления ряд свойств может отсутствовать. В данном примере идет обращение к свойству Caption, но у некоторых элементов, таких как поля, этого свойства нет. Перехват ошибки
Рис. 8.26. Возвращение значений свойства Caption для тех элементов, у которых оно имеется
обеспечивает непрерывность процесса и вывод в окно Immediate сведений, касающихся только тех элементов управления, у которых заявленное свойство имеете я (рис. 8.26).
Заметьте, ч то программа на рис. 8.26 обращается к форме из программной строк к Для работы программы важно, чтобы форма была открыта в режиме Конструктора, поскольку главным предназначением трюка является пакетное обновление свойств. Открытие формы в режиме Конструктора обеспечивается инструкцией DoCmd, которой следует передать имя открываемой формы. В следующей программной строке нужно заменить frml на имя вашей формы: имя_формы = "frml" ’здесь введите нужное имя!
Простой способ изменения свойств
В примере 8.7 представлена программа, изменяющая значение свойства ForeCobr (Цвет текста) на red (красный) для всех полей формы. Поскольку работа ведется с отдельным типом элемента управления, в программе проводится проверка состояния свойства ControlType (Тип элемента управления). Если тип соответствует заданному значению, свойство изменяется.
Пример 8.7. Обработка отдельного типа элемента управления
Sub update_controls( )
Dim ctl As Control
Dim имя_формы As String
имя_формы = "frml"
DoCmd.OpenForm (имя_формы), acDesign
With Forms(имя_формы)
For Each ctl In Рогт5(имя_формы).Controls
Enum AcControlTwe Member of AccessEnum AcControlTwe Member of Accessa/» Ac Currentview^ Ac DataAcc ess Pag eViewad6 AcDataObjecfType^ AcDalaTransferTvpe^ Ac DeMew■^ AcExportXMLEn coding .^P AtExportXMLObjectType■iP AtExportXMLOtherfiags дА1 AtExporiXMLSchemaFon ^' AcFifeFormatip AcFoterType■^M AcFlnaFieida/» Ac Currentview^ Ac DataAcc ess Pag eViewad6 AcDataObjecfType^ AcDalaTransferTvpe^ Ac DeMew■^ AcExportXMLEn coding .^P AtExportXMLObjectType■iP AtExportXMLOtherfiags дА1 AtExporiXMLSchemaFon ^' AcFifeFormatip AcFoterType■^M AcFlnaFieidРис. 8.27. Просмотр констант, обозначающих типы элементов управленияРис. 8.27. Просмотр констант, обозначающих типы элементов управления3. ^LiJ _№S.3j3. ^LiJ _№S.3j3 .ШЙ3 .ШЙClassess AccessObjecIй AccessObjectProperbes& Acc essObJeclPropertyaR AcCloseSave^jp AcColorlndex^ AcCommandClassess AccessObjecIй AccessObjectProperbes& Acc essObJeclPropertyaR AcCloseSave^jp AcColorlndex^ AcCommandMembers of AcContmUype* ас 0 oun dObjectF ram e acCheckBox acComboBox acCommandButton at customcontrol at Image ac Label acUne acLisIBox aiObjectframe acOptionButlon acOptionGfOup acPage acPageBreak at Rectangle a c Subform atTabCtl acTextBox acToggieButtonMembers of AcContmUype* ас 0 oun dObjectF ram e acCheckBox acComboBox acCommandButton at customcontrol at Image ac Label acUne acLisIBox aiObjectframe acOptionButlon acOptionGfOup acPage acPageBreak at Rectangle a c Subform atTabCtl acTextBox acToggieButton
Enum AcControlTwe Member of Access
Enum AcControlTwe Member of Access
a/» Ac Currentview
^ Ac DataAcc ess Pag eView
ad6 AcDataObjecfType
^ AcDalaTransferTvpe
^ Ac DeMew
■^ AcExportXMLEn coding .^P AtExportXMLObjectType
■iP AtExportXMLOtherfiags дА1 AtExporiXMLSchemaFon ^' AcFifeFormat
ip AcFoterType
■^M AcFlnaFieid
a/» Ac Currentview
^ Ac DataAcc ess Pag eView
ad6 AcDataObjecfType
^ AcDalaTransferTvpe
^ Ac DeMew
■^ AcExportXMLEn coding .^P AtExportXMLObjectType
■iP AtExportXMLOtherfiags дА1 AtExporiXMLSchemaFon ^' AcFifeFormat
ip AcFoterType
■^M AcFlnaFieid
Рис. 8.27. Просмотр констант, обозначающих типы элементов управления
Рис. 8.27. Просмотр констант, обозначающих типы элементов управления
3. ^LiJ _№S.3j
3. ^LiJ _№S.3j
3 .ШЙ
3 .ШЙ
Classes
s AccessObjecI
й AccessObjectProperbes
& Acc essObJeclProperty
aR AcCloseSave
^jp AcColorlndex
^ AcCommand
Classes
s AccessObjecI
й AccessObjectProperbes
& Acc essObJeclProperty
aR AcCloseSave
^jp AcColorlndex
^ AcCommand
Members of AcContmUype* ас 0 oun dObjectF ram e acCheckBox acComboBox acCommandButton at customcontrol at Image ac Label acUne acLisIBox aiObjectframe acOptionButlon acOptionGfOup acPage acPageBreak at Rectangle a c Subform atTabCtl acTextBox acToggieButton
Members of AcContmUype* ас 0 oun dObjectF ram e acCheckBox acComboBox acCommandButton at customcontrol at Image ac Label acUne acLisIBox aiObjectframe acOptionButlon acOptionGfOup acPage acPageBreak at Rectangle a c Subform atTabCtl acTextBox acToggieButton
If ctl.ControlType = acTextBox Then ctl. PropertiesC'ForeColor") = vbRed End If
Next
End With
End Sub
Вы можете выбрать изменение свойства для всех элементов формы или для конкретного типа элемента управления. При работе с полным набором элементов лучше воспользоваться инструкцией On Error Resume Next, позволяющей избежать сбоев в том случае, если элемент управления не будет обладать каким-нибудь свойством.
Программа примера 8.7 обращается только к полям (acTextBox). На рис. 8.27 показан обозреватель объектов — Object Browser, который можно использовать для поиска названий отдельных элементов в перечне acControlType, представляющем имена констант, обозначающих типы элементов.
ТРЮК№ 87ТРЮК№ 87Обеспечение полного управления данными XML для любых версий Access
ТРЮК
№ 87
ТРЮК
№ 87
Использование MSXML-парсера для адаптации XML к приложениям.
Уровень поддержки XML возрастает с каждым новым выпуском Access, но полноценная работа с этим форматом данных не реализована до сих пор. К примеру, Access 2003 поддерживает импорт и экспорт XML, но даже ее функциональный уровень ограничен. Например, вы не можете импортировать атрибуты (тип данных XML).
Обращение к внешнему XML-napcepy не только улучшает поддержку XML, но и обеспечивает ее единый уровень для всех версий Access. Такая возможность обусловливается технологической независимостью парсера. Обратившись к парсеру, вы получаете в свое распоряжение полный спектр его возможностей.
Обращение к парсеру
Находясь в редакторе Access VB, воспользуйтесь меню Tools ► References (Сервис ► Ссылки) и откройте диалоговое окно References (рис. 8.28).
Воспользуйтесь прокруткой и найдите в списке Microsoft XML. Строка ссылки включает номер версии, нам подойдет любая из них. Если вам интересно, чем именно они отличаются друг от друга, обратитесь на веб-сайт корпорации Microsoft (www.microsoft.com).
ПРИМЕЧАНИЕ
Если ссылка на Microsoft XML на вашем компьютере отсутствует, загрузите MSXML- парсер с веб-сайта Microsoft (www.microsoft.com/xml).
После установки ссылки появляется множество разнообразных способов работы с XML. Способы применения парсера выходят за рамки данного раздела(в конце
. Й B--p^v£ti|:.■^ :ф @w . ^: i™a ^«> em/ : ^^ Window Help. Й B--p^v£ti|:.■^ :ф @w . ^: i™a ^«> em/ : ^^ Window HelpSi ^ Modules ^x Module 1 ^W?:Si ^ Modules ^x Module 1 ^W?:Option Compare DatabaseOption Compare Database* L -u— -. >?i. $'i*$yttrtio - MaxtaMtiZ (l^duie^^^. A^abetk'- ^ategortee* L -u— -. >?i. $'i*$yttrtio - MaxtaMtiZ (l^duie^^^. A^abetk'- ^ategorteeРис. 8.28. Добавление ссылки на парсер XMLРис. 8.28. Добавление ссылки на парсер XMLФайл Правка 0ид ^бренное Серене Справка-^ я **^ "^Адг^.^ ^ C:t£mployees.xml~ПереходФайл Правка 0ид ^бренное Серене Справка-^ я **^ "^Адг^.^ ^ C:t£mployees.xml~Переход: G-^ О Й Й (*; v^"0™ -^м™™ ^-. 3* В ^ * Д
. Й B--p^v£ti|:.
■^ :ф @w . ^: i™a ^«> em/ : ^^ Window Help
. Й B--p^v£ti|:.
■^ :ф @w . ^: i™a ^«> em/ : ^^ Window Help
Si ^ Modules ^x Module 1 ^W?:
Si ^ Modules ^x Module 1 ^W?:
Option Compare Database
Option Compare Database
* L -u— -. >?i. $'i*$yttrtio - MaxtaMtiZ (l^duie^^^
. A^abetk'- ^ategortee
* L -u— -. >?i. $'i*$yttrtio - MaxtaMtiZ (l^duie^^^
. A^abetk'- ^ategortee
Рис. 8.28. Добавление ссылки на парсер XML
Рис. 8.28. Добавление ссылки на парсер XML
Файл Правка 0ид ^бренное Серене Справка-^ я **^ "^
Адг^.^ ^ C:t£mployees.xml~Переход
Файл Правка 0ид ^бренное Серене Справка-^ я **^ "^
Адг^.^ ^ C:t£mployees.xml~Переход
<?кт1 versions"1.0е ?>
- <Empioyees>
- department DepartmentName="Legar>
<Етр1оуев>
<Employe6lD>n9816</Emph?yei?ID>
<Name>Ferrell A. FBnster<Ajame>
</Employee>
<Emp1oyee>
<Employ eelD > 56139 </Emp1 пу ее Ю>
<Uame>Terika Barr</Name>
</Employee>
^Employee*
Employe* JD> 08 7 77</E rnpkiyes КЪ
<Name>Lee Fale$c/Name>
</Employee>
<Emplayee?
<Employi?8lD >000 70</EmployeelD>
<fJame>Nathalie L* Ethan</Name>
</Employee>
<Employea>
Empki у @» J D>28223</EmplQ уееЮэ
<Name>8hawna Judith</f^me>
Рис. 8.29. Файл Employees.xmlРис. 8.29. Файл Employees.xmlперечислены некоторые информационные источники). Лучше мы рассмотрим использование парсера для загрузки XML-данных и вставки их в таблицу Access.
Рис. 8.29. Файл Employees.xml
Рис. 8.29. Файл Employees.xml
Попутно мы освоим еще пару трюков: фильтрацию XML-данных и загрузку атрибутов, Заранее подготовленный файл XML, заполненный информацией о служащих, показан на рис. 8.29.
Код
В программный модуль Access нужно ввести следующую процедуру, использующую объекты, доступные благодаря ссылке на парсер:
Sub чтение_хт1( )
On Error GoTo err_end
Dim conn As New ADODB,Connection
Set conn = Currentproject.Connection
Dim xmlobj As DOMDocument
Dim xml_list As IXMLDOMNodeList
Dim xml_node As IXMLDOMNode
Set xmlobj = New DOMDocument
xmlobj.async = False
xmlobj.Load ”C:\Employees.xml"
Set xml_list = xmlobj,selectNodes _ ("Employees/Department/Employee")
For Each xml_node In xml_list
ssql = "Insert Into 1Ы_Сотрудмики Values (" & _
xml_node,chiIdNodes(0).Text & ", ”’ & _ xml_node.childNodes(l).Text & ’" , '"&_ xml_node.parentNode.Attributes(O).Text & "')"
conn.Execute ssql
Next
MsgBox "Готово!”.
err_end:
MsgBox Err.Description
End Sub
Файл XML загружается в переменную объекта xmlobj:
xmlobj.Load "C:\Employees.xml"
Типичными объектами XML являются узлы и списки узлов. Списки представляют собой коллекцию узлов. Интересующие нас узлы представлены элементами employee, которые являются дочерними узлами по отношению к узлам department: Set xml—list = xmlobj.selectNodes _
("Employees/Department/Employее")
Узлы employee имеют в свою очередь два дочерних элемента: EmployeelD и Name. Эти дочерние элементы и родительский элемент department служат основой создания SQL-инструкции Insert.
ssql = "Insert Into гЬ1_Сотрулники Values (" & _
xml_node.chiIdNodes(9).Text & ". ’" &_ xml node.chiIdNodes(1).Text & "’, *" & _ xml_node.parentNode.Attribates(0).Text & "')"
После запуска процедуры таблица 1Ы_Сотрудники заполняется данными из XML- файла (рис. 8.30).
Итак, с помощью небольшой процедуры мы смогли выполнить две вещи, которые обычно считаются невозможными. Во-первых, мы добились от Access 2003
3 «ЬГСотрудники
■КсдСотр удинка
Им* Т
1 Отдел -
►
9616
Ferrell A, Fenster
Legal
56139
8777
Tanka Barr Lee Fates
Legal
70
Nathalie L Ethan
.Legal
28223
28370
44576
Shawna Judith Howard Dubwsky Sandi M. Beasley
• Legal
;Legal_
Legal
62586
Chuck Bremer
Legal
85647
Wylie Flack
Legal
11236
Phyllis S Grommet
' Legal
42259
75176
Danny 0 Onruch
Lamca Legaspi
Legal Legal
4053
93576
Karin L Walkowski Lee N Droppieman
: Legal :Legal
39307
36793
38129
Allan 0 Lord
Melissa Shimko
Gert Baucom
■Legal Legal
27777
37167
56745
57503
Cnssy Bunch Bennie P. Koshelnik Henry LaGrange Garland Shuler
: Marketing : Marketing : Marketing : Marketing
84045
Lalonya Ret he rd
Marketing
83867
Vicki P Viera
Marketing
17252
Lacaine U. Tague
Marketing ;
24937
Kathi Mr/
Marketing ;
Рис. 8.30. Данные XML, помещенные в Access
нормальной обработки данных XML, а во-вторых, мы добились импортирования атрибутов. Процедура данного трюка будет работать в любых версиях Access, имеющих ссылку на парсер, нс создавая проблем с размещением значений атрибуте в в таблице Access.
ТРЮК№ 88ТРЮК№ 88См. также «Использование Access в качестве базы данных XML» (Трюк № 95).
ТРЮК
№ 88
ТРЮК
№ 88
Использование собственных перечней
Использование легкоузнаваемых имен избавляет от необходимости запоминать сопоставляемые им номера, помогает избавиться от возможных ошибок и ускоряет проценте программирования.
Появляющиеся при вводе текста программы списки свойств и методов являются реальными помощниками в программировании. Например, ввод в программном модуле слова Application и точки после него приводит к появлению списка методов и свойств, присущих объекту Application.
Вы можете воспользоваться аналогичным средством для получения констант, относящихся к вашему проекту или роду деятельности. Возьмем, к примеру, приложение, в котором для некоторых операций нужно поместить в вычисления кед подразделения. Каждое подразделение имеет уникальный, но совершенно безликий номер, который трудно запомнить.
Вот где нам пригодится перечень переменных. Вы сможете не только присвоить имена числовым кодам, но и сделать доступными списки имен при вводе текста.
На рис. 8.31 показан программный модуль VBA. В области описаний для создания переменных используется инструкция Enum. Открытому этой инструкцией блоку присваивается имя (в данном примере — КодыОтделов) а для его завершения используется инструкция End Enum.
Рис. 8,31. Использование Enum для повышении эффективности программированияРис. 8,31. Использование Enum для повышении эффективности программирования
Рис. 8,31. Использование Enum для повышении эффективности программирования
Рис. 8,31. Использование Enum для повышении эффективности программирования
Внутри блока Enum каждый код подразделения связан с его названием. Теперь при написании процедуры достаточно набрать текст КодыОтделов и поставить точку, Тут же появится перечень переменных, из которых можно выбрать нужное значение. При выборе значения на самом деле выбирается номер подразделения, но теперь номера запоминать не нужно. В результате снижается количество ошибок, поскольку, честно говоря, до использования данной технологии я так и не смог запомнить, какой номер у рекламного отдела, 200 или 600. Благодаря использованию инструкции Enum я избавился от необходимости запоминать подобные вещи и смог сконцентрироваться на более важных аспектах своих проектов.
ТРЮК№ 89ТРЮК№ 89Преобразование текста в нужный регистр
ТРЮК
№ 89
ТРЮК
№ 89
Возвращение любой текстовой строки в верхнем, нижнем или смешанном регистре.
Иногда к разработчику предъявляется требование предусмотреть возможность изменения регистров букв текста. В принципе, это не проблема. Нужно просто применить функцию UCase или функцию LCase, с помощью которых строка текста возвращается, соответственно, либо в верхнем, либо в нижнем регистре.
Для получения текста в смешанном регистре, когда слова начинаются с прописных букв, а продолжаются строчными, специальной функции не существует.
В отличие от Microsoft Word Access не может возвращать слова в смешанном регистре. Пока мы ждем согласованных результатов работы от двух команд разработчиков корпорации Microsoft, в данном трюке рассматривается функция, возвращающая текст во всех трех комбинациях регистров: верхнем, нижнем и смешаннох. Функция принимает два аргумента: текст, подвергающийся преобразованию, и ти 1 применяемой обработки.
Код
Чтобы не изобретать велосипед, для преобразования текста в верхний или нижний регистр функция применяет, соответственно, встроенные функции UCase 1 LCase.
Для преобразования текста в смешанный регистр нужно применить циклическую обработку. Нетрудно догадаться, что каждый символ текста следует обработать функцией UCase или функцией LCase. Нужно только знать, к какой букве какую функцию применить.
Function изменить_регистр(текст As String, регистр As String) As String
Select Case регистр
Case "Верхний"
изменить_регистр = UCase(TeKCT)
Case "Нижний"
изменить^регистр = 1Сазе(текст)
Case "Смешанный"
'создание смешанного регистра
Dim индикатор_пробела As Boolean
индикаторовробела = False
'первая буква - всегда заглавная
изменить_регистр = UCase(Left(текст. 1))
For позиция = 2 То Ееп(текст)
If М1с1(текст, позиция, 1) - " " Then индикатор_пробепэ = True изменить_регистр = изменить_регистр & LCase(Mid(TeKCT, позиция, 1))
Else
If индикатор_пробела = True Then
изменить^регистр = изменить_регистр & UCase(Mid(текст, позиция, 1)) индикатор_пробепа = False
Else
изменить-регистр = изменить_регистр & LCase(Mid(текст, позиция, 1)) End If
End If
Next позиция
End Select
End Function
Сначала первая буква строки становится заглавной. Это не требует объяснений Затем оставшееся содержимое строки перебирается в цикле. В строке могут ветре - чаться пробелы, в этом случае переменная индикатор_лробела приобретает значение true. Если встретится символ, отличный от пробела, есть два варианта развития событий:
индикатора робе л а равен true — символ следует сразу за пробелом, поэтому подлежит преобразованию в символ верхнего регистра, после чего переменной индикатор_пробела нужно присвоить значение false;
ин ди като р_п робела равен false — символ не следует за пробелом, поэтому не является первым символом слова, следовательно, его надо преобразовать в символ нижнего регистра.
Обратите внимание, что перед преобразованием не нужно проверять символ на исходное состояние его регистра. Если символ следует за пробелом, то, вне зависимости от своего регистра, он все равно преобразуется в символ верхнего регистра. Тоже самое справедливо и для символов, не следующих за пробелом: они в любом случае преобразуются в символы нижнего регистра.
Работа программы
Функция изменение^регистра принимает два аргумента. Вы можете определить их значения в элементах управления формы, задать в коде программы или даже в окне Immediate. На рис. 8.32 показан результат вызова функции из формы.
Ол’.«Г.Ю-.,П» Ас"№» (Ф»ймй7 • 4шр^й|' ';- “Т^ ■ФеХо Qpa^l ■ Вид- естум Фоирт ^аг№, Cgpex Окно ^правка _ 5 XОл’.«Г.Ю-.,П» Ас"№» (Ф»ймй7 • 4шр^й|' ';- “Т^ ■ФеХо Qpa^l ■ Вид- естум Фоирт ^аг№, Cgpex Окно ^правка _ 5 X' Дйэд твита'^0Ррегистра' Дйэд твита'^0РрегистраРис. 8.32. Возвращение текста в выбранном регистреРис. 8.32. Возвращение текста в выбранном регистре
Ол’.«Г.Ю-.,П» Ас"№» (Ф»ймй7 • 4шр^й|' ';- “Т^ ■
ФеХо Qpa^l ■ Вид- естум Фоирт ^аг№, Cgpex Окно ^правка _ 5 X
Ол’.«Г.Ю-.,П» Ас"№» (Ф»ймй7 • 4шр^й|' ';- “Т^ ■
ФеХо Qpa^l ■ Вид- естум Фоирт ^аг№, Cgpex Окно ^правка _ 5 X
' Дйэд твита'^0Ррегистра
' Дйэд твита'^0Ррегистра
Рис. 8.32. Возвращение текста в выбранном регистре
Рис. 8.32. Возвращение текста в выбранном регистре
Поле содержит строку текста, список предлагает на выбор три типа регистра, а кнопка содержит процедуру обработки щелчка с кратким кодовым фрагментом: Private Sub Command2_Click()
Dim z As String
z = изменить_регистр(Me.Textl, Me.Listl)
MsgBox Z
End Sub
ТРЮК№ 90ТРЮК№ 90Создание программной библиотеки
ТРЮК
№ 90
ТРЮК
№ 90
Сделайте излюбленные функции доступными для всех ваших баз данных.
Я заметил, что разработчики используют в ряде различных проектов одни и те же функции. Мне приходилось неоднократно выискивать для повторного использования нужные фрагменты кода, теряя при этом уйму времени, поскольку я дол-
292
жен был вспомнить не только где именно я их использовал раньше, но и на каком компьютере это было,
В этом случае вы можете разместить все программные фрагменты в отдельной базе данных и использовать эту базу в качестве программной библиотеки. Для этого нужно привести программный код в порядок и собрать его в одном или нескольких модулях базы данных. Нужно оформить все программные фрагменты в виде функций, возвращающих значения, затем сохранить базу данных и закрыть ее. В заключение измените расширение базы данных на .mda.
На рис. 8.33 показан модуль, заполненный функциями и принадлежащий файлу, расширение которого было переименовано в .mda.
^ У» L® yew Ш«п Q*ug Bun look АЯ-Ins yndow help^ У» L® yew Ш«п Q*ug Bun look АЯ-Ins yndow help^ ' [(Gencr Ы)^ ' [(Gencr Ы)Клиенты (Г I* |дДМкго$оН ;- ^ Mates4{ModuКлиенты (Г I* |дДМкго$оН ;- ^ Mates4{Modu1yj [и1мени1ь jperncrp1yj [и1мени1ь jperncrpl^lndulr Modulel^lndulr ModuleMMwHc к ^И Module!MMwHc к ^И Module!Option compare DatabaseFunction произведение^трех_чисел(число1 As Single, _ чмслоЗ As Single, числоЗ As Single) As Double произведение_трех_чисед - число1 * чмсло2 * числоЗEnd FunctionOption compare DatabaseFunction произведение^трех_чисел(число1 As Single, _ чмслоЗ As Single, числоЗ As Single) As Double произведение_трех_чисед - число1 * чмсло2 * числоЗEnd FunctionFunction измекить_регистр(текст As String, _ регистр As String) Аз StringFunction измекить_регистр(текст As String, _ регистр As String) Аз StringSelect Case регистр Case "Верхний" изменить_регистр :Саве "Нихиих" мзмемить_регистр :Сазе ’’Смешанный"Select Case регистр Case "Верхний" изменить_регистр :Саве "Нихиих" мзмемить_регистр :Сазе ’’Смешанный"UCase (текст)UCase (текст)LCase (текст)LCase (текст)* СО5Дание смешанного р * г ис троDins имдикатор_пробела Аз Boolean иидикатор_пробела - False• первая буква - всегда заглавная и5менить_регистр * UCase(Left(текст, 1)) Гог позиция ■ 2 То Len(текст)* СО5Дание смешанного р * г ис троDins имдикатор_пробела Аз Boolean иидикатор_пробела - False• первая буква - всегда заглавная и5менить_регистр * UCase(Left(текст, 1)) Гог позиция ■ 2 То Len(текст)If Mid (текст, позиция. имликатор_пробела ° изменить^регистр = 1ElseIf Mid (текст, позиция. имликатор_пробела ° изменить^регистр = 1Else" Then" Thenизменить^регистр £изменить^регистр £If инликатор_проВела - True Then ивменить_perметр ■ изменить_рег*истр индигатор_пробеда “ FalseIf инликатор_проВела - True Then ивменить_perметр ■ изменить_рег*истр индигатор_пробеда “ Falseмэменить_регистр ж изменить^регистр End Ifмэменить_регистр ж изменить^регистр End IfЕве^па Eortp'XЕве^па Eortp'XLCa.se (Mid (текст, позицияLCa.se (Mid (текст, позиция6 UCase(Hid(текст, позиция, 1))6 UCase(Hid(текст, позиция, 1))£ LCase(Hid(текст, позииия£ LCase(Hid(текст, позииия
^ У» L® yew Ш«п Q*ug Bun look АЯ-Ins yndow help
^ У» L® yew Ш«п Q*ug Bun look АЯ-Ins yndow help
^ ' [(Gencr Ы)
^ ' [(Gencr Ы)
Клиенты (Г I* |дДМкго$оН ;- ^ Mates
4{Modu
Клиенты (Г I* |дДМкго$оН ;- ^ Mates
4{Modu
1
yj [и1мени1ь jperncrp
1
yj [и1мени1ь jperncrp
l^lndulr Module
l^lndulr Module
MMwHc к ^И Module!
MMwHc к ^И Module!
Option compare Database
Function произведение^трех_чисел(число1 As Single, _ чмслоЗ As Single, числоЗ As Single) As Double произведение_трех_чисед - число1 * чмсло2 * числоЗ
End Function
Option compare Database
Function произведение^трех_чисел(число1 As Single, _ чмслоЗ As Single, числоЗ As Single) As Double произведение_трех_чисед - число1 * чмсло2 * числоЗ
End Function
Function измекить_регистр(текст As String, _ регистр As String) Аз String
Function измекить_регистр(текст As String, _ регистр As String) Аз String
Select Case регистр Case "Верхний" изменить_регистр :
Саве "Нихиих" мзмемить_регистр :
Сазе ’’Смешанный"
Select Case регистр Case "Верхний" изменить_регистр :
Саве "Нихиих" мзмемить_регистр :
Сазе ’’Смешанный"
UCase (текст)
UCase (текст)
LCase (текст)
LCase (текст)
* СО5Дание смешанного р * г ис тро
Dins имдикатор_пробела Аз Boolean иидикатор_пробела - False
• первая буква - всегда заглавная и5менить_регистр * UCase(Left(текст, 1)) Гог позиция ■ 2 То Len(текст)
* СО5Дание смешанного р * г ис тро
Dins имдикатор_пробела Аз Boolean иидикатор_пробела - False
• первая буква - всегда заглавная и5менить_регистр * UCase(Left(текст, 1)) Гог позиция ■ 2 То Len(текст)
If Mid (текст, позиция. имликатор_пробела ° изменить^регистр = 1
Else
If Mid (текст, позиция. имликатор_пробела ° изменить^регистр = 1
Else
" Then
" Then
изменить^регистр £
изменить^регистр £
If инликатор_проВела - True Then ивменить_perметр ■ изменить_рег*истр индигатор_пробеда “ False
If инликатор_проВела - True Then ивменить_perметр ■ изменить_рег*истр индигатор_пробеда “ False
мэменить_регистр ж изменить^регистр End If
мэменить_регистр ж изменить^регистр End If
Еве^па Eortp'X
Еве^па Eortp'X
LCa.se (Mid (текст, позиция
LCa.se (Mid (текст, позиция
6 UCase(Hid(текст, позиция, 1))
6 UCase(Hid(текст, позиция, 1))
£ LCase(Hid(текст, позииия
£ LCase(Hid(текст, позииия
Рис. 8.33. Программный модуль, содержащий функции
После изменения расширения файл будет распознаваться как надстройка (рис. 8.34).
Из обычной базы данных Access на программную библиотеку должна быть сделана ссылка. Нужно открыть диалоговое окно References (Ссылки), воспользовавшись командой Tools ► References (Сервис > Ссылки), и найти сохраненную программную библиотеку, щелкнув на кнопке Browse (Обзор). Возможно, при этсм придется в диалоговом окне Add Reference (Добавить ссылку) изменить «Тип файлов» на Надстройки, как показано на рис. 8.35,
Рис. 8.34. Отнесение файла к категории надстроек
® М-ГЛтаВ^кби"^..^::....;>:,. .Vf,^ ;У<^Гг^1 .Г<>^Д
^ Н, [ж V* Insert Debug &« I»* 6№ №*• Help
&? f^b r«:*s ■ I M ptre i & и т?^ о и ^ А г j ^ $ ^
O'
ISM
- ^ ff X
Fsnjef.t ТУЖ:№ X)
[(General)
Opti^-t
*5-2 Madij
Sil iitti^^*^
..About .■Acr
.AveMteReTeuences: '
a 1
rv^visuai Basic For'Applicators
I?/; Microsoft Access 11.0 Object Library l^;OLE AutcfTiaticn
^fkr«oftDAO 3.6 Object bbrary
■ Папка: j Программная библиотека Access
। AcroiE Программная библиотека
Active i
OK
Cenwl | ;
Browse..
iModui» Module, Aiphabeto |(
Имя Файла j
Тип Фай лоб:
Надстройки Г mda)^
Базы данных MiQroscdi1 Office Access 11 rrdb) W^tri^f J
ФаЙлыМОЕГп*^
Проект Access Г «fol ФМйлыАОЕ f ade! Type Ltr^ies I'.olb;’ tb:" dll) Executable Ftes f еке.’хД) ActiveX Controls Г осх)
AH Files Г 1
Рис. 8.35. Ссылка на надстройку
। Открыть |
Отмена J •
Стран а J
Теперь функции из библиотеки программ будут доступны обычной базе данных. На рис. 8.36 показан их перечень при просмотре в Object Browser.
Л f> 6* »* i«t № 6» lock yelm ®ndo^ WЛ f> 6* »* i«t № 6» lock yelm ®ndo^ WStSt^ Access lib (Программна^ Access lib (Программна13 ^ji Moddes4^ Mod*l- ^ Новое приложение AcciIS ^ Modules4; Module 1r*7 ^3 References13 ^ji Moddes4^ Mod*l- ^ Новое приложение AcciIS ^ Modules4; Module 1r*7 ^3 ReferencesjAccess MbjAccess MbMemberMember^. Module 1^. Module 1•.о произведение. грех.чмсел•.о произведение. грех.чмселModule J Model?Module J Model?Members Qf^giobals*' ^ м2мемшь_регистрMembers Qf^giobals*' ^ м2мемшь_регистрSearch Results • Libras ..Search Results • Libras ..Рис. 8.36. Просмотр собственных функций в Object BrowserРис. 8.36. Просмотр собственных функций в Object Browser
Л f> 6* »* i«t № 6» lock yelm ®ndo^ W
Л f> 6* »* i«t № 6» lock yelm ®ndo^ W
St
St
^ Access lib (Программна
^ Access lib (Программна
13 ^ji Moddes
4^ Mod*l
- ^ Новое приложение AcciIS ^ Modules
4; Module 1
r*7 ^3 References
13 ^ji Moddes
4^ Mod*l
- ^ Новое приложение AcciIS ^ Modules
4; Module 1
r*7 ^3 References
jAccess Mb
jAccess Mb
Member
Member
^. Module 1
^. Module 1
•.о произведение. грех.чмсел
•.о произведение. грех.чмсел
Module J Model?
Module J Model?
Members Qf^giobals*' ^ м2мемшь_регистр
Members Qf^giobals*' ^ м2мемшь_регистр
Search Results • Libras ..
Search Results • Libras ..
Рис. 8.36. Просмотр собственных функций в Object Browser
Рис. 8.36. Просмотр собственных функций в Object Browser
Со временем количество функций будет расти и хранение их в одном месте действительно сэкономит ваше время. Ведь невозможно предугадать, когда имею о понадобится алгоритм, созданный несколько лет назад.
ТРЮК№ 91ТРЮК№ 91Автоматическое отслеживание обновлений таблиц базы данных
ТРЮК
№ 91
ТРЮК
№ 91
Извлечение обновленных объектов из эталонной базы данных при открытии базы.
Если с приложением работают несколько пользователей, приходится сталкиваться с проблемой распространения обновленных таблиц, возникающей при включении в обработку новых данных или когда в справочных списках появляются новые значения, источником которых служат данные, получаемые из таблиц. Повто рное распространение сразу всей базы данных прервет технологический процесс. Пользователи будут вынуждены остановить свою работу, получить новый файл и где-нибудь его сохранить. Даже при автоматизации этого процесса довольно трудно определить, не пользуется ли кто-нибудь базой данных на момент ее перезаписи.
Вместо этого существует неплохой способ самообновления пользовательских приложений при запуске локальной копии базы данных. Сравнение таблиц базы
данных с эталонной сетевой базой проводится программным способом. При обнаружении в эталонной базе данных обновленной таблицы последняя копируется в пользовательскую базу.
Выполнение программного кода при запуске базы данных
В каждой отдельной пользовательской базе данных содержится таблица под названием tbl_ Вереи и Та б л иц, состоящая из двух полей: в одном хранятся имена таблиц, а в другом — дата их последнего обновления. При открытии базы данных программа открывает эталонную базу данных и сравнивает даты обновления таблиц в эталонной базе с записями в таблице бЫ_ВерсииТаблиц.
Но почему бы не сравнивать даты обновления таблиц непосредственно в локальной базе данных и зачем сохранять эти даты в отдельной таблице? Все дело в том, что пользователи могут внести изменения в таблицы и на локальной машине, после чего дата обновления локальных таблиц изменится. А нам нужно проверить, содержит ли эталонная база данных обновленные таблицы, которые еще не введены в пользование. Даты, фигурирующие в локальной таблице 1Ы_ВерсииТаблиц, являются датами обновления таблиц в эталонной базе данных на момент последнего копирования каждой табл и цы.
На рис. 8.37 показана таблица 1Ы_ВерсииТаблиц. Даты обновления двух таблиц соответствуют декабрю 2005 года.
:ИияЫЕлицынаеден н71й||g tblj^nerc^^11 12 2005й (ЫПродажи: 03.12 2005 Щ:ИияЫЕлицынаеден н71й||g tblj^nerc^^11 12 2005й (ЫПродажи: 03.12 2005 Щ
:ИияЫЕлицынаеден н71й||
g tblj^nerc^^11 12 2005
й (ЫПродажи: 03.12 2005 Щ
:ИияЫЕлицынаеден н71й||
g tblj^nerc^^11 12 2005
й (ЫПродажи: 03.12 2005 Щ
Рис. 8.37. Отслеживание даты последнего обновления
Код
При открытии локальной базы данных функция получение_обновлений вызывается из макроса AutoExec, поэтому она выполняется сразу после запуска:
Function получение_обновлений( )
0л Error GoTo errend
Dim обноеление_БД As String
обновление_БД = "G:\ОбновлениеБД.mdb"
Dim cat As New ADOX.Catalog
Dim tbl As New ADOX.Table
Dim conn As ADODB.Connect ion
Set conn = CurrentProject.Connection
Dim local^tbl As String
Dim Текущая_дата_объекта As Date
’ Открытие каталога
cat.ActiveConnection = ”Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data 5purce=* & обноеление_БД
продолжение ^продолжение ^For Each tbl In cat.Tables
продолжение ^
продолжение ^
If Left(tbl.Name, 4) <> ’’MSys" Then Текущая_дата_объекта = _ DLookup("[ДатаОбновления]", "1Ь1_ВерсииТаблиц", _ "[ИмяТаблицы] = ” & tbl.Name & )
If tbl .DateModif fed > Текущая_дата__объекта Then
DoCmd.DeleteObject acTable, tbl.Name
DoCmd.TransferDatabase aclmport, "Microsoft Access", _ Обновление_ВД, acTable, tbl.Name, tbl.Name 'сохранение новой дать!
conn.Execute ("Update сЫ_ВерсииТаблиц Set ДатаОбновления=#" & _ tbl.DateModiffed & "# Where ИмяТаблицы=’" & tbl.Name & ""’}
End If
End If
Nex t
Set cat = Nothing
Set conn = Nothing
MsgBox "Готово!"
Exit Function err_end;
MsgBox Err.Description
End Function
Работа программы
Для проверки имеющихся обновлений совместно используются VBA, ADOX и ADO. В данном примере на основе эталонной базы данных — б:\06новлениеБД.тбЬ — создается ADOX-объект catalog. В эталонной базе данных проверяются все таблицы, за исключением, конечно же, системных. Все системные таблицы начинаются с префикса MSys (Трюк № 15).
Значение свойства DateModified каждой таблицы в эталонной базе данных сличается с датой, хранящейся на локальной машине для таблицы с тем же именем. Как только будет определено, что в эталонной базе данных имеется таблица с бт- лее свежей датой изменения, с помощью инструкции DoCmd удаляется таблица в локальной базе данных и импортируется таблица из эталонной базы. После этого SQL-инструкция Update обновляет дату для этой таблицы в таблице tbl_Bep- сииТаблиц.
После того как функция завершит работу, пользователь сможет работать в обычном режиме. Приложение работает как обычно, поскольку имена таблиц не изменялись.
Единственное предостережение — трюк применим только к обновлению таблиц, не имеющих связей с другими таблицами. Таблицы со связями перед удалением требуют удаления связей, а после импорта их восстановления. Поэтому трюк больше подходит для тех таблиц, в которых содержатся справочные списки или у которых отсутствуют связи с другими таблицами. Для проверки имеющихся связей и соответствующего обращения с ними вы можете разработать дополнительный фрагмент программы.
ГЛАВА 9
Использование сторонних приложений
Трюки № 92-95
В книгах по Access всегда уделяется много внимания вопросам создания приложений — работе с таблицами, запросами, формами и отчетами, а также конструированию макросов и написанию программного кода. Хорошо бы, закончив всю эту работу, иметь под рукой средство для документального описания созданной базы данных (Трюк № 92). Да и в процессе создания приложения трудно заранее предусмотреть все особенности управления его работой, определить перечень функций и утилит, включаемых в состав базы данных. Решить эти вопросы поможет специальная программа, которая способна осуществить ваши замыслы (Трюк № 93).
Основой базы данных, естественно, являются сами данные. Наверняка вам часто приходилось сначала разрабатывать базу данных, а затем отыскивать некие данные для ее тестирования. Вы можете вводить данные вручную, а можете воспользоваться программным продуктом, который создаст эти данные за вас (см. Трюк № 94).
Кроме того, в данной главе показан способ построения приложения вообще без таблиц. В трюке «Использование Access в качестве базы данныхXML» (Трюк № 95) рассмотрен способ запуска базы данных формата XML из Access, считывания данных из внешнего файла формата XML и записи их туда же.
ТРЮК№ 92ТРЮК№ 92Документирование базы данных с помощью программы Total Access Analyzer
ТРЮК
№ 92
ТРЮК
№ 92
Получение подробного анализа содержимого вашей базы данных.
Даже самая незатейливая база данных Access имеет довольно богатое содержимое. Пусть в ней будут всего лишь таблица с данными, форма с несколькими эле-
ментами управления и отчет, но даже тогда суммарное количество свойств, принадлежащих этим объектам, будет исчисляться сотнями. Что уж тогда говорить о крупной базе данных — количество имеющихся в ней элементов даже трудно себе представить!
А теперь предположим, что есть некая утилита, которая позволяет докопаться до самых глубин базы данных и найти такую информацию, о существовании котэ- рой вы даже не догадывались. Попробуйте воспользоваться программой Total Access Analyzer компании FMS (www.fmsinc.com). Этот замечательный Анализатор сообщит все подробности, относящиеся к вашей базе данных, нс упустив при этом ни малейшей детали.
Запуск Анализатора
После установки Анализатор включается в состав надстроек. Какую бы базу данных вы ни открыли, Анализатор всегда можно будет найти по команде Сервис > Надстройки. Запуск функций Анализатора осуществляется из главного меню, показанного на рис. 9,1.
Total AccessTotal Access; Analyzer; AnalyzerРис. 9,1. Программа Total Access AnalyzerРис. 9,1. Программа Total Access Analyzer'About | v№ I'About | v№ I
Total Access
Total Access
; Analyzer
; Analyzer
Рис. 9,1. Программа Total Access Analyzer
Рис. 9,1. Программа Total Access Analyzer
'About | v№ I
'About | v№ I
Чтобы приступить к работе, щелкните на кнопке Document. В результате запустится мастер документирования - Documentation Wizard, в котором поэтапно можно выбрать документируемые объекты. На рис. 9.2 показан первый экран мастера до ку монтирования.
После установки флажков напротив нужных элементов щелкните на кнопке N=xt (Далее) для вызова второго экрана мастера, показанного на рис. 9.3.
Здесь, кроме всего прочего, вы можете выбрать документирование связей, системы безопасности и создание перекрестных ссылок на поля, показывающих места использования этих полей по всей базе данных. Генерация перекрестных ссылок — вещь хорошая, ведь всегда полезно знать все подробности, касающиеся полей, но еще лучше знать, где именно данные этих полей представлены (в каких формах и отчетах).
Рис. 9.2. Мастер документирования, шаг 1
Рис. 9.3. Мастер документирования, шаг 2
В процессе документирования результаты записываются во внешний файл. Па третьем экране мастера, показанном на рис. 9.4, вы можете выбрать место записи внешнего файла (или согласиться с местом, предлагаемым по умолчанию) и назначить конкретное время, в которое нужно провести документирование.
Процесс документирования начнется сразу после щелчка на кнопке Finish. Время документирования зависит от размера базы данных.
Рис. 9.4. Мастер документирования, шаг 3
Исследование документации
Для исследования документации нужно вернуться в главное окно, показанное Hi рис. 9.1, и щелкнуть на кнопке Explore (Исследование). После этого откроется окно просмотра документации, показанное на рис. 9.5. Объекты выбираются в левой панели окна, а относящиеся к ним детали показываются в правой.
Рис. 9.5. Исследование документации
К этому моменту в вашем распоряжении уже находится масса информации для анализа. Вы можете отыскать всю необходимые сведения о базе и ее объект ix, чему способствует сама конструкция окна. Например, вы можете просмотреть! се процедуры модуля и все объявленные в них переменные, следующие друг за другом и открытые для сравнения (рис. 9.6). Попробуйте просмотреть программн ай модуль — и убедитесь в этом сами.
Рис. 9.6. Исследование модуля
Рис. 9.7. Исследование ошибки
Обнаружение ошибок и генерация предложений по их устранению
Кроме документирования программа Total Access Analyzer способна также обнаружить некоторые проблемы и ошибки и предложить пути их решения. На рис. 9.7
показано, как программа выводит сообщение о месте обнаружения ошибки. Я действительно иногда забываю включать инструкцию Option Explicit в свои модули. Но теперь, наверное, мне уже не придется сталкиваться с подобными неприятностями!
На рис. 9.8 показан подобранный Анализатором перечень предложений по устранению обнаруженных проблем. Их реализация действительно способствует повышению качества создаваемого приложения.
Рис. 9.8. Исследование предложенийРис. 9.8. Исследование предложений
Рис. 9.8. Исследование предложений
Рис. 9.8. Исследование предложений
Программа Total Access Analyzer хороша не только для создания перечня всех объектов, свойств, методов и атрибутов, принадлежащих базе данных, но и г ля определения методов улучшения всех этих компонентов. Другие элементы управления, присутствующие в главном окне Анализатора, позволяют искать конкретные элементы и выводить документацию на печать.
Создание оболочки приложения при помощи программы EZ Application Generator
Создание оболочки приложения Access с помощью специальной программы.
Зачем вручную выполнять нудную работу по оформлению базы данных с нуля: создавать привлекательную заставку, включать в состав приложения функции защиты и справки, создавать генератор отчетов и т. д., когда есть великолеп toe средство, способное сделать все это за вас? Создать нужные компоненты поможет
генератор приложений EZ Application Generator компании Database Creations (www.databasecreations.com). Вам останется лишь создать таблицы данных, формы и другие объекты базы данных, после чего генератор создаст за вас все необходимое, от А до Я, чтобы в итоге получилось законченное приложение.
Мастер генератора приложений содержит свыше десятка последовательно появляющихся экранов, отвечающих за все основные операции — от добавления сведений о приложении, логотипа и иного графического оформления до установки защитных функций, системы обработки ошибок и эффективных поисковых функций. Для начала создайте новую базу данных. Вы можете создать таблицы, формы, отчеты и другие объекты базы данных либо до создания оболочки приложения, либо в любое время после этого. Для запуска Генератора его нужно выбрать из списка надстроек.
Первый экран, показанный на рис. 9.9, воспринимает название приложения и другую общую информацию.
Рис. 9.9. Ввод общей информации о приложении
На следующем экране, показанном на рис. 9.10, вам нужно выбрать изображение, используемое в качестве заставки, логотип и значок
Следующий экран (рис. 9.11) предназначен для выбора темы главной формы приложения. Здесь все предельно просто. Странно, что прежде я все это делал вручную!
Затем следует еще несколько экранов, в которых можно выбрать заголовки, ежедневные советы, лицензионные соглашения и прочие полезные для приложения элементы. В этих же экранах устанавливается защита и система обработки ошибок.
Рис, 9.10. Выбор графических элементов
Рис. 9.11. Выбор темы главного окна приложения
Экран, показанный на рис. 9.12, дает возможность выборочно включить в состав приложения календарь, часы и калькулятор, а также включить планировщик заданий.
Рис. 9.12. Выбор утилит
Когда мастер закончит свою работу, база данных будет наполнена объектами, необходимыми для работы приложения. Вы сможете запускать из главного окна любые задачи, включая запуск исходных объектов базы данных. Все выбранные вами утилиты будут также доступны из главного окна приложения (рис. 9.13).
Рис. 9.13. Запуск элементов приложения из главного окна
Компания Database Creations предлагает и другие продукты, облегчающие труд ра 1- работчика. Дополнительную информацию можно получить на веб-сайте компании.
ТРЮК№ 94ТРЮК№ 94Загрузка в базу проверочных данных
ТРЮК
№ 94
ТРЮК
№ 94
Использование заранее созданных данных для тестирования, соответствующих имеющимся таблицам и полям.
Создание базы данных и ее испытание — совершенно разные вещи. Бывает, ч"_о в вашем распоряжении имеются архивные данные, которые используются для тестирования приложения перед сдачей его в эксплуатацию, но иногда создавать данные для проверки работоспособности приходится вручную.
Размещение нескольких записей в таблицах поможет проверить функционирование приложения, но получить реальную картину его будущей работы у заказчи <а можно лишь после размещения в таблицах сотен и тысяч записей.
Программа Records2Go (www.records2go.com) предназначена для генерирования данных ио предварительно заданной схеме. Созданные данные сохраняются то внешнем текстовом или ХМ L-фай ле, который вы можете импортировать в Access. С помощью этого средства создается любое количество записей. Мне удавалось получать от программы Records2Go сотни тысяч записей.
Рис, 9.14. Создание набора данных в формате XMLРис, 9.14. Создание набора данных в формате XML
Рис, 9.14. Создание набора данных в формате XML
Рис, 9.14. Создание набора данных в формате XML
На рис. 9.14 проиллюстрирован принцип работы Records2Go. Вам нужно ввести ряд исходных данных, включая количество генерируемых записей, имя создаваемого файла и место, где его сохранить. Главным элементом формы является сетка, в которой задается строение таблицы.
Вы можете создавать файлы двух типов: текстовые и XML. На рис. 9.14 показано создание логической структуры XML-файла, Независимо от типа создаваемого файла каждая строка сетки отводится под данные одного поля. В каждую из строк вводится имя поля, его тип и другие параметры. Типы полей могут быть стандартными: числа, даты и текст — или выбранными из предопределенного набора данных. Этот набор сам предлагает информацию о типах полей, используемых для имен и адресов.
Управлять созданием данных можно с помощью символов-заменителей. Например, если выбрано текстовое поле, вы можете ввести фразу, которая будет генерироваться в неизменном виде, или использовать символы-заменители для представления случайных чисел или символов. В условиях, задаваемых на рис. 9.14, символы «решетки» (#) означают генерацию случайного номера.
На рис. 9.15 показаны XML-данные, созданные на основе условий, показанных на рис. 9.14. Предопределенный атрибут Full Name в процессе генерации превращается в атрибуты имен. Поле EmployeelD заполняется случайными числами, а даты приема на работу выбираются из указанного диапазона.
РН* £40 View Pswtft@4 T*»k Неф
Q**6- Q ■ 1^ 1й ^ /Зя*<ь ■^*р««1« «у™, ^0 о, .^
ГГ<^к1 ¥^idrt®*l,O“ ебсо^^^УТР-б* yt^&^o^s’y^* 7> - <Е^р5й yearly
Г
Г
■се^йуе-е Eraph^e«tb«*24<Miy* Етр^дуееНе^***!»»* LaGrange №^з<$^3/111/1^У /> <Empfoy»e Employed»'34393* E-tr^y^^i^B^^ito Otaz* Hsre&st»^ 12/6/19W /> ^mpigyi?^ Err^ioytfMr-'W^ En^VWNAme^^'OU* Cramer' ^е^Ш-ч-3/2/21М)Г » <Empiby»a Еп^Ж^уг:»!^»* 12666* &пр&уй4&дг^^ K- dements* Йй$^1$«*7/14/2002* /> <&т$4$у$$ Gn^oyeel0=*89407* E^F-py^f^^^SemM^ Hfra&^#s*7/i 1/2GW /> <£n^&yefe Eh^eyeetD» *'96360* EfSptoynNw^^^Abe KissafOs* w№fw’#/12/Ю01Г /> <£^'^¥«6 Еггф{йуеаШв'75в2.9‘ E^^y^hf^n^sZlack fearer i«W06te»*9/5/2002* /> <£лф&уй$ Егп0буееЮ«*19О>73' Кйф^еенег^ s Wyli* ОбПокюсГ м8геО4И***О/14/19ОУ /> <E^oye® Employee ifcx* 40 762* Emp^ye^Nsr^'-'Mari F« Coleman' i^Dete^-M/18/2004* Z> «Е'п^Оуб^ §£^7*4^*3214»* Еч^ФуШ^ше^ибЛ Germ* Hke0We'll/20/169»4 Z> t&mpfoyw E№^^ciye4tD^'23324* S^^yee^^^^SltemiteH Chemblts< 1^30416**11/22/11198* /> cErhpK?y^ Евт;р‘руййЮ-Мб2Э4‘ £rrij5^f?tiM4^-43*n« Goodwin* Hsr^O^ty-41/20/2002* /> X^B^SV## ЕП^йубеГО^ТбОЖГ £/*ip^¥»^^^ ^C6mt#F Wx H«gert |е^8М$«*9/6/Й0<НГ /> <^№$5:ауеб бйфбоубеФе^ФвЗО' £ttptoye‘ett3m««‘*8hAi L. Heecex* H^Date®'?/13/2001.'V> СЯ^ФуЙ# Е^ФуХ^Ю^ОЗУОЗ* £mp$0y^^^T^:::'SU4«rt0ttpra' $1^6048 »^ *7/IS/IMTV^ <ёа^руев ercpfoye*lt>-»*3SB7S' &w₽^ve4Nam«»*fcO5ie C. Wkiby" HswOate* *11/17/2002* Z> €6fl^»y#e Ег^руу-Ш^-^"76452* Emj^MiHme* Wn*M ОД<&^шШ?Ш«*8/0/280С />
<£m^yee Ei^Qy^D^’llSMT* £тр&у^М^.®ч^Свгу1 Esmont’ ^г#0з1«« *7/26/2084' /> <En^iW64 Ей^^уеб1&=*64021* E^^ye#W4?ri6=*St.#yi# Ivie* ^sO^ta^e/Si/iSGe* /> <f^^ £«^^♦10**89000’' £fltyWH^a^«KK«*ty Н«НГ н^0»‘у й’9/В/200Ф /> CEaiepipye» C^oyeelC»®'72267‘ £«тр^уе?8б1*р^^'Ла<1ау LembsarV H^eQate^ii/l 1/20001 /> <О^^уй^ Еьфк>у$4Е0^7321Э* E^tp^yw^K^-'^dben Ame*K >W)^te»*5/11/2004’ /> ^T^cyee Е0^4»у«4^®г4 7 9 66* KR^yeeMame**Chu^ ВЫбий/ ytira&ate* '3/2/200 0* /> *Ж^<руЙ E:^^W«№™r400ir ЕЖ^У4^?Ф^"*Н»М$ о. M«id“ 14МШР»х7/ 1.1/200 4* /> <6t№^^yee Er^lay44^« '2614F ё^р^у^Н^^-ГАлпа Duggafi* Н(гф0чН^>*8/1О/ЗМ>СМк /> <Етр1<ку»!» Егф^оуу^Юж'З^ООб4 E^^oyes^^i№e**SiNHvy Deek"* ий^д14а*7/19/20О4х /> <£й»р1йу#е Елу;х»у?4!С)®’0Й4Ъ Г Еч^1уе4М4г^?*'6»1>(1га Haunt* >&уф<»1««*2/19/2004' />
Программа Records2Go прекрасно справляется с созданием больших наборов данных. На рис. 9.16 показано задание на создание 15 000 текстовых записей, которое было выполнено за 33 секунды.
Рис. 9.16. 15 000 записей за 33 секундыРис. 9.16. 15 000 записей за 33 секунды
Рис. 9.16. 15 000 записей за 33 секунды
Рис. 9.16. 15 000 записей за 33 секунды
На рис. 9.17 показан созданный программой текстовый файл. Один из элементов задания определяет, нужно ли включать в файл строку заголовка. Другие элемен ■ ты определяю т символ, используемый в качестве разделителя, и текстовый тин файла.
Программа имеет еще одну пенную возможность — сохранять и загружать задания. Иначе говоря, после того как задание в сетке сформировано, вы можете со ■ хранить его и использовать впоследствии по необходимости. Вы можете добавлять и удалять строки, перемешать их по всей сетке и т. д. Вы даже можете выбрать некоторые из строк, подавляя активность других без их удаления.
ТРЮК№ 95ТРЮК№ 95Использование Access в качестве базы данных XML
ТРЮК
№ 95
ТРЮК
№ 95
Использование Access в качестве интерфейсной части при работе с данными в форма ■ те XML.
В некоторых трюках, рассмотренных в разных местах книги (см. перечень в конце данного трюка), исследуется применение XML в Access. Данный трюк, в киторик рассматривается полноценная база данных XML, венчает эти усилия. Точнее го
File Edit Formal View Help Dave, *#ii>uht,'category'
2/2/2004,127, Wholesale «А2/2ОО4, 58,wall Order 6/26/2004,186, wholesi1e 5 A0/2004.107,wholes»1e 8/14/2004,144 , inter пет 5ЛВ/20О4,w.mll Order 10/11/2004,1*3, Retail 7/18/ZOO4,183,wh»1esale 8/30/2004,122,Wholesale:
12/18/2004,48.mil order:
8/22/2004,154, wholesale 4/25/2004,104.Retail 4A5A0O4,72,ма11 order 8A 6/2004,14 8, на 11 order 1AV2OO4.81,Retail.
11/14/2004,116,Ma11 order 12/17/2004,114,Mall Order 5/2 5/2004,12 9, Retail 4 /4 A 904,27, i nt er net 4/10/2004.148.mil order 3/21/2004,176, Retail 12/5/2004.26,Mail Order 1/5/2904,64.Retail 6/18/2004,95,internet 4/6/2004,71, Retail 1/15/2004,71.Mail order 11/16/2004.75,Retail 3/26/2004,145.Mall Order 2/26/2804,58, internet ЗА 5/2004, 78,wholesale */$Ap04,177, Retail 1A0/2004,28,Ma11 order 2/4/2 004.64, who! e$ai e 12A2/2004.59, Retail 6A9/2004,123.Mall Order 6Д 5/2094,189, Retail 2/1/2004,161,wholesale
< ।’ йв!
Рис. 9.17, Данные для тестирования, готовые к импортированию в Access
воря. в трюке рассматривается способ использования Access для чтения и записи данных, находящихся в XML-файлах, и загрузки этих данных в форму для просмотра и редактирования. Эта форма обладает всеми необходимыми функциями обработки данных: просмотром записи, ее добавлением, обновлением и удалением. Все это реализуется благодаря подключению MSXML-napcepa компании Microsoft. О том, как получить и использовать этот парсер, вы можете узнать на вебсайте www.rnicrosoft.coni/xmL и в трюке № 87 «Обеспечение полного управления данными XML для любых версий Access». Парсер является основным средством расширения сферы применения XML, которая ранее сводилась лишь к импорту и экспорту данных.
На рис. 9.18 показана форма, использующаяся в приложении. Отображенная в ней запись получена из XML-файла. В форме имеются кнопки для перехода по записям — Предыдущая и Следующая, а также кнопки для редактирования и удаления записи — Редактировать и Удалить. Кнопка Новая запись предназначена для ввода новой записи, а кнопка Сохранить — для сохранения ее в файле.
Рис. 9.18. Отображение данных из XML-файла
Данные берутся не из таблицы, а из внешнего источника. В этом приложении вообще пе г таблиц, связанных или подключаемых с помощью ADO или ODBC. По сути, приложение состоит только из одной формы.
Код
Следующий код, размещенный в модуле формы, отвечает за всю обработку данных:
Option Compare Database
Public xmlobj As DOMDocument
Public xml_list As IXMLDOMNodeList
Public номер_записи As Integer
Public имя_файла As String
Private Sub стд_Удалить_СПскС)
Dim xml_node As IXMLDOMElement
Set xml_node = xmlobj.documentElement.ch1IdHodes(номер_эаписи)
xmlobj.documentElement.removeChiId xml_node
xmlobj.Save имя_файла
перезагрузить_файл
End Sub
Private Sub стй_НоваяЗапись_СПck()
Me.1х1_КодРаботника = "’,
Me.txt—ИмяРаботника = “"
He.1Х1_ДатаПриемаНаРаботу = ""
Me. 1Х1_НомерЗаписи = HW
End Sub
Private Sub стЬ_Следующая_С1ick()
If номер_записи < xml_list.length - 1 Then номер_записи = номер_записи + 1
Else
номер^записи = 0
End If
загрузка_записи
End Sub
Private Sub стб_Предыдущая_С11 ck()
If номер_записи > 0 Then номер_записи = номер_записи - 1
Else
номер_записи = xml_list.length - 1 End If
загрузка—записи
End Sub
Private Sub стЬ_Сохранить_С11ск() Dim xml_node As IXMLDOMElement If Me.txt-КодРаботника = "" Or Me.txt-ИмяРаботника = "" Or _
Me.tx1_ДатаПриемаНаРаботу = "" Then
MsgBox "Все три поля должны быть заполнены" Exit Sub
End If
Set xml_node = xmlobj.createElement("Employee")
xml_node.setAttribute "КодРаботника", Me.txt-КодРаботника xml_node.setAttri bute "ИмяРаботника", Me.txt-ИмяРаботника
xml_node.setAttribute "ДатаПриемаНаРаботу", Me.txt-ДатаПриемаНаРаботу xmlobj.documentElement.appendChlId xml_node xmlobj.Save имя_файла переза грузить_файл
End Sub
Private Sub стб_Редактировать_С11ск()
xmlobj.documentElement.chi Id Nodes(номер_залиси) _ .Attributes(Q).nodeValue = Me.txt-КодРаботника
xmlobj.documentElement.childNodes(номер-Залиси) _
.Attributes(1).nodeValue = Me.txt-ИмяРаботника xmlobj.document Element.chiIdNodes(номер_залиси) _
.Attributes(2).nodeValue = Me.txt-ДатаПриемаНаРаботу xmlobj.Save имя_файла перезагрузить_файл
End Sub
Private Sub Form-Open(Cancel As Integer) имя_файла = "С;ХДанныеРаботников.xml" Set xmlobj = New DOMDocument xmlobj.async = False xmlobj.Load имя_файла
Set xml_list = xmlobj.selectNodes _
(" Работники/Работник") 'загрузка первой записи номерзаписи = В загрузка_записи
End Sub
Sub загрузка_записи()
Me . txt_КодРаботника = _
xml—list.1гет(номер_записи).Attributes(0).nodeValue
Me.1х1_ИмяРаботника = —
xml_li st.I tem(HOMep_записи).Attri butes(1).nodeValue Me.txt-ДатаПриемаНаРаботу = _
xml_l 1st. Item (номер_залиси) .Attri butes (2) .nodeValue
Me. 1х1_НомерЗаписи = номер_записи + 1
End Sub
Sub перезагрузить_файп() xmlobj.Load имя_файла Set xml_list = xmlobj.selectNodes _ ("Работники/ Работник.")
‘загрузка первой записи номер_записи = 0 загрузка_записи
End Sub
Загрузка XML-файла
После того как форма откроется, глобальная XML-переменная (xmlobj) станови г- ся указателем на XML-фай л, размещаемый в памяти. Список узлов (xml_list) становится указателем на набор записей Работник, а в форме отображается первая запись:
Private Sub Form_Open(Cancel As Integer)
имя_файла = "С:ХДанныеРаботников,xml"
Set xmlobj = New DOMDocument
xmlobj.async = False
xmlobj.Load имя_файла
Set xml_list = xmlobj.selectNodes _
("Работники/Работник")
'загрузка первой записи номер_записи = 0 затрузка_записи
End Sub
Просмотр записей
Свойство length (длина) на языке XML — то же самое, что свойство count (счетчик) в VB. При щелчках на кнопках Следующая пли Предыдущая значение глобальной переменной номер_записи сравнивается с числом XML-записей. Если значение переменной номер_записи сравняется с числом записей, то после щелчка на кнопке Следующая его значение будет установлено в 0. Если значение переменной номер_записи сравняется с 0, то после щелчка на кнопке Предыдущая его значен те станет равно числу записей. Обработка щелчков на кнопках Следующая или Предыдущая завершается вызовом процедуры загрузка_записи:
Private Sub стб_Следующая_С1ick()
If номер_записи < xml_list.length - 1 Then номер_записи = номер_залиси + 1
Else
номер_записи = 9
End If
загрузка_записи
End Sub
Private Sub стб_Предыдущая_СИск()
If номер_записи > 0 Then
номерзаписи = номерзаписи - 1
Else
номер_записи = xml_list.length - 1
End If
загрузка_записи
End Sub
Процедура загрузка_записи заполняет элементы управления формы данными из XML-записи, расположенной по номеру, указанному в переменной номер_записи: Sub загрузка_записи()
Me.Сх1_КодРаботника = _
xml_l ist.11ет(номер_записи).Attri butes(0).nodeValue
Me.txt_HwsРаботника = _
xml_list.Item(номер_записи).Attributes(1).nodeValue
Me.1х1_ДатаПриемаНаРаботу = _
xml_l1st.Item(номер_записи).Attributes(2).nodeValue
Me.1хг_НомерЗаписи = номер_записи + 1
End Sub
Редактирование записи
Для записи в исходный файл измененных данных формы нужно щелкнуть на кнопке Редактировать. Суть процесса состоит в обновлении узла (записи работника) в файле с использованием значений полей формы. Узел Работник является дочерним для узла documentElement Работники. Значения не сохранятся, пока не будет задействован метод Save объекта xmlobj. После этого файл перезагружается, и эта последняя операция возвращает форму к первой записи (вместо этого можно оставить форму на обновленной записи);
Private Sub стЬ_Редактировать_С1тск()
xmlobj.documentElement,chi IdNodes(номер_записи) _
.Attributes(0).nodeValue = Me.Тх1_КодРаботника
xmlobj.documentElement.chiIdNodes(номер_записи) _
.Attributes(1).nodeValue = Me.ТхЬ_ИмяРаботника
xmlobj.documentElement,chiIdNodes(номер_за писи) _
.Attributes(2).nodeValue = Me.1хТ_ДатаПриемаНаРаботу
xmlobj.Save имя_файпа
пере за грузить_файл
End Sub
Удаление записи
Для удаления записи нужно установить ссылку на запись работника в переменную узла (xml_node). Затем метод removeChild, принадлежащий родительскому узлу, удалит эту запись:
Private Sub стб_Удалить_СИСк()
Dim xml_node As IXMLDOMElement
Set xml_node = xmlobj.documentElement.childNodes(HOMep_3anHCH)
xmlobj.documentElement.removeChild xml_node
xmlobj.Save имя_файла
перезагрузить_файл
End Sub
Здесь, каки при любых изменениях файла, нужно применить метод Save.
Добавление новой записи
Обе кнопки, Новая запись и Сохранить, работают на добавление записи к XML-файлу. Кнопка Новая запись вызывает очистку формы для ввода информации о новом работнике. Кнопка Сохранить запускает код, сохраняющий новую запись.
После проверки всех полей на заполнение данными создается новый элемент. Атрибуты устанавливаются равными значениям, взятым из формы, и элемент со всеми атрибутами сохраняется при помощи метода appendChild. Следующий метод, Sav е, пе рей а гру ж а ст фа пл (которы i t те и срь со де ржи т и о в ую за п 11 сп):
Private Sub стб^Сохранить_С1ick(I
Dim xml_node As 1XI4LDOMElement
If Me.Сх1_КодРаботника = "" Or Me.1Х1_ИмяРаботника = ’" Or _
Me.1х1_ДатаЛриемаНаРаботу = "" Then
MsgBox “Все три поля должны быть заполнены" Exit Sub
End If
Set xffll_node = xmlobj.createElement("Employee")
xml_node.setAttri bute "КодРаботника". Me.tх!_КодРабот ника
xml_node.setAttribote "ИмяРаботника", Me.tx1_ИмяРаботника
xml_node.setAttribute "ДатаПриемаНаРаботу" , Me.СхГДатаПриемаНаРаботу xmlobj .documentElement , appendChi Id xrnl_nade
xmlobj.Save имя_файла
перезагрузитЬ_файп
End Sub
См. также «Импорт в Access различных ХМL-данных» (Трюк № 63), «Рациональный способ экспорта данных в фор мат XML» (Трюк № 64). «Преодоление барьера преобразования при использовании VBA» (Трюк № 65), «Обеспечение полного управления данными XML для любых версий Access» (Трюк № 87).
ГЛАВА 10
Интернет
Трюки № 96-100
Интернет и веб-технологии настолько прочно вошли в нашу жизнь, что смысл их внедрения в работу приложений баз данных не вызывает никакого сомнения. Хотя, казалось бы, СУБД Access изначально не приспособлена к работе с HTML, исправить положение помогут наши трюки.
В начале этой главы будет показано, как сохранить отчет в формате HTML (Трюк№ 96). С помощью данного трюка вы сможете поместить данные на вебсайт. Пойдем дальше. А как насчет внедрения Интернета в вашу базу данных? Раздел «Использование браузера в приложении Access» (Трюк № 97) раскрывает способ использование веб-браузера непосредственно в форме Access. Вам нужны данные, имеющиеся на веб-сайте? Их можно извлечь с помощью FTP (Трюк № 99).
ТРЮК№ 96ТРЮК№ 96Экспортирование отчета в формат HTML
ТРЮК
№ 96
ТРЮК
№ 96
Расширение аудитории за счет публикации отчетов на веб-странице.
Демонстрация совокупности данных востребована в любом деловом приложении, и Access успешно справляется с этой задачей. Для расширения аудитории лип, ознакомленных с результатами работы приложения, вы можете распространять распечатки, сообщения по электронной почте, файлы в формате Word и т. д. Вы можете опубликовать отчет и на веб-сайте.
Открыв отчет Access, вы можете в меню Файл выбрать пункт Экспорт. Среди доступных форматов экспорта есть и HTML. На рис. 10.1 показан отчет, экспортируемый в формате HTML.
Сохранение отчета в виде HTML-файла открывает массу возможностей. Вполне очевидно, что теперь отчет можно просмотреть в веб-браузерс. На рис. 10.2 показан отчет, отображаемый в Internet Explorer. Файл HTML уже не является частью базы данных, поэтому вы можете открыть его в браузере, выбрав команду Файл ► Открыть.
^ 'Жг«<Т4Н 6стХ'Ч$ : [<?-;-4i^ ; :>Т^-^ :: ^ Файл [Травка Вид Серене £кяо <^жкв100%•;^ 'Жг«<Т4Н 6стХ'Ч$ : [<?-;-4i^ ; :>Т^-^ :: ^ Файл [Травка Вид Серене £кяо <^жкв100%•;ведите eonведите eon5 X5 X' wa файла;Тип файла' wa файла;Тип файлаа ; Межсетевое ' окружение 'а ; Межсетевое ' окружение 'Мой : компостерМой : компостер; Страница; 1;Го1«ю . .; Страница; 1;Го1«ю . .Количество визитов по штатамКоличество визитов по штатамПапка; . . • ^ Мои документыПапка; . . • ^ Мои документы: 53 Мои видеозаписи^ ix^MOH ИСТОЧНИКИ Мои последние ■ ;£$Мои рисумси «•9™™х,.„му зыка^71- ^Ф™*^ -^: 53 Мои видеозаписи^ ix^MOH ИСТОЧНИКИ Мои последние ■ ;£$Мои рисумси «•9™™х,.„му зыка^71- ^Ф™*^ -^xj :S ;; Д i Bl X ^ ТЗ • <:»««xj :S ;; Д i Bl X ^ ТЗ • <:»««Рабочий стопРабочий стопдокументыдокументыбизитьЛоШ татембизитьЛоШ татем::::::. :::;:." ... ;..::"•: ' ^^ [ ;йето^агружаДокументы HTML (*.html;*.htm) ^1::::::. :::;:." ... ;..::"•: ' ^^ [ ;йето^агружаДокументы HTML (*.html;*.htm) ^1[, От«ена~ ![, От«ена~ !>,>,
^ 'Жг«<Т4Н 6стХ'Ч$ : [<?-;-4i^ ; :>Т^-^ :
: ^ Файл [Травка Вид Серене £кяо <^жкв
100%•;
^ 'Жг«<Т4Н 6стХ'Ч$ : [<?-;-4i^ ; :>Т^-^ :
: ^ Файл [Травка Вид Серене £кяо <^жкв
100%•;
ведите eon
ведите eon
5 X
5 X
' wa файла;
Тип файла
' wa файла;
Тип файла
а ; Межсетевое ' окружение '
а ; Межсетевое ' окружение '
Мой : компостер
Мой : компостер
; Страница; 1;
Го1«ю . .
; Страница; 1;
Го1«ю . .
Количество визитов по штатам
Количество визитов по штатам
Папка; . . • ^ Мои документы
Папка; . . • ^ Мои документы
: 53 Мои видеозаписи
^ ix^MOH ИСТОЧНИКИ Мои последние ■ ;£$Мои рисумси «•9™™х,.„му зыка
^71- ^Ф™*^ -^
: 53 Мои видеозаписи
^ ix^MOH ИСТОЧНИКИ Мои последние ■ ;£$Мои рисумси «•9™™х,.„му зыка
^71- ^Ф™*^ -^
xj :S ;; Д i Bl X ^ ТЗ • <:»««
xj :S ;; Д i Bl X ^ ТЗ • <:»««
Рабочий стоп
Рабочий стоп
документы
документы
бизитьЛоШ татем
бизитьЛоШ татем
::::::. :::;:." ... ;..::"•: ' ^^ [ ;йето^агружа
Документы HTML (*.html;*.htm) ^1
::::::. :::;:." ... ;..::"•: ' ^^ [ ;йето^агружа
Документы HTML (*.html;*.htm) ^1
[, От«ена~ !
[, От«ена~ !
>,
>,
Рис. 10.1. Выбор экспорта омета в формате HTML
Рис. 10.2. Просмотр экспортированных данных в веб-браузереРис. 10.2. Просмотр экспортированных данных в веб-браузере
Рис. 10.2. Просмотр экспортированных данных в веб-браузере
Рис. 10.2. Просмотр экспортированных данных в веб-браузере
Вы можете отправить HTML-файл на веб-сервер и опубликовать его или одела гь сто доступным внутри управляемой корпоративной сети. Если файл открыть в Блокноте или в каком-нибудь другом простом текстовом редакторе, станет доступен его HTML-код (рис. 10.3).
<HTML> «HEAD>«META HTTP7EQUiy=eContent:T^ CONTENT=4e*t/htmi; charset#windows”12sr><Ti т le> Оj ^’# Ю9"0;‘М lO^;^* 1G?^^« №0> lk ЛI tle></HEAD> '<BODY>«TABLE BORDERED CELLSPAC1NG=D CELLPADDING=O > «TR HE1GHT=19 >«TD WIDTH-11 AUGN=LEFT > «BRxADXTD WIDTH=366 ALIGN-LEFT XBxFONT Style-FONT-SIZE: 12pt F<HTML> «HEAD>«META HTTP7EQUiy=eContent:T^ CONTENT=4e*t/htmi; charset#windows”12sr><Ti т le> Оj ^’# Ю9"0;‘М lO^;^* 1G?^^« №0> lk ЛI tle></HEAD> '<BODY>«TABLE BORDERED CELLSPAC1NG=D CELLPADDING=O > «TR HE1GHT=19 >«TD WIDTH-11 AUGN=LEFT > «BRxADXTD WIDTH=366 ALIGN-LEFT XBxFONT Style-FONT-SIZE: 12pt F</TR></TABLE>«TABLE BORDER-0 CELLSPACING=O CELLPAODING=O ><TR HEIGHT=14 ><TD WIDTH=60 AUGN=LEFT > <BRx/TDxTD W(DTH=67<TD WIDTH=8 AL1GN-LEFT > «BRx^DxTO W1DTH=241</TR></TABLE>«TABLE BORDER#0 CELLSPACtNG=O CELLPADOING=O ><TR HEIGHT# 14 ><TD WIDTH=60 ALlGNsLEFT > <BRx/TD><TD W1DTH=67<TD WIDTH=0 ALIGN=LEFT > «BRx/TDxTD WIDTH=241</TR></TABLE>«TABLE BORDER=0 CELL5PAC1NG=D CELLPADDING=Q ><TR HEtGHT=14 ><TD WIDTH=60 ALIGN=LEFT > <BR></TD>cTD W1DTH=67 «TD WIDTH=8 AL1GN-LEFT > <BRx/TDxTD WIDTH=241<AR></TR></TABLE>«TABLE BORDER-0 CELLSPACING=O CELLPAODING=O ><TR HEIGHT=14 ><TD WIDTH=60 AUGN=LEFT > <BRx/TDxTD W(DTH=67<TD WIDTH=8 AL1GN-LEFT > «BRx^DxTO W1DTH=241</TR></TABLE>«TABLE BORDER#0 CELLSPACtNG=O CELLPADOING=O ><TR HEIGHT# 14 ><TD WIDTH=60 ALlGNsLEFT > <BRx/TD><TD W1DTH=67<TD WIDTH=0 ALIGN=LEFT > «BRx/TDxTD WIDTH=241</TR></TABLE>«TABLE BORDER=0 CELL5PAC1NG=D CELLPADDING=Q ><TR HEtGHT=14 ><TD WIDTH=60 ALIGN=LEFT > <BR></TD>cTD W1DTH=67 «TD WIDTH=8 AL1GN-LEFT > <BRx/TDxTD WIDTH=241<AR>AL1GN=RIGHT xFONT styIe=FONT-SIZE: 8pt FACE- AL1GN=LEFT xFONT styl8#F0NT-SlZE:8pt FACE-'AL1GN=RIGHT xFONT styIe=FONT-SIZE: 8pt FACE- AL1GN=LEFT xFONT styl8#F0NT-SlZE:8pt FACE-'ALIGN= RIGHT XFONT 5tyle=FONT-SlZE;8pt FACE# AUGN=LEFT xFONT style=FONT-SIZE:Bpt FACE#',ALIGN= RIGHT XFONT 5tyle=FONT-SlZE;8pt FACE# AUGN=LEFT xFONT style=FONT-SIZE:Bpt FACE#',ALIGN=RIGHT xFONT styl@=FONT-SlZE:8pt FACE= ALIG№LEFT xFONT style=FONT-SIZE:8pt FACE#*,ALIGN=RIGHT xFONT styl@=FONT-SlZE:8pt FACE= ALIG№LEFT xFONT style=FONT-SIZE:8pt FACE#*,
<HTML> «HEAD>
«META HTTP7EQUiy=eContent:T^ CONTENT=4e*t/htmi; charset#windows”12sr>
<Ti т le> Оj ^’# Ю9"0;‘М lO^;^* 1G?^^« №0> lk ЛI tle>
</HEAD> '
<BODY>
«TABLE BORDERED CELLSPAC1NG=D CELLPADDING=O > «TR HE1GHT=19 >
«TD WIDTH-11 AUGN=LEFT > «BRxADXTD WIDTH=366 ALIGN-LEFT XBxFONT Style-FONT-SIZE: 12pt F
<HTML> «HEAD>
«META HTTP7EQUiy=eContent:T^ CONTENT=4e*t/htmi; charset#windows”12sr>
<Ti т le> Оj ^’# Ю9"0;‘М lO^;^* 1G?^^« №0> lk ЛI tle>
</HEAD> '
<BODY>
«TABLE BORDERED CELLSPAC1NG=D CELLPADDING=O > «TR HE1GHT=19 >
«TD WIDTH-11 AUGN=LEFT > «BRxADXTD WIDTH=366 ALIGN-LEFT XBxFONT Style-FONT-SIZE: 12pt F
</TR>
</TABLE>
«TABLE BORDER-0 CELLSPACING=O CELLPAODING=O >
<TR HEIGHT=14 >
<TD WIDTH=60 AUGN=LEFT > <BRx/TDxTD W(DTH=67
<TD WIDTH=8 AL1GN-LEFT > «BRx^DxTO W1DTH=241
</TR>
</TABLE>
«TABLE BORDER#0 CELLSPACtNG=O CELLPADOING=O >
<TR HEIGHT# 14 >
<TD WIDTH=60 ALlGNsLEFT > <BRx/TD><TD W1DTH=67
<TD WIDTH=0 ALIGN=LEFT > «BRx/TDxTD WIDTH=241
</TR>
</TABLE>
«TABLE BORDER=0 CELL5PAC1NG=D CELLPADDING=Q >
<TR HEtGHT=14 >
<TD WIDTH=60 ALIGN=LEFT > <BR></TD>cTD W1DTH=67 «TD WIDTH=8 AL1GN-LEFT > <BRx/TDxTD WIDTH=241
<AR>
</TR>
</TABLE>
«TABLE BORDER-0 CELLSPACING=O CELLPAODING=O >
<TR HEIGHT=14 >
<TD WIDTH=60 AUGN=LEFT > <BRx/TDxTD W(DTH=67
<TD WIDTH=8 AL1GN-LEFT > «BRx^DxTO W1DTH=241
</TR>
</TABLE>
«TABLE BORDER#0 CELLSPACtNG=O CELLPADOING=O >
<TR HEIGHT# 14 >
<TD WIDTH=60 ALlGNsLEFT > <BRx/TD><TD W1DTH=67
<TD WIDTH=0 ALIGN=LEFT > «BRx/TDxTD WIDTH=241
</TR>
</TABLE>
«TABLE BORDER=0 CELL5PAC1NG=D CELLPADDING=Q >
<TR HEtGHT=14 >
<TD WIDTH=60 ALIGN=LEFT > <BR></TD>cTD W1DTH=67 «TD WIDTH=8 AL1GN-LEFT > <BRx/TDxTD WIDTH=241
<AR>
AL1GN=RIGHT xFONT styIe=FONT-SIZE: 8pt FACE- AL1GN=LEFT xFONT styl8#F0NT-SlZE:8pt FACE-'
AL1GN=RIGHT xFONT styIe=FONT-SIZE: 8pt FACE- AL1GN=LEFT xFONT styl8#F0NT-SlZE:8pt FACE-'
ALIGN= RIGHT XFONT 5tyle=FONT-SlZE;8pt FACE# AUGN=LEFT xFONT style=FONT-SIZE:Bpt FACE#',
ALIGN= RIGHT XFONT 5tyle=FONT-SlZE;8pt FACE# AUGN=LEFT xFONT style=FONT-SIZE:Bpt FACE#',
ALIGN=RIGHT xFONT styl@=FONT-SlZE:8pt FACE= ALIG№LEFT xFONT style=FONT-SIZE:8pt FACE#*,
ALIGN=RIGHT xFONT styl@=FONT-SlZE:8pt FACE= ALIG№LEFT xFONT style=FONT-SIZE:8pt FACE#*,
317317Трюк N° 96. Экспортирование отчета в формат HTML
317
317
Рис. 10.3. Просмотр исходного HTML-кода
Обратите внимание на выделенное содержимое HTML-тега <TITLE>. Вернувшись крис. 10.2, вы заметите, что HTML-файл назван ВизитыПоШтатам.Ь1т1 Но тег <TITLE> на рис. 10.3 содержит набор кодов символов, который превращается в заголовок Отчет!. Такое же имя носил отчет в Access, и это же название было использовано в заголовке окна Internet Explorer на рис. 10.2. Нам нужно будет изменить содержимое тега <TITLE> в Блокноте и заново просмотреть файл в браузере.
Рис. 10.4. Обновленный видРис. 10.4. Обновленный вид
Рис. 10.4. Обновленный вид
Рис. 10.4. Обновленный вид
На рис. 10.4 показана слегка видоизмененная версия отчета в формате HTMI . Изменения коснулись заголовка и некоторых элементов форматирования.
Хотя HTML-код редактировался в Блокноте, вы можете открыть HTML-файл и любом HTML-редакторе, например в Dreamweaver или в Frontpage.
ТРЮК№ 97ТРЮК№ 97Использование браузера в приложении Access
ТРЮК
№ 97
ТРЮК
№ 97
Включение в форму элемента управления Обозреватель веб-страниц (Microsoft) с щ - лью согласования данных с информацией из Интернета.
Таблицы Access имеют поля с типом данных гиперссылка, предназначенные для хранения URL. При щелчке на этих полях открывается установленный на компьк - тере браузер и в нем отображается веб-сайт. При всей своей пользе это свойств: не позволяет одновременно просматривать информацию базы данных и веб-саг - та. Чтобы и браузер и Access одновременно присутствовали на экране, вам, скорее всего, потребуется уменьшить размеры их окон.
В этом трюке рассматривается способ поместить браузер непосредственно в фо] ■ му Access. Для просмотра веб-сайта, на который указывает сохраненный URL, bi.. загружаете браузер, использующий этот URL-адрес, и веб-сайт появляется пр; мо в форме.
Па рис, 10.5 показана форма в режиме Конструктора. В форму помещен элемент управления Обозреватель веб-страниц (Microsoft) (входящий в перечень элементов Другие элементы, который открывается щелчком на одноименной кнопке панели инструментов).
Рис. 10.5. Установка управляющего элемента Обозреватель веб-страниц (Microsoft)Рис. 10.5. Установка управляющего элемента Обозреватель веб-страниц (Microsoft)
Рис. 10.5. Установка управляющего элемента Обозреватель веб-страниц (Microsoft)
Рис. 10.5. Установка управляющего элемента Обозреватель веб-страниц (Microsoft)
На рис. 10.6 показана форма в режиме просмотра,
В иоле элемента управления отображается веб-сайт, адрес которого хранится в текущей записи. Загрузка веб-сайта происходит после щелчка па кнопке Про-
319
Рис. 10.6. Просмотр веб-сайта в формеРис. 10.6. Просмотр веб-сайта в форме
Рис. 10.6. Просмотр веб-сайта в форме
Рис. 10.6. Просмотр веб-сайта в форме
смотреть веб-сайт, у которой процедура обработки события Click содержит следующую строку кода:
Me.WebBrowserI.Navigate URL:=Ме.webs 1te
Элемент управления Обозреватель веб-страниц (Microsoft) имеет метод Navigate, при помощи которого осуществляется переход на веб-страницу, соответствующую предоставленному элементу управления URL-адресу. В данном случае LTRL бе-
; поиск книги; поиск книгиКниги издательств!Книги издательств!НовиниНовинив; ■ \.в; ■ \.Издательстао * НовостиИздательстао * НовостипочтаРвоицрвция в почте SпочтаРвоицрвция в почте SРис. 10.7. Форма, содержащая несколько браузеровРис. 10.7. Форма, содержащая несколько браузеровпэдлтел&скпм вам| СОЛИТЕРstMip.$>it»«r.oomпэдлтел&скпм вам| СОЛИТЕРstMip.$>it»«r.oomв проекте " 1 Яндекс.Города появились мооли Украиныв проекте " 1 Яндекс.Города появились мооли УкраиныЦйГгащ ДШвкйпЬЯк доступенЦйГгащ ДШвкйпЬЯк доступену$*у$*Horne : Network Store Satan:Horne : Network Store Satan:$№.6леЛЛЖ1ИМЙ OasbLSlSl$№.6леЛЛЖ1ИМЙ OasbLSlSlп vilrhinctkiv IffTlinhmt пп vilrhinctkiv IffTlinhmt п
; поиск книги
; поиск книги
Книги издательств!
Книги издательств!
Новини
Новини
в; ■ \.
в; ■ \.
Издательстао * Новости
Издательстао * Новости
почта
Рвоицрвция в почте S
почта
Рвоицрвция в почте S
Рис. 10.7. Форма, содержащая несколько браузеров
Рис. 10.7. Форма, содержащая несколько браузеров
пэдлтел&скпм вам
| СОЛИТЕР
stMip.$>it»«r.oom
пэдлтел&скпм вам
| СОЛИТЕР
stMip.$>it»«r.oom
в проекте " 1 Яндекс.Города появились мооли Украины
в проекте " 1 Яндекс.Города появились мооли Украины
ЦйГгащ ДШвкйпЬЯк доступен
ЦйГгащ ДШвкйпЬЯк доступен
у$*
у$*
Horne : Network Store Satan:
Horne : Network Store Satan:
$№.6леЛЛЖ1ИМЙ OasbLSlSl
$№.6леЛЛЖ1ИМЙ OasbLSlSl
п vilrhinctkiv IffTlinhmt п
п vilrhinctkiv IffTlinhmt п
рется и форме, из поля, принадлежащего текущей записи. Разумеется, L’R. можно передать элементу управления и по-другому. Это всего лишь один из примеров.
Как и в случае использования других элементов, вы можете расположить в форме несколько элементов управления, предназначенных для просмотра веб-страниц. Подобная комбинация элементов показана на рис. 10,7,
Возможно, такая комбинация покажется нелепой, но и для нее найдется разумнее применение. К примеру, ее можно использовать в приложении финансового х; - рактера для отслеживания нескольких текущих событий — скажем, для слежения за котировками цепных бумаг в различных сегментах рынка. Такая же комбин; ция вполне подойдет и для демонстрации видеосигнала с нескольких веб-камер.
ТРЮК№ 98ТРЮК№ 98Извлечение исходного HTML-кода из веб-сайта
ТРЮК
№ 98
ТРЮК
№ 98
Интеграция данных Интернета в приложение.
В разделе «Использование браузера в приложении Access» (Трюк № 97) рассмо 'рено, как использовать элемент управления Обозреватель веб-страниц (Microsoft для просмотра веб-страницы. В данном трюке мы пойдем чуть дальше и рассмо"- рим, как получить ее исходный код. Решение этой задачи позволит извлечь гз веб-сайта нужные данные.
На рис. 10.8 показан веб-сайт, отображенный с помощью элемента управление, и окно сообщений, в котором выведен его HTML-код.
^Ф^В^И 5рл^Ф^В^И 5рлПросмотреть еео-СсйтПросмотреть еео-СсйтИДААГГОЬСКМЛ ЛОМ .^ПМТЕРаЬор.рАес.сотИДААГГОЬСКМЛ ЛОМ .^ПМТЕРаЬор.рАес.сотПросмотреть НТК-кпдПросмотреть НТК-кпдКниги издательстваКниги издательстваноеимкм дняноеимкм дняПолный каталог книгПолный каталог книгMkror^ft Office AcchssMkror^ft Office Acchssид^^дьрняэ ■ *оп яан- / »ь«ел^«« jT nifl&ид^^дьрняэ ■ *оп яан- / »ь«ел^«« jT nifl&издательств »Ноностииздательств »НоностиРис. 10.8. Чтение исходного HTML-кода из веб-сайтаРис. 10.8. Чтение исходного HTML-кода из веб-сайта<HEAD><TltLE эЬовости : Издательство "Пмтер"</Т1Т1Е><1и'Ж W-http4//shoptp*er^#eh=nSHOF кит kon">
^Ф^В^И 5рл
^Ф^В^И 5рл
Просмотреть еео-Ссйт
Просмотреть еео-Ссйт
ИДААГГОЬСКМЛ ЛОМ .
^ПМТЕР
аЬор.рАес.сот
ИДААГГОЬСКМЛ ЛОМ .
^ПМТЕР
аЬор.рАес.сот
Просмотреть НТК-кпд
Просмотреть НТК-кпд
Книги издательства
Книги издательства
ноеимкм дня
ноеимкм дня
Полный каталог книг
Полный каталог книг
Mkror^ft Office Acchss
Mkror^ft Office Acchss
ид^^дьрняэ ■ *оп яан- / »ь«ел^«« jT nifl&
ид^^дьрняэ ■ *оп яан- / »ь«ел^«« jT nifl&
издательств »
Ноности
издательств »
Ноности
Рис. 10.8. Чтение исходного HTML-кода из веб-сайта
Рис. 10.8. Чтение исходного HTML-кода из веб-сайта
. <МЕТА сог<«ги»"к>*га; издательств», издательский док, литературе, биб^отека, Саежст-Летербург, Питер, Петербург. Россия, продажа, торговля, книги по компьютерам, заказ, магазин, электронная коммерция, компьютерная литература, моевка. бестселлер, комт?Ютеры, интернет, программы, софт, медицина, психология, экономика, маркетинг, финансы, менеджмент, образование, юрист, крижнапист, криминопогия, book, pctisheng, webshop, web, Internet, conputer, Peterbirg, tussia, soft, shop, e-shop, «commerce, «business, : psychology, economy, education, medtFiecrioe, nvestig^lori, bestseller" гякгщ "Keywords:*
—<>FTA c№fent»ALl nsme^
Я <KT A content»’KMFrH д ля профессионалов и новичков от Издатегьского дома ‘Питер"- ii • • Работает электронный магазин, доставке по всему миру, скидки для постояньгх
— ' читателем. Do you need a nice book for yov work? Welcome t We reside in St.-Petersburg
Элемент управления Обозреватель веб-страниц (Microsoft) обладает развитой программной моделью, о которой можно узнать на веб-сайте http://msdn.microsoft.com/ library/defauLt.asp?urL=/workshop/brovyser/prog_browser_node_entry.asp.
Код HTML извлекается при помощи следующей программной строки:
MsgBox Me.WebBrowserl.Document.documentElement.innerhtml
Р ю к|0 99Р ю к|0 99Программная модель рассматриваемого элемента управления соответствует объектной модели документа (document object model. DOM). Как только веб-сайт отобразится в поле элемента управления, станет доступен узел documentElement и все его дочерние узлы. В данном примере для доступа ко всему HTML-коду используется свойство innerhtml Полученный HTML-код теперь можно передать любой процедуре. Например, вы можете создать процедуру, которая выискивает HTML- таблицы, из которых затем извлекает данные, или процедуру, которая осуществляет поиск ключевых слов, и т. д.
Р ю к
|0 99
Р ю к
|0 99
Загрузка файлов при помощи элемента управления Обозреватель веб-страниц (Microsoft)
Загрузка файлов по FTP без выхода из базы данных.
В предыдущих разделах «Использование браузера в приложении Access» (Трюк № 97) и «Извлечение исходного HTML-кода из веб-сайта» (Трюк№ 98) рассматривался способ просмотра веб-страниц из формы Access и метод извлечения исходного HTML-кода, В данном трюке рассматривается использование элемента управления Обозреватель веб-страниц (Microsoft) для извлечения файлов с FTP веб-сайта.
Протокол FTP (File Transfer Protocol) обычно используется для перемещения файлов между компьютером и веб-сервером. Нередко веб-сайт FTP защищен паролем, поэтому для проверки работоспособности данного трюка нужно иметь права доступа к нему.
Включение элемента управления Обозреватель веб-страниц (Microsoft) в форму
В разделе «Использование браузера в приложении Access» (Трюк № 97) уже рассматривалось включение элемента управления Обозреватель веб-страниц (Microsoft) в форму. Для перехода к веб-странице методу Navigate передавался URL-адрес. В данном трюке ему вместо HTTP LTRL будет передаваться FTP URL.
Чтобы открыть диалоговое окно входа на веб-сайт (рис. 10.9), элемент управления Обозреватель веб-страниц (Microsoft) должен содержать следующую строку кода: Me.WebBrowserВ.Navi gate URL:="ftp.logicstory.com"
После входа в поле элемента управления будет отображено содержимое веб-сайта. В зависимости от уровня ваших пользовательских полномочий вы можете просматривать содержимое, копировать, удалять и переименовывать его объекты (рис. 10.10).
Рис. 10.9. Ввод имени пользователя и пароля для входа на сайт FTP
Рис. 10.10. Просмотр содержимого веб-сайта
После выбора файла для копирования возникает диалоговое окно Обзор папе к, отображающее элементы файловой системы локального компьютера. В нем нух- но выбрать каталог, в который будет вставлен копируемый файл (рис. 10.11).
Отправка файлов на удаленный компьютер
Как уже отмечалось, после выделения файла для загрузки выбор пункта контекстного меню Копировать в папку приводит к открытию диалогового окна Обзор пэ-
Рис. 10.11. Выбор каталога на локальном компьютере, где будет сохранен копируемый файл
пок. Хотя для отправки файлов никакого соответствующего пункта меню не существует, у вас все равно есть возможность отправить файл на FTP-сайт. Все, что для этого нужно сделать, - - это выбрать файл на локальном компьютере, скопировать его в буфер обмена, а затем щелкнуть на элементе управления Обозреватель веб-страниц (Microsoft) и воспользоваться комбинацией клавиш вставки (Ctrl+V). На рис, 10.12 показана индикация процесса копирования, подтверждающая событие копирования файла на FTP-сайт.
Рис. 10.12. Копирование файла на удаленный сервер
ТРЮК№ 100ТРЮК№ 100Использование смарт-тега для открытия веб-страницы
ТРЮК
№ 100
ТРЮК
№ 100
Способ быстрого просмотра необходимой информации, размещенной в Интернет в.
К технологии смарт-тегов разработчики относятся со смешанными чувствам i. Одни создают на их основе замысловатые решения, другие вообще не хотят сними связываться. Если вы все же решитесь воспользоваться технологией смарт-тегов, то найдете в данном трюке простой способ се использования для открытия вебстраницы.
Во-первых, смарт-тег связан с полем таблицы. На рис. 10.13 показан смарт-пг, связанный с нолем Cost таблицы tblServices. После выбора смарт-тега вы можете на нем щелкнуть.
Рис. 10.13. Выбор смарт-теговРис. 10.13. Выбор смарт-тегов
Рис. 10.13. Выбор смарт-тегов
Рис. 10.13. Выбор смарт-тегов
На рис. 10.14 показана таблица, открытая в режиме просмотра. В каждой строке в поле Cost в нижнем правом углу отображается маленький фиолетовый треуго; ь- ник. Если остановить указатель мыши над этим треугольником, будет открыта ссылка на смарт-тег.
Щелчок на смарт-теге инициирует связанное с ним действие. В данном примере действие заключается в открытии веб-страницы для отображения дополните; ь-
Рис. 10.14. Получение доступа к смарт-тегу из поля CostРис. 10.14. Получение доступа к смарт-тегу из поля Cost
Рис. 10.14. Получение доступа к смарт-тегу из поля Cost
Рис. 10.14. Получение доступа к смарт-тегу из поля Cost
ной информации. На рис. 10.15 показана веб-страница, которая открывается после щелчка на смарт-теге.
Щ' ИВИ^. @И@ SUB 5™5
file Edit View fayalites Tools Help$
Address ^^x.
fc'-'■J
Рис. 10.15. Веб-сайт, доступ к которому получен из смарт-тега
В приложениях баз данных пользователи редко работают с таблицами напрямую, обычно вся работа с данными ведется с использованием форм. На рис. 10.16 показано, что смарт-теги, имеющиеся в связанной с формой таблице, доступны и в самой форме. Щелчок на смарт-теге из формы также приведет к открытию вебстраницы.
яенян^е s^cs^s^гг^^^^^.^^.^^ ",^ .^е;™-^ПХ— ^zg?;#^
Рис. 10.16. Смарт-теги работают и в форме
Подводя итог, можно сказать, что смарт-теги в приложении Access могут использоваться для извлечения информации из Интернета. Механизм создания смарт - тегов мы здесь рассматривать не будем, по если на веб-сайте www.microsoft.com вы наберете в строке поиска «smart tags», то сможете найти массу статей, посвященных их разр-'битке и использованию.
FFTP, протокол, 321GGetObject, функция, 197Group By, операция, 34HHTML-код, извлечение, 320IIf, оператор, 190ImportXML, функция, 227In, оператор, 168Insert, инструкция, 134Insert, функция, 135InStr, функция, 145IS NULL, оператор, 157ISNULL, функция, 156LLCase, функция, 290left join, 171LEFT JOIN, ключевое слово, 138Left, функция, 96Like, оператор, 165мMDB, формат, 229MDE-версия, 264Microsoft DAO 3.6, 271Microsoft Forms, 84Microsoft Scripting, 174Microsoft XML, 285FFTP, протокол, 321GGetObject, функция, 197Group By, операция, 34HHTML-код, извлечение, 320IIf, оператор, 190ImportXML, функция, 227In, оператор, 168Insert, инструкция, 134Insert, функция, 135InStr, функция, 145IS NULL, оператор, 157ISNULL, функция, 156LLCase, функция, 290left join, 171LEFT JOIN, ключевое слово, 138Left, функция, 96Like, оператор, 165мMDB, формат, 229MDE-версия, 264Microsoft DAO 3.6, 271Microsoft Forms, 84Microsoft Scripting, 174Microsoft XML, 285
F
FTP, протокол, 321
G
GetObject, функция, 197
Group By, операция, 34
H
HTML-код, извлечение, 320
I
If, оператор, 190
ImportXML, функция, 227
In, оператор, 168
Insert, инструкция, 134
Insert, функция, 135
InStr, функция, 145
IS NULL, оператор, 157
ISNULL, функция, 156
L
LCase, функция, 290
left join, 171
LEFT JOIN, ключевое слово, 138
Left, функция, 96
Like, оператор, 165
м
MDB, формат, 229
MDE-версия, 264
Microsoft DAO 3.6, 271
Microsoft Forms, 84
Microsoft Scripting, 174
Microsoft XML, 285
F
FTP, протокол, 321
G
GetObject, функция, 197
Group By, операция, 34
H
HTML-код, извлечение, 320
I
If, оператор, 190
ImportXML, функция, 227
In, оператор, 168
Insert, инструкция, 134
Insert, функция, 135
InStr, функция, 145
IS NULL, оператор, 157
ISNULL, функция, 156
L
LCase, функция, 290
left join, 171
LEFT JOIN, ключевое слово, 138
Left, функция, 96
Like, оператор, 165
м
MDB, формат, 229
MDE-версия, 264
Microsoft DAO 3.6, 271
Microsoft Forms, 84
Microsoft Scripting, 174
Microsoft XML, 285
Алфавитный указатель
Access
подключение к базе данных MySQL, 236
применение ХМ L, 308
связь с таблицами MySQL, 237
создание таблиц из других
приложений, 246
чтение и запись данных
в ХМ L-файлах, 309
Access data project, 229
Access VB. 285
ActiveX Data Objects, ADO, 22
ADOX, библиотека, 62
And, оператор, 169
AutoExcc, макрос, 20, 23, 271
AutoKeys, макрос, 25, 27
c
CreateObject, функция, 174
D
Data Source Name, DSN, 237
Date Add, функция, 88
DateDiff, программа, 186
DatePart, функция, 161
DLook up, функция, 83
Dsum, функция, 256
E
Enterprise Manager, 162
Excel
генерация кода, 249
запись макроса, 249
ExportXML, функция, 227
EZ Application Generator, 303
Mid, функция, 142
Mod, оператор, 125
Total Access Analyzer, 298
Transform, функция, 228
MSXML-riapcep, 227, 285. 309
MySQL, 235
и
N
UCase, функция, 289
Union, оператор, 78. 172
Not, оператор, 170
Now, функция, 274
NpwQ, функция, 186 null в числовых нолях, 156
U niversal Na ming Convention, UNC, 181
w
Windows Media, 117
0
Word, 205
объектная библиотека, 232
Object Browser, 235, 285
ODBC, 229
ODBC-связи, 230
сравнить и объединить исправления, 207
Or, оператор, 167
Outlook, 242
добавление макроса, 245
X
XML, протокол, 30
XML-дан иые
P
фильтрация, 287
XML-napcep, 30, 227
Paint Shop Pro, 108
XML-файл
Q
добавление записи, 313
удалеиие заниси, 313
Query Browser, 236
Quit, команда, 37
XSLT-преобразование, 227
А
R
автоматическая генерация кода, 249
Records2Go, 306
RegExp, функция, 176
Replace, функция, 136
RGB, функция, 126
RIGHT JOIN, оператор, 97
Right, функция, 161
Rnd, функция, 134
автоматическая генерация отчетов, 240 автоматическое использование внешних функций, 205
антоматическое отслеживан ие обновлений, 294
автонумерация, 45
начальное значение, 46
s
Б
Select, оператор, 79
SnapshotViewer, 121
SQL, 131
SQL Insert, команда, 36
SQL-сценарий
для создания новых таблиц, 162
Sum, функция, 140, 256
база данных
анализ содержимого, 297
оформление, 302
очистка, 33
сжатие, 43
служебное окно, 18
базы данных
сжатие, 44
т
тестирование, 306
библиотека ADO, 230
T-SQL, 230
Тор, предикат, 132
библиотека ADOX, 246
блокировка базы данных, 272
ввод
дополнительного текста, 72
нового значения в поле со списком, 76
ввод данных, 67
ввод даты, 85
видеоклип, 117
воспроивведение, 119
визуализация процесса, 273
вкладки, 68
внешнее соединение, 171
водяные знаки, 107
возврат декартова произведен 11 я, 153
временный образ отчета, 122
выборка, 166
записей без подчиненных, 136
исключение определенных записей, 169
выделения активного элемента, 91
Г
генератор приложений, 303
генерация кода VBA, 249
генерирование данных, 306
гиперссылка, 318
группа, 18
избранное, 18
создание, 19
гру п п ы ма кросов, 3 2
д
данные
для проверки работоспособности, 306
добавление Из буфера, 48
дополнение, 72
зашита, 36
изменение, 27
объединение, 149
получение всех комбинаций, 154
пустые, 155
разбиение на части, 38
экспорт, 30
таблица Word, 232
демонстрация
слайдов, 112
диалоговое окно
изменен ие связей, 28
параметры, 44
построитель выражений, 130
специальная вставка, 201
условное форматирование, 103
добавить из буфера, команда, 48
докумоптирование связей, 298
доменные агрегатные функции, 255
драйвер MySQL Conncctor/ODBC, 236
Ж
журнал, 61
3
записи, деление по буквам, 94
записи без подчиненных, мастер запросов, 137
запись
предварительная группировка, 266
случайная последовательность, 280
запрет игнорирования параметров запуска, 270
запрос
вставка итоговой суммы, 140 использование символов-
заменителей, 165
на выборку, 131
из иесвязанн ых таблиц, 154
на добавление, 46
перекрестный, 149
регулярные выражения, 173
условие отбора с о ператором О г, 167 запрос к серверу, 231
запрос на подтверждение внесенных изменений, 86
защита конструкции базы данных, 264
защита данных, 36
защита от сбоев, 134
значение null, 155, 252
подавление, 157
значение по умолчанию установка, 64 значения свободных элементов, 277
И
идентификатор пользователя, 21
извлечение файлов с FTP-сайта, 321
изменение имени компьютера, 181
имитация нажатия клавиш, 71
имитация сервера, 181
имитация табличных триггеров, 58 импорт
XML-файла, 227, 228
атрибутов ХМL, 288
данных из файлов.ХМL, 208
импорт (продолжение)
даты, 160
диапазона ячеек Excel. 195
из Excel, 193
электронной таблицы, 193
интеграция в многопользовательскую
среду, 177
интервал таймера, 186
интерфейс, 67
ин дивиду альная настройка, 20
приложения, 93
исследование документации, 300
итоговые значения, 99
К
каскадное обновление, 28
каскадное удаление связанных
записей, 29
клавиши быстрого вызова, 24
клиент-серверная архитектура, 38
ключевое поле, 28
кнопки управления, 67, 69
код
VBA, 35
автоматическая проверка, 254
защита паролем, 262
оптимизация, 259
сокращение, 260
коллекция констант, 63
конструктор запросов, 131
конструктор отчетов, 93
конструктор таблиц, 45, 46
контрольный журнал изменений, 58
Л
легкоузнаваемые имена, 288
лидирующие нули, 161
лимит времени ожидания, 276
личные параметры, 21
реализация, 23
локальные таблицы, 178
м
макрокоманда, 32
макрос
AutoExec, 20, 23
AutoKeys, 25
запись, 249
импорт диапазонов ячеек, 194
макрос (продолжение) оптимизация, 31
многаполъзовательская среда, 191
множественный выбор, 279
н
набор значений, свойство, 132
невидимые базы данных, 57
нейтрализация клавиши Shift, 272
непарный апостроф, 135
несовместимость версий, 29
номера страниц, 129
О
обновление данных, 86
обработка события, 33
открытия, 34
объект
невостребованный, 33
описание, 41
удаление, 33
объектная библиотека Word, 232
объектная модель документа, 321
ограничение на объем, 37
одинарная кавычка, 136
окно отладки, 53
оператор
Send Keys., 71
логический, 31
операция
Group By, 34
операция вставки данных, 36
отключение обработки кода нажатия
клавиши Shift, 270
отключение синтаксической
проверки, 254
отношение
один - ко- м ногам, 28, 41
отображение
даты и времени, 87
отображение системных объектов, 52
отправка по электронной почте, 242 отчет
автоматическая отправка, 240
водяные знаки, 107
вставка
даты, времени, нумерации
страниц, 129
группировка, 95
отчет продолжение) нумерация строк, 123 окраска строк, 124 печать, 106 подчиненный, 99 просмотр в форме, 120 процентные изменения, 103
разбиение по буквам, 94
сжатие, 127
экспорт в формат HTML, 315
ярлык, 105
ошибки, выявление, 301
п
панель элементов, S3
параметры запуска, 20
парольная защита, 262
первичный ключ таблицы, 27 переименование ком пьютера, 181 переключатели командной строки, 36 перекрестимй запрос, 102
персентиль, 203
повышение j 1роизводител ьности, 229
поддержка XML, 285
подпрограмма, 258
подсчет промежуточных итогов, 99 подтверждение изменений, 85
поиск, 17
поиск объектов, ускорение, 39
поле текстовое, 63
поле счетчика с произвольным значением, 45
полоса прои у скани я, 276
получение всех комбинаций данных, 154 получение констант, 288
прекращение незавершенного
редактирования, 190
преобразование в нужный регистр, 289 префикс USys, 55
прикладная часть, 38
присвоение имен, 39
пробел, вычисление позиции, 145 проверка на наличие дублей, 178 программная библиотека, 292 программный код, защита, 265 просмотр веб-страниц, 320 протокол обмена данными, 29 процедура обработки событий, 185 пустое строковое значение, 155 пустые значения, контроль, 158
Р
разделе! i не баз данных, 179
рас 11 редел ем и ые базы ziai i ны х, 178
регистр
изменение, 289
смешанный, 290
рисунок
внедренный, 109
С
самообновление пользовательских приложений, 294
свойство
изменение значения, 284
проверка состояния, 284
связующая таблица, 42
связь
многие-ко-многим, 223
один-ко-многим, 219
связь между таблицами, 28
символ-заменитель, 165
система обработки ошибок, 303
системное время, 186
слайд, просмотр, ИЗ
служебный вход для разработчика, 264
смарт-тег, 324
событие в таблице, 58
сокращение программного кода, 258
сортировка, 78
на основе случайного значения, 134
по алфавиту, 94
по произвольному символьному фрагменту, 141
случайная последовательность, 280
списки свойств и методов, 288
список
из Нескольких источников, 80
сортировка и заполненне, 78
сортировка по востребованности, 82
список букв алфавита, 96
список доступных подключений, 275
список используемых объектов, 33
список свойств, 281
сторон и ие 11 ри ложе и и я, 297
строка пулевой длины, 253
строки подключения ODBS, 275
Сумма с накоплением, 99
счетчик, 85
переключение значения, 48
таблица
замена местами столбцов, 198
копирование данных в другую
таблицу, 48
определение типа поля, 62
родительская, 28
связующая, 41
системная, 51
отображение, 52
сканирование, 62
скрытие, 54
сравнение данных, 205
таблица массивов, 203
таблица стилей, 213
таблицы, связь, 137
таймер формы, 183
технология доступа к данным, 22
тип данных, счетчик, 46
триггер, 45, 58
У
уникальное имя пользователя, 191
управление датами, 160
условное форматирование, 103
установка текстового курсора, 72
установки по умолчанию, 63
учетная запись, 21
Ф
файл, отправка на удаленный
компьютер, 322
фильтр, 23
форма
внедрение браузера, 318
для установки личных параметров, 22
переход ио элементам, 89
сочетания клавиш, 26
таймер, 183
форма ввода, 68
функция
DLookup, 23
Excel 202
функция (продолжение)
будущей стоимости, 202
создание собственной, 160
электронных таблиц, 202
X
хранение значения, 251
хранимая процедура. 230
ц
цвет фона, 125
циклический перебор записей. 274
ч
часы, 88
ш
шаг приращения нумерации. 124
шрифт, 103
э
экспорт
в X М L-форм ат. 216
в Excel, 199
данных, 229
данных из запроса, 225
данных из таблиц, 223
запросов, 225
экспорт текста, мастер, 30
элемент управления
обозреватель веб-страниц, 321 разрыв страницы, 68
элементы управления дополнительные, 84 запись значения свойств, 282 пакетное обновление, 281
эскпорт данных из Access на SQL Server, 162
Я
ярлык, настройка, 36
ярлыки объектов, 17
Кен БлюттманAccess. ТрюкиПеревел с английского Н. Вильчинскмй
Заведующий редакциейЯ. Кривнов
Ведущий редакторВ Шрага
Литературный редакторС Карпенок
ХудожникА. Дьяченко
КорректорыА/ Анкторова, Я, Моносов
ВерсткаЛ. Харитонов
Подписано в печать 16.05,06. Формат 70X100/16, Усл. п, л. 27,09. Тираж 3000 экз. Заказ № 1404.ООО «Питер Пресс». 198206, Санкт-Петербург, Петергофское шоссе, д, 73, лит, А29.
Налоговая льгота — общероссийский классификатор продукции ОК 005-93, том 2: 95 3005 ■—литература учебная.Отпечатано с готовых днапози i инов в ОАО «Печатный двор» им. А. М. Горького.
197110, Санкт-Петербург, Чкаловский пр., 15,