Ajuda com Consulta em Access

lfernandes

Power Member
Boas onde trabalho temos uma base de dados em access onde, para questões estatísticas, são introduzidos os dados relativos à ocupação de uma sala com duas boxes. Pediram-me para ver se era possível saber quando estiveram as duas ocupadas e quantas vezes. Já andei às voltas com as consultas mas os meus conhecimentos de access são fracos.
A tabela tem quatro campos que acho que são os importantes:
data de admissão
hora de admissão
data de saida
hora de saida

creio ser possível com estes quatro campos sabermos o que se quer mas não consigo lá chegar.
 
Grande empregado me saíste tu xD.
Sim é possível com essas 4 tabelas saber o que pretendes e sem muita complicação. Aprende um pouco mais de acess que chegas lá.
 
Grande empregado me saíste tu xD.
Sim é possível com essas 4 tabelas saber o que pretendes e sem muita complicação. Aprende um pouco mais de acess que chegas lá.

Primeiro nem sequer trabalho na área de informática nem sequer o local de trabalho é relacionado com informática. A base de dados fui eu quem a fiz sem conhecimentos de access, fui auto didacta. Tem servido perfeitamente para o seu propósito mas o que me pediram ultrapassa a minha capacidade autodidata. Sempre posso rever os registos um a um na tabela mas queria que uma consulta o fizesse pois são centenas de registos.
 
Grande empregado me saíste tu xD.
Sim é possível com essas 4 tabelas saber o que pretendes e sem muita complicação. Aprende um pouco mais de acess que chegas lá.

Que resposta tão útil. 4 tabelas? No post inicial são referidos 4 campos...

lfernandes, o que é que pretendes mesmo? O número de admissões por dia? Como não estás a registar a box que a pessoa ocupa penso que terás que ver o seguinte:

1 - Número total de admissões que a sala suporta, ocupando as duas boxes
2 - Sabendo este número, contar o número de admissões de um dado dia, que tenham uma saída no próprio dia
3 - Número de ocasiões onde o nº 2 é maior ou igual ao nº 1

Terás que fazer counts na consulta, ou até usar uma subconsulta. Disponibiza um exemplo de um dia de registos, talvez seja mais fácil ajudar-te.
 
Que resposta tão útil. 4 tabelas? No post inicial são referidos 4 campos...

lfernandes, o que é que pretendes mesmo? O número de admissões por dia? Como não estás a registar a box que a pessoa ocupa penso que terás que ver o seguinte:

1 - Número total de admissões que a sala suporta, ocupando as duas boxes
2 - Sabendo este número, contar o número de admissões de um dado dia, que tenham uma saída no próprio dia
3 - Número de ocasiões onde o nº 2 é maior ou igual ao nº 1

Terás que fazer counts na consulta, ou até usar uma subconsulta. Disponibiza um exemplo de um dia de registos, talvez seja mais fácil ajudar-te.
Obrigado, basicamente o que quero saber é quantas vezes as duas boxes estiveram ocupadas ao mesmo tempo, a coisa teria sido provavelmente mais fácil se tivesse colocado uma campo ou 2 onde registar isso mas agora são centenas de registos desde o inicio do ano e essa informação não foi registada, agora só fazendo uma consulta que comparasse os 4 campos da tabela para me dar esse resultado ou ver os registos mannualmente um a um.
Aqui fica um link para uma cópia da base de dados em branco (não posso disponibilizar a outra por causa dos dados): https://meocloud.pt/link/8bf96fb6-4...84dbc/DOENTES EMERGENCIA - EM BRANCO (2).mdb/
De notar que fiz esta base de dados sem quaisquer conhecimentos de access. A pass é: reanima2014
 
Última edição:
Isso não é possível fazer em forma de consulta SQL de forma minimamente aceitável.

Se colocares um campo Box na tabela podes usar o seguinte procedimento para marcar como Box 2 as ocupações simultâneas:

Código:
Private Sub MarcarBoxes()    
    Dim rst As Recordset, rstB As Recordset
    Dim De As Date, Ds As Date, Box As Integer
    
    'Remover o número de Box de todos os registos
    CurrentDb.Execute "UPDATE ADMISSOES SET Box=NULL"
    
    'a ordem na pesquisa é importante
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM ADMISSOES ORDER BY [DIA DE ADMISSÃO],[HORA DE ADMISSÃO]")
    If rst.EOF Then Exit Sub
    
    rst.MoveFirst
    Do Until rst.EOF
        'mostrar o progresso na Janela 'Immediate' (menu ver)
        Debug.Print rst!ID ' ou quaisquer outros dados
        DoEvents
        
        'o calculo de data hora seria facilitado se estivesse num unico registo
        De = DateValue(rst("[DIA DE ADMISSÃO]")) + TimeValue(rst("[HORA DE ADMISSÃO]"))
        Ds = DateValue(rst("[DIA DE SAIDA]")) + TimeValue(rst("[HORA DE SAIDA]"))
        If IsNull(rst!Box) Then
            Box = 1
            rst.Edit
            rst!Box = 1
            rst.Update
        Else
            Box = rst!Box
        End If
        'pesquisar outros registos que tenham a data hora de admissão dentro do intervalo desta ocupação
        Set rstB = CurrentDb.OpenRecordset("SELECT * FROM ADMISSOES WHERE ID<>" & rst!ID & " AND " _
                & "([DIA DE ADMISSÃO]+[HORA DE ADMISSÃO]) BETWEEN #" & Format(De, "yyyy-mm-dd hh:nn") _
                & "# AND #" & Format(Ds, "yyyy-mm-dd hh:nn") & "#")
        Do Until rstB.EOF
            'o perido de ocupação simultânea será o compreendido entre a data hora de admissão deste registo
            'e Ds ( Data de saída do registo anterior)
            ' Podes guardar numa tabela propria para o caso de os periodos de ocupação simultanea serem importantes
            
            'será guardado o número da box 2+ para as ocupações simultaneas, so para titulo de exemplo
            ' o campo Box terá de ser adicionado à tabela Admissoes
            Box = Box + 1
            rstB.Edit
            rstB!Box = Box
            rstB.Update
            rstB.MoveNext
        Loop
        rst.MoveNext
    Loop
    MsgBox "Terminado"
End Sub
 
Última edição:
Isso não é possível fazer em forma de consulta SQL de forma minimamente aceitável.

Se colocares um campo Box na tabela podes usar o seguinte procedimento para marcar como Box 2 as ocupações simultâneas:

Código:
Private Sub MarcarBoxes()    
    Dim rst As Recordset, rstB As Recordset
    Dim De As Date, Ds As Date, Box As Integer
    
    'Remover o número de Box de todos os registos
    CurrentDb.Execute "UPDATE ADMISSOES SET Box=NULL"
    
    'a ordem na pesquisa é importante
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM ADMISSOES ORDER BY [DIA DE ADMISSÃO],[HORA DE ADMISSÃO]")
    If rst.EOF Then Exit Sub
    
    rst.MoveFirst
    Do Until rst.EOF
        'mostrar o progresso na Janela 'Immediate' (menu ver)
        Debug.Print rst!ID ' ou quaisquer outros dados
        DoEvents
        
        'o calculo de data hora seria facilitado se estivesse num unico registo
        De = DateValue(rst("[DIA DE ADMISSÃO]")) + TimeValue(rst("[HORA DE ADMISSÃO]"))
        Ds = DateValue(rst("[DIA DE SAIDA]")) + TimeValue(rst("[HORA DE SAIDA]"))
        If IsNull(rst!Box) Then
            Box = 1
            rst.Edit
            rst!Box = 1
            rst.Update
        Else
            Box = rst!Box
        End If
        'pesquisar outros registos que tenham a data hora de admissão dentro do intervalo desta ocupação
        Set rstB = CurrentDb.OpenRecordset("SELECT * FROM ADMISSOES WHERE ID<>" & rst!ID & " AND " _
                & "([DIA DE ADMISSÃO]+[HORA DE ADMISSÃO]) BETWEEN #" & Format(De, "yyyy-mm-dd hh:nn") _
                & "# AND #" & Format(Ds, "yyyy-mm-dd hh:nn") & "#")
        Do Until rstB.EOF
            'o perido de ocupação simultânea será o compreendido entre a data hora de admissão deste registo
            'e Ds ( Data de saída do registo anterior)
            ' Podes guardar numa tabela propria para o caso de os periodos de ocupação simultanea serem importantes
            
            'será guardado o número da box 2+ para as ocupações simultaneas, so para titulo de exemplo
            ' o campo Box terá de ser adicionado à tabela Admissoes
            Box = Box + 1
            rstB.Edit
            rstB!Box = Box
            rstB.Update
            rstB.MoveNext
        Loop
        rst.MoveNext
    Loop
    MsgBox "Terminado"
End Sub

Desculpa perguntar mas depois como é que faço para que esse procedimento seja feito? É que parcebo muito pouco disto.
 
Crias um novo form e associas esse código, acho eu. Já agora, se a confidencialidade é essencial, devias ter apagado quase tudo desse ficheiro.
 
Primeiro adicionar o campo Box à tabela ADMISSOES

Abres o editor VBA (Alt + F11) e no explorador de projectos procura em Modules,
duplo clique para abrires o module1 e inseres o procedimento que te dei.
Colocas o cursor dentro de uma qualquer linha do procedimento e clica RunMacro ou F5.

Em caso de dúvida pressiona F1. A ajuda do Access é bem completa.

Para visualizares os registos que ficarem marcados com Box=2, abre a tabela ADMISSOES e filtra pelo campo Box com valor númerico =2
ou então cria uma consulta baseada nesse valor:
SELECT * FROM ADMISSOES WHERE Box=2
 
Crias um novo form e associas esse código, acho eu. Já agora, se a confidencialidade é essencial, devias ter apagado quase tudo desse ficheiro.

O ficheiro que enviei apenas tem dados que são de conhecimento publico e que podem ser encontrados com facilidade na net. Já está a funcionar, obrigado a todos :)
 
Última edição:
Back
Topo