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 03-11-2004
Choclito Choclito is offline
Miembro
 
Registrado: jul 2004
Posts: 169
Poder: 20
Choclito Va por buen camino
Exclamation problema con procedimiento almacenado

Hola amigos del foro nuevamente quisiera perdirles su ayuda que siempre ha sido muy valiosa
Primero decirles que trabajo con Ibexpert y con Firebird 1.5 el problema que tengo es el siguiente:
tengo dos tablas una
ingreso(codmaterial,codproveedore,codingreso,fecha,cantidad,precio) y otra kardex (codmaterial,fecha,cantidadentrada,cantidadsalida,saldobs,saldofisico,precioponderado,validez) entonces lo que quiero hacer es crear un disparador para que cuando haga tenga un nuevo ingreso esos valores se actualicen en la tabla kardex y de esa forma tener siempre actualizadoel kardex de materiales entonces el disparador que hice en ibexpert es el siguiente:

(el trigger actua sobre la tabla ingreso despues de insertar)

declare variable codigo CHAR(4);
declare variable COD CHAR(4);
declare variable nombrep varchar (45);
declare variable fisico integer;
declare variable bs numeric (6,2);
BEGIN
if (ingreso.codp is not null) then
begin
select proveedor.nombrep from proveedor where (proveedor.codp=ingreso.codp)into :nombrep;
end
else
begin
nombrep='REINGRESO';
end
SELECT CODM FROM SALDO WHERE SALDO.CODM=INGRESO.CODM INTO :COD;
IF (COD IS NULL) THEN
BEGIN
INSERT INTO SALDO (CODM,TOTALINGRESO,TOTALEGRESO,SALDOFISICO,SALDOBS,PPP,FECHA,DETALLE,VALIDO)
VALUES (INGRESO.CODM,INGRESO.CANTIDAD,0,INGRESO.CANTIDAD,INGRESO.PRECIOCOMPRA,
(INGRESO.PRECIOCOMPRA/INGRESO.CANTIDAD),ingreso.fechacompra,'C.L. de '||:nombrep,'V');
END
ELSE
BEGIN
for select saldo.codm ,saldo.saldofisico ,saldo.saldobs
from saldo
where ((saldo.codm=ingreso.codm) and (saldo.valido = 'V'))into :codigo,:fisico,:bs
do begin
update saldo set
saldo.valido='F'
where saldo.codm=ingreso.codm;
INSERT INTO SALDO (CODM,TOTALINGRESO,TOTALEGRESO,SALDOFISICO,SALDOBS,PPP,FECHA,DETALLE,valido)
VALUES (:codigo,INGRESO.CANTIDAD,0,(INGRESO.CANTIDAD+:fisico),(INGRESO.PRECIOCOMPRA+:bs),
(INGRESO.PRECIOCOMPRA/INGRESO.CANTIDAD),ingreso.fechacompra,'C.L. de '||:nombrep,'V');
end
END
END


bueno entonces cuando hago el primer registro en la tabla ingreso para el material 0001 (por ejemplo ) me registra sin problemas , para un segundo registro para el mismo material tambien no tengo problemas, el problema es cuando quiero hacer un tercer registro del mismo material 0001 en la tabla ingreso me sale el mensaje de

multiple rows in singleton select
.
multiple rows in singleton select

(en ib expert)

creo que el problema esta la parte del codigo que esta en negrilla pero cuando hago una consulta normal me muestra solo un registro lo cual esta bien bueno la verdad nose donde esta el error quisiera porfavor que me den una manito con el problema que tengo
Para ser mas claro lo que quiero hacer es que cada que hago un registro en la tabla ingreso me actualize la tabla kardex del material en si lo que quiero actualizar es o son los saldos fisicos y monetarios de cada material que se registre
Bueno espero me colaboren porfavor y muchas gracias de ante mano por leer este hilo
Responder Con Cita
  #2  
Antiguo 04-11-2004
celades celades is offline
No confirmado
 
Registrado: may 2003
Ubicación: Torroella de Montgrí (Girona)
Posts: 42
Poder: 0
celades Va por buen camino
Hola

El error no puede estar donde dices porque tienes un for lo cual hace que pueda recoger todos los registros que devuelva la select


tiene que estar en estos u otros selects que disparen los triggers de las tablas afectadas por los updates o inserts de las tablas

o sea selects que recogen un solo registro y devuelven mas de uno
investiga y tienes el select distinct como recurso si es que te devuelve un mismo valor repetido

Código SQL [-]
SELECT CODM FROM SALDO WHERE SALDO.CODM=INGRESO.CODM INTO :COD


Código SQL [-]
select proveedor.nombrep from proveedor where (proveedor.codp=ingreso.codp)into :nombrep

ya que son las que esperan un solo registro


En fin Saludos y suerte
Responder Con Cita
  #3  
Antiguo 04-11-2004
Choclito Choclito is offline
Miembro
 
Registrado: jul 2004
Posts: 169
Poder: 20
Choclito Va por buen camino
Gracias por la ayuda

bueno me queda dar muchas gracias y la observacion que me hiciste me hizo dar cuenta del error que estaba cometiendo pues ahora con la correcion hecha el triger ya me hace lo que yo quiero
Como todas las veces muchas gracias por la ayuda brindada
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


La franja horaria es GMT +2. Ahora son las 20:28:10.


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