Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error Master Missing Record (https://www.clubdelphi.com/foros/showthread.php?t=38426)

Edgtho 14-12-2006 14:48:26

Error Master Missing Record
 
Esto es algo que me ha pasado tanto con Paradox como con Mysql por eso pongo aquí el mensaje.

El caso es que yo tengo una tabla de clientes, que cuenta con integridad referencial en varios campos (cuentacontable, divisa,provincia y tarifa). Estoy diseñando un programa que traspasa datos de una tabla a otra y me encuentro que muchas veces al hacer el POST me devuelve el error

"master missing record"

Pero no me identifica el campo en la cual la integridad referencial esta fallando.
En el try except tengo esto

Código:

try
except       
on E: Exception do
      begin
            mLog.lines.add(E.Message);
            exit;
      end;

¿Hay alguna manera de poder devolver dentro del mensaje de error el campo que esta ocasionando el fallo?

Crandel 14-12-2006 15:36:14

Hola, muy posible que tu problema sea qe estas pasando los datos de la tabla detalle antes que los datos de la tabla maestro.

Para saber en que campo se origino el problema, podrias tener una variable que guarde el numero o nombre del campo que estas escribien y en la excepcion lo escribes tu log.

Espero que te ayude a resolver el problema.

Edgtho 15-12-2006 10:53:25

Crandel no es un problema de la tabla detalle. Por otra parte no me sirve de nada guardar en una variable el nombre del campo, ya que el error salta cuando ejecuto "tabla1.post" no cuando asigno el valor de un campo a otro. De esa manera tendria siempre el nombre del ultimo campo de la tabla.

De todas maneras gracias por tu respuesta

Crandel 15-12-2006 11:50:36

Cita:

Empezado por Edgtho
Crandel no es un problema de la tabla detalle. Por otra parte no me sirve de nada guardar en una variable el nombre del campo, ya que el error salta cuando ejecuto "tabla1.post" no cuando asigno el valor de un campo a otro. De esa manera tendria siempre el nombre del ultimo campo de la tabla.

y quien es tabla1???

Edgtho 15-12-2006 15:20:42

Tabla1 es un nombre que te he puesto de ejemplo, pero puede ser cualquier nombre que quieras ponerle. Lo esencial es como dentro del codigo de la excepcion se puede averiguar el nombre del campo que falla.

Los valores de Exception de tipo E:Exception o E: DatabaseError no acompañan del nombre del campo que ocasiona el fallo solo del fallo en si. Eso es lo que me interesa averiguar.

Por ponerte un ejemplo para que lo veas claro

Supongamos tabla1 = clientes.db

Código:

try
    tabla1.append;
    tabla1.fieldbyname('CODIGO').AsString := Campo1;
    tabla1.fieldbyname('NOMBRE').AsString := Campo2;
    tabla1.fieldbyname('DIVISA').AsString := Campo3;
    tabla1.fieldbyname('TARIFA').AsString := Campo4;
    tabla1.fieldbyname('PROVINCIA').AsString := Campo5;
    tabla1.post;
except
  On E: DatabaseError do
  begin
      ShowMessage(e.Message);
  end;

En donde Divisa, Tarifa y Provincia son campos que cuentan con integridad referencial hacia sus respectivas tablas.
Te salta un error al ejecutar el POST de tipo "Master missing record", que es lo que contiene e.Message
¿Como identificar que el error se produce en Tarifa, Divisa o Provincia?

Crandel 16-12-2006 01:56:45

Cita:

Empezado por Edgtho
Tabla1 es un nombre que te he puesto de ejemplo, pero puede ser cualquier nombre que quieras ponerle.

En realidad lo del nombre no es trivial, porque justamente por el tipo de error es que te falta el campo al cual hace referencia en la tabla maestro.

Cita:

Empezado por Edgtho
Lo esencial es como dentro del codigo de la excepcion se puede averiguar el nombre del campo que falla.
...
En donde Divisa, Tarifa y Provincia son campos que cuentan con integridad referencial hacia sus respectivas tablas.
Te salta un error al ejecutar el POST de tipo "Master missing record", que es lo que contiene e.Message
¿Como identificar que el error se produce en Tarifa, Divisa o Provincia?

Aca queda un poco mas claro, lo primero que debes hacer es llenar las tablas Tarifa, Divisas y Provincia, y por último la Clientes.

Para encontrar donde esta tu problema o mas bien evitar el error puedes, por ejemplo, escribir un simple condicional que busque el valor en la Provincia, si el valor no existe en esa tabla que te escriba en un log que ese registro no se ha agregado y que continue con el siguiente.

Edgtho 16-12-2006 03:06:56

Crandel, me vuelves a enfocar la solucion en un problema causado por supuesto desconocimiento de lo que es un maestro/detalle. Es de perogrullo y de principiante saber que primero tienes que rellenar unas tablas y despues otras. Y me gustaria no tener que volver a escribir por tercera vez lo mismo. Olvidate de maestros y detalles y de los nombres que les puedas poner a los componetes TTABLE y derivados.

Habia intentado plantear la pregunta de la manera mas sencilla posible para un mejor entendimiento. Veamos ahora si te explico la situacion entera lo entiendes mejor.

El programa que intento desarrollar realiza la sincronizacion entre tres tiendas con un servidor central. En cada tienda puedes dar de alta clientes u cualquier otro registro y este despues a una hora determinada se sincroniza con el servidor guardandose en una tabla unica los registros de las tres tiendas.
Asi si tenemos los clientes en la tienda 1 (1001,1002,1003), en la tienda 2 (2001,2003) y en la tienda 3 (3001,3002) en la tabla clientes del servidor tendriamos (1001,1002,1003,2001,2003,3001,3002). Esto es un ejemplo de una simple tabla (tenemos albaranes, facturas, vencimientos, etc que no son ya tan simples) y como comprenderas no se puede garantizar el que se rellenen todos los datos

¿Sabes cual seria el costo de tener que buscar en cada tabla de un campo de integridad referencial para saber si se cumple o no? Esto haria el programa lento e inviable en cuando se alcanzase determinada cantidad de registros. Eso sin contar con que tendrias que multiplicar el esfuerzo por tres (tres tiendas recuerdas?)

Si no sabes una forma en la cual dentro de una excepcion se pueda averiguar el campo causante de la misma, mejor me dices que no se puede y punto por que la solucion chapucera ya la sabia. Y dejamos de marear la perdiz. Lo siento si parezco seco y un gilipoyas, pero tener que explicarme en formato biblia cuando habia planteadoa un enunciado simple y claro me parece rayante.


La franja horaria es GMT +2. Ahora son las 10:22:31.

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