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)
-   -   Problemas con generadores en relacion Muchos-a-Muchos (https://www.clubdelphi.com/foros/showthread.php?t=36862)

Hagen 26-10-2006 18:44:12

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.

lbuelvas 27-10-2006 02:08:53

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.

Al González 29-10-2006 18:47:34

¡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. :)

tefots 30-10-2006 16:47:51

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.


La franja horaria es GMT +2. Ahora son las 12:09:15.

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