Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Procedimiento almacenado actualización de stock (https://www.clubdelphi.com/foros/showthread.php?t=79460)

DamianG 07-07-2012 00:11:59

Procedimiento almacenado actualización de stock
 
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!

Código SQL [-]
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

Código:

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

Posible error ...
 
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)

Código SQL [-]
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.


La franja horaria es GMT +2. Ahora son las 15:09:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi