VB6 - Preenchendo o MSFLexGrid mais rápido


O controle MSFLexGrid é um ótimo controle de GRID para exibir dados em suas aplicações Visual Basic 5/6, ele não é perfeito, mas e leve e fácil de configurar via código. Se você costuma usar este controle em suas aplicações para exibir dados de tabelas de banco de dados saiba que pode ganhar muito em desempenho na hora de preencher o controle. Veja a seguir se você esta fazendo o serviço usando o método mais rápido.

Crie um novo projeto no Visual Basic do tipo Standard EXE e no formulário padrão inclua três botões de comando , um controle MSFLexGrid conforme o leiaute abaixo:

O exemplo mostrado efetua o acesso a uma base de dados Access (Teste.mdb), tabela COMUM, usando via ADO usando o provedor OLE DB e preenche um controle MSFLexGrid exibindo 6 campos da tabela.

1- Usando o método mais rápido

No evento Click do botão de comando : Preenchendo via métodos : Rcs.getString() e FlexGrid.Clip ,inclua o seguinte código:

Private Sub Command1_Click()

'define os objetos para o acesso aos dados no Microsoft Access
Dim db As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim lTimer As Long

Screen.MousePointer = vbHourglass
Command3_Click
MSFlexGrid1.Refresh
lTimer = Timer

MSFlexGrid1.Visible = False

'abre o banco de dados e define o recordset a ser usado
db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Teste.mdb;Persist Security Info=False"
rs.Open "SELECT * FROM COMUM", db, adOpenStatic, adLockReadOnly
rs.MoveFirst

'define o numero de linhas e colunas e configura o grid
MSFlexGrid1.Rows = rs.RecordCount + 1
MSFlexGrid1.Cols = rs.Fields.Count - 1
MSFlexGrid1.Row = 0
MSFlexGrid1.Col = 0
MSFlexGrid1.RowSel = MSFlexGrid1.Rows - 1
MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1

'estamos usando a propriedade Clip e o método GetString para selecionar uma região do grid
MSFlexGrid1.Clip = rs.GetString(adClipString, -1, Chr(9), Chr(13), vbNullString)
MSFlexGrid1.Row = 1
MSFlexGrid1.Visible = True

'libera os objetos
Set rs = Nothing
Set db = Nothing

Screen.MousePointer = vbDefault

MsgBox "Tempo de execução : " & Timer - lTimer & " segs." & vbCr & MSFlexGrid1.Rows - 1 & " registros"

End Sub

Ao preencher o Grid usando este código teremos o seguinte resultado:

1- Usando o método mais lento

No evento Click do botão de comando : Preenchendo com o método FlexGrid.Additem , inclua o seguinte código:

Private Sub Command2_Click()

'define os objetos para o acesso aos dados no Microsoft Access
Dim db As New ADODB.Connection
Dim rcs As New ADODB.Recordset
Dim lTimer As Long

Screen.MousePointer = vbHourglass
Command3_Click
MSFlexGrid1.Refresh
lTimer = Timer

MSFlexGrid1.Visible = False

'abre o banco de dados e define o recordset a ser usado
db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Teste.mdb;Persist Security Info=False"
rcs.Open "SELECT * FROM COMUM", db, adOpenStatic, adLockReadOnly
rcs.MoveFirst

'define o numero de linhas e colunas e configura o grid
MSFlexGrid1.Rows = 0
MSFlexGrid1.Cols = rcs.Fields.Count - 1

Do Until rcs.EOF
'estamos colectando os campos da tabela COMUM usando a sintaxe: rs(n) onde rs(0) refere-se ao primeiro campo e assim por diante
MSFlexGrid1.AddItem rcs(0) & vbTab & rcs(1) & vbTab & rcs(2) & vbTab & rcs(3) & vbTab & rcs(4) & vbTab & rcs(5)
rcs.MoveNext
Loop
MSFlexGrid1.Visible = True

'libera os objetos
Set rcs = Nothing
Set db = Nothing

Screen.MousePointer = vbDefault

MsgBox "Tempo de execução : " & Timer - lTimer & " segs." & vbCr & MSFlexGrid1.Rows - 1 & " registros"

End Sub

Ao preencher o grid usando este código iremos obter:

Comparando os tempos obtidos teremos:

1- Método Mais Rápido 2- Método mais Lento
0,42 segundos 4,5 segundos

Uma verdadeira eternidade na diferença entre os tempos , não é mesmo ?

Então avalie o seu caso e veja se é possível otimizar o desempenho usando primeiro método que usa a propriedade Clip do MSFlexGrid. Vamos dar uma recapitulada nesta propriedade:

Clip Property (MSFlexGrid/MSHFlexGrid)

Retorna ou define o conteúdo das células no controle MSFGrid/MSHFlexGrid da região selecionada.

Sintaxe: object.Clip [=string]

Parte Descrição
object Uma objeto ao qual a propriedade se aplica.
string Uma expressão String que contém a área selecionada do grid.

Obs: Ao preencher o MSFLexGrid com dados , somente as células selecionadas são afetadas e se houver mais células na região selecionada que as definidas na string , as células restantes serão desprezadas. Se houver mais células descritas na string que as células da região selecionada , a parte não utilizada será ignorada.

Nota: Limites de exibição de células nos controles de grid

Em seu artigo no link http://support.microsoft.com/default.aspx?kbid=191006 a Microsoft informa :

O controle FlexGrid é limitado a exibir 350.000 células total. Essa limitação difere da limitação que está documentada na arquivo da Ajuda FlexGrid.

A Ajuda diz o  seguinte:  " O número mínimo de linhas e colunas é 0. O número máximo é limitado pela memória disponível no seu computador. "

Embora essa declaração é verdadeira para o controle Hierarchical FlexGrid (MSHFLXGD.OCX), ele é incorreto para o controle FlexGrid (MSFLXGRD.OCX).

Essa limitação de 350.000 células ocorre em qualquer computador, sem considerar a  memória que está disponível. Assim, se você tiver duas colunas, a quantidade máxima de linhas que você pode ter é 175.000. Da mesma forma, se você tiver cinco colunas, a quantidade máxima de linhas que você pode ter é 70.000.

No caso do controle  Hierarchical FlexGrid ele sempre exibe um máximo de 2048 linhas sem considerar o  número de registros no fonte de dados.

Para contornar este problema, caso você queira exibir mais de 2048 linhas, você deverá abrir o seu conjunto de registros e preencher a grade usando o método GetString de ADO e a propriedade clip do MSHFlexGrid. (Conforme exibido no exemplo deste artigo)

Neste quesito é sempre ter bom senso , pois querer exibir milhares  registros em um grid não é lá muito indicado mesmo se você tiver a melhor máquina e muita memória. Para aplicações web então eu nem preciso falar que isto é totalmente contra indicado.

Até breve...

Pegue o projeto completo para testes aqui: msflexTeste.zip

referências:

http://support.microsoft.com/default.aspx?kbid=191006
http://support.microsoft.com/kb/194653


José Carlos Macoratti