Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-10-2006
Avatar de Hagen
Hagen Hagen is offline
Miembro
 
Registrado: ene 2004
Posts: 65
Poder: 21
Hagen Va por buen camino
Question Problemas con generadores en relacion Muchos-a-Muchos

Estoy usando Delphi 7, Firebird 1.5.3 e IBX 7.06

Como muchos sabran, cuando se tiene una relacion muchos a muchos se debe crear una
tablas intermedia que almacena la relacion entre ambas tablas:

Por ej: Un materia puede ser cursada por varios estudiantes y un estudiante puede
cursar varias materias. En este caso se crea una tabla intermedia que
relaciona las 2 tablas. En dicha tabla se debe almacenar la llave primaria
de materia y de estudiante.

Bueno el problema se me presenta cuando se debe almacenar las llaves primarias en
la tabla intermedia. Debido a que uso como llave primaria un numero devuelto por
un generador en las tablas estudiante y materia.


Como se daran cuenta NO ES la tipica relacion maestro-detalle (uno a muchos).


OJO: la llave primaria me la asigna el servidor mediante un generador y un trigger.

En concreto mi problema esta en:

- Como se puede conocer el valor que se asigno a la llave primaria tanto en la
tabla estudiante como en la tabla materia. O sea como obtengo el valor de la
llave primaria una vez echo el Post??

Yo lo obtengo buscando con un Query y dandole como parametro los valores
introducidos. Considero que esta no es la mejor manera, ya que si la tabla
tuviera varios registros (300.000) afectaria al rendimiento de la aplicacion.
Y tambien puede darse el caso que se introduzcan los mismos datos entonces el
query me devolveria mas de 1 registro.


Algunas consideraciones:

- La aplicacion debe funcionar con varios clientes a la vez


- Se debe realizar la insercion de los datos desde el mismo formulario o sea
que la insercion de los datos de alumnos y de las materias que cursa se
hace desde el mismo formulario. Si solamente se tuviera un formulario
en donde se establezcan las relaciones entre materia y alumnos; seria mas facil
porque lo unico que tendria que hacer es usar dblookupcombobox's para "jalar"
los datos ya introducidos; pero esa no es la idea.


Muchas gracias de antemano.
Responder Con Cita
  #2  
Antiguo 27-10-2006
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
Hola foro,

bueno, cuando se necesita conocer el el valor de una llave generada por el motor de base de datos por medio de un generador valga la redundancia (ahora se les dice secuencia a partir de la version 2 de firebrid), deberias utilizar la propiedad GeneratorField de los TIBDataset.

Esta propiedad te permite indicarle al Dataset desde cual generador de la base de datos va a traer el nuevo valor para identificar en tu caso a los estudiantes.

Existen 3 formas de generar el valor:

1. OnNewrecord. Esta opción incrementa el generador en 1 y lo trae hacia tu dataset cuando hagas una operacion Insert. La desventaja es que si das una operacion Cancel, pierdes el uso del numero y te quedan 'huecos' en tu secuencia.

2. On Post: Esta opción incrementa el generador en 1 pero solamente cuando cuando haces la grabacion del registro (operacion post). Es la que utilizo en situaciones como la que tu planteas.

3. On Server: llevo mas de 6 años trabajando con los IBX y no se la verdad que es lo que hace, mis disculpas.

Ese es el mecanismo de tener 'en vivo' el identificador dentro de la aplicacion.

De otro lado tambien coloco un trigger tipo Before Insert por si se hace ingreso de informacion por otro via diferente al formulario, quedaria mas o menos asi:

Código SQL [-]
CREATE GENERATOR GEN_ALUMNO;

SET TERM ^ ;


CREATE TRIGGER ALUMNO_BI0 FOR ALUMNO
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  /* Colocar el identificador */
  if (new.codigo is null) then
    new.codigo = gen_id(gen_alumno, 1);
end
^

SET TERM ; ^

Si utilizas la propiedad GeneratorField es el aplicativo el que se encarga de construir el identificador y no el trigger.

Muchos exitos,

Luis F. Buelvas T.
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #3  
Antiguo 29-10-2006
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola a todos!

Quizá este mensaje no sea del todo útil para resolver tu problema Hagen, pero tal vez te ayude a visualizar de mejor forma el manejo de los campos llave.

Un abrazo a muchos.

Al González.
Responder Con Cita
  #4  
Antiguo 30-10-2006
tefots tefots is offline
Miembro
 
Registrado: feb 2005
Posts: 108
Poder: 20
tefots Va por buen camino
la solucion

para obtener la key generada por un generador (valga la redundancia)
puedes consultar directamente a través de un select .

con esto , obtienes valor actual del generador .

SELECT GEN_ID (gen_alumno, 0) contador from RDB$DATABASE

y con lo siguiente , se incrementa el generador en 1, y obtienes el valor

SELECT GEN_ID (gen_alumno, 1) contador from RDB$DATABASE



saludos.
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
Me da muchos fallos el quickreport 4.0 escullar Impresión 0 03-05-2006 12:14:31
Relacion Muhcos a muchos Sito Conexión con bases de datos 1 11-04-2006 13:25:29
UPDATE en una relacion 1 a Muchos... JorgeBec SQL 4 19-11-2004 20:16:37
... muchos requisitos ... Jure Humor 0 02-04-2004 16:22:18
Consulta SQl, relacion 1 a muchos Walter SQL 3 15-07-2003 03:13:28


La franja horaria es GMT +2. Ahora son las 18:53:21.


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