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)
-   -   Problema Principante! (https://www.clubdelphi.com/foros/showthread.php?t=19418)

arieliten 14-03-2005 16:16:15

Problema Principante!
 
Hola, tengo varias dudas y problemas que espero puedan ayudarme. Tengo una BD Interbase con dos tablas: una de peliculas y una de actores. Tambien tengo una tabla mas donde guardo la relacion "ActuaEn" que almaceno el Id_Pelicula y el Id_Actor para saber el reparto de actores de una determinada pelicula.

Ahora el problema es que cuando estoy en un formulario para insertar una pelicula, tengo todos DBEdits asociados a cada campo de la pelicula y un boton para cargar los actores. El tema es que para cargar los actores de esa pelicula no puedo hacerlo directamente ya que necesito el Id_Pelicula (que aún no tengo porque no la he insertado aún). Asi que no puedo insertar los actores directamente hasta no tener insertada la pelicula (hehco el POST de pelicula).

Ahora bien, lo que hice es hacer algo como ListBoxs donde voy cargando los actores seleccionados para esa pelicula y un array donde guardo los IDs de esos actores para luego poder almacenarlos en la tabla "Actua_En". El tema es que se me ha despelotado todo y se me complica mucho el manejo de los arrays dinamicos (errores de memoria, etc).

La pregunta es: ¿qué me recomiendan uds usar para hacer esto?
Y otra cosa: si tengo el ID autonumerico (generado por un generador) ¿como pueod averiguar cuál es el ID que le tocó al registro que toy insertando para asi luego poder usarlo en la insercion de la tabla de la relacion?

MUCHISIMAS GRACIAS si pueden ayudarme y perderme por ser tan extenso

JulioGO 15-03-2005 01:32:51

Hola Arieliten:

Primeramente el Id_Pelicula deberias tenerlo desde un contador propio(sin usar ID autonumerico), lo recomendable es que crees una tabla CONTADOR y desde ahi "jales" el id a la pelicula.

Con respecto al ingreso de los datos de "ActuanEn", simplemente no uses array, pues puedes agregar un DBGrid a tu formulario y dos botones Agregar y Quitar. Al momento de pulsar el boton Agregar solo muestra un listado de los Actores, y si seleccionas un actor solo jalas el ID de la pelicula que has jalado de la tabla CONTADOR. El codigo del boton Agregar seria el siguiente:

If frmListaActores.ShowModal = mrOk then begin
ibdsActuanEn.Edit;
ibdsActuanEn.FieldValues['ID_PELICULA']:=ibdsPelicula.FieldValues['ID_PELICULA'];
ibdsActuanEn.FieldValues['ID_ACTOR']:=ibdsListaActor.FieldValues['ID_ACTOR'];
ibdsActuanEn.Post;
end;

Ojala te sirva la recomendación que te mando

Saludos.

arieliten 16-03-2005 13:58:47

Gracias JuliGo, pero el tema es que no puedo insertar el ID_Pelicula en la tabla "Actua_En" porque todavia no inserté la pelicula en si, sino que toy llenando todos los datos. Es por eso que los actores los tengo que ir almacenando en una estructura temporal (usaré arrays?) hasta que el usuario clickee en ACEPTAR que hará el POST de todos los datos de la película y que a su vez almacenará en "Actua_En" todos los ID_Actor que tengo en el arreglo junto con el ID_Pelicula de la pelicula que insertamos.
¿La pregunta era si en vez de arrays podía usar algún comoponente que no sea de acceso directo a la BD y que funcione de manera similar un DBLookup en el sentido de que pueda mostrar algo (Nombre y APellido en este caso) pero que su valor real para usar sea otro (la KeyField seria el Id_Actor)?
¿Se entiende?
Muchas gracias.

Lepe 16-03-2005 16:11:22

Como el programa no parece de facturación para el Corte Inglés, simplemente podrías en el OnNewRecord de la tabla peliculas hacer el post directamente.

De esta forma ya tienes el id de la pelicula, si el usuario cancela el registro, deberías eliminar ese registro, suponiendo que tienes borrado en cascada, no habría problemas.

Otra solución es mirar en una tabla de sistema (creo que era así) donde se puede comprobar el número el autoincremento. Lamento decir que no soy gurú de Firebird, lo único que he encontrado es como eliminar un generador

saludos

Lepe 16-03-2005 16:29:24

En cuanto a la pregunta de arrays, simplemente olvida esa "técnica", esta otra es más moderna y facil para el programador.
Código Delphi [-]

type Tactor = class(Tobject)
public
  Nombre:string;
  idActor:integer;
end;

var:
  Lista :TobjectList; // lista de objetos ... en este caso de actores
 
procedure CreaLista();
begin
  Lista := TobjectList.Create(true);
end;
procedure CreaActor();
var 
  a : Tactor;
begin
  a := Tactor.Create;
  a.nombre := 'pepe';
  a.idactor := 32;
  lista.add(a); 
end;

procedure LiberaLista;
begin
  freeandnil(Lista);//borramos la lista de memoria con todos los actores
// que tenga
end;

function ActorEstaEnLista(id:integer):boolean
var a:Tactor;
    i:integer;
begin
Result := false;
for i:=0 to lista.count-1 do
  if Tactor(lista.items[i]).idactor = id then
  begin
    Result := true;
    break;
  end;
end;

Espero que no tenga muchos fallos ;)

Saludos


La franja horaria es GMT +2. Ahora son las 02:39:01.

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