Полезная информация

РАБОТАЕМ С ДАННЫМИ

КОМПЬЮТЕРНАЯ ГАЗЕТА

Часть вторая, импорт

Как и следовало ожидать, раз разработчики СУБД 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