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 02-06-2008
santiaguinillo santiaguinillo is offline
Miembro
 
Registrado: abr 2007
Ubicación: Viladecans, Barcelona
Posts: 24
Poder: 0
santiaguinillo Va por buen camino
Question Continuar Procedure a pesar del salto de excepción

Hola a tod@s,

tengo un problema con un procedure.
BBDD: firebird 1.5

El procedure realiza una serie de inserts según unas condiciones. En el último insert de este procedure y que inserta en una determinada tabla X, salta una excepción. Pusimos una excepción en un trigger before insert que si no se cumple otra condición no se realice el insert en la tabla X i salte esta excepción para capturarla y mostrarla por pantalla en la aplicación delphi.

El problema viene que al saltar la excepción en esta última tabla X, el resto de inserts anteriores no se guardan. Hace rollback cuando salta la excepción.

Quisiera saber si existe la posibilidad de que aunque salte la excepción del procedure firebird, continúe con el procedure y haga finalmente commit del mismo.

Un saludo y gracias por adelantado.
Responder Con Cita
  #2  
Antiguo 02-06-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
A pesar de que lo mejor sería verificar si se va a dar la excepción y actuar en consecuencia, existe una posibilidad:

WHEN XXX DO

Código SQL [-]
create procedure insertar_aglo (VALOR varchar(3))
as
begin
  for select familia from art_familias
    where(empresa=1) into :familia do
    begin
      insert into propaga(familia)
        values(:familia) ;
        when SQLCODE -803 do exit ;
    end 
end

Código SQL [-]
create procedure trunca100 (CADENA1 varchar(200))
returns (CADENA2 varchar(100))
as
begin
  /* Este procedimiento trunca la cadena a 100 caracteres */
  cadena2 ='INICIALIZA';
  cadena2 = cadena1;
  when any do suspend;
end
Responder Con Cita
  #3  
Antiguo 02-06-2008
santiaguinillo santiaguinillo is offline
Miembro
 
Registrado: abr 2007
Ubicación: Viladecans, Barcelona
Posts: 24
Poder: 0
santiaguinillo Va por buen camino
Question Continuar Procedure a pesar del salto de excepción

Hola duilioisola,

he probado de poner el código que me comentas. En concreto he probado en mi procedure:
  • when SQLCODE -803 do exit ;
  • when EXCEPTION SUPERA_IMPORTE DO exit;
(SUPERA_IMPORTE es el nombre de la excepción que salta)

Ambas opciones han salido con rollback del procedure
así que todavía no me queda resuelto el problema.

No sé como hacer para que aun saltando una excepción en un insert, el resto de inserts ejecutados anteriormente hagan commit.

Última edición por santiaguinillo fecha: 02-06-2008 a las 14:43:08. Razón: poner título
Responder Con Cita
  #4  
Antiguo 02-06-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Prueba con
* when SQLCODE -803 do SUSPEND ;
* when EXCEPTION SUPERA_IMPORTE DO SUSPEND ;

Cada vez que un procedimiento encuentra un suspend, devuelve los valores que tenga en el RETURNS() y espera a que le pidan el siguiente.

Aunque no devuelvas nada, el SUSPEND hará que devuelva el control a tu programa y puedas hacer un commit o rollback, según te convenga.
Responder Con Cita
  #5  
Antiguo 02-06-2008
santiaguinillo santiaguinillo is offline
Miembro
 
Registrado: abr 2007
Ubicación: Viladecans, Barcelona
Posts: 24
Poder: 0
santiaguinillo Va por buen camino
Question Pruebas con do suspend KO

Hola duilioisola,

¿pero el commit o rollback quieres decir que lo ponga en el código delphi? Porque he hecho lo siguiente y sigue sin hacerme commit (en el procedure he puesto when EXCEPTION SUPERA_IMPORTE DO SUSPEND):

Código Delphi [-]
      sentencia := 'EXECUTE PROCEDURE PROCESA_VISITA (variables)';
      try
        Q1.Close;
        Q1.SQL.Clear;
        Q1.SQL.Add(sentencia);
        Q1.Prepare;
        Q1.ExecQuery;   //AQUI DA LA EXCEPCIÓN
        Q1.Transaction.CommitRetaining;
        Q1.FreeHandle;
      except
        Q1.Transaction.CommitRetaining; //ESTO LO HE PUESTO AHORA Y NO HACE COMMIT
        Q1.FreeHandle;
        raise;
      end;



Cita:
Empezado por duilioisola Ver Mensaje
Prueba con
* when SQLCODE -803 do SUSPEND ;
* when EXCEPTION SUPERA_IMPORTE DO SUSPEND ;

Cada vez que un procedimiento encuentra un suspend, devuelve los valores que tenga en el RETURNS() y espera a que le pidan el siguiente.

Aunque no devuelvas nada, el SUSPEND hará que devuelva el control a tu programa y puedas hacer un commit o rollback, según te convenga.

Última edición por santiaguinillo fecha: 02-06-2008 a las 16:14:19.
Responder Con Cita
  #6  
Antiguo 02-06-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Supongo que si no sigue es porque la excepción que salta no es la que esperas en el WHEN EXCEPCION DO...
Prueba a poner WHEN ANY DO...

O prueba a ver cuál es la excepción que llega con un ShowMessage.
Código Delphi [-]
sentencia := 'EXECUTE PROCEDURE PROCESA_VISITA (variables)';
      try
        Q1.Close;
        Q1.SQL.Clear;
        Q1.SQL.Add(sentencia);
        Q1.Prepare;
        Q1.ExecQuery;   //AQUI DA LA EXCEPCIÓN
        Q1.Transaction.CommitRetaining;
        Q1.FreeHandle;
      except
         on e:exception do 
         begin
            Showmessage(e.message); //Esto te mostrará el texto de la excepcion
           Q1.Transaction.Rollback;
           Q1.FreeHandle;
           raise;
         end;
      end;

Por más que le digas que haga un commit, si ha saltado una excepción no grabará los datos.
Si quieres envíanos el código de tu procedimiento, para que le hechemos una mirada.
Pero como dije anteriormente, quizás sea mejor filtrar los casos para los que se dá la excepción.
Responder Con Cita
  #7  
Antiguo 02-06-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Poder: 20
RolphyReyes Va por buen camino
Lightbulb

Saludos.

Puedes ir haciendo commit por cada inserción es inefectivo pero es una solución.

También puedes poner el código que tienes y cuando salte la excepción "forza" el commit.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita
  #8  
Antiguo 02-06-2008
santiaguinillo santiaguinillo is offline
Miembro
 
Registrado: abr 2007
Ubicación: Viladecans, Barcelona
Posts: 24
Poder: 0
santiaguinillo Va por buen camino
Hacer commit

Hola RolphyReyes,

el problema es que al poner commit en el procedure me da error al compilar. Es decir, no puedo poner commit dentro del procedure.


Cita:
Empezado por RolphyReyes Ver Mensaje
Saludos.

Puedes ir haciendo commit por cada inserción es inefectivo pero es una solución.

También puedes poner el código que tienes y cuando salte la excepción "forza" el commit.
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
continuar una numeracion con Qreport Alfredo Impresión 7 23-10-2007 11:05:53
Key violation. Continuar con siguiente registro CHiCoLiTa Conexión con bases de datos 11 14-02-2007 21:48:37
Continuar numeracion en impresion !! Help RJF Impresión 2 07-11-2006 04:43:17
Desea continuar? SI NO CANCELAR (3 Botones en el formulario) dmassive PHP 3 26-08-2005 19:22:08
No se continuar pepelu1975 Varios 1 19-02-2004 11:02:22


La franja horaria es GMT +2. Ahora son las 14:56:11.


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