2016-11-08 4 views
2

Я бы хотел использовать плагин для заполнения данных формы сущности объекта. Я новичок в работе с C# и плагинами, но я понимаю, что это более надежно, чем использование скриптов javascript. Если это плохое предположение, сообщите мне.C# - Плагин Dynamics CRM - Автоматическое заполнение данных до создания

Моя цель состоит в том, чтобы: 1) получить и проверить роль безопасности пользователя, 2) на основе роли безопасности автоматически заполнить поле «Заказчик» общим, жестко запрограммированным значением.

Поле «Клиент» в форме корпуса является полем «Требуется система». В настоящее время у меня есть плагин, зарегистрированный на Create of an инцидент, предварительная проверка & синхронно. Когда я пытаюсь сохранить, не заполняя вручную поле «Клиент», я не могу сохранить, и пользовательский интерфейс указывает мне на то, что поле еще не заполнено.

Я пытаюсь сделать что-то, что невозможно? Или я должен просто использовать javascript и/или бизнес-правила для чего-то вроде этого?

+1

Так что вы хотите, чтобы поле заполняться, как только открывается форма, или заполняется при сохранении формы? – Equalsk

+0

Он должен заполняться, как только открывается форма. –

ответ

1
  1. Плагин стоит дорого. В соответствии с вашей потребностью, функция JavaScript OnLoad более уместна.
  2. Что касается этапа предварительной проверки, проверка действительно проверяет такие права, как пользовательские привилегии; уровень требований на уровне проверяется на стороне клиента. Поэтому даже плагин предварительной проверки не поможет пользователю пропустить требуемое поле.
  3. Если вы предпочитаете плагин, вы можете установить значение по умолчанию для этого поля и заполнить правильное значение в плагине.
1

Для того, чтобы сделать это с помощью плагина вам может понадобиться использовать запрос RetrieveMultiple для той роли, которую пользователь может иметь и затем цикл через результаты, чтобы присвоить значение поля клиента на основе роли ...

Например, если у вас есть на fetchxml, чтобы получить роли, которые вы могли бы использовать его в плагин (вы можете использовать QueryExpression, а вместо fetchxml) ...

string FetchXML = 
    @"<fetch mapping='logical' count='50' version='1.0'> 
     <entity name='systemuser'> 
      <attribute name='fullname' /> 
     <link-entity name='systemuserroles' from='systemuserid' to='systemuserid'> 
     <link-entity name='role' from='roleid' to='roleid'> 
      <attribute name='name' /> 
     </link-entity> 
     </link-entity> 
     </entity> 
    </fetch>"; 

EntityCollection result = svcClient.OrganizationServiceProxy.RetrieveMultiple(new Microsoft.Xrm.Sdk.Query.FetchExpression(FetchXML)); 

// and then loop thru result 
if (result != null) 
{ 
    foreach (var item in result.Entities) { 
     // ... do your stuff here 
     // item.roleName is just an idea.. I haven't tested the code yet.. 
     Entity case = new Entity("case"); 

     if (item.roleName == "role 01") 
       contact.Attributes["customer_field"] = "hard-code value 01"; 
     if (item.roleName == "role 02") 
       contact.Attributes["customer_field"] = "hard-code value 02"; 

     ... 
     ... 
    } 
} 

для этого конкретного сценария, я думаю вы можете достичь этого, используя только javascript. Если вы решили пойти именно так вот идея ...

Приложить яваскрипт функцию (Ex. autoFillCustomer()) в OnLoad случае формы, которая будет проверять имя роли и на основе результата она будет установите требуемое значение жесткого кодирования.

function autoFillCustomer(){ 
     var roles = getAllUserRolesNames(); 
     var customerField = Xrm.Page.getAttribute("customer_field"); 

     for (var i = 0; i < roles.length; i++) { 
      var roleName = roles[i]; 

      switch (roleName) { 
       case "Role Name 01":     
        if (customerField!= null) 
         customerFieldsetValue("hard-coded avlue 01"); 

        break; 

       case "Role Name 021":     
        if (customerField!= null) 
         customerFieldsetValue("hard-coded avlue 02"); 

        break; 

       default;    
        if (customerField!= null) 
         customerFieldsetValue("default value if needed"); 
      } 
     } 
    } 

А потом .. с другой стороны, вы можете иметь другой Js webresource с реализацией getAllUserRolesName() и добавить его в форму, а также. (это потому, что вы можете использовать его на новых будущих сценариев)

// Display Name: Get All User Roles Names 
// Description: Returns an array containing all the roles and teams currently assigned to a user 
//    This will contain the name and not the guid which is what the standard getUserRoles() function does. 
function getAllUserRolesNames() { 
    var guid = "[A-z0-9]{8}-[A-z0-9]{4}-[A-z0-9]{4}-[A-z0-9]{4}-[A-z0-9]{12}"; 
    var serverUrl = Xrm.Page.context.getClientUrl(); 
    var userId = Xrm.Page.context.getUserId(); 
    userId = userId.match(guid); 
    var teamQuery = "TeamMembershipSet?$select=TeamId&$filter=SystemUserId eq guid'" + userId + "'"; 
    var teamRoleQuery = "TeamRolesSet?$select=RoleId&$filter="; 
    var roleQuery = "RoleSet?$select=Name&$filter="; 
    var teams = makeRequest(serverUrl, teamQuery, 0); 
    teamRoleQuery = composeQuery(teamRoleQuery, "TeamId", teams); 
    var teamRoles = makeRequest(serverUrl, teamRoleQuery, 1); 
    userRoles = Xrm.Page.context.getUserRoles(); 
    if (userRoles != null) { 
     for (var i = 0; i < userRoles.length; i++) { 
      teamRoles.push(userRoles[i].match(guid)); 
     } 
    } 
    roleQuery = composeQuery(roleQuery, "RoleId", teamRoles); 
    var roles = makeRequest(serverUrl, roleQuery, 2); 
    return roles; 
} 
function makeRequest(serverUrl, query, type) { 
    var oDataEndpointUrl = serverUrl + "/XRMServices/2011/OrganizationData.svc/"; 
    oDataEndpointUrl += query; 
    var service = GetRequestObject(); 
    if (service != null) { 
     service.open("GET", oDataEndpointUrl, false); 
     service.setRequestHeader("X-Requested-With", "XMLHttpRequest"); 
     service.setRequestHeader("Accept", "application/json, text/javascript, */*"); 
     service.send(null); 
     var retrieved = $.parseJSON(service.responseText).d; 
     var results = new Array(); 
     switch (type) { 
      case 0: 
      for (var i = 0; i < retrieved.results.length; i++) { 
       results.push(retrieved.results[i].TeamId); 
      } 
      break; 
      case 1: 
      for (var i = 0; i < retrieved.results.length; i++) { 
       results.push(retrieved.results[i].RoleId); 
      } 
      break; 
      case 2: 
      for (var i = 0; i < retrieved.results.length; i++) { 
       if (results.indexOf(retrieved.results[i].Name) == -1) { 
        results.push(retrieved.results[i].Name); 
       } 
      } 
      break; 
     } 
     return results; 
    } 
    return null; 
} 

function GetRequestObject() { 
    if (window.XMLHttpRequest) { 
     return new window.XMLHttpRequest; 
    } else { 
     try { 
      return new ActiveXObject("MSXML2.XMLHTTP.3.0"); 
     } catch (ex) { 
      return null; 
     } 
    } 
} 

function composeQuery(queryBase, attribute, items) { 
    if (items != null) { 
     for (var i = 0; i < items.length; i++) { 
      if (i == 0) { 
       queryBase += attribute + " eq (guid'" + items[i] + "')"; 
      } else { 
       queryBase += " or " + attribute + " eq (guid'" + items[i] + "')"; 
      } 
     } 
    } 
    return queryBase; 
} 
1

EDIT

Arun указал в комментариях, что первоначально речь шла о Case (incident) лица и Клиентом поле для этого объекта является обязательным полем, которое не может быть изменено, чтобы быть дополнительным..

Это означает, что мой ответ ниже, не возможно ОП, но я оставляю его здесь, в случае она помогает каждому, кто работает на другой сущности


Даже если вы установили плагин для выполняться при предварительной валидации, это все равно на конвейере сообщений Create, что означает, что вам нужно сначала нажать кнопку сохранения. Однако вы установите поле, потребуются именно поэтому вы получаете сообщение проверки

Если вы хотите, чтобы сохраняться при таком подходе я хотел бы сделать следующие изменения:

  1. Измените значение в поле Заказчика так что это не является обязательным
  2. Измените значение в поле Customer, так что он доступен только для чтения
  3. Зарегистрируйте свой плагин, как вы описали (Create, предварительно Validate; синхронный), чтобы обновить InputParameters о происшествии на основе бизнес-требования (т.е. на основе роли безопасности пользователя)

Плагины на этом этапе (предварительная проверка) означает, что сообщение о создании будет перехвачено до того, как оно попадет в базу данных CRM и введет ваши изменения в данные.

Преимущество делать это таким образом (с помощью плагина вместо JavaScript, как было предложено другими пользователями) является то, что он будет применяться ко всем CRM Forms

Недостатком этого подхода является то, что пользователь видит только пустое поле пользователя до тех пор, пока они не нажмут сохранить. Если они нажмут Сохранить и закрыть, тогда они могут не понимать, что клиент настроен вообще. Вы можете обойти это, переместив это поле в раздел «автозаполнение» или «сгенерированный системой», чтобы пользователь знал, что это заполняется автоматически.

+0

Хотел бы упомянуть - поле клиента не может быть необязательным - http://mobile.crmsoftwareblog.com/2016/09/service-case-customer-field-not-required-dynamics-crm-2016/ –

+0

@ArunVinoth дополнительные поля клиента доступны в Dynamics CRM 365 – jasonscript

+1

Wow, Замечательно знать. Im знает, что атрибут типа клиента может быть добавлен. Но дополнительный клиент в объекте инцидента все еще невероятен. –

 Смежные вопросы

  • Нет связанных вопросов^_^