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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.06.2011, 16:45   #1  
Яга is offline
Яга
Участник
 
6 / 10 (1) +
Регистрация: 13.02.2004
"Печать" отчета в Excel - проблема с округлением real полей
Имеется в виду проблема при стандартной печати самописного отчета с real-полями, когда отчет выводится на экран, а уже оттуда "печатается" в Excel. Поля представляют собой результат работы функций. На экране в некоторых столбцах(полях) делается округление до 2 знаков, а в некоторых до 3 знаков. При"печати" же с экрана в Excel информация из 3 знака исчезает, число округляется до 2 знаков. Я понимаю, что если заменю 3хзначные поля на строковые, то решу эту проблему. Но хочу спросить, может быть есть какая-то настройка, чтобы решить эту проблему проще. В проблемных полях настроила свойства NoOfDecimals=3, MinNoOfDecimals=3, изменила тип функции c real на SalesQty, но это не помогает.

Последний раз редактировалось Яга; 16.06.2011 в 16:51.
Старый 16.06.2011, 16:56   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Вроде как в стандартном функционале нет встроенной возможности отправить внутренний отчёт в Excel. Скорее всего это локальная доработка. И скорее всего в недрах у себя она использует функцию strfmt(), которая как раз так неподобающе ведёт себя с дробными знаками.
X++:
info(strfmt("%1", 1.999));
Старый 16.06.2011, 17:07   #3  
Яга is offline
Яга
Участник
 
6 / 10 (1) +
Регистрация: 13.02.2004
Ну как же нет, в отчете щелкаешь по значку принтера, открывается окно Натройка принтера с выбором принтера, Ехсеl/Получатель почты/Файл/Принтер, количетсво экз
Старый 16.06.2011, 17:13   #4  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
Это приколы самого экселя, можете в свойствах ячейки настроить количество знаков после зяпятой. Но я бы все таки пользовался num2str, это обезопасит от проблем, в случае если в шаблоне кто-то что-то поменяет в этих ячейках.
Старый 16.06.2011, 17:54   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Яга Посмотреть сообщение
Ну как же нет, в отчете щелкаешь по значку принтера, открывается окно Натройка принтера с выбором принтера, Ехсеl/Получатель почты/Файл/Принтер, количетсво экз
Это НЕ стандарт. Это доработка Columbus.

DAX2009,ru5 Нет вывода в Excel стандартных отчетов

Кстати, о какой версии Axapta идет речь?

Если эту доработку у Вас не трогали, то там экспорт идет через буфер обмена, содержимое которого формируется именно через strFmt(). Как следствие, количество знаков автоматически округляется до 2.

Если Вы хотите этого избежать, то Вам надо либо модифицировать класс подготовки данных для экспорта в Excel, либо конвертировать число в строку уже в стандартном отчете Axapta. Тогда класс экспорта возмет ее "как есть"


------------------
PS: Если речь идет о версии Ax3.0 или выше, то, можно выполнить модификацию классов Columbus следующим образом.

1. Вызов их класса находится в методе стандартного класса \Classes\ClassFactory\createViewer(). Как именно он называется я не знаю, но его имя, скорее всего он будет содержать слово "Excel" и вызываться в case ReportOutputUserType::Viewer4

2. В этом классе должен быть метод writeReal(). Так вот, в нем вместо конструкции вроде

StrFmt("%1",_field.value())

необходимо записать

_field.formatValue()

Свойство formatValue() как раз и преобразовывает значение в символьную строку с учетом всех настроенных форматов в отчете. Вот этих самых NoOfDecimals и MinNoOfDecimals. Правда, могут возникнуть проблемы с форматированием уже в Excel. Но в данном случае это решаемо указанием формата ячейки в Excel после вывода отчета.

Аналогичным образом следует модифицировать методы writeSum(), writeInt(), writeDate() в том же классе.

Последний раз редактировалось Владимир Максимов; 16.06.2011 в 18:35.
За это сообщение автора поблагодарили: Яга (1).
Старый 17.06.2011, 14:02   #6  
Яга is offline
Яга
Участник
 
6 / 10 (1) +
Регистрация: 13.02.2004
Огромное спасибо! Все получилось, хотя в Excel и приходится менять формат, но по крайней мере число приходит неповрежденным, все три знака. И пользователь сразу может складывать числа, окрашивая ячейки (в отличие от предложенного способа через num2str).

У нас есть еще одна проблема с этими же классами, может быть тоже кто-то уже столкнулся с такими же проблемами и поделится опытом. После перехода в Ax2009 некоторые отчеты при такой же "печати" в Excel стали выводиться не полностью, а только 1-2 последних секции. Так, в некоторых после "печати" с экрана в Excel отсутствует заголовок, а в некоторых отсутствует сама таблица (видна только строка итогов).
Старый 17.06.2011, 14:57   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Яга Посмотреть сообщение
У нас есть еще одна проблема с этими же классами, может быть тоже кто-то уже столкнулся с такими же проблемами и поделится опытом. После перехода в Ax2009 некоторые отчеты при такой же "печати" в Excel стали выводиться не полностью, а только 1-2 последних секции. Так, в некоторых после "печати" с экрана в Excel отсутствует заголовок, а в некоторых отсутствует сама таблица (видна только строка итогов).
Это уже надо сам класс разбирать и смотреть конкретный отчет. Кое-что все-таки поменялось в отчетах в Ax2009. В первоначальном классе Columbus идея заключалась в том, что секция Header должна печататься только один раз. Что вполне логично для вывода в Excel. Но вот способ определения того, надо или не надо печатать конкретную секцию - не очень корректный, что и приводило к ошибкам при определенной структуре отчета.

Попробуй скачать по приведенной выше ссылке мое решение с использованием копирования ADO RecordSet. Я там попутно сильно "вылизал" анализ того какую секцию надо печатать, а какую - нет.

Правда, это тоже без гарантий. При определенном способе использования ProgrammableSection может "пойти лесом" любая логика.
Теги
excel, экспорт, экспорт в excel

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблема с "rNumDateInWordConverter" и языком "de" Delfins DAX: Программирование 2 15.04.2010 10:10
daxsol: Axapta Kernel Functions Blog bot DAX Blogs 1 16.05.2009 19:22
Второе наименование номенклатуры и проблема добавления полей в форме "номенклатура" EVER DAX: Функционал 28 03.09.2008 21:58
Проект "Движок отчётов с поддержкой Excel" Alks DAX: База знаний и проекты 6 07.01.2005 02:53
Печать отчета в Excel. Axapta 3.0 Fedr Kuzmich DAX: Функционал 2 19.05.2004 18:26

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

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

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