![]() |
Dá error "Master has detail records" cuando no debería darlo!
Hola! Después de agotar todas las posibilidades (creo) les vengo a pedir ayuda sobre un tema puntual. Estoy haciendo un programa que "depura" registros que tienen varias tablas dependientes, y una de estas tiene a su vez otras cuatro tablas dependientes.
La estructura de las tablas es así: - ORDENES.DB (maestro) de esta dependen - VALE.DB - ITEMREP.DB - ITEMTER.DB - ITEMTEX.DB - ITEMOBS.DB - ITEMMOB.DB - ITEMCOMB.DB - NDBNCR.DB y de esta última dependen - NITEMMOB.DB - NITEMREP.DB - NITEMTER.DB - NITEMTEX.DB Primero, de un determinado rango de fechas paso los registros a otro juego de tablas iguales, cuyo nombre tiene una D adelante (ej: DORDENES.DB, DITEMREP.DB, etc.) Esto funciona bien. Lo que entonces tengo que hacer a continuación es borrar estos registros que acabo de pasar, por lo que borro primero en los NITEM, luego en los que dependen de ORDENES y luego el registro en ORDENES. Lo corro pero de vez en cuando me tira algún error "Master has detail records", más precisamente cuando intento borrar el NDBNCR (se borran CIENTOS de registros antes de q dé esto, por eso no sé cual es el error, mirándo el registro no descubro nada diferente). La subrutina de borrado que uso es la siguiente:
Todas las tablas dependientes tienen el campo ['Nro_Orden'] que es el que las relaciona, a mi me parece que el proceso de borrado está bien (aunque evidentemente no lo está) ¿Se les ocurre algo? Cualquier ayuda u opinión que me puedan brindar será muy apreciada. Gracias! Juan Pd: Disculpen la longitud del mensaje! Traté de explicarme bien. |
Al ver la extensión DB parecen archivos paradox, en este caso, cuando se borra con delete, no se adelanta el puntero al registro activo, sino que decrece, por tanto, no debes usar while not tabla.eof sino más bien
while not tabla.bof o incluso while tabla.RecordCount>0 Otra forma más rapida sería con una consulta de borrado:
Por supuesto, en el array de Nombres, las tablas irían puesta en orden inverso al que tú has redactado, precisamente para evitar el error de Master-Detail. Sólo un detalle más, la variable Nombres no puede estar declarada en un procedimiento, ya que Delphi no deja inicializar variables en dicho lugar, debes ponerla como variable "global" del módulo. Edito: Lo he escrito de memoria, si tienes algun problema comentalo. Un saludo, y espero que todavía te sirva. |
Hola Lepe! Gracias por tu respuesta, lo resolví mediante consultas como me sugeriste pero de otra manera:
Un poco engorroso... pero funciona! De nuevo, gracias... Juan |
Creo que deberías eliminar las lineas:
Params[0].asstring; Params[1].asdate; Y Params[0].asinteger; Que sobran en el código. Un saludo |
La franja horaria es GMT +2. Ahora son las 06:49:29. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi