Pular para o conteúdo
Visualizando 10 posts - 1 até 10 (de 10 do total)
  • Autor
    Posts
  • #100715
    filipedc
    Participante

      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:00

      So 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:00

      So 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/2011

      Espero que possam me ajudar.

      #100719
      burga
      Participante

        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…

        #100721
        rman
        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! 😯

          #100722
          filipedc
          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 <= 😀 TMOV2

            E CLARO QUE TEM TODOS OS CAMPOS QUE EU NECESSITO DECLARADO SO QUE SE EU COLOCAR FICA MTO CHEIO O SELECT

            #100725
            rman
            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

              #100726
              filipedc
              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:


                SELECT *
                FROM (
                SELECT TO_DATE('01/09/2011', 'DD/MM/YYYY') + LEVEL - 1 DIA
                FROM DUAL
                CONNECT BY LEVEL = :DTMOV1
                AND P.DTMOV <= :DTMOV2
                [/quote]

                @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???

                #100728
                filipedc
                Participante

                  SEGUE 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.DIA

                  #100736
                  burga
                  Participante

                    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
                    P.CODFUNC = :CODFUNC
                    OR P.CODFUNC IS NULL

                    #100737
                    filipedc
                    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
                      P.CODFUNC = :CODFUNC
                      OR P.CODFUNC IS NULL
                      [/quote]

                      @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

                      #100743
                      rman
                      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
                        P.CODFUNC = :CODFUNC
                        OR P.CODFUNC IS NULL
                        [/quote]

                        @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

                      Visualizando 10 posts - 1 até 10 (de 10 do total)
                      • Você deve fazer login para responder a este tópico.
                      plugins premium WordPress