Sintaxis procedimiento almacenado

17/07/2004 - 09:10 por MhBeyle | Informe spam
Hola, muy buenas ..

Estoy un pelín liadillo con la sintaxis de los procedimientos
almacenados, no sé si lo hago del todo bien.

Tengo lo siguiente:

CREATE PROCEDURE sp_STCK @num_alb varchar (9), @num_ped varchar (9)
AS

UPDATE CABECERA
SET STATUS=2,
TYPE=2,
NUM=@num_alb
WHERE NUM = @num_ped

UPDATE LINEA
SET DO_TYPE=2,
REF_PED=NUM,
NUM=@num_alb,
PR_1=PR_UNIT,
PR_2=PR_BR,
MOV_STOCK=3
WHERE NUM = @num_ped

UPDATE STOCK
SET CANT=(CANT-LINEA.CANT)
FROM LINEA
WHERE LINEA.REF=STOCK.REF
AND LINEA.ALMACEN=STOCK.ALMACEN
AND LINEA.NUM = @num_alb

GO


Los dos parámetros toman un número de pedido (que ya existe en las
tablas) y un número de albarán (que se creará). El primer UPDATE
actualiza las lineas de la cabecera, el segundo de las líneas del
pedido y el tercero el stock de los productos actualizados.

Funciona a la perfección en el Query Analizer declarando las variables
y dandoles un valor, pero al trasladarlo a un stored procedure, sólo
se ejecuta el último UPDATE, o eso me parece a mí. Curiosamente, el
último UPDATE actualiza sólo aquellos productos que aparecen en la
conversión de un pedido en albarán, que se hace durante los dos
primeros UPDATE. Esto es correcto, pero no se reflean los cambios de
los dos primeros UPDATE.

¿Qué hago mal? ¿Se pueden poner varios UPDATE en un stored procedure?
¿Hay que poner EXECUTE o GO o algo así para que se reflejen los
cambios?

Estoy un pelín verde de sintaxis con los sp y a lo mejor pregunto una
tontería.

MhBeyle ___

Preguntas similare

Leer las respuestas

#1 José Hurtado
17/07/2004 - 11:07 | Informe spam
En la última sentencia:

UPDATE STOCK
SET CANT=(CANT-LINEA.CANT)
FROM LINEA
WHERE LINEA.REF=STOCK.REF
AND LINEA.ALMACEN=STOCK.ALMACEN
AND LINEA.NUM = @num_alb

creo que debería ser:

UPDATE STOCK
SET CANT=(CANT-LINEA.CANT)
FROM STOCK JOIN LINEA
ON (STOCK.ALMACEN = LINEA.ALMACEN)
AND (STOCK.REF = LINEA.REF)
WHERE
LINEA.NUM = @num_alb


Saludos.

Ing. José Hurtado
MCP (candidato a MCDBA)

"MhBeyle" escribió en el mensaje
news:
Hola, muy buenas ..

Estoy un pelín liadillo con la sintaxis de los procedimientos
almacenados, no sé si lo hago del todo bien.

Tengo lo siguiente:

CREATE PROCEDURE sp_STCK @num_alb varchar (9), @num_ped varchar (9)
AS

UPDATE CABECERA
SET STATUS=2,
TYPE=2,
NUM=@num_alb
WHERE NUM = @num_ped

UPDATE LINEA
SET DO_TYPE=2,
REF_PED=NUM,
NUM=@num_alb,
PR_1=PR_UNIT,
PR_2=PR_BR,
MOV_STOCK=3
WHERE NUM = @num_ped

UPDATE STOCK
SET CANT=(CANT-LINEA.CANT)
FROM LINEA
WHERE LINEA.REF=STOCK.REF
AND LINEA.ALMACEN=STOCK.ALMACEN
AND LINEA.NUM = @num_alb

GO


Los dos parámetros toman un número de pedido (que ya existe en las
tablas) y un número de albarán (que se creará). El primer UPDATE
actualiza las lineas de la cabecera, el segundo de las líneas del
pedido y el tercero el stock de los productos actualizados.

Funciona a la perfección en el Query Analizer declarando las variables
y dandoles un valor, pero al trasladarlo a un stored procedure, sólo
se ejecuta el último UPDATE, o eso me parece a mí. Curiosamente, el
último UPDATE actualiza sólo aquellos productos que aparecen en la
conversión de un pedido en albarán, que se hace durante los dos
primeros UPDATE. Esto es correcto, pero no se reflean los cambios de
los dos primeros UPDATE.

¿Qué hago mal? ¿Se pueden poner varios UPDATE en un stored procedure?
¿Hay que poner EXECUTE o GO o algo así para que se reflejen los
cambios?

Estoy un pelín verde de sintaxis con los sp y a lo mejor pregunto una
tontería.

MhBeyle ___
Respuesta Responder a este mensaje
#2 Javier Loria
17/07/2004 - 17:16 | Informe spam
Hola:
Si en las Lineas sabes que no se puede repetir un "Ref", o sea que no
hay productos repetidos en un Albaran (2 veces el mismo articulo), entonces
puedes hacerlo asi:
==UPDATE Stock
SET Cant=(Cant-Linea.Cant)
FROM Stock
JOIN Linea
ON Linea.Ref=Stock.Ref
WHERE Linea.Almacen=Stock.Almacen
AND Linea.Num = @num_alb
== Esta sintaxis no es estandar ANSI por lo que da problemas con otras BD
que no son SQL, pero es segun mi concepto mas clara. La sintaxis equivalente
ANSI tiene que hace una SubConsulta.
Por otra parte si pueden existir varios productos repetidos en la cada
pedido/albaran, entonces debes primero agrupar por Stock y luego restar lo
que es un poco mas elaborado:
==UPDATE Stock
SET Cant=(Cant-L.Cant)
FROM Stock
JOIN (SELECT Linea.Ref
, Linea.Almacen
, SUM(Linea.Cant) AS Cant
FROM Linea
WHERE Linea.Num=@num_alb) AS L
ON L.Ref=Stock.Ref
WHERE L.Almacen=Stock.Almacen
AND L.Num = @num_alb
== La sentencia anterior primero agrupa el pedido por linea de producto y
luego lo rebaja de stock.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.


MhBeyle escribio:
Hola, muy buenas ..

Estoy un pelín liadillo con la sintaxis de los procedimientos
almacenados, no sé si lo hago del todo bien.

Tengo lo siguiente:

CREATE PROCEDURE sp_STCK @num_alb varchar (9), @num_ped varchar (9)
AS

UPDATE CABECERA
SET STATUS=2,
TYPE=2,
NUM=@num_alb
WHERE NUM = @num_ped

UPDATE LINEA
SET DO_TYPE=2,
REF_PED=NUM,
NUM=@num_alb,
PR_1=PR_UNIT,
PR_2=PR_BR,
MOV_STOCK=3
WHERE NUM = @num_ped

UPDATE STOCK
SET CANT=(CANT-LINEA.CANT)
FROM LINEA
WHERE LINEA.REF=STOCK.REF
AND LINEA.ALMACEN=STOCK.ALMACEN
AND LINEA.NUM = @num_alb

GO


Los dos parámetros toman un número de pedido (que ya existe en las
tablas) y un número de albarán (que se creará). El primer UPDATE
actualiza las lineas de la cabecera, el segundo de las líneas del
pedido y el tercero el stock de los productos actualizados.

Funciona a la perfección en el Query Analizer declarando las variables
y dandoles un valor, pero al trasladarlo a un stored procedure, sólo
se ejecuta el último UPDATE, o eso me parece a mí. Curiosamente, el
último UPDATE actualiza sólo aquellos productos que aparecen en la
conversión de un pedido en albarán, que se hace durante los dos
primeros UPDATE. Esto es correcto, pero no se reflean los cambios de
los dos primeros UPDATE.

¿Qué hago mal? ¿Se pueden poner varios UPDATE en un stored procedure?
¿Hay que poner EXECUTE o GO o algo así para que se reflejen los
cambios?

Estoy un pelín verde de sintaxis con los sp y a lo mejor pregunto una
tontería.

MhBeyle ___
Respuesta Responder a este mensaje
#3 MhBeyle
17/07/2004 - 22:35 | Informe spam
Pero no he preguntado cómo hacer esto. Si la sintaxis que he puesto sí
que funciona bien. Lo que pretendo saber es por qué sólo se ejecuta el
último UPDATE ..

Un saludo,

MhBeyle ___


On Sat, 17 Jul 2004 09:16:41 -0600, "Javier Loria"
wrote:

Hola:
Si en las Lineas sabes que no se puede repetir un "Ref", o sea que no
hay productos repetidos en un Albaran (2 veces el mismo articulo), entonces
puedes hacerlo asi:
==>UPDATE Stock
SET Cant=(Cant-Linea.Cant)
FROM Stock
JOIN Linea
ON Linea.Ref=Stock.Ref
WHERE Linea.Almacen=Stock.Almacen
AND Linea.Num = @num_alb
==> Esta sintaxis no es estandar ANSI por lo que da problemas con otras BD
que no son SQL, pero es segun mi concepto mas clara. La sintaxis equivalente
ANSI tiene que hace una SubConsulta.
Por otra parte si pueden existir varios productos repetidos en la cada
pedido/albaran, entonces debes primero agrupar por Stock y luego restar lo
que es un poco mas elaborado:
==>UPDATE Stock
SET Cant=(Cant-L.Cant)
FROM Stock
JOIN (SELECT Linea.Ref
, Linea.Almacen
, SUM(Linea.Cant) AS Cant
FROM Linea
WHERE Linea.Num=@num_alb) AS L
ON L.Ref=Stock.Ref
WHERE L.Almacen=Stock.Almacen
AND L.Num = @num_alb
==> La sentencia anterior primero agrupa el pedido por linea de producto y
luego lo rebaja de stock.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.


MhBeyle escribio:
Hola, muy buenas ..

Estoy un pelín liadillo con la sintaxis de los procedimientos
almacenados, no sé si lo hago del todo bien.

Tengo lo siguiente:

CREATE PROCEDURE sp_STCK @num_alb varchar (9), @num_ped varchar (9)
AS

UPDATE CABECERA
SET STATUS=2,
TYPE=2,
NUM=@num_alb
WHERE NUM = @num_ped

UPDATE LINEA
SET DO_TYPE=2,
REF_PED=NUM,
NUM=@num_alb,
PR_1=PR_UNIT,
PR_2=PR_BR,
MOV_STOCK=3
WHERE NUM = @num_ped

UPDATE STOCK
SET CANT=(CANT-LINEA.CANT)
FROM LINEA
WHERE LINEA.REF=STOCK.REF
AND LINEA.ALMACEN=STOCK.ALMACEN
AND LINEA.NUM = @num_alb

GO


Los dos parámetros toman un número de pedido (que ya existe en las
tablas) y un número de albarán (que se creará). El primer UPDATE
actualiza las lineas de la cabecera, el segundo de las líneas del
pedido y el tercero el stock de los productos actualizados.

Funciona a la perfección en el Query Analizer declarando las variables
y dandoles un valor, pero al trasladarlo a un stored procedure, sólo
se ejecuta el último UPDATE, o eso me parece a mí. Curiosamente, el
último UPDATE actualiza sólo aquellos productos que aparecen en la
conversión de un pedido en albarán, que se hace durante los dos
primeros UPDATE. Esto es correcto, pero no se reflean los cambios de
los dos primeros UPDATE.

¿Qué hago mal? ¿Se pueden poner varios UPDATE en un stored procedure?
¿Hay que poner EXECUTE o GO o algo así para que se reflejen los
cambios?

Estoy un pelín verde de sintaxis con los sp y a lo mejor pregunto una
tontería.

MhBeyle ___



Respuesta Responder a este mensaje
#4 MhBeyle
17/07/2004 - 22:37 | Informe spam
Bueno, la verdad es que funciona bien tal y como está, pero puedo
probar lo tuyo si es más estándar.
Aún así, mi pregunta era que por qué sólo me funciona el último UPDATE
y no se reflejan los cambios de los dos primeros.

MhBeyle ___

En la última sentencia:

UPDATE STOCK
SET CANT=(CANT-LINEA.CANT)
FROM LINEA
WHERE LINEA.REF=STOCK.REF
AND LINEA.ALMACEN=STOCK.ALMACEN
AND LINEA.NUM = @num_alb

creo que debería ser:

UPDATE STOCK
SET CANT=(CANT-LINEA.CANT)
FROM STOCK JOIN LINEA
ON (STOCK.ALMACEN = LINEA.ALMACEN)
AND (STOCK.REF = LINEA.REF)
WHERE
LINEA.NUM = @num_alb


Saludos.

Ing. José Hurtado
MCP (candidato a MCDBA)

"MhBeyle" escribió en el mensaje
news:
Hola, muy buenas ..

Estoy un pelín liadillo con la sintaxis de los procedimientos
almacenados, no sé si lo hago del todo bien.

Tengo lo siguiente:

CREATE PROCEDURE sp_STCK @num_alb varchar (9), @num_ped varchar (9)
AS

UPDATE CABECERA
SET STATUS=2,
TYPE=2,
NUM=@num_alb
WHERE NUM = @num_ped

UPDATE LINEA
SET DO_TYPE=2,
REF_PED=NUM,
NUM=@num_alb,
PR_1=PR_UNIT,
PR_2=PR_BR,
MOV_STOCK=3
WHERE NUM = @num_ped

UPDATE STOCK
SET CANT=(CANT-LINEA.CANT)
FROM LINEA
WHERE LINEA.REF=STOCK.REF
AND LINEA.ALMACEN=STOCK.ALMACEN
AND LINEA.NUM = @num_alb

GO


Los dos parámetros toman un número de pedido (que ya existe en las
tablas) y un número de albarán (que se creará). El primer UPDATE
actualiza las lineas de la cabecera, el segundo de las líneas del
pedido y el tercero el stock de los productos actualizados.

Funciona a la perfección en el Query Analizer declarando las variables
y dandoles un valor, pero al trasladarlo a un stored procedure, sólo
se ejecuta el último UPDATE, o eso me parece a mí. Curiosamente, el
último UPDATE actualiza sólo aquellos productos que aparecen en la
conversión de un pedido en albarán, que se hace durante los dos
primeros UPDATE. Esto es correcto, pero no se reflean los cambios de
los dos primeros UPDATE.

¿Qué hago mal? ¿Se pueden poner varios UPDATE en un stored procedure?
¿Hay que poner EXECUTE o GO o algo así para que se reflejen los
cambios?

Estoy un pelín verde de sintaxis con los sp y a lo mejor pregunto una
tontería.

MhBeyle ___



Respuesta Responder a este mensaje
#5 Gustavo Larriera [MVP SQL]
18/07/2004 - 02:48 | Informe spam
Puedes mostrarnos los CREATE TABLE de las tablas que usas y un juego de
datos de prueba?


Gustavo Larriera
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"MhBeyle" wrote in message
news:
Hola, muy buenas ..

Estoy un pelín liadillo con la sintaxis de los procedimientos
almacenados, no sé si lo hago del todo bien.

Tengo lo siguiente:

CREATE PROCEDURE sp_STCK @num_alb varchar (9), @num_ped varchar (9)
AS

UPDATE CABECERA
SET STATUS=2,
TYPE=2,
NUM=@num_alb
WHERE NUM = @num_ped

UPDATE LINEA
SET DO_TYPE=2,
REF_PED=NUM,
NUM=@num_alb,
PR_1=PR_UNIT,
PR_2=PR_BR,
MOV_STOCK=3
WHERE NUM = @num_ped

UPDATE STOCK
SET CANT=(CANT-LINEA.CANT)
FROM LINEA
WHERE LINEA.REF=STOCK.REF
AND LINEA.ALMACEN=STOCK.ALMACEN
AND LINEA.NUM = @num_alb

GO


Los dos parámetros toman un número de pedido (que ya existe en las
tablas) y un número de albarán (que se creará). El primer UPDATE
actualiza las lineas de la cabecera, el segundo de las líneas del
pedido y el tercero el stock de los productos actualizados.

Funciona a la perfección en el Query Analizer declarando las variables
y dandoles un valor, pero al trasladarlo a un stored procedure, sólo
se ejecuta el último UPDATE, o eso me parece a mí. Curiosamente, el
último UPDATE actualiza sólo aquellos productos que aparecen en la
conversión de un pedido en albarán, que se hace durante los dos
primeros UPDATE. Esto es correcto, pero no se reflean los cambios de
los dos primeros UPDATE.

¿Qué hago mal? ¿Se pueden poner varios UPDATE en un stored procedure?
¿Hay que poner EXECUTE o GO o algo así para que se reflejen los
cambios?

Estoy un pelín verde de sintaxis con los sp y a lo mejor pregunto una
tontería.

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