AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.02.2007, 21:26   #1  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Импорт из 'офисной БД' (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 строками" (как неохотно выяснялось здесь) - мы просто задаем тип соответствующего поля таблицы по своему желанию.

Уф! Пока на этом закончу. Даже не буду объяснять, что нужно сделать для прогона демопримеров – проверим, насколько мне можно доверять написание мало-мальски понятных текстов на английском языке. Пожалуйста, следуйте кратким инструкциям внутри файла проекта, если что - спрашивайте.
Вложения
Тип файла: xpo ImportFromOfficeDB.xpo (41.0 Кб, 713 просмотров)
За это сообщение автора поблагодарили: Peter Savintsev (2), blokva (2), belugin (14), kvg6 (1), Hans (1), gl00mie (4).
Старый 22.02.2007, 12:12   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
как быстро-быстро насоздавать в 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-файла.
Миниатюры
Нажмите на изображение для увеличения
Название: fromXLS_toMDB.jpg
Просмотров: 741
Размер:	106.3 Кб
ID:	2442  
Старый 26.02.2007, 17:24   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Было бы замечательно, если бы с проектом были еще файлики готовые для тестирования.
Чтобы прочувствовать все тонкости сразу.
Старый 26.02.2007, 20:58   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Было бы замечательно, если бы с проектом были еще файлики готовые для тестирования.
Чтобы прочувствовать все тонкости сразу.
файлики будут созданы c вашими родными данными после прогона первого джоба:
Цитата:
Сообщение от внутреннего содержания файла проекта
#// 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.
Отмечу, что этот первый джоб может "тянуть" на своебразную "фишку в фишке", так как являет собой пример экспорта из Axapta в Access. И далее, в едином порыве, из Access в Excel - как затейливый вариант экспорта из Axapta в Excel (мне так было удобно в рамках примера вывести данные сразу в два файла минимальным количеством кода).

Так что, Иван, обо всём уже "позабочено"...

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  
blokva is offline
blokva
Пенсионер
Аватар для blokva
SAP
NavAx Club
 
743 / 167 (7) ++++++
Регистрация: 04.06.2003
Адрес: Беларусь
Если кому интересно добавил возможность работы с файлами MS Office 2007.
Вложения
Тип файла: xpo ImportFromOfficeDB_add.xpo (43.2 Кб, 564 просмотров)
__________________
Законы природы еще никто не отменял!
А еще у меня растет 2 внучки!!! Кому интересно подробности тут:
http://www.baby-shine.com/

Последний раз редактировалось blokva; 07.06.2008 в 17:53.
За это сообщение автора поблагодарили: Gustav (10).
Теги
access, ado, axapta, dao, download, excel, faq, законченный пример, импорт, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Построчный импорт из Excel через COM _and DAX: Программирование 3 05.07.2011 14:05
Построчный импорт из Excel через COM olesh DAX: Программирование 20 23.10.2008 14:01
Импорт бюджета из Excel OliaM DAX: Функционал 16 13.01.2005 21:56
Проблем импорт из Excel dreshkov DAX: Функционал 1 20.08.2003 16:34
OLAP: Импорт в Excel Hamster DAX: Функционал 2 23.06.2003 07:51

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:34.