ATUALIZAR BANCO DE DADOS COM DATEDIFF

ABREU 27/01/2015 09:41:33
#444052
Estou tentando atualizar a idade de todas as pessoas cadastradas num banco de dados Access sempre que o WindowsForm for exibido (VB.Net-2012).
Ocorre que não sei como adotar o campo DataNascimento como parâmetro para DateDiff.
Testei o código abaixo, mas não funcionou.

Private Sub frmIdade_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim ConnectionString = New OleDbConnection([Ô]Provider=Microsoft.ACE.OLEDB.12.0;Data Source=[Ô] & Application.StartupPath & [Ô]\Cadastro.accdb[Ô])
Dim query As String = [Ô]UPDATE Tabela01 SET [DataNascimento] = @DataNascimento, [TotalAnos] = @TotalAnos WHERE Id <> 0[Ô]
Dim command As New OleDbCommand(query, ConnectionString)

Dim DataInicial = CDate(Me.DataNascimentoTextBox.Text) [ô]Erro: A cadeia de conversão não é válida!
Dim DataFinal = Now
Dim Idade = DateDiff(DateInterval.Year, DataInicial, DataFinal)

command.Parameters.Add([Ô]@TotalAnos[Ô], OleDbType.Integer).Value = Idade
ConnectionString.Open()
command.ExecuteNonQuery()
ConnectionString.Close()
command = Nothing
End Sub

Peço ajuda para atingir o objetivo desejado.
Wencesláu.
TUNUSAT 27/01/2015 10:07:04
#444055
Resposta escolhida
ABREU,

As variáveis data foram DIMensionadas, mas não foram instanciadas?
        Dim DataInicial As Date = CDate([Ô]19/05/2015[Ô])  [ô]Erro: A cadeia de conversão não é válida!
Dim DataFinal As Date = Now
Dim Idade As Integer = DateDiff(DateInterval.Year, DataInicial, DataFinal)


Veja também:
---------------------------------------------------------------------------
Calculando a idade com precisão - Macoratti.net
http://www.macoratti.net/d170901.htm
---------------------------------------------------------------------------
Dim dt As DateTime = Convert.ToDateTime([Ô]23/10/1978[Ô])
Dim ts As TimeSpan = DateTime.Today.Subtract(dt)
MessageBox.Show(New DateTime(ts.Ticks).ToString([Ô]yy[Ô]) & [Ô] anos[Ô])

https://social.msdn.microsoft.com/Forums/pt-BR/205ed0cd-cf16-4fc9-82af-e8e086f269c7/calcular-a-idade-no-vbnet
---------------------------------------------------------------------------
Public Function Age(ByVal Birthdate As System.DateTime) As Long
Try
Dim CurrentDate As System.DateTime = System.DateTime.Today
Select Case Month(Birthdate)
Case Is < Month(System.DateTime.Today)
Age = DateDiff([Ô]YYYY[Ô], Birthdate, Now())
Case Is = Month(CurrentDate)
Select Case Day(Birthdate)
Case Is < Day(CurrentDate)
Age = DateDiff([Ô]YYYY[Ô], Birthdate, Now())
Case Is = Day(CurrentDate)
Age = DateDiff([Ô]YYYY[Ô], Birthdate, Now())
Case Is > Day(CurrentDate)
Age = DateDiff([Ô]YYYY[Ô], Birthdate, Now()) - 1
End Select
Case Is > Month(CurrentDate)
Age = DateDiff([Ô]YYYY[Ô], Birthdate, Now()) - 1
Case Else
Age = 0
End Select
Catch ex As System.Exception
[ô]Error handling code does here
End Try
End Function

http://forum.imasters.com.br/topic/197976-calcular-a-idade-no-vbnet/
---------------------------------------------------------------------------

[][ô]s,
Tunusat.
ABREU 27/01/2015 11:52:09
#444057
Caro Tunusat,

Em primeiro lugar, muito obrigado por estar me ajudando.
Apliquei o código conforme script abaixo, mas a mensagem de erro persiste.
Haveria outra forma de atualizar a idade dos cadastrados sempre que o formulário for exibido?

Dim DataInicial As Date = CDate(Me.DataNascimentoTextBox.Text) [ô]A cadeia de conversão não é válida!
Dim DataFinal As Date = Now
Dim Idade As Integer = DateDiff(DateInterval.Year, DataInicial, DataFinal)
TUNUSAT 27/01/2015 12:52:56
#444059
ABREU,

Podemos tentar de outra forma:
Dim DataInicial As Date = Convert.ToDateTime([Ô]2014/05/19[Ô])


[][ô]s,
Tunusat.
ABREU 28/01/2015 04:35:07
#444067
A sintaxe inicialmente tentada foi a seguinte:
Dim DataInicial = CDate(Me.DataNascimentoTextBox.Text)
A mensagem de erro, então, foi: A conversão da cadeia de caracteres [ô] [ô] no tipo [ô]Date[ô] não é válida.

Tentei as seguintes sintaxes:
Dim DataInicial As Date = Convert.ToDateTime([Ô]2014/05/19[Ô]) – Recomendada acima
Dim DataInicial As Date = Convert.ToDateTime([Ô]2014/5/19[Ô])
Dim DataInicial As Date = [Ô]2014/05/19[Ô]
Dim DataInicial As Date = [Ô]19/05/2014[Ô]
A mensagem de erro agora é: Falha ao converter valor de parâmetro de String em DateTime.


Creio que a nossa dificuldade está sendo fazer o sistema entender que o valor da variável DataInicial é o valor do campo DataNascimento que, na tabela do Access, é do tipo Data/Hora e, partindo desse entendimento, proceder às conversões necessárias para atribuir um valor à variável Idade através do DateDiff, valor esse que será repassado ao campo TotalAnos que é do tipo Número na tabela. Em síntese:

Dim DataInicial As Date = [Valor do campo DataNascimento]
Dim DataFinal As Date = Now
Dim Idade As Integer = DateDiff(DateInterval.Year, DataInicial, DataFinal)
command.Parameters.Add([Ô]@TotalAnos[Ô], OleDbType.Integer).Value = Idade

NICKOSOFT 28/01/2015 06:45:48
#444068
Exato, esta sendo informado algo q nao esta sendo possivel transformar em data
O isdate(text) retorna true ou false se for uma data
Sempre usei cdate(text) informando 30/01/2000 e sempre foi aceito, nao sei se mudaria pra melhor declarar essas variaveis como datetime
TUNUSAT 28/01/2015 07:59:50
#444069
ABREU,

Como o Nicko disse, você precisa verificar o conteúdo da variável com [Ô]IsDate[Ô].
Caso o conteúdo da variável não seja uma data válida é possível converte-la para um padrão data com um DateFormat e algumas outras funções bacanas como: InStr(), etc...
Por exemplo, vamos supor que você está recebendo algo assim: [Ô]XYZ23-12-2014[Ô] ou assim [Ô]28 de julho[Ô]. é possível transformar a String em Data isolando-a.

Coloque aqui o conteúdo da variável para podermos analisar.

Montei este exemplo [Ô]tosquinho[Ô] para mostrar algumas funções:
        Dim strTeste1 As String = [Ô]23+MARÇO+2015[Ô]
Dim strTeste2 As String = [Ô]Sábado --- 31 janeiro[Ô]
Dim datTeste1 As Date = Now()

If IsDate(strTeste1) Then
Console.WriteLine(strTeste1 & [Ô] é uma data[Ô])
Else
Console.WriteLine(strTeste1 & [Ô] NÃO é uma data[Ô])

strTeste1 = Replace(strTeste1, [Ô]+[Ô], [Ô]/[Ô])

If IsDate(strTeste1) Then
Console.WriteLine(strTeste1 & [Ô] AGORA é uma data[Ô])
Else
Console.WriteLine(strTeste1 & [Ô] AINDA NÃO é uma data[Ô])
End If

End If

If IsDate(strTeste2) Then
Console.WriteLine(strTeste2 & [Ô] é uma data[Ô])
Else
Console.WriteLine(strTeste2 & [Ô] NÃO é uma data[Ô])

strTeste2 = Trim(Left$(strTeste2, InStr(strTeste2, [Ô] ---[Ô]))) & [Ô], [Ô] & Right$(strTeste2, InStrRev(strTeste2, [Ô]-[Ô])) & [Ô] de [Ô] & Year(Now()).ToString()

If IsDate(strTeste2) Then
Console.WriteLine(strTeste1 & [Ô] AGORA é uma data[Ô])
Else
Console.WriteLine(strTeste1 & [Ô] AINDA NÃO é uma data[Ô])
End If

End If

If IsDate(datTeste1) Then
Console.WriteLine(datTeste1 & [Ô] é uma data[Ô])
Else
Console.WriteLine(datTeste1 & [Ô] NÃO é uma data[Ô])
End If


Veja mais em:
===========================================
VB.NET e o tratamento de datas
http://www.macoratti.net/vbn_data.htm
===========================================
Trabalhando Strings no Visual Basic
http://www.macoratti.net/strings.htm
===========================================
VB.NET - Strings : um novo enfoque.
http://www.macoratti.net/vbn_str.htm
===========================================

[][ô]s,
Tunusat.
Tópico encerrado , respostas não são mais permitidas