FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Problema con maestro/detalle
Buenos días, tengo una tabla relacionada con otra con maetro/detalle. Una cabecera de factura y el cuerpo.
Ej. cabecera Factura 23 fecha 12/12/2003 cliente: pepe cuerpo factura 23 concepto: pijama cantidad: 2 pvp: 12 factura 23 concepto: blusa cantidad: 1 pvp: 12 ... factura 23 concepto: blusa cantidad: 1 pvp: 12 ... se relacionan por el número de factura. El problema donde lo tengo es al intentar modificar el número de la factura. Si quiero que cambie de 23 a 45, por ej. Puedo modificar todas las lineas en el detalle excepto la última, ya que delphi lanza el error de que no hay registros para poder actualizar. Supongo que al cambiar la última linea se rompe la relación y por eso lanza el error. La cuestión es puedo variar por ej. en el ejemplo anterior de los tres registros , solo puedo variar dos, cuando llego al último salta ese error. Sabe alguién por que sucede. Espero haberme explicado bien... |
#2
|
||||
|
||||
Buenos Días, ¿Podrías especificar como realizas esa actualización, a través de SQL, modificando los campos del dataset y posteando, etc?. ¿Podrías también indicar con que objeto presentas la información?
Un saludo. |
#3
|
|||
|
|||
Dependiendo del motor de base de datos que utilices, puedes definir una relación de integridad entre las tablas maestro y detalle con actualización en cascada. de esta manera te evitas de tener que hacer el update a los detalles trabajando la BD por ti
|
#4
|
|||
|
|||
Ante todo, gracias por responder...
Complemento un poco más... Utilizo Ado. después simplemente hago algo así: datos.cuerpo.edit while not datos.cuerpo.eof do begin datos.cuerponumerofact.value:=número nuevo; datos.cuerpo.next; end; aquí es cuando al llegar al último registro me dá el error. Si por ej. el cuerpo de la factura 80 son 5 registros, solo me modifica 4, y el 5º me da error. A ver si hay suerte... Gracias... |
#5
|
|||
|
|||
ya que utilizas ADO, supongo que te conectaras a Access o SQL Server. La primera no se si te permitira crear relaciones de integridad, pero la segunda, seguro. Yo te aconsejo que, si puedes, lo hagas mediante relaciones de integridad (que trabaje el SGBD, que para algo lo tenemos!!!! )
Pero si no puedes porque no lo permite, yo lo haria con una sentencia SQL de Update Código:
update detalle set numerofact = nuevo num fac where numerofact = antiguo num fac Código:
while not datos.cuerpo.eof do begin datos.cuerpo.edit datos.cuerponumerofact.value:=número nuevo; datos.cuerpo.post; datos.cuerpo.next; end; Espero te sirva (y ya diras que opcion has escogido ) |
#6
|
||||
|
||||
Hola...
Supongo que el error esta en el uso del bucle WHILE. Fijate porque tal vez hace el EOF y luego ejecuta el bucle por ultima vez antes de salirse.
__________________
Gracias de antemano por vuestra ayuda. ·.:*:.·Yako·.:*:.· |
#7
|
|||
|
|||
Gracias a todos.
Cadetill, se solucionó con lo tuyo: update detalle set numerofact = nuevo num fac where numerofact = antiguo num fac Perfecto!!! Gracias... |
#8
|
||||
|
||||
En cuanto a lo que te dice el amigo Cadetill, sobre Access si puedes crear relaciones de integridad entre las tablas.
Pulsas botón derecho en la ventana de las Tablas sin seleccionar ninguna, eliges relaciones y añades las 2 tablas implicadas. Luego arrastras el campo de la tabla1 sobre el de la tabla2, teniendo en cuenta que la tabla1 sería la maestra. De esta manera accedes a un asistente gráfico, le dices que quieres intregridad referencial marcando dicha opción y luego te presentará 2 opciones más: - Actualización en Cascada. - Eliminación en Casacada. Con la primera de las opciones lograrías lo que quieres sin una línea de código, si tienes la versión correcta de ADO, ya que en algunos caso te dará el error que citas a pesar de haber realizado todos los pasos correctamente. Un Saludo. |
|
|
|