2012-07-18 29 views
5

Estoy intentando ejecutar un flujo de trabajo para registros seleccionados en una vista, mediante un botón de cinta. Tengo un ejemplo de trabajo utilizando los servicios de 'legado' para la compatibilidad CRM 4:Ejecutar flujo de trabajo desde JavaScript en CRM 2011

function invokeWorkflow(workflowId, entityId) { 
    var request = 
     '<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="ExecuteWorkflowRequest">' + 
     '  <EntityId>' + entityId + '</EntityId>' + 
     '  <WorkflowId>' + workflowId + '</WorkflowId>' + 
     '  </Request>' + 
     ' </Execute>' + 
     ' </soap:Body>' + 
     '</soap:Envelope>'; 

    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', '/MSCRMservices/2007/crmservice.asmx', false); 

    xhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-8'); 
    xhr.setRequestHeader('SOAPAction', 'http://schemas.microsoft.com/crm/2007/WebServices/Execute'); 

    xhr.send(request); 
} 

Sin embargo, quiero escribir este uso de los servicios de CRM 2011 para aumentar la capacidad de mantenimiento para futuras versiones. Esto es lo que he intentado hasta ahora, pero esto no funciona: el código de retorno de la llamada es HTTP 500 (Internal Server Error).

function invokeWorkflow(workflowId, entityId) { 
    var request = 
     '<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">' + 
     ' <soap:Body>' + 
     ' <Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services">' + 
     '  <Request xsi:type="ExecuteWorkflowRequest">' + 
     '  <EntityId>' + entityId + '</EntityId>' + 
     '  <WorkflowId>' + workflowId + '</WorkflowId>' + 
     '  </Request>' + 
     ' </Execute>' + 
     ' </soap:Body>' + 
     '</soap:Envelope>'; 

    var xhr = new XMLHttpRequest(); 
    xhr.open('POST', '/XRMServices/2011/Organization.svc/web', true); 

    xhr.setRequestHeader('Accept', 'application/xml, text/xml, */*'); 
    xhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-8'); 
    xhr.setRequestHeader('SOAPAction', 'http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute'); 

    xhr.onreadystatechange = function() { alert(xhr.status); }; 
    xhr.send(request); 
} 

¿Alguien sabe qué pasa con el segundo script? Intenté buscar en Google esto lo mejor que puedo, pero cada ejemplo que encuentro que pretende ser para CRM 2011 es, de hecho, solo el uso de los servicios de compatibilidad CRM 4 (como en el primer ejemplo). He basado el segundo ejemplo de una muestra en el CRM 2011 SDK, aunque esto no incluye un ejemplo del objeto ExecuteWorkflowRequest, por lo que es mejor adivinar solamente.

Gracias!

Respuesta

7

Hay una aplicación llamada SOAPLogger en la carpeta CRM sdk \ samplecode \ cs \ client \ soaplogger que genera solicitudes en JavaScript para acciones específicas.

A continuación, puede encontrar la solicitud http para "ExecuteWorkflow" (simplemente cambie el valor de EntityIdValue y).

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
    <Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
     <request i:type="b:ExecuteWorkflowRequest" xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts" xmlns:b="http://schemas.microsoft.com/crm/2011/Contracts"> 
     <a:Parameters xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic"> 
      <a:KeyValuePairOfstringanyType> 
      <c:key>EntityId</c:key> 
      <c:value i:type="d:guid" xmlns:d="http://schemas.microsoft.com/2003/10/Serialization/">EntityIdValue</c:value> 
      </a:KeyValuePairOfstringanyType> 
      <a:KeyValuePairOfstringanyType> 
      <c:key>WorkflowId</c:key> 
      <c:value i:type="d:guid" xmlns:d="http://schemas.microsoft.com/2003/10/Serialization/">WorkflowIdValue</c:value> 
      </a:KeyValuePairOfstringanyType> 
     </a:Parameters> 
     <a:RequestId i:nil="true" /> 
     <a:RequestName>ExecuteWorkflow</a:RequestName> 
     </request> 
    </Execute> 
    </s:Body> 
</s:Envelope> 

La construcción de XMLHttpRequest es corecta, a fin de tratar de cambiar la soapEnvelope.

Cuestiones relacionadas