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


5 participantes

    Saldo de Conta Corrente

    avatar
    hronconi
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 7
    Registrado : 06/12/2012

    Saldo de Conta Corrente Empty Saldo de Conta Corrente

    Mensagem  hronconi 8/12/2012, 18:33

    Boa tarde a todos.

    Estou trabalhando com ACCESS 2010 em ambiente windows 7.

    Em meu projeto desenvolví uma rotina para obter o saldo da movimentação de contas correntes de diversos correntistas.

    O layout da minha tabela é a seguinte:
    Saldo de Conta Corrente Tela1d

    Gostaria de saber se o método que estou usando para obter o saldo é o melhor ou se existe uma forma mais fácil.

    Estou fazendo o seguinte:

    1) Fiz uma Consulta de Criação (com critério nome=formulário) utilizando o código a seguir para criação de um número sequencial do registro (tabela GERACCSALDO)
    Código:
    '*************************************************************
    ' Function:  Qcntr()
    '
    ' Purpose: This function will increment and return a dynamic
    ' counter. This function should be called from a query.
    '*************************************************************
    Global Cntr
    Function QCntr(x) As Long
      Cntr = Cntr + 1
      QCntr = Cntr
    End Function

    '**************************************************************
    ' Function:  SetToZero()
    '
    ' Purpose: This function will reset the global Cntr to 0. This
    ' function should be called each time before running a query
    ' containing the Qcntr() function.
    '**************************************************************

    Function SetToZero()
      Cntr = 0
    End Function
    Sub DelCCSaldo()
        DoCmd.DeleteObject acTable, "CCSaldo"
        DoCmd.DeleteObject acTable, "CCSaldo2"
    End Sub

    2) Fiz uma consulta da tabela criada no item 1 para atualizar o saldo de acordo com o número sequencial criado e esta consulta também é de criação da segunda tabela GERACCSALDO2

    3) Fiz uma consulta de atualização pegando da tabela GERACCSALDO2 e atualizando CONTACORRENTE nos campos númerosequencial e saldo.

    4) Por último criei uma consulta simples da tabela CONTACORRENTE com filtro do nome do correntista.

    Está funcionando, mas como não tenho a manha ainda do ACCESS gostaria de saber dos experts se há uma maneira melhor.

    Muito obrigado,

    Henrique Ronconi
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

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

    Saldo de Conta Corrente Empty Re: Saldo de Conta Corrente

    Mensagem  Avelino Sampaio 9/12/2012, 07:36

    Olá, Henrique

    Se o objetivo final for aplicar a consulta direto em um relatório, exite uma técnica mais eficiente que é utilizar a programação no proprio relatório.

    Para aprender a programar em relatórios, sugiro que assista a minha vídeo-aula do artigo abaixo:

    usandoaccess.com.br/tutoriais/tuto32.asp?id=1#inicio

    Se o objetivo for alimentar um formulário, a técnica utilizada já me agradou bastante, só pelo fato de vc não ter utilizado consultas aninhadas ou a função de domínio Dsum() numa consulta, pois são um pesadelo do tocante ao desempenho do aplicativo.  

    Pretendo até o final desta semana lançar um artigo sobre esta técnica de saldo linha a linha, usando uma tabela temporaria criada em tempo de execução.  Veja que no seu projeto foi criado duas tabelas temporarias para depois acerta a sua tabela original.  A diferença neste meu projeto, em relação ao seu, está no fato de que irei aproveitar a propria tabela temporaria para exbibir o resultado, reduzindo ainda mais a necessidade de acessos extras a tabela original.    

    Junto ao artigo estarei disponibiliznado uma super vídeo-aula, que irei tentar explicar porque o Access é mais lento que e SQL Server e como devemos compensar esta diferença com técnicas de programação simples.

    Sucesso!
    avatar
    hronconi
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 7
    Registrado : 06/12/2012

    Saldo de Conta Corrente Empty Re: Saldo de Conta Corrente

    Mensagem  hronconi 9/12/2012, 11:54

    Olá Avelino,

    Já conheço seus tutoriais e sou cliente seu da solução MontaRibows. Obrigado pela sua resposta, mas na verdade acredito que eu esteja utilizando exatamente o que você citou como não muito eficiente.
    Na segunda consulta que mencionei "2)" GERACCSALDO2 estou criando um campo Saldo: Format(DSoma("Contábil";"CCSaldo";"[Seq]<=" & [seq] & "");"Moeda") para formar o saldo. Minha preocupação é justamente a questão performance na medida que o banco de dados crescer.

    Vou estudar o seus artigos e ficarei muito grato assim que disponibilizar a nova técnica para formar saldo. A propósito, em meu projeto estou mostrando os dados em um formulário e cheguei a pensar em montar o saldo através de variáveis. O que você recomenda fazer nesta situação ?

    Sou usuário avançado em Excel e conheço bem as técnicas de programação VBA, mas no ACCESS ainda não possuo muita familiaridade com os comandos específicos para o ACCESS.

    Novamente, muito obrigado.

    Henrique Ronconi
    Assis
    Assis
    Maximo VIP
    Maximo VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 4772
    Registrado : 06/11/2009

    Saldo de Conta Corrente Empty Re: Saldo de Conta Corrente

    Mensagem  Assis 9/12/2012, 12:34

    Henrique

    Tenho uma BD de contas bancarias, utilizo a mesma formula para o saldo.
    Trabalha com 5 contas diferentes
    Tem 15000 linhas de registos das 5 contas e tem boa performance.


    .................................................................................
    *** Só sei que nada sei ***
    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

    Saldo de Conta Corrente Empty Re: Saldo de Conta Corrente

    Mensagem  Cláudio Más 9/12/2012, 13:31

    No SQL Server, o saldo pode ser obtido em um simples Select... Sum... Over, ou usando essa instrução como uma CTE (Common Table Expression, algo como uma consulta temporária) para atualizar o saldo na tabela, em uma única Stored Procedure.
    Desconfio que seja esse o método utilizado em bancos.
    avatar
    hronconi
    Novato
    Novato


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 7
    Registrado : 06/12/2012

    Saldo de Conta Corrente Empty Re: Saldo de Conta Corrente

    Mensagem  hronconi 9/12/2012, 15:07

    Obrigado Assis, Cláudio e Avelino.

    Vou colocar o tópico como resolvido, mas vou aguardar a matéria do Avelino para adaptar a melhoria em meu código e já me sinto mais aliviado com o depoimento do Assis quanto ao número de registros no banco.

    Abraço.
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

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

    Saldo de Conta Corrente Empty Re: Saldo de Conta Corrente

    Mensagem  Avelino Sampaio 10/12/2012, 11:56

    Olá, Henrique!

    Para provar que esta função de Dominio Dsum(), da forma como é aplicada na consulta, é extremamente danosa ao desempenho do aplcativo, revolvi montar duas funções de teste para podermos medir a velocidade de cada uma das propostas.

    Segue o BD com os componentes para teste

    O teste foi realizado sobre uma tabela com apenas 600 registros
    Observe a consulta qrySaldo, que possui a famigerada função Dsum()
    A consulta qrySaldoTbltemp tem origem na tabela temporaria, que é montada em tempo de execução

    Abra a janela de verificação Imedita do VBA e execute o procedimento TempoDsum. Observe na figura abaixo, o tempo que levou para executar a consulta que possui a Dsum()

    Saldo de Conta Corrente P1

    Agora execute o procedimento TempoTbl e veja o tempo decorrido para criar a tabela, calcular o campo SaldoLinha e apresentar o valor. Veja na imagem abaixo, o tempo que obtive.

    Saldo de Conta Corrente P2

    Veja no meu teste, que a técnica da tabela temporaria foi 17 Vezes mais rápida e isso em um teste de acesso local e com apenas 600 registros. Imagine a diferença de tempo em acesso por REDE ?

    Quem quiser testar e dar sua opnião, estou aberto ao debate.



    .................................................................................
    Vídeos, livros, kit MontaRibbons e acesso vitalício ao site UsandoAcces  
    Clique AQUI e analise o custo beneficio do material oferecido.
    Avelino Sampaio
    Avelino Sampaio
    Developer
    Developer


    Respeito às regras : Respeito às Regras 100%

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

    Saldo de Conta Corrente Empty Re: Saldo de Conta Corrente

    Mensagem  Avelino Sampaio 10/12/2012, 13:24

    O uso do Dsum() é tão horripilante que é mais vantagem vc criar o campo Saldo na tabela e usar o Recordset para guardar o calculo para ai então utilizar a tabela.

    Veja uma nova funçã teste comk esta ideia:

    Código:
    Public Sub tempoS()
    Dim rs As DAO.Recordset
    Dim Acumulado As Double
    Dim t1
    t1 = Timer
    Set rs = CurrentDb.OpenRecordset("SELECT * FROM tblMovimento ORDER BY dataMovimento;")
    Do While Not rs.EOF
        Acumulado = Acumulado + (rs!valorCredito - rs!valorDebito)
        rs.Edit
            rs!saldoLinha = Acumulado
        rs.Update
        rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing
    Set rs = CurrentDb.OpenRecordset("qrySaldoMovimento")
    Do While Not rs.EOF
        saldo = rs!saldoLinha
        rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing
    Debug.Print (Timer - t1) & " segundos"
    End Sub

    Rode a função TempoS e veja que continua sendo 17 (1600%) mais ra´pido do que usar o Dsum()

    Baixe novamente o BD, com esta nova função de tempo e veja o resultado

    Sucesso!


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

    mrcmsilva e Clenilton gostam desta mensagem

    avatar
    Mrsilva
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 123
    Registrado : 03/11/2011

    Saldo de Conta Corrente Empty Re: Saldo de Conta Corrente

    Mensagem  Mrsilva 20/4/2013, 13:28

    Avelino.

    Sei que este tópico já esta fechado, mas queria aproveitar o mesmo para fazer uma pergunta para você, já que sempre discute sabiamente sobre consulta alinhada e acessos desnecessarios as tabelas. Outros com experiencia também pode responder.

    Estou desenvolvendo um aplicativo auxiliar de contabilidade ou seja o mesmo alimentará outro aplicativo de contabilidade através arquivo texto. O meu aplicativo terá que constantemente buscar saldos de contas contábeis, demonstrar razão (como extrato bancário) em formulários, queria que avaliasse o método que utilizei.

    Tenho uma rotina no meu aplicativo que guarda o saldo das contas contábeis do ultimo dia do mês em uma tabela, dessa forma sempre que o usuário solicita um extrato (razão) exemplo do dia 15/05/2012 a 31/05/2012 meu aplicativo busca o saldo da conta do dia 30/04/2012 e faz os cálculos através de um recordset do dia 30/04/2012 até 14/04/2012 e apresenta o saldo inicial no formulário e depois através de outro recordset alimento uma tabela local com os dados do extrato, após alimentar a tabela fecho a conexão com banco de dados e realizo os cálculos dos saldos diário do extrato através de outro recordset agora localmente, até poderia fazer os calculos já no recordset anterior mas como solicitaram que queria o saldo somente no ultimo lançamento de cada dia achei por bem não utilizar a rede para fazer esses cálculos. O que vocês acham do método? Resolvi fazer dessa forma depois de varias broncas suas aqui no forum (rssss)

    Conteúdo patrocinado


    Saldo de Conta Corrente Empty Re: Saldo de Conta Corrente

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 21/11/2024, 13:56