PRECISO MELHORAR O DESEMPENHO

 Tópico anterior Próximo tópico Novo tópico

PRECISO MELHORAR O DESEMPENHO

VB / VBA

 Compartilhe  Compartilhe  Compartilhe
#487649 - 14/03/2019 09:46:08

ALVAROVB2009
GUARULHOS
Cadast. em:Maio/2009


 Anexos estao visíveis somente para usuários registrados

Pessoal tenho um sistema em VB6 rodando em vários clientes, porém 1 está tendo problema de desempenho, e pelo que vejo é um problema local, seja rede ou máquina

O que quero saber é se posso fazer algum ajuste para tentar minimizar ou eliminar a "lentidão", pois isso começou quando implantei um grid na lateral direita, onde exibem os boletos que foram emitidos(site e sistema) no dia como um alerta para quem tiver acesso, poder no final do dia mandar o arquivo remessa para o banco.
Essa lentidão ocorre nas máquinas de quem tem acesso a esse grid, e é por isso que estou pedindo a ajuda de vcs nessa parte.

Essa atualização esta ocorrendo no TIMER do form principal e esta no máximo 65500, cerca de 2 min e meio

Soluções já prontas
1-) Criei uma verificação onde o sistema só atualize o grid quando verificar que tem alguma mudança
2-) Coloquei nos parâmetros um tempo para que esse grid seja atualizado

Os comandos para atualizar bem como a abertura do banco de dados Access

O grid em questão é um Msflexgrid

Abrebanco
            strConexao = "Provider=Microsoft.Jet.OLEDB.4.0;"
            strConexao = strConexao & "Persist Security Info=False" & ";"
            strConexao = strConexao & "Data Source=" & Ler("Diretorio", "Dados")"

            'Faz a conexao com o Banco
            Set Conexao = New Connection
            Conexao.Open strConexao


Atualizagrid
    If HoraAtualizaGrid < Time Then < --- Caso seja o momento de atualizar o grid
        HoraAtualizaGrid = Time
        HoraAtualizaGrid = HoraAtualizaGrid + LerParametro("tempoatualizargrid")
       'Caso tiver acesso para visualizar o grid de informação
        If GridInformacao.Visible = True Then
            Frame1.Visible = True
            'Verifica se teve alguma guia alterada no site no dia ou mesmo alteração pelo sistema
            Dim TotalGeralGuia As Double
            StrSql = "Select "
            StrSql = StrSql & "(Select count(codtit) from tbtitulos t "
            StrSql = StrSql & "inner join tbempresas e on e.codempr = t.codempr "
            StrSql = StrSql & "where boletoenviadobanco = false and negociado = false and codbarras <> '1' and valor > 1 and dtvencimento >= #" & Format(Date, "MM/DD/YYYY") & "#) as TotalBoletosAlterados, "
            StrSql = StrSql & "valor,nomeempr from tbtitulos t "
            StrSql = StrSql & "inner join tbempresas e on e.codempr = t.codempr "
            StrSql = StrSql & "where boletoenviadobanco = false and negociado = false and codbarras <> '1' and valor > 1 and dtvencimento >= #" & Format(Date, "MM/DD/YYYY") & "# "
            StrSql = StrSql & "order by nomeempr"
            
            Set RsTituloAlterado = New ADODB.Recordset
            RsTituloAlterado.Open StrSql, Conexao, adOpenKeyset, adLockPessimistic
            If RsTituloAlterado.EOF = False Then
                If RsTituloAlterado!TotalBoletosAlterados <> val(LblContadorGuia.Caption) Then
                    PreencheGridInformacao
                    GridInformacao.Redraw = False
                    DoEvents    <--- com isso estou evitando a mensagem de Não respondendo, más não é a causa da lentidão, pois é usado antes do carregamento do grid
                    While Not RsTituloAlterado.EOF
                        GridInformacao.AddItem Format(RsTituloAlterado!Valor, "###,###,##0.00") & Chr(9) & RsTituloAlterado!nomeempr
                        TotalGeralGuia = TotalGeralGuia + RsTituloAlterado!Valor
                        RsTituloAlterado.MoveNext
                    Wend
                    GridInformacao.AddItem ""
                    GridInformacao.AddItem Format(TotalGeralGuia, "###,###,##0.00") & Chr(9) & "Total Site"
                    GridInformacao.Redraw = True
                End If
            Else
                LblContadorGuia.Caption = 0
                PreencheGridInformacao
            End If
    End if

Vb.Net por enquanto não da para fazer, é um sistema inteiro e tenho um projeto para começar a migração desse sistema esse ano e partindo do 0, más é uma coisa longa

Existe alguma coisa que eu possa fazer para tentar melhorar o desempenho do sistema, sem ter que tirar o grid ou falar para o cliente mudar as máquinas?

Teoria é quando se sabe tudo, e nada funciona. Prática e quando tudo funciona e ninguém sabe porque.
"Aquele que quer aprender gosta que lhe digam quando esta errado;
só o tolo não gosta de ser corrigido -"Prov.12:1


#487650 - 14/03/2019 10:44:12

JONESPARIS
ERECHIM
Cadast. em:Fevereiro/2006


Bom dia, usar um Loop para carregar o Grid, deixa lento mesmo.

Uma coisa que pode melhorar é deixar o Grid invisível antes de carregar e torná-lo visível após carregar
GridInformacao.Visible = False
Seu Código
GridInformacao.Visible = True

Considere a possibilidade de carregar seu grid conforme o exemplo abaixo:

  MSFlexGrid1.Clip = rs.GetString(adClipString, -1, Chr(9), Chr(13), vbNullString)


Olha o link que segue do Mestre Macoratti:

http://www.macoratti.net/vb6_msfg.htm

Jones Paris

#487653 - 14/03/2019 13:27:32

ALVAROVB2009
GUARULHOS
Cadast. em:Maio/2009


Última edição em 14/03/2019 14:16:12 por ALVAROVB2009

Jones, obrigado pelo retorno

Esse é um bom esquema, más o segredo ai não é deixar o grid visível ou não, o segredo ai é o comando CLIP

Más no meu caso ele não ajuda muito, porque eu utilizo os comandos Redraw = false e true

Dessa forma eu só exibo o grid quando ele esta preenchido, eu peguei esse mesmo exemplo e o esquema mais lento do exemplo é o que eu estou usando, se vc colocar o comando MSFlexGrid1.redraw = false antes de preencher o grid e MSFlexGrid1.redraw = true, o tempo de 4 seg vai cair para 0.5, igual ou muito próximo ao esquema mais rápido usando o CLIP
Fora que a forma que utilizo, eu consigo editar o grid e colocar da forma que preciso, além dos dados no grid também serem editados, principalmente os valores

Más mesmo assim eu estou vendo se esse comando deixa meu carregamento mais rápido, mesmo porque eu tinha esquecido desse comando exatamente depois que aprendi o Redraw


Teoria é quando se sabe tudo, e nada funciona. Prática e quando tudo funciona e ninguém sabe porque.
"Aquele que quer aprender gosta que lhe digam quando esta errado;
só o tolo não gosta de ser corrigido -"Prov.12:1


#487656 - 14/03/2019 13:47:11

EPISCOPAL
VARZEA GRANDE
Cadast. em:Maio/2009


Meu amigo Alvaro ... pq nao usa grid de terceiros. No planet-source-code.com tem muitos exemplos.

Eu mesmo fabrico os meus controles.

Se quiser te mando um controle grid.

____________________________________________________________________
Ecclesiastic Office Episcopal




#487657 - 14/03/2019 13:52:10

ALVAROVB2009
GUARULHOS
Cadast. em:Maio/2009


Não gosto muito de usar de terceiros, exatamente para poder ficar tudo na minha mão e não ter problemas de compatibilidade e do nada parar a execução do componente ou exibição dele

Más se vc tiver algo legal e rápido, lógico que será muito bem vindo o/

Teoria é quando se sabe tudo, e nada funciona. Prática e quando tudo funciona e ninguém sabe porque.
"Aquele que quer aprender gosta que lhe digam quando esta errado;
só o tolo não gosta de ser corrigido -"Prov.12:1


#487681 - 15/03/2019 20:39:54

EPISCOPAL
VARZEA GRANDE
Cadast. em:Maio/2009


Citação:
Não gosto muito de usar de terceiros, exatamente para poder ficar tudo na minha mão e não ter problemas de compatibilidade


Se vc usa componente da microsoft então vc usa componente de terceiros ...

Eu me refiro vc criar o seu próprio controle ... um usercontrol e compila-lo no seu EXE.

____________________________________________________________________
Ecclesiastic Office Episcopal




#487703 - 16/03/2019 18:47:11

EPISCOPAL
VARZEA GRANDE
Cadast. em:Maio/2009


eu achei na net um usercontrol de um gridview .... ele é bem simples ..... mas não testei a velocidade. Carrega os dados em uma matriz ou collection ... não me lembro.

____________________________________________________________________
Ecclesiastic Office Episcopal




#487719 - 18/03/2019 08:51:50

ALVAROVB2009
GUARULHOS
Cadast. em:Maio/2009


Citação:
:
Não gosto muito de usar de terceiros, exatamente para poder ficar tudo na minha mão e não ter problemas de compatibilidade

Se vc usa componente da microsoft então vc usa componente de terceiros ...

Eu me refiro vc criar o seu próprio controle ... um usercontrol e compila-lo no seu EXE.

kkkk Nessa de usar componentes de terceiros vc tem razão

Não tenho a prática de criar um componente que não terá alguma característica diferente do padrão, eu faço isso por exemplo no controle de botão (incluir - alterar - cancelar - excluir - salvar - imprimir - sair)


Citação:
:
eu achei na net um usercontrol de um gridview .... ele é bem simples ..... mas não testei a velocidade. Carrega os dados em uma matriz ou collection ... não me lembro.

Vou procurar hj algo no planet source, para ver se tem algo mais rápido e pode substituir o meu grid, más realmente não sei se irá fazer alguma diferença, porque os comandos que uso já esta agilizando o máximo o carregamento do grid e com a verificação do tempo que coloquei estou minimizando mais ainda o tempo de carregamento

Esse grid que vc usa, vc lembra onde vc achou ele, se foi no planet?


Teoria é quando se sabe tudo, e nada funciona. Prática e quando tudo funciona e ninguém sabe porque.
"Aquele que quer aprender gosta que lhe digam quando esta errado;
só o tolo não gosta de ser corrigido -"Prov.12:1


#487720 - 18/03/2019 09:16:00

EPISCOPAL
VARZEA GRANDE
Cadast. em:Maio/2009


La tem varios exemplos ... vou procurar hj a noite no meu pc e posto aqui ...

____________________________________________________________________
Ecclesiastic Office Episcopal




#487721 - 18/03/2019 10:05:11

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
O desempenho para preenchimento de um grid depende de dois componentes: A fonte de dados em si e o componente grid em si. Uma parcela grande das vezes, a refatoração está não no código em si, mas na query que quanto mais "pesada" mais afeta o desempenho, o que suspeito ser o caso, dado o uso de sub-query.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#487722 - 18/03/2019 10:32:50

ALVAROVB2009
GUARULHOS
Cadast. em:Maio/2009


Última edição em 18/03/2019 10:41:30 por ALVAROVB2009

Kerplunk agradeço o retorno

Minha query esta bem rápida, o problema esta sendo quando estou carregando o grid quando necessário
Estou usando o ADODB para criar a conexão com o banco
    Dim RsTituloAlterado As ADODB.Recordset
.
.
                    Set RsTituloAlterado = New ADODB.Recordset
                    RsTituloAlterado.Open StrSql, Conexao, adOpenKeyset, adLockPessimistic
                    if RsTituloAlterado.eof = false then
                      GridInformacao.Redraw = False
                      DoEvents    <--- com isso estou evitando a mensagem de Não respondendo, más não é a causa da lentidão, pois é usado antes do carregamento do grid
                      While Not RsTituloAlterado.EOF
                          GridInformacao.AddItem Format(RsTituloAlterado!Valor, "###,###,##0.00") & Chr(9) & RsTituloAlterado!nomeempr
                          TotalGeralGuia = TotalGeralGuia + RsTituloAlterado!Valor
                          RsTituloAlterado.MoveNext
                      Wend
                      GridInformacao.AddItem ""
                      GridInformacao.AddItem Format(TotalGeralGuia, "###,###,##0.00") & Chr(9) & "Total Site"
                      GridInformacao.Redraw = True
                    end if

Nesse momento é que a máquina do meu cliente, mesmo tendo o comando do Redraw, acaba ficando cerca de 2 a 3 seg "travada"
Não são muitos dados para carregar, no dia em que mais tem alterações para carregar, são por volta de 30 boletos e isso não fica o dia todo, pois como são boletos do Banco do Brasil, o cliente acaba enviando sempre o arquivo remessa, pois da para poder pagar o boleto no mesmo dia

A máquina do cliente esta com uma certa dificuldade de processar 2 coisas ao mesmo tempo, e o que eles fazem são coisas rápidas também, como a consulta e edição de associados, emitir relatório etc, más essas travadinhas vai atrasando



Já pensei em até colocar um executável no servidor só para buscar essas alterações e criar uma tabela temporária e ai o sistema carregar o grid com as informações

Teoria é quando se sabe tudo, e nada funciona. Prática e quando tudo funciona e ninguém sabe porque.
"Aquele que quer aprender gosta que lhe digam quando esta errado;
só o tolo não gosta de ser corrigido -"Prov.12:1


 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário