Home

Actualizando varios registros desde el Entity Grid en Microsoft Dynamics CRM 2011

webmaster's picture

Uno de los procesos que llevamos a cabo en nuestro pequeño/gran proyecto de control de gastos dentro de Microsoft Dynamics CRM 2011 es el poder pasar al estado aprobado varios registros de gastos desde la vista o grid de la entidad, por el usuario que tiene los derechos de utilizar esta función; en este caso el Administrador del Sistema, que por cierto ha recibido una notificación por cada gasto dado de Alta en su lista de tareas que tiene pendiente de aprobar. Léan nuesto Artículo "Desarrollo y registro de un Plug in asincrono en Microsoft Dynamics CRM 2011 ".

Lo primero que hacemos es crear los botones correspondientes en el Ribbon de la Entidad. Para ello realizamos los pasos realizaos en el artículo "Ribbon personalizados en Microsoft Dynamics CRM 2011. Agregar una Pestaña, Grupo y Botón" para exportar nuestra solución y editar el archivo customizations.xml en la sección del <Ribbon></Ribbon> encontraremos los apartados del botón. Dentro de la zona buscariamos la zona de Homepage que es la relacionada con el HomePage de la Entidad y no la de Form. Muy importante. 

En esta caso lo más importante es la definición de la acción; ya que la misma llamará a una funcion d ela libreria new_DatabaseTools que se llama AprobarGastos y que recibirá un parámetro de tipo <CrmParameterValue=”SelectedControlSelectedItemIds” />.

Tendria que quedar asi:

<CommandDefinition Id="Mscrm.HomepageGrid.new_gastos.MainTab.Aprobaciones.aprobar.Command">
<EnableRules/>
<DisplayRules/>
<Actions>
<JavaScriptFunctionLibrary=“$webresource:new_DatabaseTools“FunctionName=“AprobarGastos“>
<CrmParameterValue=“SelectedControlSelectedItemIds“ />
</JavaScriptFunction>
</Actions>
</CommandDefinition

 A continuación ponemos alguno de los parámetros de tipo CrmParameterValue aplicables.

SelectedEntityTypeCode : A number representing the unique type of entity for a record selected in a grid. The Entity type code will vary between deployments.
SelectedEntityTypeName : A string representing the unique name of the entity for a record selected in a grid.
FirstSelectedItemId : Provides one GUID identifier as a string for the first item selected in a grid.
SelectedControlSelectedItemCount : The number of selected items in a grid.
SelectedControlSelectedItemIds : A string array of GUID Id values for all selected items in a grid.
SelectedControlAllItemCount : A string array of GUID Id values for all selected items in a grid.
SelectedControlAllItemIds : A string array providing the GUID Id values for all items displayed in a grid.
SelectedControlUnselectedItemCount : The number of unselected items in a grid.
SelectedControlUnselectedItemIds : A string array of GUID Id values for all unselected items in a grid.

Bueno después de personalizar el botón, volvemos a introducir el archivo customizations.xml dentro de la solución exportada y la importamos al CRM, revisando la no ocurrencia de errores. Una vez importada la solución la publicamos.

Al desplazarnos a la zona de Gastos deberíamos ver los botones ubicados en la zona de la las lista de Gastos y no en el Formulario de edición de los mismos.

El paso siguiente es definir la Función dentro de nuestro WebResource: new_DatabaseTools llamada AprobarGastos de la siguiente forma: 

// Selecciona los registros de la lista de Gastos para marcarlos como Aprobados
function AprobarGastos(selectedIds)
{
if (selectedIds != null && selectedIds != "")
{
    // Utilizaremos la llamada al servicio Retrieve.Update de XrmServiceToolkit para actualizar el gasto a aprobado
   var XrmWebResourceUrl = "../WebResources/new_XrmServiceToolkit.js";
   var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
   xmlHttp.open("GET", XrmWebResourceUrl, false);
   xmlHttp.send();
   eval(xmlHttp.responseText);
  // Cargamos la libreia Jquery sino no funciona XrmServiceToolkit
  var JQueryWebResourceUrl = "../WebResources/new_jquery.js";
  var xmlHttp2 = new ActiveXObject("Microsoft.XMLHTTP");
  xmlHttp2.open("GET", JQueryWebResourceUrl, false);
  xmlHttp2.send();
  eval(xmlHttp2.responseText);
  // Cargamos la libreria Json
  var JSonWebResourceUrl = "../WebResources/new_json2.js";
  var xmlHttp3 = new ActiveXObject("Microsoft.XMLHTTP");
  xmlHttp3.open("GET", JSonWebResourceUrl, false);
  xmlHttp3.send();
  eval(xmlHttp3.responseText);
 
  var strIds = selectedIds.toString();
  var arrIds = strIds.split(",");
 
for (var indxIds = 0; indxIds < arrIds.length; indxIds++)
{
// alert("Ha marcado el registro Id" + arrIds[indxIds]);
var gastos = {};
gastos.new_aprobado = true;
XrmServiceToolkit.Rest.Update(
                arrIds[indxIds],
                gastos,
                "new_gastosSet",
                function (){
                equals(true, true, "The record should have been updated.");
                },
                function (error) {
                    equal(true, false, error.message);
                },
                false
            );
}
}
else
{
alert("No ha marcado ningun gasto para aprobar!!!");
}
}

Hemos querido utilizar la librería XrmServiceToolkits para realizar las operaciones de actualización de los registros utilizando su metodo XrmServiceToolkits.Rest.Update(). Esto nos ha obligado a cargar las librerias relacionadas Json2.js y Jquery.js de otra forma no se reconocerían las sentencias Jquery incluidas en la librería y nos daria error.

Utilizando el protocolo Odata con JScript en CRM 2011

La operación anterior se podria también haber resuelto con el uso de dos funciones de la siguiente manera:

function AprobarGastosOdata(selectedIds) {
    if (selectedIds != null && selectedIds != "") {
        var strIds = selectedIds.toString();
        var arrIds = strIds.split(",");
 
        for (var indxIds = 0; indxIds < arrIds.length; indxIds++) {
            var gastos = {};
            gastos.new_aprobado = true;
            ActualizaRecordSync(arrIds[indxIds], gastos, "new_gastosSet");
        }
 
    }
}
 
 
    function ActualizaRecordSync(id, entityObject, odataSetName)
    {
        var jsonEntity = window.JSON.stringify(entityObject);
        // Get Server URL
        var serverUrl = Xrm.Page.context.getServerUrl();
 
        //The OData end-point
        var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";
        var updateRecordReq = new XMLHttpRequest();
        var ODataPath = serverUrl + ODATA_ENDPOINT;
 
        updateRecordReq.open("POST", ODataPath + "/" + odataSetName + "(guid'" + id + "')", false);
        updateRecordReq.setRequestHeader("Accept", "application/json");
        updateRecordReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        updateRecordReq.setRequestHeader("X-HTTP-Method", "MERGE");
        updateRecordReq.send(jsonEntity);
 
    }

 

 

Fuente: 

Centro Práctico de LEMURSOLUTION & Knowledge Base de Microsoft Dynamics CRM 2011

Contacto: 
webmaster