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

    DCount ou OpenRecordset qual dos dois ?

    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3711
    Registrado : 04/04/2010

    DCount ou OpenRecordset qual dos dois ? Empty DCount ou OpenRecordset qual dos dois ?

    Mensagem  Avelino Sampaio 13/11/2012, 12:23

    Segue um exemplo

    veja a combinação de funções empregadas.

    =Soma(Abs([statusAcao]='Ok'))

    Quando comparamos um valor com outro no VBA , teremos como resposta true ou false

    Exemplo:

    se compararmos 3 = 2 o VBA irá retornar False
    se Compararmos 3 = 3 o VBA irá retornar true

    Ao comparar [statusAcao]='Ok' para cada registro, teremos como resposta do VBA false(0) ou true(-1).

    False ou true na verdade são números 0 e -1 respectivamente

    A função ABS() retorna o valor absoluto, ou seja irá tirar o sinal de negativo do true(-1)

    Abs([statusAcao]='Ok') retornará 0 ou 1 , dependendo da linha de registro.

    Ao somar esses valores de 0 e 1 obteremos a nossa quantidade.

    =Soma(Abs([statusAcao]='Ok'))

    Sucesso!




    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso irrestrito ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    Júnior_Oliveira
    Júnior_Oliveira
    Novato
    Novato

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 07/06/2012

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  Júnior_Oliveira 13/11/2012, 18:20

    Boa tarde Avelino,

    Parabéns pelo seu site, muito bom.

    Agora que começou, ( Very Happy Very Happy Very Happy ) Por favor nos ajude explicando o que seria um mal uso das funções de domínio (dLookup, DCount, Dmax,..). Estou fazendo um programa (na verdade é imenso) é utilizo estas funções, principalmente o dLookup.

    Grato e no aguardo.
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3711
    Registrado : 04/04/2010

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  Avelino Sampaio 13/11/2012, 18:58

    Olá, Junior!

    As funções de Dominio fazem acesso as tabelas. Quando vc então utiliza qualquer uma dessas funções, tem que ter a consciência de que uma viagem estará sendo realizada a tabela.

    Se estiver usando seu aplicativo em rede, isso implica em contribuir para um maior trafego de dados passando pela rede. Quanto maior este trafego pela rede mais lento ficará seu aplicativo.

    A regra de ouro para manter seu aplicativo com um bom desempenho pela rede é: Acessar as tabelas o mínimo necessário

    Neste caso em particular eu demonstrei com o exemplo anexo que não foi preciso realizar acessos extras a tabela para se ter a solução desejada.

    Acompanhe este tópico recente, que está bastante interessante!

    http://maximoaccess.forumeiros.com/t10357-quem-projeta-aplicativos-desvinculados-e-por-que

    Sucesso!


    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso irrestrito ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    criquio
    criquio
    Moderador Global
    Moderador Global

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 11229
    Registrado : 30/12/2009

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  criquio 13/11/2012, 21:26

    Avelino, eu entendo o que você quer dizer, eu mesmo já deixei um exemplo no fórum com diversas técnicas de pesquisa entre outras funcionalidades. No entanto, acredito que o amigo do tópico esteja utilizando o aplicativo em um único pc, ou seja, o mesmo não está em rede. Para os casos de aplicativos em rede, concordo que é melhor utilizar outras alternativas, mas se está tudo no mesmo pc, o DCount pode até ser mais rápido do que utilizando a função Abs. Fiz um teste aqui com uma tabela contendo um milhão de registros e com 15 colunas. O DCount retornou o resultado da consulta em um tempo umas seis vezes menor do que a função Abs.


    .................................................................................
    Meu novo site: www.vcssistemas.com.br

    Clique aqui e veja um vídeo que explica como fazer pesquisas no forum.


    DICA: Quando precisar inserir um exemplo do seu aplicativo, siga os procedimentos abaixo:
    1 - faça uma cópia do aplicativo
    2 - retire tudo que não for necessário à solução do problema, exceto o que o aplicativo precisar para funcionar
    3 - use o Compactar/Reparar
    4 - compacte o aplicativo em zip ou rar (zip para postagem como anexo na mensagem)


    Agradeça a quem lhe ajudou, clicando no joinha de uma das mensagens do usuário.
    Positive as mensagens que achar útil, no canto superior direito delas.

    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3711
    Registrado : 04/04/2010

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  Avelino Sampaio 14/11/2012, 11:11

    Amigo Valdino,

    O Fábio (Hoogard) ia sair daqui feliz da vida pois colocou a Dcount() dele para funcionar.   Hoje ele pode não estar usando em rede mas, e mais a frente, se ele passar a usar ?  Será que ele vai ter a percepção de usar o Dcount() com critério ?  Ele nem vai pensar duas vezes e sabe por quê ?  Por que alguém bem mais experiente do que ele ofereceu esta solução.  

    E outros que passarem aqui pelo tópico, será que não irão aplicar o Dcount() também ?   Desculpa mas esses argumentos (EU ACREDITO, EU ACHO) não colam.

    Veja mais uma solução, se beneficiando do mecanismo de contrução de relatórios.

    Código:
    Option Compare Database
    Dim k(5) As Integer

    Private Sub Detalhe_Print(Cancel As Integer, PrintCount As Integer)
    k(0) = k(0) + Abs(Me!StatusAcao = "ok")
    k(1) = k(1) + Abs(Me!StatusAcao = "nok")
    k(2) = k(2) + Abs(Me!StatusAcao = "N/A")
    k(3) = k(3) + Abs(Me!StatusGeral = "Andamento")
    k(4) = k(4) + Abs(Me!StatusGeral = "Atraso")
    End Sub

    Private Sub RodapéDoRelatório_Print(Cancel As Integer, PrintCount As Integer)
    Dim j As Byte
    For j = 0 To 4
        Me("tx" & j) = k(j): k(j) = 0
    Next
    End Sub

    Pelor amor de Deus, não leve isso para o lado pessoal.  Estamos apenas questionando assuntos de ordem técnica.  Você é uma pessoa muito querida por aqui e eu também lhe admiro muito.

    Quem quiser aprender a programar em relatórios, assista a minha video-aula, no artigo abaixo:

    Vídeo - Programação de relatórios - Parte 1

    Sucesso!
    Anexos
    DCount ou OpenRecordset qual dos dois ? AttachmentHoogard2.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (60 Kb) Baixado 66 vez(es)


    Última edição por Avelino Sampaio em 15/11/2012, 09:46, editado 2 vez(es)
    avatar
    Convidad
    Convidado

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  Convidad 14/11/2012, 12:01

    pelo que li neste tópico ninguém levou nada para o lado pessoal, até porque penso que é bastante enriquecedora a discussão (positiva) para os conhecimentos de cada um, mas apenas duas perguntas

    e se esses campos não existirem no relatório, não terá de fazer um DCount a tabela ?

    ou teria outra solução para aumentar a performance ?

    no caso concreto, estou 100% de acordo com a função (Abs) apresentada.
    criquio
    criquio
    Moderador Global
    Moderador Global

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 11229
    Registrado : 30/12/2009

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  criquio 14/11/2012, 12:25

    Eu não levo nada para o lado pessoal, pode ficar tranquilo. Só comentei minhas experiências. E acredito que nossa falha foi não mencionar as alternativas para o caso de estar trabalhando em rede ou em um único pc. Para o caso de um único pc, eu prefiro o DCount, ele se mostra mais rápido mesmo trabalhando com grandes volumes de dados. Em meus testes, quando trabalhando com uma grande massa de dados, o DCount se mostrou mais rápido em uma tabela local.

    Agora, com as coisas colocadas em seus lugares, acredito que se torna mais produtivo para quem por aqui passar Very Happy


    .................................................................................
    Meu novo site: www.vcssistemas.com.br

    Clique aqui e veja um vídeo que explica como fazer pesquisas no forum.


    DICA: Quando precisar inserir um exemplo do seu aplicativo, siga os procedimentos abaixo:
    1 - faça uma cópia do aplicativo
    2 - retire tudo que não for necessário à solução do problema, exceto o que o aplicativo precisar para funcionar
    3 - use o Compactar/Reparar
    4 - compacte o aplicativo em zip ou rar (zip para postagem como anexo na mensagem)


    Agradeça a quem lhe ajudou, clicando no joinha de uma das mensagens do usuário.
    Positive as mensagens que achar útil, no canto superior direito delas.

    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3711
    Registrado : 04/04/2010

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  Avelino Sampaio 14/11/2012, 12:36

    Olá, Ricardo!

    pelo que li neste tópico ninguém levou nada para o lado pessoal, até porque penso que é bastante enriquecedora a discussão (positiva) para os conhecimentos de cada um, mas apenas duas perguntas

    O Valdino é meu amigão e fico preocupado que ele acabe interpretando algo que não procede da minha parte.

    e se esses campos não existirem no relatório, não terá de fazer um DCount a tabela ?

    Claro, se a informação desejada não proceder da origem do relatório teremos que buscá-la com outras soluções. De preferência as que não precisem ficar requisitando N vezes a mesma tabela, como foi proposto aqui.

    ou teria outra solução para aumentar a performance ?

    Para este caso em particular, dos dados não pertencerem a origem do relatório, faria o cálculo com apenas UMA requisição a tabela.

    Exemplo de código, que fica muito parecido com o segundo bd fornecido


    Código:
    Option Compare Database
    Dim k(5) As Integer

    Private Sub Report_Open(Cancel As Integer)
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("qryOcorrencias", 8)
    Do While Not rs.EOF
        k(0) = k(0) + Abs(rs!StatusAcao = "ok")
        k(1) = k(1) + Abs(rs!StatusAcao = "nok")
        k(2) = k(2) + Abs(rs!StatusAcao = "N/A")
        k(3) = k(3) + Abs(rs!StatusGeral = "Andamento")
        k(4) = k(4) + Abs(rs!StatusGeral = "Atraso")
        rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing
    End Sub

    Private Sub RodapéDoRelatório_Print(Cancel As Integer, PrintCount As Integer)
    Dim j As Byte
    For j = 0 To 4
        Me("tx" & j) = k(j): k(j) = 0
    Next
    End Sub

    Sucesso!


    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso irrestrito ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    avatar
    Convidad
    Convidado

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  Convidad 14/11/2012, 12:56

    ok, imaginei que seria por recordset

    com este sub, tira-se a conclusão do que é mais rapido o dcount ou abrindo o recordset

    basta colar num modulo, alterar o nome da tabela para a vossa e na janela Immediate digitar DCountVsRecordset

    Sub DCountVsRecordset()
    Const TABLE = "tua tabela"
    Const MAX = 400
    Dim intTime As Single
    Dim tmp As String
    Dim i As Integer

    intTime = Timer
    For i = 1 To MAX
    tmp = DCount("*", TABLE)
    Next
    Debug.Print "DCount(): " & Round(Timer - intTime, 4)

    intTime = Timer
    For i = 1 To MAX
    tmp = CurrentDb.OpenRecordset("SELECT Count(*) FROM " & TABLE).Fields(0)
    Next
    Debug.Print "Recordset: " & Round(Timer - intTime, 4)

    Beep
    Debug.Print "***"
    End Sub

    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3711
    Registrado : 04/04/2010

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  Avelino Sampaio 14/11/2012, 13:40

    Opa, Ricardo! Legal!

    Fiz um teste aqui com 10 mil registros e o recordset foi, em média, 25% mais rápido.

    Sucesso!


    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso irrestrito ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    avatar
    Convidad
    Convidado

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  Convidad 14/11/2012, 13:56

    É por estas coisas que adoro este fórum, uma verdadeira escola.
    JPaulo
    JPaulo
    Moderador
    Moderador

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 10614
    Registrado : 04/11/2009

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  JPaulo 14/11/2012, 14:26

    Bem, aproveitando o barco fiz aqui um teste com esse Sub numa tabela com 974.865 registros e curiosamente o resultado foi:

    DCountVsRecordset
    DCount(): 359,6133
    Recordset: 356,582
    ***



    .................................................................................
    Contribua com o maximoaccess nos links abaixo, ajude a melhorar este que é o seu site na NET.

    Pay-Pal R$ Aqui
    Pay-Pal € Aqui

    Ou ainda: Aqui (Novo)

    Sucesso e Bons Estudos
    Success and Good Studies

    DCount ou OpenRecordset qual dos dois ? Folder_announce_new Utilize o Sistema de Busca do Fórum...
    DCount ou OpenRecordset qual dos dois ? Folder_announce_new 102 Códigos VBA Gratuitos...
    DCount ou OpenRecordset qual dos dois ? Folder_announce_new Instruções SQL como utilizar...
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3711
    Registrado : 04/04/2010

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  Avelino Sampaio 14/11/2012, 15:03

    PROGRAMAÇÃO É COISA PRA MALUCO, DIZ A MINHA ESPOSA (RISOS)

    Aqueles que quizerem particIpar dos testes , beixe o meu o aplicativo exemplo HumMilhao.zip deste meu artigo:

    https://www.usandoaccess.com.br/dicas/gerar-milhoes-registros-teste-access.asp?id=1

    Gere apenas 10 mil registros para não demorar muito nos testes.

    Teste 1

    Acrescente o código em um módulo global, que o amigo Ricardo nos forneceu, com as seguintes modificações:

    Sub DCountVsRecordset()
    Const TABLE = "tblTeste"
    Const MAX = 10000
    Dim intTime As Single
    Dim tmp As String
    Dim i As long

    intTime = Timer
    For i = 1 To MAX
    tmp = DCount("*", TABLE)
    Next
    Debug.Print "DCount(): " & Round(Timer - intTime, 4)

    intTime = Timer
    For i = 1 To MAX
    tmp = CurrentDb.OpenRecordset("SELECT Count(*) FROM " & TABLE).Fields(0)
    Next
    Debug.Print "Recordset: " & Round(Timer - intTime, 4)

    Beep
    Debug.Print "***"
    End Sub

    Veja o resultado do meu primeiro teste:

    DCount ou OpenRecordset qual dos dois ? Dcount1

    Observe bem que o DCount() está 25% mais rapido.

    Teste 2

    Analisando o OpenRecordset vi que o Ricardo deixou um pouco o freio de mão puxado.  Então resolvi realizar uma nova configuração do OpenRecordset.  Observe em vermelho.

    tmp= DBEngine(0)(0).OpenRecordset("SELECT Count(*) FROM " & TABLE, 8).Fields(0)

    Realizando esta pequena alteração, veja na imagem abaixo o resultado

    DCount ou OpenRecordset qual dos dois ? Dcount2

    Observe como o jogo virou.  Agora é o recordset que está 25% mais rapido

    Teste 3

    Para eu não ser injusto com o amigo Valdino, resolvi aplicar a função ABS() na equação, ficando o código para o teste, assim:

    Sub DCountVsRecordset()
    Const TABLE = "tblteste"
    Const MAX = 10000
    Dim intTime As Single
    Dim tmp As String
    Dim i As Long
    Dim rs As DAO.Recordset

    intTime = Timer
    For i = 1 To MAX
    tmp = DCount("*", TABLE)
    Next
    Debug.Print "DCount(): " & Round(Timer - intTime, 4)

    intTime = Timer
    i = 0
    Set rs = DBEngine(0)(0).OpenRecordset("tblTeste", 8 )
    Do While Not rs.EOF
       i = i + Abs(rs(0) > 0)
       rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing
    Debug.Print "Recordset: " & Round(Timer - intTime, 4) & " i=" & i


    Beep
    Debug.Print "***"
    End Sub


    Vejo o resultado na imagem abaixo:

    DCount ou OpenRecordset qual dos dois ? Dcount3


    Foi covardia amigo Valdino!  Recordset foi 450 vezes mais rápido.



    Sucesso!


    Última edição por Avelino Sampaio em 14/11/2012, 15:12, editado 1 vez(es)
    criquio
    criquio
    Moderador Global
    Moderador Global

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 11229
    Registrado : 30/12/2009

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  criquio 14/11/2012, 15:12

    Então amigo Avelino, foi por isso que mencionei o Recordset na dica para o nosso colega. Lembra que no arquivo de exemplo que eu deixei aqui no fórum eu mencionei que o Recordset era mais rápido do que o DCount? Nos testes posteriores, nesse tópico, eu mencionei apenas o DCount e o Abs porque eram os dois elementos que estávamos discutindo sobre, não é mesmo?

    Mas isso é que é o bom nas discussões sadias, sem apelação como vimos em outros fóruns e você bem sabe do que estou falando, não é mesmo?

    Aqui a gente faz testes e mais testes e vai descobrindo coisas incríveis que ajudam e muito a todos. Concordam comigo? Very Happy


    .................................................................................
    Meu novo site: www.vcssistemas.com.br

    Clique aqui e veja um vídeo que explica como fazer pesquisas no forum.


    DICA: Quando precisar inserir um exemplo do seu aplicativo, siga os procedimentos abaixo:
    1 - faça uma cópia do aplicativo
    2 - retire tudo que não for necessário à solução do problema, exceto o que o aplicativo precisar para funcionar
    3 - use o Compactar/Reparar
    4 - compacte o aplicativo em zip ou rar (zip para postagem como anexo na mensagem)


    Agradeça a quem lhe ajudou, clicando no joinha de uma das mensagens do usuário.
    Positive as mensagens que achar útil, no canto superior direito delas.

    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 3711
    Registrado : 04/04/2010

    DCount ou OpenRecordset qual dos dois ? Empty Re: DCount ou OpenRecordset qual dos dois ?

    Mensagem  Avelino Sampaio 14/11/2012, 15:46

    Para reforçar o que estou querendo mostrar desde o início.

    Não importa se está realizando acesso pelo recordset ou pelo dcount(). O que está em jogo é o acesso desnecessário ao back-end

    Supondo que alguém resolva aplicar 1 Dcount() e 3 DSum() em todos os seus relatórios. Esse alguém possui uma rede com 5 computadores. E que todos os usuários resolveram abrir um relatório qualquer. No total serão 5 micros solicitando 4 requisições extras ( 1 DCout() + 3 Dsum() ) por micro, que dão 20 requisições ao back-end, para obter resultados das tabelas. Vinte (20) requisições essas INÚTEIS , que poderiam perfeitamente serem evitadas. Ao invés do back-end estar atendendo algo de útil, fica atendendo algo inútil, ao ponto que algo útil fica esperando a sua vez.

    Imagina esse mau hábito espalhado pelo projeto inteiro. Back-end escravo dos ERROS (risos)

    Coitado do nosso querido Access, é muito mal tratado por nós, mas é valente! (risos)

    Sucesso!


    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso irrestrito ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    RafaelZorzo
    RafaelZorzo
    Intermediário
    Intermediário

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 92
    Registrado : 25/08/2011

    DCount ou OpenRecordset qual dos dois ? Empty DCount ou OpenRecordset qual dos dois ?

    Mensagem  RafaelZorzo 14/11/2012, 21:19

    Parabéns pela 'discussão'...
    Eis aqui uma maneira formidável de aprendizado que não se encontra em outros lugares!
    Esse fórum é muuuiiiito bom!

    Parabéns a todos!!!

      Data/hora atual: 21/6/2021, 03:09