Jump to content
FabianoSouza

Percorrer recordset em calendário

Recommended Posts

Encontrei esse código para gerar calendário e estou adaptando para meu uso.

 

O problema está na hora de percorrer um recordset e exibir os compromissos dentro das TD da tabela.

Quando há dois ou mais compromissos na mesma data, o loop falha, deixando de escrever os compromissos de outras datas.

Mas se houver apenas 1 compromisso por dia, funciona direitinho.

 

Ilustrando:

Isso funciona

Compromisso A - 10/07/2017

Compromisso B - 15/07/2017

Compromisso C - 18/07/2017

 

Isso não funciona

Compromisso A - 10/07/2017

Compromisso B - 15/07/2017

Compromisso C - 15/07/2017

 

 

Esse trecho é responsável por escrever o compromisso dentro da TD

 

Dim meuDia, meuMes, meuAno
meuDia = Day(rs("Inicio"))
meuMes = Month(rs("Inicio"))
meuAno = Year(rs("Inicio"))

If meuDia = Day(dtCurViewDay) AND meuMes = Month(dtCurViewDay) AND meuAno = Year(dtCurViewDay) Then
Response.Write "<span>" & rs("DatasDescricao") & "</span>"
rs.Movenext 
End if

Suspeito que o problema esteja na linha "rs.Movebext". Talvez eu não esteja movimentando o RS no lugar correto do código.

 

Agora o código na íntegra (lembrando que estou adaptando o código, não criei do zero, tem umas functions que não sei pra que servem).

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%Option Explicit%>
<%
Function FormatStr(String)
	on Error resume next
	String = Replace(String, CHR(13), "")
	String = Replace(String, CHR(10) & CHR(10), "</P><P>")
	String = Replace(String, CHR(10), "<BR>")
	FormatStr = String
End Function

Dim dtToday 
dtToday = Date()

Dim dtCurViewMonth ' First day of the currently viewed month
Dim dtCurViewDay ' Current day of the currently viewed month
Dim frmDate ' Date submitted by form

' if the GO button was used, build the date from the month and year

If InStr(1, Request.Form, "subGO", 1) > 0  then
	if Request.Form("CURDATE_month") = "" then
		tmpMonth = month(now())
	else
		tmpMonth = Request.Form("CURDATE_month")
	End If
	
	if Request.Form("CURDATE_year") = "" then
		tmpyear = year(now())
	else
		tmpyear = Request.Form("CURDATE_year")
	End If
		
	tmpDate = "1 " & tmpMonth & " 1999"
	
	mnth = Month(tmpDate)
	frmDate = DateSerial(tmpyear, mnth, 1)
Else

	frmDate = Request.Form("CURDATE")
	
end if

if Request("view_date") <> "" then 
	frmDate= DateSerial(year(Request("view_date")), month(Request("view_date")), 1)
end if
%>


<% REM This section defines functions to be used later on. %>
<% REM This sets the Previous Sunday and the Current Month %>
<% 

'--------------------------------------------------
   Function DtPrevSunday(ByVal dt)
      Do While WeekDay(dt) > vbSunday
         dt = DateAdd("d", -1, dt)
      Loop
   DtPrevSunday = dt
   End Function
'--------------------------------------------------
%>

<%REM Set current view month from posted CURDATE,  or
' the current date as appropriate.

' if posted from the form
' if prev button was hit on the form
   If InStr(1, Request.Form, "subPrev", 1) > 0 Then
      dtCurViewMonth = DateAdd("m", -1, frmDate)
' if next button was hit on the form
   ElseIf InStr(1, Request.Form, "subNext", 1) > 0 Then
      dtCurViewMonth = DateAdd("m", 1, frmDate)
' anyother time
      Else
' date add in text box
         If InStr(1, Request.Form, "subGO", 1) > 0 then
			dtCurViewMonth = frmDate
		 Else
			if Request("view_date") <> "" then 
				dtCurviewMonth = frmDate
			else
            dtCurViewMonth = DateSerial(Year(dtToday), Month(dtToday), 1)
            End If
         End If
   End If
%>

<% '--------BEGINNING OF DRAW CALENDAR SECTION-------- %>
<%
   Dim iDay, iWeek, sFontColor, dictDte(31,2), intCount
   Dim strSql, rs

  strSQL = ""
  strSQL = "SELECT "
  strSQL = strSQL &"CONVERT(VARCHAR(10), DatasDataInicio, 103)  AS 'Inicio'"
  strSQL = strSQL &", DatasDescricao " 
  strSQL = strSQL &" FROM tabDatas " 
  strSQL = strSQL &" WHERE "
  strSQL = strSQL &" MONTH(DatasDataInicio) = DATEADD(DD,-1,MONTH(GETDATE()))"
  strSQL = strSQL &" AND"
  strSQL = strSQL &" YEAR(DatasDataInicio) = YEAR(GETDATE())"
  strSQL = strSQL &" OR "
  strSQL = strSQL &" MONTH(DatasDataInicio) = MONTH(GETDATE())"
  strSQL = strSQL &" AND "
  strSQL = strSQL &" YEAR(DatasDataInicio) = YEAR(GETDATE())"
  strSQL = strSQL &" OR"
  strSQL = strSQL &" MONTH(DatasDataInicio) = DATEADD(DD,+1,MONTH(GETDATE()))"
  strSQL = strSQL &" AND "
  strSQL = strSQL &" YEAR(DatasDataInicio) = YEAR(GETDATE())"
  strSQL = strSQL &" ORDER BY "
  strSQL = strSQL &" DatasDataInicio "
  strSQL = strSQL &" ASC"
  set rs = conexao.Execute (strSql)

   intCount= 0
   ' populate array with days of month
   on Error resume next
'   do until rs.EOF
'   if intCount > 31 then exit do
'   if Day(rs("DatasDataInicio")) = intCount + 1 then 
'		dictDte(intCount, 1) = rs("DatasDescricao")
'		rs.Movenext
'	Else 
'		dictDte(intCount, 1) = " "
'	End If
'	dictDte(intCount, 2) = intCount + 1
'	intCount = intCount + 1
'   loop
%>

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<link href="/App/HOME/agenda/calendario/CSS/calendario.css" rel="stylesheet" type="text/css" />
</head>

<body>
<table id="tabCalendario">

<tr>
<%
'-- criar colunas com dias da semana 
For iDay = vbSunday To vbSaturday%>
<th> <%=UCase(WeekDayName(iDay))%></th>
<%Next %>
</tr>
<%
'--cria linhas de semanas
dtCurViewDay = DtPrevSunday(dtCurViewMonth)
Response.Write "<tbody>"
For iWeek = 0 To 5
Response.Write "<TR>"

Dim sBGCOLOR 
sBGCOLOR = "#FFFFFF"
Dim ariaHoje
ariaHoje = "1"

'-- cria as datas do calendário
For iDay = 0 To 6
sBGCOLOR = "#FFFFFF"
ariaHoje = "1"
If Month(dtCurViewDay) = Month(dtCurViewMonth) Then
ariaHoje = "1"

'Marca dia atual 
If dtCurViewDay = dtToday Then sBGCOLOR = "#C4E1FF"
else 
sBGCOLOR = "#F5F5F5"
ariaHoje = ""
End If


Response.Write "<TD bgcolor=" & sBGCOLOR & ">"

'------------Caso seja o primeiro dia do mês, concatena o nome do mês abreviado
Dim primeiroDia
primeiroDia = ""
If Day(dtCurViewDay) = 1 Then
primeiroDia = " de " & MonthName(Month(dtCurViewDay),True)'true para mês abreviado
End if
Response.Write("<li value=" & Day(dtCurViewDay) &">"& Day(dtCurViewDay) & primeiroDia & "</li>")

'------------ Exibe compromissos do banco de dados
Dim meuDia, meuMes, meuAno
meuDia = Day(rs("Inicio"))
meuMes = Month(rs("Inicio"))
meuAno = Year(rs("Inicio"))

If meuDia = Day(dtCurViewDay) AND meuMes = Month(dtCurViewDay) AND meuAno = Year(dtCurViewDay) Then
Response.Write "<span>" & rs("DatasDescricao") & "</span>"
rs.Movenext 
End if

dtCurViewDay = DateAdd("d", 1, dtCurViewDay)
Response.Write "</TD>"
Next
Response.Write "</TR>"
   Next
Response.Write "</tbody>"
%>
  <%' --------END OF DRAW CALENDAR SECTION-------- 
conexao.Close
set conexao = nothing
%>
</table>
</body>
</html>

 

calendario5.png

Share this post


Link to post
Share on other sites

Ufa... depois de duas semanas fritando os neurônios finalmente encontrei a solução.

Sei que o código está bagunçado...mal organizado... mas peguei da web pra adaptar. Agora que está funcionado vou deixar bonitinho heheh

 

Em linhas gerais, precisava criar um loop do recordset para cada iteração do loop que cria os dias do calendário.
 

Passo 1 - Recuperar o total de registros do recordset

Dim totalRs
totalRs = rs.Recordcount

Passo 2 - Criar loop do recordset dentro de cada iteração do loop de dias do mês.

...crio a TD aqui...

...Agora defino variáveis 
Dim meuDia, meuMes, meuAno
meuDia = Day(rs("Inicio"))
meuMes = Month(rs("Inicio"))
meuAno = Year(rs("Inicio"))

If meuDia = Day(dtCurViewDay) AND meuMes = Month(dtCurViewDay) AND meuAno = Year(dtCurViewDay) Then 

... Agora crio o loop milagroso!
  'ISSO AQUI PEROCORRE O RECORDSET para cada dia do mês--------------
For x = 0 To totalRs
If Day(rs("Inicio")) = Day(dtCurViewDay) Then
Response.Write "<span "& "title="& Replace(rs("DatasDescricao")&" às "&rs("Hora")," ","&nbsp;")&">"
Response.Write rs("DatasDescricao")
Response.Write "</span>"
Else
exit for
End if
rs.MoveNext
Next

End if

Vejam o print como ficou lindão kkkk

Capturar2.PNG

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Pedro S.
      Conheço pouco de PHP e, de ultima hora, estou tendo que fazer um sistema de agendamento para barbearias como projeto. O sistema teria um calendário com os dias, meses e ano, onde o usuário poderia clicar no dia que desejasse, se disponível, e escolher o horário que desejasse, também se disponível. Todo o resto do site já foi feito, essa é única parte que não tenho noção de como fazer. 
    • By Eduardo M
      Olá galera, tudo bem? 
      Estou precisando de uma ajuda de vocês acontece, que eu estou criando um calendário, porem esse calendário não passa o ano quando eu aperto as setas pro lado!
      Vou disponibilizar os códigos para  alguém me ajudar pois estou precisando muito deste calendário!
       
      calendario.php
      <?php function num($num){ return ($num < 10) ? '0'.$num : $num; } function montaEventos($info){ global $pdo; //tabela, data, titulo $tabela = $info['tabela']; $data = $info['data']; $titulo = $info['titulo']; $link = $info['link']; $vagas = $info['vagas']; $eventos = $pdo->prepare("SELECT * FROM `".$tabela."` WHERE `".$data."` "); $eventos->execute(); $retorno = array(); while($row = $eventos->fetchObject()){ $dataArr = date('Y-m-d', strtotime($row->{$data})); $retorno[$dataArr] = array( 'titulo' => $row->{$titulo}, 'link' => $row->{$link}, 'vagas' => $row->{$vagas} ); } return $retorno; } function diasMeses(){ $retorno = array(); for($i = 1; $i<=12;$i++){ $retorno[$i] = cal_days_in_month(CAL_GREGORIAN, $i, date('Y')); } return $retorno; } function montaCalendario($eventos = array()){ $daysWeek = array( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ); $diasSemana = array( 'Dom', 'Seg', 'Ter', 'Qua', 'Qui', '---', 'Sab' ); $arrayMes = array( 1 => 'Janeiro', 2 => 'Fevereiro', 3 => 'Março', 4 => 'Abril', 5 => 'Maio', 6 => 'Junho', 7 => 'Julho', 8 => 'Agosto', 9 => 'Setembro', 10 => 'Outubro', 11 => 'Novembro', 12 => 'Dezembro' ); If($_GET['mes'] and $_GET['ano']) { $mes = $_GET['mes']; $ano = $_GET['ano']; } Else { $mes = date("m"); $ano = date("Y"); } $t_mes = date("t", mktime(0, 0, 0, $mes, 1, $ano)); $mes_ant = date("m", mktime(0, 0, 0, $mes, 0, $ano)); $ano_ant = date("Y", mktime(0, 0, 0, $mes, 0, $ano)); $mes_post = date("m", mktime(0, 0, 0, $mes, $t_mes+1, $ano)); $ano_post = date("Y", mktime(0, 0, 0, $mes, $t_mes+1, $ano)); $diasMeses = diasMeses(); $arrayRetorno = array(); for($i =1; $i <= 12; $i++){ $arrayRetorno[$i] = array(); for($n=1; $n<= $diasMeses[$i]; $n++){ $dayMonth = gregoriantojd($i, $n, date('Y')); $weekMonth = substr(jddayofweek($dayMonth, 1),0,3); if($weekMonth == 'Mun') $weekMonth = 'Mon'; $arrayRetorno[$i][$n] = $weekMonth; } } echo '<a href="#" id="volta">&laquo;</a><a href="#" id="vai">&raquo;</a>'; echo '<table border="0" width="100%">'; foreach($arrayMes as $num => $mes){ echo '<tbody id="mes_'.$num.'" class="mes">'; echo '<tr class="mes_title"><td colspan="7">'.$mes.' - '.date('Y').'</td></tr>'; echo '<tr class="dias_title">'; foreach($diasSemana as $i => $day){ echo '<td>'.$day.'</td>'; } echo '</tr><tr>'; $y = 0; foreach($arrayRetorno[$num] as $numero => $dia){ $y++; if($numero == 1){ $qtd = array_search($dia, $daysWeek); for($i=1; $i<=$qtd; $i++){ echo '<td></td>'; $y+=1; } } if(count($eventos) > 0){ $month = num($num); $dayNow = num($numero); $date = date('Y').'-'.$month.'-'.$dayNow; if(in_array($date, array_keys($eventos))){ $evento = $eventos[$date]; if($evento['vagas'] <> 0){ echo '<td class="evento2"><a class="dcontexto" href="'.$evento['link'].'" target="_parent">'.$numero.'<span>Vagas '.$evento['vagas'].'</span></a></td>'; }else{ echo '<td class="evento1"><a class="dcontexto" target="_parent">'.$numero.'<span> Não há mais Vagas</span></a></td>';} }else{ echo '<td class="dia_'.$numero.'" ><a href="../../agenda.php?data='.$numero.'-'.$mes.'" class="numeros" target="_parent">'.$numero.'</a></td>'; } }else{ echo '<td class="dia_'.$numero.'">'.$numero.'</td>'; } if($y == 7){ $y=0; echo '</tr><tr>'; } } echo '</tr></tbody>'; } echo '</table>'; } ?> e na minha duvida e no JS
       
      js/functions.js
      $(function(){ var data = new Date(); var mesAtual = data.getMonth()+1; var diaAtual = data.getDate(); var anoAtual = data.getFullYear(); var dataAtual = diaAtual+'/'+mesAtual+'/'+anoAtual; var contCalendario = 0; $('#mes_'+mesAtual).show().find('.dia_'+diaAtual).addClass('atual'); function hideShow(){ if(mesAtual > 12){ mesAtual = 1; anoAtual = +1; }else if(mesAtual < 1){ mesAtual = 12; anoAtual = -1; } $('.mes').hide(); $('#mes_'+mesAtual).show(); } $('#vai').on('click', function(e){ e.preventDefault(); mesAtual++; hideShow(); return false; }); $('#volta').on('click', function(e){ e.preventDefault(); mesAtual--; if(mesAtual < 1){ anoAual - -1;} hideShow(); return false; }); }); eu acho que estou errando no JAVASCRIPT
       
      para quem for me ajudar vou deixar o link do calendário.
      http://www.nebbclean.com.br/calendario.rar
       
      Agradeço!

      Att,
      Eduardo Moura
    • By fdesign
      Boa tarde,
      Estou com uma grande duvida e dilema. Como poderei fazer para sincronizar o calendário google, com o meu email profissional? Na vez de usar o email @gmail.com usar @minhaempresa.com
       
      Há alguma forma gratuita? E no android / ios a conta a ser utilizada é a profissional e não a do gmail.
       
      Obrigado amigos
    • By Rottzeus
      Boa noite pessoal!!!
      Que bom testemunhar que este forum permanece a todo vapor... há algum tempo não tenho tido tempo de entrar e acompanhá-lo em razão de mudança de função/profissão. Saudações a todos!!!
      Contudo, em razão de uma necessidade de mudança de um sistema antigo, estou com uma dúvida que não consigo achar o caminho. Preciso percorrer todos os controles de um form e automatizar uma rotina para habilitar ou não determinado controle. Contudo, minha dúvida consiste a partir do momento que encontro controles indexados name(i).enabled e controles não indexados name.enabled.
      Percorrer o form não é o problema, pois uso o código abaixo
      For i = 0 To Me.Controls.Count - 1
      If TypeOf Me.Controls(i) Is OptionButton Then
            'Aqui preciso saber se o OptionButton está indexado ou não, pois terei as duas situações e nomes diferentes para fazer uma busca diretamente pelo controle
            'Tentei várias formas Me.Controls(i).Name.item(i).caption, Me.Controls(i).Name.count para identificar se é ou não indexado, Me.Controls(i).Name.index, mas estou apanhando realmente
            ''Me.Controls(i).text = ""
      ElseIf TypeOf Me.Controls(i) Is CommandButton Then
            'Aqui faria a mesma checagem com o commandbutton, pois no form há tanto controles indexados, como não indexados.
      Else
            'Se não fosse nem um optionbutton, nem um commandbutton não preciso fazer nada
      End If
      Next
      Se alguem puder me dar um help, fico agradecido.
      Abraço a todos!!!
    • By tony_lu
      Ola pessoal, preciso de uma ajuda...estou usando um campo date onde o usuário seleciona a data no calendário e submete o formulário!
       
      <form method="post" id="form" name="form"> <input type="date" name="data" id="data" value=""> </form> Eu preciso que o usuario ao abrir o calendario e escolher o dia desejado, ao clicar ja submeta o formulario sem que precise clicar em um botão para enviar! Podem me ajudar?!
       
      Obrigado!
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.