<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title><![CDATA[AXForum - Блоги - OZKA's DAX Journal. Автор Lemming]]></title>
		<link>//axforum.info/forums/blog.php?u=2883</link>
		<description>Microsoft Dynamics: Axapta, CRM, Navision. Форум, Вопросы и помощь специалистов.</description>
		<language>ru</language>
		<lastBuildDate>Fri, 24 Apr 2026 17:06:27 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>http://axforum.info//img.axforum.info/misc/rss.jpg</url>
			<title><![CDATA[AXForum - Блоги - OZKA's DAX Journal. Автор Lemming]]></title>
			<link>//axforum.info/forums/blog.php?u=2883</link>
		</image>
		<item>
			<title>FizzBuzz</title>
			<link>//axforum.info/forums/blog.php?b=358</link>
			<pubDate>Thu, 06 Dec 2012 17:34:38 GMT</pubDate>
			<description><![CDATA[Навеяно статьей FizzBuzz, или почему программисты не умеют программировать (http://habrahabr.ru/post/111843/)


---Цитата---
Напишите программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово «Fizz», а вместо чисел, кратных пяти — слово «Buzz». Если число кратно и 3, и 5, то программа должна выводить слово «FizzBuzz»
---Конец цитаты---

#define.FIZZ(3)
#define.BUZZ(5)
static void FizzBuzzImpl(Args _args)
{
    int i;
    ;

    for (i = 1; i <=100; i++)
    {
        switch(true)
        {
            case ((i mod #FIZZ) == 0) && ((i mod #BUZZ) == 0):
                info(strfmt("FizzBuzz %1", i));
                break;
            case ((i mod #FIZZ) == 0):
                info(strfmt("Fizz (%1)", i));
                break;
            case ((i mod #BUZZ) == 0):
                info(strfmt("Buzz (%1)", i));
                break;
            default:
                info(strfmt("%1", i));
        }
    }
}
p.s. Кстати, *switch(true)* невероятно мощная конструкция, которую можно смело считать реализацией "Сопоставления с образцом"(pattern matching) в Х++.]]></description>
			<content:encoded><![CDATA[<div>Навеяно статьей <a href="http://habrahabr.ru/post/111843/" target="_blank">FizzBuzz, или почему программисты не умеют программировать</a><br />
<br />
<div class="q">
	<div class="smallfont q_title">Цитата:</div>
	<div class="alt2 q_body">
		
			Напишите программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово «Fizz», а вместо чисел, кратных пяти — слово «Buzz». Если число кратно и 3, и 5, то программа должна выводить слово «FizzBuzz»
		
	</div>
</div><div class="xpp"><div class="smallfont xpp_title">X++:</div><pre class="alt2 xpp_code">#define.FIZZ(3)
#define.BUZZ(5)
<span style="color: blue">static</span> <span style="color: blue">void</span> FizzBuzzImpl(Args _args)
{
    <span style="color: blue">int</span> i;
    ;

    <span style="color: blue">for</span> (i = 1; i &lt;=100; i++)
    {
        <span style="color: blue">switch</span>(<span style="color: blue">true</span>)
        {
            <span style="color: blue">case</span> ((i <span style="color: blue">mod</span> #FIZZ) == 0) &amp;&amp; ((i <span style="color: blue">mod</span> #BUZZ) == 0):
                info(strfmt(<span style="color: red">&quot;FizzBuzz %1&quot;</span>, i));
                <span style="color: blue">break</span>;
            <span style="color: blue">case</span> ((i <span style="color: blue">mod</span> #FIZZ) == 0):
                info(strfmt(<span style="color: red">&quot;Fizz (%1)&quot;</span>, i));
                <span style="color: blue">break</span>;
            <span style="color: blue">case</span> ((i <span style="color: blue">mod</span> #BUZZ) == 0):
                info(strfmt(<span style="color: red">&quot;Buzz (%1)&quot;</span>, i));
                <span style="color: blue">break</span>;
            <span style="color: blue">default</span>:
                info(strfmt(<span style="color: red">&quot;%1&quot;</span>, i));
        }
    }
}</pre></div>p.s. Кстати, <b>switch(true)</b> невероятно мощная конструкция, которую можно смело считать реализацией &quot;Сопоставления с образцом&quot;(pattern matching) в Х++.</div>

]]></content:encoded>
			<dc:creator>Lemming</dc:creator>
			<guid isPermaLink="true">//axforum.info/forums/blog.php?b=358</guid>
		</item>
		<item>
			<title>Подсветка синтаксиса X++</title>
			<link>//axforum.info/forums/blog.php?b=347</link>
			<pubDate>Thu, 09 Aug 2012 05:47:48 GMT</pubDate>
			<description><![CDATA[Случайно нашелся сервис создающий html c "подсвеченным" синтаксисом разных языков программирования, в котором, в том числе, есть поддержка X++. Собственно ссылка на сам сервис (http://highlight.hohli.com/) и пример (http://bit.ly/daxmap2xml2map) его работы. 

Возможно тем кто ведет блоги на сторонних ресурсах данный сервис может оказаться полезным.]]></description>
			<content:encoded><![CDATA[<div>Случайно нашелся сервис создающий html c &quot;подсвеченным&quot; синтаксисом разных языков программирования, в котором, в том числе, есть поддержка X++. Собственно <a href="http://highlight.hohli.com/" target="_blank">ссылка на сам сервис</a> и <a href="http://bit.ly/daxmap2xml2map" target="_blank">пример</a> его работы. <br />
<br />
Возможно тем кто ведет блоги на сторонних ресурсах данный сервис может оказаться полезным.</div>

]]></content:encoded>
			<dc:creator>Lemming</dc:creator>
			<guid isPermaLink="true">//axforum.info/forums/blog.php?b=347</guid>
		</item>
		<item>
			<title>Выборка данных через AOS vs SQL Server</title>
			<link>//axforum.info/forums/blog.php?b=178</link>
			<pubDate>Fri, 17 Sep 2010 15:09:42 GMT</pubDate>
			<description><![CDATA[Тут  (http://axforum.info/forums/showthread.php?t=34492&page=1)такая замечательная дискуссия идет. Я хотел было сначала там комментарий написать, но потом подумал что там мои мысли только продолжат "валить тему в оффтопик", так что я пожалуй здесь прокомментирую ту часть дискуссии, по которой появились кое-какие мысли. Ну и вообще, зачем то тут существуют блоги. 


---Цитата (сообщение от Evgeniy2020)---
а вообще можно было бы сделать обертку и движок на MS SQL
чтобы он веб интерфейс создавал прямо у себя, и клиент получал порцию уже готовую для отображения,
---Конец цитаты---
Идея генерировать веб-интерфейс на T-SQL, прямо скажем, свежая. Уверен даже, что программисты(не DAX) фанатики пихать бизнес-логику на сервер СУБД восприняли бы такую идею "на ура". Впрочем, подозреваю что или автор цитаты ну оооочень круто знает T-SQL и является тем самым фанатом, либо ему не доводилось отлаживать такой код. Главреду этого блога довелось отлаживать код, написанный человеком знавшим SQL, но не знавшим X++. Дело в том, что данный человек был PM'ом и взвалил на себя рельсу задачи по интеграции. Результат ушел в production. Увы, разгребать результаты деятельности предприимчивого менеджера пришлось совершенно другим людям. Первоначально проблемы возникали постоянно, затем начали возникать раз в год. "Профессионал" T-SQL развесил по всему коду сопли в виде констант, а часть этих констант является периодом. Вот раз в год и меняли, кто веселится с этим сейчас, не знаю, но сочувствую.


---Цитата (сообщение от Evgeniy2020)---
 
правда скролинг будет низкий по скорости, зато клиент будет весьма тонким
---Конец цитаты---
В нормальных веб-фреймворках с этим все в порядке. Для более простых интерфейсов можно использовать фильтры и paging.



---Цитата (сообщение от Evgeniy2020)---
 
а еще можно сделать язык смешанный
c# + T-SQL
такой, что всю бизнес логику можно было бы хранить прямо на сервере MS SQL
тогда клиентов можно сделать весьма тонкими,
а трафик вообще не гонять между AOS - MS SQL
все будет крутится в MS SQL
 
бизнес логика которая прямо будет в базе хранится,
... 
а уже отображения результатов на клиенте,
то есть чуть ли не html поток или xml
тогда клиентом к такой erp 
может быть IE, Excel, Biztalk, или некий родной клиент аксапты,
---Конец цитаты---
IE еще куда не шло, Excel это назад в 90-ые, с интерфейсом BizTalk'a не знаком, так что тут без комментариев.
 

---Цитата (сообщение от Evgeniy2020)---
получится MS C# SQL Advanced Business Server 
то есть MS SQL сервер с оболочкой для разработки и бизнес логикой которая рядом с данными
 
тогда AX rip
---Конец цитаты---
Автор возможно не в курсе, но современный C# до того "Advanсed" даже без T-SQL, который там как в "русской бане лыжи"(с), что многим xpp программистам мало не покажется ;) Так что, как говорится: "будьте осторожны в своих желаниях". Обобщения, LINQ, лямбды, замыкания, делегаты, расширяющие методы и бог знает что там в 4-ке нового появилось это уже не xpp. Если вооружится семантикой RPayRoll и перечисленными возможностями C#, то можно поднять трафик раздела "Разработка" на качественно иной уровень.



---Цитата (сообщение от Evgeniy2020)---
 
при таком подходе можно будет управлять erp системой с ipad
... 
а с ipad можно делать что угодно и быстро, и красиво получать любую картинку
---Конец цитаты---
Уверен Стив Джобс будет несказанно рад видеть в своей AppStore клиент для ERP системы Microsoft. Да что там, для iPad, iPhone компактней по размерам, так что для него тоже можно. Хотя, есть предположение, что мы гораздо быстрее увидим на этих устройствах веб-интерфейс 1С, чем что-то Microsoft.



---Цитата (сообщение от Evgeniy2020)---
Вот если бы меня пригласили архитектором в Редмонд
там бы я напроектировал правильную ERP систему ))
...  
я за ))
---Конец цитаты---
Это точно! Я тоже за, ну просто ради интереса и веселья, его было бы много, если бы все что выше превратилось бы в реальность ;)]]></description>
			<content:encoded><![CDATA[<div><a href="http://axforum.info/forums/showthread.php?t=34492&amp;page=1" target="_blank">Тут </a>такая замечательная дискуссия идет. Я хотел было сначала там комментарий написать, но потом подумал что там мои мысли только продолжат &quot;валить тему в оффтопик&quot;, так что я пожалуй здесь прокомментирую ту часть дискуссии, по которой появились кое-какие мысли. Ну и вообще, зачем то тут существуют блоги. <br />
<br />
<div class="q">
	<div class="smallfont q_title">Цитата:</div>
	<div class="alt2 q_body">
		
			Сообщение от <strong>Evgeniy2020</strong>
			<a href="/forums/showthread.php?p=232177#post232177" rel="nofollow"><img class="inlineimg" src="//img.axforum.info/buttons/viewpost.gif" border="0" alt="Посмотреть сообщение" /></a>
			<div style="font-style:italic">а вообще можно было бы сделать обертку и движок на MS SQL<br />
чтобы он веб интерфейс создавал прямо у себя, и клиент получал порцию уже готовую для отображения,</div>
		
	</div>
</div>Идея генерировать веб-интерфейс на T-SQL, прямо скажем, свежая. Уверен даже, что программисты(не DAX) фанатики пихать бизнес-логику на сервер СУБД восприняли бы такую идею &quot;на ура&quot;. Впрочем, подозреваю что или автор цитаты ну оооочень круто знает T-SQL и является тем самым фанатом, либо ему не доводилось отлаживать такой код. Главреду этого блога довелось отлаживать код, написанный человеком знавшим SQL, но не знавшим X++. Дело в том, что данный человек был PM'ом и взвалил на себя рельсу задачи по интеграции. Результат ушел в production. Увы, разгребать результаты деятельности предприимчивого менеджера пришлось совершенно другим людям. Первоначально проблемы возникали постоянно, затем начали возникать раз в год. &quot;Профессионал&quot; T-SQL развесил по всему коду сопли в виде констант, а часть этих констант является периодом. Вот раз в год и меняли, кто веселится с этим сейчас, не знаю, но сочувствую.<br />
<br />
<div class="q">
	<div class="smallfont q_title">Цитата:</div>
	<div class="alt2 q_body">
		
			Сообщение от <strong>Evgeniy2020</strong>
			<a href="/forums/showthread.php?p=232177#post232177" rel="nofollow"><img class="inlineimg" src="//img.axforum.info/buttons/viewpost.gif" border="0" alt="Посмотреть сообщение" /></a>
			<div style="font-style:italic">правда скролинг будет низкий по скорости, зато клиент будет весьма тонким</div>
		
	</div>
</div>В нормальных веб-фреймворках с этим все в порядке. Для более простых интерфейсов можно использовать фильтры и paging.<br />
<br />
<br />
<div class="q">
	<div class="smallfont q_title">Цитата:</div>
	<div class="alt2 q_body">
		
			Сообщение от <strong>Evgeniy2020</strong>
			<a href="/forums/showthread.php?p=232177#post232177" rel="nofollow"><img class="inlineimg" src="//img.axforum.info/buttons/viewpost.gif" border="0" alt="Посмотреть сообщение" /></a>
			<div style="font-style:italic">а еще можно сделать язык смешанный<br />
c# + T-SQL<br />
такой, что всю бизнес логику можно было бы хранить прямо на сервере MS SQL<br />
тогда клиентов можно сделать весьма тонкими,<br />
а трафик вообще не гонять между AOS - MS SQL<br />
все будет крутится в MS SQL<br />
 <br />
бизнес логика которая прямо будет в базе хранится,<br />
... <br />
а уже отображения результатов на клиенте,<br />
то есть чуть ли не html поток или xml<br />
тогда клиентом к такой erp <br />
может быть IE, Excel, Biztalk, или некий родной клиент аксапты,</div>
		
	</div>
</div>IE еще куда не шло, Excel это назад в 90-ые, с интерфейсом BizTalk'a не знаком, так что тут без комментариев.<br />
 <br />
<div class="q">
	<div class="smallfont q_title">Цитата:</div>
	<div class="alt2 q_body">
		
			Сообщение от <strong>Evgeniy2020</strong>
			<a href="/forums/showthread.php?p=232177#post232177" rel="nofollow"><img class="inlineimg" src="//img.axforum.info/buttons/viewpost.gif" border="0" alt="Посмотреть сообщение" /></a>
			<div style="font-style:italic">получится MS C# SQL Advanced Business Server <br />
то есть MS SQL сервер с оболочкой для разработки и бизнес логикой которая рядом с данными<br />
 <br />
тогда AX rip</div>
		
	</div>
</div>Автор возможно не в курсе, но современный C# до того &quot;Advanсed&quot; даже без T-SQL, который там как в &quot;русской бане лыжи&quot;(с), что многим xpp программистам мало не покажется ;) Так что, как говорится: &quot;будьте осторожны в своих желаниях&quot;. Обобщения, LINQ, лямбды, замыкания, делегаты, расширяющие методы и бог знает что там в 4-ке нового появилось это уже не xpp. Если вооружится семантикой RPayRoll и перечисленными возможностями C#, то можно поднять трафик раздела &quot;Разработка&quot; на качественно иной уровень.<br />
<br />
<br />
<div class="q">
	<div class="smallfont q_title">Цитата:</div>
	<div class="alt2 q_body">
		
			Сообщение от <strong>Evgeniy2020</strong>
			<a href="/forums/showthread.php?p=232177#post232177" rel="nofollow"><img class="inlineimg" src="//img.axforum.info/buttons/viewpost.gif" border="0" alt="Посмотреть сообщение" /></a>
			<div style="font-style:italic">при таком подходе можно будет управлять erp системой с ipad<br />
... <br />
а с ipad можно делать что угодно и быстро, и красиво получать любую картинку</div>
		
	</div>
</div>Уверен Стив Джобс будет несказанно рад видеть в своей AppStore клиент для ERP системы Microsoft. Да что там, для iPad, iPhone компактней по размерам, так что для него тоже можно. Хотя, есть предположение, что мы гораздо быстрее увидим на этих устройствах веб-интерфейс 1С, чем что-то Microsoft.<br />
<br />
<br />
<div class="q">
	<div class="smallfont q_title">Цитата:</div>
	<div class="alt2 q_body">
		
			Сообщение от <strong>Evgeniy2020</strong>
			<a href="/forums/showthread.php?p=232177#post232177" rel="nofollow"><img class="inlineimg" src="//img.axforum.info/buttons/viewpost.gif" border="0" alt="Посмотреть сообщение" /></a>
			<div style="font-style:italic">Вот если бы меня пригласили архитектором в Редмонд<br />
там бы я напроектировал правильную ERP систему ))<br />
...  <br />
я за ))</div>
		
	</div>
</div>Это точно! Я тоже за, ну просто ради интереса и веселья, его было бы много, если бы все что выше превратилось бы в реальность ;)</div>

]]></content:encoded>
			<dc:creator>Lemming</dc:creator>
			<guid isPermaLink="true">//axforum.info/forums/blog.php?b=178</guid>
		</item>
		<item>
			<title>Поисковые фразы</title>
			<link>//axforum.info/forums/blog.php?b=176</link>
			<pubDate>Wed, 15 Sep 2010 13:14:11 GMT</pubDate>
			<description><![CDATA[Около двух месяцев назад я поставил счетчик Яндекс.Метрика на свой технический блог (http://ozka-lemming.blogspot.com/). Несмотря на то, что я в нем, во первых очень редко пишу, а во вторых больше не пишу про Аксапту, народ все же заходит туда с поисковых систем, именно разыскивая информацию по DAX. Делают это редко, но метко. Например сегодня пришли с таким хитрым запросом: *"подключиться к axapta из java"*.  Я как-то раньше не отслеживал что там про аксу ищут, так как там 2.5 поста про нее, а сегодня заинтересовался. Cписок всех запросов, которые так или иначе относятся к DAX и около того:

* dynamics ax rledgersheet
* java connect axapta
* resultsetmetadata getcolumntype "dynamics ax"
* rledgersheet
* подключение к mysql из axapta
* подключиться к axapta из java
* queryrun
* 1с 8 в печатную форму акта "отпустил"
* axapta queryrun
* officialsserv_ru
* queryrun.setcursor
* settmp() в аксапте
* временная таблица axapta

]]></description>
			<content:encoded><![CDATA[<div>Около двух месяцев назад я поставил счетчик Яндекс.Метрика на свой <a href="http://ozka-lemming.blogspot.com/" target="_blank">технический блог</a>. Несмотря на то, что я в нем, во первых очень редко пишу, а во вторых больше не пишу про Аксапту, народ все же заходит туда с поисковых систем, именно разыскивая информацию по DAX. Делают это редко, но метко. Например сегодня пришли с таким хитрым запросом: <b><i>&quot;подключиться к axapta из java&quot;</i></b>.  Я как-то раньше не отслеживал что там про аксу ищут, так как там 2.5 поста про нее, а сегодня заинтересовался. Cписок всех запросов, которые так или иначе относятся к DAX и около того:<br />
<ul><li>dynamics ax rledgersheet</li>
<li>java connect axapta</li>
<li>resultsetmetadata getcolumntype &quot;dynamics ax&quot;</li>
<li>rledgersheet</li>
<li>подключение к mysql из axapta</li>
<li>подключиться к axapta из java</li>
<li>queryrun</li>
<li>1с 8 в печатную форму акта &quot;отпустил&quot;</li>
<li>axapta queryrun</li>
<li>officialsserv_ru</li>
<li>queryrun.setcursor</li>
<li>settmp() в аксапте</li>
<li>временная таблица axapta</li>
</ul></div>

]]></content:encoded>
			<dc:creator>Lemming</dc:creator>
			<guid isPermaLink="true">//axforum.info/forums/blog.php?b=176</guid>
		</item>
		<item>
			<title>Теория заговора: Microsoft .NET - продукт компании Borland.</title>
			<link>//axforum.info/forums/blog.php?b=86</link>
			<pubDate>Thu, 18 Feb 2010 18:54:05 GMT</pubDate>
			<description><![CDATA[
---Цитата---
Почему Borland понадобилось более двух лет, что бы выпустить свой ответ MS's VS.NET?
---Конец цитаты---
...

---Цитата---
 Я уже давно активно не занимаюсь разработкой на Delphi. Из-за отсутствия хорошо-оплачиваемых позиций здесь, на севере Англии, я был вынужден перейти на C#. Ужасно досадно, как мы все знаем, Delphi полностью покрывает то, что предлагает продуктовая линейка Microsoft, но этот опыт больше не позволяют оплачивать ипотеку.
---Конец цитаты---
...

---Цитата---
Знаете ли вы что человек, стоявший за созданием Delphi это Андерс Хейлсберг, один из первых сотрудников компании Borland. В свое время, вместе с Borland он усовершенствовал свой компилятор Turbo Pascal. В конечном счете, он стал главным архитектором в команде, которая произвела замену Turbo Pascal на Delphi. Являясь главным архитектором Borland, Хейлсберг тайно превратил Turbo Pascal в объектно-ориентированный язык для разработки приложений, снабдив его настоящей визуальной средой и отличными функциями доступа к базам данных.
---Конец цитаты---
...

---Цитата---
1. Среди переманенных сотрудников были: Пол Гросс - вице президент отдела "исследований и разработки" и Андерс Хейлсберг – важный участник в разработке технологий компании Borland.
2. Microsoft предложила Полу Гроссу бонус за переход в размере 1 млн. долларов, акции компании и право собственности на недвижимость недалеко от штаб-квартиры компании. Он покинул Borland и присоединился к Microsoft в сентябре 1996 года.
3. Microsoft предложила Андерсу Хейлсбергу бонус за переход в размере 1 млн. долларов и акции. Microsoft удвоила бонус до 3 млн. долларов, после того как Borland сделала контрпредложение. Хейлсберг покинул компанию в 1996 году.
---Конец цитаты---
Полный(собственный) перевод статьи(возможно местами корявый) по этой ссылке. (http://bit.ly/aX6V3t) На самом деле это действительно интересное мнение.]]></description>
			<content:encoded><![CDATA[<div><div class="q">
	<div class="smallfont q_title">Цитата:</div>
	<div class="alt2 q_body">
		
			Почему Borland понадобилось более двух лет, что бы выпустить свой ответ MS's VS.NET? 
		
	</div>
</div>...<br />
<div class="q">
	<div class="smallfont q_title">Цитата:</div>
	<div class="alt2 q_body">
		
			 Я уже давно активно не занимаюсь разработкой на Delphi. Из-за отсутствия хорошо-оплачиваемых позиций здесь, на севере Англии, я был вынужден перейти на C#. Ужасно досадно, как мы все знаем, Delphi полностью покрывает то, что предлагает продуктовая линейка Microsoft, но этот опыт больше не позволяют оплачивать ипотеку.
		
	</div>
</div>...<br />
<div class="q">
	<div class="smallfont q_title">Цитата:</div>
	<div class="alt2 q_body">
		
			Знаете ли вы что человек, стоявший за созданием Delphi это Андерс Хейлсберг, один из первых сотрудников компании Borland. В свое время, вместе с Borland он усовершенствовал свой компилятор Turbo Pascal. В конечном счете, он стал главным архитектором в команде, которая произвела замену Turbo Pascal на Delphi. Являясь главным архитектором Borland, Хейлсберг тайно превратил Turbo Pascal в объектно-ориентированный язык для разработки приложений, снабдив его настоящей визуальной средой и отличными функциями доступа к базам данных.
		
	</div>
</div>...<br />
<div class="q">
	<div class="smallfont q_title">Цитата:</div>
	<div class="alt2 q_body">
		
			1. Среди переманенных сотрудников были: Пол Гросс - вице президент отдела &quot;исследований и разработки&quot; и Андерс Хейлсберг – важный участник в разработке технологий компании Borland.<br />
2. Microsoft предложила Полу Гроссу бонус за переход в размере 1 млн. долларов, акции компании и право собственности на недвижимость недалеко от штаб-квартиры компании. Он покинул Borland и присоединился к Microsoft в сентябре 1996 года.<br />
3. Microsoft предложила Андерсу Хейлсбергу бонус за переход в размере 1 млн. долларов и акции. Microsoft удвоила бонус до 3 млн. долларов, после того как Borland сделала контрпредложение. Хейлсберг покинул компанию в 1996 году.
		
	</div>
</div>Полный(собственный) <a href="http://bit.ly/aX6V3t" target="_blank">перевод статьи(возможно местами корявый) по этой ссылке.</a> На самом деле это действительно интересное мнение.</div>

]]></content:encoded>
			<dc:creator>Lemming</dc:creator>
			<guid isPermaLink="true">//axforum.info/forums/blog.php?b=86</guid>
		</item>
		<item>
			<title>Еще пара полезностей, вдруг кому пригодится.</title>
			<link>//axforum.info/forums/blog.php?b=75</link>
			<pubDate>Sun, 31 Jan 2010 14:54:12 GMT</pubDate>
			<description><![CDATA[Я вообще-то их уже публиковал на форуме, но раз уж тут появились блоги, то пусть все будет в одном месте. 

Первым идет MapViewer, собственно, как следует из названия, позволяет просматривать относительно "сложные" мапы, чего до сих пор не позволяет дебагер. Проект можно спокойно накатывать, стандартных объектов в нем не содержится. Демо как пользоваться в листинге ниже и есть еще в самом проекте.

static void MapViewerNewDemo(Args _args)
{
    Map         map = new Map(Types::String, Types::Container);
    ;

    map.insert("A", [1, 2, 3.14,      "DAX", ["ConView Dax"]]); //Сделайте двойной клик
    map.insert("B", [10, 12, 3.14,    "NAV", ["ConView Nav"]]); //по последней колонке
    map.insert("C", [15, 111, 103.00, "1C",  ["ConView 1C"]]);  //можно увидеть как отображаются
                                                                //вложенные контейнеры

    MapViewer::showMap(map);

    //Смотрим Set штатными средствами ;)

    ConView(map.keySet().pack());
}
Обратите внимание, как можно посмотреть содержимое Set-а штатными средствами. Гуру конечно это, наверняка, знают, но вдруг сюда заглянет начинающий разработчик.

И второй проект - это документ последовательно описывающий как добавить новый полноценный отчет по складским журналам. Вообще, у меня сложилось впечатление что с этим механизмом мало кто заморачивается. Ибо там "ООП на марше" во всей своей красе. Кстати когда с этим со всем разберешься, вроде бы все становится логичным, но с другой стороны, раз уж создали такой Фреймворк, то неплохо бы было создать к нему документацию(как писать корректно клиентский код) или хотя бы спеки выложить, возможно они могли бы чем-то помочь. В общем, во втором атаче документ, когда-то там написанный мной за неделю бессонных ночей :) Рядышком там проект, в котором все описанное в документе выполнено. Вроде без проблем накатывается на чистую DAX3 SP3.]]></description>
			<content:encoded><![CDATA[<div>Я вообще-то их уже публиковал на форуме, но раз уж тут появились блоги, то пусть все будет в одном месте. <br />
<br />
Первым идет MapViewer, собственно, как следует из названия, позволяет просматривать относительно &quot;сложные&quot; мапы, чего до сих пор не позволяет дебагер. Проект можно спокойно накатывать, стандартных объектов в нем не содержится. Демо как пользоваться в листинге ниже и есть еще в самом проекте.<br />
<div class="xpp"><div class="smallfont xpp_title">X++:</div><pre class="alt2 xpp_code"><span style="color: blue">static</span> <span style="color: blue">void</span> MapViewerNewDemo(Args _args)
{
    Map         map = <span style="color: blue">new</span> Map(Types::String, Types::<span style="color: blue">Container</span>);
    ;

    map.insert(<span style="color: red">&quot;A&quot;</span>, [1, 2, 3.14,      <span style="color: red">&quot;DAX&quot;</span>, [<span style="color: red">&quot;ConView Dax&quot;</span>]]); <span style="color: green">//Сделайте двойной клик
</span>    map.insert(<span style="color: red">&quot;B&quot;</span>, [10, 12, 3.14,    <span style="color: red">&quot;NAV&quot;</span>, [<span style="color: red">&quot;ConView Nav&quot;</span>]]); <span style="color: green">//по последней колонке
</span>    map.insert(<span style="color: red">&quot;C&quot;</span>, [15, 111, 103.00, <span style="color: red">&quot;1C&quot;</span>,  [<span style="color: red">&quot;ConView 1C&quot;</span>]]);  <span style="color: green">//можно увидеть как отображаются
</span>                                                                <span style="color: green">//вложенные контейнеры
</span>
    MapViewer::showMap(map);

    <span style="color: green">//Смотрим Set штатными средствами ;)
</span>
    ConView(map.keySet().pack());
}</pre></div>Обратите внимание, как можно посмотреть содержимое Set-а штатными средствами. Гуру конечно это, наверняка, знают, но вдруг сюда заглянет начинающий разработчик.<br />
<br />
И второй проект - это документ последовательно описывающий как добавить новый полноценный отчет по складским журналам. Вообще, у меня сложилось впечатление что с этим механизмом мало кто заморачивается. Ибо там &quot;ООП на марше&quot; во всей своей красе. Кстати когда с этим со всем разберешься, вроде бы все становится логичным, но с другой стороны, раз уж создали такой Фреймворк, то неплохо бы было создать к нему документацию(как писать корректно клиентский код) или хотя бы спеки выложить, возможно они могли бы чем-то помочь. В общем, во втором атаче документ, когда-то там написанный мной за неделю бессонных ночей :) Рядышком там проект, в котором все описанное в документе выполнено. Вроде без проблем накатывается на чистую DAX3 SP3.</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img class="inlineimg" src="http://axforum.info//img.axforum.info/attach/rar.gif" alt="Тип файла: rar" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="//axforum.info/forums/blog_attachment.php?attachmentid=39&amp;d=1264949524">MapViewer.rar</a> (6.3 Кб, 1901 просмотров)</td>
</tr><tr>
	<td><img class="inlineimg" src="http://axforum.info//img.axforum.info/attach/rar.gif" alt="Тип файла: rar" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="//axforum.info/forums/blog_attachment.php?attachmentid=40&amp;d=1264949547">Russian Inventory Reports.rar</a> (160.8 Кб, 2024 просмотров)</td>
</tr>
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>Lemming</dc:creator>
			<guid isPermaLink="true">//axforum.info/forums/blog.php?b=75</guid>
		</item>
		<item>
			<title>Размышления быдлокодера о высоком(часть 1)</title>
			<link>//axforum.info/forums/blog.php?b=65</link>
			<pubDate>Fri, 01 Jan 2010 22:01:11 GMT</pubDate>
			<description><![CDATA[*Интро*.

Так уж сложилось, что наиболее существенный опыт разработки я получил именно работая с аксаптой. Фактически на момент старта у меня за плечами был опыт прикладной разработки на бейсикоподобном языке одной малоизвестной учетной системы и самостоятельные ковыряния еще в глубокой молодости Object Pаscal и Borland C++ (обе DOS). Так же были пара проектов на быдлоphp, впрочем и там я старался использовать свои малочисленные теоретические познания о принципах ООП дизайна. Еще немного до начала успел поковырять access и его VB, кстати ИМХО очень полезно для будущих аксаптоводов. Так вот,  Х++ фактически стал для меня входом в мир программирования. Читая некоторые посты форума, смею предположить что я не одинок в таком старте карьеры разработчика. 


*Ностальгия*.

Как мы все знаем, будни былокодера на Х++ весьма унылы. Работа представляет собой ковыряние в коде стандартном, и коллег. Надо сказать что код входящий в стандартную поставку просто гениален, после того как доводилось сталкиваться с некоторыми поделками коллег. Наиболее яркий пример отложился при виде "елки" из тернарных операторов на почти целый экран! Впрочем я тоже, особенно по началу, реально отжигал. Кто ж без этого!?! Одним из таких отжигов запомнилось как я получил первую задачу в одной консалтинговой компании. Суть задачи заключалась во внесении многочисленных изменений в отчеты по ОС. Я решил, что бы не было мучительно больно потом, надо минимизировать внесение изменений в стандартный код. Результатом стал огромный магический враппер класс, над классом RAssetReport. В нем и были сосредоточены большинство дополнений к этим отчетам. Сдали и забыли, однако спустя много времени, в эти отчеты понадобилось что-то добавить. Коллега очень серьезно оценил мой паттерн, так как пытаясь в отладке понять откуда растут ноги тех или иных результатов, не сразу догадался что после стандартных классов, вход вступают методы моего магического :)


*Почему аксапта напоминает мне дельфи*.

Наверное потому, что это и есть дельфи. Именно поэтому можно встретить в ней формы, под отказ забитые бизнес-логикой во всяких "кликед", "модифай" итп. Думаю определенной части коллег просто фиолетово, а некоторые и не слышали про MVC. Конечно, куда как проще вместо RunBase-а с его скучными методами подлежащими реализации в обязательном порядке, повесить всю логику на событие кнопки - здесь и сейчас. Пользователю все равно не видно, что там внутри, так зачем? Между прочим, среднестатистический проект на дельфях выглядит аналогичным образом. И именно за это многие недолюбливают дельфибыдлокодеров. Впрочем последние, спустя лет десять будут очень много зарабатывать. В нашей стране для этого сложились все условия. Потому что дельфи видимо умер, но осталось куча легаси-кода с которым кто-то должен уметь разобраться. В общем ИМХО, история с коболом повторится и с борландовским продуктом. Впрочем, поживем увидим.


*Совершенный код*.

Надо сказать что книга эта стала просто открытием. Макконнелл, без сомнения, гений. После чтения его выводов, я начал как-то подругому относится к своему коду. Даже зная что скорее всего никто никогда не посмотрит как там работает та или иная написанная мной функция, я хотя бы ради себя начал писать предельно аккуратно. Просто что бы самому приятно было. Хотя возможно кто-то другой посмотрит и решит что мой код писал криворукий индус. Не знаю, но так или иначе, я начал еще сильнее стараться над читаемостью. Что из этого получилось сложно оценить самостоятельно. Хотя иногда глядя на те или иные куски сам себе мысленно говорю: "ты был крут", ну или "какой же я му......к так все запутать на ровном месте" :) В общем, коллеги, читайте эту книгу, она прикольная.


*Споры про C#*.

Прошедший год в данном комьюнити принес не мало споров по переводу аксапты на .NET платформу и в частности язык C#. Когда я предпринял вторую, более результативную попытку постигнуть магию этого языка, я почти влюбился в него. Х++ начал казаться какой-то игрушкой, после тех возможностей которые представляет C# 2008 (.NET 3.5). Да согласен, некоторые вещи, такие как делегаты или обобщения, сходу вызывают затруднение в понимании. Но в конечном счете первые имеют узкую нишу применения, а вторые просто нужно один раз понять. Странно слышать негативные идеи о переводе системы на этот язык даже от тех, кто вроде бы знаком с ним. На мой взгляд, на данный момент это невероятно мощный ЯП среди мультипарадигменных языков. В конце концов, коллеги, нам же не Nemerle или F# предстоит учить ;) В общем, я за.



*Х++ как вершина айсберга*.

Бытует мнение что аксапта сложна не то что бы языком, а именно стыком всех своих технологий + умением разбираться и изучать стандартную бизнес-логику. Всецело разделяю это мнение, но с другой стороны, а где этого нет? Возьмем к примеру мейнстримовую на данный момент JEE. Вроде большая часть бесплатная и открытая, но если подойти с практической точки зрения, то на самом деле это - тонны кода, огромное кол-во спецификаций, XML-дескрипторы и прочие радости технологий для создания корпоративных приложений. Это в разы сложнее чем то с чем приходится регулярно работать нам, так что коллеги программисты, если есть в этом деле те, кто еще в большем шоколаде, так это 1Сники. Я это к тому, что разработка в аксе это не такой высший пилотаж, каким это казалось во времена появления этой системы в России. 


*"Сколько вешать в граммах" или сново об ООП*.

В целом Х++ ближе всего к Java. Впрочем, если вы вдруг соберетесь учить "язык для кофеварок и телефонов", ну например что бы написать своего робота для Google Wave, вы быстро поймете, что XPP настолько же близок к Java, как классический Basic к C++. А теперь давайте вспомним, сколько каждый из нас за прошедший год создал: интерфейсов, абстрактных классов с хотя бы парой параллельных наследников? Сколько раз мы поставили модификатор private или тем более protected? (кстати, а много ли сходу назовет разницу ;) ). Как часто приходилось наследоваться от существующих классов(RunBase-ы не в счет)?Зато уверен что многие из нас нарисовали немало форм, таблиц и отчетов. Опять же, а обернули ли вы свои формы в FormEngine-ы ? ;) Я все это к тому, что основные сложности не в ЯП, а в специфике нашей отрасли.


*А в заключении, поздравляю всех коллег с наступившим новым годом и поменьше нам всем неожиданных exceptions :)*

*Продолжение следует...*]]></description>
			<content:encoded><![CDATA[<div><b>Интро</b>.<br />
<br />
Так уж сложилось, что наиболее существенный опыт разработки я получил именно работая с аксаптой. Фактически на момент старта у меня за плечами был опыт прикладной разработки на бейсикоподобном языке одной малоизвестной учетной системы и самостоятельные ковыряния еще в глубокой молодости Object Pаscal и Borland C++ (обе DOS). Так же были пара проектов на быдлоphp, впрочем и там я старался использовать свои малочисленные теоретические познания о принципах ООП дизайна. Еще немного до начала успел поковырять access и его VB, кстати ИМХО очень полезно для будущих аксаптоводов. Так вот,  Х++ фактически стал для меня входом в мир программирования. Читая некоторые посты форума, смею предположить что я не одинок в таком старте карьеры разработчика. <br />
<br />
<br />
<b>Ностальгия</b>.<br />
<br />
Как мы все знаем, будни былокодера на Х++ весьма унылы. Работа представляет собой ковыряние в коде стандартном, и коллег. Надо сказать что код входящий в стандартную поставку просто гениален, после того как доводилось сталкиваться с некоторыми поделками коллег. Наиболее яркий пример отложился при виде &quot;елки&quot; из тернарных операторов на почти целый экран! Впрочем я тоже, особенно по началу, реально отжигал. Кто ж без этого!?! Одним из таких отжигов запомнилось как я получил первую задачу в одной консалтинговой компании. Суть задачи заключалась во внесении многочисленных изменений в отчеты по ОС. Я решил, что бы не было мучительно больно потом, надо минимизировать внесение изменений в стандартный код. Результатом стал огромный магический враппер класс, над классом RAssetReport. В нем и были сосредоточены большинство дополнений к этим отчетам. Сдали и забыли, однако спустя много времени, в эти отчеты понадобилось что-то добавить. Коллега очень серьезно оценил мой паттерн, так как пытаясь в отладке понять откуда растут ноги тех или иных результатов, не сразу догадался что после стандартных классов, вход вступают методы моего магического :)<br />
<br />
<br />
<b>Почему аксапта напоминает мне дельфи</b>.<br />
<br />
Наверное потому, что это и есть дельфи. Именно поэтому можно встретить в ней формы, под отказ забитые бизнес-логикой во всяких &quot;кликед&quot;, &quot;модифай&quot; итп. Думаю определенной части коллег просто фиолетово, а некоторые и не слышали про MVC. Конечно, куда как проще вместо RunBase-а с его скучными методами подлежащими реализации в обязательном порядке, повесить всю логику на событие кнопки - здесь и сейчас. Пользователю все равно не видно, что там внутри, так зачем? Между прочим, среднестатистический проект на дельфях выглядит аналогичным образом. И именно за это многие недолюбливают дельфибыдлокодеров. Впрочем последние, спустя лет десять будут очень много зарабатывать. В нашей стране для этого сложились все условия. Потому что дельфи видимо умер, но осталось куча легаси-кода с которым кто-то должен уметь разобраться. В общем ИМХО, история с коболом повторится и с борландовским продуктом. Впрочем, поживем увидим.<br />
<br />
<br />
<b>Совершенный код</b>.<br />
<br />
Надо сказать что книга эта стала просто открытием. Макконнелл, без сомнения, гений. После чтения его выводов, я начал как-то подругому относится к своему коду. Даже зная что скорее всего никто никогда не посмотрит как там работает та или иная написанная мной функция, я хотя бы ради себя начал писать предельно аккуратно. Просто что бы самому приятно было. Хотя возможно кто-то другой посмотрит и решит что мой код писал криворукий индус. Не знаю, но так или иначе, я начал еще сильнее стараться над читаемостью. Что из этого получилось сложно оценить самостоятельно. Хотя иногда глядя на те или иные куски сам себе мысленно говорю: &quot;ты был крут&quot;, ну или &quot;какой же я му......к так все запутать на ровном месте&quot; :) В общем, коллеги, читайте эту книгу, она прикольная.<br />
<br />
<br />
<b>Споры про C#</b>.<br />
<br />
Прошедший год в данном комьюнити принес не мало споров по переводу аксапты на .NET платформу и в частности язык C#. Когда я предпринял вторую, более результативную попытку постигнуть магию этого языка, я почти влюбился в него. Х++ начал казаться какой-то игрушкой, после тех возможностей которые представляет C# 2008 (.NET 3.5). Да согласен, некоторые вещи, такие как делегаты или обобщения, сходу вызывают затруднение в понимании. Но в конечном счете первые имеют узкую нишу применения, а вторые просто нужно один раз понять. Странно слышать негативные идеи о переводе системы на этот язык даже от тех, кто вроде бы знаком с ним. На мой взгляд, на данный момент это невероятно мощный ЯП среди мультипарадигменных языков. В конце концов, коллеги, нам же не Nemerle или F# предстоит учить ;) В общем, я за.<br />
<br />
<br />
<br />
<b>Х++ как вершина айсберга</b>.<br />
<br />
Бытует мнение что аксапта сложна не то что бы языком, а именно стыком всех своих технологий + умением разбираться и изучать стандартную бизнес-логику. Всецело разделяю это мнение, но с другой стороны, а где этого нет? Возьмем к примеру мейнстримовую на данный момент JEE. Вроде большая часть бесплатная и открытая, но если подойти с практической точки зрения, то на самом деле это - тонны кода, огромное кол-во спецификаций, XML-дескрипторы и прочие радости технологий для создания корпоративных приложений. Это в разы сложнее чем то с чем приходится регулярно работать нам, так что коллеги программисты, если есть в этом деле те, кто еще в большем шоколаде, так это 1Сники. Я это к тому, что разработка в аксе это не такой высший пилотаж, каким это казалось во времена появления этой системы в России. <br />
<br />
<br />
<b>&quot;Сколько вешать в граммах&quot; или сново об ООП</b>.<br />
<br />
В целом Х++ ближе всего к Java. Впрочем, если вы вдруг соберетесь учить &quot;язык для кофеварок и телефонов&quot;, ну например что бы написать своего робота для Google Wave, вы быстро поймете, что XPP настолько же близок к Java, как классический Basic к C++. А теперь давайте вспомним, сколько каждый из нас за прошедший год создал: интерфейсов, абстрактных классов с хотя бы парой параллельных наследников? Сколько раз мы поставили модификатор private или тем более protected? (кстати, а много ли сходу назовет разницу ;) ). Как часто приходилось наследоваться от существующих классов(RunBase-ы не в счет)?Зато уверен что многие из нас нарисовали немало форм, таблиц и отчетов. Опять же, а обернули ли вы свои формы в FormEngine-ы ? ;) Я все это к тому, что основные сложности не в ЯП, а в специфике нашей отрасли.<br />
<br />
<br />
<b><font color="Blue"><font size="4">А в заключении, поздравляю всех коллег с наступившим новым годом и поменьше нам всем неожиданных exceptions :)</font></font></b><br />
<br />
<i><b><font size="1">Продолжение следует...</font></b></i></div>

]]></content:encoded>
			<dc:creator>Lemming</dc:creator>
			<guid isPermaLink="true">//axforum.info/forums/blog.php?b=65</guid>
		</item>
		<item>
			<title>Интерфейс DAX 2009 - Как вернуть классическое меню.</title>
			<link>//axforum.info/forums/blog.php?b=61</link>
			<pubDate>Fri, 25 Dec 2009 13:41:49 GMT</pubDate>
			<description><![CDATA[
---Цитата (сообщение от DSPIC)---
Меню вернуть можно.
1. Выключить аутлуковское меню в настройках
2. При старте системы запускать следующий код.

static void startMainMenu(Args _args)
{
    TreeNode    tn;
    ;

    tn = TreeNode::findNode(@"\Menus\MainMenu");
    tn.AOTrun();
}
До 2009й в настройках пользователя была возможность указывать StartUp меню, но её убрали.
Только проблема этого старого меню - открывать после закрытия пользователем - нужно как-то повторить вызов этого кода: либо добавить вызов в системное меню (\Menus\GlobalToolsMenu), либо повесить обработчик горячих клавиш, и вызывать по hotKey.

Но, видимо, лучше привыкнуть к новому меню.

+ ко всему, можно убрать область содержания http://community.dynamics.com/blogs/maxbelugim/comments/9541.aspx
---Конец цитаты---
А вот я как-то раньше и не обращал внимание на кнопочку "Отправить в блог". А ведь это невероятно удобная тема. Если раньше можно было отметить тему добавив автору репутацию, а потом по своим добавлениям найти нужное сообщение, то с помощью этой штуки можно вообще собирать полезные ответы и посты в свою маленькую "локальную базу знаний" :rolleyes:]]></description>
			<content:encoded><![CDATA[<div><div class="q">
	<div class="smallfont q_title">Цитата:</div>
	<div class="alt2 q_body">
		
			Сообщение от <strong>DSPIC</strong>
			<a href="/forums/showthread.php?p=216471#post216471" rel="nofollow"><img class="inlineimg" src="//img.axforum.info/buttons/viewpost.gif" border="0" alt="Посмотреть сообщение" /></a>
			<div style="font-style:italic">Меню вернуть можно.<br />
1. Выключить аутлуковское меню в настройках<br />
2. При старте системы запускать следующий код.<br />
<div class="xpp"><div class="smallfont xpp_title">X++:</div><pre class="alt2 xpp_code"><span style="color: blue">static</span> <span style="color: blue">void</span> startMainMenu(Args _args)
{
    TreeNode    tn;
    ;

    tn = TreeNode::findNode(@<span style="color: red">&quot;\Menus\MainMenu&quot;</span>);
    tn.AOTrun();
}</pre></div>До 2009й в настройках пользователя была возможность указывать StartUp меню, но её убрали.<br />
Только проблема этого старого меню - открывать после закрытия пользователем - нужно как-то повторить вызов этого кода: либо добавить вызов в системное меню (\Menus\GlobalToolsMenu), либо повесить обработчик горячих клавиш, и вызывать по hotKey.<br />
<br />
Но, видимо, лучше привыкнуть к новому меню.<br />
<br />
+ ко всему, можно убрать область содержания <a href="http://community.dynamics.com/blogs/maxbelugim/comments/9541.aspx" target="_blank">http://community.dynamics.com/blogs/...ents/9541.aspx</a></div>
		
	</div>
</div>А вот я как-то раньше и не обращал внимание на кнопочку &quot;Отправить в блог&quot;. А ведь это невероятно удобная тема. Если раньше можно было отметить тему добавив автору репутацию, а потом по своим добавлениям найти нужное сообщение, то с помощью этой штуки можно вообще собирать полезные ответы и посты в свою маленькую &quot;локальную базу знаний&quot; :rolleyes:</div>

]]></content:encoded>
			<dc:creator>Lemming</dc:creator>
			<guid isPermaLink="true">//axforum.info/forums/blog.php?b=61</guid>
		</item>
		<item>
			<title>Многоколоночные отчеты.</title>
			<link>//axforum.info/forums/blog.php?b=51</link>
			<pubDate>Wed, 18 Nov 2009 19:51:45 GMT</pubDate>
			<description><![CDATA[*Предисловие.*

Чуть больше года назад написал простенький сабж движок. Признаться, сделано это было с одной стороны ради фана, а с другой стороны на случай если когда либо придется еще раз решать подобную задачу, то воспользоваться им, как отправной точкой. В этом уютном, новом бложике попробую презентовать его менее сумбурно, чем это было сделано тогда (http://ozka-lemming.blogspot.com/2008/08/dynamics-ax.html).

Для начала, нам нужно будет скачать приатаченный к посту файл. Писался он для чистой DAX 3 SP3, впрочем он не затрагивает никаких существующих объектов, так что можно смело грузить его как на трешку, так и на четверку. В последней вроде тоже проверял и даже, кажется, работало ;) Если у вас все импортировалось нормально, то можно продолжать.

*Немного о структуре.*

Не вдаваясь в подробности как оно все устроено изнутри, т.к. мне самому страшно влезать туда, спустя более года :), расскажу о базовых моментах, которых достаточно что бы начать использовать проект. Для создания нового отчета нам нужно будет наследоваться от класса SimpleSheetEngineData. В этом классе объявлены всего пять полей. Основными полями являются: reportDataMap, keyHeader, valueHeader. Первое поле представляет собой коллекцию(map) самих данных отчета, и ключ, и значение данной карты должны быть типа контейнер. Оставшиеся два поля, так же являются контейнерами и содержат информацию о заголовках полей ключа и значения, соответственно.

*Создим простой пример.*


class VerySimpleReport extends SimpleSheetEngineData
{
}
Перекроем у данного класса метод fillReportDataMap следующим образом:


void fillReportDataMap()
{
    ;


    this.description("Hello CEO's report");

    this.keyHeader(["Company", "CEO"]);
    this.valueHeader(["Salary", "Fortune"]);

   
    reportDataMap.insert(["Microsoft", "Стив Балмер"], [100000.0, 10000000.0]);
    reportDataMap.insert(["Apple", "Стив Джобс"], [50000.0, 30000000.0]);
    reportDataMap.insert(["Google", "Сергей Брин"], [30000.0, 14000000.0]);
    reportDataMap.insert(["Oracle", "Джозеф Эллисон"], [250000.0, 120000000.0]);

}
Создадим метод main для запуска нашего отчета:


static void main(Args   _args)
{
    VerySimpleReport        verySimpleReport = new VerySimpleReport();
    SimpleSheetEngine       simpleSheetEngine;
    ;

    verySimpleReport.fillReportDataMap();

    if (verySimpleReport.breakReport()) return;

    simpleSheetEngine = SimpleSheetEngine::construct(verySimpleReport);
    simpleSheetEngine.run();
}
Запустим наш отчет и получим форму предварительного просмотра данных.
Изображение: http://img-fotki.yandex.ru/get/3905/kir-ozer.11/0_33630_ead06454_XL.jpg 

Нажмем Функции/Печать и увидим сам отчет.
Изображение: http://img-fotki.yandex.ru/get/4104/kir-ozer.11/0_33631_b6fade07_XL.jpg 

Обратите внимание, что я изменил ширину колонок в форме просмотра и ширина колонок в отчете изменилась соответственно (по аналогии с великими и ужасными  отчетами ГК).

*Реальное предназначение.*

Приведенный выше пример иллюстрирует общий принцип работы данного движка, но создавался он все таки для многоколоночных отчетов "растущих в ширину", что и предлагаю реализовать, воспользовавшись примером ниже.

Оставим наших CEO и попробуем вывести в отчет поля и записи таблицы "План счетов". Новая реализация метода fillReportDataMap выглядит следующим образом:


#define.HeaderFieldCnt(3)

#define.SkipedDimField1(9)
#define.SkipedDimField2(22)

#define.DemoRecCnt(30)
void fillReportDataMap()
{
    LedgerTable     ledgerTable;

    DictTable       dictTable;
    int             intFieldNum;

    container       key, val;
    

    int             recNum;
    ;

    this.description("План счетов");

    dictTable = new DictTable(tableNum(LedgerTable));

    for(intFieldNum = 1; intFieldNum < dictTable.fieldCnt(); intFieldNum++)
    {
        if (intFieldNum == #SkipedDimField1 || intFieldNum == #SkipedDimField2) 
            continue;

        if (intFieldNum < #HeaderFieldCnt)
            key += dictTable.fieldObject(dictTable.fieldCnt2Id(intFieldNum)).label();
        else
            val += dictTable.fieldObject(dictTable.fieldCnt2Id(intFieldNum)).label();
    }

    this.keyHeader(key);
    this.valueHeader(val);

    key = conNull();
    val = conNull();

    while select ledgerTable
    {
        for(intFieldNum = 1; intFieldNum < dictTable.fieldCnt(); intFieldNum++)
        {
            if (intFieldNum == #SkipedDimField1 || intFieldNum == #SkipedDimField2)
                continue;

            if (intFieldNum < #HeaderFieldCnt)
                key += ledgerTable.(dictTable.fieldCnt2Id(intFieldNum));
            else
                val += ledgerTable.(dictTable.fieldCnt2Id(intFieldNum));
        }


        reportDataMap.insert(key, val);

        key = conNull();
        val = conNull();

        recNum++;

        if (#demoRecCnt == recNum)
            break;
    }

}
Запустим наш отчет и получим примерно следующую картину.
Изображение: http://img-fotki.yandex.ru/get/3901/kir-ozer.11/0_33632_28cbb384_XL.jpg 

Цветами отмечена группа переключателей, которая отвечает за режим вывода. Увы, в процессе написания текста, обнаружился баг для режима  *(вроде пофиксил)*."Автомасштабирование" - не самый интересный режим, так как он предполагает вывод всех колонок на один лист и их дальнейший просмотр, вероятно, через увеличительное стекло :) 

Более интересным является "Многостраничный вывод". Он последовательно отобразит колонки, расположив не поместившиеся из них, на следующих страницах - "в право". На скриншоте ниже я скрыл некоторые нулевые и пустые столбцы, и можно видеть, что оставшиеся поместились на два альбомных листа.
Изображение: http://img-fotki.yandex.ru/get/4001/kir-ozer.11/0_33633_3df65901_XL.jpg 

Режим "С повтором ключей" работает аналогично предыдущему, но так же отображает на дополнительных страницах значения ключевых полей, что можно попытаться разглядеть на завершающем скриншоте.

Изображение: http://img-fotki.yandex.ru/get/4106/kir-ozer.11/0_33634_fbbdaae0_XL.jpg 

*Заключение.*

Данный проект ни в коем случае не претендует на законченное решение. Во первых, все это было написано за "один заход", то есть никакого рефакторинга и прочей "доводки до ума" не проводилось. Во вторых, в процессе написания поста нашелся баг, описанный выше. Так же, я совершенно не учитывал работу в 3-х звенной архитектуре, да и печатная форма, на данный момент, не имеет никаких заголовков, итогов и других атрибутов типичного документа. Так уж вышло, что в свое время, мне довелось создать не мало подобных отчетов, причем делалось это, как правило, в дедлайн и в разные промежутки времени. Каждый раз сталкиваясь с таким отчетом, хотелось иметь в запасе отправную точку, от которой можно было бы реализовывать конкретную задачу. Собственно так и появился сей скромный проектик. 

p.s. Спасибо всем тем, кто дочитал до этого предложения :)]]></description>
			<content:encoded><![CDATA[<div><b>Предисловие.</b><br />
<br />
Чуть больше года назад написал простенький сабж движок. Признаться, сделано это было с одной стороны ради фана, а с другой стороны на случай если когда либо придется еще раз решать подобную задачу, то воспользоваться им, как отправной точкой. В этом уютном, новом бложике попробую презентовать его менее сумбурно, чем это было сделано <a href="http://ozka-lemming.blogspot.com/2008/08/dynamics-ax.html" target="_blank">тогда</a>.<br />
<br />
Для начала, нам нужно будет скачать приатаченный к посту файл. Писался он для чистой DAX 3 SP3, впрочем он не затрагивает никаких существующих объектов, так что можно смело грузить его как на трешку, так и на четверку. В последней вроде тоже проверял и даже, кажется, работало ;) Если у вас все импортировалось нормально, то можно продолжать.<br />
<br />
<b>Немного о структуре.</b><br />
<br />
Не вдаваясь в подробности как оно все устроено изнутри, т.к. мне самому страшно влезать туда, спустя более года :), расскажу о базовых моментах, которых достаточно что бы начать использовать проект. Для создания нового отчета нам нужно будет наследоваться от класса <i>SimpleSheetEngineData</i>. В этом классе объявлены всего пять полей. Основными полями являются: <i>reportDataMap</i>, <i>keyHeader</i>, <i>valueHeader</i>. Первое поле представляет собой коллекцию(<i>map</i>) самих данных отчета, и ключ, и значение данной карты должны быть типа контейнер. Оставшиеся два поля, так же являются контейнерами и содержат информацию о заголовках полей ключа и значения, соответственно.<br />
<br />
<b>Создим простой пример.</b><br />
<br />
<div class="xpp"><div class="smallfont xpp_title">X++:</div><pre class="alt2 xpp_code"><span style="color: blue">class</span> VerySimpleReport <span style="color: blue">extends</span> SimpleSheetEngineData
{
}</pre></div>Перекроем у данного класса метод <i>fillReportDataMap </i>следующим образом:<br />
<br />
<div class="xpp"><div class="smallfont xpp_title">X++:</div><pre class="alt2 xpp_code"><span style="color: blue">void</span> fillReportDataMap()
{
    ;


    this.description(<span style="color: red">&quot;Hello CEO's report&quot;</span>);

    this.keyHeader([<span style="color: red">&quot;Company&quot;</span>, <span style="color: red">&quot;CEO&quot;</span>]);
    this.valueHeader([<span style="color: red">&quot;Salary&quot;</span>, <span style="color: red">&quot;Fortune&quot;</span>]);

   
    reportDataMap.insert([<span style="color: red">&quot;Microsoft&quot;</span>, <span style="color: red">&quot;Стив Балмер&quot;</span>], [100000.0, 10000000.0]);
    reportDataMap.insert([<span style="color: red">&quot;Apple&quot;</span>, <span style="color: red">&quot;Стив Джобс&quot;</span>], [50000.0, 30000000.0]);
    reportDataMap.insert([<span style="color: red">&quot;Google&quot;</span>, <span style="color: red">&quot;Сергей Брин&quot;</span>], [30000.0, 14000000.0]);
    reportDataMap.insert([<span style="color: red">&quot;Oracle&quot;</span>, <span style="color: red">&quot;Джозеф Эллисон&quot;</span>], [250000.0, 120000000.0]);

}</pre></div>Создадим метод <i>main </i>для запуска нашего отчета:<br />
<br />
<div class="xpp"><div class="smallfont xpp_title">X++:</div><pre class="alt2 xpp_code"><span style="color: blue">static</span> <span style="color: blue">void</span> main(Args   _args)
{
    VerySimpleReport        verySimpleReport = <span style="color: blue">new</span> VerySimpleReport();
    SimpleSheetEngine       simpleSheetEngine;
    ;

    verySimpleReport.fillReportDataMap();

    <span style="color: blue">if</span> (verySimpleReport.breakReport()) <span style="color: blue">return</span>;

    simpleSheetEngine = SimpleSheetEngine::construct(verySimpleReport);
    simpleSheetEngine.run();
}</pre></div>Запустим наш отчет и получим форму предварительного просмотра данных.<br />
<img src="http://img-fotki.yandex.ru/get/3905/kir-ozer.11/0_33630_ead06454_XL.jpg" border="0" alt="" /><br />
<br />
Нажмем Функции/Печать и увидим сам отчет.<br />
<img src="http://img-fotki.yandex.ru/get/4104/kir-ozer.11/0_33631_b6fade07_XL.jpg" border="0" alt="" /><br />
<br />
Обратите внимание, что я изменил ширину колонок в форме просмотра и ширина колонок в отчете изменилась соответственно (по аналогии с великими и ужасными  отчетами ГК).<br />
<br />
<b>Реальное предназначение.</b><br />
<br />
Приведенный выше пример иллюстрирует общий принцип работы данного движка, но создавался он все таки для многоколоночных отчетов &quot;растущих в ширину&quot;, что и предлагаю реализовать, воспользовавшись примером ниже.<br />
<br />
Оставим наших CEO и попробуем вывести в отчет поля и записи таблицы &quot;План счетов&quot;. Новая реализация метода <i>fillReportDataMap</i> выглядит следующим образом:<br />
<br />
<div class="xpp"><div class="smallfont xpp_title">X++:</div><pre class="alt2 xpp_code">#define.HeaderFieldCnt(3)

#define.SkipedDimField1(9)
#define.SkipedDimField2(22)

#define.DemoRecCnt(30)
<span style="color: blue">void</span> fillReportDataMap()
{
    LedgerTable     ledgerTable;

    DictTable       dictTable;
    <span style="color: blue">int</span>             intFieldNum;

    <span style="color: blue">container</span>       key, val;
    

    <span style="color: blue">int</span>             recNum;
    ;

    this.description(<span style="color: red">&quot;План счетов&quot;</span>);

    dictTable = <span style="color: blue">new</span> DictTable(<span style="color: blue">tableNum</span>(LedgerTable));

    <span style="color: blue">for</span>(intFieldNum = 1; intFieldNum &lt; dictTable.fieldCnt(); intFieldNum++)
    {
        <span style="color: blue">if</span> (intFieldNum == #SkipedDimField1 || intFieldNum == #SkipedDimField2) 
            <span style="color: blue">continue</span>;

        <span style="color: blue">if</span> (intFieldNum &lt; #HeaderFieldCnt)
            key += dictTable.fieldObject(dictTable.fieldCnt2Id(intFieldNum)).label();
        <span style="color: blue">else</span>
            val += dictTable.fieldObject(dictTable.fieldCnt2Id(intFieldNum)).label();
    }

    this.keyHeader(key);
    this.valueHeader(val);

    key = conNull();
    val = conNull();

    <span style="color: blue">while</span> <span style="color: blue">select</span> ledgerTable
    {
        <span style="color: blue">for</span>(intFieldNum = 1; intFieldNum &lt; dictTable.fieldCnt(); intFieldNum++)
        {
            <span style="color: blue">if</span> (intFieldNum == #SkipedDimField1 || intFieldNum == #SkipedDimField2)
                <span style="color: blue">continue</span>;

            <span style="color: blue">if</span> (intFieldNum &lt; #HeaderFieldCnt)
                key += ledgerTable.(dictTable.fieldCnt2Id(intFieldNum));
            <span style="color: blue">else</span>
                val += ledgerTable.(dictTable.fieldCnt2Id(intFieldNum));
        }


        reportDataMap.insert(key, val);

        key = conNull();
        val = conNull();

        recNum++;

        <span style="color: blue">if</span> (#demoRecCnt == recNum)
            <span style="color: blue">break</span>;
    }

}</pre></div>Запустим наш отчет и получим примерно следующую картину.<br />
<img src="http://img-fotki.yandex.ru/get/3901/kir-ozer.11/0_33632_28cbb384_XL.jpg" border="0" alt="" /><br />
<br />
Цветами отмечена группа переключателей, которая отвечает за режим вывода. <strike>Увы, в процессе написания текста, обнаружился баг для режима </strike> <b>(вроде пофиксил)</b>.&quot;<i>Автомасштабирование</i>&quot; - не самый интересный режим, так как он предполагает вывод всех колонок на один лист и их дальнейший просмотр, вероятно, через увеличительное стекло :) <br />
<br />
Более интересным является &quot;<i>Многостраничный вывод</i>&quot;. Он последовательно отобразит колонки, расположив не поместившиеся из них, на следующих страницах - &quot;в право&quot;. На скриншоте ниже я скрыл некоторые нулевые и пустые столбцы, и можно видеть, что оставшиеся поместились на два альбомных листа.<br />
<img src="http://img-fotki.yandex.ru/get/4001/kir-ozer.11/0_33633_3df65901_XL.jpg" border="0" alt="" /><br />
<br />
Режим &quot;<i>С повтором ключей</i>&quot; работает аналогично предыдущему, но так же отображает на дополнительных страницах значения ключевых полей, что можно попытаться разглядеть на завершающем скриншоте.<br />
<br />
<img src="http://img-fotki.yandex.ru/get/4106/kir-ozer.11/0_33634_fbbdaae0_XL.jpg" border="0" alt="" /><br />
<br />
<b>Заключение.</b><br />
<br />
Данный проект ни в коем случае не претендует на законченное решение. Во первых, все это было написано за &quot;один заход&quot;, то есть никакого рефакторинга и прочей &quot;доводки до ума&quot; не проводилось. Во вторых, в процессе написания поста нашелся баг, описанный выше. Так же, я совершенно не учитывал работу в 3-х звенной архитектуре, да и печатная форма, на данный момент, не имеет никаких заголовков, итогов и других атрибутов типичного документа. Так уж вышло, что в свое время, мне довелось создать не мало подобных отчетов, причем делалось это, как правило, в дедлайн и в разные промежутки времени. Каждый раз сталкиваясь с таким отчетом, хотелось иметь в запасе отправную точку, от которой можно было бы реализовывать конкретную задачу. Собственно так и появился сей скромный проектик. <br />
<br />
<font size="1">p.s. Спасибо всем тем, кто дочитал до этого предложения</font> :)</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img class="inlineimg" src="http://axforum.info//img.axforum.info/attach/xpo.gif" alt="Тип файла: xpo" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="//axforum.info/forums/blog_attachment.php?attachmentid=25&amp;d=1258608550">SimpleSheetEngine_Fixed191109_OZKA.xpo</a> (66.0 Кб, 2092 просмотров)</td>
</tr>
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>Lemming</dc:creator>
			<guid isPermaLink="true">//axforum.info/forums/blog.php?b=51</guid>
		</item>
		<item>
			<title><![CDATA[Hello world ("Привет солнце").]]></title>
			<link>//axforum.info/forums/blog.php?b=32</link>
			<pubDate>Thu, 15 Oct 2009 12:55:57 GMT</pubDate>
			<description><![CDATA[Собственно subj... Ну и пара вопросов: можно ли тут писать о политике, негативе в сторону Микрософт и вообще про жизнь? =))


throw error("Parser test");
]]></description>
			<content:encoded><![CDATA[<div>Собственно subj... Ну и пара вопросов: можно ли тут писать о политике, негативе в сторону Микрософт и вообще про жизнь? =))<br />
<br />
<div class="xpp"><div class="smallfont xpp_title">X++:</div><pre class="alt2 xpp_code"><span style="color: blue">throw</span> error(<span style="color: red">&quot;Parser test&quot;</span>);</pre></div></div>

]]></content:encoded>
			<dc:creator>Lemming</dc:creator>
			<guid isPermaLink="true">//axforum.info/forums/blog.php?b=32</guid>
		</item>
	</channel>
</rss>
