03.08.2009, 12:26 | #1 |
Участник
|
использование Reporting Services в Axapta
Постепенно перевожу отчеты на RS и вот какие мысли по этому поводу:
в аксаптовских отчетах отчетах основная претензия - неудобно пользоваться пользователи хотят нормальную выгрузку в Excel, чтобы работать в привычной среде в RS удобные механизмы группировки записей, можно добавить графики, диаграммы можно повысить удобство работы и настроить цвета ячеек, например по коэффициентам или другим параметрам с помощью параметра BackgroundColor X++: =IIF(Fields!ABCRate.Value="A", "Green", IIF(Fields!ABCRate.Value="B", "Yellow", IIF(Fields!ABCRate.Value="C", "Red", "White"))) так как прямой доступ к БД, скорость выше, чем аксаптовские отчеты можно поставить RS Data Extension и обращаться через фреймфорк к AX 2009, но с этим пока не разбирался из минусов - во первых нужно самому писать SQL-запросы и настраивать дизайн - русское название поля и его длину enum-ы в таблицах это просто числа, соответственно нужно делать подстановку на уровне SQL запроса. есть два варианта решения 1.подменять цифры на текст непосредственно в запросе через CASE 2.сформировать таблицу наподобие OlapEnum, где хранить все EnumName, EnumText и EnumValue и join-ить ее (плюс нужно обновлять после каждого изменения в enum-ах) это можно сделать в случае, если нужно будет делать много отчетов и предпологается активное изменение enum-ов, для небольшого количества проще использовать case еще остается вопрос - если много раз присоединить такую таблицу в запросе, как это скажется на производительности вот пример запроса для отчета "ABC по продажам за период" X++: select ItemID, Sum(LineAmountMST) as Summ, Sum(Qty) as SummQty into #tmp from bmssa.CustInvoiceTrans where InvoiceDate >= @DateFrom and InvoiceDate <= @DateTo group by ItemID order by Summ DESC select IC.ItemCodeDesc, IC.ItemCategoryID, t1.ItemID, IT.ItemName, cast(t1.Summ as Numeric(10,2)) as SoldAmountMST, cast(t1.SummQty as int) as SoldAmountQty, case when sum(case when t1.Summ <= t2.Summ then t2.Summ end) < sum(t2.Summ) *@RateA/100 then 'A' when sum(case when t1.Summ <= t2.Summ then t2.Summ end) < sum(t2.Summ) *@RateB/100 then 'B' else 'C' end as ABCRate, case when IT.ABCRevenue = 1 then 'A' when IT.ABCRevenue = 2 then 'B' when IT.ABCRevenue = 3 then 'C' else '-' end as ABCRateOLD, IT.ABCRevenue as ABCRevenueCodeOLD from #tmp t1, #tmp t2, bmssa.InventTable IT, bmssa.ITEMCATEGORY AS IC where IT.ItemID = t1.ItemID and IT.ITEMCATEGORYID = IC.ITEMCATEGORYID group by IC.ItemCategoryID, IC.ItemCodeDesc, IT.ItemName, IT.ABCRevenue, t1.ItemID, t1.Summ, t1.SummQty drop table #tmp |
|
|
За это сообщение автора поблагодарили: GLU (1), belugin (3). |
03.08.2009, 12:49 | #2 |
Участник
|
собственно сам отчет. сделан в BIDS 2008
|
|
|
За это сообщение автора поблагодарили: mazzy (5). |
03.08.2009, 13:01 | #3 |
Участник
|
Цитата:
Сообщение от AlexeyS
есть два варианта решения
1.подменять цифры на текст непосредственно в запросе через CASE 2.сформировать таблицу наподобие OlapEnum, где хранить все EnumName, EnumText и EnumValue и join-ить ее (плюс нужно обновлять после каждого изменения в enum-ах) это можно сделать в случае, если нужно будет делать много отчетов и предпологается активное изменение enum-ов, для небольшого количества проще использовать case еще остается вопрос - если много раз присоединить такую таблицу в запросе, как это скажется на производительности 1. хардкодить в запросе - плохой путь. 2. Но и массовый join для разыменования enum'ом - тоже плохо. Может есть еще какой-нибудь путь? |
|
03.08.2009, 14:29 | #4 |
Member
|
Цитата:
Сообщение от AlexeyS
...
и предпологается активное изменение enum-ов ... Вообще, если код системы постоянно изменяется на таком уровне... стоит подумать... может что не так. Представьте себе, что Микрософт будет раз в 3 месяца обновлять список системных перечислений (я имею в виду перечисления а-ля RangeStatus, JoinMode). Я думаю, что пользователей постоянное обновление перечислений тоже несколько может озадачить. Цитата:
Сообщение от AlexeyS
...
проще использовать case ... еще остается вопрос - если много раз присоединить такую таблицу в запросе, как это скажется на производительности ... Что касается CASE — тоже не панацея. У меня был такой опыт. Долговато отрабатывал запрос в парочке VIEW, на основании которых строился OLAP отчет. Ни план исполнения запроса, ни код VIEW особых подозрений не вызывал. Была только одна особенность. Текст этой VIEW был длинный. 10 Кб +/- колометр. Пытаясь разобраться в коде... который, должен признаться, целиком в мое сознание не помещался... я его сократил, вынеся часть логики в пользовательские функции, сократив тем самым количество букв, но нисколько не поменяв сам код. Просто чтобы его понять можно было. Скорость построения запроса после этого возросла на порядки. Я не помню точно было это еще в 2000-й или 2005-й версии, но с тех пор я решил не "парить мозги" без особой надобности парсеру запросов. В общем, я за таблицу . С пересчислениями я не связывался еще как-то. Не пришлось. У нас были группировки более высокого уровня в отчетах, которые были у пользователей в голове, но которых не было в Аксапте. Таблички стали заводить в Аксапте. Там удобно создавать формы, с помощью которых редактировать данные. В первый раз чтоб побыстрее создал в БД напрямую, чтоб быстрее, но сразу понял неудобство такого подхода. Был опыт и с CASE на начальных этапах. Точно рекомендую делать в функциях (и повторное использование кода, и наглядность запросов как минимум). Но все-таки потом перешли на таблицы. Так удобнее администрировать. Хотя... может просто потому что я в T-SQL "со словарем" (как раньше писали про английский в анкетах), а в Аксапте так... Если бы я создал что-то для перечислений, я бы постарался отказаться от идеи обновления таблицы автоматически . Из принципа исключительно. Ну не должны перечисления постоянно меняться.
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: AlexeyS (2). |
03.08.2009, 14:55 | #5 |
Участник
|
Енумы могут просто добавляться.
|
|
03.08.2009, 16:26 | #6 |
Member
|
Цитата:
Сообщение от mazzy
...Енумы могут просто добавляться...
Я остаюсь при своем мнении.
__________________
С уважением, glibs® |
|
03.08.2009, 16:54 | #7 |
Member
|
Цитата:
Сообщение от glibs
...Я остаюсь при своем мнении...
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: gl00mie (1). |
03.08.2009, 19:44 | #8 |
Участник
|
Цитата:
вопрос в трудозатратах - постоянно использовать case, при этом код получается несколько громоздким, или одним махом создать таблицу перечислений и использовать join-ы. в случае большого количества отчетов склоняюсь к этому варианту. а обновление этой таблицы - административная задача при обновлении AOS, а это чаще всего бывает на этапе внедрения и разных доработок |
|
04.08.2009, 19:06 | #9 |
Участник
|
Cкажите, а какую версию SQL сервера Вы используете?
Насколько мне известно, RS в SQL 2005 не позволяет использовать временные таблицы, приходиться использовать табличные переменные, а это приводит к некоей потере производительности. В SQL 2008 это уже не так? |
|
05.08.2009, 08:13 | #10 |
Участник
|
Цитата:
Но не к такой, чтобы об этом задумываться... |
|
|
За это сообщение автора поблагодарили: Yaroslav (1). |
05.08.2009, 12:15 | #11 |
Участник
|
К вопросу о создании в базе таблицы по Enum'ам - когда у нас Аксапта только внедрялась и ее возможности я знал плохо, а вопрос отчетности уже встал, то я написал скрипт на Perl, который принимает на вход XPO файл с выгруженными Enum'ами (с метками) и генерирует SQL-скрипты для создания в базе таблицы Enum'ов и меток.
Может кому пригодиться. |
|
|
За это сообщение автора поблагодарили: AlexeyS (2). |
18.08.2009, 23:23 | #12 |
Участник
|
Отчеты в Аксапте можно делать двумя способоми - Visual Studio или с помощью Report Builder
Основной принцип такой 1. В AX (в AOT) создаются перспективы (есть преднастроенные), это модель данных, которая содержит таблицы, перечислимые типы данных, валюта, язык эта модель будет использоваться в RS как источник данных для отчета 2. В AX настраиваются URL-и для Web-сервиса и Report Manager 3. Для создания отчета используется Report Builder (запускается прямо из браузера) в нем выбирается модель данных, тип отчета и собственно создается отчет 4. настраиваем права доступа через Web или SQL Server Management Studio вещь реально очень мощная и довольно простая, не хватает только описания как это работает, чтобы "пошло в массы" Последний раз редактировалось AlexeyS; 18.08.2009 в 23:25. |
|
23.08.2009, 22:26 | #13 |
Участник
|
Для перечислимых типов делал следующее:
1. SQL запрос выбирает числовое значение перечислимого типа. 2. Уже в дизайн отчета вставляется вычисляемое поле с функцией choose(<Поле перечислимого типа>+1, список наименований) Не претендую на оптимальность, но как вариант... |
|
24.08.2009, 10:22 | #14 |
Сам.AX
|
Господа.
А что почитать стоит (какую книгу какого автора) по "теме использование Reporting Services в Axapta" или может быть у когонибудь есть в электронном варианте можно даже на английском. Поделитесь с новичком. Спасибо. |
|
24.08.2009, 11:18 | #15 |
Участник
|
на русском это прежде всего "Microsoft SQL Server 2005 Reporting Services. Профессиональная работа с отчетами. От создания до управления" Ларсон Б.
также http://msdn.microsoft.com/ http://sql.ru/forum/actualtopics.aspx?bid=57 на английском полно документации и книг в электронном виде. но лично я медленно читаю на английском и в принципе полностью хватит первой книги |
|
|
За это сообщение автора поблагодарили: Alexx7 (1). |
24.08.2009, 14:40 | #16 |
Участник
|
еще есть видео на www.techdays.ru/category/2/1.html
|
|
Теги |
olap, законченный пример, полезное, reporting services, report |
|
|