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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.02.2008, 14:34   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,715 / 1204 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вариант решения подобных задач сильно облегчающий жизнь разработчика:

В файле шаблона Excel делаются прямые ссылки на другой лист. Т.е. напрямую в ячейках второго листа пишется нечто вроде: Лист1!A1

Сами же данные забрасываются на первый лист. Либо в специальные ячейки, либо, сплошным списком.

Если заброс данных идет сплошным списоком, то адресация на втором листе делается не к конкретной ячейке, а при помощи поисковых функций самого Excel. Например:

=ЕСЛИ(ЕНД(ВПР($B27;Отгрузка!$A:$N;3;ЛОЖЬ));0;ВПР($B27;Отгрузка!$A:$N;3;ЛОЖЬ))

Здесь ищется значение на листе с именем "Отгрузка" при помощи функции ВПР() по ключу из столбца "B". Функция ЕСЛИ(ЕНД(),0,ВПР()) нужна для того, чтобы подавить вывод значения #Н/Д, если по указанному ключу ничего не найдено.

Разумеется сам шаблон Excel получается значительно бОльшего размера (в байтах), его сложнее модифицировать и несколько больше времени тратится на его открытие (идет обновление связей при открытии). Однако имеем следующие преимущества:
  1. Вся логика форматирования отчета (что и где расположить) целиком находится в файле Excel. Одно место для внесения модификаций. Причем это можно доверить самим пользователям.
  2. Подготовка данных и их выгрузка в Excel существенно облегчается. На порядки! Код формирования такого отчета в Axapta становится "прозрачным" и легко модифицируемым.
  3. Пользователи могут видеть исходные данные, из которых получается результирующий отчет и, если необходимо, делать дополнительный анализ. Например, почему некие данные не отобразились в результате или отобразились не те данные. Упрощается "разбор полетов".
Старый 15.02.2008, 15:35   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Владимир, от души поддерживаю!
Цитата:
Сообщение от Gustav Посмотреть сообщение
Для развесистых стандартных шаблонов (типа акта ОС-1) теперь тоже использую такой вывод с CopyFromRecordset. В файле шаблона создаю еще один лист, можно скрытый, на который вывожу одну строку с необходимыми данными. А в ячейках самого шаблона прописываю формулы-ссылки на ячейки этой выводимой строки. Подход родился в процессе решения задачи по пакетной печати нескольких тысяч актов ОС-1. Один CopyFromRecordset вместо многих присваиваний Range.Value(...) увеличил скорость процесса примерно в 30 раз (иначе можно было бы тихо загнуться на этой печати).
Я использую 3 листа:

- "Бланк" - собственно сформатированный бланк, который подается на печать; в ячейках бланка находятся формулы, ссылающиеся на лист "ТекущаяСтрока" вида: =ТекущаяСтрока!B3.

- "ВыгруженныеДанные" - много строк, выгруженных из Аксапты при помощи CopyFromRecordset, начиная с ячейки B2 (в первой строке, c B1 - заголовки полей для удобства); с дополнительной колонкой A "Печатать?", которая по умолчанию заполняется "единичками" (о ней ниже).

- "ТекущаяСтрока - таблица вида "выгруженных данных", но только с двумя строками (ну, и с теми же заголовками полей, что и на втором листе).

В первой из этих двух строк находятся формулы, ссылающиеся на лист "ВыгруженныеДанные" вида (на примере ячейки B2): =ИНДЕКС(ВыгруженныеДанные!B:B, $A$2). В ячейке $A$2 содержится номер строки, которую надо напечатать. Этот номер меняется в цикле несложным макросом.

Ниже этой строки находится дополнительная строка, каждая ячейка которой ссылается на ячейку выше. Цель: замена 0 пустой строкой в тех случаях, когда отображение 0 на "Бланке" нежелательно. Формула в ячейке B3 такая: =ЕСЛИ(B2=0,"",B2)

Выгрузив данные, пользователь сам решает, какие именно строчки ему надо напечатать, выставляя 0 или 1 в колонке "Печатать?", после чего кнопкой запускает макрос, который бежит по колонке А и печатает бланк для тех строк, у которых в колонке A присутствует 1.

Листы, кнопка, макрос живут в файле *.xlt и при выгрузке пользователь получает своеобразное мини-АРМ для печати.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Копирование листов в Excel с шаблоном Zoe DAX: Программирование 8 20.11.2008 15:50
Копирование листов в Excel Андрей К. DAX: База знаний и проекты 12 30.08.2007 08:44
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Копирование из Грида в Excel ArturK DAX: Программирование 5 09.03.2004 19:55
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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