Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-03-2016
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
factura maestro detalle

Hola,

Se que es una tonteria de pregunta a estas alturas del partido, pero ahi va.

Si tengo una factura que voy a dar de alta, lo primero que estaba haciendo era dar de alta la factura, hacer un post, transaction comminretaining para obtener el registro y poder empezar con los registros detalle que conforman la factura.

Esto esta bien asi, o hay alguna otra forma.

Lo digo porque tengo dos tablas:

Código SQL [-]
CREATE TABLE COMPRAS
(
  ID_COMPRA integer NOT NULL,
  FACTURA varchar(15),
  FECHA_COMPRA date,
  ID_PROVEEDOR integer,
  CONSTRAINT INTEG_17 PRIMARY KEY (ID_COMPRA)
);
ALTER TABLE COMPRAS ADD CONSTRAINT INTEG_18
  FOREIGN KEY (ID_PROVEEDOR) REFERENCES PROVEEDOR (ID_CODIGOPROVE);



CREATE TABLE COMPRASDETALLE
(
  ID_COMPRADETALLE integer NOT NULL,
  CODIGOPRODUCTO varchar(15),
  CANTIDAD date,
  PRECIOCOSTE numeric(7,2),
  ID_COMPRA integer,
  LOTE varchar(10),
  FECHA_CADUCIDAD date,
  CONSTRAINT INTEG_19 PRIMARY KEY (ID_COMPRADETALLE)
);
ALTER TABLE COMPRASDETALLE ADD CONSTRAINT INTEG_20
  FOREIGN KEY (ID_COMPRA) REFERENCES COMPRAS (ID_COMPRA);

Tengo asociado el ibdataset de compradetalle con ibcompra.
Responder Con Cita
  #2  
Antiguo 27-03-2016
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Tienes que iniciar una transacción antes de grabar nada. Es decir, primero tienes que crear tu transacción y hacer todas las operaciones que necesites sobre la BD si alguna falla deshaces la transacción y no pasó nada. En estos casos es forzoso que lo hagas así, de lo contrario podrías quedarte con un detalle sin cabecera, si es que no diseñaste bien el modelo de tablas.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #3  
Antiguo 27-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Yo antes lo hacia de esa manera, pero es un desastre. La mejor forma de hacerlo: Olvidate de la base de datos hasta el momento de grabar

Manten todo en memoria (usa objetos) y luego mandas todo a grabar, en una transaccion

Piensa en codigo de este estilo:


Código Delphi [-]
var
  f: TFactura;
  d: TDetalle;
begin
  f := TFactura.Create; { obvio el try finally que libera de memoria... }
  f.Cliente := {  ... }  
  d := f.AgregarDetalle;
  d.Producto := {  ... }  

  GrabarFactura(f);
end;

procedure GrabarFactura(f: TFactura);
var
  IdCabecera: Integer;
begin
  IniciarTrans;
  try
   IdCabecera := GrabarCabecera;
   GrabarDetalle(IdCabecera, f.Detalle); 
   Commit;
 except
   Rollback;
   raise;
 end;
end;
Responder Con Cita
  #4  
Antiguo 27-03-2016
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias por contestar.
Si, es lo que estaba buscando, alguna forma alternativa de hacer eso mismo.
Lo de la memoria mas o menos lo entiendo, pero me parece mas lio, porque tengo que pasar todo a variables o arrays y luego lo vuelco a las tablas.

Lo interesante es iniciar la transaction pero mi pregunta era si hago un post de la factura todavia no tengo asignado el codigo de compras para pasarselo a comprasdetalle.
o quiza no lo entendi, perdon.
Responder Con Cita
  #5  
Antiguo 27-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
La mayoria de los motores soportan algun tipo de operacion especial, externa al standart SQL, que permite insertar una tupla y devolver el Id que uso al insertar

Por ejemplo en Firebird se usa la cláusula returning
Responder Con Cita
  #6  
Antiguo 27-03-2016
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
O usar ClientDataset, es lo mismo que tener los datos en memoria, insertando todo en cada tabla y hasta que no haces un ClientDataset1.ApplyUpdates() inicia la transacción y graba los cambios.

Es igual para borrado, puedes borrar 20 filas de un grid (que está enlazado al ClientDataset). Tú ves que las filas se eliminan del grid, pero no se aplican los cambios a la BBDD hasta que no lo ordenas.

Saludos!
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 27-03-2016
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Gracias, tengo que ver eso a ver que tal.

Lo que me saca del cuadro es que si inicio transaction1.startransaction me dice que esta activa, y la verdad no lo he aplicado en ningun modulo.
ademas tengo que revisar otros detalles como que no me encuentra un campo que no esta puesto. .

gracias por el apoyo amigos
Responder Con Cita
  #8  
Antiguo 27-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
No se que componentes de acceso a datos estas usando, pero la mayoria de los Connection o Transaction tienen eventos, OnBeginTransaction, OnCommit, OnRollback, etc

Registra siempre en esos eventos cuando ocurran y asi vas a encontrar en donde estas llamando a iniciar una transaccion
Responder Con Cita
  #9  
Antiguo 27-03-2016
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Ah si, uso componentes ibx,
Código Delphi [-]
fmodulodatos.IBTransaction1.StartTransaction;
   fmodulodatos.ibproveedor.insert;

La verdad es que no he usado en ningun sitio startTransaction, por eso se me hace raro.
Responder Con Cita
  #10  
Antiguo 28-03-2016
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Ahora mismo no recuerdo exactamente, pero tienen una propiedad que permite a los componentes empezar las transacciones automáticamente. Mírate también la ayuda del ibtransaction.AutoStopAction (si empieza una transacción automáticamente y eso está en saNone, la transacción no hace ni commit ni rollback)

Una vía rápida es:
Código Delphi [-]
if not fmodulodatos.IBTransaction1.InTransaction then 
  fmodulodatos.IBTransaction1.StartTransaction;
fmodulodatos.ibproveedor.insert;

Que conste que no lo tengo muy fresco el tema...
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #11  
Antiguo 29-03-2016
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
Se agradecen a todos los comentarios, asi lo hago como dices, lo unico que tengo duda es como veo si hay transacciones activas, a parte de con esa forma, porque no veo como cerrarlas. Ya probe con transaction1.rollback.
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
DataSets Maestro - Detalle acceso al detalle delphijm Conexión con bases de datos 7 10-02-2011 15:51:53
Saber si el DBGrid (Detalle) esta Vacio en Relacion Maestro/Detalle Adrian Murua Conexión con bases de datos 2 03-01-2009 13:48:46
Maestro/Detalle (No graba en tabla Maestro) teclilla Tablas planas 12 21-04-2008 20:59:54
Problema tabla Maestro-detalle en la q la pk de t.detalle formad por 2cods de la maes akinom38 Varios 1 09-11-2007 19:27:44
Maestro-Detalle ;Actualizar detalle a partir de un DBgrid norberto_larios Conexión con bases de datos 1 11-09-2004 18:17:34


La franja horaria es GMT +2. Ahora son las 14:39:11.


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