CALCULOS COM DATAGRIDVIEW

FOXMAN 14/09/2012 21:10:12
#409717
Boa noite pessoal...
Alguém tem algum exemplo de como utilizar calculos em um datagridview, colocando o resultado da soma da linha em uma celula ????

O que eu preciso seria algo assim :

1 6 5 = 12
4 9 5 = 18

A idéia é ao alterar o conteudo de uma celula corrigr o valor da próxima
celula para que a soma das celulas seja igual ao valor da ultima coluna.

A última coluna nunca muda e servirá para a validação da soma das outras colunas.
O problema é a quantidade de colunas variam.

Se alguém tiver uma idéia, pois eu particularmente trabalho mais com Listview , porém preciso de um grid editavel.

NILSONTRES 14/09/2012 22:12:24
#409719
FOX,
Eu já sou contrario, só utilizo o DATAGRID.
Bom, sé o que eu entendi, e a quantidade de colunas pode variar, acho que é isso ai:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Soma_Col As Integer
With DataGridView1
.Columns.Add(0, [Ô]col1[Ô])
.Columns.Add(1, [Ô]col2[Ô])
.Columns.Add(2, [Ô]col3[Ô])
.Columns.Add(3, [Ô]col4[Ô])
.Rows.Add([Ô]1[Ô], [Ô]6[Ô], [Ô]5[Ô], [Ô][Ô])
Soma_Col = CInt(.Rows(.Rows.Count - 2).Cells(0).Value) + CInt(.Rows(.Rows.Count - 2).Cells(1).Value) + CInt(.Rows(.Rows.Count - 2).Cells(2).Value)
.Rows(.Rows.Count - 2).Cells(3).Value = Soma_Col
.Rows.Add([Ô]4[Ô], [Ô]9[Ô], [Ô]5[Ô], [Ô][Ô])
Soma_Col = CInt(.Rows(.Rows.Count - 2).Cells(0).Value) + CInt(.Rows(.Rows.Count - 2).Cells(1).Value) + CInt(.Rows(.Rows.Count - 2).Cells(2).Value)
.Rows(.Rows.Count - 2).Cells(3).Value = Soma_Col
End With
End Sub
FOXMAN 14/09/2012 22:39:08
#409720
Citação:

:
FOX,
Eu já sou contrario, só utilizo o DATAGRID.
Bom, sé o que eu entendi, e a quantidade de colunas pode variar, acho que é isso ai



Esse calculo eu consigo fazer, o que eu quero é ao alterar um valor da celula o calculo seja refeito, subraindo ou adicionado o valor alterado na proxima celula.

A dificuldade maior é saber em qual evento esse processo é mais eficaz.

Minha formula para o calculo segue abaixo :




  If MultiLoja = True Then
gbTransferencia.Visible = True
dgvTransferencia.Rows.Add(txtCodProduto.Text)
Dim qt(QtdeLojas - 1) As String
Dim vlr As Integer
For qtx As Integer = 0 To QtdeLojas - 1
If qtx = 0 Then
qt(qtx) = Math.Round(CDbl(CDec(txtqtde.Text / QtdeLojas)), MidpointRounding.AwayFromZero)
vlr = qt(qtx)
Else
qt(qtx) = CDec(txtqtde.Text - vlr) - qt(qtx - 1)
End If

Next

For col As Integer = 0 To dgvTransferencia.Columns.Count - 1
If col = 0 Or col = dgvTransferencia.Columns.Count - 1 Then
If col = dgvTransferencia.Columns.Count - 1 Then
dgvTransferencia.Rows(lstProdutosLancados.Items.Count - 1).Cells(col).Value = txtqtde.Text
Else
Continue For
End If
Else
dgvTransferencia.Rows(lstProdutosLancados.Items.Count - 1).Cells(col).Value = Math.Round(CDbl(qt(col - 1)), MidpointRounding.AwayFromZero)
End If

Next
End If


Dessa forma eu pego um valor divido por X e obtenho os valores divididos automaticamente para cada loja.
Porem se o usuario mudar o conteudo de uma celula eu preciso recalcular as quantidades a serem distribuidas, porém o valor total sempre será o mesmo.

Entendeu ???

NILSONTRES 14/09/2012 23:20:44
#409723
Seu problema não é fazer os calculos, mas sim a edição das celulas, da uma olhada nisso e ve o que acha.
De tanto passar nervoso com a chatice de editar as celulas do Grid, eu voltei ao mesmo esquema do vb6 + flexgrid, e olha que não troco por nada, fica
muito mais facil de manipular.


FOXMAN 14/09/2012 23:50:02
#409725
Citação:

:
Seu problema não é fazer os calculos, mas sim a edição das celulas, da uma olhada nisso e ve o que acha.
De tanto passar nervoso com a chatice de editar as celulas do Grid, eu voltei ao mesmo esquema do vb6 + flexgrid, e olha que não troco por nada, fica
muito mais facil de manipular.




Rapaz é quase isso mesmo, apenas dois detalhes :

Não consegui editar 2 colunas, apenas uma.
Se eu editar a penultima coluna, a ultima muda o valor, o que não poderia, uma vez que a ultima coluna é a quantidade que de produtos constante na nota.

Mas acredito que dá para adaptar aqui...vou ver e te retorno.

Eu sou um Zero a esquerda com datagridview.

De qualquer forma Thanks por enquanto.
FOXMAN 14/09/2012 23:53:42
#409726
Só para constar estava eu com essa linha de raciocinio, veja :

  Private Sub dgvTransferencia_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvTransferencia.CellValueChanged
Try
If MultiLoja = True Then
Dim qt(QtdeLojas - 1) As String
Dim vlr As Integer
For qtx As Integer = 0 To QtdeLojas - 1
If qtx = 0 Then
qt(qtx) = Math.Round(CDbl(CDec(dgvTransferencia.Rows(e.RowIndex).Cells(dgvTransferencia.Columns.Count - 1).Value - dgvTransferencia.Rows(e.RowIndex).Cells(e.ColumnIndex).Value / (QtdeLojas - 1))), MidpointRounding.AwayFromZero)
vlr = qt(qtx)
Else
qt(qtx) = CDec((dgvTransferencia.Rows(e.RowIndex).Cells(dgvTransferencia.Columns.Count - 1).Value - dgvTransferencia.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) - vlr) - qt(qtx - 1)
End If

Next

For col As Integer = 0 To dgvTransferencia.Columns.Count - 1
If col = 0 Or col = dgvTransferencia.Columns.Count - 1 Then
If col = dgvTransferencia.Columns.Count - 1 Then
dgvTransferencia.Rows(e.RowIndex).Cells(col).Value = dgvTransferencia.Rows(e.RowIndex).Cells(dgvTransferencia.Columns.Count - 1).Value
Else
Continue For
End If
ElseIf col <> e.ColumnIndex Then
dgvTransferencia.Rows(e.RowIndex).Cells(col).Value = dgvTransferencia.Rows(e.RowIndex).Cells(dgvTransferencia.Columns.Count - 1).Value - dgvTransferencia.Rows(e.RowIndex).Cells(e.ColumnIndex).Value
End If
Next
End If
Catch ex As Exception

End Try
End Sub


Estava já obtendo alguma coisa, talvez eu consiga pois agora ficou só a matemática mesmo....

NILSONTRES 15/09/2012 00:58:52
#409727
Então, o Calculo estava falhando mesmo, mas foi só para dar uma ideia, porque é bem complexa a forma que vc vai ter que bolar para acertar os calculos.

FOXMAN 15/09/2012 01:21:58
#409728
Bem, depois de uma longa briga aqui finalmente chegei no que exatamente eu queria.

Por enquanto para 3 empresas esta funcionando legal.

  If MultiLoja = True Then
Dim qt(QtdeLojas - 1) As String
Dim vlr As Integer
For qtx As Integer = 0 To QtdeLojas - 1
If qtx <> e.ColumnIndex Then
qt(qtx) = (12 - dgvTransferencia.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) - vlr
[ô]Math.Round(Math.Round(CDbl((dgvTransferencia.Rows(e.RowIndex).Cells(QtdeLojas + 1).Value - dgvTransferencia.Rows(e.RowIndex).Cells(e.ColumnIndex).Value))) / (dgvTransferencia.Columns.Count - 3))
vlr = qt(qtx)
Else
[ô]qt(qtx) = CDec((dgvTransferencia.Rows(e.RowIndex).Cells(dgvTransferencia.Columns.Count - 1).Value - dgvTransferencia.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) - vlr) - qt(qtx)
End If

Next
vlr = 0
For col As Integer = 0 To dgvTransferencia.Columns.Count - 1
If col = 0 Or col = dgvTransferencia.Columns.Count - 1 Then
If col = dgvTransferencia.Columns.Count - 1 Then
[ô] dgvTransferencia.Rows(e.RowIndex).Cells(col).Value = dgvTransferencia.Rows(e.RowIndex).Cells(dgvTransferencia.Columns.Count - 1).Value
Else
Continue For
End If
ElseIf col <> e.ColumnIndex Then
vlr = (Math.Round(dgvTransferencia.Rows(e.RowIndex).Cells(dgvTransferencia.Columns.Count - 1).Value - dgvTransferencia.Rows(e.RowIndex).Cells(e.ColumnIndex).Value)) - vlr
vlr = vlr - Math.Round((dgvTransferencia.Rows(e.RowIndex).Cells(dgvTransferencia.Columns.Count - 1).Value - dgvTransferencia.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) / 2)
If vlr = 0 Then
vlr = Math.Round((dgvTransferencia.Rows(e.RowIndex).Cells(dgvTransferencia.Columns.Count - 1).Value - dgvTransferencia.Rows(e.RowIndex).Cells(e.ColumnIndex).Value) / 2)
End If
dgvTransferencia.Rows(e.RowIndex).Cells(col).Value = vlr
End If
Next
End If


Nilson, agradeço pela tentativa flw....

A minha linha de raciocinio funcionou, queimei a kuka mas deu certo.



Tópico encerrado , respostas não são mais permitidas