ESTOURO EM FLEXGRID
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.
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.
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?
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?
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...
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...
Acabei de fazer um teste com um MSFLEXGRID e consegui chegar a 50.000.
Tenta aÃ!
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Ã!
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.
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.
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 . . .
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.
. . .
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
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!
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