Разработка
04
Авг
5

Копирование записей с помощью 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 Веб-ресурса.

Зетс олл… идем пробовать…



Комментарии (5)
  • Михаил 04.08.2013

    Насколько я знаю, аргумент parameters в XRM.Utility.openEntityForm передается текстом через url, в которой есть ограничения на длину. Для копирования записей это решение не очень подходит.

  • slivka_83 04.08.2013

    Чет не нашел об этом упоминания на msdn? 🙂 может пруф привести? 🙂

  • Михаил 04.08.2013

    Конечно: 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() есть небольшой баг с контекстом окна новой записи.

  • Ion 04.08.2013

    Добрый день!

    А как копировать дату если она в формате Дата и Время?
    Можете подсказать в каком формате ее надо передавать.

  • slivka_83 04.08.2013

    Здрасьте 🙂

    Думаю ее нужно передавать в том виде в каком ее возвращает метод getValue. Т.е. ее не нужно предварительно обрабатывать через отдельную функцию.

*

code