Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-07-2012
DamianG DamianG is offline
Miembro
 
Registrado: mar 2008
Posts: 95
Poder: 17
DamianG Va por buen camino
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^
Responder Con Cita
  #2  
Antiguo 07-07-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Explícanos la estructura de las tablas, los campos, lo que contiene cada uno y exactamente lo que quieres hacer.
Responder Con Cita
  #3  
Antiguo 07-07-2012
DamianG DamianG is offline
Miembro
 
Registrado: mar 2008
Posts: 95
Poder: 17
DamianG Va por buen camino
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

Última edición por DamianG fecha: 07-07-2012 a las 00:55:52.
Responder Con Cita
  #4  
Antiguo 07-07-2012
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 18
Gallosuarez Va por buen camino
Talking 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^

Última edición por Gallosuarez fecha: 07-07-2012 a las 15:22:38. Razón: corregir código ...
Responder Con Cita
  #5  
Antiguo 07-07-2012
DamianG DamianG is offline
Miembro
 
Registrado: mar 2008
Posts: 95
Poder: 17
DamianG Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 07-07-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #7  
Antiguo 10-07-2012
DamianG DamianG is offline
Miembro
 
Registrado: mar 2008
Posts: 95
Poder: 17
DamianG Va por buen camino
Solucionado con el BEGIN-END. Muchas gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
procedimiento almacenado JAI_ME Varios 5 02-09-2008 16:24:58
procedimiento almacenado sargento elias Firebird e Interbase 1 14-04-2008 13:04:35
Procedimiento almacenado efelix MS SQL Server 7 21-11-2007 17:53:00
Procedimiento almacenado LucianoRey MS SQL Server 2 23-08-2005 00:37:06
Procedimiento almacenado y Ado LucianoRey MS SQL Server 11 06-07-2004 22:55:23


La franja horaria es GMT +2. Ahora son las 13:26:24.


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
Copyright 1996-2007 Club Delphi