ERRO DE DATA EM GERACAO DE PARCELAS - 30/02/2012

WEBIER 22/11/2011 11:02:21
#389698
pessoal, estou fazendo um sistema de parcelas... onde defino inicio e quantidade de parcelas e o sistema gera 1 registro para cada mês... sendo sequencial a data de inicio...

Private Sub Gerar_Parcelas()
Dim var_Mes As Integer
Dim var_Ano As Integer
Dim var_Dia As Integer
Dim DIA As Integer
Dim DATA As String
Dim i As Integer
[ô]Dim x As Integer
Dim PARCELA As Currency
Dim SQL As String
Dim n_PARC As Integer

If n_PARC = 0 Then n_PARC = 1

Call Abrir_BancodeDados
SQL = [Ô]SELECT * FROM PARCELAS[Ô]
Set RS = BD.OpenRecordset(SQL)

var_Mes = Format(txtInicio, [Ô]mm[Ô])
var_Ano = Format(txtInicio, [Ô]yy[Ô])

For i = 1 To Val(txtQuant.Text)

Autonumeracao_Parcelas

If var_Mes > 12 Then
var_Mes = 1
var_Ano = var_Ano + 1
End If

var_Dia = Int(cboDiaPgto)

DIA = var_Dia
DATA = DIA & [Ô]/[Ô] & Format(var_Mes, [Ô]00[Ô]) & [Ô]/[Ô] & Format(var_Ano, [Ô]00[Ô])

RS.AddNew
RS!CODIGO = x
RS!COD_MATRICULA = CLng(lblCodMatricula.Caption)
RS!COD_CLIENTE = CLng(txtCodCliente.Text)
RS!Numero = n_PARC
RS!VENCIMENTO = Format(CDate(DATA), [Ô]dd/mm/yy[Ô])
RS!Valor = CCur(txtParc.Text)
RS.Update
var_Mes = var_Mes + 1
n_PARC = n_PARC + 1
Next
End Sub


Public Function Verifica_Dia(DIA, var_Mes)
Dim diasDoMes As Variant
DIA = Val(DIA)
diasDoMes = Array(31, 28, 30, 30, 31, 30, 31, 30, 30, 31, 30, 31)
If DIA = 31 Then
Verifica_Dia = diasDoMes(var_Mes - 1)
Else
Verifica_Dia = DIA
End If
End Function


meu problema está quando defino inicio dia 30/01/2012 e mando gerar 3 parcelas... ele gera a do mês de fevereiro errado:
30/01/2012
[txt-color=#e80000]12/02/1930[/txt-color]
30/03/2012


como corrijo isso?
LROSSI 22/11/2011 11:14:45
#389700
tenta
  var_Mes = Format(txtInicio, [Ô]MM[Ô]) 
WEBIER 22/11/2011 11:46:45
#389704
CONTINUA O ERRO!
DANILOGONC 22/11/2011 12:15:34
#389707
Webier não entendi muito o que vc quer mais se vc estiver querendo pegar o ano e o mês corrento do sistema usa isso aqui ô.

dim mes as integer
dim ano as interger
mes = Month(Now)
year = Year(Now)

ele vai retornar um inteiro o mes e o ano por ex:
hoje retornaria isso mes = 11 e ano = 2011
WEBIER 22/11/2011 13:13:22
#389713
Mas o mês e o ano não é baseado no [Ô]HOJE[Ô] e sim numa data pré-escrita no objeto txtinicio

var_Mes = Format(txtInicio, [Ô]mm[Ô])
var_Ano = Format(txtInicio, [Ô]yy[Ô])
ROBIU 22/11/2011 13:14:39
#389714
Resposta escolhida
dá para [Ô]enxugar[Ô] esse código:

Para gerar parcelas com 30,60,90... neste caso não vai cair no mesmo dia
Private Sub Gerar_Parcelas()
For i = 1 To Val(Text2.Text)
List1.AddItem DateSerial(Year(Text1.Text), Month(Text1.Text), Day(Text1.Text) + (30 * i))
List1.Text = Format(List1.Text, [Ô]dd/mm/yyyy[Ô])
Next
End Sub


outra opção:

For i = 1 To Val(Text2.Text)
List1.AddItem DateSerial(Year(Text1.Text), Month(Text1.Text) + i, Day(Text1.Text))
List1.Text = Format(List1.Text, [Ô]dd/mm/yyyy[Ô])

Next
WEBIER 22/11/2011 13:38:18
#389718
no seu exemplo nao deu certo o padrao de datas q quero:

exemplo:

30/01/2012
28/02/2012
30/03/2012
30/04/2012
ROBIU 22/11/2011 18:45:51
#389764
O correto seria 29/02/2012 (2012 é bissexto)

Private Sub Command2_Click()
If IsDate(Text1.Text) Then
List1.Clear
Dim MyData As Date, Mes As Integer
For i = 1 To Val(Text2.Text)
MyData = DateSerial(Year(Text1.Text), Month(Text1.Text) + i, Day(Text1.Text))
Mes = IIf((Month(Text1.Text) + i) > 12, (Month(Text1.Text) + i) - 12, (Month(Text1.Text) + i))
If Month(MyData) = Mes Then
List1.AddItem Format(MyData, [Ô]dd/mm/YYYY[Ô])
Else
List1.AddItem DateSerial(Year(MyData), Month(MyData), 0)

End If
Next
Else
MsgBox [Ô]Data inválida![Ô]
Text1.SetFocus
End If
End Sub
JESUEL.OLIVEIRA 22/11/2011 21:39:35
#389772
Amigo, esta rotina verificar se o ano é bissexto

Você pode colocar para data somar + um dia.
   
Function IsLeapYear(ByVal SomeValue As Variant) As Boolean
On Error GoTo LocalError
Dim intYear As Integer
[ô]The trick here is make sure that we get an integer
[ô]The 3 Golden rules are:
[ô]True if it is divisible by 4
[ô]False if it is divisible by 100
[ô]TRUE if it is divisble by 400
If IsDate(SomeValue) Then
intYear = CInt(Year(SomeValue))
Else
[ô]try and get an integer from the parse
[ô]does not matter if we get an error
[ô]because the error trap will catch it
intYear = CInt(SomeValue)
End If
If TypeName(intYear) = [Ô]Integer[Ô] Then
IsLeapYear = ((intYear Mod 4 = 0) And _
(intYear Mod 100 <> 0) Or (intYear Mod 400 = 0))
End If
Exit Function
LocalError:
IsLeapYear = False
End Function
PAULOOLIVEIRA 22/11/2011 21:42:17
#389774
Companheiro,

tente assim..

Function SomaMeses(dIni As Date, nQtd As Integer)
Dim nAnoMes As Double, nI As Integer, nDia As Integer
nAnoMes = Val(Format(dIni, [Ô]yyyymm[Ô]))
For nI = 1 To nQtd
nAnoMes = nAnoMes + IIf(Mid(Format(nAnoMes, [Ô]000000[Ô]), 5, 2) = [Ô]12[Ô], 89, 1)
Next
[ô]Previsão 30/31/28 (dim de mes)
nDia = Day(dIni)
While Not IsDate(Format(nDia, [Ô]00[Ô]) & [Ô]/[Ô] & Mid(nAnoMes, 5, 2) & [Ô]/[Ô] & Mid(nAnoMes, 1, 4))
nDia = nDia - 1
Wend
SomaMeses = CDate(Format(nDia, [Ô]00[Ô]) & [Ô]/[Ô] & Mid(nAnoMes, 5, 2) & [Ô]/[Ô] & Mid(nAnoMes, 1, 4))
End Function

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