Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como hacer esta consulta (https://www.clubdelphi.com/foros/showthread.php?t=54493)

BlueSteel 20-03-2008 17:07:28

Como hacer esta consulta
 
Hola

Tengo un programa en donde debo realizar un informe de marcado.... la información que debo mostrar viene así (desde una consulta sql logro esto)

trabajo con SQL 2000 Server y Delphi 7

E/S Ficha Fecha Hora (Orden de las columnas)
1 1013 17/03/2008 18:00
0 1013 17/03/2008 20:01
1 1013 18/03/2008 17:50
0 1013 18/03/2008 20:11
1 1013 19/03/2008 18:05
0 1013 19/03/2008 19:57

pero necesito mostrar así los datos...

E Ficha Fecha Hora S Ficha Fecha Hora
1 1013 17/03/2008 18:00 0 1013 17/03/2008 20:01
1 1013 18/03/2008 17:50 0 1013 18/03/2008 20:11
1 1013 19/03/2008 18:05 0 1013 19/03/2008 19:57

Esto se puede realizar en una consulta SQL ??? bueno, la idea es que me muestre las entrada y salida de un mismo dia.... el otro problema que tengo... es que existen personas que marcan 4 o 6 veces en el día...

Si alguien tiene una idea de como realizar esto. ..??

poliburro 20-03-2008 17:35:13

Podrías mostrar la estructura de la tabla?

gluglu 20-03-2008 17:45:58

Con una subconsulta :

Código SQL [-]
Select E.E, E.Ficha as Ficha_E, E.Fecha as Fecha_E, E.Hora as Hora_E
(Select S.S, S.Ficha as Ficha_S, S.Fecha as Fecha_S, S.Hora as Hora_S
 from Tu_Tabla S
 where S.S = 0 and S.Fecha = E.Fecha)
from Tu_Tabla E where E.E = 1

BlueSteel 20-03-2008 19:10:17

Cita:

Empezado por poliburro (Mensaje 274377)
Podrías mostrar la estructura de la tabla?

La estructura es

Tabla: Horario
Hor_Numero Numeric -> Incremental
Per_Nro Varchar(4) -> Numero asignado al funcionario
Hor_Tipo Char(1) -> Tipo de Evento 1 -> Entrada..... 0 -> Salida
Hor_Fecha DateTime -> Fecha y Hora del Evento

Código SQL [-]
Select Hor_Tipo, Per_Nro, CONVERT(Char(10), Hor_Fecha, 103) AS Fecha, CONVERT(Char(8), Hor_Fecha, 108) AS Hora
From  Horario

con la sentencia anterior me entrega esto
1 1013 17/03/2008 18:00
0 1013 17/03/2008 20:01
1 1013 18/03/2008 17:50
0 1013 18/03/2008 20:11
1 1013 19/03/2008 18:05
0 1013 19/03/2008 19:57

poliburro 20-03-2008 20:39:51

Ok, lo que necesitamos es ver el movimiento de entrada y salida para cada día de la semana. Sencillo:

Vamos a generar los dominios para cada tipo de evento y para cada día de la semana considerando que en una fecha existen dos movimientos (si existieran más, se tienen que hacer consideraciones adicionales),
así que tomaremos como referencia la fecha


Código SQL [-]
//Para las entradas

Select Hor_Tipo As E, Per_Nr As FichaE, 
       CONVERT(Char(10), Hor_Fecha, 103) AS FechaE,
       CONVERT(Char(8), Hor_Fecha, 108) AS HoraE
  From Horario
 Where HorTipo = 1

// Para las salidas

Select Hor_Tipo As S, Per_Nr As FichaS, 
       CONVERT(Char(10), Hor_Fecha, 103) AS FechaS
       CONVERT(Char(8), Hor_Fecha, 108) AS HoraS
  From Horario
 Where HorTipo = 0


Ahora obtenemos el producto de las tablas

Código SQL [-]
   Select Entrada.E, Entrada.FichaE, Entrada.FechaE, Entrada.HoraE,
          Salida.S,  Saalida.FichaS, Entrada.FechaS, Entrada.HoraS
     From (
           Select Hor_Tipo As E, Per_Nr As FichaE, 
                  CONVERT(Char(10), Hor_Fecha, 103) AS FechaE,
                  CONVERT(Char(8), Hor_Fecha, 108) AS HoraE
             From Horario
            Where HorTipo = 1
          ) As Entrada
Left Join (
           Select Hor_Tipo As S, Per_Nr As FichaS, 
                  CONVERT(Char(10), Hor_Fecha, 103) AS FechaS
                  CONVERT(Char(8), Hor_Fecha, 108) AS HoraS
             From Horario
            Where HorTipo = 0
          ) As Salida
       On Entrada.FechaE = Salida.FechaS And
          Entrada.FichaE = Salida.FichaS

Te preguntarás por que left y no inner bueno, sencillamente por que así detectaras
a quienes registraron su entrada pero no la salida.

Suerte

BlueSteel 20-03-2008 21:25:50

Cita:

Empezado por poliburro (Mensaje 274407)
Ok, lo que necesitamos es ver el movimiento de entrada y salida para cada día de la semana. Sencillo:

Vamos a generar los dominios para cada tipo de evento y para cada día de la semana considerando que en una fecha existen dos movimientos (si existieran más, se tienen que hacer consideraciones adicionales),
así que tomaremos como referencia la fecha



Código SQL [-]
//Para las entradas

Select Hor_Tipo As E, Per_Nr As FichaE,
CONVERT(Char(10), Hor_Fecha, 103) AS FechaE,
CONVERT(Char(8), Hor_Fecha, 108) AS HoraE
From Horario
Where HorTipo = 1

// Para las salidas

Select Hor_Tipo As S, Per_Nr As FichaS,
CONVERT(Char(10), Hor_Fecha, 103) AS FechaS
CONVERT(Char(8), Hor_Fecha, 108) AS HoraS
From Horario
Where HorTipo = 0






Ahora obtenemos el producto de las tablas


Código SQL [-]
Select Entrada.E, Entrada.FichaE, Entrada.FechaE, Entrada.HoraE,
Salida.S, Saalida.FichaS, Entrada.FechaS, Entrada.HoraS
From (
Select Hor_Tipo As E, Per_Nr As FichaE,
CONVERT(Char(10), Hor_Fecha, 103) AS FechaE,
CONVERT(Char(8), Hor_Fecha, 108) AS HoraE
From Horario
Where HorTipo = 1
) As Entrada
Left Join (
Select Hor_Tipo As S, Per_Nr As FichaS,
CONVERT(Char(10), Hor_Fecha, 103) AS FechaS
CONVERT(Char(8), Hor_Fecha, 108) AS HoraS
From Horario
Where HorTipo = 0
) As Salida
On Entrada.FechaE = Salida.FechaS And
Entrada.FichaE = Salida.FichaS






Te preguntarás por que left y no inner bueno, sencillamente por que así detectaras
a quienes registraron su entrada pero no la salida.

Suerte


Ok.. Muchas Gracias... terminando de solucionar unos "cachos" probaré lo que me indicas...

Cita:

Empezado por poliburro (Mensaje 274407)
Vamos a generar los dominios para cada tipo de evento y para cada día de la semana considerando que en una fecha existen dos movimientos (si existieran más, se tienen que hacer consideraciones adicionales),

Lamentablemente existen más de 2 movimiento por día.. y afecta a un 80 % de las personas que tenemos que marcar tarjeta....

BlueSteel 01-04-2008 21:43:56

Hola Poliburro

mira.. estas consultas en forma separada funcionan super bien (claro que le modifique por los campos que correspondian...)

Código SQL [-]
Select Hor_Tipo As E, Per_Nro As FichaE, 
       CONVERT(Char(10), Hor_Fecha, 103) AS FechaE,
       CONVERT(Char(8), Hor_Fecha, 108) AS HoraE
  From Horario
 Where Hor_Tipo = 1

Select Hor_Tipo As S, Per_Nro As FichaS, 
       CONVERT(Char(10), Hor_Fecha, 103) AS FechaS,
       CONVERT(Char(8), Hor_Fecha, 108) AS HoraS
  From Horario
 Where Hor_Tipo = 0

y me entregan estos resultados

Código:


E FichaE FechaE HoraE
1 1005 18/02/2008 15:19:00
1 2003 18/02/2008 15:25:00
1 1012 18/02/2008 15:25:00

S FichaS FechaS HoraS
0 1012 18/02/2008 15:26:00
0 2010 18/02/2008 15:38:00
0 2011 18/02/2008 15:38:00

Cuando realizo la consulta en conjunto me da errores...

esta seria la consulta...
Código SQL [-]
Select Entrada.E, Entrada.FichaE, Entrada.FechaE, Entrada.HoraE,
       Salida.S, Salida.FichaS, Entrada.FechaS, Entrada.HoraS
From  (
       Select Hor_Tipo As E, Per_Nro As FichaE, 
              CONVERT(Char(10), Hor_Fecha, 103) AS FechaE,
              CONVERT(Char(8), Hor_Fecha, 108) AS HoraE
       From Horario
       Where Hor_Tipo = 1        
       ) As Entrada
Left Join (
       Select Hor_Tipo As S, Per_Nro As FichaS, 
              CONVERT(Char(10), Hor_Fecha, 103) AS FechaS,
              CONVERT(Char(8), Hor_Fecha, 108) AS HoraS
       From Horario
       Where Hor_Tipo = 0
       ) As Salida
On Entrada.FechaE = Salida.FechaS And Entrada.FichaE = Salida.FichaS

y este corresponderia al error
Código:

Servidor: mensaje 207, nivel 16, estado 3, línea 1
El nombre de columna 'FechaS' no es válido.
Servidor: mensaje 207, nivel 16, estado 1, línea 1
El nombre de columna 'HoraS' no es válido.

ahora.. se supone que la columna FechaS y HoraS se estan asignando con la subconsulta...

que podrá ser ???

BlueSteel 01-04-2008 21:55:19

se me olvidaba..

como mencione antes...

Lamentablemente existen más de 2 movimiento por día.. y afecta a un 80 % de las personas que tenemos que marcar tarjeta....

será por esto el error ???


La franja horaria es GMT +2. Ahora son las 05:15:03.

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