none
mostrar as pessoas que não bateram o ponto

    Pergunta

  • Srs tenho 2 Tabelas a Tabela Funcionario (com campos, codigo,nome,pis) 

    e uma tabela de apontamento chamada Marcacao (com campos Cracha(que é igual ao campo codigo da 1º tabela),Data_Hora.

    O que preciso Fazer, todo  dia 350 pessoas batem ponto, onde alimenta diariamente a tabela marcacao, porem que não bate fica como falta. Minha duvida é como fazer um select onde me mostre as pessoas que não bateram o ponto (na tabela Marcacao)num determinado dia.

    Provalvemente tenho que fazer um loop, mas não sei nem como começar.

    segunda-feira, 23 de julho de 2012 19:43

Respostas

  • Ola Marcos valeu pela força e Reinaldo, esse banco de dados que estou mexendo é um access do relogio da dimep / o relogio passa 1º a base de dados dele pra access pra depois exportalo em txt e depois ser convertido para sql server.

    Essa informações que estou buscando é em cima da base de dado em access, pra isso estou usando o sql lite. Apesar da ideia do ronaldo ser muito viavel em ms sql server, acho que não funciona na base de dados do access, por ser limitado, por isso estou testando o exemplo do marcos.

    Fiz dessas duas maneiras.

    ------------
    SELECT *
    FROM marcacao m Left OUTER join funcionario f
    On f.codigo = m.cracha 
    WHERE m.Data_Hora Like '17/7/2012%' 
    ORDER BY 1           
    ------------
    SELECT *
    FROM funcionario f Left OUTER join marcacao m
    On f.codigo = m.cracha 
    WHERE m.Data_Hora Like '17/7/2012%'
    ORDER BY 1

    Sei que o Cara 00000000000000000383

    ANTONIO MARIANO DOS SANTOS FILHO (Não veio pois estáva de Licença Paternide).

    e a query puxa bonitinho, porem preciso que somente os colaboradores que estão,

    não baterão ponto nessa data apareça no resultado, pode ser o codigo ou o nome.

    Realmente o Cracha 00000000000000000383 não apareceu

    • Marcado como Resposta Moises Gomes terça-feira, 24 de julho de 2012 20:33
    terça-feira, 24 de julho de 2012 12:32

Todas as Respostas

  • Moisés,

    faça um left outer join ligando essas duas tabelas e filtrando pela data do dia, onde vier registros nulos você considere que que o cara não bateu o ponto.

    Se for o caso coloque um CASE EntradaSaidaWHER NULL THEN "Não bateu ponto" ELSE EntradaSaida.

    segunda-feira, 23 de julho de 2012 20:09
  • Ola Leonardo tentei assim

    SELECT m.cracha,m.nome,m.data_hora
    FROM marcacao m Left OUTER JOIN funcionario f
    On m.cracha = f.codigo 

    e asssim

    SELECT m.cracha,m.nome,m.data_hora
    FROM marcacao m Left OUTER JOIN funcionario f
    On m.cracha = f.codigo 
    WHERE m.data_hora = '20/07/2012'

    Não saiu nenhum registro. é assim mesmo?

    Referente ao case não sei como fazer

    segunda-feira, 23 de julho de 2012 20:21
  • Moises,

    A consulta vai depender de como você quer os resultados. Vc quer ver no dia 20/07/2012 qual funcionário não tem marcação?

    Se for, a sua consulta será assim:

    select *
    from funcionario f left outer join marcacao m
    on f.codigo = m.cracha and m.DATA_hora = '2012-07-20'
    where m.CHAPA is null
    order by 1

    MAs se vc não tem uma data definida, aí o vc terá mais trabalho.

    O principal nisso é definir o que realmente vc quer trazer como resultado. Exemplifique se for o caso.


    Marco Antônio Pinheiro / MCTS - MCC http://marcoantoniopinheiro.blogspot.com

    segunda-feira, 23 de julho de 2012 21:02
  • OLA MOISÉS, BOA NOITE, MEU NOME É REINALDO, ESTOU INICIANDO NA ÁREA E ESTE É O SEGUNDO POST QUE RESPONDO!!!

    ACHO QUE UMA STORED PROCEDURE SERIA O MAIS INDICADO, VOCÊ EXECUTA A PROCEDURE E ENTRA COM A DATA COMO PARAMETRO:

    CREATE PROCEDURE STP_BATE_CARTAO @DATA DATETIME
    AS BEGIN
    SELECT
    F.CODIGO [CODFUN SEM MARCACÃO],
    F.NOME [NOME DO FUNCIONARIO],
    M.DATA_HORA [HORA DA MARCAÇÃO]
    FROM FUNCIONARIO F RIGHT JOIN
    MARCACAO M ON M.CRACHA = F.CODIGO 
    WHERE M.CRACHA IS NULL AND M.DATA_HORA = @DATA
    END

    -- TESTANDO
    EXEC STP_BATE_CARTAO '2012-07-20'

    SE DEU CERTO, O PRIMEIRO CAMPO MOSTRARÁ O CÓDIGO DO FUNCIONÁRIO QUE NÃO BATEU O CARTÃO.

    CASO NÃO APAREÇA NENHUM REGISTRO, VEJA SE O CAMPO MARCACAO.DATA_HORA ESTA DEFINIDO COM TIPO DE DADOS DATETIME, SE SIM SERÁ PRICISO ESPECIFICAR TAMBÉM A HORA AO EXECUTAR A STORED PROCEDURE OU ENTÃO DEFINIR O CAMPO COMO APENAS DATE CASO ESTEJA UTILIZANDO O SQL SERVER 2008. oU ENTÃO CRIAR UMA FUNÇÃO PARA OMITIR A PARTE DA HORA COMO RESULTADO.

    SE A RESPOSTA FOI DE AJUDA POR FAVOR, SE POSSÍVEL, MARQUE-A COMO UTIL.





    terça-feira, 24 de julho de 2012 02:29
  • Ola Marcos valeu pela força e Reinaldo, esse banco de dados que estou mexendo é um access do relogio da dimep / o relogio passa 1º a base de dados dele pra access pra depois exportalo em txt e depois ser convertido para sql server.

    Essa informações que estou buscando é em cima da base de dado em access, pra isso estou usando o sql lite. Apesar da ideia do ronaldo ser muito viavel em ms sql server, acho que não funciona na base de dados do access, por ser limitado, por isso estou testando o exemplo do marcos.

    Fiz dessas duas maneiras.

    ------------
    SELECT *
    FROM marcacao m Left OUTER join funcionario f
    On f.codigo = m.cracha 
    WHERE m.Data_Hora Like '17/7/2012%' 
    ORDER BY 1           
    ------------
    SELECT *
    FROM funcionario f Left OUTER join marcacao m
    On f.codigo = m.cracha 
    WHERE m.Data_Hora Like '17/7/2012%'
    ORDER BY 1

    Sei que o Cara 00000000000000000383

    ANTONIO MARIANO DOS SANTOS FILHO (Não veio pois estáva de Licença Paternide).

    e a query puxa bonitinho, porem preciso que somente os colaboradores que estão,

    não baterão ponto nessa data apareça no resultado, pode ser o codigo ou o nome.

    Realmente o Cracha 00000000000000000383 não apareceu

    • Marcado como Resposta Moises Gomes terça-feira, 24 de julho de 2012 20:33
    terça-feira, 24 de julho de 2012 12:32