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


+2
Cláudio Más
ronaldojr1
6 participantes

    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    ronaldojr1
    ronaldojr1
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 419
    Registrado : 01/08/2011

    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  ronaldojr1 19/4/2013, 22:33

    Boa noite a todos

    estou com uma grande curiosidade sobre codigo vba, estou tentando adapatar meus codigos para ser o mais rápido e leve possivel, para isso queria q vc respondem qual é mais rápido entre montar um código com recordset para abrir a tabela inteira e depois fazer um loop para comparar os dados pra então executar alguma tarefa ou montar o recordset usando uma Query pra trazer so os dados que eu quero em um recordset e então executar o loop so pra fazer as alteracos.

    Exemplo pratico

    Código:

    dim bc as currentdb()
    dim rs as recordset
    dim strSQL as string

    'Qual é mais Rapido: RecordSet com Loop. Vamos supor que essa tabela tenha 10000 registros e o resultado da minha condição resulte em 5000


    'Resolucao 1
    set bc = currentdb()
    set rs = bc.openrecordset("NomeTabela")

    'Percorre por todos registros da Tabela
    with rs
    .moveFirst
    do while not .EOF
     
      if !codigo>5000 then
         
          'vamos supor q eu mude o nome do cliente para alguma outra coisa
          .Edit
          !nomeCliente = "Alguma Coisa " & !codigo
          .update
      endif
    .moveNext
    loop

    end with'Fim Resolucao 1


    'Resolucao 2
    'Valendo a mesma condicao acima(Se a tabela tiver 10000 Trazer os registros de Codigos acima de 5000)

    strSQL = "SELECT nomeCliente FROM nomeTabela " & _
            "Where Codigo > 5000"

    'Portanto Desse Jeito eu carregaria apenas 5000 Registros em vez de 10000, Alem
    'de não precisar ficar comparando os registros pois eles ja sao os registros que
    'eu quero e tambem só carrego o campo que eu vou alterar
    set rs = bc.OpenRecordSet(strSQL)

    with rs
    .moveFirst

    do while not .EOF

              'vamos supor q eu mude o nome do cliente para alguma outra coisa
              .Edit
              !nomeCliente = "Alguma Coisa " & !codigo
              .Update
        .moveNext     
    loop

    end With 'Fim Resolucao 2





    Agora se vcs puderem me esclarecer qual é mais rápido e por que. Eu agradeceria muito mesmo.
    Acho que isso é  um conhecimento que faz grande diferença na hora de programar, saber qual melhor hora pra usar SQL, RecordSet, Dcount, Dlookup e etc.

    Outra duvida com o mesmo proposito(Qual é mais rápido e leve)...

    Qual é melhor usar pra esse tipo de situação

    por exemplo... Qual o melhor jeito de verificar se um determinado conjunto de registro existe em uma tabela qualquer?

    Resolucao 1:

    function PessoaAndCargoExiste(CodigoPessoaX,CodigoCargoX) as boolean

    dim bc as database  'usada Para Resolucao 1
    dim rs as recordset  'usada Para Resolucao 1
    dim sair as boolean  'usada Para Resolucao 1

    dim strSQL as string 'usada Para Resolucao 2

    'Resolucao 1
    set bc = currentdb()
    set rs = bc.openRecordSet("RelacaoCargo")

    with rs
        .moveFirst
        do while not .EOF and sair = false
          if !CodigoCargo = CodigoCargox and !CodigoPessoa = CodigoPessoaX then
             
              PessoaAndCargoExiste = true         
              sair = true 'Quando Achar o Codigo o loop é encerrado
           
          endif

        .moveNext
        loop
    end with

    'Se Sair = False Entao o conjunto Pessoa E Cargo Nao Existe Na tabela

    if sair = false then
      PessoaAndCargoExiste = false
    endif ' Fim Resolucao 1


    'Resolucao 2

    strSQL = "CodigoCargo = " & CodigoCargoX & " and CodigoPessoa = " & CodigoPessoaX

    if Dcount("CodigoCargo", "NomeTabela", strSQL) > 0 then
     
      PessoaAndCargoExiste = true

    else

      PessoaAndCargoExiste = false

    endif

    'Fim Resolucao 2
    end Function


    Grato pela colaboracao de todos

    Sucesso a todos e bons estudos
    avatar
    Convidado
    Convidado


    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  Convidado 19/4/2013, 23:42

    A unica diferenca é que o recordset carregado com a SQL sera menor pois estará limitado...

    Ao carregar diretamente da tabela poderá usar:

    If Codigo =>5000 Then Exit Do

    Assim ao chegar no registro 5000 encerrará o loop

    Cumprimentos.
    Cláudio Más
    Cláudio Más
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1314
    Registrado : 21/01/2012

    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  Cláudio Más 20/4/2013, 02:40

    Não entendi porque está em dúvida, já que você mesmo responde a questão logo após a "resolução 2".

    De qualquer maneira, sempre é bom lembrar de usar campos indexados para otimizar as pesquisas.
    No caso dos seus exemplos, o campo Codigo.
    avatar
    Convidado
    Convidado


    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  Convidado 20/4/2013, 03:16

    Boa observação grande Claudio.

    Boa Noite
    Alexandre Neves
    Alexandre Neves
    Moderador Global
    Moderador Global


    Respeito às regras : Respeito às Regras 100%

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

    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  Alexandre Neves 20/4/2013, 08:15

    Bom dia,
    1º caso
    Currentdb.execute "UPDATE nomeTabela SET nomecliente='Alguma Coisa ' & codigo WHERE Codigo > 5000"

    2º caso
    set rs = currentdb.openRecordSet("SELECT * FROM RelacaoCargo WHERE CodigoCargo='" & CodigoCargox & "' and CodigoPessoa=" & CodigoPessoaX)
    If rs.recordcount=0 then PessoaAndCargoExiste = False Else PessoaAndCargoExiste = true


    .................................................................................
    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
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

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

    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  Avelino Sampaio 20/4/2013, 09:06

    Use a função TIMER para vc tirar suas medidas. Veja neste tópico:

    http://maximoaccess.forumeiros.com/t10778-saldo-de-conta-corrente

    Sucesso!


    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso vitalício ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    ronaldojr1
    ronaldojr1
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 419
    Registrado : 01/08/2011

    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  ronaldojr1 22/4/2013, 13:57

    Nossa... quantos jeitos diferentes da fazer 1 tarefa.

    Obrigado a todos pela colaboração e a troca de conhecimentos.

    Achei muito interessante cada uma das sugestões.
    Acho importante informar que tudo q eu sei hoje de vba é graças ao forum
    eu sempre vou correndo atras de novas funções e o bom uso delas. Por isso faço e ainda vou fazer algumas perguntas meio Obvias, pois com isso na maioria das vezes vem algum detalhe q eu não conhecia, por exemplo O nosso amigo Claudio Más disse q não entendeu a minha dúvida pois eu mesmo respondi, mas com isso ele já resaltou para eu indexar os campos de pesquisa para agilizar o codigo. Eu ja sabia que nas consultas era mais rapido o resultado com um campo indexado, mas eu não tinha percebido q no código tb vale esse conceito, ou seja , uma informação a mais pra mim ou pra quem ler este tópico.
    Continuando...
    Achei muito útil essa função do timer para medir a velocidade dos meus codigos

    Piloto eu nao conhecia o IF desse jeito q vc passou veja se meu entendimento está correto

    Se eu usar um Do While Loop e eu quiser encerrar ele no meio da execução é so eu
    colocar "IF minhaCondição Then Exit DO" ?

    Achei muito Interessante usar o Currentdb.Execute, uma vez eu usei um recordSet Fazendo uma consulta Inserção, mas eu o usei o docmd.RunSQL(Consulta). tem alguma diferença entre os dois jeitos?

    Avelino estive lendo o tópico que vc mandou da função timer. eu vou fazer o teste aqui, mas quero perguntar do mesmo jeito... O uso da função Dcount é tão catostrofico quanto o Dsum?

    Grato e Sucesso a todos



    avatar
    Convidado
    Convidado


    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  Convidado 22/4/2013, 15:42

    IF minhaCondição Then Exit Do

    Cumprimentos.

    ronaldojr1
    ronaldojr1
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 419
    Registrado : 01/08/2011

    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  ronaldojr1 24/4/2013, 13:19

    bom dia

    piloto sem querer ser chato vc pode me tirar uma duvida desse if?
    é o seguinte eu usei ele e funcionou perfeitamente, mas pq da erro se eu colocar o end if?

    Tem outros tipos de IFs, se tiver vc pode me passar um link pra estudo?
    grato a todos
    avatar
    Convidado
    Convidado


    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  Convidado 24/4/2013, 13:30

    Se colocar a condição imediatamente a frente da clausula The, não há necessidade de colocar o End If

    IF minhaCondição Then Exit Do

    A forma para a utilização do End If seria:

    IF minhaCondição Then
    Exit Do
    End If

    Pode-se colocar mais de uma condição em ambas as formas:

    IF minhaCondição Then Instrução1: Instrução2: Instrução3
    ou

    IF minhaCondição Then
    Instrução1
    Instrução2
    Instrução3
    End If

    Pode-se adicionar outras condições caso não seja verdadeira a primeira:

    IF minhaCondição Then
    Instrução1
    ElseIf SegundaCondiçãoThen
    Instrução
    2
    ElseIf Terceira
    CondiçãoThen
    Instrução3
    End If


    Cumprimentos.
    ronaldojr1
    ronaldojr1
    Avançado
    Avançado


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 419
    Registrado : 01/08/2011

    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  ronaldojr1 24/4/2013, 13:57

    Obrigado pelo esclarecimento PILOTO

    eu nao vou citar a resposta q ajudou minha dúvida, pois todas resposta me ajudaram, por isso vou fechar este tópico agradecendo a todos os colegas pela ajuda e resalto que todas as resposta foram de grande ajuda.

    Grato e sucesso a todos
    avatar
    Convidado
    Convidado


    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  Convidado 24/4/2013, 14:10

    O Que realmente importa que foi resolvido...No entanto é legal clicar no joinha da mensagem que mais serviu ao propósito da dúvida.

    O Fórum agradece o Retorno.
    avatar
    Lauro Ribeiro
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 16
    Registrado : 15/02/2023

    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Velocidade de Processamento do RecordSet

    Mensagem  Lauro Ribeiro 14/9/2023, 02:34

    Conclusões da Pesquisa:
    1 - A criação da coluna de dados concatenados não gerou ganho de processamento em nenhuma das situações. Portanto, não é recomendável.
    2 - A criação do recordset com SQL (usando juntos WHERE e IN) filtrado revelou um ganho de processamento muito grande.
    3 - É conhecido que a abertura do Set é algo moroso no processamento, por isso que não deve estar num loop. E o filtro do SQL deverá abrangir o máximo possível de registros a pesquisar.
    4 - Nas situações 3 e 4 foram inseridos 8 critérios a mais de busca se comparado com as situações 1 e 2, e mesmo assim a velocidade de resposta é extremamente diferente.

    Na função GeraDados, criei a tabela Table3 com as colunas ID (autonumeração),CODIGO_GERAL (string curto), CODIGO_A (string curto), CODIGO_B (string curto), CODIGO_C (string curto), CODIGO_D (string curto), CODIGO_E (string curto). A coluna CODIGO_GERAL serviu somente como uma espécie de concatenação das colunas CODIGO_A até E. A finalidade era testa a velocidade de procurar diretamente na coluna de dados concatenados ou os dados nas suas respectivas colunas correspondentes.

    Para contagem do tempo foi utilizada a função Timer.
    Na função PesquisaDados, o código foi dividido em 4 diferentes testes:
    Situação 1 - Localizar os registros de um recordset usando do FindFirst diretamente na coluna dos dados concatenados.-Resultado: vInicialTime: 80618,9765625s vFinalTime: 80622,05s Diferença: 3,078125s
    Situação 2 - Localizar os registros de um recordset usando do FindFirst nas colunas dos dados correspondentes.----------Resultado: vInicialTime: 80622,0703125s vFinalTime: 80624,51s Diferença: 2,4375s
    Situação 3 - Localizar os registros de um recordset usando SQL filtrado nas colunas dos dados correspondentes.----------Resultado: vInicialTime: 80624,5234375s vFinalTime: 80624,52s Diferença: 0s
    Situação 4 - Localizar os registros de um recordset usando SQL filtrado nas colunas dos dados concatenados.-------------Resultado: vInicialTime: 80624,5234375s vFinalTime: 80624,52s Diferença: 0s

    Public Function GeraDados()
    'Função criada para gerar dados de pesquisa.
       Dim vLLgI As LongLong
       Dim vItI As Integer
       Dim rst As DAO.Recordset
           Set rst = CurrentDb.OpenRecordset("Table3", dbOpenTable)
           With rst
               vItI = 65: vLLgI = 1
               Do
                   .AddNew:
                         !CODIGO_GERAL = Chr(vItI) & Chr(vItI + 1) & Chr(vItI + 2) & Chr(vItI + 3) & Chr(vItI + 4) & vLLgI + 1:
                         !CODIGO_A = Chr(vItI): !CODIGO_B = Chr(vItI + 1): !CODIGO_C = Chr(vItI + 2): !CODIGO_D = Chr(vItI + 3): !CODIGO_E = Chr(vItI + 4):
                 .Update:
                   vLLgI = vLLgI + 1: vItI = vItI + 1: If vItI = 86 Then vItI = 65
               Loop Until vLLgI = 10000000
           End With
    End Function

    Public Function PesquisaDados()
       Dim rst As Recordset
       Dim vStr As String
       Dim vFinalTime, vInicialTime As Double

    'Situação 1 --------
           vInicialTime = Timer
           vStr = "SELECT CODIGO_GERAL FROM Table3;"
           Set rst = CurrentDb.OpenRecordset(vStr)
           rst.FindFirst "[CODIGO_GERAL] LIKE 'GHIJK999964'"
           vFinalTime = Timer: rst.Close: Set rst = Nothing
           Debug.Print "vInicialTime: " & vInicialTime & " vFinalTime: " & vFinalTime & " Diferença: " & vFinalTime - vInicialTime
    '--------------------

    'Situação 2 --------
           vInicialTime = Timer
           vStr = "SELECT * FROM Table3;"
           Set rst = CurrentDb.OpenRecordset(vStr)
           rst.FindFirst "ID = 999964 AND CODIGO_A = 'G' AND CODIGO_B = 'H' AND CODIGO_C = 'I' AND CODIGO_D = 'J' AND CODIGO_E ='K'"
           vFinalTime = Timer: rst.Close: Set rst = Nothing
           Debug.Print "vInicialTime: " & vInicialTime & " vFinalTime: " & vFinalTime & " Diferença: " & vFinalTime - vInicialTime
    '--------------------

    'Situação 3 --------
           vInicialTime = Timer
           vStr = "SELECT * FROM Table3 WHERE (ID = 999964 AND CODIGO_A = 'G' AND CODIGO_B = 'H' AND CODIGO_C = 'I' AND CODIGO_D = 'J' AND CODIGO_E ='K') OR " & _
                   "(ID = 3589058 AND CODIGO_A = 'I' AND CODIGO_B = 'J' AND CODIGO_C = 'K' AND CODIGO_D = 'L' AND CODIGO_E ='M') OR " & _
                   "(ID = 992897 AND CODIGO_A = 'Q' AND CODIGO_B = 'R' AND CODIGO_C = 'S' AND CODIGO_D = 'T' AND CODIGO_E ='U') OR " & _
                   "(ID = 25 AND CODIGO_A = 'D' AND CODIGO_B = 'E' AND CODIGO_C = 'F' AND CODIGO_D = 'G' AND CODIGO_E ='H') OR " & _
                   "(ID = 6998346 AND CODIGO_A = 'J' AND CODIGO_B = 'K' AND CODIGO_C = 'L' AND CODIGO_D = 'M' AND CODIGO_E ='N') OR " & _
                   "(ID = 6998322 AND CODIGO_A = 'G' AND CODIGO_B = 'H' AND CODIGO_C = 'I' AND CODIGO_D = 'J' AND CODIGO_E ='K') OR " & _
                   "(ID = 8924470 AND CODIGO_A = 'N' AND CODIGO_B = 'O' AND CODIGO_C = 'P' AND CODIGO_D = 'Q' AND CODIGO_E ='R') OR " & _
                   "(ID = 8924443 AND CODIGO_A = 'H' AND CODIGO_B = 'I' AND CODIGO_C = 'J' AND CODIGO_D = 'K' AND CODIGO_E ='L');"
           Set rst = CurrentDb.OpenRecordset(vStr)
           vFinalTime = Timer: rst.Close: Set rst = Nothing
           Debug.Print "vInicialTime: " & vInicialTime & " vFinalTime: " & vFinalTime & " Diferença: " & vFinalTime - vInicialTime
    '--------------------

    'Situação 4 --------

           vInicialTime = Timer
           vStr = "SELECT * FROM Table3 WHERE (CODIGO_GERAL IN('GHIJK999964','IJKLM3589058','QRSTU992897','DEFGH25','JKLMN6998346','GHIJK6998322','NOPQR8924470','HIJKL8924443'));"
           Set rst = CurrentDb.OpenRecordset(vStr)
           vFinalTime = Timer: rst.Close: Set rst = Nothing
           Debug.Print "vInicialTime: " & vInicialTime & " vFinalTime: " & vFinalTime & " Diferença: " & vFinalTime - vInicialTime
    '--------------------
    End Function
    JPaulo
    JPaulo
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

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

    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  JPaulo 14/9/2023, 16:50

    Lauro, porque é que você não instancia o DAO para abertura do recordset na função PesquisaDados, já que na GeraDados sim ?

    Código:
    Dim rst As Recordset


    .................................................................................
    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

    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Folder_announce_new Utilize o Sistema de Busca do Fórum...
    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Folder_announce_new 102 Códigos VBA Gratuitos...
    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Folder_announce_new Instruções SQL como utilizar...
    avatar
    Lauro Ribeiro
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 16
    Registrado : 15/02/2023

    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Qual codigo é mais rápido e Leve SQL ou RecordSet?

    Mensagem  Lauro Ribeiro 13/11/2023, 20:00

    Olá Paulo. Foi coincidência usar o DAO.recordset em um e Recordset em outro. Sempre uso só o Recordset mesmo.

    Conteúdo patrocinado


    [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet Empty Re: [Resolvido]Duvida. Qual codigo é mais rápido e Leve SQL ou RecordSet

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 2/5/2024, 17:43