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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.06.2004, 20:42   #1  
Павел Протасов is offline
Павел Протасов
Участник
 
2 / 10 (1) +
Регистрация: 05.06.2004
Отчёты в Excel

Добрый день!
Имеется Аксапта 2.5, необходимо отчёты по основным средствам вывести в Excel.
Я перекрываю метод main класса RAssetStandardReportDialog следующим образом (пример приведён для отчёта RassetListing):

<div class='XPPtop'>X++</div><div class='XPP'>
[color=:blue]private[/color] [color=:blue]static[/color] [color=:blue]void[/color] main(Args _args)
{
   …    
  ;

   reportDialog.setReportName(_args.parm());

   [color=:blue]if[/color] (reportDialog.prompt())
   {
       dlg = reportDialog.progressDlg(); [color=:green]// Create process dialog
[/color]
       excel = [color=:blue]new[/color] ComExcelDocument_RU();

       excel.newFile([color=:red]"d:\\template.xlt"[/color], [color=:blue]false[/color]);

       excel.InsertValue(ComExcelDocument_RU::numToNameCell(1, 1),
         reportDialog.assetStandard()
       );

       qr = reportDialog.queryRun();
       [color=:blue]if[/color] (qr.prompt())
       {
           [color=:blue]while[/color] (qr.[color=:blue]next[/color]())
           {
               rassetTable = qr.GetNo(1);

               [color=:green]// вручную получаю значения, которые рассчитываются в отчёте
[/color]                rassetSumTrans = RAssetSumCalc_Trans::newAssetPeriod
                 (rassetTable.AccountNum, reportDialog.assetStandard());

               AssetGroup = RAssetStandards::find(rAssetTable.AccountNum,
                 reportDialog.assetStandard()).AssetGroup;

               currencyCode = RAssetStandards::find(rAssetTable.AccountNum,
                 reportDialog.assetStandard()).currencyCode;

               [color=:green]// вывожу информацию по строке в Excel
[/color]                excel.InsertValue(ComExcelDocument_RU::numToNameCell(1, i + 2),
                 rassetTable.AssetGroup);
               …
               excel.InsertValue(ComExcelDocument_RU::numToNameCell(7, i + 2),
                 num2str(rassetSumTrans.netBookValue(), 10, 2, 1, 3));
               
               i++;
               dlg.incCount();     [color=:green]// Force progress bar to its end
[/color]             }
       }
       excel.Visible([color=:blue]true[/color]);
       excel.finalize();
   }
}</div>

Всё работает… но остаётся ощущение неправильности и нарушения идеологии.

Возникает ряд вопросов:
1) Существуют ли другие, более элегантные способы получения желаемых отчётов в Excel’е?

2) У отчёта RassetListing есть методы assetStandard, assetGroup (RassetListing->Designs->AutoDesignSpecs->RassetTable_1), assetNetBookValue и пр. Я пока не нашёл способа добраться до них, в связи с чем мне приходится их рассчитывать в методе main класса-потомка от RAssetStandardReportDialog. Каким образом их можно брать напрямую из отчёта?

3) Полный путь к шаблону я указываю явно (excel.newFile("d:\\template.xlt", false)), это пойдёт только на этапе тестирования. Существует ли функция, возвращающая абсолютный путь к Application\Share\Include? В принципе, труда не составит написать таблицу и форму, подобную CustParameters и задавать путь там – но такой способ решения этого вопроса неоправданно сложен.

--
С уважением,
Павел Протасов.
Старый 06.06.2004, 13:17   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
но остаётся ощущение неправильности и нарушения идеологии.

А что что, на ваш взгляд, вызывает это ощущение?
Сама необходимость программировать вывод?

Цитата:
Существуют ли другие, более элегантные способы получения желаемых отчётов в Excel’е?
Да.
Можно просто делать обычные Аксаптовские отчеты, затем выводить в текстовый файл с расширением txt или xls, потом открывать в Excel'е.
Никакого избыточного программирования.

Если же вы не против того, чтобы затратить время на программирование, то посмотрите на www.axforum.ru, там приводилось много способов. Так например, предлагалось сначала готовить диапазон, а затем вставлять его одним движением через буфер обмена.

Цитата:
Я пока не нашёл способа добраться до них
Я тоже не знаю. Может кто другой расскажет об этом.
Я же просто вывел отчет в текстовый файл и не парился бы...
Если хочется избавиться от строчек-заголовков страниц, то в отчете можно убрать шаблон ReportDesign. Пожалуй, это единственное изменение на которое лично я бы согласился

Цитата:
Существует ли функция, возвращающая абсолютный путь к Application\Share\Include?
<div class='XPPtop'>X++</div><div class='XPP'>xInfo:irectory(DirectoryType::Include);</div>
Пример использования см. SysFileDeployment.sourcePath()

кстати, выводить код Аксапты лучше внутри тегов [ xpp ] Код [ /xpp ] (нужно убрать пробелы).
либо воспользуйтесь кнопкой X++ при создании сообщения.
__________________
полезное на axForum, github, vk, coub.
Старый 06.06.2004, 23:09   #3  
Павел Протасов is offline
Павел Протасов
Участник
 
2 / 10 (1) +
Регистрация: 05.06.2004
Цитата:
А что что, на ваш взгляд, вызывает это ощущение?
Сама необходимость программировать вывод?
Нет, необходимость программировать ощущение неправильности не вызывает
Оно (ощущение) было вызвано тем, что отчёт формирует всю необходимую информацию и всего лишь хотелось её использовать.

Цитата:
Можно просто делать обычные Аксаптовские отчеты, затем выводить в текстовый файл с расширением txt или xls, потом открывать в Excel'е.
Тут всё дело в квалификации/лени/привычке пользователей... Заставить их держать в памяти цепочку "выгрузка в txt | запомнить куда положили | запустить Excel | открыть файл" будет весьма непросто... Легче уж один раз написать, чем 100 раз объяснять, как выполнить 2 простых действия.

Цитата:
посмотрите на www.axforum.ru, там приводилось много способов.
Спасибо большое, обязательно посмотрю.

--
С уважением,
Павел Протасов.
Старый 07.06.2004, 08:39   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Павел Протасов
Цитата:
Можно просто делать обычные Аксаптовские отчеты, затем выводить в текстовый файл с расширением txt или xls, потом открывать в Excel'е.
Тут всё дело в квалификации/лени/привычке пользователей... Заставить их держать в памяти цепочку "выгрузка в txt | запомнить куда положили | запустить Excel | открыть файл" будет весьма непросто... Легче уж один раз написать, чем 100 раз объяснять, как выполнить 2 простых действия.

Это не повод переписывать весь механизм отчетов, не так ли?
Это повод запрограммировать эту цепочку.
__________________
полезное на axForum, github, vk, coub.
 


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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:13.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.