Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

santind2

Gerar relatório em html para enviar por email sem cursor

Recommended Posts

Boa tarde pessoal,

Estou precisando mudar uma SP que tenho.
Essa minha SP cria um codigo html que pelo cursor ele popular as tags td.
Só que eu não quero utilizar cursor. Queria achar um outro meio de conseguir popular as tags sem utilizar cursor para isso.
Penso que seja possível só não sei como fazer. kk

Desde já agradeço..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde A.Jr,

 

Ontem mesmo eu testei e ficou da forma que eu queria, porém, agora estou com um outro problema.

Minha primeira consulta, gera 933 registros e a variável de email está como @EMAIL NVARCHAR(MAX).

Ele chega a executar 933 vezes, porém o que me retorna nessa variável é menos de 70. É como se em uma quantidade x de registro ele não consegue suportar mais nenhum.

 

Estou postando o código

 -- VARIAVEIS EXCLUSIVA DO EMAIL  
 DECLARE  @COUNT		INT
		,@EMAIL			NVARCHAR(MAX)
		,@EMAIL_DEST	VARCHAR(50)  
		,@ASSUNTO		VARCHAR(100)
  
 -- EMAIL DAS PESSOAS QUE RECEBERAM O EMAIL  
 SET @EMAIL_DEST = 'emailDest@mail'
  
 -- ASSUNTO DO EMAIL
 SET @ASSUNTO = 'Assunto'  
 

--INICIO DO CORPO DO EMAIL 
SET ROWCOUNT 0

SELECT 
	DESCRI    
   ,NREDUZ    
   ,MATRICULA    
   ,NOME    
   ,NOMUSR    
   ,DESCRI    
   ,DE_ANT    
   ,DE_NOV    
   ,NASC    
   ,ANTIGO    
   ,VL_NOVO    
   ,PERCENTUAL    
   ,ENDER
   ,NUM_END    
   ,COMPL
   ,BAIRRO    
   ,MUN    
   ,EST    
   ,CEP  
   ,EMAIL
   ,DDDC_ELU
   ,FONE_CELU
INTO ##TEMP_PERFORMANCE
FROM PERFORMANCE  

SET ROWCOUNT 1

SELECT @COUNT = COD FROM ##TEMP_PERFORMANCE

SET @EMAIL =  '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> '    
			+'<html xmlns="http://www.w3.org/1999/xhtml"> '    
			+'  <head> '
			+'   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> '    
			+'   <title>Untitled Document</title> '    
			+' </head> '    
			+' <body> '    
			+'  <div style="width: 689px; height: 80px;"> '    
			+'		<img src="topo.png" width="800" height="83" alt="" />'
			+'  </div> '
			+'    <table width="774" Cellspacing="0" Cellpadding="2" border="1" style="text-align:center; background-color: #F2F2F2; margin-left: 2px; padding: 1px; font-family: Arial, Verdana; font-size: 11px"> '
			+'     <tr> '    
			+'      <th width="350">descri</th>'    
			+'      <th width="400">opera</th>'    
			+'      <th width="100">Matrícula		</th>'    
			+'      <th width="40" >Titular			</th>'    
			+'      <th width="350">Nome			</th>'    
			+'      <th width="350">Grau Parentesco	</th>'    
			+'      <th width="400">Idade anterior	</th>'    
			+'      <th width="100">Idade nova		</th>'    
			+'      <th width="40" >Data Nasc.		</th>'    
			+'      <th width="350">Valor antigo	</th>'    
			+'      <th width="350">Valor novo		</th>'    
			+'      <th width="400">Percentual		</th>'         
			+'      <th width="100">E-mail			</th>'    
			+'      <th width="40" >DDD				</th>'    
			+'      <th width="350">Tel. Cel.		</th>'         
			+'      <th width="100">Endereço		</th>'    
			+'      <th width="40" >Nº End.			</th>'    
			+'      <th width="350">Comp. End.		</th>'    
			+'      <th width="350">Bairro			</th>'    
			+'      <th width="400">Cidade			</th>'    
			+'      <th width="400">UF				</th>'    
			+'      <th width="400">CEP				</th>'
			+'     </tr> '
WHILE @@ROWCOUNT <> 0
BEGIN
	SET ROWCOUNT 0
		  SET @EMAIL = @EMAIL 
			+'     <tr> '
			+'      <td>'+ (SELECT DESCRI    	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT NREDUZ    	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT MATRICULA 	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT NOME    	 	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT NOMUSR    	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT DESCRI    	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT DE_ANT    	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT DE_NOV    	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT NASC    		FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT ANTIGO    	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT VL_NOVO   	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT PERCENTUAL	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT ENDER	 	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT NUM_END   	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT COMPL		FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT BAIRRO    	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT MUN    		FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT EST    		FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT CEP  		FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT EMAIL		FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT DDDC_ELU		FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'      <td>'+ (SELECT FONE_CELU	FROM ##TEMP_PERFORMANCE WHERE COD = @COUNT) +'</td>'
			+'     </tr> ' 

		DELETE ##TEMP_PERFORMANCE WHERE COD = @COUNT
	SET ROWCOUNT 1
		SELECT @COUNT = COD FROM ##TEMP_PERFORMANCE
END
 SET ROWCOUNT 0

 SET @EMAIL = @EMAIL   
      +'  </table> '  
      +'  <div style="width: 689px; height: 45px;"> '  
      +'   <img src="base.png" width="800" height="48" />'  
      +'  </div> '  
       +'  <div style="margin-left: 10px;font-family: Arial, Verdana; font-size: 10px;"><b>NOME ENDE</b><br> '   
      +'   ENDEREÇO '  
      +'  </div> '   
      +' </body> '   
       +'</html> '
  SELECT @EMAIL

-- DISPARA O E-MAIL 
  
 DROP TABLE ##TEMP_PERFORMANCE

Desde já fico agradecido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Voce pode estar com limitação para exibir os resultados somente.

Na hora de executar, peça para salvar o resultado em csv ao inves de exibir em GRID ou texto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então,

 

Tentei aqui, só que não vai dar certo. Vou mandar isso por email. O que acho engraçado é que com cursor funciona, mas estou muito relutante em deixar com cursor, pois com essa solução ganhei muito tempo na execução.

Tentei utlizar na variável @email o valor NTEXT, porém, descobri que ele não funciona para variáveis locais.

Para funcionar legal, só preciso achar uma maneira de receber alem do valor máximo de varchar ou nvarchar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou postar a solução e no próximo post eu comento ...vlw

-- VARIAVEIS EXCLUSIVA DO EMAIL
DECLARE @COUNT INT
,@EMAIL NVARCHAR(MAX)
,@EMAIL_DEST VARCHAR(50)
,@ASSUNTO VARCHAR(100)
-- EMAIL DAS PESSOAS QUE RECEBERAM O EMAIL
SET @EMAIL_DEST = 'emailDest@mail'
-- ASSUNTO DO EMAIL
SET @ASSUNTO = 'Assunto'
--INICIO DO CORPO DO EMAIL
SET ROWCOUNT 0
DECLARE @TEMP_PERFORMANCE TABLE (
DESCRI
,NREDUZ
,MATRICULA
,NOME
,NOMUSR
,DESCRI
,DE_ANT
,DE_NOV
,NASC
,ANTIGO
,VL_NOVO
,PERCENTUAL
,ENDER
,NUM_END
,COMPL
,BAIRRO
,MUN
,EST
,CEP
,EMAIL
,DDDC_ELU
,FONE_CELU
,NUMLINHA INT IDENTITY (1,1)
)
INSERT INTO @TEMP_PERFORMANCE
(DESCRI
,NREDUZ
,MATRICULA
,NOME
,NOMUSR
,DESCRI
,DE_ANT
,DE_NOV
,NASC
,ANTIGO
,VL_NOVO
,PERCENTUAL
,ENDER
,NUM_END
,COMPL
,BAIRRO
,MUN
,EST
,CEP
,EMAIL
,DDDC_ELU
,FONE_CELU
)
SELECT
DESCRI
,NREDUZ
,MATRICULA
,NOME
,NOMUSR
,DESCRI
,DE_ANT
,DE_NOV
,NASC
,ANTIGO
,VL_NOVO
,PERCENTUAL
,ENDER
,NUM_END
,COMPL
,BAIRRO
,MUN
,EST
,CEP
,EMAIL
,DDDC_ELU
,FONE_CELU
FROM PERFORMANCE
SET ROWCOUNT 1
SELECT @COUNT = COD FROM @TEMP_PERFORMANCE
SET @EMAIL = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> '
+'<html xmlns="http://www.w3.org/1999/xhtml"> '
+' <head> '
+' <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> '
+' <title>Untitled Document</title> '
+' </head> '
+' <body> '
+' <div style="width: 689px; height: 80px;"> '
+' <img src="topo.png" width="800" height="83" alt="" />'
+' </div> '
+' <table width="774" Cellspacing="0" Cellpadding="2" border="1" style="text-align:center; background-color: #F2F2F2; margin-left: 2px; padding: 1px; font-family: Arial, Verdana; font-size: 11px"> '
+' <tr> '
+' <th width="350">descri</th>'
+' <th width="400">opera</th>'
+' <th width="100">Matrícula </th>'
+' <th width="40" >Titular </th>'
+' <th width="350">Nome </th>'
+' <th width="350">Grau Parentesco </th>'
+' <th width="400">Idade anterior </th>'
+' <th width="100">Idade nova </th>'
+' <th width="40" >Data Nasc. </th>'
+' <th width="350">Valor antigo </th>'
+' <th width="350">Valor novo </th>'
+' <th width="400">Percentual </th>'
+' <th width="100">E-mail </th>'
+' <th width="40" >DDD </th>'
+' <th width="350">Tel. Cel. </th>'
+' <th width="100">Endereço </th>'
+' <th width="40" >Nº End. </th>'
+' <th width="350">Comp. End. </th>'
+' <th width="350">Bairro </th>'
+' <th width="400">Cidade </th>'
+' <th width="400">UF </th>'
+' <th width="400">CEP </th>'
+' </tr> '
WHILE EXISTS (SELECT '' FROM @TEMP_PERFORMANCE WHERE NUMLINHA = @COUNT)
BEGIN
SET ROWCOUNT 0
SET @EMAIL = @EMAIL + (
SELECT ' <tr> '
+' <td>'+ DESCRI +'</td>'
+' <td>'+ NREDUZ +'</td>'
+' <td>'+ MATRICULA +'</td>'
+' <td>'+ NOME + +'</td>'
+' <td>'+ NOMUSR +'</td>'
+' <td>'+ DESCRI +'</td>'
+' <td>'+ DE_ANT +'</td>'
+' <td>'+ DE_NOV +'</td>'
+' <td>'+ NASC +'</td>'
+' <td>'+ ANTIGO +'</td>'
+' <td>'+ VL_NOVO +'</td>'
+' <td>'+ PERCENTUAL +'</td>'
+' <td>'+ ENDER +'</td>'
+' <td>'+ NUM_END +'</td>'
+' <td>'+ COMPL +'</td>'
+' <td>'+ BAIRRO +'</td>'
+' <td>'+ MUN +'</td>'
+' <td>'+ EST +'</td>'
+' <td>'+ CEP +'</td>'
+' <td>'+ EMAIL +'</td>'
+' <td>'+ DDDC_ELU +'</td>'
+' <td>'+ FONE_CELU +'</td>'
+' </tr> '
FROM @TEMP_PERFORMANCE WHERE NUMLINHA = @COUNT)
SET ROWCOUNT 1
END
SET ROWCOUNT 0
SET @EMAIL = @EMAIL
+' </table> '
+' <div style="width: 689px; height: 45px;"> '
+' <img src="base.png" width="800" height="48" />'
+' </div> '
+' <div style="margin-left: 10px;font-family: Arial, Verdana; font-size: 10px;"><b>NOME ENDE</b><br> '
+' ENDEREÇO '
+' </div> '
+' </body> '
+'</html> '
SELECT @EMAIL
-- DISPARA O E-MAIL
DROP TABLE ##TEMP_PERFORMANCE


Como costumo falar não sou dono da verdade logo pode não ser a melhor solução, mas é o que eu uso..

 

1- Trocar cursor por tabela temporária é quase trocar 6 por meia dúzia, pois tabela temporária dá queda de performance também

 

Gosto de usar variáveis do tipo tabela, pois usa memória, mas ao fim do procedimento ela some, e se uso muitas vezes crio um tipo igualzinho a tabela

 

2 - Inseri na tabela temporária uma coluna numlinha para te dar o número da linha e adicionei um contador...

 

3 - Na cláusula while troquei por um exists que verifica se ainda existe um número de linha como contador máximo (variável @count)

 

Não coloquei set @count += 1 no fim do looping, coloca senão fica até o fim do mundo rodando...kkkkkk...só vi depois

 

4 - Não precisa fazer aqueles select's concatenando aquilo dá queda de performance faz só um

 

5 - faz tratamento de nulidade com is null pois se o banco estiver configurado pra nulo concatenado é nulo sua string ficará nula...

 

Espero ter ajudado um pouco

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Daniel LM Costa,

 

Realmente me ajudou muito em questão de performance, porém meu problema continua na quantidade de caracteres que passa do limite máximo do VARCHAR ou NVARCHAR. Como falei anteriormente, já tentei utilizar o TEXT, porém sem sucesso.

Se tiver alguma ideia de como resolver essa questão fico agradecido.

Vou continuar pensando em alguma solução para implementar a nova forma que está o código, pois se não conseguir vai ter que ser no cursor mesmo que já está rodando com precisa.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma idéia é você dar um print na variável email, para tentar verificar em qual momento ele para de concatenar, o que quero dizer é que em algum momento esse sql que forma a linha pode não estar retornando resultado.

 

Uma boa forma de confirmar isso é vendo se o fim do email é printado o </table>

Compartilhar este post


Link para o post
Compartilhar em outros sites


declare

@html varchar(max),

@body varchar(max),

@titulo varchar(100),

@comeco varchar(100),

@fim varchar(100),

@eros int,

@sumario varchar(max),

@tabelahtml varchar(max),

@tabelabody varchar(max),

@html2 varchar(max),

@envio varchar(max)

 

SET @BODY = 'Corpo'

 

set @titulo = 'Titulo'

set @comeco = '<html>'

set @fim = '</table></body></html>'

set @html2 = '<br><td align=left>Favor não responder este e-mail.</td>'

set @html = '<head>

<style>' +

'td {padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:11pt; font-family: Calibri;} ' +

'.titulo{color:#ffffff}'+

'.font{color:#ffffff}'+

'H1{font-size:13pt; font-family: Calibri; color:#222222}'+

'.sucesso {background-color:#00ff00}'+

'.falha {background-color:#ff0000}'+

'</style>' +

'</head> <!-- Fecha Cabeçalho -->' +

'<body> <!-- Fecha o corpo do html -->'

 

set @tabelahtml = @BODY +

 

 

'<table cellpadding=0 cellspacing=0 border=1 bordercolor=#376091">' +

'<tr bgcolor=#0F253F class="titulo">'+

'<td align=center><b>STATUS </b></td>' +

'<td align=center><b>QUANTIDADE </b></td>'

 

select @tabelabody =

(

SELECT

[status] as td,

COUNT(*) as td

FROM tabela

GROUP BY STATUS_MAILING

ORDER BY 1,2

FOR XML RAW('tr'), ELEMENTS

)

 

set @tabelahtml = @comeco+@html+@TABELAHTML+@TABELABODY+@fim

set @envio = @tabelahtml + '<p>Favor não responder à esse e-mail<br>Qualquer dúvida, contactar a equipe responsável.</p> '

 

SET @HTML = @COMECO+@BODY+@FIM

 

EXEC @EROS = MSDB.DBO.SP_SEND_DBMAIL

@PROFILE_NAME = 'EMAIL',

@RECIPIENTS = 'Fabiano <faabiianooc@gmail.com>',

@SUBJECT = @TITULO,

@BODY = @ENVIO,

@BODY_FORMAT = 'HTML'

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.