- Este tópico contém 9 respostas, 3 vozes e foi atualizado pela última vez 14 anos, 6 meses atrás por
rman.
-
AutorPosts
-
9 de setembro de 2011 às 9:46 pm #100715
filipedc
ParticipantePessoal 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 #100719burga
ParticipantePra 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 #100721rman
Participante[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 #100722filipedc
Participante[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 #100725rman
Participante@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 #100726filipedc
Participante[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 #100728filipedc
ParticipanteSEGUE 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 #100736burga
ParticipanteUm 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 #100737filipedc
Participante[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 #100743rman
Participante[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.