Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

INSERT o UPDATE en consultas con JOIN

77 views
Skip to first unread message

Vicente Alonso

unread,
Apr 24, 2003, 7:01:06 AM4/24/03
to
INSERT o UPDATE en consultas con JOIN

Hola a todos,

Se me ha planteado un problema al modificar un programa
que trabaja con ACCESS para que funcione con SQLServer.

Para simplificar pongo un ejemplo:

Tenemos 2 tablas

Tabla Articulos
Campo Codigo
Campo Nombre

Tabla Stocks
Campo Codigo (de Articulo)
Campo Cantidad

Montamos la consulta siguiente:

SELECT stocks.codigo, articulos.nombre, stocks.cantidad
FROM stocks LEFT JOIN articulos
ON stocks.codigo = articulos.codigo

Esto lo utilizamos en un grid (en Visual Basic) de 3 columnas
para que el operador teclee el codigo en la primera columna,
se visualiza el nombre en la segunda, y teclea una cantidad
en la tercera columna que se grabará en la tabla Stocks.


Al editar la columna CANTIDAD se produce el error:
Información de columna clave insuficiente para realizar
la operación update o refresh

Hay que indicar que si editamos la consulta desde ACCESS
va perfectamente, pero desde SQL Server no.


Supongo que hay que cambiar el método para trabajar con
SQL Server, pero ¿cual es la manera para conseguir el
mismo resultado?
¿Crear Vistas? ¿Tablas temporales?....

Gracias a todos de antemano.

Fernando España

unread,
Apr 24, 2003, 10:11:49 AM4/24/03
to
Este error, regularmente se produce porque no tienes una clave unica en tus
registros y la condicion where no sabe que datos actualizar, puedes checar
esto?

--
Fernando España
Gerente Desarrollo
ATISA
www.atisa.com.gt
"Vicente Alonso" <che...@randomco.net> wrote in message
news:3EA7C3F2...@randomco.net...

Vicente Alonso

unread,
Apr 24, 2003, 9:58:55 AM4/24/03
to
Gracias de ante mano Fernando, pero el 'problema' va un poco mas lejos.
Con base de datos en Access esta consulta va perfecta al añadir,
eliminar o editar, pero en sql server, si elimino un registro de la
CONSULTA desaparece no solo el registro de la tabla stocks
, si no que tambien se elimina el de la tabla Articulos. Y esto es muy
peligroso. Yo quiero manterner la fichas de Articulos auque no tengan stock.

Si pongo claves unicas funciona, pero la consulta, al insertar un nuevo
registro, que solo lo quiero en la tabla stocks, tambien añade uno en la
tabla articulos, y no quiero dos ocurrencias del mismo articulo en la
tabla articulos

Todo esto trato de hacerlo mediate el TrueDBGrid 6.0

Fernando España

unread,
Apr 24, 2003, 10:40:14 AM4/24/03
to
OK, entonces el error, esta en el diseño que estas usando para agregar los
registros, es decir, quiza tu dbgrid esta haciendo referencia a una vista
actualizable de acces que involucra tanto la tabla de stocks como la de
articulos, y quiza esto te esta enviando ese dato y al eliminar no hay
problema, ya que elimina el registro de las dos tablas, pero al hacer
update, no estas incluyendo todos los datos de las dos tablas y esto produce
el error, me imagino porque al ingresar el producto que deseass actualizar,
despliegas el nombre o algo asi, no tengo mucha idea de como funcionan las
vistas en acces, pero te recomendaria que direcciones los datos de tu grid
unicamente a la tabla stock, te aseguro que si lo haces asi y lo pruebas ya
no tendras ese error, entonces lo que podrias utilizar es agregar un campo
calulado en tu tabla stock que llame a una funciona y esta despliegue el
nombre del producto asi no tendrias este problema, o buscar otro metodo para
desplegar esa informacion relacionada y que tus
actualizaciones,eliminaciones actuen unicamente sobre una tabla.

--
Fernando España
Gerente Desarrollo
ATISA
www.atisa.com.gt
"Vicente Alonso" <che...@randomco.net> wrote in message

news:3EA7ED9...@randomco.net...

Vicente Alonso

unread,
Apr 24, 2003, 12:03:24 PM4/24/03
to
> ...........

> no tendras ese error, entonces lo que podrias utilizar es agregar un
> campo calulado en tu tabla stock que llame a una funciona y esta
> despliegue el nombre del producto asi no tendrias este problema, o
> ....

Gracias Fernando.
He definido una función que se llama DameArticulo con la siguiente sintaxis:

CREATE FUNCTION DameArticulo (@Articulo varchar(16))
RETURNS nvarchar(50)
AS
BEGIN
RETURN (SELECT Descripcion FROM Articulos WHERE Codigo = @Articulo)
END

Añado un campo llamado descripción a la tabla stocks...
¿Cómo, en diseño de la tabla, le digo que ese campo reciba los datos de
esa función?


----
Saludos
Vicente Alonso
Cuenta Messenger: che...@randomco.net

Fernando España

unread,
Apr 24, 2003, 12:40:36 PM4/24/03
to
en modo de diseño es un poco complicado, es mas secillo que lo hagas a
travez de una secuencia de comandos

alter table ... add.. column ... y toma en cuenta esto:
.dbo.damearticulo(stock.articulo) as nombre usa tabla.nombre del campo para
que funcione perfecto, saludos.


--
Fernando España
Gerente Desarrollo
ATISA
www.atisa.com.gt
"Vicente Alonso" <che...@randomco.net> wrote in message

news:3EA80AC...@randomco.net...

Vicente Alonso

unread,
Apr 24, 2003, 2:05:04 PM4/24/03
to
ALTER TABLE Stocks ADD Descripcion AS
dbo.DameArticulo(dbo.[Stocks].[Articulo])


He creado mediante una secuencia de comandos el campo Descripcion en la
tabla Stocks. Ya puedo INSERTAR, ELIMINAR y EDITAR datos en la tabla de
stocks sin modificar nada an la de artículos, paro sigo sin poder
mostrar en el grid la descripcion del articulo cuando el usuario teclea
el codigo.

El Grid está ligado a un ControlData cuyo RecordSource es la siguiente
consulta:

SELECT Articulo, Descripcion, Cantidad FROM Stocks

Pretendo que cuando el usuario, en la rejilla teclee un codigo de
articulo y pulse Intro, mostrarle su descripcion en la Columna siguiente
de la Rejilla.

Fernando España

unread,
Apr 24, 2003, 2:44:38 PM4/24/03
to
bueno, la funcion no te devolvera los dats que desees hasta que no guardes
los registros en la tabla, pero si puedes asignar a tu grid el resultado de
un select que puedas enviar desde tu aplicacion cuando ingresen el dato, y
colocar ese registro como de no update, asi no tendras problemas, y cuando
ya tengas guardada tu
info y la consultes de nuevo, ya te desplegara esos datos., puedes tomar
idea de esto.

--
Fernando España
Gerente Desarrollo
ATISA
www.atisa.com.gt
"Vicente Alonso" <che...@randomco.net> wrote in message

news:3EA82750...@randomco.net...

Vicente Alonso

unread,
Apr 25, 2003, 1:49:09 PM4/25/03
to
Pues muchas gracias por todo Fernando. Ente la imposibilidad de que
trabaje como pretendia el Grid, he optado por no ligarle a datos
y llenarle manualmente. Pero tu ayuda me ha dado muchas pistas sobre las
diferencias del motor de ACCESS y el de SQL Server.

Para lo que quieras te dejo mis datos.

--
Saludos cordiales de:
Vicente Alonso Rentería
Dpto. Desarrollo
Random Computers
Canalejas, 11
Santander (Cantabria)
España
Tlf: 942 311514

0 new messages