- Este tópico contém 9 respostas, 3 vozes e foi atualizado pela última vez 13 anos, 4 meses atrás por rman.
-
AutorPosts
-
9 de setembro de 2011 às 9:46 pm #100715filipedcParticipante
Pessoal tenho uma tabela aqui TFPPON que possui os dias que um funcionario bateu ponto por exemplo
codfunc dtmov turno entrada saida
26 02/08/2011 1 18:00 23:00
26 02/08/2011 2 23:50 06:00
26 04/08/2011 1 18:00 23:00
26 04/08/2011 2 23:50 06:00So que preciso fazer um cartao de ponto pra ele e independente se o mesmo bateu o ponto ou nao, precisava que ele trouxesse todos os dias do mes.
Para trazer os horarios de entrada e saida eu fiz subquerys para cada horario para tudo ficar em um linha só e estou desconsiderando o turno entao o resultado do select esta assim
codfunc dtmov entrada1 saida1 entrada2 saida2
26 02/08/2011 18:00 23:00 23:50 06:00
26 04/08/2011 18:00 23:00 23:50 06:00So que o resultado que eu preciso seria:
codfunc dtmov entrada1 saida1 entrada2 saida2
26 01/08/2011
26 02/08/2011 18:00 23:00 23:50 06:00
26 03/08/2011
26 04/08/2011 18:00 23:00 23:50 06:00
26 05/08/2011Espero que possam me ajudar.
9 de setembro de 2011 às 11:02 pm #100719burgaParticipantePra pegar todos os dias de um mês:
select to_date('01/09/2011','DD/MM/YYYY') + level - 1 from dual
connect by level <= to_number(to_char(last_day(to_date('01/09/2011','DD/MM/YYYY')),'DD'));Aí você pode usar esse select como uma subconsulta no from fazendo OUTER JOIN pela data e retornando a data deste select ao invés de retornar a data da sua tabela de pontos…
9 de setembro de 2011 às 11:42 pm #100721rmanParticipante[quote=”burga”:1y7coppu]Pra pegar todos os dias de um mês:
select to_date('01/09/2011','DD/MM/YYYY') + level - 1 from dual
connect by level <= to_number(to_char(last_day(to_date('01/09/2011','DD/MM/YYYY')),'DD'));Aí você pode usar esse select como uma subconsulta no from fazendo OUTER JOIN pela data e retornando a data deste select ao invés de retornar a data da sua tabela de pontos…[/quote]
SQL ninja detected! 😯
10 de setembro de 2011 às 12:01 am #100722filipedcParticipante[quote=”burga”:x9cb6y0a]Pra pegar todos os dias de um mês:
select to_date('01/09/2011','DD/MM/YYYY') + level - 1 from dual
connect by level <= to_number(to_char(last_day(to_date('01/09/2011','DD/MM/YYYY')),'DD'));Aí você pode usar esse select como uma subconsulta no from fazendo OUTER JOIN pela data e retornando a data deste select ao invés de retornar a data da sua tabela de pontos…[/quote]
OK O SELECT PRA PEGAR OS DIAS DO MES ENTENDI SO QUE NAO CONSEGUI USAR ELE COM O OUTER JOIN TEM COMO EXEMPLIFICAR SEGUE ABAIXO O MEU SELECT
SELECT DISTINCT
*
FROM
TFPPON P
INNER JOIN TFPFUN F ON (P.CODFUNC = F.CODFUNC)
INNER JOIN TSIEMP E ON (P.CODEMP = E.CODEMP)
INNER JOIN TFPFCO FCO ON (F.CODFUNCAO = FCO.CODFUNCAO)
INNER JOIN TFPDEP D ON (F.CODDEP = D.CODDEP)
WHERE
P.CODFUNC = :CODFUNC AND
P.DTMOV >= 😀 TMOV1 AND
P.DTMOV <= 😀 TMOV2E CLARO QUE TEM TODOS OS CAMPOS QUE EU NECESSITO DECLARADO SO QUE SE EU COLOCAR FICA MTO CHEIO O SELECT
10 de setembro de 2011 às 9:25 am #100725rmanParticipante@filipedc
A ideia é listar todos dias e se tiver marcação de ponto trazer a marcação, em outras palavras:
SELECT *
FROM DIAS
LEFT JOIN TFPPON P ON P.DTMOV = DIAS.DIA
WHERE P.CODFUNC = :CODFUNC
AND P.DTMOV >= :DTMOV1
AND P.DTMOV <= :DTMOV2
Substituindo DIAS pelo SELECT temos:
SELECT *
FROM (
SELECT TO_DATE('01/09/2011', 'DD/MM/YYYY') + LEVEL - 1 DIA
FROM DUAL
CONNECT BY LEVEL = :DTMOV1
AND P.DTMOV <= :DTMOV2
12 de setembro de 2011 às 4:24 pm #100726filipedcParticipante[quote=”rman”:21zdt1gn]@filipedc
A ideia é listar todos dias e se tiver marcação de ponto trazer a marcação, em outras palavras:
SELECT *
FROM DIAS
LEFT JOIN TFPPON P ON P.DTMOV = DIAS.DIA
WHERE P.CODFUNC = :CODFUNC
AND P.DTMOV >= :DTMOV1
AND P.DTMOV <= :DTMOV2
Substituindo DIAS pelo SELECT temos:
[/quote]
SELECT *
FROM (
SELECT TO_DATE('01/09/2011', 'DD/MM/YYYY') + LEVEL - 1 DIA
FROM DUAL
CONNECT BY LEVEL = :DTMOV1
AND P.DTMOV <= :DTMOV2
@rman
Fiz do jeito que instruiu so que mesmo assim ele continuou trazendo somente os que estavam com marcacao de ponto talvez porque estamos dizendo que p.dtmov = dias.dia entao ele so vai trazer aquilo que for igual ao da tfppon nao???
12 de setembro de 2011 às 4:36 pm #100728filipedcParticipanteSEGUE ABAIXO COPIA DA QUERY PARA ANALISE
SELECT DISTINCT
E.NOMEFANTASIA AS “Empresa”,
SUBSTR(E.CGC,1,2) || ‘.’ || SUBSTR(E.CGC,3,3) || ‘.’ || SUBSTR(E.CGC,6,3) || ‘/’ || SUBSTR(E.CGC,9,4) || ‘-‘ || SUBSTR(E.CGC,13,2) AS “CNPJ”,
E.INSCESTAD AS “Inscrição Estadual”,
F.NOMEFUNC AS “Funcionario”,
F.PIS AS “Nº PIS”,
F.DTADM AS “Data Admissao”,
F.NUMCPS AS “Carteira de Trabalho”,
FCO.DESCRFUNCAO AS “Funcao”,
D.DESCRDEP AS “Departamento”,
DECODE(TO_NUMBER(TO_CHAR(DIAS.DIA, ‘D’)),1, ‘Domingo’,2, ‘Segunda’,3, ‘Terça’,4, ‘Quarta’,5, ‘Quinta’,6, ‘Sexta’,7,’Sábado’) AS “Dia Semana”,
DIAS.DIA,
(SELECT SUBSTR(LPAD(PON.ENTRADA,4,’0′),1,2) || ‘:’ || SUBSTR(LPAD(PON.ENTRADA,4,’0′),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 1 AND PON.DTMOV = DIAS.DIA) AS “Entrada 1”,
(SELECT SUBSTR(LPAD(PON.SAIDA,4,’0′),1,2) || ‘:’ || SUBSTR(LPAD(PON.SAIDA,4,’0′),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 1 AND PON.DTMOV = DIAS.DIA) AS “Saida 1”,
(SELECT SUBSTR(LPAD(PON.ENTRADA,4,’0′),1,2) || ‘:’ || SUBSTR(LPAD(PON.ENTRADA,4,’0′),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 2 AND PON.DTMOV = DIAS.DIA) AS “Entrada 2”,
(SELECT SUBSTR(LPAD(PON.SAIDA,4,’0′),1,2) || ‘:’ || SUBSTR(LPAD(PON.SAIDA,4,’0′),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 2 AND PON.DTMOV = DIAS.DIA) AS “Saida 2”
FROM ( SELECT TO_DATE(:DATA, ‘DD/MM/YYYY’) + LEVEL – 1 DIA
FROM DUAL
CONNECT BY LEVEL <= TO_NUMBER( TO_CHAR( LAST_DAY( TO_DATE( 😀 ATA, 'DD/MM/YYYY') ),'DD') ) ) DIAS
LEFT OUTER JOIN TFPPON P ON P.DTMOV = DIAS.DIA
INNER JOIN TFPFUN F ON P.CODFUNC = F.CODFUNC
INNER JOIN TSIEMP E ON P.CODEMP = E.CODEMP
INNER JOIN TFPFCO FCO ON F.CODFUNCAO = FCO.CODFUNCAO
INNER JOIN TFPDEP D ON F.CODDEP = D.CODDEP
WHERE
P.CODFUNC = :CODFUNC
ORDER BY DIAS.DIA12 de setembro de 2011 às 6:00 pm #100736burgaParticipanteUm problema está no seu WHERE, que está obrigando que se traga somente os registros com p.codfunc igual ao informado, então aí ele já mata os NULLS.
Você pode tentar colocar:
WHERE
P.CODFUNC = :CODFUNC
OR P.CODFUNC IS NULL12 de setembro de 2011 às 6:24 pm #100737filipedcParticipante[quote=”burga”:3s0kdi7k]Um problema está no seu WHERE, que está obrigando que se traga somente os registros com p.codfunc igual ao informado, então aí ele já mata os NULLS.
Você pode tentar colocar:
WHERE
[/quote]
P.CODFUNC = :CODFUNC
OR P.CODFUNC IS NULL@Burga
alterei o where e ainda continuou trazendo somente os que possuem ponto batido. Consegui fazer de outra maneira so que ficou bem assim, fiz sub’s query’s para todos os outros campos do relatorio. fazendo assim consegui trazer todas as datas..
SELECT
DECODE(TO_NUMBER(TO_CHAR(DIAS.DIA, ‘D’)),1, ‘Domingo’,2, ‘Segunda’,3, ‘Terça’,4, ‘Quarta’,5, ‘Quinta’,6, ‘Sexta’,7,’Sábado’) AS “Dia Semana”,
DIAS.DIA,
(SELECT SUBSTR(LPAD(PON.ENTRADA,4,’0′),1,2) || ‘:’ || SUBSTR(LPAD(PON.ENTRADA,4,’0′),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 1 AND PON.DTMOV = DIAS.DIA) AS “Entrada 1”,
(SELECT SUBSTR(LPAD(PON.SAIDA,4,’0′),1,2) || ‘:’ || SUBSTR(LPAD(PON.SAIDA,4,’0′),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 1 AND PON.DTMOV = DIAS.DIA) AS “Saida 1”,
(SELECT SUBSTR(LPAD(PON.ENTRADA,4,’0′),1,2) || ‘:’ || SUBSTR(LPAD(PON.ENTRADA,4,’0′),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 2 AND PON.DTMOV = DIAS.DIA) AS “Entrada 2”,
(SELECT SUBSTR(LPAD(PON.SAIDA,4,’0′),1,2) || ‘:’ || SUBSTR(LPAD(PON.SAIDA,4,’0′),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 2 AND PON.DTMOV = DIAS.DIA) AS “Saida 2”
FROM (SELECT TO_DATE(:DATA, ‘DD/MM/YYYY’) + LEVEL – 1 DIA
FROM DUAL
CONNECT BY LEVEL <= TO_NUMBER( TO_CHAR( LAST_DAY( TO_DATE(:DATA, 'DD/MM/YYYY') ),'DD') ) ) DIAS12 de setembro de 2011 às 8:32 pm #100743rmanParticipante[quote=”filipedc”:251aiisz][quote=”burga”:251aiisz]Um problema está no seu WHERE, que está obrigando que se traga somente os registros com p.codfunc igual ao informado, então aí ele já mata os NULLS.
Você pode tentar colocar:
WHERE
[/quote]
P.CODFUNC = :CODFUNC
OR P.CODFUNC IS NULL@Burga
alterei o where e ainda continuou trazendo somente os que possuem ponto batido. Consegui fazer de outra maneira so que ficou bem assim, fiz sub’s query’s para todos os outros campos do relatorio. fazendo assim consegui trazer todas as datas..
SELECT
DECODE(TO_NUMBER(TO_CHAR(DIAS.DIA, ‘D’)),1, ‘Domingo’,2, ‘Segunda’,3, ‘Terça’,4, ‘Quarta’,5, ‘Quinta’,6, ‘Sexta’,7,’Sábado’) AS “Dia Semana”,
DIAS.DIA,
(SELECT SUBSTR(LPAD(PON.ENTRADA,4,’0′),1,2) || ‘:’ || SUBSTR(LPAD(PON.ENTRADA,4,’0′),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 1 AND PON.DTMOV = DIAS.DIA) AS “Entrada 1”,
(SELECT SUBSTR(LPAD(PON.SAIDA,4,’0′),1,2) || ‘:’ || SUBSTR(LPAD(PON.SAIDA,4,’0′),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 1 AND PON.DTMOV = DIAS.DIA) AS “Saida 1”,
(SELECT SUBSTR(LPAD(PON.ENTRADA,4,’0′),1,2) || ‘:’ || SUBSTR(LPAD(PON.ENTRADA,4,’0′),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 2 AND PON.DTMOV = DIAS.DIA) AS “Entrada 2”,
(SELECT SUBSTR(LPAD(PON.SAIDA,4,’0′),1,2) || ‘:’ || SUBSTR(LPAD(PON.SAIDA,4,’0′),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 2 AND PON.DTMOV = DIAS.DIA) AS “Saida 2”
FROM (SELECT TO_DATE(:DATA, ‘DD/MM/YYYY’) + LEVEL – 1 DIA
FROM DUAL
CONNECT BY LEVEL <= TO_NUMBER( TO_CHAR( LAST_DAY( TO_DATE(:DATA, 'DD/MM/YYYY') ),'DD') ) ) DIAS[/quote]Me desculpe, falha minha, os filtros devem ser passado no LEFT JOIN, e não no WHERE como eu fiz.
SELECT DISTINCT
E.NOMEFANTASIA AS "Empresa",
SUBSTR(E.CGC,1,2) || '.' || SUBSTR(E.CGC,3,3) || '.' || SUBSTR(E.CGC,6,3) || '/' || SUBSTR(E.CGC,9,4) || '-' || SUBSTR(E.CGC,13,2) AS "CNPJ",
E.INSCESTAD AS "Inscrição Estadual",
F.NOMEFUNC AS "Funcionario",
F.PIS AS "Nº PIS",
F.DTADM AS "Data Admissao",
F.NUMCPS AS "Carteira de Trabalho",
FCO.DESCRFUNCAO AS "Funcao",
D.DESCRDEP AS "Departamento",
DECODE(TO_NUMBER(TO_CHAR(DIAS.DIA, 'D')),1, 'Domingo',2, 'Segunda',3, 'Terça',4, 'Quarta',5, 'Quinta',6, 'Sexta',7,'Sábado') AS "Dia Semana",
DIAS.DIA,
(SELECT SUBSTR(LPAD(PON.ENTRADA,4,'0'),1,2) || ':' || SUBSTR(LPAD(PON.ENTRADA,4,'0'),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 1 AND PON.DTMOV = DIAS.DIA) AS "Entrada 1",
(SELECT SUBSTR(LPAD(PON.SAIDA,4,'0'),1,2) || ':' || SUBSTR(LPAD(PON.SAIDA,4,'0'),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 1 AND PON.DTMOV = DIAS.DIA) AS "Saida 1",
(SELECT SUBSTR(LPAD(PON.ENTRADA,4,'0'),1,2) || ':' || SUBSTR(LPAD(PON.ENTRADA,4,'0'),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 2 AND PON.DTMOV = DIAS.DIA) AS "Entrada 2",
(SELECT SUBSTR(LPAD(PON.SAIDA,4,'0'),1,2) || ':' || SUBSTR(LPAD(PON.SAIDA,4,'0'),3,2) FROM TFPPON PON WHERE PON.CODFUNC = :CODFUNC AND PON.TURNO = 2 AND PON.DTMOV = DIAS.DIA) AS "Saida 2"
FROM ( SELECT TO_DATE(:DATA, 'DD/MM/YYYY') + LEVEL - 1 DIA
FROM DUAL
CONNECT BY LEVEL <= TO_NUMBER( TO_CHAR( LAST_DAY( TO_DATE( :DATA, 'DD/MM/YYYY') ),'DD') ) ) DIAS
LEFT OUTER JOIN TFPPON P ON P.DTMOV = DIAS.DIA AND P.CODFUNC = :CODFUNC
INNER JOIN TFPFUN F ON P.CODFUNC = F.CODFUNC
INNER JOIN TSIEMP E ON P.CODEMP = E.CODEMP
INNER JOIN TFPFCO FCO ON F.CODFUNCAO = FCO.CODFUNCAO
INNER JOIN TFPDEP D ON F.CODDEP = D.CODDEP
ORDER BY DIAS.DIA
-
AutorPosts
- Você deve fazer login para responder a este tópico.