COMO TRANSFORMAR ESSE CODIGO EM FUNCAO RECUSIVA?

FBUR 12/08/2009 14:01:56
#319676
Boa tarde!

Estou tentando melhorar meus algoritmos. Hoje fiz um que calcula o vencimento quando uma compra é parcelada.
Por exemplo:
Se você faz uma compra no dia 12/08/09, os vencimentos serão em:
12/09/09
12/10/09
12/11/09
e assim por diante até completar 10 parcelas.

Fiz o algoritmo para gerar somente datas válidas. Pois se a compra for no dia 31/08/09, não existe 31/09/09. O programa tem gerar o vencimento para 30/09/09 mas gerar 31/10/09 pois outubro tem 31 dias. E assim por diante, para todos os meses.

O algoritmo funciona bem, mas a pergunta é: Como melhorar este algoritmo para utilizar função recursiva??
To tentando fazer o algoritmo ficar mais limpo com uma função recursiva, mas não to saindo nem da função, quanto mais a recursão... :)

segue o algoritmo:

Private Sub Command2_Click()

[ô]o código está dentro de um commandbutton
[ô]existe uma ListBox para receber os resultados

[ô]OBJETIVO:
[ô]O sistema faz o parcelamento em meses de uma dívida. Supondo que seja um pagamento
[ô]em 10 vezes. Se a compra foi no dia 15/08/09, o parcelamento ficará assim:
[ô]10/09/2009
[ô]10/11/2009
[ô]10/12/2009
[ô]10/01/2010
[ô]10/02/2010
[ô]10/03/2010
[ô]e assim por diante, até completarem 10 parcelas.

[ô]O PROBLEMA - Resolvido desta forma.
[ô]Quando a compra é feita, por exemplo, no dia 31, existem meses que não tem dia 31,
[ô]como o caso de fevereiro ou setembro.
[ô]Logo, o sistema deve tratar essas exceções.

[ô]A solução é apresentada abaixo.
[ô]O resultado é mostrado em uma ListBox.


Dim data As Variant
Dim dia, diaTemp, mes, ano As Integer

[ô]a variável dia é fixa. Trata-se do dia da compra.
dia = 31
[ô]diaTemp é uma cópia da variável dia. O seu valor poderá mudar, por isso é
[ô]uma variável temporária.
diaTemp = dia
[ô]usando como exemplo o mês 8.
mes = 8
[ô]Usando como exemplo o ano de 2009.
ano = 2009

[ô]10 parcelas...
For cont = 0 To 10

[ô]Soma um no mês, pois se a compra foi feita no mes 8, o parcelamento começa
[ô]no mês 9.
mes = mes + 1

[ô]Se o mês for maior que 12...,
If mes > 12 Then

[ô]volta para janeiro
mes = 1
[ô]incrementa 1 no ano
ano = ano + 1
[ô]forma a data.
data = Format(diaTemp, [Ô]00[Ô]) & [Ô]/[Ô] & Format(mes, [Ô]00[Ô]) & [Ô]/[Ô] & ano

[ô]Se a data formada não for uma data válida, ex: 31/02/09...,
If Not IsDate(data) Then

[ô]Enquanto for uma data inválida, o loop não se encerra.
Do While Not IsDate(data)

[ô]O dia é decrementado: Ex: de 31/02/09 para 30/02/09 e assim
[ô]por diante até chegar a uma data válida.
diaTemp = diaTemp - 1
data = Format(diaTemp, [Ô]00[Ô]) & [Ô]/[Ô] & Format(mes, [Ô]00[Ô]) & [Ô]/[Ô] & ano

Loop

End If

Else

[ô]Se o mês não for maior que 12, forma uma data.
data = Format(diaTemp, [Ô]00[Ô]) & [Ô]/[Ô] & Format(mes, [Ô]00[Ô]) & [Ô]/[Ô] & ano

[ô]Mesmo conceito utilizado no While acima.
If Not IsDate(data) Then

Do While Not IsDate(data)

diaTemp = diaTemp - 1
data = Format(diaTemp, [Ô]00[Ô]) & [Ô]/[Ô] & Format(mes, [Ô]00[Ô]) & [Ô]/[Ô] & ano

Loop

End If

End If

[ô]Adiciona a data válida na listBox
List1.AddItem data

[ô]Se a variável diaTemp for maior 31 e se o loop detectou que precisava ser
[ô]decrementada, ela terá que voltar a ser o que era (31) para o caso de
[ô]existir algum mês com 31 dias.
diaTemp = dia

Next

End Sub



Enquanto isso to tentando...

[]'s
MAUMAU 12/08/2009 14:25:02
#319680
fiz uma função bem simples.... mas ela só adciona 30 dias... não fixa o dia, faz um teste e adpte conforme a necessidade...

coloque 2 text, um list e um botão:
TxtDtVenda, TxtQtdParcela, LstResultado, Command1



Private Sub Command1_Click()
Call CalcularDatas(DateAdd([Ô]D[Ô], 30, TxtDtVenda), TxtQtdParcela, LstResultado)

End Sub

Private Sub CalcularDatas(varDtVenda As String, varQtd As Integer, Lst As ListBox)
If varQtd = 0 Then Exit Sub
Call CalcularDatas(DateAdd([Ô]D[Ô], 30, varDtVenda), varQtd - 1, Lst)
Lst.AddItem varDtVenda

End Sub


Abraços
FBUR 12/08/2009 14:31:52
#319682
Então LVFIOROT, o que eu quero é que o programa calcule os venciemntos em todos os dias XX.

Se a compra for feita dia 10, os vencimentos serão todos os dias 10. Se a compra foi no dia 25, os vencimentos serão todos os dias 25. Se a compra foi no dia 31, os vencimentos serão no dia 31.

OBS: No algoritmo eu forcei o dia 31 para o [ô]pior caso[ô], q é justamente onde o algoritmo tem q tratar.

O problema era quando a compra era dia 31, e nem todos meses tem o dia 31, como fevereiro ou setembro. Nestes, as datas passam a ser 28 e 30 respectivamente.

MAUMAU, dessa forma eu já fiz. Não adianta somar 30 dias, os vencimentos tem que ser todos nos mesmos dias, exceto nos casos que expliquei acima.

[]'s
LCSD 12/08/2009 14:39:26
#319684
SUGESTAO bem mais simples e que me atende perfeitamente com o que eu preciso.

Se o dia é FIXO, PQ VC não soma 1 mês na sua data.
Logo em sequencia, VC verifica se a nova data é válida. Se não for, TIRE 1 dia desta data que ela ficará sendo válida.

Por exemplo:
Se o cara digitar 31/08/09, somando 1 mês, a data ficará 01/09/09, pois o VB mudará automaticamente (lógicamente, se o campo for do tipo DATE). Imediatamente, VC pega e subtrai 1 DIA desta data, então ele ficará como 30/09/09.
Faça testes prevendo tbem o mês de FEVEREIRO. Neste caso, SE EU NAO ME ENGANO, pra FEVEREIRO ele colocaria dia 03/03/10, e se tirar 1 dia não irá bater.....
MAUMAU 12/08/2009 14:52:37
#319688
Segue uma adptacao da primeira rotina....

Private Sub Command1_Click()
LstResultado.Clear
Call CalcularDatas(Left(TxtDtVenda, 2), ProximoMes(Left(TxtDtVenda, 2), TxtDtVenda), TxtQtdParcela, LstResultado)

End Sub

Private Sub CalcularDatas(vardia As String, varDtVenda As String, varQtd As Integer, Lst As ListBox)
If varQtd = 0 Then Exit Sub
Call CalcularDatas(vardia, ProximoMes(vardia, varDtVenda), varQtd - 1, Lst)
Lst.AddItem varDtVenda

End Sub

Function ProximoMes(vardia As String, VarDt As String) As String
Dim Diatmp As Integer
Dim Mestmp As Integer
Dim Anotmp As Integer
Diatmp = vardia
Mestmp = Right(Left(VarDt, 5), 2)
Anotmp = Right(VarDt, 4)

Mestmp = Mestmp + 1
If Mestmp = 13 Then Mestmp = 1: Anotmp = Anotmp + 1
ProximoMes = Format(Diatmp, [Ô]00[Ô]) & [Ô]/[Ô] & Format(Mestmp, [Ô]00[Ô]) & [Ô]/[Ô] & Format(Anotmp, [Ô]0000[Ô])

Do While Not IsDate(ProximoMes)
Diatmp = Diatmp - 1
ProximoMes = Format(Diatmp, [Ô]00[Ô]) & [Ô]/[Ô] & Format(Mestmp, [Ô]00[Ô]) & [Ô]/[Ô] & Format(Anotmp, [Ô]0000[Ô])
Loop

End Function
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas