DICA PARA ROTINA LENTA

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

DICA PARA ROTINA LENTA

VB / VBA

 Compartilhe  Compartilhe  Compartilhe
#477301 - 21/10/2017 19:41:11

ADILSOO
PRATANIA
Cadast. em:Março/2012


Boa noite pessoal, tenho um form onde carrego vários itens no MSFLEXGRID, mas está um pouco lento, e a quantidade de registros está pouco mais de 3mil, não era pra demorar tanto. Mas não estou encontrando uma alternativa para melhorar a rotina, vou postar ela pra ver se alguém tem alguma ideia.

Dim sSQL As String
Dim rs, rs1, rs2, rs3, rs4 As Recordset
Dim xLanc As Integer

Conecta True

xLanc = 0

'Adiciona Apontamentos realizados
sSQL = "SELECT * FROM tabaptrator ORDER BY data DESC"
Set rs = Conexao.Execute(sSQL)

gridlancamentos.Redraw = True

Do While Not rs.EOF = True
    If xLanc >= 1000 Then
        Exit Sub
    End If
    
    sSQL = "SELECT * FROM tabcadfaz WHERE codfaz = '" & rs!codfaz & "'"
    Set rs1 = Conexao.Execute(sSQL)
    If Not (rs1.EOF = True And rs1.BOF = True) Then
        sSQL = "SELECT * FROM tabcadfuncionario WHERE codfuncionario = '" & rs!codfunc & "'"
        Set rs2 = Conexao.Execute(sSQL)
        If Not (rs2.EOF = True And rs2.BOF = True) Then
            If rs!codtrator = 0 Then
                gridlancamentos.AddItem "" _
                & vbTab & rs!codaptrator _
                & vbTab & rs!Data _
                & vbTab & rs1!nomefaz _
                & vbTab & rs2!nomefuncionario _
                & vbTab & "0" _
                & vbTab & "0"
                xLanc = xLanc + 1
            Else
                If Not rs!codimp = 0 Then
                    sSQL = "SELECT * FROM tabcadtrator WHERE codtrator = '" & rs!codtrator & "'"
                    Set rs3 = Conexao.Execute(sSQL)
                    If Not (rs3.EOF = True And rs3.BOF = True) Then
                        
                        sSQL = "SELECT * FROM tabcadimplemento WHERE codimplemento = '" & rs!codimp & "'"
                        Set rs4 = Conexao.Execute(sSQL)
                        If Not (rs4.EOF = True And rs4.BOF = True) Then
                            gridlancamentos.AddItem "" _
                            & vbTab & rs!codaptrator _
                            & vbTab & rs!Data _
                            & vbTab & rs1!nomefaz _
                            & vbTab & rs2!nomefuncionario _
                            & vbTab & rs3!codfrota _
                            & vbTab & rs4!codfrota
                            xLanc = xLanc + 1
                        End If
                    End If
                Else
                    sSQL = "SELECT * FROM tabcadtrator WHERE codtrator = '" & rs!codtrator & "'"
                    Set rs3 = Conexao.Execute(sSQL)
                    If Not (rs3.EOF = True And rs3.BOF = True) Then
                            gridlancamentos.AddItem "" _
                            & vbTab & rs!codaptrator _
                            & vbTab & rs!Data _
                            & vbTab & rs1!nomefaz _
                            & vbTab & rs2!nomefuncionario _
                            & vbTab & rs3!codfrota _
                            & vbTab & "0"
                            xLanc = xLanc + 1
                    End If
                End If
            End If
        End If
    End If
rs.MoveNext
Loop

gridlancamentos.Redraw = False


O importante não é oque você sabe hoje, e sim o quanto você pode evoluir amanhã!
Meu Skype: adilson.skype1


#477307 - 22/10/2017 15:38:41

DS2T
BARRA MANSA
Cadast. em:Novembro/2010


Boa tarde!

Nessas horas, vale a pena uma análise mais completa.
Algumas perguntas cruciais:

Seu banco de dados está local ou na rede?
As vezes é a rede que está lenta.

O que está deixando o método devagar? Será que é o preenchimento do grid ou a consulta no banco de dados?
Olhando de relance, diria que é a mistura dos dois. A cada iteração do loop você busca os dados do cadtrator e cadimplemento.  Vale a pena você tentar fazer isso com um Inner join, e assim realizar apenas uma consulta no banco de dados.

Existe a necessidade de colocar isso tudo na grid de uma vez?
As vezes uma paginação vem bem a calhar. 3 mil registros é coisa pra caramba... Se você for colocar na ponta do lápis que ainda fica fazendo consultas a cada iteração, realmente vai ficar lento mesmo. Tenta seguir a dica de fazer tudo em uma única consulta.


Abraços!

"Cansei de frases intelectuais" - Eu mesmo


#477314 - 22/10/2017 19:46:06

OMAR2011
MONTES CLAROS
Cadast. em:Setembro/2011


Última edição em 22/10/2017 21:01:37 por OMAR2011

DS2T, será que ele sabe quem esta procurando nestas consultas.
Olhe
sSQL = "SELECT * FROM tabaptrator ORDER BY data DESC"
sSQL = "SELECT * FROM tabcadfaz WHERE codfaz = '" & rs!codfaz & "'"
sSQL = "SELECT * FROM tabcadfuncionario WHERE codfuncionario = '" & rs!codfunc & "'"
sSQL = "SELECT * FROM tabcadtrator WHERE codtrator = '" & rs!codtrator & "'"
sSQL = "SELECT * FROM tabcadimplemento WHERE codimplemento = '" & rs!codimp & "'"
Mostre para mim quem ele procura.
Usar um campo de uma tabela para fazer busca.
Isto não tem sentido.




#477316 - 22/10/2017 21:36:41

ADILSOO
PRATANIA
Cadast. em:Março/2012


Bom, na verdade sim, sei o que estou procurando, é que na verdade eu acesso um laço e dentro de cada um vou no cadastro e pego o nome, de acordo com o código gravado.

Na verdade eu sei que isso não está certo rsrs.

Justamente por isso que postei, pra ver se alguém tem alguma idéia.

Se fizer innerjoin, até da certo, mas tem lançamento de funcionário que não tem trator, nesse caso o registro não vai aparecer.

Foi aí que tirei a idéia de a cada registro ir tratando as informações.

Uso MySQL, pensei em fazer uma consulta no banco, mas não sei ao certo.

Como disse, que está errado eu sei, se tiver alguém disposto a ajudar, ficarei grato.

Obrigado a todos!

O importante não é oque você sabe hoje, e sim o quanto você pode evoluir amanhã!
Meu Skype: adilson.skype1


#477317 - 22/10/2017 22:05:52

MARCOSLING
SAO PAULO
Cadast. em:Agosto/2008


Estou vendo que vc está fazendo várias queries dentro do laço... isso deixa o processo lento

Não dá para fazer tudo em uma unica query?



#477318 - 22/10/2017 22:39:34

ADILSOO
PRATANIA
Cadast. em:Março/2012


Então, até da, mas como disse, no grid eu apresento os nomes e no banco gravo códigos.
Se fizer innerjoin vai faltar dados, pois alguns lançamentos não possuem cadastro de trator ou implemento. Nesse caso não aparecerão no grid.

O importante não é oque você sabe hoje, e sim o quanto você pode evoluir amanhã!
Meu Skype: adilson.skype1


#477321 - 23/10/2017 08:09:44

OMAR2011
MONTES CLAROS
Cadast. em:Setembro/2011


As pessoas que ler o seu tópico vai pensar.Bom,será.
Se faltou, você é o responsável.Não cadastrou.
Olhe,montei esta consulta simples no access para tu ver.
tabaptrator.codfunc, tabcadfuncionario.Nome, tabaptrator.codfaz, tabcadfaz.Nome, tabaptrator.codimp, tabcadimplemento.Nome, tabaptrator.codtrator, tabcadtrator.Nome FROM tabcadtrator INNER JOIN (tabcadimplemento INNER JOIN (tabcadfuncionario INNER JOIN (tabcadfaz INNER JOIN tabaptrator ON tabcadfaz.codfaz = tabaptrator.codfaz) ON tabcadfuncionario.codfuncionario = tabaptrator.codfunc) ON tabcadimplemento.codimplemento = tabaptrator.codimp) ON tabcadtrator.codtrator = tabaptrator.codtrator Where codfunc=2;"
Vá no youtube e pesquisa como fazer um consulta com várias tabelas relacionadas no Access



#477322 - 23/10/2017 08:18:18

ADILSOO
PRATANIA
Cadast. em:Março/2012


E se no tabaptrator.codtrator estiver valor "0"?
Pois como disse, existe alguns lançamentos que o funcionário não possui trator, ou seja, gravo valor "0", como ficaria nesse caso? Pois não vai corresponder a nenhum registro no cadastro de trator, ou seja, não irá aparecer registro, pelo menos no meu caso foi assim.

O importante não é oque você sabe hoje, e sim o quanto você pode evoluir amanhã!
Meu Skype: adilson.skype1


#477323 - 23/10/2017 09:19:36

ELUCIMAR
GOIANIA
Cadast. em:Dezembro/2003


ADILSOO

Citação:
E se no tabaptrator.codtrator estiver valor "0"?
Pois como disse, existe alguns lançamentos que o funcionário não possui trator, ou seja, gravo valor "0", como ficaria nesse caso? Pois não vai corresponder a nenhum registro no cadastro de trator, ou seja, não irá aparecer registro, pelo menos no meu caso foi assim.


Nestes casos ao invés de usar inner join use left join e trate os valores null. Exemplo:

Select    
DP.SeqDocto NumeroVenda,  
DP.COO NumeroCupom,    
DP.DtaMovimento DataVenda,  
DP.DtaHorEmissao HoraVenda,  
CI.SeqItem SequenciaItemCupom,    
IP.NroImpressora NumeroCaixa,  
DP.SeqUsuario Operador,  
CI.NroVendedor CodigoVendedor,  
CI.SeqProduto CodigoProduto,  
CI.Quantidade,    
CI.VlrUnitario Preco,  
CI.VlrTotal TotalItem,    
case    
    when CI.NroPreVenda is null then      
        0      
    else      
        CI.NroPreVenda  
End NumeroPreVenda

From Tb_Docto DP    
Inner Join Tb_DoctoCupom CP    
On DP.SeqDocto = CP.SeqDocto    
Inner Join Tb_DoctoItem CI    
On CP.SeqDocto = CI.SeqDocto    
INNER JOIN Tb_DoctoTributacaoItem TB    
On CI.SeqDocto = TB.SeqDocto    
And CI.SeqItem = TB.SeqItem    
Left Join tb_PreVenda PV    
On CI.NroPreVenda = PV.NroPreVenda    
INNER JOIN TB_IMPRESSORA IP    
ON DP.Serie = IP.Serie    
Where DP.Especie = 'CF'


E.A.M

#477325 - 23/10/2017 10:18:53

OMAR2011
MONTES CLAROS
Cadast. em:Setembro/2011


Não pode haver valor como Zero(0).
As tabelas tem que haver relacionamentos.
Por isso que tu coloca Zero.



#477332 - 23/10/2017 14:26:23

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


Membro da equipe
Sua rotina precisa seriamente de um refactor. Comece assim:
- O que você quer ver no grid
- Veja como você pode tirar proveito de produtos cartesianos para evitar usar tantas queries


_______________________________________________________________________
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!


 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