| 
			
			 | 
		#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). | |
| 
			
			 | 
		#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-файла.  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Было бы замечательно, если бы с проектом были еще файлики готовые для тестирования.  
		
		
		
		
		
		
			
		
		
		
		
	Чтобы прочувствовать все тонкости сразу.  
		 | 
| 
	
 | 
| 
			
			 | 
		#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 | 
| 
	
 | 
| 
			
			 | 
		#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 | |||
		
  |