MaximoAccess

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

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

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

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

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


3 participantes

    [Resolvido]Distribuição linha a linha

    gabrielpn06
    gabrielpn06
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 180
    Registrado : 17/01/2017

    [Resolvido]Distribuição linha a linha Empty [Resolvido]Distribuição linha a linha

    Mensagem  gabrielpn06 3/3/2017, 12:06

    Bom dia a todos, tenho um projeto que realiza distribuição de processos forma automática e aleatória, funciona bem mas preciso que essa distribuição deixe de ser aleatória e seja feita linha por linha para que os processos de determinada data não fique com baixa prioridade.
    Abaixo segue o código que estou usando.
    Desde já agradeço!


    Código:
    Private Sub Distribuir_Processos_Click()
        Dim qtd_proc As Long
        Dim rs_DataNulo As Recordset
        Dim rs_Usuarios As Recordset
        Dim i

          If MsgBox("Deseja realizar distribuição de processos?", vbYesNo) = vbYes Then
            'Divide quantidade de processos pelo número de usuários
            qtd_proc = DCount("*", "TbDataNulo")
            qtd_proc = qtd_proc / DCount("*", "TbUsuarios")
           
            Set rs_DataNulo = CurrentDb.OpenRecordset("TbDataNulo")
            Set rs_Usuarios = CurrentDb.OpenRecordset("TbUsuarios")
              'Distribui processos
              Do While Not rs_Usuarios.EOF
                For i = 1 To qtd_proc
                    rs_DataNulo.Edit
                    rs_DataNulo("Profissional") = rs_Usuarios("ProfissionalID")
                    rs_DataNulo.Update
                    rs_DataNulo.MoveNext
                    If rs_DataNulo.EOF Then Exit For
                Next i
                rs_Usuarios.MoveNext
              Loop
           
              rs_DataNulo.Close
              rs_Usuarios.Close
             
            MsgBox "Distribuição Realizada com Sucesso!"
          Else
            MsgBox ("Distribuição Cancelada!")
          End If
         
     End Sub
    Dilson
    Dilson
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1743
    Registrado : 11/11/2009

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  Dilson 4/3/2017, 09:28

    Estou entendendo que Baixa Prioridade é causada quando aquele que chegou primeiro está recebendo distribuição por último. Se esse for o caso então bastará ordenar a tabela pela data da entrada na ordem crescente, assim:

    Set rs_DataNulo = CurrentDb.OpenRecordset("SELECT * FROM TbDataNulo ORDER BY DataEntrada ASC")
    gabrielpn06
    gabrielpn06
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 180
    Registrado : 17/01/2017

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  gabrielpn06 6/3/2017, 11:04

    Bom dia Dilson, agradeço o retorno.
    Então, meu problema é que a distribuição não é feita linha por linha.
    Segue imagem exemplificando melhor a ideia.
    Desde já agradeço pela ajuda!
    Dilson
    Dilson
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1743
    Registrado : 11/11/2009

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  Dilson 7/3/2017, 06:19

    Não fiz validação de nulos de nenhum dos recordset's. analise e faça o necessário.
    Elaborei esse código para você:
    Dim rs_DataNulo As DAO.Recordset
    Dim rs_Usuarios As DAO.Recordset
    Dim ProximoProfissional As Integer
    ProximoProfissional = 0
    If MsgBox("Deseja realizar distribuição de processos?", vbYesNo) = vbYes Then
           Set rs_DataNulo = CurrentDb.OpenRecordset("TbDataNulo")
           Set rs_Usuarios = CurrentDb.OpenRecordset("TbUsuarios")
           rs_Usuarios.MoveLast
           rs_Usuarios.MoveFirst
           rs_DataNulo.MoveLast
           rs_DataNulo.MoveFirst
           Do While Not rs_DataNulo.EOF
                 If IsNull(rs_DataNulo("Profissional")) Then
                        ProximoProfissional = rs_Usuarios("ProfissionalID")
                        rs_Usuarios.MoveNext
                        If rs_Usuarios.BOF Or rs_Usuarios.EOF = True Then
                                rs_Usuarios.MoveFirst
                        End If
                        rs_DataNulo.Edit
                        rs_DataNulo("Profissional") = ProximoProfissional
                        rs_DataNulo.Update
                 End If
           rs_DataNulo.MoveNext
           Loop
           rs_DataNulo.Close
           rs_Usuarios.Close
           MsgBox "Distribuição Realizada com Sucesso!"
    Else
           MsgBox ("Distribuição Cancelada!")
    End If


    gabrielpn06
    gabrielpn06
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 180
    Registrado : 17/01/2017

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  gabrielpn06 7/3/2017, 10:35

    Bom dia Dilson, novamente muito obrigado pela atenção.
    Usei seu código porém não obtive resultados, o código não fez alterações no meu BD. O que pode estar de errado?
    outra pergunta, seu código está baseado em duas pessoas na fila de distribuição somente? Se sim, teria como ampliá-lo para contemplar mais usuários?
    Novamente agradeço imensamente a dedicação em me ajudar!
    Dilson
    Dilson
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1743
    Registrado : 11/11/2009

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  Dilson 7/3/2017, 12:42

    Olhando a questão e o código não vejo falhas.

    Para melhor entender farei de forma resumida a leitura do código:

    => Instancia e vai para o primeiro registros das tabelas TbDataNulo e TbUsuarios
    => Inicia laço de repetição na tabela TbDataNulo
    => A cada laço (loop) verifica se o campo Profissional está em branco (If IsNull(rs_DataNulo("Profissional")) Then).
    Se estiver:
    - Alimenta a variável ProximoProfissional com o valor do primeiro funcionário cadastrado na tabela TbUsuarios (lembra que no inicio falei que iria para o primeiro registro). Se o valor do Profissional do laço atual está capturado dou movenext em TbUsuarios para no próximo loop pegar o próximo profissional cadastrado na tabela. Nisso que fui pra frente (rs_Usuarios.MoveNext) verifico se cheguei ao final da tabela ou se estou em ponto cego dela (If rs_Usuarios.BOF Or rs_Usuarios.EOF = True Then) Se estiver, movo o cursor para o primeiro funcionário da tabela novamente (rs_Usuarios.MoveFirst).
    => Abro o campo Profissional da tabela TbDataNulo e edito com o valor da variável ProximoProfissional capturada no inicio do loop.
    => Vou para o próximo registro da tabela TbDataNulo, ou seja dou (rs_DataNulo.MoveNext) e o loop acontece começando tudo de novo.

    Como pode ver ele percorrerá todos os nomes de funcionários cadastrados na tabela TbUsuarios e populará o id deles nos registros em branco da tabela TbDataNulo de forma ordenada assim: 1,2,3,1,2,3,1,2,3 ...  

    Espero que ajude.

    Se não conseguir, poderá disponibilizar um exemplo com somente essa parte do projeto para que eu compreenda e tente fazer alguma coisa.


    Última edição por Dilson em 7/3/2017, 12:49, editado 2 vez(es)
    gabrielpn06
    gabrielpn06
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 180
    Registrado : 17/01/2017

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  gabrielpn06 7/3/2017, 12:46

    vou testar novamente, já dou retorno.
    gabrielpn06
    gabrielpn06
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 180
    Registrado : 17/01/2017

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  gabrielpn06 7/3/2017, 13:10

    Caro Dilson, modifiquei um pouco o código e funcionou, só não estou conseguindo fazer o Loop funcionar, ele Distribui os nomes uma vez aí para. Pode me ajudar?


    Código:
    Dim TbArquivar As DAO.Database
         
          Set dbLocal = CurrentDb
           
            If MsgBox("Deseja Arquivar Processos Trabalhados?", vbYesNo) = vbYes Then
              DoCmd.SetWarnings False
              'Desabilita mensagem padrão do Access
              DoCmd.OpenQuery "CsArquivaRevisados"
              'Executa consulta atualização
                MsgBox ("Arquivado com Sucesso!")
            Else
              MsgBox ("Operação Cancelada")
            End If

    End Sub


    Private Sub BtAtualizaRevisão_Click()
     
     DoCmd.SetWarnings False
    'Desabilita mensagem padrão do Access
     DoCmd.OpenQuery "CsAtualizaRevisão"
    'Realiza consulta de acréscimo
    MsgBox ("Atualização bem sucedida!")

    End Sub

    Private Sub BtAtualizaHistórico_Click()
     
     DoCmd.SetWarnings False
    'Desabilita mensagem padrão do Access
     DoCmd.OpenQuery "CsAtualizaHistórico"
    'Realiza consulta acréscimo
     DoCmd.OpenQuery "CsExcluiRevisados"
    'Realiza consulta exclusão
    MsgBox ("Atualização bem sucedida!")

    End Sub

    Private Sub BtModoRevisor_Click()

    DoCmd.OpenForm "FrmRevisor"

    End Sub

    Private Sub BtSepararTrabalhados_Click()
     
     DoCmd.SetWarnings False
    'Desabilita mensagem padrão do Access
     DoCmd.OpenQuery "CsRevisãoSim"
    'Realiza consulta de acréscimo
     
     DoCmd.SetWarnings False
    'Desabilita mensagem padrão do Access
     DoCmd.OpenQuery "CsRevisãoNão"
    'Realiza consulta de acréscimo
     
     DoCmd.OpenQuery "CsDuplicaCampo"
     
     DoCmd.OpenQuery "CsArquivaRevisãoNão"
     'Executa consulta acréscimo
     
     DoCmd.Close
      DoCmd.Close
    MsgBox ("Operação bem sucedida!")

    End Sub

    Private Sub BtClear_Click()

    DoCmd.SetWarnings False
    'Desabilita mensagem padrão do Access
    CurrentDb.Execute "DELETE * from TbHistórico"
    CurrentDb.Execute "DELETE * from TbArquivar"
    CurrentDb.Execute "DELETE * from Tbraiz"
    CurrentDb.Execute "DELETE * from TbRevisão"
    CurrentDb.Execute "DELETE * from TbDataNulo"
    MsgBox ("Limpeza Concluida!")

    End Sub

    Private Sub Comando23_Click()

    DoCmd.OpenForm "FrmFilaUser"

    End Sub


    Private Sub Distribuir_Processos_Click()
       
        Dim rs_DataNulo As DAO.Recordset
    Dim rs_Usuarios As DAO.Recordset
    Dim ProximoProfissional As String

    ProximoProfissional = 0

    If MsgBox("Deseja realizar distribuição de processos?", vbYesNo) = vbYes Then
           
            Set rs_DataNulo = CurrentDb.OpenRecordset("TbDataNulo")
           
            Set rs_Usuarios = CurrentDb.OpenRecordset("TbUsuarios")
           
            rs_Usuarios.MoveLast
            rs_Usuarios.MoveFirst
            rs_DataNulo.MoveLast
            rs_DataNulo.MoveFirst
           
            Do While Not rs_DataNulo.EOF
                 
                 
                  If IsEmpty(rs_DataNulo("Profissional")) Then
                 
                               
                                ProximoProfissional = rs_Usuarios("ProfissionalID")
                        rs_Usuarios.MoveNext
                       
                        If rs_Usuarios.BOF Or rs_Usuarios.EOF = True Then
                                rs_Usuarios.MoveFirst
                       
                        End If
                       
                        rs_DataNulo.Edit
                        rs_DataNulo("Profissional") = ProximoProfissional
                        rs_DataNulo.Update
                 
                  End If
           
            rs_DataNulo.MoveNext
           
          Loop
           
            rs_DataNulo.Close
            rs_Usuarios.Close
            MsgBox "Distribuição Realizada com Sucesso!"
     
     Else
     
            MsgBox ("Distribuição Cancelada!")
     
     End If
    Dilson
    Dilson
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1743
    Registrado : 11/11/2009

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  Dilson 7/3/2017, 19:30

    Acho que colocou códigos para mais que não tem ligação na automação que estamos tratando. A variação não foi significativa. Como te falei, a questão e o código proposto atende perfeitamente sem dúvida. O grande problema é que não sei como os objetos do seu sistema estão interagindo. retire uma amostra do seu sistema somente com esse pedaço que quer automatizar, e poste aqui, porque infelizmente não consigo mais ajudar baseado em suspeitas.
    gabrielpn06
    gabrielpn06
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 180
    Registrado : 17/01/2017

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  gabrielpn06 8/3/2017, 10:36

    Bom dia Dilson, segue anexo o Bd.
    Agradeço pela atenção!
    Anexos
    [Resolvido]Distribuição linha a linha AttachmentApp 4 forum.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (306 Kb) Baixado 8 vez(es)
    philipp.moreira
    philipp.moreira
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 257
    Registrado : 05/02/2016

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  philipp.moreira 8/3/2017, 22:55

    Boa noite!

    Gabriel, criei o mdTeste com uma rotina que acho que atende sua necessidade.

    Obs.: A Consulta é somente para limpar os registros de atribuições para efeito de teste.
    Anexos
    [Resolvido]Distribuição linha a linha AttachmentApp 4 forum 2.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (307 Kb) Baixado 7 vez(es)
    Dilson
    Dilson
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1743
    Registrado : 11/11/2009

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  Dilson 9/3/2017, 02:02

    O código não funcionou porque sua tabela usuário não tem id, um campo numérico que funciona como chave primária. acabei entendendo que ProfissionalID se tratava dele.

    Olhei o código apresentado pelo philipp e lhe digo que é a solução adequada para a questão apresentada; Atenderá no pleno (sem precisar trabalhar com encadeamento numérico, apesar de recomendado).

    Aliás philipp, ótima sua contribuição (já dei um like na #mensagem). Show esse código!
    philipp.moreira
    philipp.moreira
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 257
    Registrado : 05/02/2016

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  philipp.moreira 9/3/2017, 02:20

    Obrigado mestre!
    gabrielpn06
    gabrielpn06
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 180
    Registrado : 17/01/2017

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  gabrielpn06 9/3/2017, 10:55

    Bom dia mestres, muito obrigado novamente pela grande ajuda.
    philip, ainda não conheço sobre módulos, como faço para acioná-lo?
    philipp.moreira
    philipp.moreira
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 257
    Registrado : 05/02/2016

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  philipp.moreira 9/3/2017, 14:53

    Você pode adicionar a "chamada" de um módulo (rotina sem retorno) ou function (função que retorna valor. Booleanno, inteiro, string, etc)
    em um evento. Por exemplo click de um botão, ao carregar um fórmulário, quando um campo textbox perder o foco.

    Crie ou utilize um botão no seu formulário;
    Selecione ele e na bandeija de propriedades na aba evento escolha em qual evento deseja fazer a chamada;
    Click nos tres ponto e escolha a opção construtor de código;
    Ao abrir o editor VBA basta incluir o(s) nome(s) da(s) função(ões) que deseja que sejam executadas;
    Dilson
    Dilson
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1743
    Registrado : 11/11/2009

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  Dilson 9/3/2017, 15:18

    Movido para sala mais adequado ao assunto.

    Complementando as orientações do philipp: Substitua o código que te forneci e faça a chamada para o nova função que está no módulo, assim:
    Call NomeDaFuncao()


    gabrielpn06
    gabrielpn06
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 180
    Registrado : 17/01/2017

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  gabrielpn06 9/3/2017, 16:00

    Então tentei mas não obtive sucesso, podem me ajudar apontando onde estou errando?
    Vinculei o botão mas ainsa assim não consegui.
    Segue anexo o bd para me ajudarem se possível.
    Desde já agradeço!
    philipp.moreira
    philipp.moreira
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 257
    Registrado : 05/02/2016

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  philipp.moreira 9/3/2017, 16:02

    Sem anexo.
    gabrielpn06
    gabrielpn06
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 180
    Registrado : 17/01/2017

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  gabrielpn06 9/3/2017, 16:06

    Perdão, segue.
    Anexos
    [Resolvido]Distribuição linha a linha AttachmentApp 4 forum.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (307 Kb) Baixado 4 vez(es)
    philipp.moreira
    philipp.moreira
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 257
    Registrado : 05/02/2016

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  philipp.moreira 9/3/2017, 16:19

    Gabriel,

    Um módulo tem como valor semântico agrupar rotinas e/ou funções que sirvam para fazer acontecer determinada funcionalidade de um sistema; Ou seja, dentro dele se cria uma sub ou uma function; Tendo que uma sub é uma rotina, ela não necessita retornar nenhum valor após sua execução já uma function tem como objetivo retornar um valor após seu processamento.

    No seu caso você havia criado o módulo e dentro dentro dele não havia definido se o código estava contido em uma sub ou uma function.

    Efetuei um reparo, veja se atende.
    Anexos
    [Resolvido]Distribuição linha a linha AttachmentApp 4 forum 3.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (306 Kb) Baixado 6 vez(es)
    gabrielpn06
    gabrielpn06
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 180
    Registrado : 17/01/2017

    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  gabrielpn06 9/3/2017, 18:08

    Mestres, só tenho a lhes agradecer! Muito obrigado por me ajudar novamente!

    Conteúdo patrocinado


    [Resolvido]Distribuição linha a linha Empty Re: [Resolvido]Distribuição linha a linha

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 21/11/2024, 23:57