Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-07-2003
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
Unhappy 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...
Responder Con Cita
  #2  
Antiguo 23-07-2003
Avatar de javiermorales
javiermorales javiermorales is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 272
Poder: 22
javiermorales Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 23-07-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 23-07-2003
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
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...
Responder Con Cita
  #5  
Antiguo 23-07-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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
Pero si quieres hacer en un bucle, tienes un error en la forma en que lo haces

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;
Si los TTables estan unidos mediante las propiedades MasterSource y MarterField estableciendo una relacion entre ellos, seguramente en Next sobrara y tendras que cambiar el codigo antes en los detalles que en el maestro

Espero te sirva (y ya diras que opcion has escogido )
Responder Con Cita
  #6  
Antiguo 23-07-2003
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: may 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 165
Poder: 21
hgiacobone Va por buen camino
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·.:*:.·
Responder Con Cita
  #7  
Antiguo 28-07-2003
joanajj joanajj is offline
Miembro
 
Registrado: jul 2003
Posts: 144
Poder: 21
joanajj Va por buen camino
Gracias a todos.

Cadetill, se solucionó con lo tuyo:

update detalle set numerofact = nuevo num fac
where numerofact = antiguo num fac

Perfecto!!!

Gracias...
Responder Con Cita
  #8  
Antiguo 28-07-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
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


La franja horaria es GMT +2. Ahora son las 03:56:50.


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