Usuário com melhor resposta
Como varrer um DataSet somando valores dependendo dos valores de outra coluna

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
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- Sugerido como Resposta Robson William SilvaModerator quinta-feira, 18 de agosto de 2016 16:14
- Marcado como Resposta Robson William SilvaModerator sexta-feira, 19 de agosto de 2016 13:12
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- Sugerido como Resposta Robson William SilvaModerator quinta-feira, 18 de agosto de 2016 16:14
- Marcado como Resposta Robson William SilvaModerator sexta-feira, 19 de agosto de 2016 13:12
-
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
-
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!