abreuluiston 20/10/2023, 16:13
Claudinei, bom-dia!
Vou começar dando uma dica para você e para quem acessar esse post futuramente, até porque eu acho que esse é o verdadeiro intuito desse fórum. Não só ajudar a resolver uma questão, mas acima de tudo passar o conhecimento.
Nada acontece em uma rotina se ela não estiver programada para acontecer. Se a rotina tem algum bug em algum momento ele acontecerá. O erro que você descreve chamamos de intermitente. Ou seja, é algo que acontece esporadicamente. Então, são erros mais difíceis porque é necessário entender o comportamento da rotina e, para isso, o debug é algo fundamental a ser aprendido.
Eu não conhecia sua rotina então tive que entrar no código e marcar um ponto nele para que eu pudesse seguir o fluxo dos eventos. Vale a pena pegar algum tópico desse fórum para aprender a debugar um código. Não vale eu ficar descrevendo aqui pq sei que tem exemplos bons no fórum.
Agora sim, vamos lá:
1) sua rotina da início no form "Administrador".
2) ao acessar o form você seleciona o relatório "Relatório Analítico Personalizado"
3) o fluxo segue para uma função chamada "montaSqlAdministrativoGeral" - é uma função que esvazia uma variável global (que é responsável pelo filtro).
4) essa função faz a chamada do formulário "frmAdministrativoFiltroGeral" - essa chamada desvia o fluxo e o foco sai do formulário "Administrador" e envia o foco para o formulário que está sendo chamado que é justamente onde você efetua os filtros.
5) nesse ponto você preenche os filtros e clica no botão de filtro. Esse botão tem no evento click a chamada para a função "sqlFiltro". O objetivo dessa função é preencher a variável global "stringSqlGlobal" que possui o filtro que você selecionou no form. Após a resposta dessa função o formulário é fechado e o fluxo volta para o formulário "Administrador".
6) a rotina do clique inicial dado no form para acesso ao formulário, que está no evento click dele "Geral_Click' dá sequência e é ai que entra o BUG.
Dentro do IF você verá que o formulário de filtros é chamado novamente - veja a chamada: DoCmd.OpenForm "frmAdministrativoFiltroGeral" na primeira linha do IF. Fiquei curioso o motivo do formulário ser chamado novamente se eu acabei de sair dele.
Comecei a debugar a partir dai e percebi o seguinte:
A) se você comentar essa linha, ou seja, impedir que ela execute, todas as vezes que você chama o relatório o debug acontece e o relatório só fica disponível depois que todo o código do término do botão filtro ser executado. Ou seja, o relatório só aparece depois de pressionar o F8 pq o debug executa linha por linha.
B) se mantiver a rotina como está acontece a intermitência. Ou seja, às vezes ele executa linha a linha e às vezes o relatório aparece imediatamente sem o debug ser executado.
Ao meu ver o que está acontecendo é que o Access se perde pq o formulário foi chamado indevidamente novamente e horas ele pega o form que está aberto novamente e horas não pega. Isso não sei explicar, mas sei que tirando ele o código executa 100% das vezes e se está executando está filtrando.
Volto a dizer, falei tudo isso para que fique documentado o que aconteceu. Detalhe, veja que você não me deu o caminho de como as coisas acontecem eu descobri tudo analisando a base. Então, só a minha curiosidade em entender o que estava acontecendo para te ajudar e obviamente o tempo que fiquei analisando é que me deu a oportunidade de te ajudar.
Então, se minha suspeita estiver correta a única coisa que você precisa fazer é entrar na linha que eu comentei no item 6 acima e comentar a chamada duplicada do form.
Sugiro que faça isso e trabalhe normalmente com a base para checar se a intermitência termina. Beleza?
At.
Luis Abreu