FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
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.
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. |
#2
|
|||
|
|||
Un procedimento almacenado funciona como una unidad en donde todas las operaciones son grabadas (commit) si y solamente si no se presenta alguna violacion de integridad (llaves foraneas, primarias, campos nulos, etc). Al presentarse alguna violacion los datos de la base de datos quedan en el estado en que se encontraban justo antes de lanzar el procedimiento almacenado.
Realmente y en lo personal evito que queden datos pendientes por actualizar cuando se lanza un procedimiento almacenado, sin embargo, puedes colocar una sentencia de codigo y que te escriba en otra tabla, no que te lance una expecion porque las excepciones provocan que pierdas las actualzaciones alcanzadas hasta ese punto.
La tabla TS_TRAZO la puedes consultar despues para saber que paso.
__________________
Luis Fernando Buelvas T. |
#3
|
|||
|
|||
Medio solucionado
Hola a todos,
pues resulta que no cogía la excepción correcta. Con el WHEN ANY DO SUSPEND; me ha funcionado correctamente y ha hecho commit de los inserts anteriores. El "problema" es que ahora se traga la excepción y no muestra el mensaje de error ya que el código delphi no detecta excepción. Una pregunta, ¿el insert devuelve alguna variable si se ha insertado correctamente (en el procedure)? Si fuese así, podría devolver en el procedure una variable que diga si se ha insertado bien el último insert que es el único que provoca la excepción. |
#4
|
||||
|
||||
Saludos.
En Firebird 2.xx tienes la clausula RETURNING pero tienes la v1.5. No se cual es tu caso pero analiza si puedes migrar a la nueva versión que tiene más mejoras y estabilidad. Hasta luego.
__________________
Gracias, Rolphy Reyes |
#5
|
||||
|
||||
Si quitas la sentencia WHEN ANY DO SUSPEND de tu procedimiento, la parte donde tratas las excepciones te dirá cuál es la excepción que se ha generado.
De todos modos, la filosofía de las excepciones es diferente a lo que parece que haces tu: - Las excepciones hay que tratar de no utilizarlas. - Consumen muchos recursos. - Si salta una excepción hay que volver atrás todo lo que se ha hecho hasta entonces. - Normalmente se puede evitar la excepción. Por ejemplo: Si tienes un procedimiento que divide dos valores, tienes dos opciones:
Supongo que lo mejor en tu caso (creo que estás insertando registros) es verificar si existe y sobrepasa un valor dado.
Última edición por duilioisola fecha: 03-06-2008 a las 13:56:51. |
#6
|
|||
|
|||
Resuelto
Gracias a todos por vuestras respuestas.
Doy el problema por resuelto. Finalmente con el when any do suspend; ha sido suficiente y aunque ya no muestra el mensaje de la excepción no es realmente grave. Seria interesante haber tenido lo que comentaba RolphyReyes sobre Returning y de esta forma podría haber devuelto alguna variable para informar de que no se ha introducido el último registro. Es para esto que teníamos las excepciones, para informar de ello a la aplicación delphi. Lo que no queríamos es que nos hiciera rollback de las anteriores operaciones en la bbdd del procedimiento. En mi caso no podría hacerlo de otra forma, ni de la forma que comenta duilioisola en el código sql ya que el último insert del procedure se efectua o no dependiendo de unas condiciones que hay en el trigger before insert de la tabla que intenta insertar. Por lo tanto, o bien ponemos el código del trigger en el mismo procedure o bien necesitaríamos el returning que ya tiene el firebird 2.0 De nuevo, gracias a todos por vuestro aporte. Santi. |
#7
|
||||
|
||||
Resp
Dentro de un disparador no vas a poder decir que no inserte o que no haga lo que uba ahacer en su tabla. Por exactamente la accion de insertar es la que dispara el disparador. Lo que si puedes hacer desde el disparador verifcar al condicion que te hace saltar la exception antes de manadar a insertar.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa. |
|
|
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 |
|