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

#1 Maxi
29/06/2007 - 14:44 | Informe spam
Hola Angel, podrias definir mejor "NO Funciona???" a que te referis con
ello?


Pregunta: porque estas haciendo un cursor? usa directamente la instruccion
update sin cursores yza que estos no son para nada recomendados por su
lentitud y ademas no veo la necesidad en lo que estas haciendo de poner uno
de ellos

-
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:
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"


Respuesta Responder a este mensaje
#2 Alejandro Mesa
29/06/2007 - 14:56 | Informe spam
Hola Maxi,

Si por aca estuviese el jefe de la brigada anti-cursores, te reponderia que
el procedimiento no funciona porque usa cursores. :-)

Saludos,
Alejandro Mesa

"Maxi" wrote:

Hola Angel, podrias definir mejor "NO Funciona???" a que te referis con
ello?


Pregunta: porque estas haciendo un cursor? usa directamente la instruccion
update sin cursores yza que estos no son para nada recomendados por su
lentitud y ademas no veo la necesidad en lo que estas haciendo de poner uno
de ellos

-
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:
> 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"
>
>



Respuesta Responder a este mensaje
#3 Alejandro Mesa
29/06/2007 - 15:00 | Informe spam
Hola Angel,

Estoy de acuerdo con el comentario de Maxi. trata de buscar una solucion
basada en conjuntos, para lo cual SQL Server esta dieñado y ajustado (no
quiere decir que alguna vez no tengas que usar cursores). Mayormente, los
cursores consumen recursos innecesariamente, causan bloqueos, son lentos,
etc.

Si puedes explicarnos lo que tratas de lograr, posiblemente te podamos
ayudar a buscar la solucion.


AMB

"Angel Zapata" wrote:

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"



Respuesta Responder a este mensaje
#4 Maxi
29/06/2007 - 15:16 | Informe spam
JEJEJE :) claro :)


-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"Alejandro Mesa" escribió en el
mensaje news:
Hola Maxi,

Si por aca estuviese el jefe de la brigada anti-cursores, te reponderia
que
el procedimiento no funciona porque usa cursores. :-)

Saludos,
Alejandro Mesa

"Maxi" wrote:

Hola Angel, podrias definir mejor "NO Funciona???" a que te referis con
ello?


Pregunta: porque estas haciendo un cursor? usa directamente la
instruccion
update sin cursores yza que estos no son para nada recomendados por su
lentitud y ademas no veo la necesidad en lo que estas haciendo de poner
uno
de ellos

-
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:
> 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"
>
>



Respuesta Responder a este mensaje
#5 Angel Zapata
02/07/2007 - 08:45 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida