USUÁRIO:      SENHA:        SALVAR LOGIN ?    Adicione o VBWEB na sua lista de favoritos   Fale conosco 

 

  Fórum

  Visual Basic
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
Pontos: 2843
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
Pontos: 2843
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
Pontos: 2843
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
Topo da página