AJUDA EM CONSULTA SQL DATA VACINA
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
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
JONASJTG, nesta parte
mude para:
para sabermos qual o erro que está acontecendo
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
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.
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.
Obrigado pela resposta segue a imagem de erro!
e JABA eu preciso que seja o formato de data completo.
e JABA eu preciso que seja o formato de data completo.
é 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.
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:
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.
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.
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.
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
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
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
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
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.
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!
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!
Tópico encerrado , respostas não são mais permitidas