GRID TRAVANDO COM STORED PROCEDURE.

MESTRE 25/08/2015 09:57:35
#450464
Fala pessoal beleza, tenho um grid que carrego por uma stored procedure.. porém ele tem muitos registros que devem ser mostrados
tem uns 100 mil registros ou mais, quando abre o form ele já dispara a SP..
só que ele da uma travada de uns 5~6 segundos, como eu faço pra ir carregando o grid sem travar? em alguns sistemas eu ja vi que ele vai
adicionando linhas a mais no grid conforme vai rodando a query.. teria como eu fazer isso?

Ou colocar tipo um loading, enquanto carrega pq o pessoal acha que o sistema trava..

utilizo VB.Net mais pode ser em C# também não tem problema.

Grato!
TUNUSAT 25/08/2015 10:16:07
#450467
MESTRE,

A grid tem um número máximo de registros que aceita.

[][ô]s,
Tunusat.
MESTRE 25/08/2015 10:20:21
#450468
Qual seria esse número maximo? só que ele trava e carrega

tenho mais de 80 mil registros, ele carrega, só que ele trava por uns segundos minha aplicação mesmo usando Stored procedure.
TUNUSAT 25/08/2015 10:32:20
#450469
Resposta escolhida
Mestre,

Tô tentando achar, mas sei que no VB6 tem esta restrição por causa deste artigo do Macoratti:

VB6 - Preenchendo o MSFLexGrid mais rápido
http://www.macoratti.net/vb6_msfg.htm
Citação:

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

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.



Mas não acho nada referente as grids no VB.Net...

[][ô]s,
Tunusat.
MESTRE 25/08/2015 11:27:03
#450470
Citação:

:
Mestre,

Tô tentando achar, mas sei que no VB6 tem esta restrição por causa deste artigo do Macoratti:

VB6 - Preenchendo o MSFLexGrid mais rápido
http://www.macoratti.net/vb6_msfg.htm
Nota: Limites de exibição de células nos controles de grid

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.

Mas não acho nada referente as grids no VB.Net...

[][ô]s,
Tunusat.



Entendi TUNUSAT na verdade preciso de uma Thread pro form não congelar, porque eu chamo um form que tem um ProgressPanel da DevExpress.. porém nunca fiz nenhuma Thread..

Tenho 2 forms, um formLoading e o outro frmPrincipalPCP, quando eu carrego o grid com 4 mil registros quero que ele não congele e fique com um Show no formLoading, até ai fiz o frmLoading.Show e depois no final dos For eu do um frmLoading.Show.. só que ele congela tudo.. eu preciso que ele não congele

usando Application.DoEvents() funcionou mais não ficou legal, ele não congela mais porém o meu progresspanel do outro form fica parado ele não fica girando
TUNUSAT 25/08/2015 11:44:37
#450472
Mestre,

Eu coloquei um exemplo de THREAD aqui que NÃO congela, por favor veja:

===================================================
MULTITHREADING VB.NET
http://www.vbmania.com.br/index.php?modulo=detalhe&id=9326
===================================================

Talvez tenha algo no código que te ajude.

[][ô]s,
Tunusat.
MESTRE 25/08/2015 13:19:49
#450474
Não entendi a usuabilidade do projeto Mult thread no meu caso ..
TUNUSAT 25/08/2015 14:05:11
#450476
Mestre,

Talvez você possa trabalhar com faixas de trabalho.
A query precisa ter algo que limite o numero de registros na cláusula WHERE.
Pode ser uma data, uma faixa de registros, ou qualquer outra coisa que limite o número de registros que serão emitidos.

No caso da thread, cada thread pode trabalhar ao mesmo tempo com uma faixa diferente de pesquisa query, mas não vai fazer milagre de jogar tudo dentro da mesma grid.

Outra solução seria ao invés de jogar na grid, jogar dentro de um arquivo excel... pode ser?


[][ô]s,
Tunusat.
MESTRE 25/08/2015 14:08:40
#450477
Não quero em excel quero fugir deles kkkk é tudo em excel por aqui, consegui porém meu form fica bugado enquanto carrega a Thread..

Olha meu código

Aqui tenho o código para carregar os dados no Grid com minha Stored Procedure (coloquei mes: 00 e ano: 0000 como parametro pq ta como cadastro de teste apenas):
Private Sub CarregaGridRecebimento()
Try

objConexao.Open()

Dim strProc As String = [Ô]SelectPCP[Ô]
Dim cmd As MySqlCommand = New MySqlCommand(strProc, objConexao)
Dim da As MySqlDataAdapter = New MySqlDataAdapter(cmd)
Dim dt As DataTable = New DataTable


cmd.CommandType = CommandType.StoredProcedure

cmd.Parameters.AddWithValue([Ô]ParamMesAtual[Ô], [Ô]00[Ô])
cmd.Parameters.AddWithValue([Ô]ParamAnoAtual[Ô], [Ô]0000[Ô])

da.Fill(dt)

grdRecebimentoPcp.DataSource = dt


grdRecebimentoPcp.ClearSelection()


With Me.grdRecebimentoPcp
.DefaultCellStyle.BackColor = Color.White
.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End With

Me.grdRecebimentoPcp.EnableHeadersVisualStyles = True

[txt-color=#e80000] Dim Thread As New System.Threading.Thread(AddressOf RodaEvent)
Thread.Start()
[/txt-color]

Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
objConexao.Close()
End Try


End Sub


Agora minha Sub RodaEvent:
   Private Sub RodaEvent()

Dim x As Integer = 0
For x = 0 To grdRecebimentoPcp.Rows.Count - 1
If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]ROD[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.DarkGray
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.White
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If

If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]PNU[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.White
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If

If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]ELT[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.LawnGreen
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If


If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]BIC[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.Gold
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If


If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]FIO[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.Yellow
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If

If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]BRI[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.SkyBlue
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If

If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]EPI[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.Red
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If

If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]ESP[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.Tomato
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If

If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]QUI[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.LightBlue
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If

If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]MIC[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.Purple
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If

Next

For I As Integer = 0 To grdRecebimentoPcp.RowCount - 1

For coluna As Integer = 0 To 31

If Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Value.ToString = [Ô]SIM[Ô] Then
Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Style.BackColor = Color.LimeGreen
End If

If Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Value.ToString = [Ô]NÃO[Ô] Then
Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Style.BackColor = Color.Tomato
End If


If Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Value.ToString = [Ô]APROVADO[Ô] Then
Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Style.BackColor = Color.LimeGreen
End If



If Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Value.ToString = [Ô]REPROVADO[Ô] Then
Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Style.BackColor = Color.Tomato
End If

Me.grdRecebimentoPcp.Rows(I).Cells(4).Style.ForeColor = Color.OrangeRed
Me.grdRecebimentoPcp.Rows(I).Cells(8).Style.ForeColor = Color.OrangeRed
Next

Next


End Sub


Funcionou, meu form não congela PORéM ele fica bugado até o fim da execução da thread..
TUNUSAT 25/08/2015 17:26:40
#450484
MESTRE,

Achei algo, mas diz que deve aceitar muitos registros...

==============================================================================
What is the maximum record count for a DataGrid in VB.NET?
http://stackoverflow.com/questions/673966/what-is-the-maximum-record-count-for-a-datagrid-in-vb-net

There is no explicit limitation in a DataGrid.

However it is constrained by both it[ô]s internal data structures which tend to count rows in terms of Integer. This means the hard limit is Integer.MaxValue

Citação:

On a 32 bit system though, you will hit problems long before you hit Integer.MaxValue rows. Every item added to the DataGrid has a certain amount of overhead. If each item only has 4 bytes of overhead, you will max out at Integer.MaxValue / 4. This is really a simplistic view of the problem though because it doesn[ô]t take into account other controls, internal WinForms resources, etc ...

How many records are you thinking of adding?



Citação:

The Count property of the DataGridView.Rows collection is an Integer, so the normal range for 4-byte signed integers should apply as an effective limit: 0 to 2,147,483,647


==============================================================================

[][ô]s,
Tunusat.
DS2T 25/08/2015 18:48:28
#450487
Você falou que o form fica bugado. Se ele não tá congelado, qual seria o comportamento anormal?
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas