Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ayuda con modificacion masiva (https://www.clubdelphi.com/foros/showthread.php?t=83793)

xeuz 30-07-2013 18:46:30

Ayuda con modificacion masiva
 
Hola, necesito hacer un cambio masivo en una base de datos y no sé crear el SQL para conseguirlo, la estructura de las tablas es esta:
Tabla clientes, campos: ID, NOMBRE, LEGAJO, INGRESO
Tabla fichadas, campos: ID_CLIENTE, FECHA, ENTRADA1, SALIDA1
Y lo que necesito es borrar las fichadas que sean anteriores a la fecha de ingreso y modificar las fichadas que entre la entrada y la salida que excedan las 4 horas de diferencia, para que queden de 4 horas.

Gracias anticipadas.

Casimiro Notevi 30-07-2013 20:29:26

Hola xeuz, creo que no ha quedado muy clara tu explicación.
Detalla la estructura de las tablas con sus tipos de campos y explica en más profundidad lo que quieres conseguir exactamente.
Gracias.


Por cierto, como a todos los novatos, se le recomienda leer nuestra guía de estilo :)

movorack 30-07-2013 21:46:39

Hola,

Asumiendo cosas como por ejemplo que el campo fichadas.fecha corresponda a un campo Date o TimeStamp y sea la fecha de la fichada y que de igual manera clientes.ingreso sea un campo de fecha

Para seleccionar las fichadas antes de la fecha de ingreso puede servirte algo como:
Código SQL [-]
SELECT * FROM fichadas a
INNER JOIN clientes b ON a.id_cliente = b.id
WHERE a.fecha < b.ingreso

Ahora, apoyando a casimiro, debes explicar mejor tu problema para que se te pueda responder de manera correcta porque aunque la sentencia de DELETE puede ser algo como esto,

ATENCION!!! WARNING!!! OJO PELAO!!!
Esta es sentencia podría borrarte mucho mas de lo que esperas porque podría hasta borrar una fichada de un id_cliente que tenga 2 registros con uno despues de la fecha de ingreso y el otro no.

Código SQL [-]
DELETE FROM fichadas
WHERE id_cliente =
  (SELECT a.id_cliente FROM fichadas a
     INNER JOIN clientes b ON a.id_cliente = b.id
     WHERE a.fecha < b.ingreso);

Si por alguna razón no tienes bien definidas las llaves de fichadas y con una sola sentencia no puedas obtener el resultado que esperas, te recomendaría hacer un SP que se encargue de esa tarea y hacer todas las validaciones necesarias allí dentro. Si a la final no puedes con el sp pues hacerlo desde delphi.

PS: Debí modificar el mensaje porque no me había dado cuenta que la consulta era en el foro de Interbase/Firebird :D

xeuz 31-07-2013 04:29:14

Muchas gracias Movorack y Casimiro por la rapidísima respuesta a mi escueto post! Estos últimos días estuve lidiando con urgencias todo el tiempo y entre las corridas aveces creo que el resto del mundo puede leer mi cabeza, ERRORRR!
Paso a comentarles un poco más en detalle, soy técnico y brindo soporte a pequeñas y medianas empresas en el rubro informática en gral y además soy programador PHP y mysql (programador de los malos, de los que saben poco, googlean mucho e improvisan otro tanto... :( ) y en un cliente me pidieron hacer una modificación a una base firebird y supuse que no seria muy distinta la lógica y la sintaxis, pero me encontré con varios inconvenientes y por eso recurrí a uds.
Creo que con lo que me pasó Movorack ya me las arreglo para adaptarlo a lo que necesito. Creo que comprendí la logica y sintaxis para este caso en particular.

Agradezco enormemente la ayuda por Uds. dada ya que, creo, me resolvió el problema. Lo pruebo y les cuento como me fue.

Un abrazo

XeuZ

xeuz 31-07-2013 04:52:31

Bueno, finalmente acabo de probar el código que me paso Movorack el cual modifique un poco pero me encontré con un problema, el select no devuelve ningún registro! y estoy viendo que los hay. Estoy utilizando IBexpert. El código es:

SELECT a.id FROM fichadas a
INNER JOIN clientes b ON a.id_cliente = b.id
WHERE A.fecha < B.alta

en la parte de mensajes me aparece:

Plan
PLAN JOIN (A NATURAL, B INDEX (PK_CLIENTES))

Un dato que no había dado y no se si puede que sea eso, el campo a.fecha es del tipo date y b.alta es del tipo timestamp


Saludos

XeuZ

mamcx 31-07-2013 06:02:52

Seria bueno que leyeras un tutorial sobre SQL y luego revisaras la sintaxis especifica de firebase.

Casimiro Notevi 31-07-2013 08:57:08

Para una correcta presentación de código fuente, usa los tags, ejemplo:



Gracias :)


Ya te comenté antes que describieras lo mejor posible las tablas y los tipos de campos, recuerda que no somos adivinos :D


La franja horaria es GMT +2. Ahora son las 06:42:32.

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