USUÁRIO:
SENHA:
SALVAR LOGIN ?
Fórum
Visual Basic
Responder
Voltar
Autor
Assunto:
muito lento, mas tbem muitos dados. O que fazer???
LCSD
SÃO PAULO
SP - BRASIL
ENUNCIADA !
Postada em 28/06/2004 13:34 hs
Bom dia a todos, pelo menos é o que eu espero. Pois o meu está uma PORCARIA SÓ.... Mas, vamos ao meu TENEBROSO problema:
Eu tive que fazer uma importação de dados de uma tabela de clientes, que estava em DBF e passei para o SQL SERVER.
Só que, eu tenho na minha tabela no SQL SERVER exatamente, 27.424 registros, e tenho que listá-los em tela, para que os usuários possam ver (tela de cadastro de clientes)
Eu teria que listar TODOS independente o tipo dele (se é FORNECEDOR, CLIENTES, POSSIVEL CLIENTES.....) e o meu processamento de montagem em um MSHFLEXGRID, demora aproximadamente 36 MINUTOS só para listá-los (a máquina de teste foi um PENTIUM III, 256RAM)
Agora, vai a pergunta: Tem como eu reduzir este processamento de listagem DRÁSTICAMENTE??? Será que seria viável tentar re-aprender e utilizar o objeto DATACONTROL??? Se eu utilizar o DATACONTROL só para listar estes dados, ficaria mais rápido, por ele montar em BLOCOS e não 1 a 1, como faço via código??
Gostaria e preciso da ajuda de VC´s, MEU SACO, MINHA PACIÊNCIA e MEU EMPREGO já estão por 1 FIO!!!!!
Obrigado.
Luiz Cesar
X-Crow Original
VITÓRIA
ES - BRASIL
ENUNCIADA !
Postada em 28/06/2004 14:19 hs
Como você está preenchendo o flex? via TextMatrix ou no loop(usando .Col e .Row Muiiittoooo lento)?
Outra coisa que ajuda muito é manter o flex como invisível enquanto carrega os dados e evitar a exibição de contadores(em label) de registro a registro(msmo pq só funfa se vc usar Doevents). Posta o trecho do código que carrega o Flex para que possamos olhar e fazer as devidas correções caso existam.
Outra coisa tente mudar a instrução SQL que retorna o registro. Digo isso pq ao invés de você fazer o loop no vb transformar valores da tabela para o flex voce ganha muito em desempenho fazendo isso direto na instrução. Ex.:
No vb(Muito Mais Lento):
.text = IIf(Tabela("Tipo")=0,"Fornecedor","Cliente")
No SQL(Muito Mais Rápido)
SELECT ..., CASE Tipo WHEN 0 THEN 'Fornecedor' ELSE 'Cliente' END) AS TipoTmp,
Bem fica assim.. posta a SQL e o fonte do flex q a solução sai + rapido
Abraços, Sidnei
LCSD
SÃO PAULO
SP - BRASIL
ENUNCIADA !
Postada em 28/06/2004 14:28 hs
Bom, vai o trecho do código em que eu pego os dados de 2 tabelas minhas e as uno em uma só, e exibo o conteúdo no MSHFLEXGRID:
Set rsTemp = CreateObject("ADODB.RECORDSET")
If optCodigo.Value = True Then
If optTodos.Value = True Then
SQL = "SELECT cli.codigo as codcli, cli.cliente, cli.fornecedor, cli.representante, cli.outros, cli.internacional, cli.possivelcli, cli.fantasia AS fantcli, cli.razaosocial AS razaocli FROM Clientes cli Union SELECT pcli.codigo as codpcli, '', '', '', '', '', pcli.possivelcli,pcli.fantasia AS fantpos, pcli.razaosocial AS razaopos FROM possivelcliente pcli order by 1 asc"
ElseIf optCliAtivo.Value = True Then
SQL = "Select * from clientes where cliente = 'S' order by codigo asc"
ElseIf optForn.Value = True Then
SQL = "Select * from clientes where fornecedor = 'S' order by codigo asc"
ElseIf optOutros.Value = True Then
SQL = "Select * from clientes where outros = 'S' order by codigo asc"
ElseIf optPossivel.Value = True Then
SQL = "Select * from possivelcliente where possivelcli = 'S' order by codigo asc"
ElseIf optRepresentante.Value = True Then
SQL = "Select * from clientes where representante = 'S' order by codigo asc"
ElseIf optInt.Value = True Then
SQL = "Select * from clientes where internacional = 'S' order by codigo asc"
End If
ElseIf optFantasia.Value = True Then
If optTodos.Value = True Then
SQL = "SELECT cli.codigo as codcli, cli.cliente, cli.fornecedor, cli.representante, cli.outros, cli.internacional,cli.possivelcli,cli.fantasia AS fantcli, cli.razaosocial AS razaocli FROM Clientes cli Union SELECT pcli.codigo as codpcli, '', '', '', '', '', pcli.possivelcli,pcli.fantasia AS fantpos, pcli.razaosocial AS razaopos FROM possivelcliente pcli order by 8 asc"
ElseIf optCliAtivo.Value = True Then
SQL = "Select * from clientes where cliente = 'S' order by fantasia asc"
ElseIf optForn.Value = True Then
SQL = "Select * from clientes where fornecedor = 'S' order by fantasia asc"
ElseIf optOutros.Value = True Then
SQL = "Select * from clientes where outros = 'S' order by fantasia asc"
ElseIf optPossivel.Value = True Then
SQL = "Select * from possivelcliente where possivelcli = 'S' order by fantasia asc"
ElseIf optRepresentante.Value = True Then
SQL = "Select * from clientes where representante = 'S' order by fantasia asc"
ElseIf optInt.Value = True Then
SQL = "Select * from clientes where internacional = 'S' order by codigo asc"
End If
ElseIf optRazao.Value = True Then
If optTodos.Value = True Then
SQL = "SELECT cli.codigo as codcli, cli.cliente, cli.fornecedor, cli.representante, cli.outros, cli.internacional,cli.possivelcli,cli.fantasia AS fantcli, cli.razaosocial AS razaocli FROM Clientes cli Union SELECT pcli.codigo as codpcli, '', '', '', '', '', pcli.possivelcli,pcli.fantasia AS fantpos, pcli.razaosocial AS razaopos FROM possivelcliente pcli order by 7 asc"
ElseIf optCliAtivo.Value = True Then
SQL = "Select * from clientes where cliente = 'S' order by razaosocial asc"
ElseIf optForn.Value = True Then
SQL = "Select * from clientes where fornecedor = 'S' order by razaosocial asc"
ElseIf optOutros.Value = True Then
SQL = "Select * from clientes where outros = 'S' order by razaosocial asc"
ElseIf optPossivel.Value = True Then
SQL = "Select * from possivelcliente where possivelcli = 'S' order by razaosocial asc"
ElseIf optRepresentante.Value = True Then
SQL = "Select * from clientes where representante = 'S' order by razaosocial asc"
ElseIf optInt.Value = True Then
SQL = "Select * from clientes where internacional = 'S' order by codigo asc"
End If
End If
rsTemp.Open SQL, frmPrinc.sCon, adOpenKeyset, adLockPessimistic
If Not rsTemp.EOF Then
rsTemp.MoveMin
End If
With mshCliente
.Row = 0
.Clear
.FillStyle = flexFillRepeat
.Cols = 4
.ColWidth(0) = 200
.ColWidth(1) = 800
.TextMatrix(0, 1) = "Codigo"
.ColWidth(2) = 4000
.TextMatrix(0, 2) = "Fantasia"
.ColWidth(3) = 4800
.TextMatrix(0, 3) = "Razão Social"
Contador = 1
Do
If rsTemp.EOF Then
Exit Do
End If
If optTodos.Value = True Then
If rsTemp!possivelcli = "S" Then
.ColAlignment(1) = 7
.TextMatrix(Contador, 1) = "P" + Format(rsTemp!CodCli, "00000")
.TextMatrix(Contador, 2) = IIf(IsNull(rsTemp!fantcli), "", Trim(rsTemp!fantcli))
.TextMatrix(Contador, 3) = IIf(IsNull(rsTemp!razaocli), "", Trim(rsTemp!razaocli))
Else
.TextMatrix(Contador, 1) = Format(rsTemp!CodCli, "00000")
.TextMatrix(Contador, 2) = IIf(IsNull(rsTemp!fantcli), "", Trim(rsTemp!fantcli))
.TextMatrix(Contador, 3) = IIf(IsNull(rsTemp!razaocli), "", Trim(rsTemp!razaocli))
End If
Else
.TextMatrix(Contador, 1) = Format(rsTemp!Codigo, "00000")
.TextMatrix(Contador, 2) = IIf(IsNull(rsTemp!fantasia), "", Trim(rsTemp!fantasia))
.TextMatrix(Contador, 3) = IIf(IsNull(rsTemp!razaosocial), "", Trim(rsTemp!razaosocial))
End If
.Rows = .Rows + 1
Contador = Contador + 1
rsTemp.MoveNext
.Refresh
Loop
Contador = 0
For I = 0 To .Rows - 1
If .TextMatrix(I, 1) = "" Then
Contador = Contador + 1
End If
Next I
Contador = Contador - 1
.Rows = .Rows - Contador
.Refresh
End With
rsTemp.Close
Set rsTemp = Nothing
Eu sei que posso melhor muito este código, principalmente na hora da montagem do meu MSHFLEXGRID, mas as pessas foi isso que saiu.
A abertura da minha tabela ela é até RÁPIDA, se demora 5 seg na REDE é muito. O problema mesmo é na montagem do meu MSHFLEXGRID.
X-Crow Original
VITÓRIA
ES - BRASIL
ENUNCIADA !
Postada em 28/06/2004 16:00 hs
Bem fiz algumas modificações só na rotina do flex.. Naum se se vai funfar legal pois naum tenho a base aqui mas acho q dá para ter + ou - uma idéia pelo código abaixo:
With mshCliente
' Obs importante se vc mudar o estilo do flex para flat ao invéd de flex3D fica mais rápido também
.Clear
.Visible = True
.Row = 0
'.FillStyle = flexFillRepeat
.Cols = 4
.ColWidth(0) = 200
.ColWidth(1) = 800
.ColAlignment(1) = flexAlignRightCenter ' 7
.TextMatrix(0, 1) = "Codigo"
.ColWidth(2) = 4000
.TextMatrix(0, 2) = "Fantasia"
.ColWidth(3) = 4800
.TextMatrix(0, 3) = "Razão Social"
Dim PfxPossCli as string * 1 'Var. de prefixo para Possível Cliente "P"
Contador = 1
If optTodos.Value = True Then ' Joguei aqui em cima pois assim vc, evita q a cada retorno ao cabeçalho do loop verifique-se dessa opção.
Do
If rsTemp!possivelcli = "S" Then PfxPossCli = "P" Else PfxPossCli = ""
.TextMatrix(Contador, 1) = PfxPossCli & Format(rsTemp!CodCli, "00000")
.TextMatrix(Contador, 2) = Trim(rsTemp!fantcli)) & "" ' Com isso vc evita ocorrem erros de "type mismatch" caso a string seja nula
.TextMatrix(Contador, 3) = Trim(rsTemp!razaocli) & "" ' E evita tb alguns de iif´s aumentando a velocidade do loop
Contador = Contador + 1
.Rows = .Rows + 1 ' Esse tipo de implementação é + lenta que usar .rows = Contador
rsTemp.MoveNext
Loop Until rsTemp.EOF = True
Else
Do
.TextMatrix(Contador, 1) = Format(rsTemp!Codigo, "00000")
.TextMatrix(Contador, 2) = Trim(rsTemp!fantasia))& ""
.TextMatrix(Contador, 3) = Trim(rsTemp!razaosocial)& ""
Contador = Contador + 1
.Rows = .Rows + 1 ' Esse tipo de implementação é + lenta que usar .rows = Contador
rsTemp.MoveNext
'. Refresh 'eu retirei os refreshs do grid pq eles ocupam mt tempo de processamento e aumentam conforme .rows aumenta
' Como a prop .Visible = False vc evita de ficar dando refresh
' Seria interessante implementar uma pausa após determinada quantidade de registros para exibir qnts já passaram
' para que o usuário não ache q o sistema travou Ex.:
' If NumRegAtual = NumRegPausa then
' LblRegAtual = NumRegAtual
' NumRegPausa = NumRegAtual + NumRegPausaReg' Aqui vc define antes do loop por ex. 200 e a cada 200 ele para para exibir o progresso
' Doevents
' End if
' Só para lembrar vc deve usar nos 2 loops caso deseje implemantar isso
Loop Until rsTemp.EOF = True
End If
Contador = 0
' Essas linhas abaixo podem ser mudadas? qual o real propósito das mesmas?
For I = 0 To .Rows - 1
If .TextMatrix(I, 1) = "" Then
Contador = Contador + 1
End If
Next I
Contador = Contador - 1
.Rows = .Rows - Contador
.Visible = True ' Exibe a grid apos todo o preenchimento.
End With
rsTemp.Close
Set rsTemp = Nothing
Bem é isso aí... qq coisa grita daí
Obs.: Não esqueça de fazer um backup do seu código!
Abraços, Sidnei
TÓPICO EDITADO
Tomás
não registrado
ENUNCIADA !
Postada em 28/06/2004 16:19 hs
Use MSHFlexGrid1.Redraw = False no início e após o preenchimento faça com true
arm.g
SÃO PAULO
SP - BRASIL
ENUNCIADA !
Postada em 28/06/2004 16:34 hs
estive o mesmo problema, só que com o banco de dados de cep dos correios, tem mais de 180 mil registro, passei ele para sql serve 2000, ficou lento de tudo.... voltei para o access e ficou muito rapido, naum leva mais de 10 segundos para carragar... estou carregando ele assim
set rs as= adodb.recordset
axsql= "select cep as [Cep], rua as [rua], bairro as [Bairro] from ceps"
rs.Open axsql, conexao, adOpenKeyset, adLockPessimistic
mshflexgrid1.ColWidth(0) = 50
mshflexgrid1.ColWidth(1) = 800
mshflexgrid1.ColWidth(2) = 3000
mshflexgrid1.ColWidth(3) = 2000
Set mshflexgrid1.DataSource = rs
rst.Close
espero ter ajudado.....
Página(s): 1/2
PRÓXIMA »
CyberWEB Network Ltda. © Copyright 2000-2024 - Todos os direitos reservados.
Powered by
HostingZone -
A melhor hospedagem para seu site