lunes, 1 de julio de 2013

SQL Server Reporting Services 2008. Ventanas emergentes o pop-ups


Continuando con el ejemplo de una entrada anterior sobre Reporting Services. Voy a mostrar ahora como solventar una problemática particular que me surgió con un cliente.

Como sabéis reporting Services nos permite filtrar el contenido que vamos a visualizar en un informe a través de parámetros en la entrada de datos, como podemos ver en este ejemplo:


Además, un parámetro puede condicionar los valores que nos mostrará el otro.

La problemática que surgió fue que un cliente quería seleccionar los parámetros de entrada una sola vez y poder visualizar todos los informes con esos parámetros ya seleccionados. Es decir, no entrando informe a informe y seleccionando los parámetros cada vez.


Imaginemos que tenemos nuestra pantalla inicial de introducción de parámetros:



Fijémonos que ambos parámetros son visibles por eso nos aparecen al cargar el informe, permiten múltiples valores simultáneamente y que el de la fecha está condicionado por el del banco:







Bien, una vez que se han seleccionado los valores, el informe debe cargar un listado de informes que deben actuar como hipervínculos para enlazar a sus respectivos reportes, arrastrando los mismos parámetros que nos traíamos desde la selección inicial.


Como podemos ver, una vez introducimos nuestros parámetros de entrada múltiples, el informe nos los recoge:


A continuación tenemos que abrir cada uno de los informes ya enlazados en nuestro informe y pasarle esos mismos parámetros. ¿Cómo hacemos eso?

En el siguiente pantallazo recojo todo el proceso:





Desde las propiedades del campos de texto. Nos vamos a “Action” y a “Go to report”, especificamos el informe que queremos abrir al hacer clic y, como es un informe parametrizado, le añadimos los parámetros, en este caso 2, que le pasaremos al invocarle.

Observen que el value de los parámetros es la conocida función Join – que ya veíamos en una entrada anterior- y que permite pasar valores de parámetros múltiples.

En principio con esto estaría solventada la petición del cliente, ¿verdad? Pues en este caso no.

Además, los usuarios desean poder abrir varios informes simultáneamente para comparar y puntear cifras entre unos y otros.

El problema que tenemos con la acción “Go to report” es que NO permite abrir un pop-up o nueva ventana emergente.

Tenemos pues que buscar otra solución.  La explico a continuación en el siguiente esquema:


En lugar de seleccionar la acción “Go to report”, seleccionamos “Go to URL”. En la URL tenemos que introducir una expresión que nos abra un pop-up y que apunte a un informe de nuestro servidor de reporting services.

Es fácil decirlo, pero más difícil hacerlo. Con “Go to report”, dejamos al asistente que se encargue de todo el proceso de apuntar al informe especificado y que además le pase los parámetros. Pero con la especificación de la URL tenemos que hacerlo todo nosotros:
Vayamos por partes:
Ponemos un símbolo = y añadimos "javascript:void(window.open(
Window.open nos abrirá una ventana nueva, al especificar como segundo parámetro de esta función: _blank
Después debéis especificar la ruta de vuestro servidor Report Server, la carpeta donde se ubica el informe y después el informe: http://myserver/ReportServer?/myfolder/myreport
Veamos con más detalle:
Para obtener el nombre de vuestro report server y el directorio virtual donde se ubican los informes.
Haced clic en programas:




Como podéis ver, en la sección Report Manager URL nos muestra la URL a la que tenemos que apuntar:


 


De modo que ya tenemos la ruta hasta que nos encontramos el símbolo de interrogación:

="javascript:void(window.open('http://hpmobilewk:80/REPORTSERVER?/

Después añadimos el nombre de la carpeta de nuestros informes y el informe al que apuntamos (ojo, sin la extensión .rdl)

="javascript:void(window.open('http://hpmobilewk:80/REPORTSERVER?/Informes_Prueba/Informe02

Y a continuación especificamos los parámetros:

="javascript:void(window.open('http://hpmobilewk:80/REPORTSERVER?/Informes_Prueba/Informe02&rs:Command=render&rc:Parameters=true&BANCO_MAEB=" & Join(Parameters!Banco_Maeb.Value,",") & "&Fecha_Datos=" & Join(Parameters!Fecha.Value)


De nuevo, debemos observar que los parámetros deben llevar el Join porque son multiple valued.

Por último añadimos el cierre de la cadena de este primer parámetro de la función window.open:


="javascript:void(window.open('http://hpmobilewk:80/REPORTSERVER?/Informes_Prueba/Informe02&rs:Command=render&rc:Parameters=true&BANCO_MAEB=" & Join(Parameters!Banco_Maeb.Value,",") & "&Fecha_Datos=" & Join(Parameters!Fecha.Value) & "'

Y añadimos el segundo parámetro:

="javascript:void(window.open('http://hpmobilewk:80/REPORTSERVER?/Informes_Prueba/Informe02&rs:Command=render&rc:Parameters=true&BANCO_MAEB=" & Join(Parameters!Banco_Maeb.Value,",") & "&Fecha_Datos=" & Join(Parameters!Fecha.Value) & "','_blank'))"


Ya lo tendríamos. Por último señalar que lo ideal es parametrizar también el nombre del servidor, la ruta del informe y el propio informe, con valores de un dataset que nos permitan configurarlo de forma totalmente flexible:


=”javascript:void(window.open(‘” & Parameters!ServerAddress.Value & “?” & Parameters!ReportPath.Value & “myreport&rs:Command=render&rc:Parameters=true&Period=” & Parameters!Period.Value & “&Business_Unit=” & Parameters!Business_Unit.Value & “‘,’_blank’))”


Es cierto que es un poco engorroso trabajar en la ventana de expression de reporting, pero yo he tenido que hacer cosas similares en la versión 3 XI de Business Object y “madrecita, madrecita, que me quede como estoy…” 


Saludos a todos.



martes, 25 de junio de 2013

Parámetros múltiples con SSRS

Recientemente he tenido que preparar unos informes en Reporting Services que requerían seleccionar un parámetro múltiple, similar al que se puede ver en la imagen a continuación:

En principio, lo lógico es considerar realizar una variación en la consulta que alimenta este reporte, en el sentido de añadir un IN a continuación de la clausula WHERE:

Pues bien, cuando utilizamos como fuente un procedimiento almacenado es necesario realizar algunos pasos más para que podamos tener nuestro filtro múltiple.

En primer lugar hay que generar una función en T-SQL que nos permita separar las distintas partes de una cadena que será lo que enviemos como parámetro:


CREATE FUNCTION [dbo].[FnSplit]
(
--@List nvarchar(2000),
--@SplitOn nvarchar(5)
@List nvarchar(MAX),
@SplitOn nvarchar(MAX)
)
RETURNS @RtnValue table
(
Id int identity(1,1),
Value nvarchar(100)
)
AS
BEGIN
While (Charindex(@SplitOn,@List)>0)
Begin
Insert Into @RtnValue (value)
Select
Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1)))
Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
End

Insert Into @RtnValue (Value)
Select Value = ltrim(rtrim(@List))
Return
END
Una vez creada esta función:

necesitaremos modificar la clausula WHERE de nuestra consulta principal:



 Como podéis ver reemplazamos la sentencia:

--BANCO_MAEB IN (@BANCO_MAEB)

 por:

(BANCO_MAEB) collate database_default IN(SELECT Value FROM dbo.FnSplit(@BANCO_MAEB,','))

 
Por último, debemos hacer algunos cambios en nuestros reportes:

Nos aseguramos que nuestro parámetro admite entradas múltiples:



En las propiedades de nuestro dataset principal configuramos la sección de parámetros, tal y como se muestra a continuación:


Como nuestro parámetro debe aceptar múltiples entradas lo configuramos haciendo uso de la función Join para vincular los parámetros múltiples separados con una coma:

=Join(Parameters!BANCO_MAEB.Value,",")


Y ya estaría. Parece un poco enrevesado pero en cuanto tengáis la función FnSplit creada, el resto es bastante sencillo.


Saludos.

José Antonio.

miércoles, 19 de junio de 2013

Segmentación de clientes



Dentro de las técnicas de análisis y de minería de datos una de las más famosas es la segmentación, especialmente la segmentación de clientes. Es curioso, pero la mayor parte de las veces que he hablado de segmentación con algún cliente en el que he trabajado o con compañeros de profesión me da la sensación que para ellos segmentar es aplicar un sofisticado algoritmo, como el k-means clustering que, de alguna manera, agruparía nuestros clientes en segmentos perfectamente homogéneos.

Es también curioso que en los ejemplos de cómo aplicar la segmentación de clientes se utilizan BBDD del estilo AdventureWorks de Microsoft, donde se posee información muy detallada de clientes como número de hijos, ingresos anuales, tipo de empleo, nivel de estudios, número de coches que posee…


                                          Típico ejemplo naif de segmentación aplicada a la BBDD de AdventureWorks
 
Evidentemente esto no es nunca así, ni tan siquiera en EEUU donde las leyes son mucho más permisivas con el uso de información para marketing.
Segmentar por información demográfica o a nivel demográfico (código postal, sección censal,…) puede ser interesante pero, no provee información a nivel de cliente sino, en el mejor de los casos  provee información agregada a nivel de vecindario.

La información realmente relevante para un negocio no va a venirnos dada de ninguna fuente de datos externa, por mucho dinero que nos cueste. A menos que hablemos de un negocio recién arrancado, nuestras fuentes más valiosas de conocimiento vendrán de los sistemas de las empresa (operacionales, sistemas de CRM, Data Warehouses,…).
Las verdaderas perlas de conocimiento de un negocio, como son los hábitos de compra de nuestros clientes, solo aparecen después de años de actividad y cientos de miles de transacciones donde lenta e inexorablemente se irán perfilando patrones o tendencias, es decir, información extrapolable a conocimiento dentro del ruido general.

Con información de este estilo más un conocimiento muy profundo del mercado, canales y la competencia donde trabajas es con lo que se pueden hacer campañas de marketing directo que garanticen un mínimo de éxito y rentabilidad.
 
Volviendo al tema de la segmentación, hay agrupaciones que surgen de forma “natural” en función del negocio en el que trabajamos. En el mundo del retailing es muy común encontrarse con algunas de este estilo:
 
 
Es importante, como explicaré en una entrada posterior, partir de una adecuada definición de categorías y subcategorías de productos/servicios. Estos son al fin y al cabo nuestros outputs a nivel de negocio. A medida que nuestros clientes los van adquiriendo nos permiten segmentar a estos últimos en clientes de productos de salud, belleza, fitness,…
Con el tiempo, la información de hábitos de compra, respuesta a campañas o promociones, gestiones con atención al cliente, más otra información de carácter financiero nos permitirán obtener el llamado “customer value” de nuestro cliente.
Dentro de mi experiencia en clientes del sector retailing, tal vez las casuísticas más interesantes se me han presentado en el mundo del Home Shopping o TeleTienda. Este tipo de retailing es bastante distinto al que podríamos llamar más tradicional, pero también mucho más dinámico e interesante.
¿Qué caracteriza este tipo de canal? ¿En qué se diferencia de aquellos más convencionales?
Bien, como leí recientemente en un libro sobre el tema de Nick Romer: “Make millions selling on QVC” vender por un canal de Teletienda es como tener tu producto al lado de la caja registradora, donde cientos de miles de personas están de pie observándolo mientras esperan en la cola para pagar.
Es un área interesante, pero es compleja, influye mucho la ciencia del comportamiento, como veremos en próximas entradas.

Les adelantaré aquí que influye mucho lo que se denomina el efecto expectativa. Las expectativas influyen,en gran medida, en las percepciones y el comportamiento. Si explicamos a un nutrido grupo de personas que un producto nuevo va a cambiar sus vidas (su aspecto físico, su vitalidad o su calidad de vida), un número significativo de ellas experimentará ese cambio.  La creencia actúa así como un instrumento que ayuda a provocar el cambio. Con un convincente infomercial una persona puede creer que algo va a ocurrir (adelgazar, moldear sus abdominales,…), la idea por sí misma crea esa posibilidad.

Es importante pues, a través de los canales correspondientes, convencer y establecer las expectativas de un modo creíble al destinatario en lugar de dejar que éstos lleguen a conclusiones sesgadas.

En resumen,
-         La segmentación es un negocio “real” debe estar basada en variables de comportamiento de compra del usuario, las variables sociodemográficas, en caso de poderse obtener, deben servir para complementar el perfil de nuestros clientes.
-        Muchas veces, la segmentación de nuestros clientes vendrá condicionada por la categorización que tengamos en nuestro portfolio de productos.
-         Para emprender acciones comerciales de marketing directo, necesitaremos poder puntuar a nuestros clientes a través de KPI’s o indicadores que midan principalmente la rentabilidad de nuestro clientes. Es necesario calcular un customer value.
-         La venta de Home Shopping es un tipo de retailing muy característico relativamente poco estudiado y que requiere de un conocimiento de ciencias del comportamiento.