MULTIPLICAR COLUNAS DE DATAGRIDVIEW

SANROMAN 20/01/2015 18:41:47
#443893
Boa tarde,

Tenho um datagridview criado por código e preciso multiplicar duas colunas do datagridview (Preço Unitário e Qtde) e colocar o resultado em uma nova coluna chamada Total Produto. O código segue abaixo:

Private Sub EntradaCaixaDetalhada()

Dim sqlCon As New SqlConnection(strCmd)
Dim strSql As String = [Ô]SELECT NumVenda, NomeCliente, Especie, NomeProduto, PrecoUnitario, Quantidade [Ô] & _
[Ô]FROM TB_VendaBalcao [Ô] & _
[Ô]WHERE TB_VendaBalcao.DataVenda = [ô][Ô] & dtpDataVenda.Text & [Ô][ô][Ô] & _
[Ô]ORDER BY id_VendaBalcao DESC[Ô]

Dim sqlCmd As New SqlCommand(strSql, sqlCon)
Dim daFC As New SqlDataAdapter(sqlCmd)
Dim dtFC As DataTable = New DataTable([Ô]FluxoCaixa[Ô])
Dim dsFC As DataSet = New DataSet
dgvEntradas.Columns.Clear()

daFC.Fill(dsFC)

With dgvEntradas

.DefaultCellStyle.Font = New Font([Ô]SegoiUI[Ô], 7.5, FontStyle.Regular)
.ColumnHeadersDefaultCellStyle.Font = New Font([Ô]SegoiUI[Ô], 8, FontStyle.Regular)
.GridColor = Color.LightGray
.BorderStyle = BorderStyle.Fixed3D
.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.None
.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None
.BackgroundColor = Color.White
.ColumnCount = 6
.AutoGenerateColumns = False
.Columns(0).Name = [Ô]Nº Venda[Ô]
.Columns(1).Name = [Ô]Cliente[Ô]
.Columns(2).Name = [Ô]Forma Pgto[Ô]
.Columns(3).Name = [Ô]Produto[Ô]
.Columns(4).Name = [Ô]P. Unitário[Ô]
.Columns(5).Name = [Ô]Qtde[Ô]
.Columns(0).Width = 100
.Columns(1).Width = 250
.Columns(2).Width = 90
.Columns(3).Width = 250
.Columns(4).Width = 80
.Columns(5).Width = 50
.Columns.Add([Ô]TotalProduto[Ô], [Ô]Total Produto[Ô])

Dim totalProduto As Decimal

For Each coluna As DataGridViewRow In dgvEntradas.Rows
totalProduto = totalProduto + (coluna.Cells(4).Value * coluna.Cells(5).Value)
Next

.Columns(4).DefaultCellStyle.Format = [Ô]N[Ô]
.Columns(6).DefaultCellStyle.Format = [Ô]N[Ô]
.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
.Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
.Columns(4).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
.Columns(5).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.AllowUserToOrderColumns = False
.AllowUserToResizeColumns = False
.AllowUserToResizeRows = False

End With

dtFC = dsFC.Tables(0)

For Each linha As DataRow In dtFC.Rows
dgvEntradas.Rows.Add(linha(0), linha(1), linha(2), linha(3), linha(4), linha(5))
Next

End Sub


O datagridview é preenchido corretamente e a coluna Total Produtos e criada. O Problema e que não sei como colocar o resultado em cada linha da coluna Total Produtos.

Desde já agradeço.

NICKOSOFT 20/01/2015 21:55:42
#443898
um tanto diferente do seu projeto, mas ja q ta fazendo tudo na unha, veja o q entende disso
  
Dim dtDados As New DataTable([Ô]Alunos[Ô])

dtDados.Columns.Add([Ô]Nome[Ô], Type.GetType([Ô]System.String[Ô]))
dtDados.Columns.Add([Ô]Nota1[Ô], Type.GetType([Ô]System.Double[Ô]))
dtDados.Columns.Add([Ô]Nota2[Ô], Type.GetType([Ô]System.Double[Ô]))
dtDados.Columns.Add([Ô]Media[Ô], Type.GetType([Ô]System.Double[Ô]))

Dim dtRow As DataRow = dtDados.NewRow()
dtRow([Ô]Nome[Ô]) = [Ô]zezinho[Ô]
dtRow([Ô]nota1[Ô]) = 9.5
dtRow([Ô]nota2[Ô]) = 7.5
dtRow([Ô]media[Ô]) = (CDbl(dtRow([Ô]nota1[Ô])) + CDbl(dtRow([Ô]nota2[Ô]))) / 2
dtDados.Rows.Add(dtRow)

dtRow = dtDados.NewRow()
dtRow([Ô]Nome[Ô]) = [Ô]luizinho[Ô]
dtRow([Ô]nota1[Ô]) = 6.5
dtRow([Ô]nota2[Ô]) = 8.5
dtRow([Ô]media[Ô]) = (CDbl(dtRow([Ô]nota1[Ô])) + CDbl(dtRow([Ô]nota2[Ô]))) / 2
dtDados.Rows.Add(dtRow)

dtRow = dtDados.NewRow()
dtRow([Ô]Nome[Ô]) = [Ô]huginho[Ô]
dtRow([Ô]nota1[Ô]) = 9.5
dtRow([Ô]nota2[Ô]) = 7.5
dtRow([Ô]media[Ô]) = (CDbl(dtRow([Ô]nota1[Ô])) + CDbl(dtRow([Ô]nota2[Ô]))) / 2
dtDados.Rows.Add(dtRow)

DataGridView2.DataSource = dtDados
OMAR2011 21/01/2015 13:30:31
#443910
Você pode fazer isto, usando o Sum e Group by na própria tabela.
Pode usar que vai dar certo.
SANROMAN 21/01/2015 15:54:27
#443914
Boa tarde OMAR

Tentei usar SUM e GROUP BY mas de todas as formas que tentei da erro. Com certeza estou fazendo algo errado, se puder postar algum exemplo ficarei sinceramente agradecido, estou perdidão kkkk
OMAR2011 21/01/2015 16:14:48
#443915
Criar uma tabela semelhante a sua porém sem campo data.
Não existe forma de pagamento na sua consulta, então mudei.

Private Sub EntradaCaixaDetalhada()
Dim strCmd As String = [Ô]Server=(localdb)\v11.0;Integrated Security=true;AttachDbFileName=C:\Users\Omar\Desktop\Emagrecimento\bin\Debug\.mdf[Ô]
Dim sqlCon As New SqlConnection(strCmd)
Dim strSql As String = [Ô]SELECT NumVenda,NomeCliente, Especie, NomeProduto,Quantidade ,PrecoUnitario,(PrecoUnitario * Quantidade) as TotalProduto [Ô] & _
[Ô]FROM TB_VendaBalcao Group by NumVenda,NomeCliente, NomeProduto,PrecoUnitario,Especie,quantidade,id_VendaBalcao [Ô] & _
[Ô]ORDER BY id_VendaBalcao [Ô]
[ô]Dim strSql As String = [Ô]SELECT NumVenda,NomeCliente, Especie, NomeProduto,Quantidade ,PrecoUnitario,Sum(PrecoUnitario * Quantidade) as TotalProduto [Ô] & _
[ô] [Ô]FROM TB_VendaBalcao Group by NumVenda,NomeCliente, NomeProduto,PrecoUnitario,Especie,quantidade,id_VendaBalcao [Ô] & _
[ô][Ô]ORDER BY id_VendaBalcao [Ô]

[ô] Dim strSql As String = [Ô]SELECT NumVenda, NomeCliente, Especie, NomeProduto, PrecoUnitario, Quantidade [Ô] & _
[ô] [Ô]FROM TB_VendaBalcao [Ô] & _
[ô] [Ô]ORDER BY id_VendaBalcao DESC[Ô]

Dim sqlCmd As New SqlCommand(strSql, sqlCon)
Dim daFC As New SqlDataAdapter(sqlCmd)
Dim dtFC As DataTable = New DataTable([Ô]FluxoCaixa[Ô])
Dim dsFC As DataSet = New DataSet
dgvEntradas.Columns.Clear()

daFC.Fill(dsFC)

With dgvEntradas

.DefaultCellStyle.Font = New Font([Ô]SegoiUI[Ô], 7.5, FontStyle.Regular)
.ColumnHeadersDefaultCellStyle.Font = New Font([Ô]SegoiUI[Ô], 8, FontStyle.Regular)
.GridColor = Color.LightGray
.BorderStyle = BorderStyle.Fixed3D
.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.None
.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None
.BackgroundColor = Color.White
.ColumnCount = 6
.AutoGenerateColumns = False
.Columns(0).Name = [Ô]Nº Venda[Ô]
.Columns(1).Name = [Ô]Cliente[Ô]
.Columns(2).Name = [Ô]Espécie[Ô]
.Columns(3).Name = [Ô]Produto[Ô]
.Columns(4).Name = [Ô]Qtde[Ô]
.Columns(5).Name = [Ô]P. Unitário[Ô]

.Columns(0).Width = 100
.Columns(1).Width = 250
.Columns(2).Width = 90
.Columns(3).Width = 250
.Columns(4).Width = 80
.Columns(5).Width = 50
.Columns.Add([Ô]TotalProduto[Ô], [Ô]Total Produto[Ô])

Dim totalProduto As Decimal

For Each coluna As DataGridViewRow In dgvEntradas.Rows
totalProduto = totalProduto + (dgvEntradas.CurrentRow.Cells(4).Value * dgvEntradas.CurrentRow.Cells(5).Value)

Next


.Columns(4).DefaultCellStyle.Format = [Ô]N[Ô]

.Columns(6).DefaultCellStyle.Format = [Ô]N[Ô]
.Columns(0).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
.Columns(3).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
.Columns(4).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
.Columns(5).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.AllowUserToOrderColumns = False
.AllowUserToResizeColumns = False
.AllowUserToResizeRows = False

End With

dtFC = dsFC.Tables(0)

For Each linha As DataRow In dtFC.Rows
dgvEntradas.Rows.Add(linha(0), linha(1), linha(2), linha(3), linha(4), linha(5), linha(6))
Next

End Sub


Muda de acordo a sua necessidade.
SANROMAN 22/01/2015 11:22:59
#443945
Bom dia OMAR

Seguindo suas orientações não dá nenhum tipo de erro, acho que isso quer dizer que a consulta está correta.

Necessito da data para filtrar as vendas do dia. Seguindo seu exemplo montei de tal forma a pesquisa:

Dim strSql As String = [Ô]SELECT NumVenda, NomeCliente, Especie, NomeProduto, Quantidade, PrecoUnitario, SUM(PrecoUnitario * Quantidade) as TotalProduto [Ô] & _
[Ô]FROM TB_VendaBalcao [Ô] & _
[Ô]WHERE TB_VendaBalcao.DataVenda = [ô][Ô] & dtpDataVenda.Text & [Ô][ô][Ô] & _
[Ô]GROUP BY NumVenda, NomeCliente, Especie, NomeProduto, Quantidade, PrecoUnitario [Ô] & _
[Ô]ORDER BY NumVenda DESC[Ô]

Funciona, monta a coluna Total Produto, filtra os dados pela data e ordena pela numero da venda, mas não mostra o resultado na coluna, fica em branco.

Como estamos montando a multiplicação na própria consulta - SUM(PrecoUnitario * Quantidade) as TotalProduto - será realmente necessário estas linhas de código.

Dim totalProduto As Decimal

For Each coluna As DataGridViewRow In dgvEntradas.Rows

totalProduto = totalProduto + (coluna.Cells(4).Value * coluna.Cells(5).Value)

Next

E, se necessária, não está faltando jogar o valor da operação para a coluna Total Produto do dgvEntradas.

Tenha um lindo dia.

NICKOSOFT 22/01/2015 16:27:24
#443959
na minha opiniao nenhum dos 2 fors seria necessario
vc pode definir o datasource do grid ao dataset

dgvEntradas.DataSource=dsFC.Tables(0)

mas nao seria por esses for o problema, deve ser outra coisa....e cuidado no uso de data como criterio
SANROMAN 22/01/2015 21:30:09
#443962
Boa Noite NICKOSOFT

Fiz algumas tentativas com datasource (sem os FOR, com apenas um FOR) e não funcionou, nem os dados das outras colunas entraram.

Meu conhecimento em VB.NET ainda é pequeno, não consigo nem imaginar como trabalhar com dados que necessitem serem separados por datas sem o uso das mesmas como critério.

Se possui algum exemplo, de como isso possa ser feito, ficarei muito agradecido.

NICKOSOFT 22/01/2015 22:26:29
#443968
Amanha dou uma olhada no pc, creio ter algo q ajude, na verdade a data é usada como criterio, mas varia de banck ora banco como ser usada
NICKOSOFT 23/01/2015 07:25:19
#443970
nao achei nada entao criei mesmo, tentando seguir exatamente seu caso, como eu nao tinha o BD, nem tabela nem nada, no load do form eu tratei de criar o banco, e a tabela, fiz em sqlce q eu acho super pratico e rapido pra pequenos projetos....
criei uma rotina pra inclusao dos dados, afinal precisava preencher a tabela, mas nao é necessario no seu caso q ja tem a tabela e ate os dados....
o q vc precisa ficou no button1, q faz a busca, passa os parametros para a funcao retornards, q faz o trabalho pesado da verdadeira busca no bd e envia como retorno um ds(dataset) a quem chamou, e eu jogo no grid, poupando até aquela formatacao, no caso fica bem mais ajeitadinho enfeitar o grid, no caso de dar nome bonito as colunas pro grid vc pode fazer direto no select do bd como na coluna q criou para o total, acho q é isso.....no caso nao precisei me preocupar com a questao de data, pq a tabela foi criada com o campo em formato data, e o argumento foi passado tmb como data
  
Private Caminho As String = Application.StartupPath & [Ô]\Caixa.sdf[Ô]
Dim connectionString As String = String.Format([Ô]DataSource=[Ô] & Caminho & [Ô];[Ô])

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim sqlEng As New SqlCeEngine(connectionString)
[ô]verifica se o arquivo do bando existe
If File.Exists(Caminho) = False Then
[ô]nao existe cria o BD
sqlEng.CreateDatabase()
sqlEng.Dispose()

[ô]montamos uma instrução SQL usando Create Table definindo a estrutura da tabela a ser criada
Dim cn As SqlCeConnection = New SqlCeConnection(connectionString)
cn.Open()
Dim cmd As SqlCeCommand
Dim sql As String = [Ô]create table TB_VendaBalcao ([Ô] _
& [Ô]ID INTEGER IDENTITY(1,1) PRIMARY KEY, [Ô] _
& [Ô]NumVenda integer, [Ô] _
& [Ô]NomeCliente nvarchar(50), [Ô] _
& [Ô]Especie integer, [Ô] _
& [Ô]NomeProduto nvarchar(50), [Ô] _
& [Ô]Quantidade integer, [Ô] _
& [Ô]PrecoUnitario real, [Ô] _
& [Ô]DataVenda datetime)[Ô]
cmd = New SqlCeCommand(sql, cn)
cmd.ExecuteNonQuery()
End If
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
[ô]montando a query e passando o parametro data
Dim Comando As New SqlCeCommand
Comando.CommandText = [Ô]SELECT NumVenda, NomeCliente, Especie, NomeProduto, Quantidade, PrecoUnitario, SUM(PrecoUnitario * Quantidade) as TotalProduto [Ô] & _
[Ô]FROM TB_VendaBalcao [Ô] & _
[Ô]WHERE TB_VendaBalcao.DataVenda = @data [Ô] & _
[Ô]GROUP BY NumVenda, NomeCliente, Especie, NomeProduto, Quantidade, PrecoUnitario [Ô] & _
[Ô]ORDER BY NumVenda DESC[Ô]
Comando.Parameters.Add([Ô]@data[Ô], SqlDbType.DateTime).Value = DateTimePicker1.Text

Dim DS As New DataSet
DS = RetornarDS(Comando)

dgvEntradas.DataSource = DS.Tables(0)
End Sub

Public Function RetornarDS(ByVal strQuery As SqlCeCommand) As DataSet
Dim cn As SqlCeConnection = New SqlCeConnection(connectionString)
Try
cn.Open()
strQuery.Connection = cn
strQuery.ExecuteNonQuery()
Dim dtAdapter As New SqlCeDataAdapter
Dim dsDataSet As New DataSet
With dtAdapter
.SelectCommand = strQuery
.Fill(dsDataSet)
End With
Return dsDataSet
Catch ex As Exception
Throw ex
Finally
cn.Close()
End Try
End Function
Tópico encerrado , respostas não são mais permitidas