MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    [Resolvido]Consulta Departamentos Historico

    Compartilhe

    LeoStar
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 104
    Registrado : 18/05/2010

    [Resolvido]Consulta Departamentos Historico

    Mensagem  LeoStar em 12/10/2017, 18:48

    Caros colegas do fórum,

    Volto na tentativa de encontrar ajuda para uma consulta que não estou a conseguir fazer

    Tenho uma tabela de funcionários - TabFuncionarios - e uma outra que regista o departamento e mudanças que ocorram ao longo dos vários anos letivos - TabGestDepartamentos.

    O que precisava era de uma consulta que me retornasse o histórico do funcionário desde o 1ºregisto na TabGestDepartamentos até ao Ano Letivo Atual (ALA) dado por uma consulta.

    O que acontece é que a consulta que desenvolvi - CsFuncDepartamentosHistorico - me duplica a informação, i.e., se um funcionário passou por mais que um departamento ela devolve X anos num departamento e os mesmos anos no outro departamento, em vez de mostrar os anos no 1º departamento e depois da mudança os anos no outro departamento.

    Alguém que me possa dar uma luz para resolução do problema?

    Anexo a base como exemplo que está feita em Access 2010.

    Antecipadamente grato.
    Anexos
    Exemplo.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (84 Kb) Baixado 14 vez(es)
    avatar
    Assis
    Maximo VIP
    Maximo VIP

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 3550
    Registrado : 06/11/2009

    Re: [Resolvido]Consulta Departamentos Historico

    Mensagem  Assis em 12/10/2017, 21:45

    Boa noite

    Será +- isto ?[Você precisa estar registrado e conectado para ver esta imagem.]


    .................................................................................
    *** Só sei que nada sei ***

    LeoStar
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 104
    Registrado : 18/05/2010

    Consulta Departamentos Historico

    Mensagem  LeoStar em 13/10/2017, 17:06

    Caro colega do fórum,

    Em primeiro lugar bem haja pela sua atenção. Contudo não é isso que eu pretendo. O que necessito optei por numa tabela de Excel para que melhor se possa ver.
    Mas o princípio é este: a consulta deve estar ordenada por código de funcionário e dentro deste constarem os departamento a que ele pertence desde o 1º registo na TabGestDepartamentos até ao ano lectivo atual (2017/2018) que é dado pela consulta ALA. O critério que pode ver na vista de estrutura da 1ª coluna da consulta (CsDepartamentosHistorico) assim vai retornar.
    O problema é que a consulta me devolve todos os departamentos como o funcionário tendo estado neles desde o 1º registo até ao ALA. E isso não é assim, pois ele muda de departamento em determinadas datas que correspondem a outros tantos anos lectivos.
    Não sei se me fiz compreender mas se executar a consulta "CsDepartamentosHistorico" e a comparar com o Excel que agora anexo talvez consiga ver melhor o problema.
    De qualquer modo grato e esperando mais uma ajuda para a solução.
    Anexos
    CsFuncDepartamentoHistorico.xlsx
    Você não tem permissão para fazer download dos arquivos anexados.
    (12 Kb) Baixado 10 vez(es)
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7030
    Registrado : 05/11/2009

    Re: [Resolvido]Consulta Departamentos Historico

    Mensagem  Alexandre Neves em 15/10/2017, 17:59

    Boa tarde,
    veja
    Anexos
    Exemplo.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (90 Kb) Baixado 15 vez(es)


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    LeoStar
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 104
    Registrado : 18/05/2010

    Consulta Departamentos Historico

    Mensagem  LeoStar em 17/10/2017, 08:08

    Caro Alexandre Neves,

    Bem haja pelo seu tempo na busca da solução para a consulta referida.

    Quase que lá estamos... E digo quase porque se reparar o funcionário com o código 13 muda de departamento no mesmo ano lectivo e tal não é devolvido. Com a DataRegisto de 07-10-1996 no AnoLetivo 1996/1997 entra no departamento Transportes mas depois em 01-03-1997, no mesmo AnoLetivo, muda para o departamento Refeitório. E no Historico ele mantém-se até 01-09-2007 no departamento Transportes, pois o código não mostra a mudança no mesmo AnoLetivo, dada pela DataRegisto, para o outro departamento Refeitório.

    Entretanto fiz uma ligeira alteração no modulo1 que apresento no modulo2, apenas para possibilitar que o utilizador defina o último ano que quer em análise. Expliquei essa alteração no próprio modulo2, em jeito de comentário. Assim junto uma nova base a que dei o nome exemplo2.

    Portanto e em resumo só gostaria que pudesse dar mais uma vista de olhos ao código para tentar ajudar neste problema de mudança de departamento se ela ocorrer no mesmo ano lectivo. Já tentei mas não estou a conseguir resolver.

    Antecipadamente grato.
    Anexos
    Exemplo2.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (50 Kb) Baixado 8 vez(es)
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7030
    Registrado : 05/11/2009

    Re: [Resolvido]Consulta Departamentos Historico

    Mensagem  Alexandre Neves em 17/10/2017, 10:35

    Bom dia
    Código:
    Sub PreencheHistorico()
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '  código criado por Alexandre Neves, do Fórum MaximoAccess                                                '
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim RstF As DAO.Recordset, RstG As DAO.Recordset, intAno As Integer, intAnoI As Integer, intAnoF As Integer, dtDataR As Date, strTipR As String, strDepR As String
        Dim RstGFiltrado As DAO.Recordset
       
        'Alterei o nome da tabela de "Historico" para "TabTempHistorico" para evidenciar que é uma tabela temporária cujos registos serão apagados e recriados quando correr o código
        CurrentDb.Execute "DELETE * FROM TabTempHistorico"
        Set RstF = CurrentDb.OpenRecordset("SELECT * FROM TabFuncionarios ORDER BY CodFuncionario")

       
        Do While Not RstF.EOF
            Set RstG = CurrentDb.OpenRecordset("SELECT * FROM TabGestDepartamentos WHERE CodFuncionario=" & RstF("CodFuncionario") & " ORDER BY ID_Registo")
            intAnoI = Left(RstG("AnoLetivo"), 4)
           
            'Excluí a linha abaixo para permitir alterar o Ano Lectivo Atual pelo utilizador e não depender da data em que estamos a trabalhar
            'intAnoF = Year(Date)
           
            'E escrevi então este código
            intAnoF = Left(DLookup("AnoLectivo", "Consulta ALA"), 4)
          '---------------------------------------------------------
            For intAno = intAnoI To intAnoF
                RstG.Filter = "AnoLetivo='" & intAno & "/" & intAno + 1 & "'"
                If RstF("CodFuncionario") = 13 Then
                    Debug.Print
                End If
                Set RstGFiltrado = RstG.OpenRecordset
                If RstGFiltrado.RecordCount = 0 Then
                    Call RegistaHistorico(intAno, RstF("Codfuncionario"), RstF("NomEscola"), dtDataR, strTipR, strDepR)
                Else
                    Do While Not RstGFiltrado.EOF
                        Call RegistaHistorico(intAno, RstF("Codfuncionario"), RstF("NomEscola"), RstGFiltrado("DataRegisto"), RstGFiltrado("TipDepartam"), RstGFiltrado("Departamento"))
                        dtDataR = RstG("DataRegisto"): strTipR = RstG("TipDepartam"): strDepR = RstG("Departamento")
                        RstGFiltrado.MoveNext
                    Loop
                End If
            Next
            RstF.MoveNext
        Loop
       
    End Sub

    Sub RegistaHistorico(Ano As Integer, CodFuncionario As Integer, NomeEscola As String, DataRegisto As Date, TipDepartam As String, Departamento As String)
        Dim RstH As DAO.Recordset
        Set RstH = CurrentDb.OpenRecordset("SELECT * FROM TabTempHistorico")
        RstH.AddNew
        RstH("AnoLectivo") = Ano & "/" & Ano + 1
        RstH("CodFuncionario") = CodFuncionario
        RstH("NomeEscola") = NomeEscola
        RstH("DataRegisto") = DataRegisto
        RstH("TipDepartam") = TipDepartam
        RstH("Departamento") = Departamento
        RstH.Update
    End Sub


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    LeoStar
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 104
    Registrado : 18/05/2010

    Consulta Departamentos Historico

    Mensagem  LeoStar em 19/10/2017, 17:26

    Boa tarde...

    Só agora pude voltar pois estive doente estes dias e não tive oportunidade nem cabeça para ver, com atenção, o código que me postou.
    O que constatei é que é inserida uma linha na tabela que na verdade evidencia a mudança de departamento ocorrida num mesmo ano lectivo, mas depois nas linhas seguintes (registos) ele volta a mostrar o departamento anterior em vez de continuar com o departamento para o qual o funcionário mudou. E nos outros funcionários acontece o mesmo.

    Também pude ver que utilizou a condição "If RstF("CodFuncionario") = 13". Mas e se houver mais do que um funcionário com o mesmo caso, i.e., se mais do que um funcionário mudar de departamento no mesmo ano lectivo?.. Não haverá forma de pôr uma condição que previamente procure tal facto?.. Eu construí uma consulta "CsContaRegAL" que dá o nº de mudanças de departamento no mesmo Ano Lectivo. Caso esse número fosse >1 ele estava nas mesmas condições que o funcionário 13.

    Fico na expectativa e grato. Junto novamente agora o exemplo 3 que tem a nova consulta que referi acima.
    Anexos
    Exemplo3.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (56 Kb) Baixado 9 vez(es)
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7030
    Registrado : 05/11/2009

    Re: [Resolvido]Consulta Departamentos Historico

    Mensagem  Alexandre Neves em 20/10/2017, 18:32

    Boa tarde,
    A linha onde coloquei o funcionário 13 não executa nenhum dado, apenas servia para interromper a execução quando o funcionário fosse o 13 para eu analisar passo-a-passo a execução
    Veja agora
    Código:
    Sub PreencheHistorico()
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '  código criado por Alexandre Neves, do Fórum MaximoAccess                                                '
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim RstF As DAO.Recordset, RstG As DAO.Recordset, intAno As Integer, intAnoI As Integer, intAnoF As Integer, dtDataR As Date, strTipR As String, strDepR As String
        Dim RstGFiltrado As DAO.Recordset
       
        'Alterei o nome da tabela de "Historico" para "TabTempHistorico" para evidenciar que é uma tabela temporária cujos registos serão apagados e recriados quando correr o código
        CurrentDb.Execute "DELETE * FROM TabTempHistorico"
        Set RstF = CurrentDb.OpenRecordset("SELECT * FROM TabFuncionarios ORDER BY CodFuncionario")

       
        Do While Not RstF.EOF
            Set RstG = CurrentDb.OpenRecordset("SELECT * FROM TabGestDepartamentos WHERE CodFuncionario=" & RstF("CodFuncionario") & " ORDER BY ID_Registo")
            intAnoI = Left(RstG("AnoLetivo"), 4)
            Inicio = True
            'Excluí a linha abaixo para permitir alterar o Ano Lectivo Atual pelo utilizador e não depender da data em que estamos a trabalhar
            'intAnoF = Year(Date)
           
            'E escrevi então este código
            intAnoF = Left(DLookup("AnoLectivo", "Consulta ALA"), 4)
          '---------------------------------------------------------
            For intAno = intAnoI To intAnoF
                RstG.Filter = "AnoLetivo='" & intAno & "/" & intAno + 1 & "' ORDER BY ID_Registo"
                Set RstGFiltrado = RstG.OpenRecordset
                If RstGFiltrado.RecordCount = 0 Then
                    Call RegistaHistorico(intAno, RstF("Codfuncionario"), RstF("NomEscola"), dtDataR, strTipR, strDepR)
                Else
                    Do While Not RstGFiltrado.EOF
                        Call RegistaHistorico(intAno, RstF("Codfuncionario"), RstF("NomEscola"), RstGFiltrado("DataRegisto"), RstGFiltrado("TipDepartam"), RstGFiltrado("Departamento"))
                        dtDataR = RstGFiltrado("DataRegisto"): strTipR = RstGFiltrado("TipDepartam"): strDepR = RstGFiltrado("Departamento")
                        RstGFiltrado.MoveNext
                    Loop
                End If
            Next
            RstF.MoveNext
        Loop
       
    End Sub


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    LeoStar
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 104
    Registrado : 18/05/2010

    Consulta Departamentos Historico

    Mensagem  LeoStar em 20/10/2017, 21:30

    Caro Alexandre Neves...

    Alguma coisa deve estar a faltar... Este último código é idêntico ao anterior excepto no seguinte:


    If RstF("CodFuncionario") = 13 Then       Foi retirado conforme me explicação que entendi...

    Debug.Print

    intAnoI = Left(RstG("AnoLetivo"), 4)
            Inicio = True Esta variável não constava e não está definida... Creio que seja tipo Boolean

    Mas quanto ao resultado do código está com o mesmo problema que lhe referi na última mensagem. Sad

    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7030
    Registrado : 05/11/2009

    Re: [Resolvido]Consulta Departamentos Historico

    Mensagem  Alexandre Neves em 20/10/2017, 21:36

    Retire a variável Inicio=true (criei variável mas desisti)
    alterei a linha
    dtDataR = RstGFiltrado("DataRegisto"): strTipR = RstGFiltrado("TipDepartam"): strDepR = RstGFiltrado("Departamento")

    Os resultados são diferentes


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo

    LeoStar
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 104
    Registrado : 18/05/2010

    Consulta Departamentos Historico

    Mensagem  LeoStar em 23/10/2017, 21:48

    Caro colega do fórum...
    Bem haja pela sua contribuição. Funcionou tal como pretendia!...

      Data/hora atual: 14/11/2018, 11:53