![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
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:
Tengo asociado el ibdataset de compradetalle con ibcompra. |
#2
|
||||
|
||||
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|| |
#3
|
||||
|
||||
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:
|
#4
|
||||
|
||||
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. |
#5
|
||||
|
||||
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 |
#6
|
||||
|
||||
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. |
![]() |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
![]() |
||||
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 |
![]() |
|