Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-03-2013
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Funciones que no tolera firebird 2.5

Hola chicos como están nuevamente?

tengo que obtener un resultado como este:

Cita:
id_depto---id_empleado----Fecha------HoraEntrada-----HoraSalida------HoraEntrada1---HoraSalida1
1-----------5-----------19/09/2012------08:31:00------12:38:00--------14:30:00------18:50:00
1-----------7-----------19/09/2012------08:19:00------12:34:00--------14:26:00------19:24:00
1-----------12----------19/09/2012------08:06:00------15:22:00 --------NULL-----------NULL
1-----------13----------19/09/2012------07:03:00------17:08:00 ------- NULL-----------NULL
La informacion se obtiene de las siguientes tablas:
Código SQL [-]
CREATE TABLE TMARCACIONES (
  ID_MARCAS INTEGER NOT NULL,
  ID_EMPLEADOS INTEGER NOT NULL,
  HORA TIMESTAMP DEFAULT 'NOW' NOT NULL);


ALTER TABLE TMARCACIONES ADD PRIMARY KEY (ID_MARCAS);


SET TERM ^ ;

CREATE TRIGGER BI_TMARCACIONES_ID_MARCAS FOR TMARCACIONES
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.ID_MARCAS IS NULL) THEN
      NEW.ID_MARCAS = GEN_ID(TMARCACIONES_ID_MARCAS_GEN, 1);
END^

ahora trato de hacerlo con la siguiente consulta:

Código SQL [-]
WITH HORASEMPL AS 
(
SELECT ID_EMPLEADOS, HORA, ROW_NUMBER() OVER (PARTITION BY ID_EMPLEADOS ORDER BY HORA) AS IDE 
    FROM TMARCACIONES WHERE CAST(HORA as Date) = Fecha
) 
SELECT 
 he.IDEMPLEADO, CAST(he.HORAMARCA as Date) AS Fecha, CAST(he.HORAMARCA as time) As HoraEntrada, CAST(he.HORAMARCA as time) As HoraSalidaAlmuerzo
        ,CAST(he.HORAMARCA as time) As HoraEntradaAlmuerzo,CAST(he.HORAMARCA as time) As HoraSalida = CASE 
        WHEN CAST(HORA as TIME) = CAST(f.HORA as TIME) then NULL
        WHEN CAST(HORA as TIME) = CAST(s.HORA as TIME) then NULL
        ELSE CAST(HORA as TIME)
         END
FROM HORASEMPL he
LEFT JOIN (SELECT id_empleados, MIN(HoraMarca) HoraMarca FROM HORASEMPL WHERE IDE > 1 GROUP BY IdEmpleado)as h ON h.id_empleados = he.id_empleados
LEFT JOIN (SELECT id_empleados, MIN(HoraMarca) HoraMarca FROM HORASEMPL WHERE IDE > 2 GROUP BY IdEmpleado) AS f ON f.id_empleados = he.id_empleados
LEFT JOIN (SELECT id_empleados, max(HoraMarca) HoraMarca FROM HORASEMPL WHERE IDE > 1 GROUP BY IdEmpleado) AS g ON g.id_empleados = he.id_empleados

ORDER BY he.IDEMPLEADO

alguna parte esta mal porque me manda lo siguiente:

Cita:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 3, column 46.
(.
no se a que se deba o si alguien conoce alguna forma de hacerlo mejor...

Saludos


novato_erick
Responder Con Cita
  #2  
Antiguo 02-03-2013
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No entiendo bien la sentencia sql, pero me parece que la segunda parte seria asi:
Código SQL [-]
WITH HORASEMPL AS 
(
SELECT ID_EMPLEADOS, HORA, ROW_NUMBER() OVER (PARTITION BY ID_EMPLEADOS ORDER BY HORA) AS IDE 
    FROM TMARCACIONES WHERE CAST(HORA as Date) = Fecha
) 
SELECT 
 he.IDEMPLEADO, CAST(he.HORAMARCA as Date) AS Fecha, CAST(he.HORAMARCA as time) As HoraEntrada, CAST(he.HORAMARCA as time) As HoraSalidaAlmuerzo
        ,CAST(he.HORAMARCA as time) As HoraEntradaAlmuerzo,CAST(he.HORAMARCA as time) As HoraSalida = CASE 
        WHEN CAST(HORA as TIME) = CAST(f.HORA as TIME) then NULL
        WHEN CAST(HORA as TIME) = CAST(s.HORA as TIME) then NULL
        ELSE CAST(HORA as TIME)
         END

LEFT JOIN (SELECT id_empleados, MIN(HoraMarca) HoraMarca FROM HORASEMPL WHERE IDE > 1 GROUP BY IdEmpleado)as h ON h.id_empleados = he.id_empleados
LEFT JOIN (SELECT id_empleados, MIN(HoraMarca) HoraMarca FROM HORASEMPL WHERE IDE > 2 GROUP BY IdEmpleado) AS f ON f.id_empleados = he.id_empleados
LEFT JOIN (SELECT id_empleados, max(HoraMarca) HoraMarca FROM HORASEMPL WHERE IDE > 1 

FROM HORASEMPL he

GROUP BY IdEmpleado) AS g ON g.id_empleados = he.id_empleados
ORDER BY he.IDEMPLEADO
Saludos
__________________
Siempre Novato
Responder Con Cita
  #3  
Antiguo 02-03-2013
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Que tal caral como estas?

Trataré de explicar mi sentencia

Código SQL [-]
WITH HORASEMPL AS /*Esta es mi tabla Temporal creada*/
(
SELECT ID_EMPLEADOS, HORA, ROW_NUMBER() OVER (PARTITION BY ID_EMPLEADOS ORDER BY HORA) AS IDE --* ROW_NUMBER() OVER (PARTITION BY ID_EMPLEADOS ORDER BY HORA) AS IDE
 /* Aquí es donde en teoria en sql Server funciona pero en firebird no estoy muy claro pienso que es igual */
    FROM TMARCACIONES WHERE CAST(HORA as Date) = :Fecha /* Parámetro de Búsqueda por Fecha ejemplo solo quiero las marcaciones de la fecha designada*/
) 
SELECT 
 he.IDEMPLEADO, CAST(he.HORAMARCA as Date) AS Fecha, CAST(he.HORAMARCA as time) As HoraEntrada, CAST(he.HORAMARCA as time) As HoraSalidaAlmuerzo
        ,CAST(he.HORAMARCA as time) As HoraEntradaAlmuerzo,CAST(he.HORAMARCA as time) As HoraSalida = CASE 
        WHEN CAST(HORA as TIME) = CAST(f.HORA as TIME) then NULL
        WHEN CAST(HORA as TIME) = CAST(s.HORA as TIME) then NULL
        ELSE CAST(HORA as TIME)
         END  /*Aqui recuerda por lo general el empleado realiza cuatro (4) marcaciones diferentes en el dia trato de traer con el left join dichas marcaciones llevandolas todo a mi tabla temporar
FROM HORASEMPL he
LEFT JOIN (SELECT id_empleados, MIN(HoraMarca) HoraMarca FROM HORASEMPL WHERE IDE > 1 GROUP BY IdEmpleado)as h ON h.id_empleados = he.id_empleados
LEFT JOIN (SELECT id_empleados, MIN(HoraMarca) HoraMarca FROM HORASEMPL WHERE IDE > 2 GROUP BY IdEmpleado) AS f ON f.id_empleados = he.id_empleados
LEFT JOIN (SELECT id_empleados, max(HoraMarca) HoraMarca FROM HORASEMPL WHERE IDE > 1 GROUP BY IdEmpleado) AS g ON g.id_empleados = he.id_empleados

ORDER BY he.IDEMPLEADO

Lo he hecho de una manera simple por ejemplo:

Código SQL [-]
   select DISTINCT d.DEPARTAMENTO,
        e.ID_EMPLEADOS,
        e.CEDULA_EMPL,
        e.NOMBRE_EMPL   Nombre,
        e.APELLIDO1_EMPL   Apellido,
        e.APELLIDO2_EMPL   "Segundo Apellido",
        e.COD_CLAVE,
        CAST(m.HORA as time)   Marcacion
        from 
            TEMPLEADOS e,
            TEMP_DEPART ep,
            TDEPARTAMENTOS d,
            TMARCACIONES m
           where e.ID_EMPLEADOS = m.ID_EMPLEADOS
               and e.ID_EMPLEADOS =:idE 
                and e.ID_EMPLEADOS = ep.ID_EMPLEADOS
           and d.ID_DEPTOS = ep.ID_DEPTOS 
                and CAST(m.HORA as DATE) = :fechaE
                group by d.DEPARTAMENTO,e.ID_EMPLEADOS,
                        e.CEDULA_EMPL,
                        e.ID_EMPLEADOS,
                        e.NOMBRE_EMPL,
                        e.APELLIDO1_EMPL,
                        e.APELLIDO2_EMPL,
                        e.COD_CLAVE,m.HORA

pero me muestra mas o menos este resultado que no es el deseado:

Cita:
DEPARTAMENTO----ID_EMPLEADO---CED_EMPLEADO----NOMBRE----APELLIDO---MARCACION
CALZADO-------------44--------------8-555-55--------MARIA-----VERGARA----09:58:27
CALZADO-------------44--------------8-555-55--------MARIA-----VERGARA----12:01:51
CALZADO-------------44--------------8-555-55--------MARIA-----VERGARA----13:00:42
CALZADO-------------44--------------8-555-55--------MARIA-----VERGARA----19:56:17
y necesito esto:

Cita:
DEPARTAMENTO----ID_EMPLEADO---CED_EMPLEADO----NOMBRE----APELLIDO---HORAENTRADA----HORASALIDAALMUERZO----HORAENTRADAALMUERZO-------SALIDA
CALZADO-------------44--------------8-555-55--------MARIA-----VERGARA-----09:58:27-----------12:01:51------------------13:00:42-----------------19:56:17
Aun no lo he logrado



Saludos
Responder Con Cita
  #4  
Antiguo 02-03-2013
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No se como tienes las tablas.
Tampoco entiendo bien el sql (es muy avanzado para mi).
Yo hice un programa de marcado de entradas y salidas de los empleados y no tengo tantas cosas raras como tu .
Te paso el link del programa tal vez te ayude de algo.
Usa un componente para cargar una foto, ya que toma la foto del empleado cada vez que marca (para evitar que hagan trampa).
Saludos
__________________
Siempre Novato
Responder Con Cita
  #5  
Antiguo 02-03-2013
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Caral Agradezco mucho Tu colaboración le hechare un vistazo... pero aun necesito realizar la consulta en sql..

En caso que encuentre solución presentaré la solución...

Saludos
Responder Con Cita
  #6  
Antiguo 02-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Código SQL [-]
WITH ...
(
SELECT ...
) 
SELECT ...

Nunca había visto hacer un select de esa forma, ¿with? y dos select seguidos, ¿eso funciona?
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
funciones php para firebird novato_erick PHP 13 08-03-2012 17:35:24
funciones de firebird micayael Firebird e Interbase 6 28-05-2011 22:22:25
¿Funciones estadísticas para FireBird 2.0? Angel Fernández Firebird e Interbase 12 16-03-2008 04:25:49
Existen funciones de usuario en firebird con plsql ASAPLTDA Firebird e Interbase 1 05-10-2006 03:06:31
UDF funciones / Functions firebird ASAPLTDA Firebird e Interbase 3 01-04-2005 17:38:26


La franja horaria es GMT +2. Ahora son las 09:06:07.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi