Ir para conteúdo

POWERED BY:

Arquivado

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

marcelocardoso

[Resolvido] Aniversariantes do dia

Recommended Posts

Pessoal!

Estou novamente buscando ajuda dos colegas, procurei na internet, mas não consegui muita coisa sobre o assunto, apenas exibir os aniversariantes do mês, da semana e etc...

Mas estou precisando criar um script que verifica os seguintes campos no banco:

 

- nome

- email

- nascimento

 

preciso montar um script que envie para os aniversariantes um email um dia antes do seu aniversario, como devo proceder em termos de código.

alguém tem algo para indicar, script ou algo afim,

 

Sei que tenho que fazer um select pela data de NASCIMENTO, e testar se ela é menor que a data do aniversario, e assim enviar o email.

Mas como fazer para o script rodar automaticamente?

 

Tem alguma coisa para se fazer neste sentido?

 

Aguardo sugestões dos colegas, se tiverem exemplos agradeço também.

 

Obrigado.

 

Pessoal!

 

Como posso fazer meu SELECT para comparar a:

 

DATA ATUAL com a do BANCO (no caso a data do aniversario do cara) e ver se a data esta igual a data de aniverario dele, tipo:

 

Se a data de aniversario do cara for 16/08/1980, como fazer o select se estamos no ano de 2012 saber que no dia 16/08 ele está de aniversario?????

Como fazer este SELECT????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal!

 

Como posso fazer meu SELECT para comparar a:

 

DATA ATUAL com a do BANCO (no caso a data do aniversario do cara) e ver se a data esta igual a data de aniverario dele, tipo:

 

Se a data de aniversario do cara for 16/08/1980, como fazer o select se estamos no ano de 2012 saber que no dia 16/08 ele está de aniversario?????

Como fazer este SELECT????

 

<%
varDiaAtual = day(date())
varMesAtual = month(date())

strSql = "Select * from aniversariantes where DAY(nascimento)="& varDiaAtual &" and MONTH(nascimento)="& varMesAtual
...
%>

 

Isto deve resolver.

 

Abços

Compartilhar este post


Link para o post
Compartilhar em outros sites

tentei fazer deste jeito antes do colega grégorio postar, mas acho que não está correto.

 

<!--#include file="conexao.asp" -->
<%
Session.LCID = 1046 'BR-PT (Padrão Portugues/Brasileiro)

SQL = "SELECT * FROM EMAILS"
SET ANIVERSARIANTES = Server.CreateObject("ADODB.Recordset")
    ANIVERSARIANTES.Open SQL, CX
 IF ANIVERSARIANTES.EOF THEN  'Se não encontrou registros escreva
    Response.Write "não tem registros no banco de dados"
    	ELSE 'Se encontrou registros escreva

		 data_banco_dia = right((left((ANIVERSARIANTES("NASC")),2)),2)
		 data_banco_mes = right((left((ANIVERSARIANTES("NASC")),5)),2)	 
		 data_atual_dia = right((left((date()),2)),2)
		 data_atual_mes = right((left((date()),5)),2)

	  DO WHILE NOT ANIVERSARIANTES.EOF 'Faça enquanto existir registros
			IF data_banco_dia = data_atual_dia AND data_banco_mes = data_atual_mes THEN
		 	   response.write "envia email"
	        END IF
	  ANIVERSARIANTES.MoveNext
	  LOOP
 END IF

   ANIVERSARIANTES.Close
SET ANIVERSARIANTES = NOTHING
   CX.Close
SET CX = NOTHING
%>

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal!

 

consegui terminar o script assim deste jeito:

SESSION.LCID = 1046 'BR-PT (Padrão Portugues/Brasileiro)

SQL = "SELECT * FROM EMAILS WHERE DAY(NASC) = "& day(date()) &" AND MONTH(NASC) = " & month(date())
SET ANIVERSARIANTES = SERVER.CreateObject("ADODB.RECORDSET")
   ANIVERSARIANTES.OPEN SQL, CX
IF ANIVERSARIANTES.EOF THEN 'se não encontrou registro
   ELSE
	DO WHILE NOT ANIVERSARIANTES.EOF 'faça enquanto existir registros
		 data_banco_dia = right((left((ANIVERSARIANTES("NASC")),2)),2)
		 data_banco_mes = right((left((ANIVERSARIANTES("NASC")),5)),2)	 
		 data_atual_dia = right((left((date()),2)),2)
		 data_atual_mes = right((left((date()),5)),2)
	  IF data_banco_dia = data_atual_dia AND data_banco_mes = data_atual_mes THEN
		 SET cdoConfig = Server.CreateObject("cdo.configuration")
			 SMTP = "smtp.teste.com.br" 	'informacoes do seu servidor SMTP
			 USER = "teste@teste.com.br" 	'conta de e-mail utilizada para enviar
			 PASS = "teste"  			'senha da conta de e-mail

				cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
				cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
				cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = SMTP
				cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
				cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
				cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = USER
				cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = PASS
				cdoConfig.Fields.Update

			SET cdoMessage1 = Server.CreateObject("cdo.message")
			SET cdoMessage1.Configuration 	 = cdoconfig
				cdoMessage1.BodyPart.Charset = "ISO-8859-1"
				cdoMessage1.From 			 = ANIVERSARIANTES("EMAIL")
				cdoMessage1.To 			 = "teste@teste.com.br"
				cdoMessage1.Subject 		 = ""
				cdoMessage1.HTMLBody 		 = ""
				cdoMessage1.Send
			SET cdoMessage1 				 = NOTHING
			SET cdoConfig   				 = NOTHING
	  END IF
	ANIVERSARIANTES.MoveNext
	LOOP
END IF

   ANIVERSARIANTES.Close
SET ANIVERSARIANTES = NOTHING
   CX.Close
SET CX = NOTHING

 

 

Só agora preciso fazer um controle, tipo:

O script vai ser colocado como alternativa numa página principal do site, que é a mais visitada... aí ele carrega este script de aniversariantes, mas não sei fazer a parte abaixo, descrita.

 

Se o script já foi rodado uma vez no dia, e enviou os emails, no carregamento da página, teria que barrar, tipo não FAZER NADA neste dia mais, apenas no outro.

Como posso montar alguma coisa para isso ser contornado???

 

Alguém...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existem recursos no próprio server de hospedagem para executar esse tipo de operação.

 

Caso não consiga assim, você pode utilizar uma variável APPLICATION para controlar o envio armazenando a data e comparando com a data atual Now().

 

PS: Utilize dateDiff para verificação entre as datas, caso a diferença de dias seja maior ou igual a 1 então você dispara o procedimento.

 

Não sei qual DB você está utilizando, mas você pode fazer essas comparações de datas diretamente nas consultas ao invés de fazer no asp.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu uso assim:

 

<%



mTitleColor = "DARKRED" 
mHeaderColor = "DARKBLUE" 
mYearColor = "DARKBLUE" 
mTextColor = "#069" 
mTitle = "Aniversariantes do Mês: " 

mDataBaseDir = "Today.mdb" 


function toLongMonth(pInInteger)

mMonth = "Não encontrado"

if isNumeric(pInInteger) then
select case pInInteger
case 1: mMonth = "Janeiro"
case 2: mMonth = "Fevereiro"
case 3: mMonth = "Março"
case 4: mMonth = "Abril"
case 5: mMonth = "Maio"
case 6: mMonth = "Junho"
case 7: mMonth = "Julho"
case 8: mMonth = "Augosto"
case 9: mMonth = "Setembro"
case 10: mMonth = "Outubro"
case 11: mMonth = "Novembro"
case 12: mMonth = "Dezembro"
end select
end if

toLongMonth = mMonth

end function


set connGlobal = server.createobject("ADODB.Connection")
connGlobal.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ= " & server.mappath(mDataBaseDir)


mSQL = "SELECT his_type, his_day, his_desc FROM UNV_HISTORY " & _
" WHERE his_day = datepart('d', date()) " & _
" AND his_month = datepart('m', date()) " & _
" ORDER BY his_day, his_desc "


set rsGlobal = connGlobal.execute(mSQL)


response.write "<FONT>" & mTitle & _
toLongMonth(datepart("m", date())) & _
" " & datepart("yyyy", date()) & _
"</FONT>

"


response.write "<FONT>Parabéns:</FONT>"

mType = "B"


response.write "<TABLE>"

while not rsGlobal.eof


'if rsGlobal("his_type") </TABLE>

Compartilhar este post


Link para o post
Compartilhar em outros sites

application pode ser utilizada para armazenar dados da aplicação que não se perdem na mudança de sessão. Você pode criar uma variável do tipo application com a data do último envio:

 

application("LastSend")=31/08/2012

 

Sempre antes de executar novamente seu procedimento você compara o valor da variável com a data atual:

If DateDiff(d,application("LastSend"),Now())>1 Then

'Executa função

 

'Atualiza valor da variável novamente

application("LastSend") = Now()

End If

 

Isso garante que seu procedimento seja executado apenas uma vez ao dia, dá uma olhada no dateDiff também.

 

link para conferência:

http://www.w3schools.com/asp/asp_applications.asp

 

Para esses casos eu sempre utilizo o recurso de agendamento de procedimentos do próprio server de hospedagem, mas utilizar uma variável application funciona bem também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal!

 

Tentei adaptar meu código, olha como ficou com o DATEDIFF, mas está dando erro nele:

Segue código:

<%
Data = Date()
Application("ProximaData") = Data

'Sempre antes de executar novamente seu procedimento você compara o valor da variável com a data atual:
IF DateDiff(Data,Application("ProximaData"),Now()) > 1 THEN

	SESSION.LCID = 1046 'BR-PT (Padrao Portugues/Brasileiro)

	SQL = "SELECT * FROM EMAILS WHERE DAY(NASC) = "& day(date()) &" AND MONTH(NASC) = " & month(date())
	SET ANIVERSARIANTES = SERVER.CreateObject("ADODB.RECORDSET")
		ANIVERSARIANTES.OPEN SQL, CX
		IF ANIVERSARIANTES.EOF THEN 'se nao encontrou registro
		   ELSE
			DO WHILE NOT ANIVERSARIANTES.EOF 'faca enquanto existir registros
				 data_banco_dia = right((left((ANIVERSARIANTES("NASC")),2)),2)
				 data_banco_mes = right((left((ANIVERSARIANTES("NASC")),5)),2)	 
				 data_atual_dia = right((left((date()),2)),2)
				 data_atual_mes = right((left((date()),5)),2)
			  IF data_banco_dia = data_atual_dia AND data_banco_mes = data_atual_mes THEN
				 SET cdoConfig = Server.CreateObject("cdo.configuration")
					 SMTP = "smtp.teste.com.br" 	'informacoes do seu servidor SMTP
					 USER = "teste@teste.com.br" 	'conta de e-mail utilizada para enviar
					 PASS = "teste"  			'senha da conta de e-mail

						cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") 			  = 2
						cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") 	  = 1
						cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") 			  = SMTP
						cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") 		  = 25
						cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
						cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername")          = USER
						cdoConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword")          = PASS
						cdoConfig.Fields.Update

					SET cdoMessage1 = Server.CreateObject("cdo.message")
					SET cdoMessage1.Configuration 	 = cdoconfig
						cdoMessage1.BodyPart.Charset = "ISO-8859-1"
						cdoMessage1.From 			 = ANIVERSARIANTES("EMAIL")
						cdoMessage1.To 				 = "teste@teste.com.br" 'teste@teste.com.br
						cdoMessage1.Subject 		 = "DESEJA UM FELIZ ANIVERSÁRIO"

						cdoMessage1.HTMLBody 		 = codigohtml
						cdoMessage1.Send
					SET cdoMessage1 				 = NOTHING
					SET cdoConfig   				 = NOTHING
			  END IF
			ANIVERSARIANTES.MoveNext
			LOOP
		END IF

		ANIVERSARIANTES.Close
	SET ANIVERSARIANTES = NOTHING
		CX.Close
	SET CX = NOTHING

'Atualiza o valor da variável novamente após executada o envio no dia
Application("ProximaData") = Now()
END IF
%>

 

 

Oque tem de errado na instrução do DATEDIFF que fiz logo acima do código.

Dá o seguinte erro.

 

Erro de tempo de execução do Microsoft VBScript erro '800a0005'

Chamada de procedimento ou argumento inválido: 'DateDiff'

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O primeiro parâmetro está errado:

 

DateDiff("d",Application("ProximaData"),Now())

 

o primeiro parâmetro é o intervalo que você quer comparar (hora, dia, ...)

 

Acredito que sua lógica não irá funcionar, faça o seguinte antes da comparação:

Caso a variável esteja vazia é porque não foi executado nenhuma vez, então altera seu valor para a data atual menos 2 dias para executar o procedimento

 


if Not Isdate(Application("ProximaData")) Then Application("ProximaData") = DateAdd("d", -2, Now()) 

If DateDiff("d",Application("ProximaData"),Now()) > 1 then

End If

 

Apenas verifique se os parâmetros de startDate e enddate do dateDiff estão corretos, caso não então você deve inverter.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega!

 

Não entendi muito tua lógica, tentei fazer assim, mas mesmo assim, não rola...

<%		
SESSION.LCID = 1046 'BR-PT (Padrao Portugues/Brasileiro)
APPLICATION("ProximaData") = Date()

'Sempre antes de executar novamente seu procedimento você compara o valor da variável com a data atual:
IF NOT IsDate(Application("ProximaData")) Then Application("ProximaData") = DateAdd("d", -2, Now())

	IF DateDiff("d",Application("ProximaData"),Now()) > 1 then

	SQL = "SELECT * FROM EMAILS WHERE DAY(NASC) = "& day(date()) &" AND MONTH(NASC) = " & month(date())
	SET ANIVERSARIANTES = SERVER.CreateObject("ADODB.RECORDSET")
		ANIVERSARIANTES.OPEN SQL, CX
		IF ANIVERSARIANTES.EOF THEN 'se nao encontrou registro
		   ELSE
			DO WHILE NOT ANIVERSARIANTES.EOF 'faca enquanto existir registros
				 data_banco_dia = right((left((ANIVERSARIANTES("NASC")),2)),2)
				 data_banco_mes = right((left((ANIVERSARIANTES("NASC")),5)),2)	 
				 data_atual_dia = right((left((date()),2)),2)
				 data_atual_mes = right((left((date()),5)),2)
			  IF data_banco_dia = data_atual_dia AND data_banco_mes = data_atual_mes THEN
					response.write "envia o email"
			  END IF
			ANIVERSARIANTES.MoveNext
			LOOP
		END IF

		ANIVERSARIANTES.Close
	SET ANIVERSARIANTES = NOTHING
		CX.Close
	SET CX = NOTHING


'Atualiza o valor da variável novamente após executada o envio no dia
Application("ProximaData") = Now()
END IF
%>

 

Me desculpe, mas não entendi ainda, nunca mexi com isdate, datediff

Preciso de ajuda....

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega!

 

Não entendi muito tua lógica, tentei fazer assim, mas mesmo assim, não rola...

<%		
SESSION.LCID = 1046 'BR-PT (Padrao Portugues/Brasileiro)
APPLICATION("ProximaData") = Date()

'Sempre antes de executar novamente seu procedimento você compara o valor da variável com a data atual:
IF NOT IsDate(Application("ProximaData")) Then Application("ProximaData") = DateAdd("d", -2, Now())

	IF DateDiff("d",Application("ProximaData"),Now()) > 1 then

	SQL = "SELECT * FROM EMAILS WHERE DAY(NASC) = "& day(date()) &" AND MONTH(NASC) = " & month(date())
	SET ANIVERSARIANTES = SERVER.CreateObject("ADODB.RECORDSET")
		ANIVERSARIANTES.OPEN SQL, CX
		IF ANIVERSARIANTES.EOF THEN 'se nao encontrou registro
		   ELSE
			DO WHILE NOT ANIVERSARIANTES.EOF 'faca enquanto existir registros
				 data_banco_dia = right((left((ANIVERSARIANTES("NASC")),2)),2)
				 data_banco_mes = right((left((ANIVERSARIANTES("NASC")),5)),2)	 
				 data_atual_dia = right((left((date()),2)),2)
				 data_atual_mes = right((left((date()),5)),2)
			  IF data_banco_dia = data_atual_dia AND data_banco_mes = data_atual_mes THEN
					response.write "envia o email"
			  END IF
			ANIVERSARIANTES.MoveNext
			LOOP
		END IF

		ANIVERSARIANTES.Close
	SET ANIVERSARIANTES = NOTHING
		CX.Close
	SET CX = NOTHING


'Atualiza o valor da variável novamente após executada o envio no dia
Application("ProximaData") = Now()
END IF
%>

 

Me desculpe, mas não entendi ainda, nunca mexi com isdate, datediff

Preciso de ajuda....

 

A função Isdate verifica se a variável é uma data válida, a primeira vez que você executar esse procedimento a variável application estaria vazia, então eu forcei para que se ela não fosse uma data então receberia a data atual (Now) menos 2 dias, assim na verificação se já executou uma vez ao dia iria funcionar.

 

A segunda vez que esse procedimento fosse executado a variável application seria uma data, então apenas cairia na verificação se já foi executada no dia, e só seria executada novamente no próximo dia (If dateDiff....).

 

Sacou?

 

Você não pode simplesmente atruibuir Now() toda vez para a variável application, senão seu procedimento nunca será executado.

 

não funcionou dessa forma?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ja pensou em fazer um agendamento no server ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ja pensou em fazer um agendamento no server ?

 

 

No server da Locaweb eu sei que esse tipo de operação é possível, acho que já tinha lhe falado sobre essa solução em outro momento no post.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega M TORRES.

 

Da maneira que fiz, não funcionou.

E usarei o server do UOL, entrei em contato com o atendimento de lá, e os mesmos falaram que só via script, não tem agendamentos no servidor.

Não fazem isso.

 

E quanto ao script que me passou, e como lhe passei anteriormente, não funcionou o script...

Não entra nos ifs, nem envia a mensagem....

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega M TORRES.

 

Da maneira que fiz, não funcionou.

E usarei o server do UOL, entrei em contato com o atendimento de lá, e os mesmos falaram que só via script, não tem agendamentos no servidor.

Não fazem isso.

 

E quanto ao script que me passou, e como lhe passei anteriormente, não funcionou o script...

Não entra nos ifs, nem envia a mensagem....

 

mas tu removeu essa linha do código:

APPLICATION("ProximaData") = Date()

 

se essa linha estiver no código, não funcionará.

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.