Buenas. sigo a vueltas con los triggers; lo cierto es que en estos días he aprendido un montón de cosas. Gracias a todos los que me habéis ayudado.
Tengo una tabla en FB 2.5 con esta estrutura:
Código PHP:
CREATE TABLE Bancos (Codigo VARCHAR(4) NOT NULL, Nombre VARCHAR(65), Bic VARCHAR(11), CONSTRAINT PK_Bancos PRIMARY KEY (Codigo))
E inserto los datos por ejemplo así:
Código PHP:
Query->Close();
Query->SQL->Text = "INSERT INTO Bancos (Codigo, Nombre, Bic) VALUES (:Codigo, :Nombre, :Bic)";
Query->ParamByName("Codigo")->AsString = "003";
Query->ParamByName("Nombre")->AsString = "BANCO DE DEPOSITOS";
Query->ParamByName("Bic")->AsString = "BDEPESM1XXX";
Query->ExecSQL();
El campo Codigo necesariamente tiene que tener cuatro posiciones. Para controlarlo he definido un trigger y una excepción así:
Código PHP:
CREATE EXCEPTION CodBan_erroneo 'El código de entidad es incorrecto. Verifíquelo.';
SET TERM ^ ;
CREATE TRIGGER BANCO_VERIFICA FOR BANCOS
ACTIVE BEFORE INSERT OR UPDATE
POSITION 0
AS
BEGIN
IF (INSERTING AND CHAR_LENGTH(TRIM(NEW.Codigo)) <> 4) THEN
EXCEPTION CodBan_erroneo;
WHEN GDSCODE except DO BEGIN
END
END ^
SET TERM ; ^
Tengo también definido una función de gestión de errores. Al ejecutarse el query con esos datos lógicamente salta la excepción porque al código le falta una carácter.
- Si no pongo la claúsula WHEN salta el gestor de errores, el registro no se graba y se detiene la ejecución del programa.
- Si pongo la claúsula WHEN como está ahí ni salta el gestor de errores ni se detiene la ejecución y le registro sí se graba.
Sé que os estoy dando la paliza, pero por más docuemtación que he leído no veo como "combinar" las dos cosas; es decir: que salte la excepción, que no se grabe el registro erróneo y que continúe la ejecución del programa.