ESTOURO EM FLEXGRID

LIZANDER 30/08/2009 16:49:25
#321382
Estou usando um MSFlexGrid em uma tela do programa.
Nesta tela, apenas preencho o FlexGrid com uma consulta SQL, além de selecionar registros com duplo-clique sobre ele.

Meu problema:

A consulta retornou mais de 35.000 registros e o MSFlexGrid estoura, dando o erro:
RUN-TIME ERROR [ô]30006[ô]:
UNABLE TO ALOCATE MEMORY FOR FLEXGRID.

Ao debugar o programa, vejo que parou no índice 35.000

Existe algum componente que substitua o MSFlexGrid e que suporte mais de 35.000 linhas?

Obrigado.
TECLA 30/08/2009 17:35:03
#321386
Questões pertinentes ao problema:

1. Já pensou em OTIMIZAR esta consulta?
2. Acrescentar mais CRITéRIOS depois da cláusula WHERE?
3. Será que o USUÁRIO/CLIENTE deseja visualizar 35.000 registros de uma única vez?
4. Se sim, já pensou em fazer PAGINAÇÃO dos registros?
LIZANDER 30/08/2009 19:03:23
#321388
Tecla...

Claro que eu pensei nisso sim...

Mas achei 35000 registro muito pouco para estourar um controle.

E como o que eu estou fazendo é para arquivos inativos, 35.000 é uma quantia pequena...

Claro que posso fazer fltros sim... mas apenas perguntei se teria um controle que contornasse essa limitação...

Se não tem... parto pros filtros...
TECLA 30/08/2009 19:34:19
#321389
Acabei de fazer um teste com um MSFLEXGRID e consegui chegar a 50.000.

On Error GoTo erro
Dim i As Long

For i = 1 To 50000
DoEvents
MSFlexGrid1.AddItem i
Me.Caption = i
Next i

erro:
Exit Sub
MsgBox Err.Description, , [Ô]i=[Ô] & i


Tenta aí!
ASHKATCHUP 30/08/2009 19:35:47
#321390
Lizander:

Existe diversos componentes GRID que poderiam ser utilizados, porém você teria que alterar todo o seu código, pois os métodos e propriedades são diferentes.

O [Ô]mais parecido[Ô] é um tal de VSFLEXGRID. Sugiro que você procure a respeito do mesmo.
MICROSCHEME 30/08/2009 19:57:22
#321392
Resposta escolhida

Mano véio.

Os grids flexiveis da microsoft tem capacidade limitada de células ( pois são como planilhas ) em torno de 350.000 células,
levando em consideração que cada campo do registro equivalem na grid como uma célula.

Veja o link:

http://www.macoratti.net/vb6_msfg.htm

Pois bem; neste link há uma explanação quanto a propriedade clip da msflexgrid; carregando a grid com esta propriedade,
o limite fica muito maior; eu já carreguei grids com 15.000 registros e entre 25 e 30 campos por registro, muito mais rápido
e sem estouro.

Verifica e implanta que vai funcionar.

Blz . . .

MICROSCHEME 30/08/2009 20:41:42
#321395

Tenho um programa em vb6 para bolão da mega sena que carrega grid com o clip property.

Este programa desmembra 10 números em 210 apostas com 06 dezenas cada aposta.

Acabei de carregar uma grid com o banco das apostas em access 2003 com 131.250 registros e 08 campos cada registro.

Carregeou a grid com 1.050.000 células com um tempo de 15 segundos em média.

Na verdade com este montante, a grid ficou meio lenta na movimentação, mas que carregou, carregou.

. . .

MICROSCHEME 30/08/2009 21:17:35
#321398

O código que cria o recordset e carrega minha grid no form:

Private Sub Form_Load()

[ô] ApostasRecSet = Nome do Recordset
[ô] ApostasConsultaMsHflexgrid = Nome da Grid

Screen.MousePointer = vbHourglass

[ô] Conecta o banco com ADO, abre a tabela e cria o recordset

Set MegaSenaDBConnect = New ADODB.Connection
Set ApostasRecSet = New ADODB.Recordset
StrApostasSql = [Ô]Select Apostas_Concurso, Apostas_ApostaNumero, Apostas_PrimeiraDezena, Apostas_SegundaDezena, [Ô] & _
[Ô]Apostas_TerceiraDezena, Apostas_QuartaDezena,Apostas_QuintaDezena, Apostas_SextaDezena [Ô] & _
[Ô]From Apostas Order by Apostas_ApostaNumero[Ô]
MegaSenaDBConnect.Open [Ô]PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=[Ô] & AcessoBancodeDados & [Ô];Jet OLEDB:Database Password =microscheme[Ô]
ApostasRecSet.CursorLocation = adUseClient
ApostasRecSet.Open StrApostasSql, MegaSenaDBConnect, adOpenForwardOnly, adLockReadOnly
ApostasRecSet.Sort = ([Ô]Apostas_Concurso ASC[Ô])
If ApostasRecSet.RecordCount = 0 Then
Screen.MousePointer = vbDefault
MsgBox [Ô] Não há Apostas para Concursos da Mega Sena. Tecle Enter. [Ô], vbOKOnly + vbApplicationModal + vbCritical, [Ô] Mensagem do Sistema [Ô]
Exit Sub
End If

[ô] Carrega a Grid com a tabela

ApostasConsultaMsHflexgrid.Rows = ApostasRecSet.RecordCount + 1
ApostasConsultaMsHflexgrid.Cols = ApostasRecSet.Fields.Count
ApostasConsultaMsHflexgrid.Row = 1
ApostasConsultaMsHflexgrid.Col = 0
ApostasConsultaMsHflexgrid.RowSel = ApostasConsultaMsHflexgrid.Rows - 1
ApostasConsultaMsHflexgrid.ColSel = ApostasConsultaMsHflexgrid.Cols - 1
ApostasConsultaMsHflexgrid.Clip = ApostasRecSet.GetString(adClipString, -1, Chr(9), Chr(13), vbNullString)
ApostasConsultaMsHflexgrid.Row = 1

[ô] Configura a aparência da Grid ( cabeçalho, alinhamento e largura das células )

With ApostasConsultaMsHflexgrid
.Redraw = False
.TextMatrix(0, 0) = [Ô]Concurso[Ô]
.TextMatrix(0, 1) = [Ô]Aposta[Ô]
.TextMatrix(0, 2) = [Ô]1ª Dez[Ô]
.TextMatrix(0, 3) = [Ô]2ª Dez[Ô]
.TextMatrix(0, 4) = [Ô]3ª Dez[Ô]
.TextMatrix(0, 5) = [Ô]4ª Dez[Ô]
.TextMatrix(0, 6) = [Ô]5ª Dez[Ô]
.TextMatrix(0, 7) = [Ô]6ª Dez[Ô]
.ColAlignment(0) = flexAlignRightTop
.ColAlignment(1) = flexAlignRightTop
.ColAlignment(2) = flexAlignRightTop
.ColAlignment(3) = flexAlignRightTop
.ColAlignment(4) = flexAlignRightTop
.ColAlignment(5) = flexAlignRightTop
.ColAlignment(6) = flexAlignRightTop
.ColAlignment(7) = flexAlignRightTop
.ColWidth(0) = 1000
.ColWidth(1) = 850
.ColWidth(2) = 800
.ColWidth(3) = 800
.ColWidth(4) = 800
.ColWidth(5) = 800
.ColWidth(6) = 800
.ColWidth(7) = 800
.AllowBigSelection = True
.FillStyle = flexFillRepeat
.Row = 0
.Col = 0
.RowSel = .FixedRows - 1
.ColSel = .Cols - 1
.CellAlignment = flexAlignRightTop
.AllowBigSelection = False
.FillStyle = flexFillSingle
.Redraw = True

[ô] Posiciona o cursor na primeira célula da grid

If .Rows > 1 Then
.Row = 1
End If
End With
Screen.MousePointer = vbDefault
End Sub
LIZANDER 30/08/2009 21:40:19
#321400
Obrigado a todos que responderam...

Principalmente ao MICROSCHEME, pois me chamou a atenção à quantidade de células... retirei algumas desnecessárias e pimba! funcionou! 35000 linhas com 10 colunas, esbarrava nas 350.000 células.

Obrigado a todos!
Tópico encerrado , respostas não são mais permitidas