MSFLEXGRID . DATACONTROL OU VIA CODIGO

USUARIO.EXCLUIDOS 02/01/2005 11:41:35
#58140
A tempos preencho o MsflexGrid Via Código.

Mas fiz um teste com 20.000 registros Access.

Carregado via DataControl nem se percebe o carregamento. é imediato.
Já via código demorou 5 segundos.
Via código não se discute a flexibilidade, posso até colocar uma barra de progresso.
A questão é . Com poucos registros tudo bem, mas e quando o banco for
inchando ?
O que devo usar ? O que vocês me aconselham ?

Obrigado.
LCSD 02/01/2005 17:24:22
#58200
Resposta escolhida
Nil

Você omitiu 2 informações cruciais:

1) Qual tipo de Acesso? (DAO ou ADO)

2) Como você está informando ao Flex? (Via TextMatrix?)
[s50]
USUARIO.EXCLUIDOS 03/01/2005 01:16:17
#58233
Acesso ADO via TextMatrix
USUARIO.EXCLUIDOS 03/01/2005 02:16:08
#58235
Sinto em lhe informar, mas o ADODC utiliza o mesmo conjunto de objetos que devem ser utilizados via código, ou seja, não há um motivo para que ambos apresentem diferentes tempos de processamento, DESDE QUE em uma mesma consulta, utilizando o mesmo cursor de dados.

Tenho feito experimentações das mais variadas no sentido de acelerar o processamento de cargas desse tipo e o que você está posicionando não é efetivamente o que ocorre. Para que o DataControl esteja mais rápido, você o está carregando ou vinculado á um Command já aberto em um DataEnvironment ou está atribuindo as propriedades de RecordSource em tempo de desenho, ou seja, na IDE do VB. Esse método não lhe dá o tempo real de carga, pois a carga já foi feita antes. é como só cronometrar a corrida depois da chegada.
LCSD 03/01/2005 07:21:54
#58242
Professor

Eu perguntei se era ADO para evidenciar o uso do TextMatrix.


Nil

Se você estiver usando o "macete" do Redraw = False na carga já está otimizando, em tese o uso do Flex.

Para maiores informações, seria bom postar a rotina da Carga, onde realiza o Loop e a alimentação com o TextMatrix, além de como está abrindo o RecordSet.
[s50]

USUARIO.EXCLUIDOS 03/01/2005 11:45:58
#58281
RSContrato.Open "Select nome,contrato from contrato order by nome asc;", Conexao, 3, 3
Grid2.Rows = 2
Grid2.Clear
Grid2.TextMatrix(0, 1) = "Contrato"
Grid2.TextMatrix(0, 2) = "Contratante"
While Not RSContrato.EOF
Grid2.TextMatrix(Grid2.Rows - 1, 1) = RSContrato("contrato")
Grid2.TextMatrix(Grid2.Rows - 1, 2) = RSContrato("Nome")
Grid2.Rows = Grid2.Rows + 1
RSContrato.MoveNext
Wend
Grid2.Rows = Grid2.Rows - 1
'********************
DATACONTROL

Data1.DatabaseName = "" & Banco & "" ' Banco=Função de caminho arquivo INI.
Data1.Connect = ";pwd=reccerto04"
Data1.RecordSource = "select nome,contrato from contrato ORDER BY nome asc"
Data1.Refresh
Grid1.ColWidth(0) = 0
Grid1.ColWidth(1) = 4038
Grid1.ColWidth(2) = 1000
Grid1.ColAlignment(2) = 4
Grid1.TextMatrix(0, 1) = "Nome"
Grid1.TextMatrix(0, 2) = "contrato"
LCSD 03/01/2005 12:03:02
#58285
Nil

Teste o código abaixo:


Dim iLinha as Long

RSContrato.Open "Select nome,contrato from contrato order by nome asc;", Conexao, adOpenStatic, adLockReadOnly

Grid2.Redraw = False
Grid2.Rows = rsContrato.RecorCount+1
Grid2.Clear
Grid2.TextMatrix(0, 1) = "Contrato"
Grid2.TextMatrix(0, 2) = "Contratante"

For iLinha = 1 to Grid2.Rows
Grid2.TextMatrix(ILinha, 1) = RSContrato("contrato") .Value
Grid2.TextMatrix(iLinha - 1, 2) = RSContrato("Nome") .Value
RSContrato.MoveNext
Next
Grid2.Rows = Grid2.Rows - 1
Grid2.ReDraw = True


Teste e veja e seu me equivoquei em algo, mas tinha diversos pequenos atrasos na rotina.
[s92]

[txt-color=#0000ff]** Utilize adOpenStatic e adLockReadOnly já que não precisa Editar diretamente. [/txt-color]
USUARIO.EXCLUIDOS 03/01/2005 17:54:40
#58344
Realmente o redraw=false do grid e o grid.rows= recordcount foram os principais motivos de ganho de desempenho.

vou enviar os códigos, se alguém desejar posso enviar o banco via email.
Pois Ficou assim sem datacontrol=20 segundos
com datacontrol=4 segundos
utilizei um access antigo do correio com 20000 registros
Dim iLinha As Long
cep.Open "Select chave_log,nome_log from cep_estados order by chave_log asc;", Conexao, adOpenStatic, adLockReadOnly
Grid2.Redraw = False
Grid2.Rows = RSContrato.RecordCount + 1
Grid2.Clear
Grid2.TextMatrix(0, 1) = "Chave"
Grid2.TextMatrix(0, 2) = "Nome"

For iLinha = 1 To Grid2.Rows
Grid2.TextMatrix(iLinha, 1) = cep("chave_log")
Grid2.TextMatrix(iLinha - 1, 2) = cep("Nome_log")
cep.MoveNext
Next
Grid2.Rows = Grid2.Rows - 1
Grid2.Redraw = True
End If
'**************
Data1.DatabaseName = "" & Banco & ""
Data1.Connect = ";pwd=reccerto04"
Grid2.Redraw = False
Data1.RecordSource = "Select chave_log,nome_log from cep_estados order by chave_log asc"
Data1.Refresh
Grid2.Redraw = True

Desculpem mas na postagem inicial informei 5 segundos , mas era 50
LCSD 04/01/2005 16:35:26
#58574
Nil

Só coloquei um ERRO, de:

Grid2.Rows = Grid2.Rows - 1 


altere para:

Grid2.ROW = Grid2.Rows - 1 


Agora sim.
[s79]
Tópico encerrado , respostas não são mais permitidas