VERIFICANDO MESES
Eu tenho que gerar uma data a partir da ultima data, ex:
01/08/2014 proxima 01/09/2014
só que exite meses com 30, 31 e 28 dias. Com meses de 30 dias meu insert funciona, agora, como verificar se a data tem 30, 31 ou 28 dias e fazer a soma corretamente? Tem alguma função para isso? Meu codigo abaixo:
Private Sub GeraProximo()
Dim mSql As String
Dim ID As String
ID = CStr(Val(Me.Controls([Ô]Grid_[Ô] + CStr(Qt) + [Ô]15[Ô])))
mSql = [Ô] INSERT INTO TbData(Vencimento, Pagamento, Valor,Status,id)[Ô]
mSql = mSql + [Ô] SELECT[Ô]
mSql = mSql + [Ô] DateAdd([ô]m[ô],1,TbData.Vencimento) ,[Ô]
mSql = mSql + [Ô] Null ,[Ô]
mSql = mSql + [Ô] TbData.Valor ,[Ô]
mSql = mSql + [Ô] TbData.Status ,[Ô]
mSql = mSql + [Ô] TbData.id [Ô]
mSql = mSql + [Ô] FROM[Ô]
mSql = mSql + [Ô] TbData[Ô]
mSql = mSql + [Ô] WHERE[Ô]
mSql = mSql + [Ô] tbData.Codigo = (SELECT MAX(CODIGO) FROM tbdata WHERE TbData.Codigo = [Ô] + ID + [Ô] AND TbData.Vencimento = (SELECT MAX(TbData.Vencimento) FROM Tbdata WHERE TbData.Codigo = [Ô] + ID + [Ô]))[Ô]
Conexao.BeginTrans
Conexao.Execute (mSql)
Conexao.CommitTrans
End Sub
01/08/2014 proxima 01/09/2014
só que exite meses com 30, 31 e 28 dias. Com meses de 30 dias meu insert funciona, agora, como verificar se a data tem 30, 31 ou 28 dias e fazer a soma corretamente? Tem alguma função para isso? Meu codigo abaixo:
Private Sub GeraProximo()
Dim mSql As String
Dim ID As String
ID = CStr(Val(Me.Controls([Ô]Grid_[Ô] + CStr(Qt) + [Ô]15[Ô])))
mSql = [Ô] INSERT INTO TbData(Vencimento, Pagamento, Valor,Status,id)[Ô]
mSql = mSql + [Ô] SELECT[Ô]
mSql = mSql + [Ô] DateAdd([ô]m[ô],1,TbData.Vencimento) ,[Ô]
mSql = mSql + [Ô] Null ,[Ô]
mSql = mSql + [Ô] TbData.Valor ,[Ô]
mSql = mSql + [Ô] TbData.Status ,[Ô]
mSql = mSql + [Ô] TbData.id [Ô]
mSql = mSql + [Ô] FROM[Ô]
mSql = mSql + [Ô] TbData[Ô]
mSql = mSql + [Ô] WHERE[Ô]
mSql = mSql + [Ô] tbData.Codigo = (SELECT MAX(CODIGO) FROM tbdata WHERE TbData.Codigo = [Ô] + ID + [Ô] AND TbData.Vencimento = (SELECT MAX(TbData.Vencimento) FROM Tbdata WHERE TbData.Codigo = [Ô] + ID + [Ô]))[Ô]
Conexao.BeginTrans
Conexao.Execute (mSql)
Conexao.CommitTrans
End Sub
Amigo, seria interessante vc informar o Banco de Dados utilizado. Mas ve se ajuda.
PARA SQL SERVER
Ultimo dia do mes anterior.
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
Ultimo dia do Mes Atual
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
Ultimo dia do Próxmio Mes
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0))
Resultado:
Ultimo dia do Mes Passado : 2014-10-31 23:59:59.000
Ultimo dia do Mes Atual : 2014-11-30 23:59:59.000
Ultimo dia do Próximo mes : 2014-12-31 23:59:59.000
Para saber o ultimo dia de qualquer mes utilize :
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,[Ô]10/03/2014[Ô])+1,0))
T+
PARA SQL SERVER
Ultimo dia do mes anterior.
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
Ultimo dia do Mes Atual
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
Ultimo dia do Próxmio Mes
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0))
Resultado:
Ultimo dia do Mes Passado : 2014-10-31 23:59:59.000
Ultimo dia do Mes Atual : 2014-11-30 23:59:59.000
Ultimo dia do Próximo mes : 2014-12-31 23:59:59.000
Para saber o ultimo dia de qualquer mes utilize :
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,[Ô]10/03/2014[Ô])+1,0))
T+
O banco é Access.
Irenko a pergunta é, como você cria a próxima parcela, baseado em que?
30 dias
ultimo dia util
5º dia util
30 dias
ultimo dia util
5º dia util
Marcelo, conforme meu select na rotina acima, crio basedo na maior data de vencimento.
MAX(TbData.Vencimento). O select funciona perfeitamente baseando-se na maior data, a logica da coisa é q acho que ta errado isso pq é um projeto simples, ou seja, somente para acompanhamento de vencimento.
MAX(TbData.Vencimento). O select funciona perfeitamente baseando-se na maior data, a logica da coisa é q acho que ta errado isso pq é um projeto simples, ou seja, somente para acompanhamento de vencimento.
Colega, veja se esta funçãozinha que fiz agora te ajuda em algo...
[ô]--------------------------------------------------------------------------------------------------------------------------------------------------------
[ô]RETORNA, NO FORMATO MM/AAAA, QUAL O PRÓXIMO MÊS E ANO (SE NECESSÃRIO) DA DATA PASSADA COMO PARÂMETRO !
[ô]--------------------------------------------------------------------------------------------------------------------------------------------------------
Public Function ProximoMesAno(ByVal strDataDeReferenciaFormatada As String) As String
On Error Resume Next
[ô]-----------------------------------------
[ô] DIMENSIONAR VARIÃVEIS !
[ô]-----------------------------------------
Dim strMesDaReferencia As String
Dim strAnoDaReferencia As String
[ô]-----------------------------------------
[ô] ASSIMILAR CONTEÚDOS !
[ô]-----------------------------------------
strMesDaReferencia = Mid(strDataDeReferenciaFormatada, 4, 2)
strAnoDaReferencia = Right(strDataDeReferenciaFormatada, 4)
[ô]-----------------------------------------
[ô] PRÓXIMO MÊS !
[ô]-----------------------------------------
Select Case Val(strMesDaReferencia)
Case 1
strMesDaReferencia = [Ô]02[Ô]
Case 2
strMesDaReferencia = [Ô]03[Ô]
Case 3
strMesDaReferencia = [Ô]04[Ô]
Case 4
strMesDaReferencia = [Ô]05[Ô]
Case 5
strMesDaReferencia = [Ô]06[Ô]
Case 6
strMesDaReferencia = [Ô]07[Ô]
Case 7
strMesDaReferencia = [Ô]08[Ô]
Case 8
strMesDaReferencia = [Ô]09[Ô]
Case 9
strMesDaReferencia = [Ô]10[Ô]
Case 10
strMesDaReferencia = [Ô]11[Ô]
Case 11
strMesDaReferencia = [Ô]12[Ô]
Case 12
strMesDaReferencia = [Ô]01[Ô]
[ô]Neste caso precisa acrescer 1 no ano
strAnoDaReferencia = LTrim(RTrim(Str(Val(stranodareferecia) + 1)))
End Select
[ô]-----------------------------------------
[ô] RETORNAR DA FUNÇÃO !
[ô]-----------------------------------------
ProximoMesAno = strMesDaReferencia & [Ô]/[Ô] & strAnoDaReferencia
End Function
[ô]--------------------------------------------------------------------------------------------------------------------------------------------------------
[ô]RETORNA, NO FORMATO MM/AAAA, QUAL O PRÓXIMO MÊS E ANO (SE NECESSÃRIO) DA DATA PASSADA COMO PARÂMETRO !
[ô]--------------------------------------------------------------------------------------------------------------------------------------------------------
Public Function ProximoMesAno(ByVal strDataDeReferenciaFormatada As String) As String
On Error Resume Next
[ô]-----------------------------------------
[ô] DIMENSIONAR VARIÃVEIS !
[ô]-----------------------------------------
Dim strMesDaReferencia As String
Dim strAnoDaReferencia As String
[ô]-----------------------------------------
[ô] ASSIMILAR CONTEÚDOS !
[ô]-----------------------------------------
strMesDaReferencia = Mid(strDataDeReferenciaFormatada, 4, 2)
strAnoDaReferencia = Right(strDataDeReferenciaFormatada, 4)
[ô]-----------------------------------------
[ô] PRÓXIMO MÊS !
[ô]-----------------------------------------
Select Case Val(strMesDaReferencia)
Case 1
strMesDaReferencia = [Ô]02[Ô]
Case 2
strMesDaReferencia = [Ô]03[Ô]
Case 3
strMesDaReferencia = [Ô]04[Ô]
Case 4
strMesDaReferencia = [Ô]05[Ô]
Case 5
strMesDaReferencia = [Ô]06[Ô]
Case 6
strMesDaReferencia = [Ô]07[Ô]
Case 7
strMesDaReferencia = [Ô]08[Ô]
Case 8
strMesDaReferencia = [Ô]09[Ô]
Case 9
strMesDaReferencia = [Ô]10[Ô]
Case 10
strMesDaReferencia = [Ô]11[Ô]
Case 11
strMesDaReferencia = [Ô]12[Ô]
Case 12
strMesDaReferencia = [Ô]01[Ô]
[ô]Neste caso precisa acrescer 1 no ano
strAnoDaReferencia = LTrim(RTrim(Str(Val(stranodareferecia) + 1)))
End Select
[ô]-----------------------------------------
[ô] RETORNAR DA FUNÇÃO !
[ô]-----------------------------------------
ProximoMesAno = strMesDaReferencia & [Ô]/[Ô] & strAnoDaReferencia
End Function
então novamente, você pega a maior data e inclui um MÊS correto? sim, porém se a ultima data for por exemplo 30/01/2014, a proxima data será 28/02/2014 ou seja o proprio dateadd ja corrige isso, porém se não for esse o seu problema explique melhor.
Citação::
O banco é Access.
Nas sqls que passei, tenta trocar o GETDATE() por DATE() ou pela data atual do sistema.
Deve funcionar.
Procure UTILIZAR ao máximo os recursos do banco, ao invés de criar funções e rotinas para retornar algo que o próprio banco de dados pode lhe oferecer.
Exatamente, testei aqui e corrige altomaticamente sendo: 30/01/2014 gerou a proxima 28/02/2014, porem como vence, exemplo, todo dia 30 de cada mes o 28/02/2014 gerou 28/03/2014, teria que ser 30/03/2014.
Irenko,
Também já passei por esta situação uns anos atrás, no VB6.
Eu resolvi.
Criei umas funções que resolveram o problema.
Mais tarde (ou amanhã de manhã) eu copio as funções (são 3 que se interutilizam) e posto aqui. é que agora não tenho acesso ao HD onde guardo os fontes de VB6 (um externo) mas depois plugo e te envio.
Tudo de bom.
Também já passei por esta situação uns anos atrás, no VB6.
Eu resolvi.
Criei umas funções que resolveram o problema.
Mais tarde (ou amanhã de manhã) eu copio as funções (são 3 que se interutilizam) e posto aqui. é que agora não tenho acesso ao HD onde guardo os fontes de VB6 (um externo) mas depois plugo e te envio.
Tudo de bom.
Mas, colega
Enquanto eu não pesquiso no meu HD anterior, porque você não usa o DateAdd dentro de um for, algo assim, supondo que queira a relação de 3 meses a partir de 30/01/2014
Dim strDataInicial As String
Dim intMeses As Integer
[ô]Define a data inicial
strDataInicial = [Ô]30/01/2014[Ô]
[ô]Percorre quantidade de meses e soma N meses na data inicial
For intMeses = 1 To 3
MsgBox (DateAdd([Ô]m[Ô], intMeses, strDataInicial))
Next intMeses
O retorno seria
28/02/2014
30/03/2014
30/04/2014
Acho que é assim que você queria.
Aqui funcionou.
Verifique se é o que você precisa.
Se não for, dai te envio as funções que falei antes.
Tudo de bom.
Enquanto eu não pesquiso no meu HD anterior, porque você não usa o DateAdd dentro de um for, algo assim, supondo que queira a relação de 3 meses a partir de 30/01/2014
Dim strDataInicial As String
Dim intMeses As Integer
[ô]Define a data inicial
strDataInicial = [Ô]30/01/2014[Ô]
[ô]Percorre quantidade de meses e soma N meses na data inicial
For intMeses = 1 To 3
MsgBox (DateAdd([Ô]m[Ô], intMeses, strDataInicial))
Next intMeses
O retorno seria
28/02/2014
30/03/2014
30/04/2014
Acho que é assim que você queria.
Aqui funcionou.
Verifique se é o que você precisa.
Se não for, dai te envio as funções que falei antes.
Tudo de bom.
Tópico encerrado , respostas não são mais permitidas