none
Adicionar elementos a uma lista(of integer/decimal) RRS feed

  • Pergunta

  • Olá Pessoal!

    Com a tabela abaixo, estou querendo somar os valores para cada fornecedor:

    idFornecedor    Item          Preco

    1                      Item a       10,00

    1                      Item b       20,00

    2                      Item a       30,00

    2                      Item b        40,00  

    Assim, o resultado desejado seria: (1, 30) e (2, 70)

    Para tanto, estou querendo montar duas listas: uma para o fornecedor, outra para o somatorio. Depois, converteria as listas em arrays e usaria o array.sort para ordena-las, tendo como chave o somatorio. Porém, quando eu uso o código abaixo, não consigo adicionar os elementos às listas:

    Private Sub Calculo()
    Dim idFornecedor As List(Of Integer) = New List(Of Integer)
    Dim somaFornecedor As List(Of Decimal) = New List(Of Decimal)
    Dim valor As Decimal
         For i = 1 To j
            For Each col As DataGridViewRow In
    dgItensPesquisado.Rows
                If col.Cells(0).Value = i Then
                   valor = valor + CInt(col.Cells(2).Value)
                   somaFornecedor.Add(valor)
                   idFornecedor.Add(i)
                End If
            Next
         Next i
    End Sub

    O quê estou fazendo de errado? As mensagens de erro são:

    • para o idFornecedor, o erro é que se adiciona somente o primeiro elemento, e não os demais do laço, que no exemplo seria o "2".
    • para o somaFornecedor o erro é que o indice esta fora do range;isto é, o valor de 30 para o primeiro i não pode ser adicionado

    Qualquer ajuda eu agradeceria!


    goku

    sábado, 6 de abril de 2013 21:52

Todas as Respostas

  • amigo montei um exemplo para você:

    Dim Soma As Double
    Dim Id As Integer
    Dim idFornecedor As New List(Of Integer)()
    Dim somaValores As New List(Of Double)()
    
    For i As Integer = 0 To Dgv.Rows.Count - 1
    	Id = Convert.ToInt32(Dgv.Rows(i).Cells(0).Value)
    
    	'evita calcular repetido
    	If Not idFornecedor.Contains(Id) Then
    		Soma = 0.0
    
    		For n As Integer = 0 To Dgv.Rows.Count - 1
    			If Convert.ToInt32(Dgv.Rows(i).Cells(0).Value) = Id Then
    				Soma += Convert.ToDouble(Dgv.Rows(i).Cells(1).Value)
    			End If
    		Next
    
    		idFornecedor.Add(Id)
    		somaValores.Add(Soma)
    	End If
    Next
    

    ve ai e me fala se deu certo !

    abraços,

    boa noite !


    Att, Afonso Fernandes.

    • Marcado como Resposta songoku99 domingo, 28 de abril de 2013 02:49
    • Não Marcado como Resposta songoku99 domingo, 28 de abril de 2013 03:27
    sábado, 6 de abril de 2013 22:48
  • Olá! Obrigado pelo post! Eu tentei chamar o resultado, mas não retornou nada, nem mensagem de erro. Alterei o código, incluindo next n e next i e alterando o endereço da celula na Soma, conforme abaixo:

    Dim Soma As Double
    Dim Id As Integer
    Dim idFornecedor As New List(Of Integer)()
    Dim somaValores As New List(Of Double)()
       For i As Integer = 0 To
    dgItensPesquisado.Rows.Count - 1
          Id = Convert.ToInt32(dgItensPesquisado.Rows(i).Cells(0).Value)
                'evita calcular repetido
          If Not idFornecedor.Contains(Id) Then
             Soma = 0.0
             For n As Integer = 0 To dgItensPesquisado.Rows.Count - 1
               If Convert.ToInt32(dgItensPesquisado.Rows(i).Cells(0).Value) = Id Then
                Soma += Convert.ToDouble(dgItensPesquisado.Rows(i).Cells(2).Value)
               End If
             Next n
             idFornecedor.Add(Id)
             somaValores.Add(Soma)
          End If
      Next i
     Dim idFornecedorArray() = idFornecedor.ToArray()
     Dim somaValoresArray() = somaValores.ToArray()
     'Console.WriteLine(idFornecedor)
      Console.ReadLine()
     
        End Sub

    Obrigado!


    goku

    sábado, 6 de abril de 2013 23:21
  • Ooops! Funciona! Só a forma de chamar os elementos estavam erradas. Obrigado!

    goku

    domingo, 28 de abril de 2013 02:49
  • Olá, tentei converter para Array e utilizar o Array.Sort, mas consegui resultados estranhos. O resultado varia...

    Private Sub calculo()

            Dim Soma As Double
            Dim Id As Integer
            Dim idFornecedor As List(Of Integer) = New List(Of Integer)
            Dim somaValores As List(Of Double) = New List(Of Double)

            For i As Integer = 1 To dgItensPesquisado.Rows.Count - 1
                Id = Convert.ToInt32(dgItensPesquisado.Rows(i).Cells(0).Value)

                'evita calcular repetido
                If Not idFornecedor.Contains(Id) Then
                    Soma = 0.0

                    For n As Integer = 1 To dgItensPesquisado.Rows.Count - 1
                        If Convert.ToInt32(dgItensPesquisado.Rows(i).Cells(0).Value) = Id Then
                            Soma += Convert.ToDouble(dgItensPesquisado.Rows(i).Cells(2).Value)
                        End If
                    Next n

                    idFornecedor.Add(Id)
                    somaValores.Add(Soma)
                End If
            Next i
            Dim idFornecedorArray() = idFornecedor.ToArray()
            Dim somaValoresArray() = somaValores.ToArray()
           
            Array.Sort(somaValoresArray, idFornecedorArray)
           
            For Each element In somaValoresArray
                For Each elements In idFornecedorArray
                    MsgBox(element.ToString - elements.ToString)
                Next
            Next


           
        End Sub


    goku

    domingo, 28 de abril de 2013 03:55
  • Olá amigo, desculpe a demora rsrs

    o resultado varia quando ele vai para o array ou no list mesmo ele já esta variando ?

    não faz sentido rsrs

    abraços !


    Att, Afonso Fernandes.

    domingo, 28 de abril de 2013 21:10
  • Ah! Desculpe, foi porque montei errado a mensagem! Deveria ser assim:

    MsgBox(element.ToString & " - " & elements.ToString)

    Entretanto, vejo que os resultados não estão legais. Pelo exemplo, eu desejaria como resultado os conjuntos: (1, 30) e (2, 70).

    Mas, o Array de soma está com o conjunto (0, 40, 120) e o array de ID está com o conjunto (0, 1, 2). Bom, o "0" está aparecendo pois o meu datagrid retorna uma linha Null (sem dados). Porém o erro está no array de soma...

    Então, fiz umas modificações e está funcionando beleza, conforme abaixo:

    Dim idFornecedor As List(Of Integer) = New List(Of Integer)
            Dim somaFornecedor As List(Of Decimal) = New List(Of Decimal)
            Dim valor As Decimal
            For i = 1 To j
                valor = 0
                For Each col As DataGridViewRow In dgItensPesquisado.Rows
                    If col.Cells(0).Value = i Then
                        valor = valor + CDec(col.Cells(2).Value)
                    End If
                Next
                somaFornecedor.Add(valor)
                idFornecedor.Add(i)
            Next i
            Dim idFornecedorArray() = idFornecedor.ToArray()
            Dim somaValoresArray() = somaFornecedor.ToArray()
            Array.Sort(somaValoresArray, idFornecedorArray)
            ' ''Console.WriteLine("After sorting a section of the Array using the default comparer:")
            ' ''PrintKeysAndValues(somaValoresArray, idFornecedorArray)
            For Each element In somaValoresArray
                For Each elements In idFornecedorArray
                    MsgBox(element.ToString & " - " & elements.ToString)
                Next
            Next

    Eu gostaria de perguntar se há uma forma de fazer o Loop pelos conjuntos, e trazer ao mesmo tempo o idFornecedor e a soma a ele associada, pois da forma do exemplo acima, sempre trago as somas, e mais todos os IDs, sem haver uma associação entre eles, tipo: (30, 1), (30, 2), (70, 1), (70, 2). Alguma dica? 


    goku

    segunda-feira, 29 de abril de 2013 03:48