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

    Performace

    avatar
    cristianojedi
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 4
    Registrado : 11/03/2010

    Performace Empty Performace

    Mensagem  cristianojedi 11/3/2010, 21:21

    Pessoal, boa tarde!!!

    Qual a melhor maneiro de fazer um filtro no banco de dados access, correr os registros selecionados em um loop e dentro desse loop fazer update na tabela na medida que for percorrerndo o loop? Atualmente, faço da seguinte maneira:

    Código:
    Private Function SetGrupo(ByVal strCiclo As String, ByVal strTipo As String, ByVal strRecDes As String) As Boolean
        On Error GoTo Erro_SetGrupo
        'Declaração das variáveis
        Dim db As Database, qdSel1 As QueryDef, rsSel1 As Recordset, qdSel2 As QueryDef, rsSel2 As Recordset
        Dim SQL As String, SQLFinal As String
        Dim bRetVal As Boolean
        Dim vVal As String
        ' Inicialização das variáveis
        bRetVal = True
        Set db = CurrentDb
        ' Seta os campos RELACIONADA e GRUPO
        Set qdSel1 = db.CreateQueryDef("Sel1")
        qdSel1.SQL = "SELECT [EOT REL] FROM TB_Provisao WHERE Movimento = '" & strRecDes & "' AND Ciclo = '" & strCiclo & "' AND [TIPO] = '" & strTipo & "' GROUP BY [EOT REL];"
        Set rsSel1 = qdSel1.OpenRecordset(dbOpenSnapshot)
        If rsSel1.RecordCount > 0 Then
            Set qdSel2 = db.CreateQueryDef("Sel2")
            rsSel1.MoveFirst
            Do Until rsSel1.EOF 'Fazer enquanto não chegar ao final da
                SQL = "PARAMETERS [cod] INTEGER; " & _
                      "SELECT TB_Anexo5.Holding FROM TB_Anexo5 WHERE TB_Anexo5.[CODIGO] = [cod];"
                qdSel2.SQL = SQL
                qdSel2.Parameters("cod") = rsSel1![EOT REL]
                Set rsSel2 = qdSel2.OpenRecordset(dbOpenSnapshot)
                SQL = "UPDATE TB_Provisao SET GRUPO = '" & Trim(rsSel2![HOLDING]) & "'" & " WHERE Movimento = '" & strRecDes & "' AND [EOT REL] = '" & rsSel1![EOT REL] & "' AND Ciclo = '" & strCiclo & "' AND [TIPO] = '" & strTipo & "';"
                DoCmd.SetWarnings False
                DoCmd.RunSQL SQL, False
                DoCmd.SetWarnings True
                rsSel1.MoveNext 'Mover para o próximo registro
            Loop
        End If
    Sair_SetGrupo:
        db.QueryDefs.Delete "Sel1"
        db.QueryDefs.Delete "Sel2"
        rsSel1.Close
        rsSel2.Close
        db.Close
        ' Libera os objetos da memória
        Set db = Nothing
        Set rsSel1 = Nothing
        Set rsSel2 = Nothing
        SetGrupo = bRetVal
        Exit Function
    Erro_SetGrupo:
        MsgBox "Erro: " & Err.Number & " - " & Err.Description & " - ClassProvisao.SetGrupo()"
        bRetVal = False
        Resume Sair_SetGrupo
    End Function

    Dessa forma que faço hoje, acho muito lento, dependendo do número de registros e outra que quando trabalhamos com RecordSet, o banco de dados vai aumentando.

    Queria uma solução, dica, ou qualquer coisa do tipo que otimizasse esse código acima para ficar mais rápido e também, talvez, não usar RecordSet para não ficar aumentando o banco.

    Certo de atenção, agradeço-lhes e aguardo retorno.

    Atenciosamente,
    avatar
    Roberto
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 12
    Registrado : 17/03/2010

    Performace Empty Re: Performace

    Mensagem  Roberto 18/3/2010, 17:40

    Você já tentou usar uma Consulta Atualização ? Nela você consegue colocar seus critérios e fazer as ligações também.
    avatar
    cristianojedi
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 4
    Registrado : 11/03/2010

    Performace Empty Re: Performace

    Mensagem  cristianojedi 18/3/2010, 17:41

    Amigo, tenho que fazer via código VBA.

    Abs
    avatar
    Roberto
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 12
    Registrado : 17/03/2010

    Performace Empty Re: Performace

    Mensagem  Roberto 18/3/2010, 17:47

    Tudo bem. Mas ao criar uma Consulta Normal e fazer funcionar do jeito que precisa, você não pode pegar o SQL dela e executar em VBA ? O Update vai funcionar igual. Faz um teste e compare a Performance.

    Wink
    avatar
    cristianojedi
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 4
    Registrado : 11/03/2010

    Performace Empty Re: Performace

    Mensagem  cristianojedi 18/3/2010, 18:04

    Amigo,

    Acho que você não entendeu o que eu preciso com este post. Não estou com erro nenhum de SQL e sim, com problema de performace. Por isso pedi ajuda à vcs, entendeu? Queria otimizar meu algoritmo para que fique mais rápido.

    Obrigado

    Wink
    JPaulo
    JPaulo
    Moderador
    Moderador


    Respeito às regras : Respeito às Regras 100%

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

    Performace Empty Re: Performace

    Mensagem  JPaulo 18/3/2010, 18:14

    Um pitaco;

    Substitua isto:

    DoCmd.SetWarnings False
    DoCmd.RunSQL sql, False
    DoCmd.SetWarnings True

    Por isto;

    db.Execute sql, dbFailOnError

    E vai ver que a performance aumenta.


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

    Performace Folder_announce_new Utilize o Sistema de Busca do Fórum...
    Performace Folder_announce_new 102 Códigos VBA Gratuitos...
    Performace Folder_announce_new Instruções SQL como utilizar...
    avatar
    Roberto
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 12
    Registrado : 17/03/2010

    Performace Empty Re: Performace

    Mensagem  Roberto 18/3/2010, 18:36

    Entendi muito bem. E o que propus para você é exatamente para tentar melhorar a performance. Se tenho um problema com meu código VBA não fico restrito e ele para melhorar minha aplicação.

    Eu posso usar uma consulta SIM. Posso fazer um primeiro filtro numa Consulta Criar Tabela Temporária por exemplo para não ter sempre um loop e logo após uma Atualização na mesma tabela. Posso criar uma consulta para marcar os registros que desejo Atualizar. Enfim, posso utilizar de vários outros recursos para adaptar a meu código VBA para melhorar e muito a bendita PERFORMANCE.
    avatar
    cristianojedi
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 4
    Registrado : 11/03/2010

    Performace Empty Re: Performace

    Mensagem  cristianojedi 18/3/2010, 18:51

    Boa!!!

    Conteúdo patrocinado


    Performace Empty Re: Performace

    Mensagem  Conteúdo patrocinado

      Tópicos semelhantes

      -

      Data/hora atual: 23/11/2024, 18:20