1/2/08

Uso de ObjectDataSource contra CRM


Imaginemos que queremos llegar a esto: una página ASPX que permita leer y modificar datos de CRM, por ejemplo de una cuenta de cliente. Hay mil maneras de hacerlo, sólo que esta a mi me parece especialmente elegante por el poco código que hay que añadir. Es una solución al estilo ASP.NET 2.0, así que vamos a trabajar con Visual Studio 2005 (o 2008).
Lo primero es crear el código del componente de datos, que actuará de intermediario entre el control ObjectDataSource y el web service de CRM. La clase se llama Cuenta y representa la capa de lógica de negocio especializada en operaciones sobre cuentas de cliente. Por cierto, ¿alguien sabe cómo colorear sintaxis (facilmente) en Blogger?


using System;
using System.ComponentModel;
using CrmNetLib.CrmSdk;

namespace CrmNetLib
{

[DataObject]
public class Cuenta
{
private CrmService crm;

public Cuenta()
{
crm = new CrmService();
crm.Credentials = System.Net.CredentialCache.DefaultCredentials;
}

[DataObjectMethod(DataObjectMethodType.Select, true)]
public account Buscar(Guid id)
{
return (account)crm.Retrieve(EntityName.account.ToString(),
id, new AllColumns());
}

[DataObjectMethod(DataObjectMethodType.Update, true)]
public void Actualizar(account cuenta)
{
crm.Update(cuenta);
}



}
}




Fijaos en los atributos DataObject y DataObjectMethod. Sirven para que el asistente del ObjectDataSource que pondremos en la página reconozca el objeto como candidato a fuente de datos. Y ahora vamos a la página aspx: lo primero que hacemos es añadir un objeto ObjectDataSource configurando su fuente al objeto comercial (=de lógica de negocio) Cuenta. En mi caso lo he definido en un proyecto aparte de nombre CrmNetLib, pero podría estar en el mismo proyecto, por ejemplo dentro de la carpeta App_Code.




En la siguiente pantalla del asistente, configuramos los métodos de búsqueda y actualización para que apunten a los métodos Buscar y Actualizar de nuestra clase. En un caso más completo, sólo nos faltaría mapear también los métodos de borrado e inserción.









Como el método de búsqueda tiene un parámetro (el id de la cuenta), tenemos que relacionarlo con algún valor de entrada. Escogemos el QueryString de la página, con lo que la URL de acceso tendrá el siguiente aspecto:



http://www.servidor.com/aplicacion/editarcuenta.aspx?id=//GUID de la cuenta//




Por otro lado, el método de actualización recibe un parámetro de tipo account sacado directamente de la SDK de CRM que representa una cuenta con todos sus atributos. También podríamos usar un método que tuviera como parámetros los atributos del objeto, en este caso id, nombre, teléfono y fax.



Ahora sólo queda añadir el control DetailsView para ver los datos de la cuenta. Una vez en la zona del diseñador, escogemos el ObjectDataSource como fuente de datos. Aparecerán todos los campos de la clase account(o sea, muchos campos(.





Para reducirlos a un número manejable, sólo tenemos que escoger la opción Editar campos... Decido quedarme con nombre, teléfono y fax. Si además habilitamos la edición del control, ya habremos terminado en un tiempo record una página de edición de cuentas.

Este es el aspecto final de la página en el diseñador de Visual Studio:




5 comentarios:

Anónimo dijo...

Excelente ejemplo,tal como el otro video relacionado con el objectdatasource.

Una pregunta,¿Cómo podría valerme del detailview para mostrar el nombre de todos los productos de la entidad producto?

De antemano muchas gracias.

Anónimo dijo...

Yo de nvo...

ahora estoy tratando con repeater.
Basandome en el ejemplo del video, devuelvo un objeto de tipo BusinessEntityCollection que devuelve un conjunto de productos desde el CRM4, el que uso en el ObjectDataSource.

El problema es que al codificar el Repeater, me pide una propiedad para la fuente de datos:

DataBinder.Eval(ObjectDataSource1,"propiedad_que no encuentro");

Cualquier ayuda será bien recibida.

Atte:

fabricio.hardsoft@gmail.com

Daniel Sabater dijo...

Pues creo recordar que cada uno de los items del Repeater contiene un DataItem del tipo elemental de la colección. En tu caso, cada item sería un Producto, de modo que si pones cualquier propiedad de esta entidad, por ejemplo "Name" debería mostrarlo. Te recomiendo que captures el evento DataBinding del Repeater, pongas un punto de interrupción e inspecciones de qué objecto se trata, de todas formas. ¡Suerte!

Anónimo dijo...

Escribe Fabricio:

Gracias por tu ayuda.
Mira al final la solución es la siguiente:

Devolver un objeto del tipo BusinessEntityCollection.
Con otra clase usar este objeto y devolver un DataSet para poder usarlo en el repeater, en donde la propiedad que buscaba corresponde a un campo de este DS.

Atte:

Fabricio P.

Anónimo dijo...

Saludos.. Amigo este tutorial es muy bueno, super detallado y bien explicado, muchas gracias es lo que andaba buscando! :):):):):):)