VERIFICANDO MESES

IRENKO 05/11/2014 10:31:30
#442297
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
FOXMAN 05/11/2014 13:13:27
#442302
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+
IRENKO 05/11/2014 13:47:57
#442303
O banco é Access.
MARCELO.TREZE 05/11/2014 15:35:19
#442306
Resposta escolhida
Irenko a pergunta é, como você cria a próxima parcela, baseado em que?

30 dias

ultimo dia util

5º dia util



IRENKO 05/11/2014 16:55:27
#442307
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.
SINCLAIR 05/11/2014 18:33:35
#442310
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
MARCELO.TREZE 05/11/2014 23:06:19
#442319
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.
FOXMAN 06/11/2014 13:44:56
#442331
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.
IRENKO 06/11/2014 13:48:52
#442332
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.
SINCLAIR 06/11/2014 17:38:01
#442338
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.
SINCLAIR 06/11/2014 18:12:00
#442339
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.
Página 1 de 2 [12 registro(s)]
Tópico encerrado , respostas não são mais permitidas