CALCULO DE IMPOSTO NO FLEXGRID
Boas !
Caros colegas estou com um probleminha que talvez seja fácil de resolver, mas não estou conseguindo vêr como.
é o seguinte :
Estou criando uma aplicação para tirar notas fiscais. Nos detalhes do form das notas fiscais estou utilizando o flexgrid com uma textbox que vai puxar os produtos e valores , depois de atualizar a linha calcula o valor do imposto numa textbox e o total em outra. Até aà tudo bem, o problema quando eu vou alterar o valor de qualquer linha , seja quantidade ou preço, a textbox do total do imposto fica com o valor antigo e soma o novo valor.
Será que ninguém tem uma dica ou um exemplo pra me ajudar ?
Tenho uma certa urgencia nisso. Só falta mesmo terminar isso.
Obrigado pela vossa atenção.
Valeu!!!
Caros colegas estou com um probleminha que talvez seja fácil de resolver, mas não estou conseguindo vêr como.
é o seguinte :
Estou criando uma aplicação para tirar notas fiscais. Nos detalhes do form das notas fiscais estou utilizando o flexgrid com uma textbox que vai puxar os produtos e valores , depois de atualizar a linha calcula o valor do imposto numa textbox e o total em outra. Até aà tudo bem, o problema quando eu vou alterar o valor de qualquer linha , seja quantidade ou preço, a textbox do total do imposto fica com o valor antigo e soma o novo valor.
Será que ninguém tem uma dica ou um exemplo pra me ajudar ?
Tenho uma certa urgencia nisso. Só falta mesmo terminar isso.
Obrigado pela vossa atenção.
Valeu!!!
Poste o código em questão. Se você está fazendo os cálculos diretamente dos valores das células do FlexGrid no textbox, não há motivo de ele assimilar os novos valores, somando aos antigos, senão por alguma pequena falha de codificação.
Veja, em seu código, você mantém o valor e soma o IVA da grade. O que acontece é exatamente o que você programou. Veja a linha:
...
TIVA = TIVA + TotImpos.Text + (Qty * Rate * IVA / 100) * (1 - Descon / 100)
...
O que você deve fazer, não é somar DURANTE a entrada dos dados, mas sim chamar uma sub que faça a soma, em separado e apenas gravando o total na TotImpos, sem ler ou usar o que há nesse textbox.
O código que você enviou não é o código completo do evento, você "comeu" o primeiro Select Case. Mas eu faria algumas mudanças, á princÃpio, sem grandes transformações, assim:
Private Sub Text2_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
With Text2
If Not .Text = Empty Then
Grid.Text = .Text
End If
.Visible = False
.Text = Empty
End With
Grid.Col = IIf(Grid.Col 4, Grid.Col + 1, 0)
Select Case Grid.Col
Case 0: LocArtigo
Case 4
If Grid.Text = "" Then
Grid.SetFocus
Else
Grid.TextMatrix(Grid.Row, 2) = Format(Grid.TextMatrix(Grid.Row, 2), "###,##0.##0")
Qty = Format(Grid.TextMatrix(Grid.Row, 2), "###,##0.##0")
Grid.TextMatrix(Grid.Row, 3) = Format(Grid.TextMatrix(Grid.Row, 3), "###,###,##0.##0")
Rate = Format(Grid.TextMatrix(Grid.Row, 3), "###,##0.##0")
Grid.TextMatrix(Grid.Row, 4) = Format(Grid.TextMatrix(Grid.Row, 4), "###,###,##0.#0")
Descon = Format(Grid.TextMatrix(Grid.Row, 4), "###,##0.#0")
Grid.TextMatrix(Grid.Row, 5) = Val(Grid.TextMatrix(Grid.Row, 5))
IVA = Val(Grid.TextMatrix(Grid.Row, 5))
TIVA = CalculaTotais
'
'TIVA = 0
'TIVA = TIVA + TotImpos.Text + (Qty * Rate * IVA / 100) * (1 - Descon / 100)
'TotImpos.Text = Format(TIVA, "###,###,##0.##0")
Descon = (Qty * Rate) * Descon / 100
DescLinha = Format(Descon, "###,###,##0.##0")
' IVA = IVA + (LDoc(2, I%) * LDoc(3, I%) * LDoc(5, I%) / 100) * (1 - ((LDoc(4, I%) / 100))) * (1 - ((DescGlobal / 100)))
'DescontoL = DescontoL + (LDoc(2, I%) * LDoc(3, I%)) * ((LDoc(4, I%) / 100))
Total = Qty * Rate: Grid.Col = 6: Grid.Text = Format(Total, "###,###,##0.##0")
DoTotals
If Not Grid.Row = Grid.Rows - 1 Then
If Not Grid.Text = Empty And CDbl(Grid.Text) 0 Then
Grid.Row = Grid.Row + 1
End If
Grid.Col = 0
Else
If Not Grid.Text = Empty And CDbl(Grid.Text) 0 Then
Grid.Rows = Grid.Rows + 1
Grid.Row = Grid.Row + 1
Fancy
End If
Grid.Col = 0
End If
End If
End Select
End If
End Sub
...
Private Sub CalculaTotais()
Dim nORow As Long
Dim nOCol As Long
Dim nRet As Double
Dim t As Long
nORow = Grid.Row
nOCol = Grid.Col
TotImpos.Text = Empty
Grid.Row = 0
For t = 0 To Grid.Rows
Grid.Row = Grid.Row + 1
nRet = nRet + ((Grid.TextMatrix(Grid.Row, 2) * Grid.TextMatrix(Grid.Row, 3) * Val(Grid.TextMatrix(Grid.Row, 5))) / 100) * ((1 - Grid.TextMatrix(Grid.Row, 4)) / 100)
Next t
TotImpos.Text = FormatNumber(nRet, 2, vbTrue, vbUseDefault)
Grid.Row = nORow
Grid.Col = nOCol
t = Empty
nRet = Empty
End Sub
...
TIVA = TIVA + TotImpos.Text + (Qty * Rate * IVA / 100) * (1 - Descon / 100)
...
O que você deve fazer, não é somar DURANTE a entrada dos dados, mas sim chamar uma sub que faça a soma, em separado e apenas gravando o total na TotImpos, sem ler ou usar o que há nesse textbox.
O código que você enviou não é o código completo do evento, você "comeu" o primeiro Select Case. Mas eu faria algumas mudanças, á princÃpio, sem grandes transformações, assim:
Private Sub Text2_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
With Text2
If Not .Text = Empty Then
Grid.Text = .Text
End If
.Visible = False
.Text = Empty
End With
Grid.Col = IIf(Grid.Col 4, Grid.Col + 1, 0)
Select Case Grid.Col
Case 0: LocArtigo
Case 4
If Grid.Text = "" Then
Grid.SetFocus
Else
Grid.TextMatrix(Grid.Row, 2) = Format(Grid.TextMatrix(Grid.Row, 2), "###,##0.##0")
Qty = Format(Grid.TextMatrix(Grid.Row, 2), "###,##0.##0")
Grid.TextMatrix(Grid.Row, 3) = Format(Grid.TextMatrix(Grid.Row, 3), "###,###,##0.##0")
Rate = Format(Grid.TextMatrix(Grid.Row, 3), "###,##0.##0")
Grid.TextMatrix(Grid.Row, 4) = Format(Grid.TextMatrix(Grid.Row, 4), "###,###,##0.#0")
Descon = Format(Grid.TextMatrix(Grid.Row, 4), "###,##0.#0")
Grid.TextMatrix(Grid.Row, 5) = Val(Grid.TextMatrix(Grid.Row, 5))
IVA = Val(Grid.TextMatrix(Grid.Row, 5))
TIVA = CalculaTotais
'
'TIVA = 0
'TIVA = TIVA + TotImpos.Text + (Qty * Rate * IVA / 100) * (1 - Descon / 100)
'TotImpos.Text = Format(TIVA, "###,###,##0.##0")
Descon = (Qty * Rate) * Descon / 100
DescLinha = Format(Descon, "###,###,##0.##0")
' IVA = IVA + (LDoc(2, I%) * LDoc(3, I%) * LDoc(5, I%) / 100) * (1 - ((LDoc(4, I%) / 100))) * (1 - ((DescGlobal / 100)))
'DescontoL = DescontoL + (LDoc(2, I%) * LDoc(3, I%)) * ((LDoc(4, I%) / 100))
Total = Qty * Rate: Grid.Col = 6: Grid.Text = Format(Total, "###,###,##0.##0")
DoTotals
If Not Grid.Row = Grid.Rows - 1 Then
If Not Grid.Text = Empty And CDbl(Grid.Text) 0 Then
Grid.Row = Grid.Row + 1
End If
Grid.Col = 0
Else
If Not Grid.Text = Empty And CDbl(Grid.Text) 0 Then
Grid.Rows = Grid.Rows + 1
Grid.Row = Grid.Row + 1
Fancy
End If
Grid.Col = 0
End If
End If
End Select
End If
End Sub
...
Private Sub CalculaTotais()
Dim nORow As Long
Dim nOCol As Long
Dim nRet As Double
Dim t As Long
nORow = Grid.Row
nOCol = Grid.Col
TotImpos.Text = Empty
Grid.Row = 0
For t = 0 To Grid.Rows
Grid.Row = Grid.Row + 1
nRet = nRet + ((Grid.TextMatrix(Grid.Row, 2) * Grid.TextMatrix(Grid.Row, 3) * Val(Grid.TextMatrix(Grid.Row, 5))) / 100) * ((1 - Grid.TextMatrix(Grid.Row, 4)) / 100)
Next t
TotImpos.Text = FormatNumber(nRet, 2, vbTrue, vbUseDefault)
Grid.Row = nORow
Grid.Col = nOCol
t = Empty
nRet = Empty
End Sub
Porque a row não foi movimentada. Ela acaba sendo a mesma, comando o valor novamente. Isso deve estar ocorrendo porque não há mais rows. Neste caso, o correto seria avaliar se grid.Rows for igual á grid.row, então não cumpra o processamento, caso contrário, grid.row = grid.row + 1 e processe.
Desculpe a falha.
Desculpe a falha.
Tópico encerrado , respostas não são mais permitidas