MSFLEXGRID . DATACONTROL OU VIA CODIGO
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.
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.
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]
Você omitiu 2 informações cruciais:
1) Qual tipo de Acesso? (DAO ou ADO)
2) Como você está informando ao Flex? (Via TextMatrix?)
[s50]
Acesso ADO via TextMatrix
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.
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.
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]
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]
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"
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"
Nil
Teste o código abaixo:
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]
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]
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
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
Nil
Só coloquei um ERRO, de:
altere para:
Agora sim.
[s79]
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