AJUDA EM CONSULTA SQL DATA VACINA

JONASJTG 19/04/2017 16:07:14
#473402
Muito Obrigado ao todos que puderem dar alguns minutos de seu tempo para que possam me ajudar!

Antes de tudo declaro aqui que não sou programador tudo que eu sei e lendo os foruns e fazendo teste!

Eu fiz um projeto em vba= excel+access.

ai agra estou tetando converte para Vb.net, estou usando o microsoft visual studio 2015.
Consegue fazer bastante coisas mas travei em uma parte que é!

Como fazer uma consulta da seguinte maneira.

o animal tem um brinco 0001 ele vacino na data 19/04/2017.
faz de conta que vou cadastra uma nova vacina desde animal mas não pode deixar eu cadastra no mesmo mes exemplo.

brinco 0001 vacino 19/04/2017 esta certo
brinco 0001 vacino 22/04/2017 não pode no mesmo mês!

essa e a consulta que quero fazer. eu tentei fazer com esse código mas não deu certo?

Public Function verificabrincoevacina(ByVal vacinaatual As Integer) As Boolean
Dim dr As OleDbDataReader = Nothing
Using cn As OleDbConnection = conexaobd()
Try
cn.Open()
Dim vacina As DateTime = txtdtvacina.Text
Dim PesquisaSQL As String

PesquisaSQL = [Ô]select * from origemvacina where MONTH(dtvacina) = [Ô] & vacina & [Ô] AND YEAR(dtvacina) = [Ô] & vacina & [Ô] AND brinco(brinco) = [Ô] & txtbrincovacina.Text

Dim cmd As OleDbCommand = New OleDbCommand(PesquisaSQL, cn)
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]dtvacina[Ô], vacinaatual))

dr = cmd.ExecuteReader(CommandBehavior.SingleRow)
If dr.HasRows Then
dr.Read()
vacinarepetida = dr.Item([Ô]dtvacina[Ô])
End If

If vacinarepetida <> [Ô][Ô] Then
MsgBox([Ô]dtvacina [Ô] & txtdtvacina.Text & [Ô] Já exixte Verifique! [Ô], MsgBoxStyle.Information, [Ô]estudo[Ô])
vacinarepetida = [Ô][Ô]
Me.txtdtvacina.Text = [Ô][Ô]
Me.txtdtvacina.Focus()
Return False
End If
Catch ex As Exception
Return False
MsgBox([Ô]erro![Ô], MsgBoxStyle.Information, [Ô]estudo[Ô])
Finally
dr.Close()
cn.Close()
End Try
End Using
Return True
End Function





DAMASCENO.CESAR 19/04/2017 16:37:38
#473403
JONASJTG, nesta parte
  Catch ex As Exception
Return False
MsgBox([Ô]erro![Ô], MsgBoxStyle.Information, [Ô]estudo[Ô])
Finally


mude para:

   Catch ex As Exception
Return False
MsgBox(ex.message)
Finally


para sabermos qual o erro que está acontecendo
JABA 19/04/2017 16:47:29
#473404
Resposta escolhida
Melhor solução ao meu ver seria seguinte:

Crie um campo no seu banco de dados que receba apenas [Ô]Mes e Ano[Ô] concatenados e torne-o como um campo Unique. Por exemplo, poderia ser no formato 04/2017, ou talvez possa ser até sem a barra, ficando assim 042017. Se por ventura alguém através do seu sistema inserir um mês que já existe, o banco de dados vai barrar e vai emitir um alerta para a sua aplicação dizendo que não pode, daí isso vai gerar uma exceção na sua aplicação. Capture essa exceção com o try catch e dê uma mensagem explicando a situação para o usuário.
JONASJTG 19/04/2017 17:16:48
#473407
Obrigado pela resposta segue a imagem de erro!


e JABA eu preciso que seja o formato de data completo.
JABA 19/04/2017 17:43:40
#473409
é só criar dois campos: um para o Mes/Ano (Aqui tem que ser UNIQUE) e outro para o Dia. A junção dos dois forma sua data.
KERPLUNK 19/04/2017 18:10:38
#473411
Você está com a idéia certa na implementação, na minha opinião.
Os poréns: Estou supondo que você tenha um campo na sua tabela com a data da vacina, correto? Se for o caso, você precisa passar o parâmetro para o valor à ser consultado, mais ou menos assim:

PesquisaSQL = [Ô]select * from origemvacina where (MONTH(CAMPO_DATA_VACINA) = @Mes AND YEAR(CAMPO_DATA_VACINA) <= @Ano) AND brinco(brinco) = [Ô] & txtbrincovacina.Text

Dim cmd As OleDbCommand = New OleDbCommand(PesquisaSQL, cn)
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@Mes[Ô], DateTime.Now.Month))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]@Ano[Ô], DateTime.Now.Year))

Atenção onde coloquei [Ô]CAMPO_DATA_VACINA[Ô], coloque o nome do campo onde está gravada a data da vacina. Também preste atenção à condição dupla na query(que está entre parênteses): ela estabelece que o mês não pode ser o mesmo nem o ano. Mas pode acontecer de aplicar uma vacina no ano que vem, por isso a condição iria falhar.
JABA 19/04/2017 18:35:32
#473413
Citação:

Você está com a idéia certa na implementação, na minha opinião.



Dessa forma como ele está fazendo, ele vai ter sempre que verificar no banco se o mês já existe para fazer o castramento da vacina, e isso afeta muito o desempenho da aplicação na medida que o banco vai crescendo.

O segundo problema que eu vejo é na questão da integridade dos dados. Se futuramente ele for modificar o sistema nessa área, através dele ou de outro programador, vai ter que lidar com a questão desse código novamente, podendo inserir bugs sem saber, aumentando drasticamente o risco de ter problemas futuros.

Da forma com que eu indiquei, o desempenho será sempre o mesmo, ou seja, ótimo em todos os casos, e poderá ficar despreocupado com integridade de seus dados.
JONASJTG 20/04/2017 09:26:59
#473425
Bom dia a todos!

Eu fiz as mudanças que vcs orientarão mas não deu certo.

veja se estou no caminho certo fazendo favor!

Public Function verificabrincoevacina(ByVal vacinaatual As Integer) As Boolean
Dim dr As OleDbDataReader = Nothing
Using cn As OleDbConnection = conexaobd()
Try
cn.Open()

Dim mes As Integer
Dim ano As Integer

mes = Month(txtdtvacina.Text)
ano = Year(txtdtvacina.Text)

Dim PesquisaSQL As String

PesquisaSQL = [Ô]select * from origemvacina where MONTH(dtvacina) = [Ô] & mes & [Ô] AND YEAR(dtvacina) = [Ô] & ano & [Ô]AND brinco = [Ô] & txtbrinco.Text
[ô]PesquisaSQL = [Ô]select * from origemvacina where MONTH(dtvacina) = [Ô] & mes & [Ô] AND YEAR(dtvacina) = [Ô] & ano & [Ô]OR brinco = [Ô] & txtbrinco.Text

Dim cmd As OleDbCommand = New OleDbCommand(PesquisaSQL, cn)
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]dtvacina[Ô], vacinaatual))
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]brinco[Ô], brincoatual))

dr = cmd.ExecuteReader(CommandBehavior.SingleRow)
If dr.HasRows Then
dr.Read()
vacinarepetida = dr.Item([Ô]dtvacina[Ô])
brincorepetido = dr.Item([Ô]brinco[Ô])
End If

If vacinarepetida <> [Ô][Ô] Then
MsgBox([Ô]dtvacina [Ô] & txtdtvacina.Text & [Ô] Já exixte Verifique! [Ô], MsgBoxStyle.Information, [Ô]estudo[Ô])
vacinarepetida = [Ô][Ô]
Me.txtdtvacina.Text = [Ô][Ô]
Me.txtdtvacina.Focus()
Else
If brincorepetido <> [Ô][Ô] Then
MsgBox([Ô]brinco [Ô] & txtbrincovacina.Text & [Ô] Já exixte Verifique! [Ô], MsgBoxStyle.Information, [Ô]estudo[Ô])
brincorepetido = [Ô][Ô]
Me.txtbrincovacina.Text = [Ô][Ô]
Me.txtbrincovacina.Focus()
Return False
End If
End If
Catch ex As Exception
Return False
MsgBox([Ô]erro![Ô], MsgBoxStyle.Information, [Ô]estudo[Ô])
Finally
dr.Close()
cn.Close()
End Try
End Using
Return True
End Function

So pra conta o antigo codigo que estou tentando refazer e este no excel+access.

Private Sub Pesquisavacina()

Dim PesquisaSQL As String

PesquisaSQL = [Ô]select * from origemvacina where Brinco = [ô][Ô] & txtBrinco.Text & [Ô][ô][Ô]

Call Conecta
Set consulta = banco.OpenRecordset(PesquisaSQL)

While Not consulta.EOF

If consulta(2) = txtdtvacina.Text Then
MsgBox [Ô]Animal já foi vacinado. Verifique! [Ô], 64, [Ô]ATENÇÃO[Ô]:
End If
If txtdtvacina.Text = [Ô][Ô] Then Exit Sub

If VBA.Month(consulta(2)) = VBA.Month(txtdtvacina.Text) And VBA.Year(consulta(2)) = VBA.Year(txtdtvacina.Text) Then
MsgBox [Ô]Animal já foi vacinado neste mês.. Verifique! [Ô], 64, [Ô]ATENÇÃO[Ô]:

Me.txtdtvacina = [Ô][Ô]
Me.txtdtvacina.SetFocus
Call Desconecta: Exit Sub
End If
consulta.MoveNext
Wend
End Sub
JONASJTG 20/04/2017 14:13:13
#473442
Boa Tarde pessoal!

Apos varias horas teste aqui e ali estou case conseguindo mas ainda não descobri o que acontece agora.
exemplo:
animal do brinco 0001 ele vacino dia 10/05/2014 eu posso mudar os dia que ele sempre avisa que foi vacinado ate aqui o código funciona normal
mas quando eu coloca aproxima data deste mesmo animal não funciona pq será?
segue o novo código de teste!

Public Function verificabrincoevacina(ByVal vacinaatual As Integer) As Boolean
Dim dr As OleDbDataReader = Nothing
Using cn As OleDbConnection = conexaobd()

Try
cn.Open()

Dim PesquisaSQL As String

PesquisaSQL = [Ô]Select * from origemvacina where Brinco = [ô][Ô] & Me.txtbrincovacina.Text & [Ô][ô][Ô]
Dim cmd As OleDbCommand = New OleDbCommand(PesquisaSQL, cn)
cmd.Parameters.Add(New OleDb.OleDbParameter([Ô]dtvacina[Ô], vacinaatual))

dr = cmd.ExecuteReader(CommandBehavior.SingleRow)
If dr.HasRows Then
dr.Read()
vacinarepetida = dr.Item([Ô]dtvacina[Ô])
End If

If dr(2) = txtdtvacina.Text Then
MsgBox([Ô]Animal já foi vacinado. Verifique! [Ô], 64, [Ô]ATENÇÃO[Ô])
End If

If Month(dr(2)) = Month(txtdtvacina.Text) And Year(dr(2)) = Year(txtdtvacina.Text) Then
MsgBox([Ô]Animal já foi vacinado neste mês.. Verifique! [Ô], 64, [Ô]ATENÇÃO[Ô])
Me.txtdtvacina.Text = [Ô][Ô]
Me.txtdtvacina.Focus()
End If
Return False

Catch ex As OleDbException
Return False
MsgBox(ex.Message, MsgBoxStyle.Critical, [Ô]Erro em dados Oledb[Ô])
Catch ex As Exception
Return False
MsgBox(ex.Message, MsgBoxStyle.Critical, [Ô]Erro de Sistema[Ô])
Finally
dr.Close()
cn.Close()
End Try
End Using
Return True
End Function


JABA 20/04/2017 14:19:08
#473443
Bom, do jeito que te indiquei, você não iria precisar de quase nenhum código. Mas se você quiser fazer tudo via código mesmo, passo a bola para o KerpLunk.
JONASJTG 20/04/2017 15:13:31
#473446
Então Jaba desculpe mas eu não entende o que vc disse!

eu ainda estou começando então não sei o que deve ser feito eu fico fazendo teste!

Mas se puder me ajudar agradeço!
Página 1 de 2 [12 registro(s)]
Tópico encerrado , respostas não são mais permitidas