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)
-   -   Abortar una Inserción (https://www.clubdelphi.com/foros/showthread.php?t=69789)

GustavoCruz 09-09-2010 16:28:02

Abortar una Inserción
 
Hola amigos del foro, me gustaría saber cómo hago para evitar la inserción de un registro. He probado con esto, en un trigger "BI", pero no me resulta...:(

Código Delphi [-]
if (strlen(new.campo) = 0) then exit;

pensé que eso sería suficiente.

Tampoco deseo utilizar excepciones...

Gracias por vuestro tiempo

Neftali [Germán.Estévez] 09-09-2010 17:02:59

¿Dónde estás colocando este código?

Si utilizas Table o Query, creo que debería funcionar el OnBeforePost, para poder cancelar utilizando un Cancel.

GustavoCruz 09-09-2010 19:51:22

Hola Neftali, disculpa por lo poco de la explicación....

Lo que deseo hacer es directamente en la base de datos.

el código está en el trigger before insert de la tabla en cuestión pero el código no es suficiente pues me deja pasar el registro

Código SQL [-]
if (strlen(new.campo) = 0) then exit;

estoy pensando en eliminar el registro si en campo es vació o nulo en el "trigger after insert", pero me parece inapropiado; total si no hay de otra tocará:o

Gracias por tu tiempo

celades1 09-09-2010 19:56:17

Hola

Si quieres controlarlo en triggers

Lo normal para mi es utilizar una excepcion en el BI
sino quieres excepciones (no se porque no) puedes hacer una chapuza
en el AI delete tabla where id=new.id en el caso que no se cumpla la condicion


En fin esto es lo que hay

Panta

Casimiro Notevi 09-09-2010 20:59:29

Y por qué no pones en el BeforePost algo así como esto:

Código:

if (new.campo is not null) or (new.campo<>'') then
// hacer lo que sea

Supongo que ¿el campo es de texto?

maeyanes 13-09-2010 19:04:28

Hola...

Cita:

Empezado por Casimiro Notevi (Mensaje 375898)
Y por qué no pones en el BeforePost algo así como esto:

Código:

if (new.campo is not null) or (new.campo<>'') then
// hacer lo que sea

Supongo que ¿el campo es de texto?

¿Será por que lo quiere hacer a nivel Trigger y no a nivel aplicación? :D


Saludos...

Casimiro Notevi 13-09-2010 19:16:33

Pues hazlo en el trigger beforeinsert.

¿Y por qué no te funciona?

guillotmarc 13-09-2010 19:38:36

Cita:

Empezado por GustavoCruz (Mensaje 375858)
Hola amigos del foro, me gustaría saber cómo hago para evitar la inserción de un registro. He probado con esto, en un trigger "BI", pero no me resulta...:(

Código Delphi [-]if (strlen(new.campo) = 0) then exit;


pensé que eso sería suficiente.

Tampoco deseo utilizar excepciones...

Gracias por vuestro tiempo

Esta línea lo que te hace es salir del trigger, pero el registro como ya has comprobado se insertará igualmente. Hasta donde yo sé tienes que lanzar una excepción para decirle al motor que hay un problema y que no debe insertarse el registro.

Esa excepción después la puedes capturar en un try ... except de tu programa para que no sea visible por el usuario.

O bien, como dicen los compañeros, tendrás que hacer las verificaciones previas en el mismo programa Delphi y no en la base de datos.

Saludos.

Gallosuarez 13-09-2010 21:27:29

Otra manera...
 
Gustavo:

En alguna ocasión resolví el problema de las siguiente manera:

Creé un procedimiento almacenado
Código SQL [-]
CREATE PROCEDURE AGREGAR_ALUMNO (
    nombre varchar(35),
    a_paterno varchar(25),
    a_materno varchar(25))
as
BEGIN
    BEGIN
    IF (:nombre IS NOT NULL) THEN
      INSERT INTO alumnos (nombre, a_paterno, a_materno) 
      VALUES (:nombre, :a_paterno, :a_materno);
    SUSPEND;
END

De esta manera llamas a tu procedimiento almacenado con sus respectivos parámetros y no te va ha insertar ningún registro de acuerdo a la condición que tu elijas...

Saludos,
Gerardo Suárez Trejo

P.D. Ojo: es un procedimiento almacenado por separado ...

GustavoCruz 15-09-2010 17:19:18

Gracias a todos por sus comentarios y recomendaciones. probé la propuesta de mi amigo Gallosuarez; y todo va bien.

Un millón de gracias por vuestro tiempo


GustavoCruz

chingolo 16-09-2010 17:10:18

la otra es hacer un rollback, pero personalmente es mejor verificar los datos antes de guardar debido a la integridad de la base, cuestion de gustos

rastafarey 07-10-2010 05:47:38

Resp
 
Una vez salen las vistas actualizables a solucionar el problema.

Usa una vista actualizable y los triger de la vista puedes hacer lo que se te ocurra.


La franja horaria es GMT +2. Ahora son las 01:02:27.

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