РАБОТАЕМ С ДАННЫМИ | КОМПЬЮТЕРНАЯ ГАЗЕТА
Часть вторая, импорт Как и следовало ожидать, раз разработчики СУБД Microsoft Access предусмотрели возможность передачи данных из этой СУБД вовне, то они также предположили, что у пользователей в процессе работы неизбежно возникнет потребность взять что-то из окружающего мира и поместить это в какую-нибудь из таблиц Microsoft Access. Эта процедура получила наименование "импорт" данных. СУБД Microsoft Access позволяет импортировать информацию из баз данных Microsoft Access (версий 1.x, 2.0/95, 7.0/95 и 8.0/97), а также данные из других приложений и файлов других форматов, например, Microsoft Excel, dBASE, Microsoft FoxPro или Paradox. Таким образом, механизм импорта охватывает практически все ведущие приложения, с помощью которых в настоящее время собирается, хранится и обрабатывается самая разнообразная информация. (c) Компьютерная газета | Как того требуют традиции, перед началом процедуры импорта непременно следует создать новую базу данных или открыть одну из уже существующих. Далее следует открыть меню ФАЙЛ и выбрать там режим ВНЕШНИЕ ДАННЫЕ. Это откроет еще одно меню, состоящее из двух пунктов: ИМПОРТ и СВЯЗЬ С ТАБЛИЦАМИ (см. рис. 1). Начнем с импорта. По аналогии с обычной торговой операцией, процедура импорта в Microsoft Access подразумевает, что что-то конкретное из внешнего источника будет скопировано в текущую базу данных. При этом копия тут же потеряет с источником всякую связь. Для чего импорт нужен, полагаю, нет нужды объяснять особо. Однако следует отметить, что структура и методика работы Microsoft Access не позволяют импортировать данные сразу в одну или несколько существующих в данной базе таблиц. Пусть это кому-то покажется слишком усложненным, но в Microsoft Access сначала следует импортировать данные, в результате чего в базе появится новая таблица, а потом произвести перенос данных из нее в другие таблицы при помощи запроса-действия. Выбрав режим ИМПОРТ, пользователь тем самым активизирует некоторую встроенную процедуру, которая, руководствуясь подсказками пользователя, на самом деле и выполняет всю работу. Первой подсказкой, которая потребуется процедуре импорта, оказывается путь к источнику данных (см. рис. 2). По сути, это уже хорошо известное пользователям Microsoft Access окно, к тому же сильно похожее на аналогичные диалоговые окна в других приложениях MS Office. Поле " Имя файла" предназначено для конкретного указания наименования источника данных, что делается либо вручную с клавиатуры, либо при помощи маркера мыши. Поле " Тип файлов" является обычным фильтром, позволяющим вычленить из общей массы файлов только те, которые имеют конкретное расширение. Это облегчает навигацию в том случае, если файлов на носителе много и среди их мешанины трудно быстро сориентироваться. Если искомый источник не удается отыскать достаточно быстро или отыскать вообще, то можно воспользоваться экранной кнопкой " НАЙТИ". Для поиска достаточно в поле " Имя файла" задать конкретное имя или соответствующую ему маску. Когда все готово и нужный файл найден, следует выделить его и нажать экранную кнопку " ИМПОРТ". Аналогичный смысл имеет двойной клик мышью по указанному файлу. В обоих случаях открывается диалог Импорт объектов (см. рис. 3), в котором СУБД показывает перечень объектов базы данных, содержащих импортируемую информацию. Задача пользователя сводится к указанию мышью той таблицы или запроса, информацию которых нужно импортировать в текущую базу данных Microsoft Access. В принципе, если воспользоваться экранной кнопкой " ПАРАМЕТРЫ" и открыть развернутое меню импорта, становится ясно, что импортировать в Microsoft Access можно фактически все, что угодно. Можно "перебросить" данные, можно - только структуру таблицы или запроса, а можно импортировать всю схему данных или даже макросы, модули и служебные панели. Определившись со всем этим богатством, остается одно - нажать экранную кнопку "ОК" и немного подождать. Время ожидания зависит исключительно от вычислительной мощности вашего компьютера и объема импортируемых данных. Впрочем, "немного" в данном случае является понятием относительным. Даже медленные машины выполняют процедуру импорта за считанные секунды, так что подобный промежуток времени сложно назвать слишком уж продолжительным. В любом случае, все, что было выделено и определено к импорту, попадет в текущую базу данных Microsoft Access и станет ее неотъемлемой частью. Причем на источнике это совершенно никак не отразится. В тех случаях, когда потребность в импорте возникает периодически и часто (к примеру, чаще, чем раз в год) либо когда процедуру импорта придется выполнять неквалифицированному пользователю и есть обоснованный риск повреждения самой базы данных, то можно переложить все заботы на саму программу Microsoft Access путем автоматизации процедуры импорта. В зависимости от типа данных, с которыми проводится работа, для автоматизации импорта, экспорта или связывания данных необходимо создать макрос или процедуру Visual Basic, в которых выполняются макрокоманды ПреобразоватьБазуДанных (TransferDatabase), ПреобразоватьЭлектроннуюТаблицу (TransferSpreadsheet) или ПреобразоватьТекст (TransferText). Если выполнять такую автоматизацию посредством макроса, то нужно запустить макрорекордер и выбрать макрокоманду ПреобразоватьБазуДанных (TransferDatabase) в списке макрокоманд в пустой строке макрокоманды (если источником является электронная таблица, то - ПреобразоватьЭлектроннуюТаблицу (TransferSpreadsheet), если источник это просто определенным образом отформатированный текст, то - ПреобразоватьТекст (TransferText)). Программа предложит пользователю заполнить ключевые поля макрокоманды значащими параметрами, что следует незамедлительно выполнить. Потом макрос нужно сохранить, и далее - выполнить. Все. Если вы довольны результатом, то в дальнейшем следует написать модуль Visual Basic, в задачу которого будет входить периодический запуск вашего макроса на выполнение. Таким образом, Microsoft Access самостоятельно станет производить процедуру импорта данных. Аналогичные операторы существуют и в самом языке Visual Basic, так что при наличии достаточного желания можно вообще не трогать макрорекордер и сразу все написать в рамках модуля Visual Basic. Принципиальной разницы это не имеет и зависит только от "выбора стреляющего", то есть кому как удобнее или интереснее. Правда, разрабатывая любой вид автоматизации, следует непременно помнить о том, что любая программа хорошо работает только в стабильных условиях. Это означает, что если источник данных может в ближайшем будущем исчезнуть, то в теле программы надо предусмотреть процедуру корректного аварийного завершения, а еще лучше - возможность отключения такого модуля, чтобы потом СУБД его не активизировала вообще, чем экономила рабочее время и нервы. Но если вам импорт нужен постоянно, то стоит задуматься над тем, насколько правильно вы поставили исходную задачу. Скорее всего вы ошиблись, и вам нужен не частый однократный импорт, а организация постоянной связи между источником данных и вашей СУБД. С одной стороны, отпадает необходимость в разработке каких бы то ни было макросов или программ, с другой - обеспечивается отличная возможность легко и изящно обойти ограничение на максимальный размер одной базы данных в Microsoft Access, с третьей - можно легко оперировать даже теми данными, которые фактически накапливаются, хранятся и обрабатываются в других приложениях, например таких, как Paradox. При этом не происходит никакого копирования, но пользователь Microsoft Access получает весь необходимый спектр рабочих возможностей общения с данными, словно они являются частью его собственной СУБД. Чтобы создать связь с таблицей или базой данных, нужно опять обратиться к режиму ВНЕШНИЕ ДАННЫЕ из меню ФАЙЛ, но в этот раз выбрать режим СВЯЗЬ С ТАБЛИЦАМИ (см. рис. 1). Программа опять "спросит", с чем связать (см. рис. 2), и опять откроет выбранный источник данных (см. рис. 3) для более конкретного указания. Только на этот раз оказывается, что связь разрешается установить исключительно с источником конкретной информации (таблицей или запросом), но не со структурой таблиц или каким-нибудь макросом. После нажатия экранной кнопки " СВЯЗЬ" СУБД самостоятельно выполняет несколько операций сразу. Во-первых, в текущей базе данных создается копия связанной таблицы, в точности соответствующая источнику. Во-вторых, СУБД заполняет ее теми данными, которые находились в источнике на момент связывания. В-третьих, помечает эту таблицу специальной пиктограммой стрелочки, которая обозначает, что данная таблица является связанной. Все, с этого момента ваша база получает постоянную связь с источником данных и у разработчика может не болеть голова по поводу корректности ее данных. Правда, эта связь имеет свою особенность. Во-первых, она псевдодинамическая, СУБД обновляет ее данные только в момент открытия базы. Значит разработчик самостоятельно должен предусмотреть в своей базе данных модуль, отвечающий за периодическое обновление этой связи через определенные интервалы времени в тех случаях, когда база будет эксплуатироваться достаточно длительное время, в течение которого содержимое связанной таблицы может потерять актуальность. Во-вторых, при создании связи Microsoft Access все же несколько преобразует исходную таблицу, точнее ее копию, с тем, чтобы привести в соответствие типы данных. Поэтому копия получается чуть-чуть отличной от оригинала. В подавляющем большинстве случаев это "чуть-чуть" является совершенно незначительным, но нередко может играть важную роль. Так что перед связыванием стоит задуматься над вопросом предварительной подготовки данных в источнике. Как их готовить, зависит от конкретного случая. Например, практически везде тип Number (Paradox), равно как и тип Numeric (dBASE), преобразуется в числовой тип с плавающей точкой (8 байт). Таким образом, после преобразования целочисленные номера строк превращаются в невесть что, с дробной частью - не совсем удобно для обработки в Microsoft Access. Поэтому в подобных случаях можно предварительно преобразовать такие данные, например, в текст, который и после импорта остается текстом, что куда легче в обработке. Итогом всей этой работы станет система, достаточно универсальная для того, чтобы не заставлять пользователя тратить свое время и деньги на ручной перенос информации из одного формата в другой. Как правило, этот труд настолько велик, что руководство вынуждено ограничиваться лишь теми данными, которые нужны буквально сиюминутно. И как правило, вскоре оказывается, что в самом начале что-то забыли, где-то не учли или для полноты картины непременно требуются дополнительные данные, и вся работа начинается сначала. Если же применить встроенные механизмы экспорта и импорта, имеющиеся в Microsoft Access, то становится возможным вообще продолжать эксплуатацию старых приложения в тех случаях, где переход на новые не целесообразен, в то время как другие службы или подразделения уже будут работать с базами Microsoft Access, хотя при этом, с точки зрения всей информационной системы в целом, массив данных останется единым и полностью доступным для автоматической обработки любого рода. Александр Запольскис E-mail: leshy@nestor.minsk.by