Кастомизация
22
Июл
16

Повторное открытие Действий в Dynamics CRM 4.0

У всех объектов CRM есть несколько состояний, и обычно это – «активный» и «неактивный». И Действия тут не исключения… Кроме того, изменение этого состояния, практически для всех записей возможно через пользовательский интерфейс. Удивление начинается тогда, когда Вы обнаруживаете что не в состоянии вновь открыть закрытые Действия. Точнее Вы этого не можете сделать через пользовательский интерфейс… а еще точнее – «пока» не можете 🙂 Рассмотрим пару обходных маневров:

Способ 1: Бизнес-процессы

Все, что в данном случаи требуется, так это создать простой Бизнес-процесс для нужного Вам объекта (имеются ввиду объекты Действия: Звонок, Задача и т.д.) и в настройках шага изменить его статус на Открыто.


Как Вы понимаете, преимуществом такого подхода является, то, что бизнес-процессы могут быть применены сразу к множеству записей (впрочем как и к одной).


А недостатком является, то, что после выполнения Бизнес-процесса, Вам необходимо будет подождать пару секунд пока статус обновится!

Способ 2: Кнопка

В службе CRM Есть несколько messages для программного измения состояния объектов. Среди них есть один для каждого типа Действия (например Звонок или Задача). Зная это? мы сможем отправить запрос Веб-службе на изменение статуса объекта – в данном случаи на открытие ранее закрытого Действия. А сделаем мы это с помощью JavaScript’а, которыей повесим на кнопочку на форме. Для этого:

  1. Выгрузите ISV.config из CRM-системы;
  2. Откройте файл customizations.xml в каком-нибудь тектовом редакторе и добавьте где-нибудь между тегами <Entities></Entities> следующий код (не нарушая при этом структуру других элементов):
            <Entity name="phonecall">
              <ToolBar ValidForCreate="0" ValidForUpdate="1">
                <Button Icon="/_imgs/ico_16_exportCustomizations.gif" JavaScript="if(crmForm.FormType==4){ var xml = &apos;&apos; + &apos;&lt;?xml version=\&apos;1.0\&apos; encoding=\&apos;utf-8\&apos;?&gt;&apos; + &apos;&lt;soap:Envelope xmlns:soap=\&apos;http://schemas.xmlsoap.org/soap/envelope/\&apos; xmlns:xsi=\&apos;http://www.w3.org/2001/XMLSchema-instance\&apos; xmlns:xsd=\&apos;http://www.w3.org/2001/XMLSchema\&apos;&gt;&apos; + GenerateAuthenticationHeader() + &apos; &lt;soap:Body&gt;&apos; + &apos; &lt;Execute xmlns=\&apos;http://schemas.microsoft.com/crm/2007/WebServices\&apos;&gt;&apos; + &apos; &lt;Request xsi:type=\&apos;SetStatePhoneCallRequest\&apos;&gt;&apos; + &apos; &lt;EntityId&gt;&apos;+crmForm.ObjectId+&apos;&lt;/EntityId&gt;&apos; + &apos; &lt;PhoneCallState&gt;Open&lt;/PhoneCallState&gt;&apos; + &apos; &lt;PhoneCallStatus&gt;-1&lt;/PhoneCallStatus&gt;&apos; + &apos; &lt;/Request&gt;&apos; + &apos; &lt;/Execute&gt;&apos; + &apos; &lt;/soap:Body&gt;&apos; + &apos;&lt;/soap:Envelope&gt;&apos; + &apos;&apos;; var xmlHttpRequest = new ActiveXObject(&apos;Msxml2.XMLHTTP&apos;); xmlHttpRequest.Open(&apos;POST&apos;,&apos;/mscrmservices/2007/CrmService.asmx&apos;, false); xmlHttpRequest.setRequestHeader(&apos;SOAPAction&apos;,&apos;http://schemas.microsoft.com/crm/2007/WebServices/Execute&apos;); xmlHttpRequest.setRequestHeader(&apos;Content-Type&apos;, &apos;text/xml; charset=utf-8&apos;); xmlHttpRequest.setRequestHeader(&apos;Content-Length&apos;, xml.length); xmlHttpRequest.send(xml); var resultXml = xmlHttpRequest.responseXML; window.location.reload();}">
                  <Titles>
                    <Title LCID="1049" Text="Открыть Звонок" />
                  </Titles>
                  <ToolTips>
                    <ToolTip LCID="1049" Text="Повтороно открывает Звонок, если он закрыт." />
                  </ToolTips>
                </Button>
              </ToolBar>
            </Entity>
    

    Этот код добавляет на форму Звонка кнопку, которая открывает ранее закрытую запись. В начале проверяется условие на то, что запись закрыта, если это не так, то код просто не сработает;

  3. Загрузите customizations.xml обратно в CRM;
  4. Если Вы этого еще не сделали, то включите отображение настраиваемых меню в CRM системе: Параметры — Администрирование — Системные параметры — вкладка Настройка — секция Настраиваемые меню и панели инструментов — добавьте те клиенты, в которых хотите показывать нашу кнопку да и не только ее 🙂



Тестируем. Откройте какую-нибудь запись закрытого звонка. Вы увидите нашу кнопочку. Смело жмите ее 🙂 Запись снова станет открытой!


Дальше… как Вы заметили, этот код открывает только записи с типом Звонок! Чтобы открывать другие типы Действий необходимо:

  • Полностью скопировать приведенный выше код;
  • Изменить тип объекта на нужный Вам, например для задачи:
    <Entity name="task">
    
  • Изменить три ключевых слова в SOAP запросе (это тот что идет после JavaScript=);
    • SetStatePhoneCallRequest
    • PhoneCallState
    • PhoneCallStatus

    На что их менять лучше глянуть в SDK (ссылки я привел выше). Напрмер для Задачи они изменятся на

    • SetStateTaskRequest
    • TaskState
    • TaskStatus

По аналогии можно сделать и с другими действиями 🙂

Комментарии (16)
  • oikcom 22.07.2009

    Доброго времени суток.
    Попробовал все варианты, как вы посоветовали в http://mmcrm.ru/?p=301, я по поводу изменения statecode и statuscode, в записи пришедшего письма, для его дальнейшего редактировантя по кастомным полям, вобщем ни чего не получется ни так ни так…… Может есть какие то еще варианты.
    Спасибо.

  • oikcom 22.07.2009

    Произошел прогресс, оказывается во входящем emaile, нужно было до описаного здесь шага добавить еще один шаг, изменить запись, где очистить все даты, (скорее всего даже все не обязательно, просто не было времени по одной), и очистить поле входящее — исходящее, далее Ваш шаг, и сообщение становится открытым в состоянии либо черновик, либо не выполнено
    Спасибо.

  • oikcom 22.07.2009

    Доброго времени суток
    Подскажите если можно, в скуле значения statuscode цифровые, при этом status это еще и тип записи, где то в скуле есть таблица со значениями statuscode, дело в том, что мне нужно изменить слово черновик, на свое, ведь где то эти слова прописаны, только ни как не могу найти…..
    Спасибо.

  • slivka_83 22.07.2009

    Добрый день 🙂
    табличка StringMap 🙂
    и это ансапорт 🙂

  • oikcom 22.07.2009

    А что значит ансапорт?
    Спасибо

  • slivka_83 22.07.2009

    Unsupported 🙂 Т.е. неподдерживаемое дейсвие 🙂 Лазить в БД ручками нельзя 🙂 это запрещает MS. Если после этого у Вас упадет система и MS узнает что Вы производили неподдерживаемые изменения, они могут отказать в поддержке! 🙂

  • oikcom 22.07.2009

    Так я меняю только поле Value » Это поле ведь не цифровое и не используется не в каких вычислениях, если только в сравнениях??? Как вы думаете — не глюкнет? 🙂 И еще не подскажите какой ObjectTypeCode у электропочты, а то по запросу
    SELECT StringMap.*
    FROM StringMap
    WHERE Value = ‘Черновик’
    вылазит под два десятка записей и все Value = ‘Черновик’ 🙂
    Спасибо

  • oikcom 22.07.2009

    Блин извините, нашел у Вас http://mmcrm.ru/?p=140, так что вторая часть вопроса снята :), но первая вызывает не большие сомнения…..

  • slivka_83 22.07.2009

    Ну, по идее не должно 🙂 но на вский случай сделайте бэкап бызы.

    И по поводу второго вопроса http://crm_server/sdk/list.aspx

  • oikcom 22.07.2009

    Добрый день
    Если моно еще вопрос к вышеперечисленному, при изменение в ручную поля volue, вышеприведенной запипси, оно меняется, но при публикации CRM меняет его обратно на «Черновик», судя по всему дело где то в самом CRM, только где это искать?
    Спасибо.

  • slivka_83 22.07.2009

    Добрый день.

    Что значит «при публикации CRM»?

  • oikcom 22.07.2009

    Здравствуйте
    Когда я меняю значение в скуле, в ручную, запросом update, значение меняется, после захожу в CRM там все как прежде, если я жму кнопку, в настройке объектов, опубликовать все настройки, и смотрю обратно скуль, там значение изменяется на прежнее……
    Спасибо

  • slivka_83 22.07.2009

    Думаю, что не обойти…. публикация это довольно захардкоденая тема, так что информации по ней мало…

  • Павел 22.07.2009

    Пробовал произвести такую же операцию с Обращениями.
    ничего не происходит.
    в чем причина?
    java код на кнопке:
    { var xml = '' + '<?xml version=\'1.0\' encoding=\'utf-8\'?>' + '<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\'>' + GenerateAuthenticationHeader() + ' <soap:Body>' + ' <Execute xmlns=\'http://schemas.microsoft.com/crm/2007/WebServices\'>' + ' <Request xsi:type=\'SetStateIncidentRequest\'>' + ' <EntityId>'+crmForm.ObjectId+'</EntityId>' + ' <IncidentState>Open</IncidentState>' + ' <IncidentStatus>-1</IncidentStatus>' + ' </Request>' + ' </Execute>' + ' </soap:Body>' + '</soap:Envelope>' + ''; var xmlHttpRequest = new ActiveXObject('Msxml2.XMLHTTP'); xmlHttpRequest.Open('POST','/mscrmservices/2007/CrmService.asmx', false); xmlHttpRequest.setRequestHeader('SOAPAction','http://schemas.microsoft.com/crm/2007/WebServices/Execute&apos;); xmlHttpRequest.setRequestHeader('Content-Type', 'text/xml; charset=utf-8'); xmlHttpRequest.setRequestHeader('Content-Length', xml.length); xmlHttpRequest.send(xml); var resultXml = xmlHttpRequest.responseXML; window.location.reload();}

  • Павел 22.07.2009

    Пробовал произвести такую же операцию с Обращениями через javascript.
    ничего не происходит.
    в чем причина?

  • slivka_83 22.07.2009

    Попробуйте воспользоваться этой тулзой http://www.stunnware.com/crm2/topic.aspx?id=JSWebService, чтобы конвертировать C# код (например, http://stackoverflow.com/questions/3857350/crm-4-0-programatically-re-opening-a-closed-incident-case) в JS.

*

code