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)
-   -   Captura de error en Procedimiento almacenado (https://www.clubdelphi.com/foros/showthread.php?t=27682)

lucasarts_18 28-11-2005 15:38:59

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.

rastafarey 29-11-2005 15:35:33

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

Lepe 29-11-2005 17:01:16

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

lucasarts_18 29-11-2005 17:23:40

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 -

Lepe 29-11-2005 18:31:00

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 :o, posiblemente sea: "when Whenever do"

saludos y suete

lucasarts_18 29-11-2005 19:30:34

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..

:)

Lepe 30-11-2005 17:55:45

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

rastafarey 30-11-2005 21:43:26

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

lucasarts_18 01-12-2005 16:59:18

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 -

Lepe 01-12-2005 19:22:27

¿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

Carlos Hurtado 01-12-2005 20:49:00

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.

lucasarts_18 28-12-2005 15:02:42

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 -


La franja horaria es GMT +2. Ahora son las 01:48:49.

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