none
SOMA ENTRE DUAS DATAGRIDS RRS feed

  • Pergunta

  • Boa tarde,

    Tenho duas datagrids, a primeira datagrid tem valores completos, valores duplicados, já a segunda datagrid tem apenas os dados únicos. Eu estou tentando fazer uma soma, porém ainda não conseguir. vou postar a query para quem poder mim ajudar a resolver isso.

    Dim verif As Decimal
    
            'Percorre todas as linhas da datagrid2 (Aqui é a datagrid com dados únicos)
            For Each linha As DataGridViewRow In DataGridView2.Rows
    
                'Percorre todas as linha da datagrid1. (Essa Datagrid é que tem os valores duplicados)
                For i = 0 To DataGridView1.Rows.Count - 1
    
                    'Seleciona cada campo do datagrid da coluna promotor
                    DataGridView2.CurrentCell = linha.Cells("PROMOTOR")
    
                    'Se campo da datagrid2 for igual ao campo de datagrid1, então... Quero que soma as quantidade do mesmo PROMOTOR
                    If DataGridView2.CurrentCell.Value.Equals(DataGridView1("PROMOTOR", i).Value) Then
    
                        'Aqui está o problema, eu não consigo fazer a soma. A soma seria "Quantos campo1 da datagrid2 tem no datagrid1" E assim por diante.
                        verif = verif + linha.Cells("PROMOTOR").Value.Equals(DataGridView2.Rows(i).Cells("PROMOTOR").Value)
    
    
                        DataGridView2.CurrentCell = linha.Cells("PROMOTOR")
                        linha.Cells("Qnt_Promotor").Value = verif
    
                    Else
                    End If
    
                Next
            Next

    Minha soma seria quantos campos daquela celula do DATGRID2 tem no DATAGRID1, é possível fazer isso ?

    Já tentei de tudo.

    segunda-feira, 25 de janeiro de 2016 17:53

Respostas

  • O Id é string no seu caso! então,você deveria mudar para ficar assim:

    Public Class SumItems
        Private _id As String
        Public Property Id() As String
            Get
                Return _id
            End Get
            Set(ByVal value As String)
                _id = value
            End Set
        End Property
    	
        Private _count As Integer
        Public Property Count() As Integer
            Get
                Return _count
            End Get
            Set(ByVal value As Integer)
                _count = value
            End Set
        End Property
    
        Public Sub New()
            _id = 0
            _count = 0
        End Sub
    
        Sub New(id As String, count As Integer)
            _id = id
            _count = count
        End Sub
    End Class

    Coloque essa classe clicando na aplicação add new item class!

    Pronto!

    Vai funcionar!


    Fulvio C



    segunda-feira, 25 de janeiro de 2016 21:09

Todas as Respostas

  • Fepus dá sim:


    Então a partir do DataGridView2 eu quero contar quantos elementos tem igual no DataGridView1:

    Crie um classe para contar:

    Public Class SumItems
        Private _id As Integer
        Public Property Id() As Integer
            Get
                Return _id
            End Get
            Set(ByVal value As Integer)
                _id = value
            End Set
        End Property
        Private _count As Integer
        Public Property Count() As Integer
            Get
                Return _count
            End Get
            Set(ByVal value As Integer)
                _count = value
            End Set
        End Property
    
        Public Sub New()
            _id = 0
            _count = 0
        End Sub
    
        Sub New(id As Integer, count As Integer)
            _id = id
            _count = count
        End Sub
    End Class

    Agora use esse trecho de código para somatizar:

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click DataGridView3.DataSource = Nothing Dim sumItems As New List(Of SumItems) For Each v2 As DataGridViewRow In DataGridView2.Rows Dim Id2 As Integer = Integer.Parse(v2.Cells(0).Value) For Each v1 As DataGridViewRow In DataGridView1.Rows Dim Id1 As Integer = Integer.Parse(v1.Cells(0).Value) If (Id2 = Id1) Then Dim item As SumItems = sumItems.Where(Function(x) x.Id = Id1).FirstOrDefault() If (IsNothing(item)) Then sumItems.Add(New SumItems(Id1, 1)) Else item.Count += 1 End If End If Next Next DataGridView3.DataSource = sumItems.ToArray()

    End Sub


    Resultado:

    Esse método criado não é tão performático.

    Se você criar os dois DataGridView com Listas Tipadas é só usar Linq (System.Linq) para fazer isso, olha só

    como reduz o nivel de complexidade do código:

    Dim Items1() As ListItems = DirectCast(DataGridView1.DataSource, ListItems())
    Dim Items2() As Items = DirectCast(DataGridView2.DataSource, Items())
    
    For Each it In Items2
    	Dim count As Integer = Items1.Count(Function(d) d.Id = it.Id)
    	If (count > 0) Then
    		sumItems.Add(New SumItems(it.Id, count))
    	End If
    Next
    
    DataGridView3.DataSource = sumItems.ToArray()

    Ou seja, se tu fez todo orientado a objeto fica fácil fazer essas operações!


    Fulvio C



    segunda-feira, 25 de janeiro de 2016 19:21
  • Fulvio, obrigado por responder, aparentemente vai dar certo, o código é muito bom, só que eu preciso contar "texto" repetidos. no caso eu teria que converter para decimal ? 

    Eu testei pra contar texto só que dar erro, quando coloco pra contar números ele funciona sem erro.

    segunda-feira, 25 de janeiro de 2016 19:58
  • Aonde está:

    Dim Id1 As Integer = Integer.Parse(v1.Cells(0).Value)

    troque

    Dim Id1 As String = v1.Cells(0).Value.ToString()


    igualmente em 

    Dim Id2 As Integer = Integer.Parse(v2.Cells(0).Value)

    troque

    Dim Id2 As String = v2.Cells(0).Value.ToString()

    Acredito que de erro na conversão da cell e seu valores!

    Preste atenção nisso ! OK!



    Fulvio C

    segunda-feira, 25 de janeiro de 2016 20:06
  • Ok, apresentou erro, nessa parte:

    sumItems.Add(New SumItems(Id1, 1))

    O que pode ser ?

    segunda-feira, 25 de janeiro de 2016 20:10
  • Ok, apresentou erro, nessa parte:

    sumItems.Add(New SumItems(Id1, 1))

    O que pode ser ?

    ai é uma classe que acumula resultados! possui esses dois campos Id e Count

    Fulvio C

    Public Class SumItems
        Private _id As Integer
        Public Property Id() As Integer
            Get
                Return _id
            End Get
            Set(ByVal value As Integer)
                _id = value
            End Set
        End Property
        Private _count As Integer
        Public Property Count() As Integer
            Get
                Return _count
            End Get
            Set(ByVal value As Integer)
                _count = value
            End Set
        End Property
    
        Public Sub New()
            _id = 0
            _count = 0
        End Sub
    
        Sub New(id As Integer, count As Integer)
            _id = id
            _count = count
        End Sub
    End Class
    eu faço tudo com classe é por isso!

    segunda-feira, 25 de janeiro de 2016 20:28
  • Fulvio, eu adicionei a classe, porém apresenta o mesmo erro nessa parte.

    E o nome do erro é: a conversão da cadeia de caracteries 'NO' no tipo 'Integer' não é válida.


    • Editado Fepus segunda-feira, 25 de janeiro de 2016 20:41
    segunda-feira, 25 de janeiro de 2016 20:40
  • Fulvio, eu adicionei a classe, porém apresenta o mesmo erro nessa parte.

    E o nome do erro é: a conversão da cadeia de caracteries 'NO' no tipo 'Integer' não é válida.


    Fica dificil opinar sem ver o código inteiro!

    Fulvio C

    segunda-feira, 25 de janeiro de 2016 20:52
  • Ok, vou te passar aqui...

    Primeiramente estou fazendo um teste essa query. veja só.

    Em load do formulário eu acrescento:

    With DataGridView1
    
                .Columns.Add("id", "id")
                .Columns.Add("FILIAL", "FILIAL")
                .Columns.Add("QNT", "QNT")
                .Columns.Add("VALOR", "VALOR")
    
                '.RowCount = DataGridView2.Rows.Count
    
                '.Columns("VALOR").ValueType = GetType(Decimal)
                '.Columns("VALOR").DefaultCellStyle.Format = "C"
    
                Dim linha As String() = New String() {"Felipe", "FILIAL1"}
                DataGridView1.Rows.Add(linha)
                linha = New String() {"Felipe", "FILIAL2"}
                DataGridView1.Rows.Add(linha)
                linha = New String() {"Felipe", "FILIAL3"}
                DataGridView1.Rows.Add(linha)
                linha = New String() {"Felipe", "FILIAL4"}
                DataGridView1.Rows.Add(linha)
                linha = New String() {"Felipe", "FILIAL5"}
                DataGridView1.Rows.Add(linha)
                linha = New String() {"asd", "FILIAL6"}
                DataGridView1.Rows.Add(linha)
                linha = New String() {"asd", "FILIAL7"}
                DataGridView1.Rows.Add(linha)
                linha = New String() {"Felipe", "FILIAL8"}
                DataGridView1.Rows.Add(linha)
                linha = New String() {"OK", "FILIAL9"}
                DataGridView1.Rows.Add(linha)
                linha = New String() {"NO", "FILIAL10"}
                DataGridView1.Rows.Add(linha)
    
    
                '.Rows(0).Cells("QNT").Value = ""
                '.Rows(0).Cells("VALOR").Value = ""
    
            End With
    
    
            With DataGridView2
    
                .Columns.Add("id", "id")
                .Columns.Add("FILIAL", "FILIAL")
                .Columns.Add("QNT", "QNT")
                .Columns.Add("VALOR", "VALOR")
    
                '.RowCount = DataGridView2.Rows.Count
    
                '.Columns("VALOR").ValueType = GetType(Decimal)
                '.Columns("VALOR").DefaultCellStyle.Format = "C"
    
                Dim linha As String() = New String() {"NO", "FILIAL1"}
                DataGridView2.Rows.Add(linha)
                linha = New String() {"asd", "FILIAL2"}
                DataGridView2.Rows.Add(linha)
                linha = New String() {"Felipe", "FILIAL3"}
                DataGridView2.Rows.Add(linha)
                linha = New String() {"OK", "FILIAL4"}
                DataGridView2.Rows.Add(linha)
    
    
                '.Rows(0).Cells("QNT").Value = ""
                '.Rows(0).Cells("VALOR").Value = ""
    
            End With


    No botão eu coloco esse código:

    Private Sub ClsButtonGreen1_Click(sender As Object, e As EventArgs) Handles ClsButtonGreen1.Click
            Try
                DataGridView3.DataSource = Nothing
    
                Dim sumItems As New List(Of SumItems)
    
    
                For Each v2 As DataGridViewRow In DataGridView2.Rows
    
    
                    Dim Id2 As String = v2.Cells(0).Value.ToString()
    
                    For Each v1 As DataGridViewRow In DataGridView1.Rows
    
                        Dim Id1 As String = v1.Cells(0).Value.ToString()
    
                        If (Id2 = Id1) Then
    
    
                            Dim item As SumItems = sumItems.Where(Function(x) x.Id = Id1).FirstOrDefault()
    
                            If (IsNothing(item)) Then
    
                                sumItems.Add(New SumItems(Id1, 1))
    
                            Else
    
                                item.Count += 1
    
                            End If
                        End If
    
                    Next
    
    
                Next
    
                DataGridView3.DataSource = sumItems.ToArray()
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
            
        End Sub

    Então eu coloco a aquela classe.

    segunda-feira, 25 de janeiro de 2016 21:01
  • O Id é string no seu caso! então,você deveria mudar para ficar assim:

    Public Class SumItems
        Private _id As String
        Public Property Id() As String
            Get
                Return _id
            End Get
            Set(ByVal value As String)
                _id = value
            End Set
        End Property
    	
        Private _count As Integer
        Public Property Count() As Integer
            Get
                Return _count
            End Get
            Set(ByVal value As Integer)
                _count = value
            End Set
        End Property
    
        Public Sub New()
            _id = 0
            _count = 0
        End Sub
    
        Sub New(id As String, count As Integer)
            _id = id
            _count = count
        End Sub
    End Class

    Coloque essa classe clicando na aplicação add new item class!

    Pronto!

    Vai funcionar!


    Fulvio C



    segunda-feira, 25 de janeiro de 2016 21:09
  • Fulvio, obrigado pela paciência, mas apareceu o mesmo erro. :/
    segunda-feira, 25 de janeiro de 2016 21:15
  • Fulvio, obrigado pela paciência, mas apareceu o mesmo erro. :/

    mas, o problema não é no meu código !!!

    Peço desculpa nem sempre conseguimos exito!


    Fulvio C

    segunda-feira, 25 de janeiro de 2016 21:28
  • Fulvio, conseguir cara, muito obrigado.

    Agora surgiu outra dúvida, será que pode me ajudar amigo ?

    É assim, na datagrid2 eu estou buscando valor "Texto" na datagrid1, ele mim retorna o valor certinho, agora na minha datagrid vai ter o valor, na datagrid1 tem todos os valores duplicados, por exemplo, na datagrid1 vamos supor que tem 3 nome com MARIO e na datagrid2 sao os dados únicos, então gostaria de que o nome MARIO datagrid2 soma-se os valores que tem na coluna "VALOR" da datgrid1. Por exempo:

    DATAGRID1

    NOME            VALOR

    LUIZ             R$ 50,00

    ROBERTO     R$ 33,00

    CAIO            R$12,00

    LUIZ             R$ 300,00

    LUIZ             R$ 100,00

    Então na DATAGRID2 tem esse nomes datagrid, sendo valores únicos.

    NOME             QNT        VALOR

    LUIZ               

    CAIO              

    ROBERTO      

    No caso das quantidade deu certo com teu código. Agora queria somar a coluna VALOR pela condição do nome. Resultado Final ficaria assim.

    NOME             QNT        VALOR

    LUIZ                3          R$ 450,00

    CAIO               1          R$ 12,00

    ROBERTO         1          R$ 33,00

    Só falta isso para meu problema ficar completo. Cara agradeço muito pela sua ajuda, ajudou bastante, a tempo que vinha quebrando a cabeça com isso. Se for possível fazer isso fico no aguardo. Abraços.


    • Editado Fepus terça-feira, 26 de janeiro de 2016 00:46
    terça-feira, 26 de janeiro de 2016 00:45