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 Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-11-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Captura de error en Procedimiento almacenado

Hola amigos del foro, tengo una duda con los procedimientos almacenados, tengo un SP que actualiza los registros de un proveedor, yo le paso como parámetro el rut, mi idea es como puedo capturar los errores al momento de actualizar un registro en Firebird.

Gracias de antemano.

Saludos.
__________________
No todo es como parece ser...
Responder Con Cita
  #2  
Antiguo 29-11-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
resp

Código SQL [-]
Begin
  /*Codigo a ejecutar*/
  when sqlcode -802 do /*ho el codigo qu esea*/
  /*aqui haces lo que debas hacer con le error*/ 
End
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #3  
Antiguo 29-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Si es un error en la lógica del negocio, puedes crear tu propia excepción
Código SQL [-]
Create Exception eMinimoAlmacen 'No hay el mínimo de cantidad en el almacen'

y lanzarla desde un SP
Código SQL [-]
  exception eMinimoAlmacen

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 29-11-2005 a las 19:23:26.
Responder Con Cita
  #4  
Antiguo 29-11-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Hola:

Gracias a ambos por la respuesta, logré compilar el procedimiento almacenado, pero existe algún código o algo que me indique un error genérico

algo así:

Código SQL [-]
Begin
    when Error_generico do 
    /*Instrucciones*/
End

Mi idea es en caso de cualquier error pueda entrar en el When

Gracias...Nuevamente

Hasta Luego -
__________________
No todo es como parece ser...
Responder Con Cita
  #5  
Antiguo 29-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
No lo he probado, quizás poniendo " when sqlcode <> 0 do "
El cero es operación exitosa.

He visto que se hace mención a la claúsula WHENEVER en el manual de FB, pero no sé su uso , posiblemente sea: "when Whenever do"

saludos y suete
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 29-11-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Cita:
Empezado por Lepe
No lo he probado, quizás poniendo " when sqlcode <> 0 do "
El cero es operación exitosa.
Veré como anda esto, con referente al manual de firebird, a cual te refieres específicamente ?.

Gracias de nuevo..

__________________
No todo es como parece ser...
Responder Con Cita
  #7  
Antiguo 30-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Rectifico: es en el Data Definition Guide de Interbase 6. Descargable desde ibphenix (datadef.pdf)

pagina 142
Cita:
WHEN
{error [, error …] | ANY}
DO compound_statement

Error-handling statement. When one of the specified errors
occurs, performs compound_statement. WHEN statements, if
present, must come at the end of a block, just before END.

error: EXCEPTION exception_name, SQLCODE errcode or GDSCODE
number.

ANY: Handles any errors.
Código SQL [-]
  WHEN ANY DO
saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 30-11-2005 a las 19:07:19.
Responder Con Cita
  #8  
Antiguo 30-11-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Yo solo te dije como podias hacer lso de los erroes te pudes leer la lsiat d erroes desde el manual de interbase ya que son muchos.
A y otra cosa que te dicen con las excepciones si unas firebird1.5 o susperior puedes crear una sola exception vacion y dependiendo de donde se te de el error le concatenas al excepcion el erro que quieres que salg apero cuidate el que le largo d elaos errores no supere los 78 caractres bueno aunque aun nos e por que firebird aun tiene esa restriccion
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #9  
Antiguo 01-12-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Hola:

Gracias nuevamente, estoy casi listo con esta duda:

me falla una sola cosa:

Código SQL [-]
 
begin
 
/*instruccion update*/
 
when any do
begin
  cod = 90;
  Exit;
end
cod = 0;
 
suspend;
end;

para que realmente compile bien debo quitar el cod = 0; y el suspend;
Cómo puedo arreglar esto ?
Mi idea es que si no se produce algún error pueda retornar un código, solo eso !!
Muchas Gracias...

Hasta luego -
__________________
No todo es como parece ser...
Responder Con Cita
  #10  
Antiguo 01-12-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
¿como usas el SP?

Me da la impresión de que intentas hacerlo con un EXECUTE PROCEDURE. Si ha de tener el suspend, deberías usarlo como una tabla/vista.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #11  
Antiguo 01-12-2005
Carlos Hurtado Carlos Hurtado is offline
Miembro
 
Registrado: dic 2004
Posts: 30
Poder: 0
Carlos Hurtado Va por buen camino
Un grano de arena al problema de manejo de errores

Hola amigos aqui adjunto una SP que actualiza stock con manejo de errores:

Código SQL [-]
SET TERM ^;
CREATE PROCEDURE ACTUALIZA_VALESDETALLE(
 VID_VALE VARCHAR(12),
 VID_PRODUCTO VARCHAR(12),
 VCANTIDAD DECIMAL(7,2),
 VDESCRIPCION VARCHAR(40),
 VVALORUNITARIO NUMERIC,
 VTOTAL NUMERIC)
RETURNS (
 FLAG SMALLINT)
AS
 DECLARE VARIABLE V_STOCK DECIMAL(7,2); 
 BEGIN
  INSERT INTO VALESDETALLE
  (
   ID_VALE,
   ID_PRODUCTO,
   CANTIDAD,
   DESCRIPCION,
   VALORUNITARIO,
   TOTAL
  )
  VALUES 
  (
   :VID_VALE,
   :VID_PRODUCTO,
   :VCANTIDAD,
   :VDESCRIPCION,
   :VVALORUNITARIO,
   :VTOTAL
  );
  SELECT EXISTENCIA FROM STOCKMAESTRO WHERE ID_PRODUCTO = :VID_PRODUCTO
    INTO :V_STOCK;  
  IF (:V_STOCK >= :VCANTIDAD) THEN 
  BEGIN
   UPDATE STOCKMAESTRO 
   SET EXISTENCIA = :V_STOCK - :VCANTIDAD
    WHERE ID_PRODUCTO = :VID_PRODUCTO;
   FLAG = 0;
   WHEN GDSCODE lock_conflict DO
    FLAG = 2;
   WHEN ANY DO
    FLAG = 3;
 END
 ELSE
   EXCEPTION NO_STOCKDETALLE;  
 WHEN EXCEPTION NO_STOCKDETALLE DO
  FLAG = 1;
 END ^
SET TERM; ^

La variable FLAG retorna un valor que corresponde al tipo de eroor para poder manejarlo. Pero:
Cuando provoco un error de bloqueo en todas las ocasiones me entrega un valor de FLAG = 3. Esto aun no lo puedo solucionar ya que fuera de la SP manejo los errores segun sean 1, 2 o 3.

Espero sirva el comentario.
Responder Con Cita
  #12  
Antiguo 28-12-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Hola a todos:

Gracias por su ayuda y no me quedo otra que sacar el suspend, debo reconocer que llevo poco en esto de firebird y no entiendo mucho para que es el suspend, por ahora estoy tranquilo por que me funciona el SP, gracias a todos nuevamente.

Hasta Luego -
__________________
No todo es como parece ser...
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 08:03:32.


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