PDA

Ver la Versión Completa : Procedimiento almacenado actualización de stock


DamianG
07-07-2012, 00:11:59
Hola a todos, cree el siguiente procedimiento almacenado para actualizar el campo "cantid" de la tabla "ARTICULOS", una vez que guardo mi
factura, recorro la tabla de detalles "DETFAC" y la idea es ir actualizando el stock de caja articulo según el campo "codart", el campo "stock" es al numero de stock que debe ir.

Lo que hace es que siempre me descuenta 2 veces de la linea de stock = '1'. No se que estoy haciendo mal.

Muchas Gracias!

CREATE PROCEDURE SP_ACTUSTOCK_FCV_SUMA(
IDFACVTA INTEGER)
AS
DECLARE VARIABLE CODART VARCHAR(15);
DECLARE VARIABLE CANTID NUMERIC(18, 2);
DECLARE VARIABLE STOCK VARCHAR(1);
BEGIN
/* Procedure body */
for select stock,codart,cantid
from DETFAC
where idfacvta = :idfacvta
into :Stock, :Codart, :Cantid do
if stock = '1' then
update ARTICULO set cantid = cantid + :cantid where codart = :codart;
if stock = '2' then
update ARTICULO set canti2 = canti2 + :cantid where codart = :codart;
SUSPEND;
END^

Casimiro Notevi
07-07-2012, 00:31:52
Explícanos la estructura de las tablas, los campos, lo que contiene cada uno y exactamente lo que quieres hacer.

DamianG
07-07-2012, 00:49:01
Para lo que quiero hacer estan en uso 2 tablas:

ARTICULO (Maestro de articulos): Con los siguientes campos: CODART (codigo de articulo), CANTID (Cantidad stock 1), CANTI2 (Cantidad stock 2).

DETFAC (Detalles de facturas): Con los siguientes campos IDFACVTA (Id Factura), CODART (codigo de articulo), CANTID (Cantidad facturada), STOCK (nro de stock 1 o 2) con el cual despues elijo CANTID o CANTI2 en ARTICULO.

Una vez generada la factura, teniendo ya guardados los datos en DETFAC, recorrerlo y quiero ir actualizando las cantidades en ARTICULOS, o sea en este caso restando, ya sea de stock1 o stock2

ARTICULO
------------------
CODART CANTID CANTI2
10000 10 0
100002 1 100

DETFAC
-------
IDFACVTA CODART CANTID STOCK
89 100001 1 1 (DEBERIA DESCONTAR 1 DE CANTID EN ARTICULO)
89 100002 3 2 (DEBERIA DESCONTAR 3 DE CANTI2 EN ARTICULO)

RESULTADO ARTICULO
---------------------
CODART CANTID CANTI2
100001 9 0
100002 1 97

Espero haber sido claro..
gracias

Gallosuarez
07-07-2012, 15:21:25
A primera vista, creo que hay un error de lógica .... le hace falta el begin/end, sino la única instrucción que se ejecuta dentro del bucle for es el primer if.
Saludos

P.D. por mi parte también creo que el suspend no es necesario (depente realmente de lo que quieras que haga tu aplicación)


CREATE PROCEDURE SP_ACTUSTOCK_FCV_SUMA(
IDFACVTA INTEGER)
AS
DECLARE VARIABLE CODART VARCHAR(15);
DECLARE VARIABLE CANTID NUMERIC(18, 2);
DECLARE VARIABLE STOCK VARCHAR(1);
BEGIN
/* Procedure body */
for select stock,codart,cantid
from DETFAC
where idfacvta = :idfacvta
into :Stock, :Codart, :Cantid do
begin
if stock = '1' then
update ARTICULO set cantid = cantid + :cantid where codart = :codart;
if stock = '2' then
update ARTICULO set canti2 = canti2 + :cantid where codart = :codart;
SUSPEND;
end
END^

DamianG
07-07-2012, 15:35:52
Muchas gracias por tu respuesta, la verdad no me quedo claro para que es el suspend... recien comienzo con los proc alm... Pruebo con lo que me decis y despues comento.

Casimiro Notevi
07-07-2012, 16:06:56
El suspend sirve para que vaya devolviendo los registros que se le ha pedido, en este caso ninguno, así que en teoría no sirve para nada.
Y como dice el compañero, falta el begin end.
Prueba y comentas :)

DamianG
10-07-2012, 22:22:30
Solucionado con el BEGIN-END. Muchas gracias.