<?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; sharepoint</title>
	<atom:link href="http://ms-dynamics-crm.com.ua/tag/sharepoint/feed/" rel="self" type="application/rss+xml" />
	<link>http://ms-dynamics-crm.com.ua</link>
	<description>Все о Microsoft Dynamics CRM</description>
	<lastBuildDate>Mon, 21 May 2012 14:44:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<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; title: ; notranslate">
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; title: ; notranslate">
//функция для создания примечания в листе согласования
        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; title: ; notranslate">
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>
	</channel>
</rss>

