none
Como varrer um DataSet somando valores dependendo dos valores de outra coluna RRS feed

  • Pergunta

  • Olá!

    Sou iniciante em C# e tenho uma dúvida que pode talvez ser um pouco óbvia para alguns, mas não consegui achar solução nos fóruns de C#.

    Como percorrer uma tabela e realizar somas ou subtrações dependendo de parâmetros contidos em uma coluna?

    Por exemplo,  eu sei que o item A possui uma quantidade inicial de 5. E alguns registros de entrada e saída de vários itens foram feitos com o passar do tempo. Como eu posso varrer o DataSet em busca de um determinado item (no caso o A) e calcular o seu saldo atual levando em conta a coluna 'Movimento', onde preciso somar ao saldo se o movimento for 'Entrada' e subtrair se for 'Saída'? Achando na tabelinha que fiz como exemplo abaixo o saldo atual de 'A': 5 + 30 - 10 - 5 = 20

    Item|Movimento| Quantidade

    A | Entrada | 30

    C | Saída     | 20

    B |Entrada  | 15

    C |Entrada  | 22

    A  | Saída    | 10

    A | Saída    | 5

    Sei que tudo isso começa com um Foreach, como:

    foreach (DataRow row in ds.Tables["MinhaTabela"].Rows)
    {
     
    }

    Mas como posso usar um 'if' usando como parâmetro os valores da coluna 'Movimento' e somar ou subtrair os valores da coluna 'Quantidade' apenas das linhas que se refiram a um item escolhido?

    Abs!!!




    • Editado LD_7 quinta-feira, 18 de agosto de 2016 14:35
    quinta-feira, 18 de agosto de 2016 14:34

Respostas

  • Olá!

    Você pode fazer algo como isto:

                var dataTable = new DataTable();
                dataTable.Columns.Add("Item");
                dataTable.Columns.Add("Movimento");
                dataTable.Columns.Add("Quantidade", typeof(int));
                dataTable.Rows.Add("A", "Entrada", 30);
                dataTable.Rows.Add("C", "Saída", 20);
                dataTable.Rows.Add("B", "Entrada", 15);
                dataTable.Rows.Add("C", "Entrada", 22);
                dataTable.Rows.Add("A", "Saída", 10);
                dataTable.Rows.Add("A", "Saída", 5);
    
                var resultado = 5;
                foreach (DataRow row in dataTable.Rows)
                {
                    // Se o item for "A"
                    if (string.Compare(row["Item"].ToString(), "A", StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        var quantidade = Convert.ToInt32(row["Quantidade"]);
    
                        // Entrada.
                        if (string.Compare(row["Movimento"].ToString(), "Entrada", StringComparison.InvariantCultureIgnoreCase) == 0)
                            resultado += quantidade;
                        // Saída
                        else
                            resultado -= quantidade;
                    }
                }
    
                MessageBox.Show(resultado.ToString());
    

    Abraço!


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    quinta-feira, 18 de agosto de 2016 14:46
    Moderador

Todas as Respostas

  • Olá!

    Você pode fazer algo como isto:

                var dataTable = new DataTable();
                dataTable.Columns.Add("Item");
                dataTable.Columns.Add("Movimento");
                dataTable.Columns.Add("Quantidade", typeof(int));
                dataTable.Rows.Add("A", "Entrada", 30);
                dataTable.Rows.Add("C", "Saída", 20);
                dataTable.Rows.Add("B", "Entrada", 15);
                dataTable.Rows.Add("C", "Entrada", 22);
                dataTable.Rows.Add("A", "Saída", 10);
                dataTable.Rows.Add("A", "Saída", 5);
    
                var resultado = 5;
                foreach (DataRow row in dataTable.Rows)
                {
                    // Se o item for "A"
                    if (string.Compare(row["Item"].ToString(), "A", StringComparison.InvariantCultureIgnoreCase) == 0)
                    {
                        var quantidade = Convert.ToInt32(row["Quantidade"]);
    
                        // Entrada.
                        if (string.Compare(row["Movimento"].ToString(), "Entrada", StringComparison.InvariantCultureIgnoreCase) == 0)
                            resultado += quantidade;
                        // Saída
                        else
                            resultado -= quantidade;
                    }
                }
    
                MessageBox.Show(resultado.ToString());
    

    Abraço!


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima

    quinta-feira, 18 de agosto de 2016 14:46
    Moderador
  • Olá, Andre!!!

    Muito obrigado pela dica!

    Eu estava tentando entender este conceito de varredura do DataSet para aplicar em um DataGridView. Mas estou me enrolando um pouco.

    Minha intenção é preencher um datagridview que já contém a relação de todos o itens. Isso com base nos registros de movimentação. O datagridview já tem todos os itens, como por exemplo: A, B, C, D., etc... E o programa vai consultar o saldo atual de item por item com base nas movimentações.

    Pensei em fazer um foreach dentro do outro. Um precorre o datagridview, linha por linha para buscar o nome do item e o outro foreach interno faz a busca no dataSet onde estão registradas as movimentações.

    Fiz dessa maneira, mas está preenchendo apenas a primeira linha da coluna Saldo.

    void VarreDataGrid()
            {
                var resultado = 0;
                string strRowMaterial = string.Empty;
    
                Conexao ca = new Conexao();
                string sql = "";
                sql += " Select ";
                sql += " idRegMovimentacao, CatMovimentacao, NomeMovimentacao, codMaterial, QuantidadeMovimentada ";
                sql += " From RegistrosMovimentacao ";
                sql += " ORDER BY idRegMovimentacao ";
    
                ca.Conectar();
                OleDbDataAdapter da = new OleDbDataAdapter(sql, ca.cx);
                DataSet ds = new DataSet();
                da.Fill(ds, "RegistrosMovimentacoes");
                if (ds.Tables["RegistrosMovimentacoes"].Rows.Count == 0)
                {
                    ca.Desconectar();
                }
                else
                {
    
                    foreach (DataGridViewRow dr in dgvListagem.Rows)
                    {
                        strRowMaterial = Convert.ToString(dr.Cells["codMaterial"].Value);
    
                        foreach (DataRow row in ds.Tables["RegistrosMovimentacoes"].Rows)
                        {
                            if (string.Compare(row["codMaterial"].ToString(), strRowMaterial, StringComparison.InvariantCultureIgnoreCase) == 0)
                            {
                                var quantidade = Convert.ToInt32(row["QuantidadeMovimentada"]);
    
                                if (string.Compare(row["CatMovimentacao"].ToString(), "Entrada", StringComparison.InvariantCultureIgnoreCase) == 0)
                                    resultado += quantidade;
                                                             
                                else
                                    resultado -= quantidade; 
                            }
                            else
                            {
                                resultado = 0;
                            }                        
    
                        }
                        dgvListagem.CurrentRow.Cells["Saldo"].Value = resultado;
                    }
                }
    
                ca.Desconectar();
    
            }

    Muito obrigado!

    Abraço!


    • Editado LD_7 segunda-feira, 22 de agosto de 2016 16:16
    segunda-feira, 22 de agosto de 2016 16:09
  • O erro estava em:

    dgvListagem.CurrentRow.Cells["Saldo"].Value = resultado;


    Funcionou da seguinte maneira:

            void VarreDataGrid()
            {
                var resultado = 0;
                string strRowMaterial = string.Empty;
    
                Conexao ca = new Conexao();
                string sql = "";
                sql += " Select ";
                sql += " idRegMovimentacao, CatMovimentacao, NomeMovimentacao, codMaterial, QuantidadeMovimentada ";
                sql += " From RegistrosMovimentacao ";
                sql += " ORDER BY idRegMovimentacao ";
    
                ca.Conectar();
                OleDbDataAdapter da = new OleDbDataAdapter(sql, ca.cx);
                DataSet ds = new DataSet();
                da.Fill(ds, "RegistrosMovimentacoes");
                if (ds.Tables["RegistrosMovimentacoes"].Rows.Count == 0)
                {
                    ca.Desconectar();
                }
                else
                {
    
                    foreach (DataGridViewRow dr in dgvListagem.Rows)
                    {
                        strRowMaterial = Convert.ToString(dr.Cells["codMaterial"].Value);
    
                        foreach (DataRow row in ds.Tables["RegistrosMovimentacoes"].Rows)
                        {
                            if (string.Compare(row["codMaterial"].ToString(), strRowMaterial, StringComparison.InvariantCultureIgnoreCase) == 0)
                            {
                                var quantidade = Convert.ToInt32(row["QuantidadeMovimentada"]);
    
                                if (string.Compare(row["CatMovimentacao"].ToString(), "Entrada", StringComparison.InvariantCultureIgnoreCase) == 0)
                                    resultado += quantidade;
                                                             
                                else
                                    resultado -= quantidade; 
                            }
                            else
                            {
                                resultado = 0;
                            }                        
    
                        }
                        
                    }
                        dr.Cells["Saldo"].Value = resultado;
                }
    
                ca.Desconectar();
    
            }

    Abs!


    sexta-feira, 2 de setembro de 2016 12:50