CALCULO DE IMPOSTO NO FLEXGRID

USUARIO.EXCLUIDOS 08/04/2004 17:19:43
#19525
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!!!

USUARIO.EXCLUIDOS 08/04/2004 17:28:36
#19527
Resposta escolhida
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.
USUARIO.EXCLUIDOS 08/04/2004 19:34:32
#19539
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
USUARIO.EXCLUIDOS 10/04/2004 02:12:53
#19730
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.
Tópico encerrado , respostas não são mais permitidas