08.02.2009Вставка в шаблон Word значений из MS CRM
В этом посте я опишу свое первое задание, с которого и началось мое знакомство с CRM .
Задание заключалось в следующем: есть определенный договор (например договор купли-продажи чего-то) в формате . doc . В определенные места этого договора нужно вставить данные из определенного объекта сущности (ну и из связанных с данным объектом других объектов).
Вот сейчас на тестовом примере и расскажу как я это реализовала.
Сейчас я создала тестовую сущность new _ dogovor . В нее добавила такие поля:
Название договора – new _ dogovor . new _ name
№ договора – new _ dogovor . new _ number
Организация – new_dogovor.new_accountid (lookup к сущности Account)
Контакт – new_dogovor.new_contactid (lookup к сущности Contact)
На форму новой сущности new _ dogovor добавила кнопку :
Фрагмент из файла isv . config . xml :
<Entity name=»new_dogovor»>
<ToolBar ValidForCreate=»0″ ValidForUpdate=»1″>
<Button Title=»To Word» ToolTip=»Open Word» Icon=»/_imgs/ico_18_debug.gif» JavaScript=»window.toword();» />
</ToolBar>
</Entity>
При нажатии на эту кнопку происходит вызов функции window . toword (); При этом сама функция определена в событии OnLoad сущности new _ dogovor .Также я использовала функцию Retrieve (….), которая получает любое поле указанного объекта сущности, не буду ее описывать, так как это уже сделано вот тут.
Код из события OnLoad сущности new_dogovor:
function Retrieve(sEntity, sGuid, sAttribute)
{
var sXml = «<?xml version=\»1.0\» encoding=\»utf-8\»?>»;
sXml += «<soap:Envelope xmlns:soap=\»http://schemas.xmlsoap.org/soap/envelope/\» xmlns:xsi=\»http://www.w3.org/2001/XMLSchema-instance\» xmlns:xsd=\»http://www.w3.org/2001/XMLSchema\»>»;
sXml += «<soap:Body>»;
//sXml += «<entityName xmlns=\»http://schemas.microsoft.com/crm/2006/WebServices\»>»+mEntity.get(«Name»)+»</entityName>»;
sXml += «<entityName xmlns=\»http://schemas.microsoft.com/crm/2006/WebServices\»>»+sEntity+»</entityName>»;sXml += «<id xmlns=\»http://schemas.microsoft.com/crm/2006/WebServices\»>»+sGuid+»</id>»;
sXml += «<columnSet xmlns:q1=\»http://schemas.microsoft.com/crm/2006/Query\» xsi:type=\»q1:ColumnSet\» xmlns=\»http://schemas.microsoft.com/crm/2006/WebServices\»>»;
sXml += «<q1:Attributes>»;sXml += «<q1:Attribute>»+sAttribute+»</q1:Attribute>»;
sXml += «</q1:Attributes>»;
sXml += «</columnSet>»;
sXml += «</soap:Body>»;
sXml += «</soap:Envelope>»;var oXmlHttp = new ActiveXObject(«Msxml2.XMLHTTP»);
oXmlHttp.Open(«POST», «/MsCrmServices/2006/CrmService.asmx», false);
oXmlHttp.setRequestHeader(«SOAPAction», «http://schemas.microsoft.com/crm/2006/WebServices/Retrieve»);
oXmlHttp.setRequestHeader(«Content-Type», «text/xml; charset=utf-8″);
oXmlHttp.setRequestHeader(«Content-Length», sXml.length);
oXmlHttp.send(sXml);
var doc = oXmlHttp.responseXML;
var retValue = «»;
retValue = oXmlHttp.responseXML.selectSingleNode(«//RetrieveResult/»+sAttribute).text;
return retValue;
}window.toword=function()
{
var oWord = new ActiveXObject(«Word.Application»);
var oDoc;
oWord.Visible = 1;
oDoc = oWord.Documents.Add(«http://localhost:5555/dogovor.doc»); //путь,где лежит документ
oDoc.Bookmarks.Item(«number»).Range.Text =crmForm.all.new_number.DataValue;//закладка
oDoc.Bookmarks.Item(«account»).Range.Text =crmForm.all.new_accountid.DataValue[0].name;
oDoc.Bookmarks.Item(«contact»).Range.Text =crmForm.all.new_contactid.DataValue[0].name;
oDoc.Bookmarks.Item(«tel»).Range.Text =Retrieve(‘contact’,crmForm.all.new_contactid.DataValue[0].id,’telephone1′);
oDoc.Bookmarks.Item(«adr»).Range.Text =Retrieve(‘account’,crmForm.all.new_accountid.DataValue[0].id,’address2_country’);
}
С помощью Retrieve через лукапы получены поле Рабочий телефон сущности Контакт и поле Страна сущности Организация.
Нужно создать документ-шаблон Word. У меня он называется dogovor.doc и лежит по пути установки CRM в папке CRMWeb. В этом документе следует расставить закладки. Я их назвала number,contact,account,tel,adr. Вот пример как это сделать:
Нужно заметить, что придется понизить уровень безопасности в IE . Связано это с тем, что word – это по сути объект ActiveX , и IE очень нервно реагирует. Но даже после понижения уровня безопасности IE реагирует на попытку открыть Word вот таким сообщением:
Пока с этим ничего не поделать, так что пусть будет (жмем Yes).
Итак, теперь результат. В моем примере, при нажатии на кнопку «To Word» открывается документ dogovor.doc и по закладкам проставляются данные, которые берутся из объекта сущности и из связанных с ним объектов.
Хочу добавить, что нужно обязательно юзать блоки try catch, так как поля могут быть не заполнены.
Данный способ глуповат и неудобен, но тем не менее первое придуманное решение было именно таким. Можно иначе, но это я опишу как-нибудь в следующий раз
Возможно, сумбурно и не все расписано, но я же все же впервые описываю это так.
Проверено с Word 2003/2007, MS CRM 3.0 (в MS CRM 4.0 не тестировала, но проблем быть не должно).




