Ir para conteúdo

Arquivado

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

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

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Kefatif
      Prezados boa tarde.
       
      Preciso bloquear a edição de um date input de forma que só seja possível selecionar a data através do calendário.
       
      Alguém pode me ajudar?
       
      Utilizo php, html e js.
       
      <input type="date" value="<?php echo $data ?>" name="datacoleta" class="form-control" required style="width:100%;">  
      Agradeço desde já.
    • Por Kefatif
      Prezados boa tarde.
       
      Preciso bloquear a edição de um date input de forma que só seja possível selecionar a data através do calendário.
       
      Alguém pode me ajudar?
       
      Utilizo php, html e js.
       
      <input type="date" value="<?php echo $data ?>" name="datacoleta" class="form-control" required style="width:100%;">  
      Agradeço desde já.
    • Por 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. 
    • Por 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
    • Por 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
×

Informação importante

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