MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    [Resolvido]Where Not Exists

    Compartilhe
    avatar
    caiosouza
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 309
    Registrado : 05/12/2016

    [Resolvido]Where Not Exists

    Mensagem  caiosouza em 8/2/2018, 12:48

    Bom dia a todos,

    Uso um botão para inserir Treinamentos em uma tabela a partir de uma Listbox.
    Gostaria que antes de inserir as linhas na tabela o código verificasse os seguintes itens:

    1 - Verificar se os treinamentos já não foram lançados, filtrando pelo N_COLABORADOR e N_TREINAMENTO
    2 - Se já foram lançados, verificar se o treinamento esta em dia (DATA_TREINAMENTO)=Nulo, se não estiver, lançar mesmo assim mesmo que já exista.

    Segue código:

    Código:

    Private Sub SALVAR_Click()
    On Error Resume Next
        Dim N As Long
       
        For N = 0 To Me.LISTA_TREINAMENTOS.ListCount - 1
            CurrentDb.Execute "INSERT INTO TAB_HISTORICO(N_COLABORADOR, COLABORADOR, N_TREINAMENTO, TREINAMENTO, SETOR, CELULA, N_CELULA, N_REVISAO) VALUES " & _
    "('" & Me.TXT_REGISTRO & "', '" & Me.COLABORADOR & "', '" & Me.LISTA_TREINAMENTOS.Column(3, N) & "', '" & Me.LISTA_TREINAMENTOS.Column(0, N) & "', '" & Me.SETOR & "'," & _
    "'" & Me.CELULA.Column(0) & "', '" & Me.CELULA.Column(1) & "', '" & Me.LISTA_TREINAMENTOS.Column(1, N) & "') " & _

    "WHERE NOT EXISTS (SELECT * FROM TAB_HISTORICO WHERE TAB_HISTORICO.N_TREINAMENTO = Me.LISTA_TREINAMENTOS.Column(3))" 'O filtro é feito aqui...

        Next
    DoCmd.GoToRecord , , acNewRec
    End Sub


    .................................................................................
    A persistência leva ao sucesso!

    frankhosaka
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 19
    Registrado : 22/12/2017

    Re: [Resolvido]Where Not Exists

    Mensagem  frankhosaka em 10/2/2018, 12:09

    Não sabia que existia a cláusula NOT EXISTS no SQL, e também nunca criei registros através do SQL.

    O maior problema é que não tenho nenhuma experiência na área de treinamento, mas posso improvisar aqui:

    Vamos supor que a lista de treinamento seja assim: respirar, tossir, sentar.

    No formulário principal, eu vejo que o cliente Reclama Muito da Silva não fez nenhum treinamento, mesmo assim eu vou apertar o botão Registrar Treinamento, e aí o Access vai no Histórico do Treinamento e cria os seguintes registros:

    10/02/18 Reclama Muito da Silva - Respirar.
    10/02/18 Reclama Muito da Silva - Tossir.
    10/02/18 Reclama Muito da Silva - Sentar.

    Ou seja, tudo o que você quer é uma lista de todos os treinamentos para qualquer cliente?
    avatar
    caiosouza
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 309
    Registrado : 05/12/2016

    Re: [Resolvido]Where Not Exists

    Mensagem  caiosouza em 24/3/2018, 15:23

    @frankhosaka, boa tarde!

    Não, na verdade só preciso que o cód. em SQL insira os dados da tabela x na tabela y, porém antes disso deve ser feita uma verificação na tabela y pra ver se já não existe treinamentos já lançados e dentro do prazo.

    Ex.:
    Treinei o Pedro, no dia 24/03/18 e o treinamento do Pedro tem validade de 12 meses (vence em 24/03/19*), quando eu for realizar algum agendamento em massa preciso que o SQL verifique os treinamento do Pedro e se o treinamento dele ainda não tiver vencido, simplesmente não insere os dados na tabela y.


    .................................................................................
    A persistência leva ao sucesso!

    frankhosaka
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 19
    Registrado : 22/12/2017

    Re: [Resolvido]Where Not Exists

    Mensagem  frankhosaka em 24/3/2018, 15:50

    Eu não sou muito bom com o SQL, antes usaria as ferramentas básicas.
    Criaria uma consulta na tabela y, onde um campo iria retornar "vencido" se o último treinamento do aluno for superior a 12 meses ou se não há nenhum treinamento.
    Baseado no resultado da consulta da tabela y, iria acrescentar a tabela x no y, mas usando a ferramenta consulta criar tabela. Se a tabela sair errada, é só deletar, deixando a tabela y intacta.
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7030
    Registrado : 05/11/2009

    Re: [Resolvido]Where Not Exists

    Mensagem  Alexandre Neves em 25/3/2018, 20:55

    Boa noite,
    Veja se é isto
    Código:
    Private Sub SALVAR_Click()
    On Error Resume Next
        Dim N As Long
       
        For N = 0 To Me.LISTA_TREINAMENTOS.ListCount - 1
            CurrentDb.Execute "INSERT INTO TAB_HISTORICO(N_COLABORADOR, COLABORADOR, N_TREINAMENTO, TREINAMENTO, SETOR, CELULA, N_CELULA, N_REVISAO) VALUES " & _
    "('" & Me.TXT_REGISTRO & "', '" & Me.COLABORADOR & "', '" & Me.LISTA_TREINAMENTOS.Column(3, N) & "', '" & Me.LISTA_TREINAMENTOS.Column(0, N) & "', '" & Me.SETOR & "'," & _
    "'" & Me.CELULA.Column(0) & "', '" & Me.CELULA.Column(1) & "', '" & Me.LISTA_TREINAMENTOS.Column(1, N) & "') " & _

    "WHERE NOT EXISTS (SELECT * FROM TAB_HISTORICO WHERE TAB_HISTORICO.N_TREINAMENTO =" & Me.LISTA_TREINAMENTOS.Column(3) & " and  N_COLABORADOR=" & Me.COLABORADOR & ")" 'O filtro é feito aqui...

        Next
    DoCmd.GoToRecord , , acNewRec
    End Sub


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo
    avatar
    caiosouza
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 309
    Registrado : 05/12/2016

    Re: [Resolvido]Where Not Exists

    Mensagem  caiosouza em 26/3/2018, 13:28

    Caro Alexandre, bom dia!

    A partir da sua lógica de raciocínio, alterei o código conforme abaixo:

    Código:
           CurrentDb.Execute "INSERT INTO TAB_HISTORICO(N_COLABORADOR, COLABORADOR, N_TREINAMENTO, TREINAMENTO, SETOR, CELULA, N_CELULA, N_REVISAO) VALUES " & _
    "(" & Me.TXT_REGISTRO & ", '" & Me.COLABORADOR & "', " & Me.LISTA_TREINAMENTOS.Column(3, N) & ", '" & Me.LISTA_TREINAMENTOS.Column(0, N) & "', '" & Me.SETOR & "'," & _
    "'" & Me.CELULA.Column(0) & "', " & Me.CELULA.Column(1) & ", " & Me.LISTA_TREINAMENTOS.Column(1, N) & ") " & _
    "WHERE NOT EXISTS (SELECT * FROM TAB_HISTORICO WHERE [N_TREINAMENTO]=" & Me.LISTA_TREINAMENTOS.Column(3, N) & " AND [N_COLABORADOR]=" & Me.TXT_REGISTRO & ")" 'O filtro é feito aqui...

    Porém agora me traz o erro: Ponto e vírgula (";") faltando no final da instrução SQL. (Erro 3137), já coloquei o ";" no final, porém o erro persiste.

    A ideia é o código verificar na TAB_HISTORICO e oque não tiver inserir na TAB_HISTORICO.


    .................................................................................
    A persistência leva ao sucesso!
    avatar
    Alexandre Neves
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 7030
    Registrado : 05/11/2009

    Re: [Resolvido]Where Not Exists

    Mensagem  Alexandre Neves em 27/3/2018, 15:16

    Boa tarde,
    Veja agora
    CurrentDb.Execute "INSERT INTO TAB_HISTORICO(N_COLABORADOR, COLABORADOR, N_TREINAMENTO, TREINAMENTO, SETOR, CELULA, N_CELULA, N_REVISAO) VALUES (" & Me.TXT_REGISTRO & ", '" & Me.COLABORADOR & "', " & Me.LISTA_TREINAMENTOS.Column(3, N) & ", '" & Me.LISTA_TREINAMENTOS.Column(0, N) & "', '" & Me.SETOR & "'," & _
    "'" & Me.CELULA.Column(0) & "', " & Me.CELULA.Column(1) & ", " & Me.LISTA_TREINAMENTOS.Column(1, N) & ") " & _
    "WHERE N_TREINAMENTO & '-' & N_COLABORADOR NOT IN ('" & Me.LISTA_TREINAMENTOS.Column(3, N) & "-" & Me.TXT_REGISTRO & "')"


    .................................................................................
    Access 2010. Mande bd que dê para testar (indique a versão). Não peça para fazer o que já tem feito. Dê todos os detalhes.
    Não coloquem entraves como senhas, esconder controlos, etc. Disponibilizem o mais limpo possível
    Só respondo a mensagens privadas, se forem de assunto privado; às outras não respondo.
    Quem trabalha e mata a fome não come o pão de ninguém; mas quem não trabalha e come, come sempre o pão de alguém. António Aleixo
    avatar
    caiosouza
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 309
    Registrado : 05/12/2016

    Re: [Resolvido]Where Not Exists

    Mensagem  caiosouza em 3/4/2018, 15:33

    Alexandre Neves, bom dia!

    Tópico solucionado da seguinte forma:

    Código:

    If DCount("N_COLABORADOR", "TAB_HISTORICO", "[N_COLABORADOR]=" & IntReg & " AND [TREINAMENTO]='" & StrTreinamento & "'") < 1 Then
        CurrentDb.Execute "INSERT INTO TAB_HISTORICO(N_COLABORADOR, COLABORADOR, TREINAMENTO, SETOR, CELULA, N_REVISAO, CARGA_HORARIA, TIPO) VALUES " & _
        "(" & IntReg & ", '" & StrColaborador & "', '" & StrTreinamento & "', '" & StrSetor & "', '" & StrCelula & "'," & NumRev & ",'" & HorCarga & "', '" & StrTipo & "')"
    End If

    Obrigado!


    .................................................................................
    A persistência leva ao sucesso!

      Data/hora atual: 17/11/2018, 03:11