Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-02-2011
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
problemas con dbgrid y otros db

Buenas
Estoy algo atascado por usar componentes directos del tipo dbgrid .
A ver si me dais una manita.
tengo 2 tablas,
contactos,
que contiene;
codigo
nombre
direccion.
...

telefonos,
que contiene,
codigotelefono
telefono
codigocontacto

Esto es para tener por contacto n telefonos.

el problema que tengo es, primero si esto se puede usar asi, puesto que en contactos no hay referencia a telefonos pero si al reves.
y lo segundo, al usar directamente un contactos.insert y posteriormente un dbedit y cambiar al dbgrid de telefonos el registro ya queda sin usar contactos.post y esto no tiene que ser posible por si decido cancelar el nuevo registro.

Lo otro, es relacionado con un dbgrid, si todavia no tengo el codigo primero como añado ese codigo a la tabla del dbgrid.

Me imagino que quiza sea dificil entender lo que quiero o no, pero bueno es simplemente por si me podeis echar la mano.

gracias
Responder Con Cita
  #2  
Antiguo 10-02-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola anubis.

Cita:
el problema que tengo es, primero si esto se puede usar asi, puesto que en contactos no hay referencia a telefonos pero si al reves.
Se puede usar y sólo debés establecer una relación maestro/detalle entre los DataSets involucrados.
Como no especificas con que base de datos estás trabajando ni con que componentes, te ejemplifico con TIBDataSet.

Teniendo dos TDataSource y dos TIBDataSet relacionados así,

DataSourceContactos -> IBDataSetContactos ( maestro )
DataSourceTelefonos -> IBDataSetTelefonos ( detalle )

desde el Object Inspector, ponemos DataSourceContactos en la propiedad DataSource de IBDataSetTelefonos y el siguiente
código SQL siguiente en la propiedad SelectSQL:
Código SQL [-]
 SELECT * FROM TELEFONOS WHERE CODIGOCONTACTO = :CODIGO

O por bién por código:
Código Delphi [-]
 with IBDataSetTelefonos do
  begin
    Close;
    DataSource:= DataSourceContactos;
    SelectSQL.Clear;
    SelectSQL.Add('SELECT * FROM TELEFONOS');
    SelectSQL.Add('WHERE CODIGOCONTACTO = :CODIGO');
    Open;
  end;

Cita:
Lo otro, es relacionado con un dbgrid, si todavia no tengo el codigo primero como añado ese codigo a la tabla del dbgrid.
Lo siento, realmente no te entiendo esa parte.


Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 10-02-2011 a las 04:28:47.
Responder Con Cita
  #3  
Antiguo 10-02-2011
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Si gracias por contestar.

Voy a probar lo que dices a ver que sale.
Estoy usando los componentes zeos y de momento sqlite.

Lo que queria hacer es, si lo que me propones funciona ya no haria falta .
lo probare y vere si funciona, en cualquier caso lo posteare.

gracias de nuevo
Responder Con Cita
  #4  
Antiguo 10-02-2011
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Hola,

como no puedo editar el post tengo que añadir uno nuevo

Como comentaba uso librerias zeos y sqlite, este ultimo creo que no es relevante o si?.

Bueno, ya probe lo que me comentabas pero no me funciona nose si estara bien:

contactos.tzquery
contactos.tdatasource

telefonos.tzquery
telefonos.tdatasource

Esto me estaba quedando asi en el object inspector.

contactos.tzquery (como no hay tablename no pongo nada salvo en el sql que seria select * from contactos.

El contactos.tdatasource lo relaciono con contactos.tzquery

y luego en el telefonos.tzquery le pongo en mastersource contactos.tdatasource y ahi en masterfield el campo que se relaciona.

y el telefonos.tdatasource lo relaciono con el mismo telefonos.tzquery.

Que estoy hacendo mal?

un saludo y gracias de nuevo
Responder Con Cita
  #5  
Antiguo 10-02-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Hasta donde pude entender (están un poco confusas tus palabras) uno de los problemas que tienes que cómo resolver esta paradoja:
Cita:
¿Cómo relacionar registros hilos (teléfonos) a su respectivo padre (contactos) si el padre aún no existe?
Es valida tu incógnita. De hecho es un problema un poco complejo que puede tener varias soluciones. El problema nace porque la mayoría de los motores de DB no te dejarán agregar un nuevo registro Hijo si el padre aún no ha sigo creado. Lo que yo hago para resolver este problema es utilizar una tabla temporal (o una tabla en memoria puede ser de mucha ayuda si tienes una estructura compleja). Si solo vas a guardar números de telefono, creo que basta con un array.

Saludos,
Chris
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #6  
Antiguo 12-02-2011
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Tienes razon chris, probare con un dataset en memoria a ver como sale pero primero queria solucionar otro problema.

No hay forma de que el grid de la tabla detalle me muestre/filtre en funcion de la maestra, si uso un query (master) y table (detail) si lo hace pero con dos querys no.

Os resumo un poco como lo hago usando lo que posteo ecfisa.

tengo 2 datasource y 2 querys un dbgrid y un dbedit

query1.tquery (master)
sql.text:='select * from contactos'
datasource no pongo nada porque genera un bucle.

datasource1.tdatasource
dataset:=query1


query2.tquery(detail)
mastersource:=datasource1
masterfield:=codigo
linkedfields:=codigo2 (de la tabla2)
sql.text:='select * from telefonos where codigo2= :codigo'

No se donde me falta algo porque ya probe con varias cosas del inspector de objetos pero nada, no me filtra nada ni me deja ver nada, eso si, como os comentaba si uso una tabla como detalle en vez del query si me lo hace.

Es frustrante la verdad.

uso los componentes zeos

gracias de nuevo
Responder Con Cita
  #7  
Antiguo 12-02-2011
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Hola,
Bueno algo mas he visto,
Parece que si al query2.sql le dejo solo como 'select * from telefonos' ya me funciona porque ya habia relacionado en el inspector de objetos el master, y los campos relacionados.
Si lo hago al reves, dejo el sql tal y como esta y quito estas relaciones tampoco me funciona.
La pregunta del millon seria porque pasa esto.

un saludo y gracias de nuevo
Responder Con Cita
  #8  
Antiguo 14-02-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.306
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Un poquito de atención y a ver si utilizamos TAG's.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 14-02-2011
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Correcto Neftali, un error por mi parte.

gracias por el apunte
Responder Con Cita
  #10  
Antiguo 10-03-2011
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Hola de nuevo,

Chris, sobre la tabla de memoria si entendi el mecanismo, la duda que me surge es la siguiente:

Con las dos tablas en memoria, a la hora de guardarlas, primero guardo el registro en la maestra con lo que ya tengo mi clave primaria.
De ahi haria un for next con todos los registros de la tabla detalle e ir insertando la clave primaria obtenida, es asi?.

Es correcto usar un for next para recorrer todos los datos de la tabla de detalle en memoria para ir guardando?.(es lo mismo en un sistema unico o cliente servidor?.

El borrado de un registro( si esto que comento esta bien), seria lo mismo, borrar del detalle primero con un for next y luego borrar el registro maestro, porque hasta ahora si borro el registro maestro antes que el de detalle(lo permite) se quedan ahi los registros del detalle.

Un saludo y gracias nuevamente
Responder Con Cita
  #11  
Antiguo 10-03-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por anubis Ver Mensaje
Hola de nuevo,
Con las dos tablas en memoria, a la hora de guardarlas, primero guardo el registro en la maestra con lo que ya tengo mi clave primaria.
De ahi haria un for next con todos los registros de la tabla detalle e ir insertando la clave primaria obtenida, es asi?.

Es correcto usar un for next para recorrer todos los datos de la tabla de detalle en memoria para ir guardando?.(es lo mismo en un sistema unico o cliente servidor?.
Lo correcto es utilizar while not TablaMemoria.Eof do ... Más o menos así:
Código Delphi [-]
    with MiTablaDeMemoria do
    begin
        First;  // vamos al primer registro para asegurarnos de pasar por todos
        while not EoF do
        begin
            // aquí transfieres los registros en la tabla de memoria a la verdadera DB
            Next; // esta línea hace que el bucle trabaje con el próximo registro
        end;
    end;
Cita:
Empezado por anubis Ver Mensaje
El borrado de un registro( si esto que comento esta bien), seria lo mismo, borrar del detalle primero con un for next y luego borrar el registro maestro, porque hasta ahora si borro el registro maestro antes que el de detalle(lo permite) se quedan ahi los registros del detalle.
No me queda clara tu duda en este punto.

Saludos,
Chris
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #12  
Antiguo 10-03-2011
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias de nuevo,

Ya veo que si hay que hacer algun bucle, bien con un for next o bien como dices tu que es la manera mas acertada, pero si hay que recorrer toda la tabla, dando igual que sea para un unico usuario o bien tipo cliente servidor.

El tema del borrado de registros de la base de datos, la teoria es que si quieres borrar el registro del maestro tendria que borrarse tambien el del detalle o bien decirte que por integridad no se puede, en mi caso si me lo permite y no debiera hacerse asi.

Si es una practica hacerlo asi como lo expongo y me comentas, voy a probarlo.

Un saludo y gracias nuevamente
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
problemas con dbgrid y otros db anubis Firebird e Interbase 4 18-02-2011 19:58:58
Objetos de sistema y otros problemas PaFernan99 Oracle 1 15-05-2008 23:16:29
Problemas con el DBGrid Shidalis Conexión con bases de datos 8 07-12-2005 15:53:50
Problemas con la aplicacion en otros equipos Mashabak Tablas planas 2 29-06-2004 17:16:55
Problemas con filtro... (y otros) sitrico Conexión con bases de datos 1 21-01-2004 21:52:12


La franja horaria es GMT +2. Ahora son las 13:03:39.


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