viernes, 10 de octubre de 2014

CrystalReports y un Stored Procedure con parametro DateTime

Los que hayan intentado correr desde Crystal Reports un Stored Procedure que utilice parámetros Date o DateTime, habrán notado que sale un error ("CONVERT" algo...).

El tema es que Crystal siempre que reemplaza el parámetro le coloca CONVERT(DATETIME,'2014-01-01 00:00:00',120) lo cual *NO* es válido en un Stored Procedure en MSSQL.  Por qué? porque en un SP no se pueden utilizar funciones en los parámetros.

Afortunadamente hay un pequeño truco que pueden aplicar!

Paso 1, cambiamos o creamos nuestro SP para que el parámetro sea VARCHAR(100).  Voy a colocar un SP de ejemplo para que se hagan a la idea de lo que pueden hacer:

CREATE PROCEDURE [sysdba].[MISPROC]    @fechaini VARCHAR(100) AS
BEGIN
 SET NOCOUNT ON;
 CREATE TABLE #FECHAS(FI DATETIME)
 DECLARE @qry NVARCHAR(200)
 SET @qry = 'INSERT INTO #FECHAS (FI) VALUES (' + @fechaini + ')'
 EXEC (@qry )
 SELECT FI FROM #FECHAS
 DROP TABLE #FECHAS
END


Creo que ya deben ir notando el truco.  Sigamos.

Paso 2, Creamos nuestro reporte en Crystal.

Creamos la conexión (esto funciona usando el SalesLogix OLEDB Provider e incluso si es un reporte que usa el SQL Native Client) y seleccionamos "Agregar comando" (OJO! vamos a escribir, no confundan con seleccionar directamente el Stored Procedure de la lista que está abajo!) y escribimos el nombre de nuestro SP seguido del parámetro, pero el parámetro lo colocamos entre doble comillas (Si! dobles, no simples):

MISPROC "{?@fechaini}"

Inmediatamente, definimos el parámetro en la derecha.  En el nombre debe decir exactamente @fechaini (en el campo del query pusimos {?@fechaini}).  Además le colocamos tipo FechaHora (o Fecha).

Ahora aceptan y Crystal debería pedirles una fecha por primera vez.  La colocan y al aceptar, en la lista de tablas debería aparecerles "Comando" y dentro el (o los) campo definido (en mi ejemplo es FI).  Pueden arrastrar el campo al informe y previsualizarlo.

Cómo funciona?  Si se fijan en el código, estoy construyendo una tabla temporal para guardar el valor final del parámetro que quiero pasar al SP.  Luego construyo un query en una variable y lo ejecuto con "EXEC", así que el valor del parámetro ya estará en la tabla temporal y podré usarlo cuando quiera, ya sea directo de la tabla, o haciendo un select para asignarlo a otra variable.


No hay comentarios:

Publicar un comentario