none
Comparar dados RRS feed

  • Pergunta

  •  

    Bom dia pessoal,

     

    Estou desenvolvendo, em ASP, um portal interno para a empresa que trabalho. Estou montando uma agenda para salas de reunião.

    Tenho duas tabelas uma que grava os agendamentos (tabelaX), e outra onde eu cadastro os horários de agendamento (tabelaY).

     

    Os dados da TabelaY só são exisbidos na página de agendamento em um combobox para que o usuário possa selecionar o horário e agendar a sala.

     

    Gostaria de que, ao entrar nesta página, fazer uma verificação para saber se o horário já foi agendado, ou seja, compare os dados da TabelaX e da TabelaY antes de mostrar o combo, fazendo assim, com que sejam exibidos somente os horários ainda não agendados.

     

    Como fazer esta comparação???

     

    OBS: Infelizmente, por pouco conhecimento, estou utilizando "banco" Access.

     

    Fico no aguardo,

    segunda-feira, 12 de novembro de 2007 10:41

Respostas

  • Vamos lá vou tentar te ajudar, pelo que entendi na tabela Agenda é onde se cadastra as datas e horários certo? E na tabela horários é onde ficam armazenados todos os horários disponíveis. Entao acho que deveria ser mais ou menos assim:

     

    Fiz o código abaixo veja se é mais ou menos isso se nao for poste novamente.

     

    Code Block

    <%

    ' ## Retorna os Horários disponíveis

    Set cmdHorarios = Server.CreateObject("ADODB.Command")
    cmdHorarios.ActiveConnection = DataAgenda
    cmdHorarios.CommandText = "SELECT * FROM Horarios order by Horario"
    cmdHorarios.CommandType = 1
    Set rsHorarios = Server.CreateObject("ADODB.Recordset")
    rsHorarios.Open cmdHorarios, , 0, 1


    %>

    <select size="1" name="Horarios">
    <%
    Do While Not rsHorarios.EOF

     

    ' ## Retorna os  Horários Cadastrados Na Agenda

    Set cmdAgenda = Server.CreateObject("ADODB.Command")

    cmdAgenda.ActiveConnection = DataAgenda

    cmdAgenda.CommandText = "SELECT horario FROM agenda WHERE data = '" & varData & "' and horario = '" & rsHorarios("Horario") & "'"

    cmdAgenda.CommandType = 1

    Set rsAgenda = Server.CreateObject("ADODB.Recordset")

    rsAgenda.Open cmdAgenda, , 0, 1       

     

    ' ## Se o SELECT acima nao retornar registro ele retorna -1

    ' ## Ou seja, nao existe nenhum cadastro com esse horario

    ' ## Entao pode ser incluído no combo

    If rsAgenda.recordcount < 0 then

    %>

              <option><%=rsHorarios("Horario") %></option>

    <%

    End If

    rsAgenda = Nothing

     


    rsHorarios.MoveNext

    loop

    %>

     

     

    Abraços

     

    Estevam

    terça-feira, 13 de novembro de 2007 12:20
  • Eder, pelo seu comentário e pelo código que voce passou, ele esta gerando todos dentro do combo, porque o select dentro do loop estao retornando todos com -1, ou seja, o if dentro do loop se torna verdadeiro a todo momento, pelo que estava vendo no código, isto ocorre porque talvez o método de abertura do cursor nao seja o apropriado, tente com o código abaixo:

     

    Obs.:

    1) Havia um parte do código errado por minha culpa, seguinte, quando o recordset nao encontra nenhum registro ele retorna com valor 0, ele só irá retornar -1 se o recordset nao poder lido ou se já tiver chegado ao seu fim.

    2) Alterei o cursor dentro do loop, se nao der certo altere o primeiro cursor também.

    3) Alterei o if também para If rsAgenda.recordcount <= 0 then

     

     

    Code Block

    <select size="1" name="PeriodoAgendamento">
    <%

    ' ## Retorna todos os departamentos
    Set cmdHorarios = Server.CreateObject("ADODB.Command")
    cmdHorarios.ActiveConnection = DataAgenda
    cmdHorarios.CommandText = "SELECT * FROM TBLPeriodosAgendamento order by Periodo"
    cmdHorarios.CommandType = 1
    Set rsHorarios = Server.CreateObject("ADODB.Recordset")
    rsHorarios.Open cmdHorarios, , 0, 1

           
    Do While Not rsHorarios.EOF


    ' ## Retorna os  Horários Cadastrados Na Agenda
    Set cmdAgenda = Server.CreateObject("ADODB.Command")
    cmdAgenda.ActiveConnection = DataAgenda
    cmdAgenda.CommandText = "SELECT PeriodoAgendamento FROM TBLAgendamentos WHERE DataAgendada = '" & request("View_day") & "' and PeriodoAgendamento = '" & rsHorarios("Periodo") & "'"
    cmdAgenda.CommandType = 1
    Set rsAgenda = Server.CreateObject("ADODB.Recordset")

    ' ### Alterando método de abertura do cursor
    rsAgenda.Open cmdAgenda, , 3, 3      

    ' ## Se o SELECT acima nao retornar registro ele retorna -1
    ' ## Ou seja, nao existe nenhum cadastro com esse horario
    ' ## Entao pode ser incluído no combo
    If rsAgenda.recordcount <= 0 then

    %>
              <option><%=rsHorarios("Periodo") %></option>
    <%

    End If
    rsAgenda = Nothing
    rsHorarios.MoveNext
    loop
    %>
    </select>

     

     

     

     

     

    Abraços

     

    Estevam

    quarta-feira, 14 de novembro de 2007 18:49
  • Eder poe o código abaixo para podermos depurar o código do que esta acontecendo, se poder me envia o resultado.

     

    Code Block

    <select size="1" name="PeriodoAgendamento">
    <%

    ' ## Retorna todos os departamentos
    Set cmdHorarios = Server.CreateObject("ADODB.Command")
    cmdHorarios.ActiveConnection = DataAgenda
    cmdHorarios.CommandText = "SELECT * FROM TBLPeriodosAgendamento order by Periodo"
    cmdHorarios.CommandType = 1
    Set rsHorarios = Server.CreateObject("ADODB.Recordset")
    rsHorarios.Open cmdHorarios, , 0, 1

           
    Do While Not rsHorarios.EOF


    ' ## Retorna os  Horários Cadastrados Na Agenda
    Set cmdAgenda = Server.CreateObject("ADODB.Command")
    cmdAgenda.ActiveConnection = DataAgenda
    cmdAgenda.CommandText = "SELECT PeriodoAgendamento FROM TBLAgendamentos WHERE DataAgendada = '" & request("View_day") & "' and PeriodoAgendamento = '" & rsHorarios("Periodo") & "'"
    cmdAgenda.CommandType = 1
    Set rsAgenda = Server.CreateObject("ADODB.Recordset")

    ' ## Alterando método de abertura do cursor
    rsAgenda.Open cmdAgenda, , 3, 3

    ' ## Contagem de registros encontrados no select

    Dim contregistros : contregistros = rsAgenda.recordcount

    ' ## Depuraçao de código

    Response.Write("Campo DataAgendada: " & request("View_day") & " ---- "

    Response.Write("Campo PerídoAgendamento" & rsHorarios("Periodo") & " ---- "

    Response.Write("Recordcount: " &  contregistros & "<br />"

    ' ## Se o SELECT acima nao retornar registro ele retorna -1
    ' ## Ou seja, nao existe nenhum cadastro com esse horario
    ' ## Entao pode ser incluído no combo
    If contregistros = 0 then

    %>

    <option><%=rsHorarios("Periodo") %></option>

    <%

    End If
    rsAgenda = Nothing
    rsHorarios.MoveNext
    loop
    %>
    </select>

     

     

     

    Abraços

     

    Estevam

    sexta-feira, 16 de novembro de 2007 12:36

Todas as Respostas

  • Eder vou tentar te passar a lógica que tenho em mente mas nao quer dizer que a sua esteja errada.

     

    CamposTabelaX

    ID_DATA                TIPO: INTEIRO          AUTONUMERAÇAO

    DATA                     TIPO: CARACTERE

    DIA_COMPLETO     TIPO: SIM/NAO

    USUARIO               TIPO: CARACTERE

    SALA                     TIPO: CARACTERE OU INTEIRO (CONFORME FOR MELHOR)

    ASSUNTO              TIPO: CARACTERE

     

    CamposTabelaY

    ID_DATA_HORA      TIPO:INTEIRO          AUTONUMERAÇAO

    DATA                     TIPO:CARACTERE

    HORA                    TIPO: CARACTERE

    HORA_ATIVA         TIPO: SIM/NAO

     

    Agora supondo que tenho as duas tabelas acima, faço o seguinte antes de inserir qualquer dados, pego os parametros passado pelo usuario como data e hora e converto para string certo?

    Vamos suporte que a pessoa vai ficar o dia inteiro em reuniao entao em vez de gravar hora por hora pego o dia e coloco um "Sim" no campo "DIA_COMPLETO" na "TabelaX", assim se caso voce estiver marcando por um calendário este dia voce pode desabilitar o link e marca-lo por exemplo como "nao há horário", só verificando o campo "Dia_completo" na tabelaX certo?

    Agora digamos que ele vá usar somente uma hora entao se pega os dados, converte pra string e insere as informaçoes na TabelaX e na TabelaY, só que na tabela Y voce vai trocar o campo "hora_ativa" para SIM Ok?

    Voce faz um select com todas as horas ativas para o dia em escolhido, tipo:

     

    select hora from tabelaY where data = '20071112'  and hora_ativa = true

     

    Depois na hora de montar o combo voce faz um loop comparando a hora que ele quer com o campos trazidos pelo select se forem iguais voce nao inclui ele no campo?

     

    Bom acho que já compliquei demais né, se precisar de alguma coisa posta ai

     

    Abraços

     

    Estevam

     

    segunda-feira, 12 de novembro de 2007 18:46
  • Bom dia Estevam,

     

    É justamente essa comparação e o loop para montar o combo que eu não estou conseguindo fazer.

    Veja bem... eu tenho 2 tabelas...

     

    Exemplo com os campos principais:

     

    Tabela Agenda

    CodigoAgenda

    AgendadoPara

    Data

    Horario

     

     

    Tabela Horários

    CodigoHorario
    Horario

     

    O combo, na página é montado através do seguinte código:

     

     

    Code Block

    <%

    ' ## Retorna os Horários disponíveis

    Set cmdHorarios = Server.CreateObject("ADODB.Command")
    cmdHorarios.ActiveConnection = DataAgenda
    cmdHorarios.CommandText = "SELECT * FROM Horarios order by Horario"
    cmdHorarios.CommandType = 1
    Set rsHorarios = Server.CreateObject("ADODB.Recordset")
    rsHorarios.Open cmdHorarios, , 0, 1
    %>

           <select size="1" name="Horarios">
    <%
    Do While Not rsHorarios.EOF
    %>
           
           <option><% =rsHorarios("Horario") %></option>
    <%
    rsHorarios.MoveNext
    loop
    %>

     

     

    Até ai tudo bem...

     

    Agora, eu preciso saber... antes de montar o combo, quais horários estão disponíveis, para não haver novos agendamentos. Ele deve comparar com os registros da tabela Agenda e verificar se existe o horário agendado e mostrar somente os livres. Não sei fazer esta comparação...

     

    Fico no aguardo.

    terça-feira, 13 de novembro de 2007 11:19
  • Vamos lá vou tentar te ajudar, pelo que entendi na tabela Agenda é onde se cadastra as datas e horários certo? E na tabela horários é onde ficam armazenados todos os horários disponíveis. Entao acho que deveria ser mais ou menos assim:

     

    Fiz o código abaixo veja se é mais ou menos isso se nao for poste novamente.

     

    Code Block

    <%

    ' ## Retorna os Horários disponíveis

    Set cmdHorarios = Server.CreateObject("ADODB.Command")
    cmdHorarios.ActiveConnection = DataAgenda
    cmdHorarios.CommandText = "SELECT * FROM Horarios order by Horario"
    cmdHorarios.CommandType = 1
    Set rsHorarios = Server.CreateObject("ADODB.Recordset")
    rsHorarios.Open cmdHorarios, , 0, 1


    %>

    <select size="1" name="Horarios">
    <%
    Do While Not rsHorarios.EOF

     

    ' ## Retorna os  Horários Cadastrados Na Agenda

    Set cmdAgenda = Server.CreateObject("ADODB.Command")

    cmdAgenda.ActiveConnection = DataAgenda

    cmdAgenda.CommandText = "SELECT horario FROM agenda WHERE data = '" & varData & "' and horario = '" & rsHorarios("Horario") & "'"

    cmdAgenda.CommandType = 1

    Set rsAgenda = Server.CreateObject("ADODB.Recordset")

    rsAgenda.Open cmdAgenda, , 0, 1       

     

    ' ## Se o SELECT acima nao retornar registro ele retorna -1

    ' ## Ou seja, nao existe nenhum cadastro com esse horario

    ' ## Entao pode ser incluído no combo

    If rsAgenda.recordcount < 0 then

    %>

              <option><%=rsHorarios("Horario") %></option>

    <%

    End If

    rsAgenda = Nothing

     


    rsHorarios.MoveNext

    loop

    %>

     

     

    Abraços

     

    Estevam

    terça-feira, 13 de novembro de 2007 12:20
  •  

    Boa tarde Estevam,

     

    Desculpe-me pela demora, estava tentando fazer funcionar. Fiz os testes, mas não muda absolutamente nada. Não dá erro nenhum, mas todos os horários, os agendados e os não agendados estão sendo exibidos no combo....

     

    Só mudei os nomes dos campos adequando para os que estão na minha tabela. Olha só como eu coloquei:

     

    Code Block

           <select size="1" name="PeriodoAgendamento">
    <%

    ' ## Retorna todos os departamentos
    Set cmdHorarios = Server.CreateObject("ADODB.Command")
    cmdHorarios.ActiveConnection = DataAgenda
    cmdHorarios.CommandText = "SELECT * FROM TBLPeriodosAgendamento order by Periodo"
    cmdHorarios.CommandType = 1
    Set rsHorarios = Server.CreateObject("ADODB.Recordset")
    rsHorarios.Open cmdHorarios, , 0, 1
    %>


           
    <%
    Do While Not rsHorarios.EOF
    %>

    <%
    ' ## Retorna os  Horários Cadastrados Na Agenda
    Set cmdAgenda = Server.CreateObject("ADODB.Command")
    cmdAgenda.ActiveConnection = DataAgenda
    cmdAgenda.CommandText = "SELECT PeriodoAgendamento FROM TBLAgendamentos WHERE DataAgendada = '" & request("View_day") & "' and PeriodoAgendamento = '" & rsHorarios("Periodo") & "'"
    cmdAgenda.CommandType = 1
    Set rsAgenda = Server.CreateObject("ADODB.Recordset")
    rsAgenda.Open cmdAgenda, , 0, 1      

    ' ## Se o SELECT acima nao retornar registro ele retorna -1
    ' ## Ou seja, nao existe nenhum cadastro com esse horario
    ' ## Entao pode ser incluído no combo
    If rsAgenda.recordcount < 0 then

    %>
              <option><%=rsHorarios("Periodo") %></option>
    <%

    End If
    rsAgenda = Nothing
    %> 
    <%
    rsHorarios.MoveNext
    loop
    %>
           </select>

     

     

    Estrutura das Tabelas

     

    TBLPeriodosAgendamento

    TBLPeriodosAgendamento

    CodigoPeriodo

    Periodo

    1

    07:00 às 07:38

    2

    08:15 às 08:52

    3

    10:00 às 10:38

    4

    11:15 às 11:52

    5

    13:00 às 13:38

    6

    14:15 às 14:52

    7

    16:00 às 16:38

    8

    17:15 às 17:52

    9

    19:10 às 20:00

    10

    21:10 às 22:00

     

    TBLAgendamentos

    TBLAgendamentos

    CodigoAgendamento

    CodigoAgenda

    DataAgendada

    AgendadoPara

    PeriodoAgendamento

    ObsAgendamento

    DataAgendamento

    26

    1

    quinta-feira, 29 de novembro de 2007

    1

    07:00 às 07:38

    Testando Observação

    05/11/2007

    27

    1

    quinta-feira, 29 de novembro de 2007

    1

    19:10 às 20:00

    Testando Observação

    09/11/2007

     

    No caso acima, para o dia 29/11/2007 existem dois agendamentos. Um para 07:00 às 07:38 e outro para 19:10 às 20:00. Logo, estes não deveriam aparecer.

     

    OBS: Pensei em gravar o código do período na tabela de agendamento ao invés de gravar o valor.. você acha que ficaria melhor?

     

    Obrigado pela força e continuo no aguardo,

    quarta-feira, 14 de novembro de 2007 17:53
  • Eder, pelo seu comentário e pelo código que voce passou, ele esta gerando todos dentro do combo, porque o select dentro do loop estao retornando todos com -1, ou seja, o if dentro do loop se torna verdadeiro a todo momento, pelo que estava vendo no código, isto ocorre porque talvez o método de abertura do cursor nao seja o apropriado, tente com o código abaixo:

     

    Obs.:

    1) Havia um parte do código errado por minha culpa, seguinte, quando o recordset nao encontra nenhum registro ele retorna com valor 0, ele só irá retornar -1 se o recordset nao poder lido ou se já tiver chegado ao seu fim.

    2) Alterei o cursor dentro do loop, se nao der certo altere o primeiro cursor também.

    3) Alterei o if também para If rsAgenda.recordcount <= 0 then

     

     

    Code Block

    <select size="1" name="PeriodoAgendamento">
    <%

    ' ## Retorna todos os departamentos
    Set cmdHorarios = Server.CreateObject("ADODB.Command")
    cmdHorarios.ActiveConnection = DataAgenda
    cmdHorarios.CommandText = "SELECT * FROM TBLPeriodosAgendamento order by Periodo"
    cmdHorarios.CommandType = 1
    Set rsHorarios = Server.CreateObject("ADODB.Recordset")
    rsHorarios.Open cmdHorarios, , 0, 1

           
    Do While Not rsHorarios.EOF


    ' ## Retorna os  Horários Cadastrados Na Agenda
    Set cmdAgenda = Server.CreateObject("ADODB.Command")
    cmdAgenda.ActiveConnection = DataAgenda
    cmdAgenda.CommandText = "SELECT PeriodoAgendamento FROM TBLAgendamentos WHERE DataAgendada = '" & request("View_day") & "' and PeriodoAgendamento = '" & rsHorarios("Periodo") & "'"
    cmdAgenda.CommandType = 1
    Set rsAgenda = Server.CreateObject("ADODB.Recordset")

    ' ### Alterando método de abertura do cursor
    rsAgenda.Open cmdAgenda, , 3, 3      

    ' ## Se o SELECT acima nao retornar registro ele retorna -1
    ' ## Ou seja, nao existe nenhum cadastro com esse horario
    ' ## Entao pode ser incluído no combo
    If rsAgenda.recordcount <= 0 then

    %>
              <option><%=rsHorarios("Periodo") %></option>
    <%

    End If
    rsAgenda = Nothing
    rsHorarios.MoveNext
    loop
    %>
    </select>

     

     

     

     

     

    Abraços

     

    Estevam

    quarta-feira, 14 de novembro de 2007 18:49
  • Boa noite,

     

    Fiz as alterações mas infelizmente não deu certo... agora não aparece nada no combo....

     

    Já tentei substituir a variavel que retorna a data,colocando a propria data no select, mas mesmo assim não deu certo.

     

    Continuo no aguardo,

     

    quinta-feira, 15 de novembro de 2007 22:01
  • Eder poe o código abaixo para podermos depurar o código do que esta acontecendo, se poder me envia o resultado.

     

    Code Block

    <select size="1" name="PeriodoAgendamento">
    <%

    ' ## Retorna todos os departamentos
    Set cmdHorarios = Server.CreateObject("ADODB.Command")
    cmdHorarios.ActiveConnection = DataAgenda
    cmdHorarios.CommandText = "SELECT * FROM TBLPeriodosAgendamento order by Periodo"
    cmdHorarios.CommandType = 1
    Set rsHorarios = Server.CreateObject("ADODB.Recordset")
    rsHorarios.Open cmdHorarios, , 0, 1

           
    Do While Not rsHorarios.EOF


    ' ## Retorna os  Horários Cadastrados Na Agenda
    Set cmdAgenda = Server.CreateObject("ADODB.Command")
    cmdAgenda.ActiveConnection = DataAgenda
    cmdAgenda.CommandText = "SELECT PeriodoAgendamento FROM TBLAgendamentos WHERE DataAgendada = '" & request("View_day") & "' and PeriodoAgendamento = '" & rsHorarios("Periodo") & "'"
    cmdAgenda.CommandType = 1
    Set rsAgenda = Server.CreateObject("ADODB.Recordset")

    ' ## Alterando método de abertura do cursor
    rsAgenda.Open cmdAgenda, , 3, 3

    ' ## Contagem de registros encontrados no select

    Dim contregistros : contregistros = rsAgenda.recordcount

    ' ## Depuraçao de código

    Response.Write("Campo DataAgendada: " & request("View_day") & " ---- "

    Response.Write("Campo PerídoAgendamento" & rsHorarios("Periodo") & " ---- "

    Response.Write("Recordcount: " &  contregistros & "<br />"

    ' ## Se o SELECT acima nao retornar registro ele retorna -1
    ' ## Ou seja, nao existe nenhum cadastro com esse horario
    ' ## Entao pode ser incluído no combo
    If contregistros = 0 then

    %>

    <option><%=rsHorarios("Periodo") %></option>

    <%

    End If
    rsAgenda = Nothing
    rsHorarios.MoveNext
    loop
    %>
    </select>

     

     

     

    Abraços

     

    Estevam

    sexta-feira, 16 de novembro de 2007 12:36
  • Valeu Estevam,

     

    Eu que tava fazendo cagada aqui.. deu certinho...

     

     

    Muito obrigado.....

    segunda-feira, 19 de novembro de 2007 12:15