Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Informacion de columna clave insuficiente para realizar la operacion update o refresh (https://www.clubdelphi.com/foros/showthread.php?t=42404)

Cabanyaler 13-04-2007 10:11:41

Informacion de columna clave insuficiente para realizar la operacion update o refresh
 
Hola amigos, este es el error que me salta al hacer una actualización de una tupla y sus tuplas relacionadas en otras tablas en mis BBDD.

Informacion de columna clave insuficiente para realizar la operacion update o refresh

He leido que puede ser producido por no tener bien realizada la relación entre tablas, pero en mi caso si lo tengo bien relacionado, ya que la tabla principal goza de C.Principal y la tabla esclava con su clave ajena y principal, y es como se relacionan mediante el INNER JOIN. Pongo el ejemplo:
Código SQL [-]
SELECT  DISTINCT
-- Contratos C.Principal --> CodAut_Con, Clave Ajena --> Contratos.CodCli_Con
Contratos.CodAut_Con, Contratos.CodCli_Con,Contratos.TipCon_Con, Contratos.ZonCon_Con, Contratos.IvaCon_con, Contratos.JefEqu_Con,
-- Clientes Clave Principal --> CodAut_Cli 
Clientes.CodAut_Cli, Clientes.Nomcli_Cli, Clientes.Dircli_Cli, Clientes.Codpos_Cli, Clientes.DniCli_Cli, Clientes.PobCli_Cli

FROM
   Contratos 
   LEFT OUTER JOIN Clientes
   ON Clientes.CodAut_Cli = Contratos.CodCli_Con

No he encontrado por el momento el bug de la cuestión, pero si alguien mientras lo busco me puede aportar luz, se lo agradecería.

Trabajo con componentes ADO y SQL Server.

Gracias :(

Neftali [Germán.Estévez] 13-04-2007 12:19:58

¿Estás intentando hacer un UPDATE sobre el resultado de esa consulta?
Si es así, el problema es que esa consulta tiene varias tablas relacionadas y el Gestor no sabe qué debe actualizar...

__hector 13-04-2007 17:25:17

Necesitas un primary key, o alguna columna que identifique de forma unica el registro en cada tabla. Ese error se produce cuando hay dos filas identicas, y el sql server no sabe, con el updatecommand, cual fila actualizar.

Tambien tiene que ver cuando haces joins entre tablas, y el resultado no puede ser actualizable.

Cabanyaler 17-04-2007 10:55:56

Gracias a los dos. No he contestado antes porque estaba de días libres en la oficina.

En el primer caso "Neftalí" :
Cita:

¿Estás intentando hacer un UPDATE sobre el resultado de esa consulta?
Si es así, el problema es que esa consulta tiene varias tablas relacionadas y el Gestor no sabe qué debe actualizar...
Si, en la consulta estan relacionadas mediane el JOIN, y además tengo en el SELECT de la consulta las claves principales de ambas tablas. ¿Con eso sería suficiente para que el gestor conozca que tuplas y de que tablas se trata la actualización, no?
Código SQL [-]
   LEFT OUTER JOIN Clientes
   ON Clientes.CodAut_Cli = Contratos.CodCli_Con
Y no es expresamente un UPDATE lo que intento si no un UpdateBatch(), aunque internamente supongo que será lo mismo.

En el segundo caso "hector"
Después de comprobar como veo en la contestación de Neftalí, que tengo las claves de todas la tablas relacionadas, me quedo por saber :
Cita:

Tambien tiene que ver cuando haces joins entre tablas, y el resultado no puede ser actualizable.
¿Cuando no son actualizables las consultas unidas por JOIN?

Yo no les he incluido ninguna restricción, :(
Sigo investigando y buscando la solución.

Nelet 17-04-2007 11:13:49

Buenas.

Explico mi experiencia que tiene algo que ver con esto.

En SQLServer 7.0, para que te deje actualizar una tabla desde una vista (consulta pura y dura), dicha vista tiene que ser limpita sobre la tabla .Sin joins ni unions ni leches. Que yo sepa el bayarri de SQLServer no deja actualizar tablas desde vistas con más de una tabla.

Y me da ese error precisamente.

Cabanyaler 17-04-2007 11:57:58

En referencia a Nelet:
Aleshores, ¿que fem? ;) ¿Entonces que hacemos?
Precisamente el error me aparece desde que incluí los campos que deseaba obtener de la segunda tabla en la misma consulta, es decir cuando cambié :
Código SQL [-]
Contratos.CodAut_Con, Contratos.CodCli_Con,Contratos.TipCon_Con, Contratos.ZonCon_Con, Contratos.IvaCon_con, Contratos.JefEqu_Con
FROM
   Contratos 
   LEFT OUTER JOIN Clientes
   ON Clientes.CodAut_Cli = Contratos.CodCli_Con

Por esto otro que incluye campos de la tabla cliente en el SELECT

Código SQL [-]
Contratos.CodAut_Con, Contratos.CodCli_Con,Contratos.TipCon_Con, Contratos.ZonCon_Con, Contratos.IvaCon_con, Contratos.JefEqu_Con
-- Clientes
Clientes.CodAut_Cli, Clientes.Nomcli_Cli, Clientes.Dircli_Cli, Clientes.Codpos_Cli, Clientes.DniCli_Cli, Clientes.PobCli_Cli
FROM
   Contratos 
   LEFT OUTER JOIN Clientes
   ON Clientes.CodAut_Cli = Contratos.CodCli_Con

y el motivo de esta inclusión es por desear ordenar la consulta por campos de la tabla relacionada "Clientes", ya que si no los incluyo en el SELECT, la actualización funciona o funcionaba bien.

No obstante sigo investigando hasta que no dé con la solución.

Neftali [Germán.Estévez] 17-04-2007 12:45:56

Cita:

Empezado por Cabanyaler
Aleshores, ¿que fem?

No updates sobre esa consulta directamente. Puesto que tienes clave primaria, genera una nueva SQL con el UPDATE y sólo los campos de la tabla que toca utilizando la clave primaria en el WHERE.
Si estás haciendo update sobre campos de dos tablas, genera los dos UPDATES por separado.
No se me ocurre otra cosa...

Cabanyaler 17-04-2007 12:59:32

Pues si es algo que se me había ocurrido, pero lo veía como "una escapada por el camino del medio", pero seré en este caso "maquiabélico".
Un curro, pq tengo un montón de consultas parecidas y además con varias tablas relacionadas.
Aplicaré la madre de todas las ciencias...... La Paciencia...

Gracias. :o

Nelet 17-04-2007 14:09:16

Cita:

Empezado por Cabalanyer
Aleshores, ¿que fem?

jejeje...de la palla, fem.

Estoy de acuerdo con Neftali. Un UPDATE para cada tabla.
Primero la maestra y después un UPDATE masivo en la/las hija/as.

Cabanyaler 14-05-2007 18:55:55

... en fin Pilarín....., después de mucho tiempo desde el último Post y mucho curro al márgen de la programación de la aplicación, he de decir que en realidad hoy he acabado esta parte y he decir que:
He necesitado en efecto crear un UPDATE para cada una de las tablas que estaban en la relación de la consulta. :rolleyes:

Roilo 17-05-2007 22:26:50

Hola, me pasa algo parecido....
 
Un abraso al Foro.
Necesito que miren este censillo código:
Código Delphi [-]
With master do
begin
 Open;
 locate('chapa',edit1.Text,[]);
 edit ;
 FieldByName('nombre').asstring:=edit43.Text;
 FieldByName('cidentidad').asstring:=edit44.Text;
 FieldByName('sexo').asstring:=edit45.Text;
 Refresh ;
end;

Evidentemente con esto quiero cambiar algunos valores del registro con chapa = edit1.text pero me surge el error ese del que hablamos...
Cogí, y sustituí el Refresh por el FindNext, con el propósito de que cuando se moviera en cursor dentro de la tabla la fila que modifiqué se actualizara....y me funcionó. Pero no es esa la solución que busco porque en otras partes de mi código ... no me cuadra. como dice Cabanyaler, si alguien mientras lo busco me puede aportar luz, se lo agradecería.Trabajo con componentes ADO y SQL Server.

mecaendi 04-06-2007 13:25:04

Bueno, no sé si os valdrá de mucho pero yo lo he resuelto del siguiente modo:

En el Administrador corporativo de SQL2000, puse 'Establecer clave principal' en la clave unica (en mi caso ID_ALARMA_MEDIO' de la tabla relacionada y funcionó.

El caso es que desde una ADOQuery que hacia una consulta con INNER JOIN de tres tablas no puse la clave princial de la tabla varios-a-varios en el adm. corporativo y me daba el fallo. Una vez puesto el ADOQuery funciona correctamente.

Saludos.


La franja horaria es GMT +2. Ahora son las 16:35:11.

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