ARREDONDAR VALOR NA ULTIMA PARCELA

 Tópico anterior Próximo tópico Novo tópico

ARREDONDAR VALOR NA ULTIMA PARCELA

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#468528 - 28/10/2016 18:30:13

JOHNSTEVE
COSMOPOLIS-SP
Cadast. em:Janeiro/2016


 Anexos estao visíveis somente para usuários registrados

tudo Joinha pessoal??

Bom, hj me deparei com um problema. qnd gero minhas parcelas q o valor sao quebrados. minha funao esta arredondando em cada parcela.

vejam no print como ficou..

essa e minha funao de gerar as parcelas.
  Private Sub GeraParcelas_Grid()
        If txtValor.Text <> [][] Then

            Dim Venc As DateTime
            Venc = FormatDateTime(mkbData.Text, DateFormat.ShortDate)
            Venc = Venc.AddDays(30)
            For i = 0 To Val(txtParcelas.Text) - 1

                Venc = Venc.AddDays(i * 30)

               dgvFormapagto.Rows.Add(i + 1, Format(CDbl(Me.txtTotal.Text), []###,##0.00[]) / Val(txtParcelas.Text), Mid(Venc.ToString, 1, 10), cbo_tipoNFe.Text)
              
            Next

        End If
    End Sub


Por favor, alguem pode me ajudar como fao para arredondar apenas na ultima parcela.
para que o valor das parcelas bate o valor total da venda.
pois nessa minha funao esta dando diferena..
as vezes da diferena de 0,1 centavo, 0,2 centavo..etc.. as diferena sao de centavos..
mais na da certo assim nao pode ficar assim com essa diferena.




#468536 - 28/10/2016 22:50:31

PLUGSOFTSM
SANTA MARIA
Cadast. em:Julho/2015


Pode fazer assim  

Private Sub GeraParcelas_Grid()
        If txtValor.Text <> [][] Then
            Dim Venc As DateTime
            Venc = FormatDateTime(mkbData.Text, DateFormat.ShortDate)
            Venc = Venc.AddDays(30)
           Dim Total as single = 0
           dim TotalPrcela as single = Cdbl( format(Format(CDbl(Me.txtTotal.Text), []###,##0.00[]) / Val(txtParcelas.Text), Val(txtParcelas.Text),  []###,##0.00[]) )
            For i = 0 To Val(txtParcelas.Text) - 1

                Venc = Venc.AddDays(i * 30)
                []Verifico se a ltima parcela
                If I = val(TxtParcelas.text)- 1 then
                    TotalParcela = CDbl(Me.txtTotal.Text) - Total
                else
                    []Acumulo o valor das parcelas
                    Total+= TotalParcela
                endif

               dgvFormapagto.Rows.Add(i + 1, Format(TotalParcela, []###,##0.00[]) , Mid(Venc.ToString, 1, 10), cbo_tipoNFe.Text)
              
            Next

        End If
    End Sub



#468540 - 28/10/2016 23:15:42

JOHNSTEVE
COSMOPOLIS-SP
Cadast. em:Janeiro/2016


Citação:
:
Pode fazer assim  

Private Sub GeraParcelas_Grid()
        If txtValor.Text <> [][] Then
            Dim Venc As DateTime
            Venc = FormatDateTime(mkbData.Text, DateFormat.ShortDate)
            Venc = Venc.AddDays(30)
           Dim Total as single = 0
           dim TotalPrcela as single = Cdbl( format(Format(CDbl(Me.txtTotal.Text), []###,##0.00[]) / Val(txtParcelas.Text), Val(txtParcelas.Text),  []###,##0.00[]) )
            For i = 0 To Val(txtParcelas.Text) - 1

                Venc = Venc.AddDays(i * 30)
                []Verifico se a ltima parcela
                If I = val(TxtParcelas.text)- 1 then
                    TotalParcela = CDbl(Me.txtTotal.Text) - Total
                else
                    []Acumulo o valor das parcelas
                    Total+= TotalParcela
                endif

               dgvFormapagto.Rows.Add(i + 1, Format(TotalParcela, []###,##0.00[]) , Mid(Venc.ToString, 1, 10), cbo_tipoNFe.Text)
              
            Next

        End If
    End Sub



PLUGSOFTSM, nao deu certo.. ele ta fazendo assim
valor total:   80,00
ai se eu divido em 5
ta ficando assim
0,00
0,00
0,00
0,00
80,00




#468541 - 28/10/2016 23:17:11

JOHNSTEVE
COSMOPOLIS-SP
Cadast. em:Janeiro/2016


Nilson ????

como seria usando o operador Mod ?






Resposta escolhida #468542 - 28/10/2016 23:28:46

NILSONTRES
SAO PAULO
Cadast. em:Março/2012


Última edição em 28/10/2016 23:31:40 por NILSONTRES

Eu tinha te passado o Mod, mas a sobra pode ser muito grande, fui ver como eu fao, nem me lembrava.
Fao isso, identifico se existe diferena entre as parcelas e o valor total, havendo diferena, qual o valor da diferena ?. no seu caso ai 0,1 centavo.
Se for a menor acrescento na ultima parcela, se for a maior desconto a ultima parcela.
8,67
8,67
8,66




#468543 - 28/10/2016 23:32:27

JOHNSTEVE
COSMOPOLIS-SP
Cadast. em:Janeiro/2016


Citação:
:
Eu tinha te passado o Mod, mas a sobra pode ser muito grande, fui ver como eu fao, nem me lembrava.
Fao isso, identifico se existe diferena entre as parcelas e o valor total, havendo diferena, qual o valor da diferena ?. no seu caso ai 0,1 centavo.
Se for a menor acrescento na ultima parcela, se for a maior desconto a ultima parcela.


showw :)
ai nilson vc tem a funao para acrescentar na ultima parcela ou descontar ?



#468544 - 29/10/2016 00:25:30

NILSONTRES
SAO PAULO
Cadast. em:Março/2012


No sei se vai te ajudar, tem muitas particularidades.
Private Function DUPLICATAS(ByVal V_AT_VENDA As String) As Boolean
        Try
            Me.GRID_DPL.Rows.Clear()
            Dim V_SOMA As Double = []0,00[]
            Dim V_SOMAFINAL As Double = []0,00[]
            []**CARREGA AS PARCELAS DA TABELA
            If SQL_NAG.SEL([]Select *FROM nfe_dpls WHERE AT_VENDA=[] & V_AT_VENDA & [] ORDER BY ITEN[], False) = True Then
                While SQL_NAG.MY_RE.Read
                    With GRID_DPL
                        .Rows.Add()
                        .Rows(.Rows.Count - 1).Cells(GDPL_ITEM.Name).Value = SQL_NAG.MY_RE.Item([]ITEN[]).ToString
                        .Rows(.Rows.Count - 1).Cells(GDPL_NUM.Name).Value = SQL_NAG.MY_RE.Item([]NUMERO[]).ToString
                        .Rows(.Rows.Count - 1).Cells(GDPL_VENC.Name).Value = Format(CType(SQL_NAG.MY_RE.Item([]DATAVC[]).ToString, Date), []dd/MM/yyyy[])
                        .Rows(.Rows.Count - 1).Cells(GDPL_VALOR.Name).Value = FormatNumber(SQL_NAG.MY_RE.Item([]VALORDPL[]).ToString, 2)
                    End With
                    V_SOMA = V_SOMA + SQL_NAG.MY_RE.Item([]VALORDPL[]).ToString
                End While
                SQL_NAG.FECHA_SEL()

                []**VERIFICA SE TOTAL DAS DPLS DIFERENTE DO TOTAL DA NOTA, PODE SER QUE ENTROU FRETE OU OUTROS.
                If FormatNumber(V_SOMA, 2) <> TXT_TOTNFE.Text Then []DIFERENTE, RECALCULA OS VALORES
                    Dim Recalcula As Double = 0
                    Dim DividiValores As Double = FormatNumber(TXT_TOTNFE.Text / GRID_DPL.Rows.Count, 2) []DIVIDE O TOTAL PELA QUANTIDADE DE PARCELAS
                    Dim ii As Integer
                    For ii = 0 To GRID_DPL.Rows.Count - 1
                        With GRID_DPL
                            .Rows(ii).Cells(GDPL_VALOR.Name).Value = FormatNumber(DividiValores, 2)
                            Recalcula = Recalcula + .Rows(ii).Cells(GDPL_VALOR.Name).Value
                        End With
                    Next

                    []**RECALCULA CASO HAJA RESTO NA DIVISO DAS PARCELAS, JOGA O RESTO PARA A ULTIMA PARCELA, UTILIZANDO O OPERADOR MOD.
                    If FormatNumber(Recalcula, 2) <> TXT_TOTNFE.Text Then

                        Dim i As Integer
                        Dim Divisao As Double = FormatNumber(CLng(TXT_TOTNFE.Text / GRID_DPL.Rows.Count), 2)
                        Dim vmod As Double = FormatNumber(TXT_TOTNFE.Text Mod GRID_DPL.Rows.Count, 2)
                        For i = 0 To GRID_DPL.Rows.Count - 1
                            With GRID_DPL
                                .Rows(i).Cells(GDPL_VALOR.Name).Value = FormatNumber(Divisao, 2)
                                If i = GRID_DPL.Rows.Count - 1 Then
                                    .Rows(i).Cells(GDPL_VALOR.Name).Value = FormatNumber(Divisao + vmod, 2)
                                End If
                                V_SOMAFINAL = V_SOMAFINAL + .Rows(i).Cells(GDPL_VALOR.Name).Value
                            End With
                        Next
                        Me.LBL_SOMA_DPL.Text = FormatNumber(V_SOMAFINAL, 2)
                    End If
                End If

                Me.GRID_DPL.Rows.Add([][], [][], []     R$ TOTAL:[], FormatNumber(V_SOMA, 2))
                Dim V_RODAPE As New Classe_Teste
                V_RODAPE.RODAPE(GRID_DPL, GRID_DPL.Rows.Count - 1, 0)
                Me.LBL_SOMA_DPL.Text = FormatNumber(V_SOMA, 2)
                [] GRID_DPL.Rows.Add()

            End If
            Return True
        Catch
            MsgBox(Err.Description & vbCrLf & Err.GetException.StackTrace, MsgBoxStyle.Critical, []DUPLICATAS[])
            Return False
        End Try
    End Function



#468559 - 29/10/2016 15:38:58

JOHNSTEVE
COSMOPOLIS-SP
Cadast. em:Janeiro/2016


Nilson,  achei a diferena agora s falta obter essa diferena na ultima parcela ou na primeira..
como fao para somar essa diferena na ultima parcela ou na primeira.. ja rodei na net. e nao achei nada relacionado a obter  a diferenca na primeira ou na ultima parcela..

veja

  Private Sub Encontrar_Diferenca()
        Dim soma As Double
        For i As Integer = 0 To dgvFormapagto.Rows.Count - 1

            soma += dgvFormapagto.Rows(i).Cells(1).Value.ToString()
        Next

        Dim diferenca As Double = 0
        Dim somar1 As Double
        somar1 = Format(CDbl(soma))
        If somar1 > txtTotal.Text Then
            diferenca = somar1 - txtTotal.Text
            somar1 = False
        Else
            diferenca = txtTotal.Text - Format(CDbl(somar1))
        End If

        If diferenca > 0 Then
            Dim AddDiferenca As Decimal
            []Round((CDbl(txtTotalProdutos.Text) * AliquotaInter) / 100, 2)
            AddDiferenca = Round((CDbl(diferenca)), 2)

            MsgBox([] A diferena e essa -> [] & AddDiferenca)

        End If
    End Sub


nesse exemplo ai. foi utilizadoo   valor total : 64,00   dividido por  3  
no datagrid ficou assim inserido.
   6 x 10,67 =  64,02  

eita porra tem algo errado... no caso ta arredondando todas as parcelas... e por isso deu um aumento de 0,02.
no caso ultrapassou o valor total da venda .  q foi  64,00




#468579 - 30/10/2016 09:39:26

PLUGSOFTSM
SANTA MARIA
Cadast. em:Julho/2015


Última edição em 30/10/2016 09:49:49 por PLUGSOFTSM

Refiz a rotina
Essa aqui t testada e certinha

    Private Sub GeraParcelas_Grid()
        If TxtTotal.Text <> [][] Then
            Dim Venc As DateTime
            Venc = FormatDateTime(mkbData.Text, DateFormat.ShortDate)
            Venc = Venc.AddDays(30)
            Dim Total As Single = 0
            Dim TotalParcela As Single = Math.Round(CDbl(TxtTotal.Text) / Val(TxtParcelas.Text), 2)
            For i = 0 To Val(txtParcelas.Text) - 1
                Venc = Venc.AddDays(i * 30)
                []Verifico se a ltima parcela
                If I = val(TxtParcelas.text) - 1 Then
                    TotalParcela = CDbl(Me.txtTotal.Text) - Total
                Else
                    []Acumulo o valor das parcelas
                    Total += TotalParcela
                End If
                dgvFormapagto.Rows.Add(i + 1, Format(TotalParcela, []###,##0.00[]), Mid(Venc.ToString, 1, 10), cbo_tipoNFe.Text)
            Next

        End If
    End Sub

Essa funo acima vai recalcular as parcelas de modos que o centavo para mais ou para menos seja compensado na ltima parcela
Mas vc deve tomar o cuidado com os centavos. Imagine a seguinte situao:
Duas parcelas de 33,33 e uma de 33,34 (Duvido de seu cliente no queira fazer 3 parcelas de 33,00 e outra de 34,00)
Se for isso a sim vc poderia usar o operador mod

Uma soluo seria assim
   Totalparcela = Total\Parcelas
   Resto = Total Mod Parcelas

A ltima parcela ficaria TotalParcela + Resto

Essa seria apenas umas de muitas solues




#468586 - 30/10/2016 18:33:34

JOHNSTEVE
COSMOPOLIS-SP
Cadast. em:Janeiro/2016


Citação:
:
Refiz a rotina
Essa aqui t testada e certinha

    Private Sub GeraParcelas_Grid()
        If TxtTotal.Text <> [][] Then
            Dim Venc As DateTime
            Venc = FormatDateTime(mkbData.Text, DateFormat.ShortDate)
            Venc = Venc.AddDays(30)
            Dim Total As Single = 0
            Dim TotalParcela As Single = Math.Round(CDbl(TxtTotal.Text) / Val(TxtParcelas.Text), 2)
            For i = 0 To Val(txtParcelas.Text) - 1
                Venc = Venc.AddDays(i * 30)
                []Verifico se a ltima parcela
                If I = val(TxtParcelas.text) - 1 Then
                    TotalParcela = CDbl(Me.txtTotal.Text) - Total
                Else
                    []Acumulo o valor das parcelas
                    Total += TotalParcela
                End If
                dgvFormapagto.Rows.Add(i + 1, Format(TotalParcela, []###,##0.00[]), Mid(Venc.ToString, 1, 10), cbo_tipoNFe.Text)
            Next

        End If
    End Sub

Essa funo acima vai recalcular as parcelas de modos que o centavo para mais ou para menos seja compensado na ltima parcela
Mas vc deve tomar o cuidado com os centavos. Imagine a seguinte situao:
Duas parcelas de 33,33 e uma de 33,34 (Duvido de seu cliente no queira fazer 3 parcelas de 33,00 e outra de 34,00)
Se for isso a sim vc poderia usar o operador mod

Uma soluo seria assim
   Totalparcela = TotalParcelas
   Resto = Total Mod Parcelas

A ltima parcela ficaria TotalParcela + Resto

Essa seria apenas umas de muitas solues



PLUGSOFTSM, deu certo, agora so tive um problema com a data.
veja no print abaixo. do mes 02 pulou para 05
nao faz sentido.. kkkkk



#468587 - 30/10/2016 18:35:26

JOHNSTEVE
COSMOPOLIS-SP
Cadast. em:Janeiro/2016


 Anexos estao visíveis somente para usuários registrados

aqui o print...
Ficou foi doido kkkkkkkkkk.... gerou ate 2018  ta com a porrra. kkkkkkkkkkkkkkk





 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por JOHNSTEVE em 12/12/2016 21:04:50