Procedimiento que no funciona

29/06/2007 - 10:00 por Angel Zapata | Informe spam
Hola a todos,

tengo este procedimiento para actualizar los datos de una tabla en función
del resultado de una consulta, pero algo no he tenido que hacer bien pues no
funciona y no le encuentro la punta.

Muchas gracias de antemano por su ayuda


Alter PROCEDURE spHojaCargaLiquidacionArticulo
@CargaNumero AS Bigint,
@AlbaranEjercicio AS VarChar(4),
@AlbaranCanal AS Smallint,
@AlbaranNumero AS Bigint AS
DECLARE @ArticuloCodigo AS Bigint,
@ArticuloConfirmado AS Smallint,
@ArticuloCantidad AS Smallint
DECLARE CursorArticulos CURSOR FOR

SELECT HojaCargaArticulo.CargaArticulo, HojaCargaArticulo.CargaConfirmado,
SUM(Pedido_Det.PdtCantidad) AS Cantidad
FROM HojaCargaAlbaran INNER JOIN Albaran_Pedido ON
HojaCargaAlbaran.CargaAlbaran = Albaran_Pedido.AlpAlbCodigo
AND HojaCargaAlbaran.CargaAño = Albaran_Pedido.AlpAlbAño
AND HojaCargaAlbaran.CargaCanal = Albaran_Pedido.AlpAlbPcaCanCodigo
INNER JOIN Pedido_Det ON Albaran_Pedido.AlpAlbPcaCanCodigo Pedido_Det.PdtPcaCanCodigo
AND Albaran_Pedido.AlpPcaAño = Pedido_Det.PdtPcaAño
AND Albaran_Pedido.AlpPcaCodigo = Pedido_Det.PdtPcaCodigo
INNER JOIN HojaCargaArticulo ON HojaCargaArticulo.CargaArticulo Pedido_Det.PdtArtCodigo
AND HojaCargaAlbaran.CargaNumero = HojaCargaArticulo.CargaNumero
WHERE HojaCargaAlbaran.CargaNumero = @CargaNumero
AND HojaCargaAlbaran.CargaAño = @AlbaranEjercicio
AND HojaCargaAlbaran.CargaCanal = @AlbaranCanal
AND HojaCargaAlbaran.CargaAlbaran = @AlbaranNumero
GROUP BY HojaCargaArticulo.CargaArticulo, HojaCargaArticulo.CargaConfirmado
OPEN CursorArticulos
FETCH NEXT FROM CursorArticulos
INTO @ArticuloCodigo, @ArticuloConfirmado, @ArticuloCantidad
WHILE @@FETCH_STATUS = 0
BEGIN
/* Actualiza articulos confirmados en hoja de carga */
UPDATE HojaCargaArticulo SET HojaCargaArticulo.CargaConfirmado @ArticuloConfirmado - @ArticuloCantidad
WHERE HojaCargaArticulo.CargaNumero=@CargaNumero
AND HojaCargaArticulo.CargaArticulo = @ArticuloCodigo
END
CLOSE CursorArticulos
DEALLOCATE CursorArticulos

Angel Zapata
"Si no sabes hacia adonde vas, lo mas probable es que no llegues a ninguna
parte"

Preguntas similare

Leer las respuestas

#6 Maxi
02/07/2007 - 14:35 | Informe spam
Angel, vayamos por partes, con tu explicacion no te entendi muy bien que
digamos, en primer lugar ponenos las estructuras de las tablas, en segundo
lugar algunos ejemplos de datos luego decinos que queres tener como
resultante y ahi veremos cual es la sentencia mas adecuada para hacerla, no
creo que para lo que estas buscando necesites cursores ni mucho menos, pero
vos nos estas diciendo como estas haciendo las cosas y no que deseas
realmente resolver, vayamos a ese punto y veamos como te podemos ayudar :)


-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"Angel Zapata" <a n g e l . z a p a t a @ s i g l h o g a r x x i . c o m>
escribió en el mensaje news:
Lo que necesito hacer es actualizar una tabla de totales según el
resultado
de una consulta pero si utilizo UPDATE como la consulta me puede dar, en
algunos casos, mas de un registro con el mismo codigo de artículo, solo me
contempla el primero, no suma, por tanto no me vale.

Aquí pongo la sentencia utilizada hasta ahora:

SQLConsulta = "UPDATE HojaCargaArticulo " _
& "SET HojaCargaArticulo.CargaConfirmado = [CargaConfirmado] -
[PdtCantidad]
" _
& "FROM ((HojaCargaAlbaran INNER JOIN Albaran_Pedido ON
(HojaCargaAlbaran.CargaAlbaran = Albaran_Pedido.AlpAlbCodigo) " _
& "AND (HojaCargaAlbaran.CargaAño = Albaran_Pedido.AlpAlbAño) " _
& "AND (HojaCargaAlbaran.CargaCanal = Albaran_Pedido.AlpAlbPcaCanCodigo))
"
_
& "INNER JOIN Pedido_Det ON (Albaran_Pedido.AlpAlbPcaCanCodigo > Pedido_Det.PdtPcaCanCodigo) " _
& "AND (Albaran_Pedido.AlpPcaAño = Pedido_Det.PdtPcaAño) " _
& "AND (Albaran_Pedido.AlpPcaCodigo = Pedido_Det.PdtPcaCodigo)) " _
& "INNER JOIN HojaCargaArticulo ON (HojaCargaArticulo.CargaArticulo > Pedido_Det.PdtArtCodigo) " _
& "AND (HojaCargaAlbaran.CargaNumero = HojaCargaArticulo.CargaNumero) " _
& "WHERE (((HojaCargaAlbaran.CargaNumero)=" &
GridHojaCarga.Cell(flexcpValue, GridHojaCarga.RowSel,
GridHojaCarga.ColIndex("Hoja")) & ") " _
& "AND ((HojaCargaAlbaran.CargaCanal)=" & GridAlbaran.Cell(flexcpValue,
Row,
GridAlbaran.ColIndex("AlbaranCanal")) & ") " _
& "AND ((HojaCargaAlbaran.CargaAño)='" & GridAlbaran.Cell(flexcpText, Row,
GridAlbaran.ColIndex("AlbaranAño")) & "') " _
& "AND ((HojaCargaAlbaran.CargaAlbaran)=" & GridAlbaran.Cell(flexcpValue,
Row, GridAlbaran.ColIndex("AlbaranNumero")) & "))"

pero como digo, si en el caso de los artículos incluidos en el albaran hay
dos lineas con el mismo artículo porque tienen diferente precio, entonces
solo contempla la primera linea y por tanto las existencias calculadas son
erroneas.

Muchas gracias por vuestro interes

Angel Zapata
"Si no sabes hacia adonde vas lo mas probable es que no llegues a ninguna
parte"


Respuesta Responder a este mensaje
#7 Angel Zapata
02/07/2007 - 19:19 | Informe spam
Tienes razón Maxi, "haz lo que yo diga pero no lo que yo haga" es un refran
de mi abuela, y yo lo he aplicado. A todo el mundo le digo lo mismo que tu
me has dicho a mi, y yo no lo hago.

Te cuento
Tabla 1 - Existencias
Almacen/Codigo/Cantidad
01 / 00001 / 5
01 / 00002 / 7
01 / 00003 / 10

Tabla 2 - Albaranes
Almacen / Articulo / Cantidad
01 / 00001 / 1
01 / 00001 / 4
01 / 00002 / 3
01 / 00003 / 5

En la tabla de albaranes aparece dos veces el mismo articulo pues tiene
diferente precio y por tanto no se pueden agrupar en una linea.

Yo necesito restar de la cantidad de la tabla existencias la cantidad
resultante en los albaranes, es decir, 5 unidades al articulo 1, 3 al
articulo 2 y 5 al articulo 3, pero en la sentencia que he puesto UPDATE no
puedo utilizar SUM para el campo [PdtCantidad], o al menos no se como
hacerlo, entonces los datos que recoge de la clausula FROM serían:
Almacen / Articulo / Cantidad
01 / 00001 / 1
01 / 00002 / 3
01 / 00003 / 5

no teniendo en cuenta la segunda línea del artículo 1.

Por diseño de la base de datos, necesito manejar 4 tablas,
HojaCargaArticulo (donde se descuentan las existencias),
HojaCargaAlbaran
Albaran_Pedido
Pedido_Det (donde tengo las lineas de pedido)

SQLConsulta = "UPDATE HojaCargaArticulo " _
& "SET HojaCargaArticulo.CargaConfirmado = [CargaConfirmado] -
[PdtCantidad] " _
& "FROM ((HojaCargaAlbaran INNER JOIN Albaran_Pedido ON
(HojaCargaAlbaran.CargaAlbaran = Albaran_Pedido.AlpAlbCodigo) " _
& "AND (HojaCargaAlbaran.CargaAño = Albaran_Pedido.AlpAlbAño) " _
& "AND (HojaCargaAlbaran.CargaCanal = Albaran_Pedido.AlpAlbPcaCanCodigo)) "
_
& "INNER JOIN Pedido_Det ON (Albaran_Pedido.AlpAlbPcaCanCodigo =
Pedido_Det.PdtPcaCanCodigo) " _
& "AND (Albaran_Pedido.AlpPcaAño = Pedido_Det.PdtPcaAño) " _
& "AND (Albaran_Pedido.AlpPcaCodigo = Pedido_Det.PdtPcaCodigo)) " _
& "INNER JOIN HojaCargaArticulo ON (HojaCargaArticulo.CargaArticulo =
Pedido_Det.PdtArtCodigo) " _
& "AND (HojaCargaAlbaran.CargaNumero = HojaCargaArticulo.CargaNumero) " _
& "WHERE (((HojaCargaAlbaran.CargaNumero)=" & ParametroNumeroHojaDeCarga &
") " _
& "AND ((HojaCargaAlbaran.CargaCanal)=" & ParametroCanalDeFacturacion & ") "
_
& "AND ((HojaCargaAlbaran.CargaAño)='" & ParametroAñoDeFacturacion & "') " _
& "AND ((HojaCargaAlbaran.CargaAlbaran)=" & ParametroNumeroDeAlbaran & "))"

Espero haberme explicado un poco mejor, porque llega un momento en que ni yo
entiendo el porque.

Muchas gracias.
Angel Zapata
"Si no sabes hacia adonde vas lo mas probable es que no llegues a ninguna
parte"
Respuesta Responder a este mensaje
#8 Maxi
02/07/2007 - 20:06 | Informe spam
Angel, probemos con algo asi como

UPDATE EXISTENCIAS SET CANTIDAD = CANTIDAD - T2.CANTIDAD
FROM EXISTENCIAS INNER JOIN
(SELECT SUM(CANTIDAD) AS CANTIDAD,ARTICULO FROM ALBARANES
GROUP BY ARTICULO) T2 ON
EXISTENCIAS.ARTICULO = T2.ARTICULO


-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"Angel Zapata" <a n g e l . z a p a t a @ m i c o r r e o e . e s> escribió
en el mensaje news:
Tienes razón Maxi, "haz lo que yo diga pero no lo que yo haga" es un
refran de mi abuela, y yo lo he aplicado. A todo el mundo le digo lo mismo
que tu me has dicho a mi, y yo no lo hago.

Te cuento
Tabla 1 - Existencias
Almacen/Codigo/Cantidad
01 / 00001 / 5
01 / 00002 / 7
01 / 00003 / 10

Tabla 2 - Albaranes
Almacen / Articulo / Cantidad
01 / 00001 / 1
01 / 00001 / 4
01 / 00002 / 3
01 / 00003 / 5

En la tabla de albaranes aparece dos veces el mismo articulo pues tiene
diferente precio y por tanto no se pueden agrupar en una linea.

Yo necesito restar de la cantidad de la tabla existencias la cantidad
resultante en los albaranes, es decir, 5 unidades al articulo 1, 3 al
articulo 2 y 5 al articulo 3, pero en la sentencia que he puesto UPDATE no
puedo utilizar SUM para el campo [PdtCantidad], o al menos no se como
hacerlo, entonces los datos que recoge de la clausula FROM serían:
Almacen / Articulo / Cantidad
01 / 00001 / 1
01 / 00002 / 3
01 / 00003 / 5

no teniendo en cuenta la segunda línea del artículo 1.

Por diseño de la base de datos, necesito manejar 4 tablas,
HojaCargaArticulo (donde se descuentan las existencias),
HojaCargaAlbaran
Albaran_Pedido
Pedido_Det (donde tengo las lineas de pedido)

SQLConsulta = "UPDATE HojaCargaArticulo " _
& "SET HojaCargaArticulo.CargaConfirmado = [CargaConfirmado] -
[PdtCantidad] " _
& "FROM ((HojaCargaAlbaran INNER JOIN Albaran_Pedido ON
(HojaCargaAlbaran.CargaAlbaran = Albaran_Pedido.AlpAlbCodigo) " _
& "AND (HojaCargaAlbaran.CargaAño = Albaran_Pedido.AlpAlbAño) " _
& "AND (HojaCargaAlbaran.CargaCanal = Albaran_Pedido.AlpAlbPcaCanCodigo))
" _
& "INNER JOIN Pedido_Det ON (Albaran_Pedido.AlpAlbPcaCanCodigo =
Pedido_Det.PdtPcaCanCodigo) " _
& "AND (Albaran_Pedido.AlpPcaAño = Pedido_Det.PdtPcaAño) " _
& "AND (Albaran_Pedido.AlpPcaCodigo = Pedido_Det.PdtPcaCodigo)) " _
& "INNER JOIN HojaCargaArticulo ON (HojaCargaArticulo.CargaArticulo =
Pedido_Det.PdtArtCodigo) " _
& "AND (HojaCargaAlbaran.CargaNumero = HojaCargaArticulo.CargaNumero) " _
& "WHERE (((HojaCargaAlbaran.CargaNumero)=" & ParametroNumeroHojaDeCarga &
") " _
& "AND ((HojaCargaAlbaran.CargaCanal)=" & ParametroCanalDeFacturacion & ")
" _
& "AND ((HojaCargaAlbaran.CargaAño)='" & ParametroAñoDeFacturacion & "') "
_
& "AND ((HojaCargaAlbaran.CargaAlbaran)=" & ParametroNumeroDeAlbaran &
"))"

Espero haberme explicado un poco mejor, porque llega un momento en que ni
yo entiendo el porque.

Muchas gracias.
Angel Zapata
"Si no sabes hacia adonde vas lo mas probable es que no llegues a ninguna
parte"


Respuesta Responder a este mensaje
#9 Angel Zapata
02/07/2007 - 21:37 | Informe spam
¡¡¡Funciona!!!

Muchisisimas gracias Maxi, ¡he conseguido que funcione!

Perdón, creo que lo has conseguido tu, porque yo estaba tan obtuso que no le
encontraba la punta "ni p'atras"

Muchas gracias

Angel Zapata
"Si no sabes hacia adonde vas lo mas probable es que no llegues a ninguna
parte"
Respuesta Responder a este mensaje
#10 Maxi
02/07/2007 - 21:57 | Informe spam
:-) el jefe de la brigada anticursores estara contento porque tenemos un
cursor menos ;)


Salu2

Microsoft MVP SQL Server
Culminis Speaker

"Angel Zapata" <a n g e l . z a p a t a @ m i c o r r e o e . e s> escribió
en el mensaje news:
¡¡¡Funciona!!!

Muchisisimas gracias Maxi, ¡he conseguido que funcione!

Perdón, creo que lo has conseguido tu, porque yo estaba tan obtuso que no
le encontraba la punta "ni p'atras"

Muchas gracias

Angel Zapata
"Si no sabes hacia adonde vas lo mas probable es que no llegues a ninguna
parte"


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida