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.040
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
  #7  
Antiguo 03-03-2013
Avatar de Spynosa
Spynosa Spynosa is offline
Miembro
 
Registrado: nov 2004
Ubicación: Ecija - Sevilla
Posts: 99
Poder: 20
Spynosa Va por buen camino
Si que funciona Casimiro, creo que desde la version 2.0, echale un vistazo a esto http://www.orafaq.com/node/1879.
Responder Con Cita
  #8  
Antiguo 03-03-2013
Avatar de Spynosa
Spynosa Spynosa is offline
Miembro
 
Registrado: nov 2004
Ubicación: Ecija - Sevilla
Posts: 99
Poder: 20
Spynosa Va por buen camino
novato_erick creo que la funcion ROW_NUMBER() no esta soportada en firebird tendras que buscar una similar
mira este enlace por si te sirve http://www.firebirdfaq.org/faq343
Responder Con Cita
  #9  
Antiguo 03-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Ese enlace es de oracle, no de firebird.
Responder Con Cita
  #10  
Antiguo 03-03-2013
Avatar de Spynosa
Spynosa Spynosa is offline
Miembro
 
Registrado: nov 2004
Ubicación: Ecija - Sevilla
Posts: 99
Poder: 20
Spynosa Va por buen camino
pero funciona con firebird

un saludo
Responder Con Cita
  #11  
Antiguo 03-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿En la documentación de firebird viene eso?, es que no lo he visto nunca.
Responder Con Cita
  #12  
Antiguo 03-03-2013
Avatar de Spynosa
Spynosa Spynosa is offline
Miembro
 
Registrado: nov 2004
Ubicación: Ecija - Sevilla
Posts: 99
Poder: 20
Spynosa Va por buen camino
No se si viene pero te aseguro que funciona en firebird, yo tengo varias consultas
complejas con with y la idea la cogi de esa página
Responder Con Cita
  #13  
Antiguo 03-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
Ah si claro casimiro envio este pdf para que veas...

pero aun asi no lo he logrado tengo que documentarme...

saludos
Archivos Adjuntos
Tipo de Archivo: rar funcionesfirebirdwindowing.rar (201,1 KB, 18 visitas)
Responder Con Cita
  #14  
Antiguo 03-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En ese documento no hablan de ningún comando o función que se llame "with",
Y además pone que es para firebird 3, aunque está fechado en 2011
Responder Con Cita
  #15  
Antiguo 04-03-2013
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 23
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Cita:
Empezado por Casimiro Notevi Ver Mensaje
En ese documento no hablan de ningún comando o función que se llame "with",
Y además pone que es para firebird 3, aunque está fechado en 2011
Casimiro, ya en la version 2.5 está operativa este tipo de sentencias, no recuerdo si desde la 2.0 en adelante...

Mira el archivo de texto que esta en ?:\Program Files\Firebird\Firebird_2_5\doc\sql.extensions\README.common_table_expressions.txt ahí hay una explicación y ejemplos del uso de esta sentencias que son muy utiles.

Inclusive se puede utilizar recursividad para obtener información.

Saludos cordiales
Responder Con Cita
  #16  
Antiguo 05-03-2013
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Poder: 14
pacopenin Va por buen camino
Yo tampoco conocía esa forma de SQL.
http://firebirdsql.su/doku.php?id=recursive. En esta página aparece la sintaxis y algún ejemplo.
__________________
http://www.gestionportable.com
Responder Con Cita
  #17  
Antiguo 05-03-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Curioso, y está desde la 2.1
Responder Con Cita
  #18  
Antiguo 05-03-2013
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
yo haría algo así, en pseudo código
Código SQL [-]
select EMPLEADOS.Nombre, EMPLEADOS.Apellidos,
max( case when TMARCACIONES.hora entre 8:00 y 9:00 then TMARCACIONES.hora else 0) AS ENTRADA,
max( case when TMARCACIONES.hora entre 12:00 y 13:00 then TMARCACIONES.hora else 0) AS SALIDA_ ALMUERZO,
max( case when TMARCACIONES.hora entre 14:00 y 15:00 then TMARCACIONES.hora else 0) AS ENTRADA_TARDE,
max( case when TMARCACIONES.hora entre 18:00 y 19:00 then hora else 0) AS SALIDA_JORNADA
FROM TMARCACIONES WHERE CAST(HORA as Date) = :Fecha
inner join EMPLEADOS ON EMPLEADOS.ID_EMPLEADOS = TMARCACIONES.ID_EMPLEADOS
group by EMPLEADOS.Nombre, EMPLEADOS.Apellidos


Ni with ni chanflainas. Supongo que es lo mismo que

Código SQL [-]
select TABLA.* from 
( select campo1, campo2 from TABLAX  bla bla bla ) TABLA
group by bla bla 
order by bla bla

Sólo falta ver qué pasa cuando una persona no ficha entre esas horas, excepciones de salidas la médico, etc etc que deberían ser recogidas también.


Espero que te sirva de ayuda.

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
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 11:11:24.


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