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)
-   -   Consultas y Grids, cual seria la mejor solucion? (https://www.clubdelphi.com/foros/showthread.php?t=63875)

MichelH 06-03-2009 17:36:17

Consultas y Grids, cual seria la mejor solucion?
 
Hola que tal!
Recien empeze a utilizar Firebird, IBExpert y Delphi2009, despues de años de Delphi5 y Dbase asi que al aprender nuevas tecnicas no se cual seria la mejor opcion.

(hecho en Firebird con IBExpert)
Tengo dos catalogos CLIENTES y CIUDADES.
Campos CLIENTES: ID, NOMBRE, DIRECCION, CIUDAD_ID, TELEFONO
Campos CIUDADES: ID, NOMBRE, ESTADO

CLIENTES esta asociado a un DBGRID y utilizo el componente TIBDataSet para conexion con componentes, y quiero que la columna "Ciudad" en el DBGrid me muestre el nombre de la ciudad en lugar del ID de la ciudad, este nombre de ciudad se encuentra en la tabla CIUDADES.

Que seria lo mejor...
1. ¿Hacer que desde la estructura de la base, osea con el IBExpert, se liguen esos datos?
2. ¿Hacer que se haga la consulta desde el TIDataSet?
3. ¿Hacer en el evento OnDrawColumnCell del Grid de CLIENTES una busqueda en la tabla CIUDADES y sustituir el dato a mostrar?
4. Alguna otra tecnica que ustedes me recomienden.

Como siempre agradesco cualquier ayuda que me puedan dar.

MichelH 06-03-2009 23:40:47

hoy andan muy callados, esta bien que es viernes pero deberas me interesa saber que seria lo mejor...

AzidRain 06-03-2009 23:56:24

Te recomiendo para casos como este en donde el grid nos va a mostrar una lista que contiene una tabla con referencias hacia otra utilizar un query para mostrar la lista utilizando joins:

Código SQL [-]
SELECT ID, NOMBRE, DIRECCION, CIUDADES.NOMBRE NOMBRE_CIUDAD, TELEFONO
FROM CLIENTES
JOIN CIUDADES ON (CLIENTES.CIUDAD_ID=CIUDADES.ID)

De esta manera el motor se encarga de hacerte la chamba. OJO: En este esquema no es posible usar el grid para editar "a mano" los datos, es mejor utilizar un form para pedir los datos del registro y un query adicional para hacer las modifiaciones.

MichelH 07-03-2009 00:15:06

AzidRain, te lo agradezco

De hecho es un catalogo donde hago Altas, Edicion y Eliminacion de registro por medio de Form, asi que hacerlo como me lo comentas creo que vendra bien.

Solo otra pregunta, puedo hacer esto con el componente que estoy usando, TIDataSet, o tengo que utilizar un componente query?

roman 07-03-2009 00:50:36

Cita:

Empezado por AzidRain (Mensaje 340461)
OJO: En este esquema no es posible usar el grid para editar "a mano" los datos, es mejor utilizar un form para pedir los datos del registro y un query adicional para hacer las modifiaciones.

Yo creo que sí es posible hacer la edición sobre el mismo grid, nada más que hay que especificar de alguna forma la consulta de actualización. En algunos caso se hace con un componente extra y en otros es una propiedad del mismo dataset. Por ejemplo, con un IBQuery, puede usarse un IBUpdateQuery. Es cierto que a fin de cuentas se trata de un segunda consulta, pero permite hacer ediciones in situ.

// Saludos

AzidRain 07-03-2009 00:57:55

Por supuesto Roman, pero supuse que le sería mas complicado, yo no utilizo FB ni los componentes TIB, mas bien MySQL y ZEos. En el caso de Zeos cuando utiliza uno una consulta multitabla requiere de un componente adiciona (TSQLUpdate) para indicar los querys para modificación.

En el caso de Michel le sirve conque cambie el TIBDataset por el equivalente de un query (IBQuery) y que haga la edición utilizando un query distinto actualizando el query de la lista al terminar la edición.

El esquema basico es así:

Primero lanzamos nuestro query con todos lo joins que queramos
En la forma de la lista o grid ponemos nuestros botones de A B M (Altas Bajas Modificaciones)
Cuando se hace click en alguno de ellos corremos un query que nos traiga los datos completos del registro seleccionado, el cual tomamos del primer query.
Al terminar de modificar el registro le decimos al primer query que se refresque pq ya modificamos algún dato.

Lamento no poder ayudar mas pero repito que no manejo nada de IB, si quieres te pongo un ejemplo con Zeos tal vez te sirva

MichelH 07-03-2009 01:08:48

Gracias muchachos en realidad han sido de gran ayuda, en serio es de agradecer.
Aqui les dejo como lo resolvi (con su ayuda, claro) sirve que me dicen si es correcto y si lo es, seguro a otro compañero novato le servirá:

Con el mismo TIBDataSet, en las propiedades:

SelectSQL:
select A.ID, A.NOMBRE, A.DIRECCION, A.COLONIA, A.CP, A.CIUDAD_ID, CIUDADES.NOMBRE CIUDAD, A.TELEFONO1, A.TELEFONO2
from CLIENTES A
join CIUDADES on (A.CIUDAD_ID = CIUDADES.ID)
where A.ID = :OLD_ID

ModifySQL
update CLIENTES
set CIUDAD_ID = :CIUDAD_ID, CP = :CP, DIRECCION = :DIRECCION, ID = :ID, NOMBRE = :NOMBRE, TELEFONO1 = :TELEFONO1,TELEFONO2 = :TELEFONO2
where ID = :OLD_ID

InsertSQL
insert into CLIENTES
(CIUDAD_ID, CP, DIRECCION, ID, NOMBRE, EMAIL, TELEFONO1, TELEFONO2)
values
(:CIUDAD_ID, :CP, :DIRECCION, :ID, :NOMBRE, :EMAIL, :TELEFONO1, :TELEFONO2)

RefreshSQL
select A.ID, A.NOMBRE, A.DIRECCION, A.COLONIA, A.CP, A.CIUDAD_ID, CIUDADES.NOMBRE CIUDAD, A.TELEFONO1, A.TELEFONO2, A.EMAIL
from CLIENTES A
join CIUDADES on (A.CIUDAD_ID = CIUDADES.ID)
where A.ID = :OLD_ID

Con esto ya se puede editar directo en el DBGrid, aunque yo no lo uso ya que puse un Form para la edicion, pero me sirve para actualizar los datos mediante el procedimiento IBDataSet.Refresh y asi se actualizan los datos en el DBGrid

Delfino 16-03-2009 13:35:23

Totalmente correcto ;)


La franja horaria es GMT +2. Ahora son las 07:14:59.

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