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 ibquery (https://www.clubdelphi.com/foros/showthread.php?t=33867)

CarlosHernandez 19-07-2006 15:41:18

ayuda con ibquery
 
hola a todos, trabajo con delphi 6.0 los comonentes de interbase y firebird 1.5, hago una consulta en un ibquery, luego otra consulta en otro ibquery, hay forma de unir o hacer un select a partir del resultado de los select que estan en los ibquery???? por ejemplo,

Código:

select * from "ibquery1" where fecha:=parfecha


y que ibquery1 no sea una tabla, si no una consulta que hice desde delphi

por ejemplo

Código:

ibquery2.sql.add('select * from "ibquery1" where nombre='+quotedstr(edit1.text)+'');

una locura mia....
ok yo se que el quotestr es para obtener el string de un componente o variable, pero por casualidad no abra un comando para que entienda el el ibquery como una tabla o algo....

lo intente con un procedimiento, pero me devuelve un solo registro y desde delphi me dice que hay multiple registros, asi que no me sirve

Héctor Randolph 19-07-2006 18:22:12

Hola Carlos!

¿Has intentado hacer una vista?

Cita:

Empezado por CarlosHernandez
lo intente con un procedimiento, pero me devuelve un solo registro y desde delphi me dice que hay multiple registros, asi que no me sirve

¿Cómo está hecho el procedimiento que mencionas? , ¿Cómo lo llamas desde Delphi?, los procedimientos en Firebird también pueden devolver un conjunto de registros.

¿Cómo es la consulta que muestras en IBQuery1?

Seguramente hay muchas alternativas para resolver lo que planteas, si proporcionas un poco más de información es más probable que obtengas una respuesta favorable.

Saludos

nemesio 19-07-2006 20:25:29

y por qué no pruebas hacer una sola consulta con las dos tablas que estás accesando por separado?

Saludos.

CarlosHernandez 19-07-2006 20:48:42

bueno, el procedimiento o hice por ibexpert, colocando unas variables de entrada y otra de salida, llame el procedimiento desde un query con sql como si fuera una tabla normal...
Código:

select * from new procedure......
y si lo reconoce y la puedo trabajar, y lo de la vista como se haria...

tengo 2 tablas en una datos que tengo nombre, apellido y codigo y en la otra tabla horas que tiene horaentrada, horasalida, fecha, codigo, lo unico comun es codigo, aja ahora bien, necesito sacar ejemplo del daepartamento de nomina que son 10 personas la 1 hora de entrada y la ultima de salida(que lo hice con min y max) pero de una persona y eso es lo que veo. ahora necesito las 10 juntas para un reportes tomando los nombre de la tabla datos, y las horas de entrada y salida de la tabla horas(y en esta ultima se hace el calculo respectivo) e alli unir 2 query....

y si me explica lo de la vista a ver si me funciona ahorita intento lo que sea...


agradezco cualquier ayuda

Héctor Randolph 20-07-2006 01:40:46

Hola Carlos!

No sé si entendí bien, prueba con esta consulta a ver que resulta

Código SQL [-]
SELECT datos.codigo, datos.nombre, datos.apellidos,
   MIN(horas.hora_entrada), MAX(horas.hora_salida)
FROM datos, horas
WHERE (datos.codigo=horas.codigo)
GROUP BY datos.codigo,datos.nombre,datos.apellidos

Saludos

CarlosHernandez 20-07-2006 16:56:25

ya lo habia hecho
 
hice un select parecido por no decir identico, y si lo hace, muestra todo, pero cuando hago un order by me duplica todos los registros.....

Héctor Randolph 20-07-2006 17:22:02

¿En base a qué campo estas ordenando?

¿Podrías mostrarnos cómo realizas tu consulta?

Saludos

CarlosHernandez 20-07-2006 17:45:01

codigo
 
Código SQL [-]
select min(h.he), max(h.hs), d.codigo, d.nombre, d.apellido, h.he from horas h, datos d
where d.ubicacion = : parubicacion and h.fecha = : parfecha group by d.codigo, d.nombre, d.apellido, h.he
order by h.he


los parametros son ubicacion y fecha, si no le coloco el order by lo hace pero todo desordenado, y con el order bey los duplica y se vuelve loco.....

Héctor Randolph 20-07-2006 18:03:53

Algo está mal en la agrupación :confused:

No deberías mostrar el campo hora de entradas h.he en la consulta si es que vas a obtener un calculado del mismo en este caso min(h.he)

Es por eso que te repite los registros.

¿Cuál es la finalidad de mostrar este campo?, en caso de que sea necesario mostrarlo, ¿Cuál de todas las horas de entrada quieres mostrar cuando hagas la agrupación?

Saludos

CarlosHernandez 20-07-2006 18:09:50

volviendo otra vez yo
 
aja y volviendo a la pregunta original(sigo de ladilla) no hay forma de manejar un ibquery(los registro desvueltos) como si fuera una tabla.. es por ejemplo hacerle un select al ibquery1 pero por el ibquery2

esto iria en el ibquery2

Código SQL [-]
select * from "ibquery1" where fecha:=parfecha

CarlosHernandez 20-07-2006 18:15:08

bueno, por ejemplo, son 10 persona en un departamento, y necesito la 1 entrada y ultima salida de cada una.... en la tabla hora estan todas las horas por eso es que uso el min y el max... y por supuesto necesito ver las 10 personas que esten en un mismo departamento...

Héctor Randolph 20-07-2006 18:27:24

Con respecto a la pregunta original, en la versión 2.0 de Firebird existen las Derived
Tables
con esto puedes hacer lo que planteas.

Para las versiones anteriores, seguro que se puede lograr con procedimientos almacenados.

Saludos

Héctor Randolph 20-07-2006 18:30:24

¿Lo has intentado quitando el campo h.he?

Código SQL [-]
select min(h.he), max(h.hs), d.codigo, d.nombre, d.apellido from horas h, datos d
where d.ubicacion = : parubicacion and h.fecha = : parfecha group by d.codigo, d.nombre, d.apellido
order by 1

CarlosHernandez 20-07-2006 20:06:02

listo
 
hector, con lo del 1 ya se soluciono lo de los registeros duplicado, y lo que hice para terminar el codigo le agregue un left join para mostrar a todo el mundo de personal.... ey hermano altamente agradecido a y una pregunta final porque con el 1(numero de columna) no se duplica, y si pongo h.he si se duplica?????

Héctor Randolph 20-07-2006 20:47:15

En tu sentencia estas indicando que agrupe con respecto a tres campos:
(codigo,nombre,apellido)

todas las tuplas que coincidan en estos tres campos serán agrupadas por ejemplo

Código:

codigo nombre      apellido          he
===== =====      =======      ====
1        carlos        hernandez      1
1        carlos        hernandez      2
1        carlos        hernandez      4
1        carlos        hernandez      2
------------ grupo 1 ------------
2        hector        randolph        6
2        hector        randolph        1
2        hector        randolph        1
2        hector        randolph        2
2        hector        randolph        5
------------ grupo 2 ------------

Si pides el mínimo de cada grupo el resultado sería

Código:

codigo nombre      apellido          MIN(he)
===== =====      =======      ====
1        carlos        hernandez      1
2        hector        randolph        1

Si incluyes el campo he la agrupación sería por estos cuatro campos:
(codigo,nombre,apellidos,he)

Todas las tuplas que coincidan en estos cuatro campos serán agrupadas

Código:

codigo nombre      apellido          he
===== =====      =======      ====
1        carlos        hernandez      1
------------ grupo 1 ------------
1        carlos        hernandez      2
1        carlos        hernandez      2
------------ grupo 2 ------------
1        carlos        hernandez      4
------------ grupo 3 ------------
2        hector        randolph        6
------------ grupo 4 ------------
2        hector        randolph        1
2        hector        randolph        1
------------ grupo 5 ------------
2        hector        randolph        2
------------ grupo 6------------
2        hector        randolph        5
------------ grupo 7 ------------

Ahora si pides el mínimo de cada grupo el resultado sería

Código:

codigo nombre      apellido          he      MIN(he)
===== =====      =======      ====  =====
1        carlos        hernandez      1      1
1        carlos        hernandez      2      2
1        carlos        hernandez      4      4
2        hector        randolph        6      6
2        hector        randolph        1      1
2        hector        randolph        2      2
2        hector        randolph        5      5

Observa bien la manera en que se están agrupando los registros, y verás que si hay una gran diferencia cuando incluyes el campo he

Saludos


La franja horaria es GMT +2. Ahora son las 15:13:58.

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