21.02.2007, 21:26 | #1 |
Moderator
|
Импорт из 'офисной БД' (Excel, Access)
Уважаемые коллеги,
Наконец-то более-менее вразумительно оформилась моя новая поделочка-хотелочка на тему импорта в Axapta. И я рад, что это случилось сегодня, а не завтра, в предпраздничный день... Итак, позвольте ее представить. Поделочка представляет собой семейство классов (аж!), в состав которого входят: один класс-родитель, объединяющий общие операции: -- ImportFromOfficeAbstractDB и три класса-"потомка", представляющих собой "импорты" из конкретных приложений (Excel, Access) с использованием конкретной технологии (ADO, DAO): -- ImportFromOfficeExcelByADODB -- ImportFromOfficeAccessByADODB -- ImportFromOfficeAccessByDAO Смысл каждого класса, я думаю, понятен из практически исчерпывающих идентификаторов (я использовал пятибуквенное ADODB вместо трехбуквенного ADO в целях лучшего визуального контраста с трехбуквенным DAO). В основу семейства (т.е. в основу класса-"родителя") положен уже известный класс ExcelImportADO, разработанный gl00mie в теме Вспомогательный класс для импорта из Excel через ADO. И за него gl00mie - большое спасибо! Также хотелось бы поблагодарить blokva за его активное и конструктивное участие в обсуждении "базового" класса gl00mie. Я спешу зафиксировать копирайты этих коллег на соответствующие и существенные фрагменты кода в моей поделочке, которые были заимствованы из "базового" класса, а также на английские комментарии gl00mie - их я постарался максимально деликатно сохранить. И даже, войдя во вкус, сам добавил немного английской отсебятины. Надеюсь, понять ее будет несложно. Но приготовьтесь - в проекте нет ни слова по-русски (ну, может быть, за исключением фразы типа «выгружен тогда-то»). Интерфейсные методы трех наследников практически полностью совпадают с методами «базового» класса - как по наименованию, так и по составу параметров. И самое главное - практически полностью совпадает технология работы с этими методами. Возможности, которые доступны в поделочке и которые нравятся мне самому: -- задействование (наконец-то!) для "больших дел" своего любимого Access'а; -- доступность в связи с этим задействованием настоящего целого типа данных Long (а не только одного Double, как в ADO для Excel); -- возможность задания в качестве источника записей не только имени конкретной таблицы (листа), но и произвольного SQL-запроса в синтаксисе Jet SQL; можно, например, заджойнить два excel'ных листа (упс!); это реализация хотелки, о которой я мечтал здесь; -- при использовании импорта из mdb-файла имеем дело с более строгой типизацией данных - нет необходимости следить за "первыми 8 строками" (как неохотно выяснялось здесь) - мы просто задаем тип соответствующего поля таблицы по своему желанию. Уф! Пока на этом закончу. Даже не буду объяснять, что нужно сделать для прогона демопримеров – проверим, насколько мне можно доверять написание мало-мальски понятных текстов на английском языке. Пожалуйста, следуйте кратким инструкциям внутри файла проекта, если что - спрашивайте. |
|
|
За это сообщение автора поблагодарили: Peter Savintsev (2), blokva (2), belugin (14), kvg6 (1), Hans (1), gl00mie (4). |
22.02.2007, 12:12 | #2 |
Moderator
|
как быстро-быстро насоздавать в Access'е таблицы с импортируемыми данными
Наверное, следует сказать несколько слов о втором продукте в скобках, т.е. об Access. Ибо, думаю, не все до конца представляют, как эффективно воспользоваться именно аксесной составляющей этого "щастья" в виде "импортных" классов.
Мне частенько встречалось мнение (имхо ошибочное), что работать с Access сложно, во всяком случае, "куда сложнее, чем с Excel". Думаю, что основная причина этой "сложности" заключается в том, что перед тем как начать какие-либо манипуляции с данными в Access'е, необходимо сначала создать хотя бы одну таблицу, т.е. контейнер для этих данных (для сравнения: в Excel этот "контейнер" в виде рабочего листа существует сразу, как только вы создадите новую рабочую книгу). А поскольку вручную "париться" с созданием таблиц никому неохота, то Access для текущих повседневных задач востребован как-то существенно меньше, чем тот же Excel. У меня хорошая новость для "лентяев", не желающих "париться": начиная с версии 2000, в Access доступна очаровательнейшая возможность наибыстрейшего создания таблицы Access из таблицы Excel (лично я не знаю способа быстрее). Способ этот представляет собой обычный, всеми нами любимый "копипаст". Итак, надо всего лишь: -- выделить в Excel требуемый диапазон данных в таблице и скопировать его; -- перейти в Access в открытый mdb-файл и, предварительно щелкнув на закладке "Таблицы" окна базы данных, выполнить команду "Вставить"; -- ответить "Да" или "Нет" на вопрос системы о том, содержит ли первая строка вставляемых данных заголовки полей. Всё! Далее можно при желаниии подправить типы данных полей, если вы не согласны с результатами автоматического распознавания (которое, кстати, выполняется по пресловутым "первым 8 строкам"). Можно даже поступить так: сначала скопировать лишь несколько строк вместе со строкой заголовков, чтобы создалась таблица, после чего настроить типы полей, удалить эти первоначальные строки и заново скопировать данные уже в настроенную структуру таблицы. P.S. НА ЗАМЕТКУ: Когда я только начинал пользоваться описанным выше способом переноса данных из Excel в Access, у меня иногда этот способ не срабатывал с выдачей сообщения вида: "The Microsoft Jet database engine cannot open the file '<xls-filename>'. It is already opened exclusively by another user, or you need permission to view its data". Опытным путем было установлено, что это происходит тогда, когда название рабочей книги Excel содержит символы кириллицы: т.е. с "Book1" всё было хорошо, а с "Книга1" - плохо. Сочетание приложений при этом было такое: Excel - 2000 рус. SP3, Access - 2000 рус. SP-3. Не знаю, существует ли более тонкая зависимость от сочетания версии или языка Excel и Access, но, например, в англ. версии Office 2003 вроде всё работает хорошо вне зависисмости от "русскоязычности" имени xls-файла. |
|
26.02.2007, 17:24 | #3 |
Участник
|
Было бы замечательно, если бы с проектом были еще файлики готовые для тестирования.
Чтобы прочувствовать все тонкости сразу. |
|
26.02.2007, 20:58 | #4 |
Moderator
|
Цитата:
Цитата:
Сообщение от внутреннего содержания файла проекта
#// ABOUT DEMO APPENDIX
#// -------------------- #// This XPO-file contains 4 jobs to demonstrate how to use heirs of this class. #// Please run job ImportFrODB_DemoStep1_PreparingTest first to create two sample files (.mdb & .xls). #// Sample files will be saved in preset folder C:\AxForumTests\Gustav (folder will be created automatically) #// (please don't change this default path without weighty reasons - save your time! :-) ) #// (of course if you want to do it in any way - please change path in every job of 4) #// After that you can run other jobs (_DemoStep2,3,4) in any order. Так что, Иван, обо всём уже "позабочено"... P.S. Добавлю еще цитату для "разжигания аппетита" - SQL-запрос к листу Excel возвращает фамилии, начинающиеся на 3-ю по "популярности" первую букву поля Name вашей таблицы EmplTable (у меня это была буква Б, а первые две - К и В русские): Код: # doc.setRecordSource( # 'SELECT * FROM [EmplTable$] WHERE Left([Name],1) IN ' + # '( ' + # ' SELECT TOP 1 FirstLetter FROM ' + # ' ( ' + # ' SELECT TOP 3 FirstLetter, Count(*) AS CountOfFirstLetter ' + # ' FROM ' + # ' ( ' + # ' SELECT Left([Name],1) AS FirstLetter, [EmplTable$].* ' + # ' FROM [EmplTable$] ' + # ' ) ' + # ' GROUP BY FirstLetter ' + # ' ORDER BY Count(*) DESC ' + # ' ) ' + # ' ORDER BY CountOfFirstLetter ' + # ') ' ); # // this query returns subset of records from worksheet EmplTable, # // in which every name of employee starts with character, # // which is on 3rd position in rank of more popular first characters in Name field |
|
07.06.2008, 17:17 | #5 |
Пенсионер
|
Если кому интересно добавил возможность работы с файлами MS Office 2007.
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ Последний раз редактировалось blokva; 07.06.2008 в 17:53. |
|
|
За это сообщение автора поблагодарили: Gustav (10). |
Теги |
access, ado, axapta, dao, download, excel, faq, законченный пример, импорт, полезное |
|
Похожие темы | ||||
Тема | Ответов | |||
Построчный импорт из Excel через COM | 3 | |||
Построчный импорт из Excel через COM | 20 | |||
Импорт бюджета из Excel | 16 | |||
Проблем импорт из Excel | 1 | |||
OLAP: Импорт в Excel | 2 |
|