Здравствуйте!
Создал простенькую базу данных с макросами для примера. Постарался убрать все лишнее, чтобы понятно было. Суть в следующем: макрос выгружает с OLAP и вставляет в access таблицу. Файл во вложении. Запуск макроса с процедуры ИмпортИзOLAP.
Все работает, все выгружает. Но есть вопросы, сомнения.1. Получается так, что есть два рекордсета: из OLAP и Access. Потом Рекордсет из OLAP вставляем Рекордсет из Access по каждой записи. Насколько правильно данное решение?
2. Здесь после выгрузки с OLAP и до вставки в Access таблицу удаляются старые записи. Может быть лучше не удалять старые записи, а удалить старую таблицу и новую создавать? Учитывая что названия колонок не меняются.
Но есть еще таблица (в данном примере отсутствует), где названия колонок меняется, например, месяцы. То здесь актуально удалять старую таблицу и заново создавать. Кстати, до этого не удалял таблицу, а удалял колонки. И получилось так, что колонок нету в таблице, а макрос не может добавить колонку, якобы превышение количества колонок. Так и не разобрался почему так.
3. Учитывая такой логический момент, что после того как запустили макрос, то после обновления в ключевом поле изменяются значения, то есть продолжает работать счетчик. Потом получаем таблицы из разных источников, потом запускается сложные SQL-запросы к этим таблицам. Соединение таблиц происходит не по ключу, а по текстовому полю (например, "Наименование продукции", 'Код ТТ" и т д). Во вложенном примере отсутствуют такие запросы. Если в access таблицу "OLAP-Города" попадают записи из OLAP, то нужно ли ключевое поле для этой таблицы?
4. Если с помощью с ADO выгружать данные с OLAP, то в Fields имена получаются такие длинные:
[Города].[Город].[Город].[MEMBER_CAPTION] - для атрибутов
[Measures].[Отгрузки шт] - для мер
а надо так
Город
Отгрузки шт
Обращаться по таким длинным именам не удобно. Изменить имена с помощью свойства Name невозможно, так как находится в режиме чтения. Но возможно по индексу.
Написал код так, что из этих длинных имен вытаскивает короткие имена. В данном примере такой код отсутствует, будто уже определили короткие имена, чтобы не усложнять данный пример для понимания. Получаем
МассивЗаголовков с тремя полями: длинное название поля, короткое название поля и индекс поля. Дальше когда вставляем из OLAP в access таблицу, то в ИмпортРекордсет обращается не по длинному имени, а по индексу.
Оцените идею такого решения? Можно ли было по проще сделать или более правильно сделать?
5. Когда выгружаешь данные с OLAP, то может быть такое что MDX-запрос не правильный, отсутствует подключение к OLAP, нехватка памяти на сервере, отсутствие прав на выгрузку и т.д. Нужно вставить перехватчик ошибок. Но нужно поставить именно так, чтобы было понятно что за ошибка, и макросу знать куда дальше идти. Как правильно прописать?
Получилось как то емко, но подробно по каждому вопросу.
http://www.sql.ru/forum/1269772/voprosy-po-makrosu