DICA PARA ROTINA LENTA

ADILSOO 21/10/2017 19:41:11
#477301
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
DS2T 22/10/2017 15:38:41
#477307
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!
OMAR2011 22/10/2017 19:46:06
#477314
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 = [ô][Ô] & [txt-color=#e80000]rs!codfaz[/txt-color] & [Ô][ô][Ô]
sSQL = [Ô]SELECT * FROM tabcadfuncionario WHERE codfuncionario = [ô][Ô] & [txt-color=#e80000]rs!codfunc[/txt-color] & [Ô][ô][Ô]
sSQL = [Ô]SELECT * FROM tabcadtrator WHERE codtrator = [ô][Ô] &[txt-color=#e80000] rs!codtrator [/txt-color]& [Ô][ô][Ô]
sSQL = [Ô]SELECT * FROM tabcadimplemento WHERE codimplemento = [ô][Ô] & [txt-color=#e80000]rs!codimp [/txt-color]& [Ô][ô][Ô]
Mostre para mim quem ele procura.
Usar um campo de uma tabela para fazer busca.
Isto não tem sentido.
ADILSOO 22/10/2017 21:36:41
#477316
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!
MARCOSLING 22/10/2017 22:05:52
#477317
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?
ADILSOO 22/10/2017 22:39:34
#477318
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.
OMAR2011 23/10/2017 08:09:44
#477321
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
ADILSOO 23/10/2017 08:18:18
#477322
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.
ELUCIMAR 23/10/2017 09:19:36
#477323
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,
[txt-color=#e80000]case
when CI.NroPreVenda is null then
0
else
CI.NroPreVenda
End NumeroPreVenda[/txt-color]
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[ô]
OMAR2011 23/10/2017 10:18:53
#477325
Não pode haver valor como Zero(0).
As tabelas tem que haver relacionamentos.
Por isso que tu coloca Zero.
KERPLUNK 23/10/2017 14:26:23
#477332
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
Página 1 de 2 [19 registro(s)]
Tópico encerrado , respostas não são mais permitidas