SELECIONA REGISTRO EXISTENTE

ALANTB 05/08/2015 08:16:42
#449582
Olá, em um sistema vb6/Access tenho uma tabela com os seguintes campos: codCertificado (PK), codMatricula, codCurso, codEntidade, dataDe, dataAte, CargaHoraria. Sendo assim um funcionário pode ter vários certificados gravados, de vários cursos feitos em várias entidades, em períodos diferentes. O que preciso é uma query que selecione os certificados de um funcionário e se o usuário tentar cadastrar um que já existe exibe msg que já tem no bd. Os meus texts correspondentes:
data(0) – codCertificado
data(1) – codMatricula
txtCodCurso – codCurso
txtCodEntidade – codEntidade
txtDe – De
txtAte – Ate
txtCargaHoraria– CargaHoraria

Tentei várias querys mas todas dão erro. A última é essa que dá erro de ‘Objeto Requerido’, mas não consigo ver o que ta faltando.Dá o erro e seleciona toda query sql abaixo em amarelo. Alguma idéia???

Sub ExisteCertificado()
Dim sql As String
Dim dtini As Date

If rs.State = adStateOpen Then
rs.Close
Set rs = Nothing
End If

‘data(1).Enabled = True

dtini = Format(txtDe.Text, [Ô]mm,dd, yyyy[Ô])
sql = [Ô]SELECT tbCertificado.codMatricula, tbCertificado.codCurso, tbCertificado.codEntidade, tbCertificado.De [Ô] & _
[Ô]FROM tbCertificado [Ô] & _
[Ô]WHERE tbCertificado.codMatricula =[Ô] & CLng(data(1)) And tbCertificado.CodCurso = [Ô] & txtCodCurso And tbCertificado.codEntidade =[Ô] & CLng(txtCodEntidade) And tbCertificado.De = [Ô] & format(dtIni,mm/dd/yyy)[Ô]


rs.Open sql, conn, adOpenForwardOnly, adLockReadOnly

If rs.BOF And rs.EOF Then [ô] Se não achou registros
txtCargaHoraria.SetFocus

Else

MsgBox [Ô]Atenção!! Já existe Certificado atribuído a esse funcionário com essas informações!![Ô], vbCritical
End If

rs.Close
Set rs = Nothing

End Sub
TUNUSAT 05/08/2015 10:06:46
#449587
ALANTB,

Você pretende [Ô]listar[Ô] todos os certificados parecidos ou só dizer:
- [Ô]Este certificado já está cadastrado[Ô]?

Eu pergunto isso, para simplificar a consulta. Por Exemplo:
SELECT Count(*)
FROM tbCertificado
WHERE tbCertificado.codMatricula =[Ô] & CLng(data(1)) And tbCertificado.CodCurso = [Ô] & txtCodCurso And tbCertificado.codEntidade =[Ô] & CLng(txtCodEntidade) And tbCertificado.De = [Ô] & format(dtIni,mm/dd/yyy)[Ô];


Se retornar qualquer coisa maior que zero já existe um certificado, se for igual a zero não existe o certificado.

[][ô]s,
Tunusat.
ALANTB 05/08/2015 11:56:10
#449598
TUNUSAT, apenas alertar o usuário com um msgbox que para determinado funcionário já está cadastrado um certificado com as informações que ele está tentando inserir. A query deve selecionar pela matricula todos os certificados já cadastrados desse funcionário e ver se já existe ou não no bd. Tanto na query que eu estava tentando usar como na que você passou acima continua dando erro runtime 424 objeto requerido. Percebi também que nas duas o segundo [Ô]AND[Ô] da query não fica com a fonte da letra em azul como se não identificasse que é mais um critério para a seleção das informações. E também não aceita o ponto e vírgula no final.
No código acima não postei como eu chamo a Sub. Eu a executo no lostfocus do txtDe que ao identificar a data inicial do curso, junto com o curso e a entidade deve fazer a verificação no bd.Por enquanto permaneço na mesma.....

Private Sub txtDe_LostFocus()

If txtDe.Text = [Ô][Ô] Then Exit Sub
ExisteCertificado

End Sub
DAMASCENO.CESAR 05/08/2015 13:26:45
#449608
Resposta escolhida
monta essa string:

sql = [Ô]SELECT tbCertificado.codMatricula, tbCertificado.codCurso, tbCertificado.codEntidade, tbCertificado.De [Ô] & _
[Ô]FROM tbCertificado [Ô] & _
[Ô]WHERE tbCertificado.codMatricula =[Ô] & CLng(data(1)) & [Ô] And tbCertificado.CodCurso = [Ô] & txtCodCurso & [Ô] And tbCertificado.codEntidade =[Ô] & CLng(txtCodEntidade) & [Ô] And tbCertificado.De = [Ô] & format(dtIni,[Ô]mm/dd/yyyy[Ô])

agora vê se roda
TUNUSAT 05/08/2015 13:32:57
#449609
ALANTB,

Verifique a cláusula WHERE sua query disparando cada trecho (entre AND) separadamente (uma por vez). Deve ter algum problema em uma delas.
Por exemplo... achei estranho:

- & CLng(data(1))
CLng -> Converte qualquer coisa (variant) para Long... mas dentro dela existe uma [Ô]data(1)[Ô]?

[][ô]s,
Tunusat.
OMAR2011 05/08/2015 14:15:21
#449620
O que está precisando é criar outras tabelas e fazer o relacionamento.
Com o que você mostrou neste post, não vai conseguir identificar ninguém.
Quem é João,Maria,Pedrelina eeeeeeeeeee.
Não precisa de data para fazer esta consulta,basta Registro ou nome do funcionário e codCurso.
Ai onde está as outras tabelas.Você está querendo agrupar todas as informações em uma única tabela.
Não da certo.
ALANTB 06/08/2015 09:19:14
#449663
TUNUSAT, data(1) é um array de textboxes com o nome de [Ô]data[Ô]. A query do DAMASCENO.CESAR não deu erro aqui, mas não me retornou msg dizendo que registro já está atribuído ao funcionário. Acho que o sistema ignorou a query porque gravou outro registro com as mesmas informações de curso do mesmo funcionário como se ele tivesse feito o mesmo curso duas vezes na mesma entidade e no mesmo periodo de datas. Bom, se pelo menos não tá dando erro, vou continuar....

ALAN
ALANTB 07/08/2015 08:53:16
#449702
Percebi que a coisa não é tão simples como imaginei. Mesmo que a query ache informações dos certificados do funcionário o que vai ser feito com os dados?Essa foi a pergunta que eu me fiz agora, pois se carregar os dados em texts ou labels, qual deles será carregado, sendo que um funcionário terá vários registros. Me dei conta que a rotina que esta query está contida deve percorrer a tabela procurando registros de acordo com a matricula do funcionário e ir comparando com o que está nos textbox digitados pelo usuário. Se for diferente, não encontrou igual, então segue a inclusão do novo registro, mas, se ao percorrer o recordset achar dados iguais aos que estão nos textbox, ai sim, exibe a msg que já existe registro com essas informações cadastrados para esse funcionário. Sendo assim como fazer essa comparação: do que está sendo digitado com o que já está no banco??

Alan
ALANTB 14/08/2015 11:20:07
#449975
Gente, quando deixo apenas um critério na cláusula WHERE , codMatricula=[Ô] & data(1).text, o código não dá erro. Entretanto quando é inserido um AND com um segundo critério, dá mensagem de erro run-time error 424 object required. Pelo que sei [Ô]ojeto requerido[Ô] é quando falta um controle ou algum nome tá errado. Mas já verifiquei várias vezes e não vi nada errado. Os critérios que preciso são esses:

[Ô]WHERE tbCertificado.codMatricula =[Ô] & CLng(data(1)) And tbCertificado.CodCurso = [Ô] & txtCodCurso And tbCertificado.codEntidade =[Ô] & CLng(txtCodEntidade) And tbCertificado.De = [Ô] & format(dtIni,mm/dd/yyy)[Ô]

Quanto ao que o OMAR2011 postou, que, não seria necessário data, acho que no meu caso é necessário, pois, um funcionário pode fazer o mesmo tipo de curso na mesma entidade só que em períodos diferentes, ex: em 2001 um curso de Estrutura e Montagens de Redes e depois em 2012 o mesmo curso na mesma entidade (só que mais atualizado), o que diferencia que não é o mesmo curso cadastrado duas vezes é data em que foi ministrado.
Na minha tbCertificado a chave primária não é codMatricula ( chave estrangeira de tbFunc relacionada com tbCertificado) mas sim codCertificado o que permite que seja feito vários registros de um mesmo funcionário.
Sendo assim continuo na luta....!!!
ALANTB 21/08/2015 12:18:46
#450318
Gente achei uma dúvida de um colega em um fórum na net, segue o link: http://www.usandoaccess.com.br/tutoriais/aprenda-filtragens-no-access.asp?id=1
A dúvida dele é semelhante a minha : filtrar com mais de um critério. Só que pelo que percebi o código que ele está usando é para VBA no Access e serve para carregar uma lista ou relatório. Para testar copiei parte do código no vb6 e de cara ficou em vermelho a linha: [Ô]Option Compare Database[Ô]. Isso só é usado no VBA?? Outra, essa linha:
filtro = [Ô]Processo like [ô]*[Ô] & Me!tx1 & [Ô]*[ô] AND Data like [ô]*[Ô] & Me!tx.Text & [Ô]*[ô]AND Vendedor like [ô]*[Ô] & Me!tx2 & [Ô]*[ô][Ô].Clausulas LIKE não são usadas somente em querys SQL???
Tem como adaptar esse código em vb6 apenas para ver se os registros já existem no banco e exibir mensagem???Segue o trecho do post em questão:

IVAN ALLESSI 31/07/2011 10:07:57

Boa tarde Avelino,

Quero Filtrar usando os campos [Ô]Processo[Ô], [Ô]Data[Ô], e [Ô]Vendedor[Ô] juntos, mais na data não esta dando resultado nenhum, Se eu colocar um Valor no Campo [Ô]Processo[Ô] e no [Ô]Vendedor[Ô] ele filtra tudo certinho, mais se eu colocar a data não funciona. Quando eu coloco só a data ai ele filtra.(Tanto faz pelo Ano, Mês, Dia, ele retorna filtrando os registros tudo certinho)

Meu problema é que se eu colocar os valores nos 3 campos não filtra nada, Já tentei de varias formas e nã consigo resolver, acho que é um problema na escrita da função, já quebrei a cabeça um monte.
Abaixo segue o código, se puderes me ajudar agradeço.

Option Compare Database
Dim j As Byte
Dim filtroLista As String
Private Sub fncCarregalista(Optional filtro As String, Optional ordem As String)
Dim strSql As String
strSql = [Ô]SELECT Código, Processo, Data, Codigo, Cliente, Zona, Vendedor, Valor, Motivo[Ô]
strSql = strSql & [Ô] FROM GarantiaDevolucao WHERE [Ô] & filtro
strSql = strSql & [Ô] ORDER BY Data;[Ô]
Me!Lista.RowSource = strSql
filtroLista = filtro
End Sub
----------------------------------------------------------------------------------

Private Sub tx_Change()
Dim filtro As String
j = 0
If Len(Me!tx.Text & [Ô][Ô]) > 0 Then j = j + 1
If Len(Me!tx1 & [Ô][Ô]) > 0 Then j = j + 2
If Len(Me!tx2 & [Ô][Ô]) > 0 Then j = j + 3
Select Case j
Case 0
filtro = [Ô]Código > 0[Ô]
Case 1
filtro = [Ô]Data like [ô]*[Ô] & Me!tx.Text & [Ô]*[ô][Ô]
Case 2
filtro = [Ô]Processo like [ô]*[Ô] & Me!tx1 & [Ô]*[ô][Ô]
Case 3
filtro = [Ô]Vendedor like *[Ô] & Me!tx2 & [Ô]*[Ô]
Case 4
filtro = [Ô]Processo like [ô]*[Ô] & Me!tx1 & [Ô]*[ô] AND Data like [ô]*[Ô] & Me!tx.Text & [Ô]*[ô]AND Vendedor like [ô]*[Ô] & Me!tx2 & [Ô]*[ô][Ô]
End Select
Call fncCarregalista(filtro)
End Sub

Private Sub tx1_Change()
Dim filtro As String
j = 0
If Len(Me!tx1.Text & [Ô][Ô]) > 0 Then j = j + 1
If Len(Me!tx & [Ô][Ô]) > 0 Then j = j + 2
If Len(Me!tx2 & [Ô][Ô]) > 0 Then j = j + 3
Select Case j
Case 0
filtro = [Ô]Código > 0[Ô]
Case 1
filtro = [Ô]Processo like [ô]*[Ô] & Me!tx1.Text & [Ô]*[ô][Ô]
Case 2
filtro = [Ô]Data like *[Ô] & Me!tx & [Ô]*[Ô]
Case 3
filtro = [Ô]Vendedor like *[Ô] & Me!tx2 & [Ô]*[Ô]
Case 4
filtro = [Ô]Processo like [ô]*[Ô] & Me!tx1.Text & [Ô]*[ô] AND Data like [ô]*[Ô] & Me!tx & [Ô]*[ô]AND Vendedor like [ô]*[Ô] & Me!tx2 & [Ô]*[ô][Ô]
End Select
Call fncCarregalista(filtro)
End Sub

Private Sub tx2_Change()
Dim filtro As String
j = 0
If Len(Me!tx2.Text & [Ô][Ô]) > 0 Then j = j + 1
If Len(Me!tx & [Ô][Ô]) > 0 Then j = j + 2
If Len(Me!tx1 & [Ô][Ô]) > 0 Then j = j + 3
Select Case j
Case 0
filtro = [Ô]Código > 0[Ô]
Case 1
filtro = [Ô]Processo like [ô]*[Ô] & Me!tx1.Text & [Ô]*[ô][Ô]
Case 2
filtro = [Ô]Data like *[Ô] & Me!tx & [Ô]*[Ô]
Case 3
filtro = [Ô]Vendedor like *[Ô] & Me!tx2 & [Ô]*[Ô]
Case 4
filtro = [Ô]Processo like [ô]*[Ô] & Me!tx1 & [Ô]*[ô] AND Data like [ô]*[Ô] & Me!tx & [Ô]*[ô] AND Vendedor like [ô]*[Ô] & Me!tx2.Text & [Ô]*[ô][Ô]
End Select
Call fncCarregalista(filtro)
End Sub


Avelino Sampaio 31/07/2011 11:15:29

Ivan,

A combinação dos três campos para filtragem o case é 6(1+2+3) e não 4

Case 6
filtro = [Ô]Processo like [ô]*[Ô] & Me!tx1 & [Ô]*[ô] AND Data like [ô]*[Ô] & Me!tx.Text & [Ô]*[ô]AND Vendedor like [ô]*[Ô] & Me!tx2 & [Ô]*[ô][Ô]


CASE 4 e CASE 5 seria para o uso simultânea de dois campos.

Sucesso!
Tópico encerrado , respostas não são mais permitidas