Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-04-2007
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
Unhappy 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
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
Responder Con Cita
  #2  
Antiguo 13-04-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿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...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 13-04-2007
Avatar de __hector
[__hector] __hector is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Santo Domingo, Rep. Dom.
Posts: 1.075
Poder: 23
__hector Va por buen camino
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.
__________________
Héctor Geraldino
Software Engineer
Responder Con Cita
  #4  
Antiguo 17-04-2007
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
Unhappy

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.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.

Última edición por Cabanyaler fecha: 17-04-2007 a las 10:59:53.
Responder Con Cita
  #5  
Antiguo 17-04-2007
Nelet Nelet is offline
Miembro
 
Registrado: may 2003
Ubicación: Picassent - Valencia
Posts: 95
Poder: 21
Nelet Va por buen camino
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.
__________________
_____________________________________
And follow me to where the real fun is
Responder Con Cita
  #6  
Antiguo 17-04-2007
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
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.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
Responder Con Cita
  #7  
Antiguo 17-04-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 17-04-2007
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
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.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
Responder Con Cita
  #9  
Antiguo 17-04-2007
Nelet Nelet is offline
Miembro
 
Registrado: may 2003
Ubicación: Picassent - Valencia
Posts: 95
Poder: 21
Nelet Va por buen camino
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.
__________________
_____________________________________
And follow me to where the real fun is
Responder Con Cita
  #10  
Antiguo 14-05-2007
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
... 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.
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
Responder Con Cita
  #11  
Antiguo 17-05-2007
Roilo Roilo is offline
Miembro
 
Registrado: nov 2005
Ubicación: Mayarí, Cuba
Posts: 143
Poder: 19
Roilo Va por buen camino
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.

Última edición por Roilo fecha: 17-05-2007 a las 22:30:18.
Responder Con Cita
  #12  
Antiguo 04-06-2007
mecaendi mecaendi is offline
Registrado
 
Registrado: abr 2006
Posts: 1
Poder: 0
mecaendi Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Espacio de almacenamiento insuficiente para completar esta operación Aldo OOP 1 13-02-2007 14:57:08
informacion de columna clave insuficiente vipernet MS SQL Server 6 07-09-2006 20:26:40
Espacio insuficiente para completar la operación aig .NET 3 06-10-2004 13:25:47
superADO en busca del Espacio insuficiente para completar la operación aig Conexión con bases de datos 4 01-10-2004 18:03:02
Insuficiente memoria para esta operacion, Alias:dbSPI orfeo Conexión con bases de datos 3 17-02-2004 03:25:32


La franja horaria es GMT +2. Ahora son las 18:29:15.


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
Copyright 1996-2007 Club Delphi