29/10/07

Prefiltrado en infomes

Aquí va una pequeña advertencia y recordatorio - sobre todo para mi mismo - acerca del prefiltrado de informes en CRM. Esta característica es muy, muy útil, ya que te permite reutilizar un mismo informe de muchas maneras, tan sólo cambiando el filtrado. Este prefiltrado se gestiona desde CRM - no desde el diseño del informe - a través de la interfaz habitual de búsqueda avanzada. De esta forma, un informe de Incidentes cerrados la última semana se puede convertir en Incidentes cerrados para clientes con más de 500 empleados el último año o cualquier otra cosa que nos permita hacer la búsqueda avanzada.

En principio lo unico que hay que hacer (cito el MOC de personalización) es ponerle a las entidades que queramos prefiltrar un alias que comience por CRMAF_ . En el siguiente ejemplo, he escogido como alias CRMAF_FI para representar los casos, o sea la vista FilteredIncident.


SELECT CRMAF_FI.ticketnumber, CRMAF_FI.customeridname
FROM FilteredIncident AS CRMAF_FI


Este informe permitirá prefiltrar por atributos del caso. Lo podemos complicar un poco más añadiendo la tabla de cuentas:


SELECT CRMAF_FI.ticketnumber, CRMAF_FA.name
FROM FilteredIncident AS CRMAF_FI
INNER JOIN FilteredAccountt AS CRMAF_FA
ON FilteredIncident.customerid = FilteredAccount.accountid


Esto nos permitirá prefiltrar por caso y/o cuenta. Bueno, pues aquí viene la advertencia: el editor de informes integrado en Visual Studio añade delante de cada vista o tabla un dbo. que hace que deje de funcionar el prefiltrado. Por ahora, se lo tengo que quitar a mano con un Reemplazar, porque no he encontrado la opción para evitar este comportamiento.

25/10/07

Crear un contrato por código

Admitámoslo, crear un contrato en CRM es una pesadez. Al menos eso es lo que dicen algunos de los usuarios del módulo de servicio que conozco. Hay que seleccionar el cliente, crear el contrato, establecer la plantilla de contrato, fechas de inicio y finalización (cuatro en total), las direcciones (dos), añadir la línea de contrato, volver a poner las fechas de inicio y finalización, establecer el precio...

Bueno, pues todo esto es lo que hace este tocho código que véis aquí debajo. No es perfecto, pero puede ahorrar algo de tecleo.

public static Guid CrearContrato(
Guid idCuenta,
Guid idPlantillaContrato,
int numeroMinutos,
int importe)
{
// Buscar los datos del cliente
ColumnSet cs = new ColumnSet();
cs.Attributes = new string[] { "name", "address1_addressid" };
account cuenta =
crm.Retrieve(EntityName.account.ToString(), idCuenta, cs) as account;

// Buscar los datos de la plantilla
contracttemplate plantilla =
crm.Retrieve(EntityName.contracttemplate.ToString(), idPlantilla,
new AllColumns());

// Crear un título para el contrato
string tituloContrato = String.Format(
"{0} - {1} {2} min ({3:MM/yy})",
cuenta.name, plantilla.name, numeroMinutos, DateTime.Now);

// Establecer fechas (contrato de 10 años de duración)
string fechaInicio =
DateTime.Now.ToString("yyyy/M/ddT00:00:00");
string fechaFin =
DateTime.Now.AddYears(10).ToString("yyyy/M/ddT00:00:00");

// Crear el contrato
contract contrato = new contract();
contrato.contracttemplateid = new Lookup();
contrato.contracttemplateid.Value = idPlantillaContrato;
contrato.customerid = new Customer();
contrato.customerid.Value = idCuenta;
contrato.customerid.type = EntityName.account.ToString();
contrato.billingcustomerid = contrato.customerid;
contrato.activeon = new CrmDateTime();
contrato.activeon.Value = fechaInicio;
contrato.expireson = new CrmDateTime();
contrato.expireson.Value = fechaFin;
contrato.billingstarton = new CrmDateTime();
contrato.billingstarton.Value = fechaInicio;
contrato.billingendon = new CrmDateTime();
contrato.billingendon.Value = fechaFin;
contrato.serviceaddress = new Lookup();
contrato.serviceaddress.Value = cuenta.address1_addressid.Value;
contrato.billtoaddress = new Lookup();
contrato.billtoaddress.Value = cuenta.address1_addressid.Value;
contrato.title = tituloContrato;
Guid idContrato = crm.Create(contrato);

// Crear la línea de detalle del contrato
contractdetail linea = new contractdetail();
linea.title = "Linea " + tituloContrato;
linea.contractid = new Lookup();
linea.contractid.Value = idContrato;
linea.activeon = new CrmDateTime();
linea.activeon.Value = fechaInicio;
linea.expireson = new CrmDateTime();
linea.expireson.Value = fechaFin;
linea.customerid = new Customer();
linea.customerid.type = EntityName.account.ToString();
linea.customerid.Value = idCuenta;
linea.totalallotments = new CrmNumber();
linea.totalallotments.Value = numeroMinutos;
linea.price = new CrmMoney();
linea.price.Value = importe;
Guid idLinea = crm.Create(linea);

return idContrato;
}

4/10/07

Accediendo a CRM con ASP.NET 2.0

Se puede (?) ver aquí debajo mi primera prueba de video blogger sobre programación.




Se trata de llamar a los web services de CRM a través de un ObjectDataSource, que permite encapsular los comandos SELECT, UPDATE, INSERT y DELETE típicos en un objeto de lógica de negocio. Para el caso, se han mapeado a los métodos Retrieve, Update, Create y Delete del CrmService. Luego se muestran los resultados con DataBinding a un control DetailsView, que permite ver todos los campos de un registro.