Копирование записей с помощью openEntityForm
В 8 ролапе нас посетила новая JS-функция:
Xrm.Utility.openEntityForm(name,id,parameters)
Рассмотрим, как с ее помощи создать дубликат текущей записи (на примере Организации)…
- Создайте JS Веб-ресурс duplicate.js с таким кодом:
function Duplicate() { a = Xrm.Page.data.entity.attributes; var parameters = {}; // Помещаем в массив parameters значения полей с текущей формы if (a.get("firstname").getValue() != null) { parameters["firstname"] = a.get("firstname").getValue(); } if (a.get("lastname").getValue() != null) { parameters["lastname"] = a.get("lastname").getValue() + " - COPY"; } if (a.get("defaultpricelevelid").getValue() != null) { parameters["defaultpricelevelid"] = a.get("defaultpricelevelid").getValue()[0].id; parameters["defaultpricelevelidname"] = a.get("defaultpricelevelid").getValue()[0].name; } if (a.get("parentcustomerid").getValue() != null) { parameters["parentcustomerid"] = a.get("parentcustomerid").getValue()[0].id; parameters["parentcustomeridname"] = a.get("parentcustomerid").getValue()[0].name; parameters["parentcustomeridtype"] = a.get("parentcustomerid").getValue()[0].entityType; } if (a.get("address1_addresstypecode").getValue() != null) { parameters["address1_addresstypecode"] = a.get("address1_addresstypecode").getValue(); } if (a.get("defaultpricelevelid").getValue() != null) { parameters["defaultpricelevelid"] = FormatDate("defaultpricelevelid"); } if (a.get("creditonhold").getValue() != null) { parameters["creditonhold"] = a.get("creditonhold").getValue(); } if (a.get("creditlimit").getValue() != null) { parameters["creditlimit"] = a.get("creditlimit").getValue(); } if (a.get("ownerid").getValue() != null) { parameters["ownerid"] = a.get("ownerid").getValue()[0].id; parameters["owneridname"] = a.get("ownerid").getValue()[0].name; parameters["owneridtype"] = a.get("ownerid").getValue()[0].entityType; } // Открываем форму создания новой записи и указываем дефолтные значения для полей Xrm.Utility.openEntityForm("contact", null, parameters); } // Функция возвращает дату из поля CRM в формате MM/DD/YYYY function FormatDate(fieldname) { var d = a.get(fieldname).getValue(); if (d != null) { var curr_date = d.getDate(); var curr_month = d.getMonth(); curr_month++; var curr_year = d.getFullYear(); return curr_month + "/" + curr_date + "/" + curr_year; } else return null; }
- Тут мы просто собираем поля формы и кладем их в массив. Затем подсовываем в функцию openEntityForm. А она уж открывает новую форму с предзаполненными полями;
- Далее создайте такую кнопку на форме Организации:
<RibbonDiffXml> <CustomActions> <CustomAction Id="Clone.CustomAction" Sequence="200" Location="Mscrm.Form.contact.MainTab.Save.Controls._children"> <CommandUIDefinition> <Button Id="Clone.Button" Command="Clone.javascriptCommand" Sequence="200" LabelText="Клонирум запись" ToolTipTitle="Клонирум запись" ToolTipDescription="Клонирум запись" TemplateAlias="o1" Image32by32="$webresource:new_clone.png" /> </CommandUIDefinition> </CustomAction> </CustomActions> <Templates> <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates> </Templates> <CommandDefinitions> <CommandDefinition Id="Clone.javascriptCommand"> <EnableRules /> <DisplayRules /> <Actions> <JavaScriptFunction Library="$webresource:new_duplicate.js" FunctionName="Duplicate" /> </Actions> </CommandDefinition> </CommandDefinitions> <RuleDefinitions> <TabDisplayRules /> <DisplayRules /> <EnableRules /> </RuleDefinitions> <LocLabels /> </RibbonDiffXml>
Она просто вызывает функцию Duplicate с соответствующего JS Веб-ресурса.
Зетс олл… идем пробовать…
Насколько я знаю, аргумент parameters в XRM.Utility.openEntityForm передается текстом через url, в которой есть ограничения на длину. Для копирования записей это решение не очень подходит.
Чет не нашел об этом упоминания на msdn? 🙂 может пруф привести? 🙂
Конечно: http://msdn.microsoft.com/en-us/library/72a66f93-92df-42b9-a8fd-b6125c7fe83b#BKMK_OpenEntityForm
«parameters: A dictionary object that passes extra __query string parameters__ to the form»
Я лично делал копирование записей через передачу объекта со значениями getValue() для каждого «атрибута» формы в window.open(«/main.aspx?…»).
А в новой открытой записи делал setValue(), пробегая по полям переданного объекта.
Код получился универсальным для любой записи, но из-за создания новой записи через window.open() есть небольшой баг с контекстом окна новой записи.
Добрый день!
А как копировать дату если она в формате Дата и Время?
Можете подсказать в каком формате ее надо передавать.
Здрасьте 🙂
Думаю ее нужно передавать в том виде в каком ее возвращает метод getValue. Т.е. ее не нужно предварительно обрабатывать через отдельную функцию.