Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Locate problemas con master/detail (https://www.clubdelphi.com/foros/showthread.php?t=65431)

ehdez82 14-12-2009 22:15:58

Locate problemas con master/detail
 
Hola, estoy utilizando el método locate para buscar un registro en un clientdataset que es maestro y me está arrojando un error de "Key violation".

Maestro:
cds_Embalajes/idEmbalaje

Detalle:
cds_VentaItems/embalajeId

El código es el siguiente:

Código:

dm_Embalajes.cds_Embalajes.Locate('idEmbalaje',
      dm_Ventas.cds_VentasembalajeId.AsInteger, []);

Es error sigue la ruta siguiente:

Código:

TCustomClientDataSet.MasterChanged
    TCustomClientDataSet.CheckDetailRecords
        TCustomClientDataSet.AddDataPacket
            TCustomClientDataSet.Check

Es decir en el maestro se localiza bien el registro pero cuando se va a actualizar el CDS detalle hay algún conflicto con la llave.

He buscado en los foros pero no he encontrado nada parecido. Puede ser problema de configuración de los CDS pero he revisado y provado un montón de variantes y nada.

Cualquier sugerencia será agradecida.
Gracias de antemano.
salu2.

Al González 14-12-2009 23:11:33

:) Hola

Da gusto ver preguntas como la tuya, que contienen un mínimo de claridad para facilitar la comprensión.

Al parecer la relación establecida hace que un mismo registro detalle pueda pertenecer a dos o más registros maestros (relación muchos a muchos). Te aconsejo leer este hilo, donde se trata un problema similar: http://www.clubdelphi.com/foros/showthread.php?t=64935

Saludos.

Al González.

ehdez82 18-12-2009 01:32:25

Gracias Al Gonzales por tu respuesta y disculpa por la demora en responder.

Busqué pero no encontré ninguna llave repetida en la tabla master. En ese cds maestro utilizo el evento onFilterRecord, quizás pudo causar el conflicto.

En definitiva cambié el ADODataSet que conectaba con el CDS del problema y lo puse en cmdText con una consulta con parámetros.

Pero aqui tropezé con otro error.

Cuando trato de modificar en el CDS me tira un error 'Unable to find record. No key specified'. Tengo puesto en el campo llave el pfInKey seleccionado y en el DataSetProvider el evento onGetTableName como sigue:

Código:

procedure Tdm_Ventas.dsp_VentaItemsGetTableName(Sender: TObject; DataSet: TDataSet; var TableName: WideString);
begin
  TableName := 'embalaje_item';
end;

El error sigue la ruta:
Código:

Provider.TSQLResolver.DoUpdate(???)
Provider.TSQLResolver.InternalDoUpdate($5733D0,ukModify)
Provider.TSQLResolver.GenUpdateSQL($1AF0680,$1ACFF40,$3FEBFE8,'')
Provider.TSQLResolver.GenWhereSQL($1AF0680,$1ACFF40,$3FEBFE8,upWhereKeyOnly,'')
DB.DatabaseError('Unable to find record.  No key specified',???)

Es la primera vez que trabajo con un CDS que conecte a una consulta y no a una tabla.
Cualquier sugerencia o foro donde se maneje este tema.

Gracias de antemano.
salu2.

Al González 18-12-2009 02:30:24

Cita:

Empezado por ehdez82 (Mensaje 349093)
Gracias Al Gonzalez por tu respuesta y disculpa por la demora en responder.

Busqué pero no encontré ninguna llave repetida en la tabla master...

Pues es normal, jamás mencioné que la llave repetida estuviera en la tabla maestra. :)

ehdez82 18-12-2009 23:47:11

Tienes toda la razón, por lo visto ayer estaba un bastante saturado. Ahora vuelvo a leer el hilo que me aconsejaste y lo veo claramente. Si la tabla detalle tiene una relación de muchos a muchos habrá en memoria varios registros con la llave repetida.

Sin embargo mi relación no es N:N. Y ahora con los cambios que hice me sigue arrojando errores sobre la llave.
Si pudieras darme alguna sugerencia.

Gracias de antemano.
salu2.


La franja horaria es GMT +2. Ahora son las 17:59:51.

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