Ir para conteúdo

POWERED BY:

Arquivado

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

Ricardo Gaspar

Lembrar aniversariantes mes

Recommended Posts

Bem, vamos ver se conseguem dar-me umas pequenas luzes de como resolver ou então uma maneira mais pratica para eu conseguir fazer uma agenda de aniversarios tipo aquela do www.elefante.com

 

DataBase em access com a tabela users constituida pelos seguintes campos, id (Autonumber), primaryname (text), lastname (text), aniversario (date/time), email (text), tempo (date/time format:short time) e dia_antes (date/time).

 

Portanto quando insiro um registo o mesmo fica: 1 , ricardo , gaspar , 05-06-1973 , r@r.pt , 17:00 , 04-06-1973

 

Até aqui não existe dúvidas, agora segue o código, nota que está tudo a funcionar bem, portanto consigo inserir os dados e consigo filtrar os aniversariantes pelo dia, mes e a que hora desejam ser avisados. A duvida é apenas relativamente à data de aviso. Se o registo tem de alerta (dia_antes) uma data anterior à do aniversario deveria o output no dia 4 junho (como no exemplo que eu dei em cima) informar-me que o ricardo gaspar faz anos no próximo dia.

 

Segue aqui os códigos todos:

 

Index.asp

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%><!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=iso-8859-1" /><title>BirthDayAlarm</title></head><body><p>BirthDay Alarm by E-mail</p><form id="frmadd" name="frmadd" method="post" action="AddSucess.asp"><table width="100%" border="0">  <tr>	<td>Primary name: </td>	<td><input name="primaryname" type="text" id="primaryname" /></td>	<td>Last name: </td>	<td><input name="lastname" type="text" id="lastname" /></td>  </tr>  <tr>	<td>BirthDay:</td>	<td><select name="day">	  <option selected="selected">Dia</option>	  <option value="01">01</option>	  <option value="02">02</option>	  <option value="03">03</option>	  <option value="04">04</option>	  <option value="05">05</option>	  <option value="06">06</option>	  <option value="07">07</option>	  <option value="08">08</option>	  <option value="09">09</option>	  <option value="10">10</option>	  <option value="11">11</option>	  <option value="12">12</option>	  <option value="13">13</option>	  <option value="14">14</option>	  <option value="15">15</option>	  <option value="16">16</option>	  <option value="17">17</option>	  <option value="18">18</option>	  <option value="19">19</option>	  <option value="20">20</option>	  <option value="21">21</option>	  <option value="22">22</option>	  <option value="23">23</option>	  <option value="24">24</option>	  <option value="25">25</option>	  <option value="26">26</option>	  <option value="27">27</option>	  <option value="28">28</option>	  <option value="29">29</option>	  <option value="30">30</option>	  <option value="31">31</option>	</select>	  <select name="month">		<option>Mês</option>		<option value="01">Janeiro</option>		<option value="02">Fevereiro</option>		<option value="03">Março</option>		<option value="04">Abril</option>		<option value="05">Maio</option>		<option value="06">Junho</option>		<option value="07">Julho</option>		<option value="08">Agosto</option>		<option value="09">Setembro</option>		<option value="10">Outubro</option>		<option value="11">Novembro</option>		<option value="12">Dezembro</option>	  </select>	  <select name="year">		<option selected="selected">Ano</option>		<option value="2007">2007</option>		<option value="2006">2006</option>		<option value="2005">2005</option>		<option value="2004">2004</option>		<option value="2003">2003</option>		<option value="2002">2002</option>		<option value="2001">2001</option>		<option value="2000">2000</option>		<option value="1999">1999</option>		<option value="1998">1998</option>		<option value="1997">1997</option>		<option value="1996">1996</option>		<option value="1995">1995</option>		<option value="1994">1994</option>		<option value="1993">1993</option>		<option value="1992">1992</option>		<option value="1991">1991</option>		<option value="1990">1990</option>		<option value="1989">1989</option>		<option value="1988">1988</option>		<option value="1987">1987</option>		<option value="1986">1986</option>		<option value="1985">1985</option>		<option value="1984">1984</option>		<option value="1983">1983</option>		<option value="1982">1982</option>		<option value="1981">1981</option>		<option value="1980">1980</option>		<option value="1979">1979</option>		<option value="1978">1978</option>		<option value="1977">1977</option>		<option value="1976">1976</option>		<option value="1975">1975</option>		<option value="1974">1974</option>		<option value="1973">1973</option>		<option value="1972">1972</option>		<option value="1971">1971</option>		<option value="1970">1970</option>	  </select></td>	<td>Email:</td>	<td><input name="emailbox" type="text" id="emailbox" /></td>  </tr>  <tr>	<td> </td>	<td> </td>	<td> </td>	<td> </td>  </tr>  <tr>	<td colspan="4">Avisos</td>  </tr>  <tr>	<td>Primeiro Aviso: </td>	<td><input name="paviso" type="text" id="paviso" disabled/> 	  inserir data dd-mm-yyyy 		<select name="horas" id="horas">		  <option value="00:00">00:00</option>		  <option value="00:05">00:05</option>		  <option value="00:10">00:10</option>		  <option value="13:00">13:00</option>		  <option value="13:05">13:05</option>		  <option value="17:00">17:00</option>		  <option value="17:05">17:05</option>		  <option value="14:26">14:26</option>		</select>		<select name="diaantes" id="diaantes">		  <option value="#">Não Lembrar</option>		  <option value="99">No dia</option>		  <option value="1">1 dia antes</option>		  <option value="2">2 dias antes</option>		  <option value="3">3 dias antes</option>		  <option value="4">4 dias antes</option>		</select>	  </td>	<td> </td>	<td> </td>  </tr>  <tr>	<td>Segundo Aviso: </td>	<td><input name="saviso" type="text" id="saviso" disabled/></td>	<td> </td>	<td> </td>  </tr>  <tr>	<td> </td>	<td>	  <div align="left">		<input type="submit" name="Submit" value="Submit" />	  </div></td>	<td> </td>	<td> </td>  </tr></table></form><p>Links</p><p>Lista aniversários por dia e mês output em asp - <a href="teste.asp">Clica</a> (verificar a string sql que apresenta >= ) </p><p>Pagina Testes  <a href="UsersDayBirth.asp">Clica</a></p></body></html>

 

 

Addsucess.asp

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%><!-- #include file=Conn/config.inc --><%session.LCID = 2070'Não deixa informações no Cache	Response.Expires = 0'Declaração das variáveis	Dim objRs, strQuery, primeironome, ultimonome, emailbox, paviso, saviso, horas, diaantes, aniversario, alerta'Atrubuição dos valores as respectivas variáveis		primeironome = Request.Form("primaryname")		ultimonome = Request.Form("lastname")		aniversario = request.Form("day") & "-" &request.Form("month") & "-" &request.Form("year")		emailbox = request.form("emailbox")		paviso = request.Form("paviso")		saviso = request.Form("saviso")		horasss = request.Form("horas")		diaantes = request.Form("diaantes")		if diaantes = "99" then		'Transporta a data do aniversario e iguala com a data now		alerta = aniversario	end if	if diaantes = "1" then		'Transporta a data do aniversario e retira 1 dia		alerta = dateadd("d",-1,aniversario)	end if	if diaantes = "2" then		'Transporta a data do aniversario e retira 2 dias		alerta = dateadd("d",-2,aniversario)	end if	if diaantes = "3" then		'Transporta a data do aniversario e retira 3 dias		alerta = dateadd("d",-3,aniversario)	end if	if diaantes = "4" then		'Transporta a data do aniversario e retira 4 dias		alerta = dateadd("d",-4,aniversario)	end if		'Insere os dados na tabela abertastrQuery = "INSERT INTO users (primaryname,lastname,aniversario,email,tempo,dia_antes) VALUES '"&primeironome&"','"&ultimonome&"','"&aniversario&"','"&emailbox&"','"&horasss&"','"&alerta&"')"'Caso ocorra um erro esta função de erro será chamada		On error Resume Next'Executa a inserção no Banco de Dados 		Set ObjRs = Conn.Execute(strQuery)		'Fecha o Objeto de Conexão		Conn.close'"APAGA" qualquer instancia que possa ter no objeto objRs e objConn		Set objRs = Nothing		Set Conn = Nothing'Caso a função On Error Resume Next não tenha sido chamada o objeto err será = a 0			if err = 0 Then								'Redireciona o usuário caso não tenha ocorrido erro na transação				response.redirect "index.asp"			end if%>

test.asp

Página para mostrar os aniversariantes

<!-- #include file=Conn/config.inc --><%session.LCID = 2070dim dd, mm, aafunction FormataData(data)dd = day(data)mm = month(data)aa = year(data)if len(dd) = 1 then dd = "0" & ddif len(mm) = 1 then mm = "0" & mmFormataData = cstr(dd & "-" & mm & "-" & aa)end functiondim data_atualdata_atual = FormataData(Date)dim niver_dia, niver_mes, niver_anoniver_dia = Day(data_atual)niver_mes = Month(data_atual)niver_ano = Year(data_atual)if Len(niver_dia) < 2 thenniver_dia = "0"&Day(data_atual)end ifif Len(niver_mes) < 2 thenniver_mes = "0"&Month(data_atual)end ifdim sql'# STRING SQL FILTRA DIA MES E ALERTA PARA O HORARIO QUE QUEREMOSsql = "SELECT id, primaryname, lastname, aniversario, email, tempo FROM users WHERE Day(aniversario) = "&niver_dia&" AND Month(aniversario) = "&niver_mes&" and tempo = #" & formatdatetime(now(),4) &"#" <<<<------- FALTA ADICIONAR AQUI PARA A STRING FILTRAR O DIA DE ALERTA ANTERIORRsConn.open sql, Connresponse.Write "<TABLE border='1'>"response.write "<TR><TD>Primeiro nome</td><TD>Ultimo Nome</TD><TD>Aniversario</TD><TD>Primeiro Alerta</TD></tr>"'response.Write "</TABLE>"do while not RsConn.eof'response.Write "<Table width='100%' border='1'>"response.Write "<TR VALIGN = TOP><TD ALIGN = RIGHT WIDTH = '15%'><FONT COLOR = '#000000' SIZE = '-1'><B>  " & RsConn("primaryname") & "</b></font></td>"response.Write "<TD ALIGN = RIGHT WIDTH = '15%'><FONT COLOR = '#000000' SIZE = '-1'><B>  " & RsConn("lastname") & "</b></font></td>"response.Write "<TD ALIGN = RIGHT WIDTH = '15%'><FONT COLOR = '#000000' SIZE = '-1'><B>  " & RsConn("aniversario") & "</b></font></td>"response.Write "<TD ALIGN = RIGHT WIDTH = '15%'><FONT COLOR = '#000000' SIZE = '-1'><B>  " & RsConn("tempo") & "</b></font></td><tr>"'response.Write "<TD width = '25%'><FONT COLOR = '#999999' Size = '-1'>" & RsConn("id") &"</FONT></td></tr>"RsConn.movenextloopresponse.write "</TABLE>"'logo depois só um testeresponse.write "Hoje sao: "Response.Write(niver_dia&"<br>")Response.Write(niver_mes&"<br>")Response.Write(niver_ano&"<br>")Response.Write(data_niver&"<br>")Response.Write(sql&"<br>")%>

Fico à espera que vejam o código e que me informem o que poderei adicionar na string sql para que no dia anterior ao do aniversario o registo apareça.

 

Obrigado e grande abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, eu encontrei uma solução para este caso. É claro que existem outras... mas lá vai:

 

Na variável qtdDias você diz quantos dias anted da data quer ser lembrado, neste caso, ele te lembrará 5 dias antes:

 

Depois, dentro do laço, eu fiz um if, perguntando se a diferença em dias da data de hoje comparada com a data de aniversário é igual aquela variável qtdDias (5). Se sim, mostra o aniversariante.

 

qtdDias = 5sql =   "SELECT id, primaryname, lastname, aniversario, email, tempo " & _		"FROM users " & _		"WHERE Day(aniversario) &"/"& Month(aniversario) = "&niver_dia & "/" & niver_mes&" AND tempo = #" & formatdatetime(now(),4) &"#"RsConn.open sql, Connresponse.Write _"<TABLE border='1'>" & _	"<TR><TD>Primeiro nome</td><TD>Ultimo Nome</TD><TD>Aniversario</TD><TD>Primeiro Alerta</TD></tr>"	WHILE not RsConn.EOF		auxDat = DateDiff("d", date(), RsConn("aniversario"))		IF (auxDat = qtdDias) THEN			response.write _			"<TR VALIGN = TOP><TD ALIGN = RIGHT WIDTH = '15%'><FONT COLOR = '#000000' SIZE = '-1'><B>  " & RsConn("primaryname") & "</b></font></td>" & _				"<TD ALIGN = RIGHT WIDTH = '15%'><FONT COLOR = '#000000' SIZE = '-1'><B>  " & RsConn("lastname") & "</b></font></td>" & _				"<TD ALIGN = RIGHT WIDTH = '15%'><FONT COLOR = '#000000' SIZE = '-1'><B>  " & RsConn("aniversario") & "</b></font></td>" & _				"<TD ALIGN = RIGHT WIDTH = '15%'><FONT COLOR = '#000000' SIZE = '-1'><B>  " & RsConn("tempo") & "</b></font></td>" & _			"<tr>"		END IF		RsConn.movenext			WENDresponse.write "</TABLE>"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dataset,A ideia é boa mas não resolve o problema. Este código tem dois erros. Primeiro a string do sql "WHERE Day(aniversario) &"/"& Month(aniversario) = "&niver_dia & "/" & niver_mes&" AND tempo = #" & formatdatetime(now(),4) &"#", se escrever esta string da-me um erro no where day(aniver], mas pronto eu aqui resolvi o problema.Agora vem a parte do aviso que o utilizador escolheu, neste caso escolhemos 5 dias, supostamente se tivermos um aniversario no dia 17-05-1973 o respectivo codigo iria informar no dia 13-05-2007 que determinado registo fazia anos no dia 17 isto passado 5 dias, correcto?Acontece e fazemos um teste.response.Write datediff("d", date(),#17-05-1973#)O output é: -12418Visto que o IF (auxDat = qtdDias) não é igual a 5 nunca ira mostrar o aniversariante.Mas a ideia foi boa, agora tenho que arranjar uma solução e tera que ser no campo do access dia_antes que me insira o valor um valor numerico de -1 a -x e que me retorne o aviso, neste caso o registo do aniversariante.ObrigadoAbraços<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Bem, eu encontrei uma solução para este caso. É claro que existem outras... mas lá vai:Na variável qtdDias você diz quantos dias anted da data quer ser lembrado, neste caso, ele te lembrará 5 dias antes:Depois, dentro do laço, eu fiz um if, perguntando se a diferença em dias da data de hoje comparada com a data de aniversário é igual aquela variável qtdDias (5). Se sim, mostra o aniversariante.

qtdDias = 5sql =   "SELECT id, primaryname, lastname, aniversario, email, tempo " & _		"FROM users " & _		"WHERE Day(aniversario) &"/"& Month(aniversario) = "&niver_dia & "/" & niver_mes&" AND tempo = #" & formatdatetime(now(),4) &"#"RsConn.open sql, Connresponse.Write _"<TABLE border='1'>" & _	"<TR><TD>Primeiro nome</td><TD>Ultimo Nome</TD><TD>Aniversario</TD><TD>Primeiro Alerta</TD></tr>"	WHILE not RsConn.EOF		auxDat = DateDiff("d", date(), RsConn("aniversario"))		IF (auxDat = qtdDias) THEN			response.write _			"<TR VALIGN = TOP><TD ALIGN = RIGHT WIDTH = '15%'><FONT COLOR = '#000000' SIZE = '-1'><B>  " & RsConn("primaryname") & "</b></font></td>" & _				"<TD ALIGN = RIGHT WIDTH = '15%'><FONT COLOR = '#000000' SIZE = '-1'><B>  " & RsConn("lastname") & "</b></font></td>" & _				"<TD ALIGN = RIGHT WIDTH = '15%'><FONT COLOR = '#000000' SIZE = '-1'><B>  " & RsConn("aniversario") & "</b></font></td>" & _				"<TD ALIGN = RIGHT WIDTH = '15%'><FONT COLOR = '#000000' SIZE = '-1'><B>  " & RsConn("tempo") & "</b></font></td>" & _			"<tr>"		END IF		RsConn.movenext			WENDresponse.write "</TABLE>"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Viva,Já tentei essa linha de código e não dá para o que eu quero. Estou farto de pensar e não sei como hei-de mesmo dar a volta ao assunto.O objectivo é simples, adicionar registos um dos quais é o aniversário do user e depois no ano presente e no mês presente informar o webmaster que passado alguns dias aquele user faz anos.O problema aqui é o campo alerta que vamos ao exemplo:Insiro um registo aniversario com a seguinte data 20-05-1973 e escolho que quero ser avisado no dia anterior, portanto no dia 19-05-2007, repare que o ano muda o que fica no campo alerta é o dia e mês da data de aniversário e a string sql vai comparar a data actual que vamos imaginar que são 19-05-2007 e irá mostrar-nos o registo do aniversário do dia 20-05-1973.Na combobox alerta o value que eu pus foi o algarismo -1 que quer dizer 1 dia antes. Quando o dados são registados na base de dados deveria ir assim:Aniversário: 20-05-1973Alerta: 19-05-2007Acontece que com as funcoes dateadd, datediff e datepart não consigo.Outro exemplo que tentei fazer:

if diaantes = "1" then		alerta = dateadd("d",-1, date())			end if
Output: 16-05-2007 (data de hoje -1 dia)e o aniversário do user é 20-05-1973, por isso este lado nao dá.Devia ter uma função tipo:
alerta = datepart("d","m", "aniversario") & dateadd("d", "variavel da combobox", date("yyyy")) 'codigo imaginavel
Que o objectivo era, ou neste caso o output:Aniversario: 20-05Alerta: 19-05-2007Explicação complexa!??!???Eu sei que estou a complicar a situação e o código, mas como eu disse anteriormente se souberem como criar uma agenda de aniversários e alertar-me esse aniversário nos anos (2007, 2008, 2009 etc..etc) actuais por um dia antes ou dois dias antes ou até dez dias antes, maravilha.O processo que quero fazer é exactamente igual ao site www.elefante.com, inserimos um aniversariante e depois o código informa-nos todos os anos actuais que user X daqui a 1 ou 2 ou 3 dias faz anos.Abraço

acho que você está querendo isso aqui

response.write (dateadd("d",-5, date()))

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,

 

Post longo e com mtas interpetrações mas vou dar uma sugestão.

 

O código a seguir faz algo pareceido com o que você quer:

DECLARE @TMP TABLE(NASCIMENTO DATETIME,NU_DIAS_AVISO INT)INSERT INTO @TMP(NASCIMENTO,NU_DIAS_AVISO) VALUES ('1966/05/19',2)INSERT INTO @TMP(NASCIMENTO,NU_DIAS_AVISO) VALUES ('1970/02/25',2)INSERT INTO @TMP(NASCIMENTO,NU_DIAS_AVISO) VALUES ('1972/05/19',2)INSERT INTO @TMP(NASCIMENTO,NU_DIAS_AVISO) VALUES ('2000/06/16',2)INSERT INTO @TMP(NASCIMENTO,NU_DIAS_AVISO) VALUES ('2002/05/19',2)DECLARE @DT_BASE_AVISO DATETIME, @DIA INT, @MES INTSELECT @DT_BASE_AVISO = DATEADD(DAY,NU_DIAS_AVISO,GETDATE())FROM @TMPSELECT @DIA = DAY(@DT_BASE_AVISO), @MES = MONTH(@DT_BASE_AVISO)SELECT 	* FROM 		@TMPWHERE	  DAY(NASCIMENTO) = @DIA AND			MONTH(NASCIMENTO) = @MES

 

Agora esta direto no SQL mas acho q pode ser adaptado ao seu problema. Note que coloquei o dia de aviso como 2 para todos mas pode ser variável.

Usa como referência a data atual e lista todos os aniversariantes daquia a 2 dias.

 

Deu uma luz.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pronto, já consegui resolver o problema pelo menos inserir o registo agora vamos ver se o mesmo é visivel no dia do alerta.

 

eis o codigo

if diaantes = "1" then		alerta = datepart("d", aniversario) & "-" & datepart("m", aniversario) & "-" & datepart("yyyy", date())		novoalerta = dateadd("d", -1 , (alerta))	end if

Qual é o output?:

Vamos imaginar que eu insigo o seguinte aniversario: 10-10-1973 o mesmo é transportado pela variavel aniversario. Na variavel alerta eu vou ter o seguinte:

10-10-2007, portanto é o registo que vai ficar no campo alertas.

Na variavel novoalerta vai buscar-me a data da variavel alerta e retira um dia, isto conforme o utilizador escolheu para ser avisado.

Em principio esta a funcionar direito o registo foi bem inserido agora so preciso ver se o mesmo no dia anterior aparece.

 

Obrigado a todos principalmente ao dataset.

Compartilhar este post


Link para o post
Compartilhar em outros sites

era como eu estava a imaginar, hehehe a string sql :

 

sql = "SELECT id, primaryname, lastname, aniversario, email, tempo, dia_antes FROM users WHERE Day(aniversario) = "&niver_dia&" AND Month(aniversario) = "&niver_mes&" and tempo = #" & formatdatetime(now(),4) &"# and dia_antes = "&data_atual&""

Não consegue filtrar o aniversariantes do proximo dia, é uma questão de sinais < , > ou diferente <>.

 

Exemplo que um registo inserido:

Aniversario | dia_antes

18-05-1983 | 17-05-2007

 

Como é que hei-de realizar esta string sql para que no campo dia_antes que contem a data actual mostre os proximos aniversarios???

 

ou é melhor fazer um if?

 

bem isto esta complicado demais...hehehhhehaheh ... complexo :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,

 

Sinceramente eu não gravaria a data dia_antes na tabela e sim dias para aviso como postei anteriormente. Pq e no ano de 2008 você atualizará a data na passagem do ano?

 

Exemplo que um registo inserido:

Aniversario | dia_antes

18-05-1983 | 17-05-2007

 

Como é que hei-de realizar esta string sql para que no campo dia_antes que contem a data actual mostre os proximos aniversarios???

Qto ao select tente algo assim:

SELECT * FROM SUA_TABELA WHERE dia_antes = GETDATE()
t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jothaz,

 

Tens toda a razão eu tambem pensei nisso por no campo dia_antes o value de 1, 2, 3, 4, 5 depende dos dias que o user escolher para ser avisado antes. O problema aqui é como fazer isso, mas vou tentar, so tentando é que uma pessoa aprende.

Claro que conto com a vossa ajuda. :)

 

Vou fazer tudo de novo. Da para zipar o codigo todo e pôr aqui no forum?

 

Abraço

 

 

Camarada,

 

Sinceramente eu não gravaria a data dia_antes na tabela e sim dias para aviso como postei anteriormente. Pq e no ano de 2008 você atualizará a data na passagem do ano?

 

Exemplo que um registo inserido:

Aniversario | dia_antes

18-05-1983 | 17-05-2007

 

Como é que hei-de realizar esta string sql para que no campo dia_antes que contem a data actual mostre os proximos aniversarios???

Qto ao select tente algo assim:

SELECT * FROM SUA_TABELA WHERE dia_antes = GETDATE()
t+

 

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.