|  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 | Цитата:  файлики будут созданы 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. Так что, Иван, обо всём уже "позабочено"...  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 | |||
| 
 |