PDA

Ver la Versión Completa : No me inserta un registro nuevo, me modifica el anterior


vhirginia
06-05-2004, 23:07:05
Hola compañeros,
Tengo una relación maestro/detalle en mis tablas Paradox. Al insertar un nuevo registro en la tabla detalle, en un DBLookUpCombobox escojo un campo clave, que selecciono de una tabla ya existente (en este caso la tabla maestro) .

Anteriormente tengo asignado el "mitabla.Append" en el botón que me abre el Form con la información del nuevo registro a insertar y también el correspondiente "mitabla.FlushBuffers" en el evento AfterPost de la tabla correspondiente (tabla detalle en este caso). Espero estarme explicando bien.

El problema es que al seleccionar en el DBLookUpCombobox uno cualquiera de los items correspondientes al campo clave, si ya tienen elementos en la tabla detalle, me muestra en todos los Edits la información del último registro, y al intentar cambiarlo o borrarlo, pues me lo toma cómo si modificara los datos y simplemente me escribe encima.

Espero que me podais ayudar y si no he sido lo suficientemente clara me lo expreseis.

Muchas gracias.

JamesBond_Mx
07-05-2004, 18:32:36
Bueno, primero que nada, estas utilizando bien las propiedades DataField, DataSource, ListField y ListSource de DBloockUp?, por que debido al comportamieto que describes supongo que no, al parecer solo tienes asignadas las propiedades DataField y DataSource, y por eso pasa lo que dices, lo que tienes que hacer es en la propiedad ListSource elegir la tabla de donde va a tomar los datos a mostrar, y en la propiedad ListField, el campo que va a proporcionar los datos a mostrar, ahora en la propiedad DataSource, pondrás la tabla donde va a almacenar los datos y en DataField el campo donde almacenará estos datos, ya que de lo contrario, solo tomará o mostrará los datos que se encuentran en la tabla destino, y por tal motivo al elegir tú uno, te muestra datos e los demás campos.

Espero haber sido explicito.

Suerte.

vhirginia
07-05-2004, 18:45:34
hola,
en el ListSource tenemos la tabla maestro, y en ListField el campo por el que se muestra. Aunque me deja poner en el DataSource la tabla detalle, no me deja poner nada en el DataField, porque me dice que es una relación circular, y supongo que es porque los dos campos en las dos tablas se llaman de la misma forma. Así que tengo esas dos propiedades a vacio.

Gracias

andres1569
07-05-2004, 19:02:46
Hola:

Lo de la referencia circular no tiene nada que ver con que coincidan los nombres de los campos (éso es bastante común que suceda entre tablas con campos relacionados) sino por usar como tabla de búsqueda (Lookup) la misma de la que depende (la maestra). Te recomiendo que uses otro objeto TTable para ligar como Lookup, aunque acceda a la misma tabla física, a ver si así no saltan esos problemas.

Saludos

vhirginia
08-05-2004, 10:59:45
gracias andres1569,
hice lo que me dijiste, creé una nueva tabla en el form correspondiente (en el cual quiero añadir un nuevo registro a la tabla detalle) y le asigné a la tabla física maestro, y me da el siguiente error: "Proyect x raised exception class EDBEngineError with message 'Key Violation'. Process stoped...."
este error sale al aceptar el nuevo registro.
Gracias por vuestra ayuda.

andres1569
08-05-2004, 18:13:21
Hola:

El error de "Key violation" no tiene nada que ver con el primer problema que planteaste, se debe a que estás repitiendo el valor de la clave principal (o en todo caso de álgún campo/s que constituya/n un índice definido como único), esto es algo básico que debieras saber.

Respecto a la primera cuestión que planteaste, no acabo de entender que quieras hacer un lookup a la tabla maestra desde la de detalle, normalmente los lookups se realizan sobre tablas auxiliares donde reside la definición o información adicional que queremos mostrar. Para ello nos valemos de un campo que hace de nexo, pero en una relación maestro-detalle ese nexo se supone que ya lo tienes establecido, no hay lugar para hacer el lookup.

Mejor explica qué pretendes hacer y quizás veamos la forma correcta de abordarlo.

vhirginia
09-05-2004, 21:59:43
hola compañeros,
lo que queremos hacer es mostrar todos los registros de la tabla maestra, pero sólo un campo, en este caso NIF, que son todos los NIF de los clientes que he creado. Con toda esta información en un DBLookUpComboBox, lo que queremos es seleccionar uno y crear una factura sobre dicho cliente, factura que pertenecerá a la tabla detalle, que está únida con la maestro por el campo NIF. Esperamos habernos explicado bien. Realizamos lo de poner un TTable y un DataSource en el form donde creamos el nuevo registro para la tabla facturas, para que no me pusiera lo de "Circular Reference" pero después de conseguirlo me dió el último problema aquí expuesto, es decir, lo de Key Violation. Espero que nos hayais entendido

Muchísimas gracias.

marcoszorrilla
09-05-2004, 22:09:37
Como ya dijo Andrés anteriormente, el error Keyviolation, no tiene nada que ver con lo planteado anteriormente, esto ocurre únicamente cuando se repite la clave maestra de la tabla en cuestión.

Por otra parte la tabla facturas no debe de ser detalle de la de clientes, cuando queramos ver todas las facturas de un cliente, no tenemos más que poner un filtro o atacar con SQL:

Facturas.Filter:='NIF = '+QuotedStr(Edit1.Text);
Facturas.Filtered:=True;



Query1.Close;
Query1.Sql.Clear;
Query1.Sql.Add('Select * From facturas Where Nif = '+QuotedStr(Edit1.Text));
Query1.Active:=True;


Y para finalizar la factura será maestro de sus lineas que estarán en otra tabla.

Por lo que el DbLookUpComboBox que muestra los clientes no hará más que mostrar los clientes para elegir uno.

Finalmente sería conveniente eliminar la relación maestro detalle entre las tablas clientes -> Facturas y crear una sino existe entre facturas -> lineas de factura.

Un Saludo.

andres1569
10-05-2004, 11:47:36
Hola vhirginia:

Más cosas, aparte de lo que te recomienda Marcos.

Creo haberos entendido. La tabla de facturas (cabeceras de facturas, TACabFactu por ejemplo) está ligada en master-detail a la de clientes (TAClientes) mediante el campo NIF ¿es así? Lo que quieres es, a su vez, poder elegir el NIF del cliente de un DBLooupComboBox ¿correcto? En dicho caso conviene que emplees un segundo TTable auxiliar (TAClientesAux) enlazado a la tabla física de Clientes, y enlaces el DBLookupCombo a dicho TTable, NO al que estás utilizando como tabla maestra. Mejor aún es que lo enlazaras a una consulta, TQuery, que sólo devolviera los NIFs (¿ordenados tal vez?) más algún campo adicional necesario para identificar al cliente, de forma que redujeras el tráfico de datos (ten en cuenta que los clientes pueden ser muchos).

El que te salte el error de "key violation" es tema aparte; se deberá a que se repite el campo o campos que conforman la clave maestra de la tabla de facturas (TACabFactu), normalmente este campo es el mismo Número de Factura (irrepetible), o bien un numerador interno. No veo qué relación tiene este problema con lo del NIF, salvo que, y ahora estoy pensando maliciosamente, tengas un error de diseño y en facturas el campo NIF actúe de clave maestra o algo por el estilo, eso limitaría a una sola factura por cliente, y saltaría el error al querer facturar al mismo cliente una segunda vez. Si no es esto, revisa bien los campos clave del TDBLookupComboBox, también estoy pensando que por error hayas asignado el Datasource a la misma tabla de clientes, lo cual es incorrecto. Aquí va un ejemplito:

Datafield : NIF
DataSource: TACabFactu (tabla de facturas)

Keyfield: NIF
Listfield: Apellidos; Nombre; NIF ... (lo que sea más fácil para identificar al cliente)
ListSource: TAClientesAux (tabla de clientes auxiliares)


Saludos

vhirginia
10-05-2004, 23:36:17
Muchas gracias compañeros,
ya solucionamos nuestro error.


tengas un error de diseño y en facturas el campo NIF actúe de clave maestra
o algo por el estilo.



jeje un pequeño error que nos ha liado, pero ya está. Muchísimas gracias.

un saludo al foro.

andres1569
11-05-2004, 13:04:38
Rectificación: donde dije "clave maestra", quise decir "clave primaria".

Si efectivamente va por ahí el error, éste no es pequeño, vhirginia, te recomiendo que te mires un buen manual de Bases de Datos, el NIF debes definirlo como índice secundario (para facilitar mediante dicho índice las búsquedas que hace Delphi / BDE / ... en la tabla de clientes), a lo sumo podría ser parte integrante de la clave maestra junto a otro campo que le dé unicidad a la clave (aunque esto me parecería una exageración).

Saludos