Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Guardar Maestro-Detalle (Problema super comun) (https://www.clubdelphi.com/foros/showthread.php?t=40490)

sonjeux 19-02-2007 08:41:29

Guardar Maestro-Detalle (Problema super comun)
 
Saludos cordiales.

Estuve buscando bastante sobre este tema en el foro sobre mi problema pero no encontre respuestas, solo preguntas :(.

Bueno el problema que tengo es el siguiente, tengo dos tablas en mi base de datos hecha en Firebird, las tablas tienen masomenos la sigiente estructura

Tabla: Ingreso - Campos: ID(Llave Primaria), FECHA, COMENTARIO, PROVEEDOR, ALMACEN
Tabla: Ingreso_Detalles - Campos: ID(Llave Primaria), ID_INGRESO(Llave Foraena), ID_PRODUCTO, PRECIO, CANTIDAD

La relacion es 1-n

Ahora el campo ID de la tabla Ingreso lo necesito para la tabla Ingreso_Detalles en el campo ID_INGRESO.

Lo que hago es lo siguiente:

Primero en el formulario en el evento onshow pongo lo siguiente

IBIngresos.Close;
IBIngresos.Open;
IBIngresos.Append; //Aqui reservo un lugar en la base de datos

IBDetalles.Close;
IBDetalles.Open;

Luego empiezo a insertar los datos para la tabla Ingreso_Detalles, pero necesito el ID de la tabla Ingreso, pero este se genera mediante un trigger en firebird.

- Deseo saber por que al momento de insertar los datos en la tabla Ingreso_Detalles no se guarda el id de la tabla maestro Ingreso??. (Seguramente por que todavia no realize un post y no cuento con el id generado por firebird)

- No deberia funcionar esto, si lo puse en maestro-detalle, o sea al momento de guardar el maestro el detalle no deberia modificarse automaticamente y obtener el id del maestro para colocarlo en id_ingreso???

- Como puedo obtener el id que genero Firebird antes del post del maestro para usarlo en el detalle??

Espero que este masomenos claro lo que deseo hacer.

Gracias de antemano por su respuesta.

Lepe 19-02-2007 13:30:12

Según parece usas los componentes Interbase, que en el futuro podrían darte problemas con incompatibilidades, si estas a tiempo, puedes usar MDOLIB, que también son libres y cumplen su función muy bien.

En MDOLIB, (supongo que en IB también lo tienes) en el Dataset tendrá una propiedad GeneratorField, que identifica el generador a usar y cuando usarlo, tienes 3 posibilidades (waServer, waPost, waNewRecord), con waPost funciona como quieres.

En Interbase, hay una variable llamada CopyMasterFieldToDetail en la unidad IBUtils.Pas, figura en la línea 85 y 360 de ese archivo y se usa también en los descendientes de IBCustomDataset. Poniendo esa variable Booleana en True se supone hace lo que quieres.

Acabo de mirar el código de OnNewRecord para IB y en el código aparece:
Código Delphi [-]
begin
  if FGeneratorField.ApplyEvent = gamOnNewRecord then
    FGeneratorField.Apply;
  if CopyMasterFieldToDetail then
  begin
    if FDataLink.DataSource <> nil then
      if FDataLink.DataSource.DataSet <> nil then
        SetFieldsFromParams;
  end;
  inherited DoOnNewRecord;
end;

Visto esto, en el OnNewRecord también funcionaría... aunque puede darte mucha lata crean un registro vacío y después cancelan dicho registro (el Generador se incrementará en cada OnNewRecord)

Espero que alguno de estos comentarios te sirva.

Saludos

sonjeux 19-02-2007 19:28:29

Gracias por tu respuesta, ahora voy a ver eso :D.

Tambien voy a ver de usar MDOLIB o ADO :P.

Saludos


La franja horaria es GMT +2. Ahora son las 10:12:49.

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