<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Microsoft Dynamics CRM &#187; plug-in</title>
	<atom:link href="http://ms-dynamics-crm.com.ua/tag/plug-in/feed/" rel="self" type="application/rss+xml" />
	<link>http://ms-dynamics-crm.com.ua</link>
	<description>Все о Microsoft Dynamics CRM</description>
	<lastBuildDate>Fri, 30 Jul 2010 08:18:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Загрузка любого файла из SharePoint в заметки(note) MS CRM 4.0</title>
		<link>http://ms-dynamics-crm.com.ua/2010/01/12/upload-any-file-from-sharepoint-to-ms-crm-notes/</link>
		<comments>http://ms-dynamics-crm.com.ua/2010/01/12/upload-any-file-from-sharepoint-to-ms-crm-notes/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 19:01:47 +0000</pubDate>
		<dc:creator>Костя Афендиков</dc:creator>
				<category><![CDATA[ms crm 4.0]]></category>
		<category><![CDATA[plug-in]]></category>
		<category><![CDATA[sharepoint]]></category>

		<guid isPermaLink="false">http://ms-dynamics-crm.com.ua/?p=1110</guid>
		<description><![CDATA[Задача: есть файл, который хранится в SharePoint, следовательно есть к нему url, необходимо перенести этот файл в заметки Microsoft Dynamics CRM 4.0 для определенного объекта. Файл может быть любим: архив, документ word, excel, pdf &#8230;
Примечание: 
для учетной записи пользователя должны быть предоставлены необходимые права в SharePoint
Сам алгоритм плагина будет выглядеть так: 
1. сначала я должен [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Задача:</strong> есть файл, который хранится в <strong>SharePoint</strong>, следовательно есть к нему url, необходимо перенести этот файл в заметки Microsoft Dynamics CRM 4.0 для определенного объекта. Файл может быть любим: архив, документ word, excel, pdf &#8230;</p>
<p><em>Примечание: </em><br />
для учетной записи пользователя должны быть предоставлены необходимые права в SharePoint</p>
<h2>Сам алгоритм плагина будет выглядеть так: </h2>
<p>1. сначала я должен получить <strong>список всех url документов</strong>,<br />
2. после чего<strong> создаю заметку в MS CRM</strong><br />
3.<strong> считываю документ из SharePoint</strong> в буферный файл (в моем случае c:\\bufferFile)<br />
4.<strong> добавляю файл</strong> в аннотацию (note)<br />
5. повторяю шаги <strong>2-4</strong><br />
<span id="more-1110"></span><br />
Ниже я предоставлю код функции для плагина</p>
<pre class="brush: csharp;">
public static void CreateNote(Lookup regarding, string lookupfield, DynamicEntity entity, ICrmService crmService)
</pre>
<p>Параметры которой следующие: </p>
<p>Lookup <strong>regarding </strong>– связанная запись, к которой привязаны записи документов из SharePoint с полем new_self – это url к документу и new_name – название документа<br />
string <strong>lookupfield </strong>– поле по которому связана моя сущность с сущностью, содержащую карточки документов<br />
DynamicEntity <strong>entity </strong>– исходная сущность<br />
 ICrmService <strong>crmService </strong>– IcrmService <img src='http://ms-dynamics-crm.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<pre class="brush: csharp;">
//функция для создания примечания в листе согласования
        public static void CreateNote(Lookup regarding, string lookupfield, DynamicEntity entity, ICrmService crmService)
        {
            //вытягиваю все Карточки файлов, привязанных к данному договору
            ColumnSet cs = new ColumnSet();
            cs.Attributes.AddRange(new string[] { &quot;new_self&quot;, &quot;new_name&quot; });

            QueryByAttribute qba = new QueryByAttribute();
            qba.ColumnSet = cs;

            qba.EntityName = &quot;new_isorgdoc&quot;;
            qba.Attributes = new string[] { lookupfield };
            qba.Values = new object[] { regarding.Value };

            RetrieveMultipleRequest rmr = new RetrieveMultipleRequest();
            rmr.Query = qba;
            rmr.ReturnDynamicEntities = true;

            //получаю ответ
            RetrieveMultipleResponse rmresponse = (RetrieveMultipleResponse)crmService.Execute(rmr);
            //создаю новые заметки в листе согласованя и загружаю файлы из Карточки файлов
            foreach (DynamicEntity _file in rmresponse.BusinessEntityCollection.BusinessEntities)
            {
//получаю полный путь(url) к файлу
                string currentPath;
                Uri url = new Uri(_file[&quot;new_self&quot;].ToString());
                currentPath = url.ToString();
//получаю только имя файла, в формате имя_файла.расширение
                string FileName = currentPath.Substring(currentPath.LastIndexOf(&quot;/&quot;) + 1, (currentPath.Length - currentPath.LastIndexOf(&quot;/&quot;) - 1));

                // создаю заметку
                annotation note = new annotation();
                note.notetext = FileName; // тело заметки
                note.subject = FileName; //тема заметки 

                note.objectid = new Lookup();
                note.objectid.type = &quot;new_list_soglasovaniya&quot;;

                // привязываю ее к листу согласования
                note.objectid.Value = ((Key)entity.Properties[&quot;new_list_soglasovaniyaid&quot;]).Value;
                note.objecttypecode = new EntityNameReference();
                note.objecttypecode.Value = &quot;new_list_soglasovaniya&quot;;
//создаю заметку
                Guid createdNoteId = crmService.Create(note); 

//отправляю запрос на чтение файла по полученному url
                HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url.ToString());
                myReq.Timeout = 7000;
                try
                {
//авторизирую себя (пользователя)
                    myReq.Credentials = CredentialCache.DefaultCredentials;
                    HttpWebResponse MyResponse = (HttpWebResponse)myReq.GetResponse();
                    if (HttpStatusCode.OK == MyResponse.StatusCode)
                    {
                        // открываю поток
                        using (Stream MyResponseStream = MyResponse.GetResponseStream())
                        {
                            // открываю или создаю промежуточный файл
                            using (FileStream MyFileStream = new FileStream(&quot;c:\\bufferFile&quot;, FileMode.OpenOrCreate, FileAccess.Write))
                            {

                                byte[] MyBuffer = new byte[4096];
                                int BytesRead;
                                //записываю в промежуточный файл
                                while (0 &lt; (BytesRead = MyResponseStream.Read(MyBuffer, 0, MyBuffer.Length)))
                                {

                                    MyFileStream.Write(MyBuffer, 0, BytesRead);
                                }
                            }
                        }
                    }
                }
                catch (Exception err)
                {
                    throw new Exception(&quot;Error saving file from URL:&quot; + err.Message, err);
                }
                FileStream stream = File.OpenRead(&quot;c:\\bufferFile&quot;);
                byte[] byteData = new byte[stream.Length];
                stream.Read(byteData, 0, byteData.Length);
                stream.Close();

                string encodedData = System.Convert.ToBase64String(byteData);
                // подгружаю файл к аннотации
                annotation updateNote = new annotation();
                updateNote.annotationid = new Key();

                updateNote.annotationid.Value = createdNoteId;
                updateNote.documentbody = encodedData;
                updateNote.filename = FileName;
                //updateNote.mimetype = @&quot;application\ms-word&quot;;
                crmService.Update(updateNote);
            }
</pre>
<p>Пример вызова: </p>
<pre class="brush: csharp;">
CreateNote(regardingLookup, &quot;new_dogovor&quot;, entity, crmService);
</pre>
<p>Вот вроде бы и все. Решение не претендует на единственное, есть множество способов для его улучшения, просто представлен пример, показывающий возможность реализации такой задачи. Кстати, таким способом можно приаттачивать документы не только из <strong>SharePoint</strong>, но и других веб-ресурсов, а так же с локального сервера (localhost) все будет упираться в политику безопасности. Кстати, я не проверил, но возможно если расширение запрещено для загрузки в MS CRM, то загрузить файл не получится. Так что имейте это в виду.</p>
<p>Спасибо <a href="http://a33ik.blogspot.com/">Андрею Бутенко aka a33ik</a>, который постоянно меня направляет в нужное русло <img src='http://ms-dynamics-crm.com.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Кстати, он получил статус MVP по Microsoft Dynamics CRM, так что еще раз мои поздравления!</p>
<p>Полезные ссылки:</p>
<ul>
<li><a title="плагин для MS CRM 4.0" href="http://ms-dynamics-crm.com.ua/2009/03/10/plug-in-ms-crm-4/">Расширяем функциональность MS CRM 4.0 с помощью Plug-in</a></li>
<li><a title="Услуги по программированию plug-ins + SharePoint" href="http://ms-dynamics-crm.com.ua/services/" target="_blank">Услуги по программированию для Microsoft Dynamics CRM + SharePoint</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ms-dynamics-crm.com.ua/2010/01/12/upload-any-file-from-sharepoint-to-ms-crm-notes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Автонумерация. Еще разок</title>
		<link>http://ms-dynamics-crm.com.ua/2010/01/10/plugin-autonumber-2/</link>
		<comments>http://ms-dynamics-crm.com.ua/2010/01/10/plugin-autonumber-2/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 18:52:20 +0000</pubDate>
		<dc:creator>Костя Афендиков</dc:creator>
				<category><![CDATA[ms crm 4.0]]></category>
		<category><![CDATA[autonumber]]></category>
		<category><![CDATA[plug-in]]></category>

		<guid isPermaLink="false">http://ms-dynamics-crm.com.ua/?p=1100</guid>
		<description><![CDATA[Раньше уже рассматривал возможность создания автонумерации для кастомных сущностей в Microsoft Dynamics CRM 4.0 сегодня приложу просто еще один вариант автонумерации для одной сущности, реализуемой с помощью плагина.
Задача: необходимо реализовать автонумерацию сущности «Лист согласования», создаваемую из сущности «Договор» со следующем форматом: ГГММДД – ХХХ, где ГГММДД &#8211; Дата создания записи, а ХХХ – количество созданных [...]]]></description>
			<content:encoded><![CDATA[<p>Раньше уже рассматривал возможность <a title="автонумерация в MS CRM 4.0" href="http://ms-dynamics-crm.com.ua/tag/autonumber/">создания автонумерации для кастомных сущностей в Microsoft Dynamics CRM 4.0</a> сегодня приложу просто еще один вариант автонумерации для одной сущности, реализуемой с помощью плагина.</p>
<p><strong>Задача</strong>: необходимо реализовать автонумерацию сущности «Лист согласования», создаваемую из сущности «Договор» со следующем форматом: <strong>ГГММДД – ХХХ</strong>, где ГГММДД &#8211; Дата создания записи, а ХХХ – количество созданных листов согласования по этому договору + 1.</p>
<p><span id="more-1100"></span></p>
<h2>Основной код плагина автонумерации:</h2>
<pre class="brush: csharp;">

ICrmService crmService = context.CreateCrmService(true);

//Если лист согласования
if (entity.Name == &quot;new_list_soglasovaniya&quot;)
{

//Если договор Договор (создается из договора)

if (entity.Properties.Contains(&quot;new_regardingobjectid&quot;))

{

//получаю список листов согласования, по текущему договору

ColumnSet cs = new ColumnSet();

cs.Attributes.AddRange(new string[] { &quot;createdon&quot; });

ConditionExpression conditionId = new ConditionExpression();

conditionId.AttributeName = &quot;new_regardingobjectid&quot;;

conditionId.Operator = ConditionOperator.Equal;

conditionId.Values = new string[]{ ((Lookup)entity.Properties[&quot;new_regardingobjectid&quot;]).Value.ToString()};

FilterExpression filter = new FilterExpression();

filter.FilterOperator = LogicalOperator.And;

filter.Conditions.Add(conditionId);

QueryExpression query = new QueryExpression();

query.EntityName = &quot;new_list_soglasovaniya&quot;;

query.ColumnSet = cs;

query.Criteria = filter;

RetrieveMultipleRequest retrieve = new RetrieveMultipleRequest();

retrieve.Query = query;

retrieve.ReturnDynamicEntities = true;

RetrieveMultipleResponse retrieved = (RetrieveMultipleResponse)crmService.Execute(retrieve);

string countLists;

//номер текущей записи

countLists = (retrieved.BusinessEntityCollection.BusinessEntities.Count + 1).ToString();

//формирую вывод

while (countLists.Length &amp;lt; 3)

{

countLists = &quot;0&quot; + countLists;

}

string new_number;

new_number = DateTime.Now.Year.ToString().Substring(2, 2) + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + &quot;-&quot; + countLists.ToString();

//присваиваю полю new_number мой полученный номер

entity.Properties.Add(new StringProperty(&quot;new_number&quot;, new_number));

}
</pre>
<p><strong>Данные для регистрации плагина</strong></p>
<p>Register New Step:</p>
<ul>
<li>Message:	<strong>Create</strong></li>
<li>Primary Entity:	<strong>new_list_soglasovaniya</strong></li>
<li>Execution order:	<strong>1</strong></li>
<li>Eventing Pipeline Stage of Execution:	<strong>Pre</strong></li>
</ul>
<p>Полезные ссылки:<a title="плагин для MS CRM 4.0" href="http://ms-dynamics-crm.com.ua/2009/03/10/plug-in-ms-crm-4/"></a></p>
<ul>
<li><a title="плагин для MS CRM 4.0" href="http://ms-dynamics-crm.com.ua/2009/03/10/plug-in-ms-crm-4/">Расширяем функциональность MS CRM 4.0 с помощью Plug-in</a></li>
<li><a title="автонумерация в MS CRM 4.0" href="http://ms-dynamics-crm.com.ua/2009/08/12/autonumber-for-ms-crm-4-plug-in/">Автонумератор для Microsoft Dynamics CRM 4.0. Plug-in</a></li>
<li><a title="Услуги по программированию plug-ins" href="http://ms-dynamics-crm.com.ua/services/" target="_blank">Услуги по программированию для Microsoft Dynamics CRM</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://ms-dynamics-crm.com.ua/2010/01/10/plugin-autonumber-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Автонумератор для Microsoft Dynamics CRM 4.0. Plug-in</title>
		<link>http://ms-dynamics-crm.com.ua/2009/08/12/autonumber-for-ms-crm-4-plug-in/</link>
		<comments>http://ms-dynamics-crm.com.ua/2009/08/12/autonumber-for-ms-crm-4-plug-in/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 10:51:38 +0000</pubDate>
		<dc:creator>Костя Афендиков</dc:creator>
				<category><![CDATA[ms crm 4.0]]></category>
		<category><![CDATA[autonumber]]></category>
		<category><![CDATA[javascript in ms crm]]></category>
		<category><![CDATA[ms crm add-ons]]></category>
		<category><![CDATA[plug-in]]></category>

		<guid isPermaLink="false">http://ms-dynamics-crm.com.ua/?p=1029</guid>
		<description><![CDATA[В одном из постов я описывал как создать Автонумератор для Microsoft Dynamics CRM 4.0 с помощью механизма Workflow . Этот пример был больше ознакомительным с механизмом Workflow и использовать его на практике вызовет ряд неудобств. Сегодня я опишу как создать автонумерацию для любой сущности с помощью плагина. За основу был взят вариант http://www.codeplex.com/crmnumbering/ и немного [...]]]></description>
			<content:encoded><![CDATA[<p>В одном из постов я описывал как создать <a href="http://ms-dynamics-crm.com.ua/2009/07/10/autonumber-for-ms-crm-4-workflow/">Автонумератор для Microsoft Dynamics CRM 4.0 с помощью механизма Workflow </a>. Этот пример был больше ознакомительным с механизмом Workflow и использовать его на практике вызовет ряд неудобств. Сегодня я опишу как создать автонумерацию для любой сущности с помощью плагина. За основу был взят вариант http://www.codeplex.com/crmnumbering/ и немного модернизированный &laquo;под себя&raquo; с реализованной возможностью задавать префикс для генерируемого номера и более гибкой возможность настройки <img src='http://ms-dynamics-crm.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<span id="more-1029"></span></p>
<ol>
<li>Скачайте необходимые файлы: <a href="http://ms-dynamics-crm.com.ua/download/customizations-autonumber.zip">кастомизацию сущности</a> и <a href="http://ms-dynamics-crm.com.ua/download/AKAutoNumber.zip">сам плагин</a></li>
<li>Импортируем файл кастомизации. У вас создаться новая сущность <strong>Автонумератор (do_universalnumber)</strong></li>
<li>Опубликуем данную сущность</li>
<li>Создаем новую запись нашего Автонумератора.
<ol> <img class="alignnone size-full wp-image-1033" title="create autonumber" src="http://ms-dynamics-crm.com.ua/wp-content/uploads/2009/08/createautonumber1.png" alt="create autonumber" width="520" height="314" /></ol>
</li>
<p><strong>Пример:</strong> В поле Сущность выбираю &laquo;Контакт&raquo; -&gt; Жмем &laquo;Сохранить&raquo; -&gt; в поле &laquo;Атрибут&raquo; выбираю firstname -&gt; Указываю необходимый префикс и в поле &laquo;Счетчик&raquo; указываю начальное значение счетчика. -&gt; &laquo;Сохранить и закрыть&raquo;<br />
<strong>Примечание: </strong>т.к. в поле &laquo;Атрибут&raquo; необходимо выбирать только атрибуты типа <strong>nvarchar</strong></p>
<li>Регистрирую плагин <strong>AKAutoNumber.dll</strong><br />
<strong>Message</strong>: Create<br />
<strong>Primary Entity:</strong> contact<br />
<strong>Stage</strong>: Pre</p>
<p><img class="alignnone size-full wp-image-1034" title="plugin-register" src="http://ms-dynamics-crm.com.ua/wp-content/uploads/2009/08/plugin-register.png" alt="plugin-register" width="520" height="282" /></li>
<li> Тестируем.<br />
<img class="alignnone size-full wp-image-1038" title="result" src="http://ms-dynamics-crm.com.ua/wp-content/uploads/2009/08/result.png" alt="result" width="520" height="314" /></li>
</ol>
<p>Для того, чтобы создать автонумератор для другой сущности повторяем шаги <strong>4-5</strong></p>
<p><a href="http://ms-dynamics-crm.com.ua/download/customizations-autonumber.zip ">Вы можете скачать кастомизацию сущности</a> и <a href="http://ms-dynamics-crm.com.ua/download/AKAutoNumber.zip">сам плагин</a>. Улучшение кода приветствуется, сообщайте в комментариях <img src='http://ms-dynamics-crm.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><em>Использовались: </em></p>
<p>http://www.codeplex.com/crmnumbering/ &#8211; основа плагина</p>
<p>http://a33ik.blogspot.com/ &#8211; примеры для создания динамического пиклиста сущностей</p>
<p><strong><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://ms-dynamics-crm.com.ua/2009/08/12/autonumber-for-ms-crm-4-plug-in/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Отладка plug-ins для Microsoft Dynamics CRM 4.0</title>
		<link>http://ms-dynamics-crm.com.ua/2009/07/28/debug-plug-ins-for-microsoft-dynamics-crm-40/</link>
		<comments>http://ms-dynamics-crm.com.ua/2009/07/28/debug-plug-ins-for-microsoft-dynamics-crm-40/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 16:09:00 +0000</pubDate>
		<dc:creator>Костя Афендиков</dc:creator>
				<category><![CDATA[ms crm 4.0]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[plug-in]]></category>

		<guid isPermaLink="false">http://ms-dynamics-crm.com.ua/?p=973</guid>
		<description><![CDATA[В этом посте я опишу способ отладки плагинов для Microsoft Dynamics CRM 4.0. Студия находится на том же сервере, что и сам сервер MS CRM.

Порядок действий для отладки plug-in
1. Нам необходим plug-in для MS CRM.  
2. Выбираем свойства проекта. Properties
3. Вкладка Build – раздел Output path – необходимо выбрать папку assembly у MS CRM. [...]]]></description>
			<content:encoded><![CDATA[<p>В этом посте я опишу способ отладки плагинов для Microsoft Dynamics CRM 4.0. Студия находится на том же сервере, что и сам сервер MS CRM.<br />
<span id="more-973"></span></p>
<h3>Порядок действий для отладки plug-in</h3>
<p>1. Нам необходим <a title="плагин для MS CRM" href="http://ms-dynamics-crm.com.ua/2009/03/10/plug-in-ms-crm-4/">plug-in для MS CRM</a>. <img src='http://ms-dynamics-crm.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>2. Выбираем свойства проекта. <strong>Properties</strong></p>
<p>3. Вкладка <strong>Build </strong>– раздел <strong>Output path</strong> – необходимо выбрать папку <strong>assembly </strong>у MS CRM. В моем случае это &#8211; <em>C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembly\</em><br />
Сюда будет помещаться <strong>dll </strong>плагина, а так же файл для отладки . <strong>pdb</strong></p>
<p><strong>UPD: </strong>Т.к. для отладки необходим только <strong>.pdb </strong>файл, то этот шаг можно заменить, написав сценарий в Build Events в раздел Post-build event command line вида:<br />
<strong> COPY “$(TargetDir)\*.pdb” “C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembly” /Y</strong></p>
<p>(спасибо Сергею за комментарий)</p>
<p>4. Вкладка <strong>Build Events</strong> в <em>Pre-build event command line</em> указываем:<strong> iisreset /stop</strong>, в <em>Post-build</em> -<strong> iisreset /start</strong>. Теперь, перед компиляцией и генерацией dll плагина (build) будет останавливаться IIS-server, потом создаваться dll и pdb файлы, которые помещаются в папку, указанную в <strong>п.3</strong>, а затем запускаем IIS-server</p>
<div id="attachment_975" class="wp-caption alignnone" style="width: 528px"><img class="size-full wp-image-975" title="debug-plugins" src="http://ms-dynamics-crm.com.ua/wp-content/uploads/2009/07/debug-plugins.png" alt="debug-plugins" width="518" height="341" /><p class="wp-caption-text">debug-plugins</p></div>
<p>5. Делаем <strong>Build </strong>нашего проекта.</p>
<p>6. Запускаем <strong>PluginRegistration tool </strong>и регистрируем наш плагин. <strong>Выбираем dll</strong> из папки п3. (Program Files\Microsoft Dynamics CRM\Server\bin\assembly\)</p>
<p>7. Повторяем ситуацию, на которой должен сработать плагин.<br />
<em>Например</em>: я зарегистрировал плагин на свою сущность, событие &#8211; Create, стадия – Pre. Чтобы повторить ситуацию мне достаточно создать записей своей сущности, заполнить необходимые поля и нажать «Сохранить». Аналогично и для других событий</p>
<p>8. Установите <strong>Breakpoint</strong> там, где это вам необходимо.</p>
<p>9. Итак, ошибку получили, осталось «прицепиться» к IIS, чтобы иметь возможность заняться дебагом.<br />
Для этого: <strong>Debug </strong>– <strong>Attach to Process…</strong> &#8211; выбираем процесс <strong>w3wp.exe</strong> и жмем <strong>Attach</strong>.<br />
<em>Примечание</em>: 1) процессов может быть несколько, цепляемся ко всем 2) если не находите этот процесс, то убедитесь, что выбрана опция «<em>Show processes from all users</em>».</p>
<div id="attachment_976" class="wp-caption alignnone" style="width: 510px"><img class="size-full wp-image-976" title="debug-plugins-2" src="http://ms-dynamics-crm.com.ua/wp-content/uploads/2009/07/debug-plugins-2.png" alt="debug-plugins" width="500" height="238" /><p class="wp-caption-text">debug-plugins</p></div>
<p>10. Повторяем <strong>п. 7 </strong>и занимаемся отладкой плагина в Visual Studio</p>
<div id="attachment_977" class="wp-caption alignnone" style="width: 566px"><img class="size-full wp-image-977" title="debug-plugins-3" src="http://ms-dynamics-crm.com.ua/wp-content/uploads/2009/07/debug-plugins-3.png" alt="debug-plugins" width="556" height="421" /><p class="wp-caption-text">debug-plugins</p></div>
<p>Спасибо <a href="http://ms-crm.com.ua/">Савран Роману</a> за помощь <img src='http://ms-dynamics-crm.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>А как отладку делаете Вы? Поделитесь в комментариях.</p>
<p><a href="http://twitter.com/xrminua">Follow us in Twitter</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ms-dynamics-crm.com.ua/2009/07/28/debug-plug-ins-for-microsoft-dynamics-crm-40/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Пример обновления Dynamic Entity в плагине для MS CRM 4.0</title>
		<link>http://ms-dynamics-crm.com.ua/2009/03/12/update-dynamic-entity-in-plugin-ms-crm-40/</link>
		<comments>http://ms-dynamics-crm.com.ua/2009/03/12/update-dynamic-entity-in-plugin-ms-crm-40/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 20:02:31 +0000</pubDate>
		<dc:creator>Костя Афендиков</dc:creator>
				<category><![CDATA[ms crm 4.0]]></category>
		<category><![CDATA[plug-in]]></category>

		<guid isPermaLink="false">http://ms-dynamics-crm.com.ua/?p=524</guid>
		<description><![CDATA[Пример для создания сущностей в плагине для MS CRM 4.0 уже есть, сейчас приведу общий алгоритм для обновления dynamic entity.

Обновление dynamic entity
public void UpdateEntity(ICrmService service)
{
//инициализация переменных
//будем получать сущность для обновления
DynamicEntity entity = new DynamicEntity();
//используем для обновления сущности
TargetUpdateDynamic targetUpdate = new TargetUpdateDynamic();
//запрос на обновление сущности
UpdateRequest updateRequest = new UpdateRequest();
entity.Name = &#60;entity name&#62;
//обновляем необходимые поля
entity.Properties.Add(&#60;свойство1&#62;);
entity.Properties.Add(&#60;свойство2&#62;);
entity.Properties.Add(&#60;свойство3&#62;);
//устанавливаем запрос на [...]]]></description>
			<content:encoded><![CDATA[<p>Пример для <a title="создание dynamic entity для ms crm 4.0" href="http://ms-dynamics-crm.com.ua/2009/03/12/create-dynamic-entity-in-plugin-ms-crm-4/ ">создания сущностей в плагине</a> для <strong>MS CRM 4.0</strong> уже есть, сейчас приведу общий алгоритм для обновления <strong>dynamic entity</strong>.</p>
<p><span id="more-524"></span></p>
<h3>Обновление dynamic entity</h3>
<blockquote><p>public void UpdateEntity(ICrmService service)<br />
{<br />
<strong>//инициализация переменных<br />
//будем получать сущность для обновления</strong><br />
DynamicEntity entity = new DynamicEntity();</p>
<p><strong>//используем для обновления сущности</strong><br />
TargetUpdateDynamic targetUpdate = new TargetUpdateDynamic();</p>
<p><strong>//запрос на обновление сущности</strong><br />
UpdateRequest updateRequest = new UpdateRequest();</p>
<p>entity.Name = &lt;entity name&gt;</p>
<p><strong>//обновляем необходимые поля</strong><br />
entity.Properties.Add(&lt;свойство1&gt;);<br />
entity.Properties.Add(&lt;свойство2&gt;);<br />
entity.Properties.Add(&lt;свойство3&gt;);</p>
<p><strong>//устанавливаем запрос на обновление</strong><br />
targetUpdate.Entity = entity;<br />
updateRequest.Target = targetUpdate;</p>
<p><strong>//выполняем запрос на обновление</strong><br />
service.Execute(updateRequest);<br />
}</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://ms-dynamics-crm.com.ua/2009/03/12/update-dynamic-entity-in-plugin-ms-crm-40/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создаем Dynamic Entity в плагине для MS CRM 4.0</title>
		<link>http://ms-dynamics-crm.com.ua/2009/03/12/create-dynamic-entity-in-plugin-ms-crm-4/</link>
		<comments>http://ms-dynamics-crm.com.ua/2009/03/12/create-dynamic-entity-in-plugin-ms-crm-4/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 23:38:09 +0000</pubDate>
		<dc:creator>Костя Афендиков</dc:creator>
				<category><![CDATA[ms crm 4.0]]></category>
		<category><![CDATA[plug-in]]></category>

		<guid isPermaLink="false">http://ms-dynamics-crm.com.ua/?p=519</guid>
		<description><![CDATA[В прошлый раз я привел пример простого плагина для MS CRM 4.0 сейчас приведу алгоритм для создания сущностей в MS CRM. Один из способов это использовать веб-службу CRM для того, чтобы создавать бизнес сущность (т.н. business entity), но делая так вы будете ограничены только стандартными сущностями с их стандартными атрибутами. Для того, чтобы получить больше [...]]]></description>
			<content:encoded><![CDATA[<p>В прошлый раз я привел пример простого <a title="плагин для ms crm 4.0" href="http://ms-dynamics-crm.com.ua/2009/03/10/plug-in-ms-crm-4/">плагина для MS CRM 4.0</a> сейчас приведу алгоритм для создания сущностей в <strong>MS CRM</strong>. Один из способов это использовать веб-службу CRM для того, чтобы создавать бизнес сущность (т.н. <strong>business entity</strong>), но делая так вы будете ограничены только стандартными сущностями с их стандартными атрибутами. Для того, чтобы получить больше «динамики» необходимо использовать другие методы.</p>
<p><span id="more-519"></span></p>
<p>Необходимо помнить, что для того чтобы создавать запись у вас должны быть соответствующие права.</p>
<h3>Пример кода для создания записи сущности используя динамические сущности CRM (dynamic entities)</h3>
<blockquote><p>public void CreateEntity(ICrmService service)<br />
{<br />
<strong>//объявляем переменные</strong></p>
<p><strong>//будем получать сущность для обновления</strong><br />
DynamicEntity entity = new DynamicEntity();</p>
<p><strong>//используется для обновления сущности</strong><br />
TargetCreateDynamic targetCreate = new TargetCreateDynamic();</p>
<p><strong>//запрос на создание сущности</strong><br />
CreateRequest createRequest = new CreateRequest();</p>
<p>entity.Name = &lt;entity name&gt;</p>
<p><strong>//добавляем значения для атрибутов</strong><br />
entity.Properties.Add(&lt;property&gt;);<br />
entity.Properties.Add(&lt;property&gt;);</p>
<p><strong>//устанавливаем запрос на создание сущности</strong><br />
targetCreate.Entity = entity;<br />
createRequest.Target = targetCreate;</p>
<p><strong>//выполняем запрос</strong><br />
service.Execute(createRequest);<br />
}</p></blockquote>
<p>Продолжаем изучать плагины для Microsoft Dynamics CRM дальше <img src='http://ms-dynamics-crm.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Так же посмотрите <a title="обновление dynamic entity ms crm 4.0" href="http://ms-dynamics-crm.com.ua/2009/03/12/update-dynamic-entity-in-plugin-ms-crm-40/">пример обновления Dynamic Entity в плагине для MS CRM 4.0</a></p>
]]></content:encoded>
			<wfw:commentRss>http://ms-dynamics-crm.com.ua/2009/03/12/create-dynamic-entity-in-plugin-ms-crm-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Расширяем функциональность MS CRM 4.0 с помощью Plug-in</title>
		<link>http://ms-dynamics-crm.com.ua/2009/03/10/plug-in-ms-crm-4/</link>
		<comments>http://ms-dynamics-crm.com.ua/2009/03/10/plug-in-ms-crm-4/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 14:27:50 +0000</pubDate>
		<dc:creator>Костя Афендиков</dc:creator>
				<category><![CDATA[ms crm 4.0]]></category>
		<category><![CDATA[plug-in]]></category>

		<guid isPermaLink="false">http://ms-dynamics-crm.com.ua/?p=499</guid>
		<description><![CDATA[В Microsoft Dynamics CRM 3.0 для расширения базовой бизнес-логики использовались callout (колауты), представляющие собой dll-сборки, которые можно было подключать на определенные сущности и события, предварительно запрограммировав необходимый функционал.
В Microsoft Dynamics CRM 4.0 callout переименовали в plug-in (плагин) и добавили дополнительные возможности. Более подробно сейчас не будем останавливать на перечислении всех возможностей plug-in, а рассмотрим простой [...]]]></description>
			<content:encoded><![CDATA[<p>В <strong>Microsoft Dynamics CRM 3.0</strong> для расширения базовой бизнес-логики использовались <strong>callout </strong>(колауты), представляющие собой dll-сборки, которые можно было подключать на определенные сущности и события, предварительно запрограммировав необходимый функционал.</p>
<p>В <strong>Microsoft Dynamics CRM 4.0 </strong>callout переименовали в <strong>plug-in</strong> (плагин) и добавили дополнительные возможности. Более подробно сейчас не будем останавливать на перечислении всех возможностей <strong>plug-in</strong>, а рассмотрим простой пример.</p>
<p>Я приведу пример обновления поля <strong><em>new_companyname</em></strong> в <strong>task </strong>при выборе определенной записи из поля «В отношении» (<strong><em>regardingobjectid</em></strong>). Например, если выбран контакт и он относится к организации, то получаем имя родительской организации (account)</p>
<p><span id="more-499"></span><br />
<em>Примечание:</em> пример плагина есть в <strong>SDK</strong>, он создает объект сущности Task (Задачу) после создания нового объекта сущности Account (Организация).</p>
<h3>Подготовка рабочего окружения</h3>
<ol>
<li>Установить <strong>MS Visual Studio 2008</strong> (можно и 2005)</li>
<li>Обязательно<a title="MS CRM SDK 4.0.8" rel="nofollow" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=82E632A7-FAF9-41E0-8EC1-A2662AAE9DFB&amp;displaylang=en" target="_blank"> скачать SDK</a> для MS CRM 4.0</li>
<li>скачаем <a title="ms crm plugin template" rel="nofollow" href="http://code.msdn.microsoft.com/crmplugintemplate" target="_blank"><strong>шаблон проекта для плагина</strong></a>.</li>
<li>качаем <a title="Plugin Registration tool" rel="nofollow" href="http://code.msdn.microsoft.com/crmplugin" target="_blank"><strong>PluginRegistration tool</strong></a> &#8211; этот инструмент поможет нам легко зарегистрировать плагин</li>
</ol>
<p>Visual Studio установили, теперь кидаем скачанный архив <strong>MSCRM Plug-in.zip</strong> по пути (у меня так)</p>
<blockquote><p>C:\Documents and Settings\&lt;Имя пользователя&gt;\Мои документы\Visual Studio 2008\Templates\ProjectTemplates\Visual C#</p></blockquote>
<p>(теперь, по умолчанию в проект будут подключены необходимые библиотеки, но очень рекомендую для начала изучить <strong>SDK</strong>)</p>
<p>При создании нового проекта на C# у нас появилась возможность выбрать наш шаблон</p>
<div id="attachment_501" class="wp-caption alignnone" style="width: 694px"><img class="size-full wp-image-501" title="MS CRM Plug-in шаблон" src="http://ms-dynamics-crm.com.ua/wp-content/uploads/2009/03/1.jpg" alt="MS CRM Plug-in шаблон" width="684" height="464" /><p class="wp-caption-text">MS CRM Plug-in шаблон</p></div>
<p>- Сразу подпишем нашу сборку: Правой кнопкой в студии на проекте &#8211; Properties &#8211; Signing &#8211; Sign the assembly &#8211; Choose a strong name key file &#8211; new &#8211; указываете имя файла, галочку Protect my key file with a password &#8211; снимаете, Сохраняете.</p>
<p>Подключим <strong>Microsoft.Crm.Sdk.Query;</strong></p>
<blockquote><p>using Microsoft.Crm.Sdk.Query;</p></blockquote>
<p>В <strong>плагинах</strong>, в отличие от колаутов, используется один основной метод <strong>Execute</strong>. Мой метод для этого примера выглядит так:</p>
<blockquote><p>public void Execute(IPluginExecutionContext context)<br />
{<br />
DynamicEntity entity = null;</p>
<p>if (context.InputParameters.Properties.Contains(ParameterName.Target) &amp;&amp;<br />
context.InputParameters.Properties[ParameterName.Target] is DynamicEntity)<br />
{</p>
<p>entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target];</p>
<p>if (context.MessageName != MessageName.Update.ToString()<br />
&amp;&amp; context.MessageName != MessageName.Create.ToString())<br />
{<br />
throw new InvalidPluginExecutionException(&laquo;Smth wrong with Update stage may be&raquo;);<br />
}</p>
<p>}<br />
else<br />
{<br />
return;<br />
}</p>
<p>try<br />
{</p>
<p>ICrmService crmService = context.CreateCrmService(false);<br />
if(entity.Properties.Contains(&laquo;regardingobjectid&raquo;))<br />
{<br />
String new_companyname = &laquo;&raquo;;<br />
ColumnSet cs = new ColumnSet();<br />
Lookup regarding = (Lookup)entity.Properties["regardingobjectid"];<br />
<strong> // проверяю что за объект передаю в лукапе: организация/контакт/возможная сделка/интерес</strong></p>
<p><strong> // проверяю, что в лукапе выбрана Организация</strong><br />
if (regarding.type == EntityName.account.ToString())<br />
{<br />
cs.Attributes.Add(&laquo;name&raquo;);<br />
account _account = (account)crmService.Retrieve(EntityName.account.ToString(), regarding.Value, cs);<br />
if (_account == null || _account.name == null)<br />
{<br />
return;<br />
}</p>
<p>else<br />
{<br />
new_companyname = _account.name.ToString();<br />
}<br />
}</p>
<p><strong> // проверяю, что в лукапе выбран Контакт</strong><br />
if (regarding.type == EntityName.contact.ToString())<br />
{<br />
cs.Attributes.Add(&laquo;parentcustomerid&raquo;);<br />
contact _contact = (contact)crmService.Retrieve(EntityName.contact.ToString(), regarding.Value, cs);</p>
<p>if (_contact == null ||<br />
_contact.parentcustomerid == null ||<br />
(_contact.parentcustomerid.IsNull &amp;&amp;<br />
_contact.parentcustomerid.IsNullSpecified) ||<br />
_contact.parentcustomerid.type != EntityName.account.ToString())<br />
{<br />
return;<br />
}<br />
else<br />
{<br />
new_companyname = _contact.parentcustomerid.name.ToString();<br />
}<br />
}</p>
<p><strong> // проверяю, что в лукапе выбрана Возможная сделка</strong><br />
if (regarding.type == EntityName.opportunity.ToString())<br />
{<br />
cs.Attributes.Add(&laquo;customerid&raquo;);<br />
opportunity _opportunity = (opportunity)crmService.Retrieve(EntityName.opportunity.ToString(),regarding.Value, cs);<br />
if (_opportunity == null ||<br />
_opportunity.customerid == null)<br />
{<br />
return;<br />
}<br />
else<br />
{<br />
new_companyname = _opportunity.customerid.name.ToString();<br />
}<br />
}<br />
<strong> // проверяю, что в лукапе выбран Интерес</strong><br />
if (regarding.type == EntityName.lead.ToString())<br />
{<br />
cs.Attributes.Add(&laquo;companyname&raquo;);<br />
lead _lead = (lead)crmService.Retrieve(EntityName.lead.ToString(), regarding.Value, cs);<br />
if (_lead == null ||<br />
_lead.companyname == null)<br />
{<br />
return;<br />
}<br />
else<br />
{<br />
new_companyname = _lead.companyname;<br />
}<br />
}</p>
<p><strong>// обновляем наше поле <img src='http://ms-dynamics-crm.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </strong><br />
entity.Properties.Add(new StringProperty(&laquo;new_companyname&raquo;, new_companyname));<br />
}<br />
}</p></blockquote>
<p>Компилируем плагин и переходим к регистрации плагина.</p>
<h3>Регистрация плагина с помощью PluginRegistration tool</h3>
<p>Для регистрации используем ранее скачанный <strong>PluginRegistration tool</strong>, указываем параметры для соединения с CRM-сервером и регистрируем нашу сборку:</p>
<ol>
<li>Register -&gt; Register New Assembly  (Ctrl + A)</li>
<li>Указываем AKPuginActivity.dll (<em>C:\Documents and Settings\Администратор\Мои документы\Visual Studio 2008\Projects\AKPuginActivity\AKPuginActivity\bin\Debug</em>) и оставляем выбор сохранения в базе данных.</li>
<li>Выбираем нашу сборку и регистрируем новый <strong>Step</strong></li>
<li>Register -&gt; Register New Step (Ctrl+T)</li>
<li><em>Message</em>: <strong>Create</strong>; <em>Primary Entity</em>: <strong>task</strong>; <em>Stage of Execution</em>: <strong>Pre Stage</strong></li>
</ol>
<div id="attachment_503" class="wp-caption alignnone" style="width: 844px"><img class="size-full wp-image-503" title="Регистрируем новый Step для плагина" src="http://ms-dynamics-crm.com.ua/wp-content/uploads/2009/03/3.jpg" alt="Регистрируем новый Step для плагина" width="834" height="451" /><p class="wp-caption-text">Регистрируем новый Step для плагина</p></div>
<p>Повторяем шаги <strong>4</strong> и <strong>5</strong>, только для события <strong>Update </strong>(Message: Update)</p>
<h3>Проверяем работу</h3>
<p>Создаем новую задачу и в поле &laquo;В отношении&raquo; выбираем контакт, у которого есть родительская организация. Сохраняем и в поле <strong>new_companyname</strong> появится название организации. Проверяем обновление выбрав другую запись.</p>
<p><em><strong>Примечание:</strong></em></p>
<p>Поле <strong>new_companyname</strong> у меня присутствует не только в сущности <strong>task</strong>, но и <strong>letter</strong>, <strong>phonecall</strong>, <strong>appointment </strong>в каждой из этих стандартных сущностей присутствует поле &laquo;В отношении&raquo; <strong>regardingobjectid </strong>поэтому достаточно зарегистрировать еще несколько step для каждой из сущностей и код будет отрабатывать корректно <img src='http://ms-dynamics-crm.com.ua/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Отдельное спасибо <a rel="nofollow" href="http://a33ik.blogspot.com/" target="_blank">Андрею Бутенко</a> за отзывчивость <img src='http://ms-dynamics-crm.com.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Ознакомьтесь со статьей &laquo;<a title="Отладка plug-ins для Microsoft Dynamics CRM 4.0" href="http://ms-dynamics-crm.com.ua/2009/07/28/debug-plug-ins-for-microsoft-dynamics-crm-40/">Отладка plug-ins для Microsoft Dynamics CRM 4.0</a>&raquo; для эффективной отладки ваших плагинов.</p>
]]></content:encoded>
			<wfw:commentRss>http://ms-dynamics-crm.com.ua/2009/03/10/plug-in-ms-crm-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
