SQL Server - Regresar texto desde un Procediemiento

 
Vista:

Regresar texto desde un Procediemiento

Publicado por Carlos Reyes (49 intervenciones) el 13/05/2009 19:18:09
Hola a todos, recurro al foro por que tengo la siguiente duda, no se como atacar el problema que me surgio, espero me puedan ayudar.

El siguiente SP ya es funcional, el unico inconveniente es que en ocasiones la cadena de texto dinamica que se genera excede los 8000 caracteres, estoy trabajando en SQL 2000, por lo que esta es la limitante de los varchar, requiero que me genere un objeto de texto y se regrese este, el problema es que no puedo declarar variables de tipo texto, no es valido y segun tengo entendido unicamente se puede escribir texto en tablas, ¿alguna idea de como solucionarlo?, ademas el dato tiene que ser volatil, es decir, que se genere en tiempo de ejecucion y se elimine despues de ejecutarse sin causar errores de que ya existe un determinado objeto en la base ya que el proceso es concurrente, segun yo tendria que transformarlo a Procedimiento almacenado.

CREATE FUNCTION [dbo].[fun_obtieneCotizacionesBenchmark](@Cotizacion INT)
RETURNS VARCHAR(8000)
AS
BEGIN

DECLARE @Paquete VARCHAR(15),
@Nombre VARCHAR(150),
@SumaAsegurada VARCHAR(20),
@Deducible VARCHAR(20),
@Prima VARCHAR(20),
@Aseguradora VARCHAR(15),
@TotRegistros INT,
@RegActual INT,
@NumAsegAnt VARCHAR(15),
@NumAsegAct VARCHAR(15),
@PaqueteAnt VARCHAR(15),
@PaqueteAct VARCHAR(15)

DECLARE @htmlSpan VARCHAR(8000),
@htmlCob VARCHAR(8000),
@htmlCompleto VARCHAR(8000)

SET @htmlSpan = ''
SET @htmlCob = ''
SET @htmlCompleto = ''
SET @RegActual = 0

SELECT @TotRegistros = COUNT(cc.CotizacionID)
FROM necoberturascotizacion cc
INNER JOIN elementos e
ON cc.CoberturaID = e.ElementoID
INNER JOIN nePrimasCotizacion pc
ON cc.CotizacionID = pc.CotizacionID
AND cc.Numero = pc.Numero
WHERE cc.CotizacionID = @Cotizacion

DECLARE cur_CoberturasCot CURSOR FOR

SELECT pc.AseguradoraID,
--cc.CotizacionID,
--cc.Numero,
--pc.ProductoID,
pc.PaqueteID,
e.Nombre AS Cobertura,
CONVERT(VARCHAR,cc.SumaAsegurada) AS SumaAsegurada,
CASE WHEN CONVERT(VARCHAR,cc.Deducible) = 0 THEN '-'
ELSE CONVERT(VARCHAR,cc.Deducible) + ' %' END AS Deducible,
CONVERT(VARCHAR,CONVERT(MONEY,cc.PrimaNeta),1) AS Prima
FROM necoberturascotizacion cc
INNER JOIN elementos e
ON cc.CoberturaID = e.ElementoID
INNER JOIN nePrimasCotizacion pc
ON cc.CotizacionID = pc.CotizacionID
AND cc.Numero = pc.Numero
WHERE cc.CotizacionID = @Cotizacion
GROUP BY pc.AseguradoraID,cc.CotizacionID,cc.Numero,pc.PaqueteID,e.Nombre,cc.SumaAsegurada,cc.Deducible,cc.PrimaNeta

OPEN cur_CoberturasCot

FETCH NEXT FROM cur_CoberturasCot INTO @Aseguradora,@Paquete,@Nombre,@SumaAsegurada,@Deducible,@Prima
SET @htmlSpan = '<span id = detalle' + @Paquete + @Aseguradora + ' style=visibility:hidden>'+
'<table border = 0 class=LetraAzul-8 width=446>'+
'<tr bgcolor = #336799 width = 448 align = center>'+
'<td colspan = 2><font color = white><b>Cobertura</b></font></td>'+
'<td colspan = 2><font color = white><b>Suma Asegurada</b></font></td>'+
'<td colspan = 2><font color = white><b>Deducible</b></font></td>'+
'<td colspan = 2><font color = white><b>Prima</b></font></td>'+
'</tr>'



SET @htmlCob = '<tr>'+
'<td colspan = 2 bgcolor = whitesmoke>'+@Nombre+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@SumaAsegurada+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Deducible+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Prima+'</td>'+
'</tr>'

SET @htmlCompleto = @htmlCompleto + @htmlSpan + @htmlCob

SET @RegActual = @RegActual + 1
SET @NumAsegAnt = @Aseguradora
SET @NumAsegAct = @Aseguradora
SET @PaqueteAnt = @Paquete
SET @PaqueteAct= @Paquete

--print 'Entra ' + CONVERT(varchar,@RegActual)
--print @htmlSpan
WHILE @@FETCH_STATUS = 0
BEGIN
SET @NumAsegAnt = @Aseguradora
SET @PaqueteAnt = @Paquete
FETCH NEXT FROM cur_CoberturasCot INTO @Aseguradora,@Paquete,@Nombre,@SumaAsegurada,@Deducible,@Prima
SET @NumAsegAct = @Aseguradora
SET @PaqueteAct = @Paquete
IF (@NumAsegAnt <> @NumAsegAct) OR (@PaqueteAnt<>@PaqueteAct)
SET @htmlCob = '<span id = detalle' + @PaqueteAct + @NumAsegAct + ' style=visibility:hidden>'+
'<table border = 0 class=LetraAzul-8 width=446>'+
'<tr bgcolor = #336799 width = 448 align = center>'+
'<td colspan = 2><font color = white><b>Cobertura</b></font></td>'+
'<td colspan = 2><font color = white><b>Suma Asegurada</b></font></td>'+
'<td colspan = 2><font color = white><b>Deducible</b></font></td>'+
'<td colspan = 2><font color = white><b>Prima</b></font></td>'+
'</tr>'+
'<tr>'+
'<td colspan = 2 bgcolor = whitesmoke>'+@Nombre+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@SumaAsegurada+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Deducible+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Prima+'</td>'+
'</tr>'
ELSE
SET @htmlCob = '<tr>'+
'<td colspan = 2 bgcolor = whitesmoke>'+@Nombre+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@SumaAsegurada+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Deducible+'</td>'+
'<td colspan = 2 align = right bgcolor = aliceblue>'+@Prima+'</td>'+
'</tr>'

IF @RegActual = @TotRegistros
SET @htmlCompleto = @htmlCompleto + '</td></tr></table></span>'
ELSE
SET @htmlCompleto = @htmlCompleto + @htmlCob

SET @RegActual = @RegActual + 1

-- print 'Entra ' + CONVERT(varchar,@RegActual)
-- print @htmlCompleto
END
CLOSE cur_CoberturasCot
DEALLOCATE cur_CoberturasCot
RETURN @htmlCompleto
END

Espero me puedan ayudar, me urge!!!

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Regresar texto desde un Procediemiento

Publicado por pacopaz (131 intervenciones) el 13/05/2009 20:51:42
Algunas soluciones al respecto podrían variar, de caso a caso. Podrías mandar el resultado de un query a xml y que la página, através de ajax (simple javascript que lea xml) forme la página. Sinceramente es bastante más recomendable que hacer todo esto.
Pero si no es posible (por que se tengan que almacenar demasiados xml o cosas así), entonces, utilizar css para cada tipo de celda (tag td) animora la cantidad de caracteres ocupados para definir las celdas.
Si tu archivo html tuviera en el encabezado el css para los tipos de celda (reconozco dos aquí, una con letras en blanco y otra con fondo azul, no más de leerlo de prisa) en vez de poner
<td colspan = 2><font color = white><b>Cobertura</b></font></td>
y
<td colspan = 2 align = right bgcolor = aliceblue> + [variable] + </td>
pondrías
<td colspan=2 class="blanco">Cobertura</td>
y
<td colspan=2 class="azul"> + [variable] + </td>
respectivamente, ahorrandote unos 21 caracteres por celda, multiplicado por 4 celdas por renglon, son unos 84 caracteres por renglón.
Así, creo que tu procedimiento podría mandar el resultado de un 20 a un 25% más de información, según mis cálculos.
Para lograrlo, en tu página de html, se puede asignar algo como esto:
<HEAD>
<STYLE type="text/css">
td.blanco {color: white; font-weight: bold;}
td.azul {text-align: rigth; background-color: aliceblue;}
</STYLE>
</HEAD>
<BODY>
...

Si aún así no se resuelve, creo que será hora de pensar en pasar toda la logística para la creación de tu tabla a tu aplicativo (que sería la mejor opción desde el principio), por que en sql server 2000, las variables tipo texto, incluso como parámetros, son readonly, por lo que no podrías, siquiera, usarlo como parametro tipo output.

Espero que te sirva.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar