DICA PARA ROTINA LENTA
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
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!
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!
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.
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.
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!
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!
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?
Não dá para fazer tudo em uma unica query?
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.
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.
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
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
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.
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.
ADILSOO
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[ô]
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[ô]
Não pode haver valor como Zero(0).
As tabelas tem que haver relacionamentos.
Por isso que tu coloca Zero.
As tabelas tem que haver relacionamentos.
Por isso que tu coloca Zero.
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
- O que você quer ver no grid
- Veja como você pode tirar proveito de produtos cartesianos para evitar usar tantas queries
Tópico encerrado , respostas não são mais permitidas