PDA

Ver la Versión Completa : Captura Excepcion contravención Primary key en tabla


gorsan
23-03-2014, 11:45:29
Buenos días.
Recurro de nuevo a ustedes.
Necesito capturar el mensaje que emite interbase cuando se pretende violar una primary key para lanzar yo mi propio mensaje y después manejar lo ocurrido con algo así:


try
..../....
inserción de registro
.../....
except
Datamodule.IBTabla.Cancel;
raise Exception.Create('Existe un registro con ese nombre');
exit;
end;


Pero no me funciona porque no lo considera una excepción ya que ni siquiera pasa por código de except.
¿Tienen alguna idea que me pueda ayudar?

Casimiro Notevi
23-03-2014, 12:12:39
Pues si no pones el código, no podemos imaginarlo ;)

gorsan
23-03-2014, 12:33:44
La excepción salta en el servidor no en el cliente, que no ve la excepción y al hacer la actualización de la tabla es cuando se queja. Por eso el código que he descrito en mi anterior mensaje no funciona porque no pasa por el bloque except.

En el servidor:

CREATE TABLE "TODOS"
(
"CONTADOR" "N_ORDEN" NOT NULL,
"PRIMER_APELLIDO" "PRIMERAPELLIDO" NOT NULL,
"SEGUNDO_APELLIDO" "SEGUNDOAPELLIDO" NOT NULL,
"NOMBRE" "NOM" NOT NULL,
"ALTA" "FECHAALTA" NOT NULL,
"BAJA" "FECHABAJA",
"YEAR" SMALLINT,
"MES" VARCHAR(10),
PRIMARY KEY ("CONTADOR"),
UNIQUE ("PRIMER_APELLIDO", "SEGUNDO_APELLIDO", "NOMBRE")
);

Esta definido como unique la unión de primer apellido, segundo apellido y nombre. Cuando se intenta insertar un registro que ya esta en la tabla con esos tres datos, evidentemente salta el "constraint" de la misma. Y yo lo que quiero es capturar esa excepción y que no sea el motor de interbase quien lo haga. No se como implementarlo

En el cliente:


Hoy:= Now;
DecodeDate(Hoy, Year, Month, Day);
try
DMFicha.IBTodosCONTADOR.AsInteger:=StrToInt(WFicha.DBCONTADOR.Text);
DMFicha.IBTodosPRIMER_APELLIDO.AsString:=WFicha.DBPRIMER_APELLIDO.Text;
DMFicha.IBTodosSEGUNDO_APELLIDO.AsString:=WFicha.DBSEGUNDO_APELLIDO.Text;
DMFicha.IBTodosNOMBRE.AsString:=WFicha.DBNOMBRE.Text;
DMFicha.IBTodosALTA.AsDateTime:=StrToDate(WFicha.DBALTA.Text);
DMFicha.IBTodosBAJA.AsString:='';
DMFicha.IBTodosYEAR.AsInteger:=Year;
DMFicha.IBTodosMES.AsString:=IntToStr(Month);
except
DMFicha.IBFicha.Cancel;
DMFicha.IBTodos.Cancel;
raise Exception.Create('Existe un trabajador con ese nombre');
exit;
end;
DMFicha.IBFicha.Post; ¡¡¡¡¡¡¡¡¡¡¡AQUI ES DONDE SALTA EL ERROR!!!!!!!!!!!!!!!!!!!!!!!
end;



No se como implementar este error. Supongo que habría que hacerlo desde el servidor con algún Stored procedure y un trigger pero no tengo ni idea de como capturar esa excepción.

Casimiro Notevi
23-03-2014, 13:04:29
Pero pon el post dentro del try except

Hoy:= Now;
DecodeDate(Hoy, Year, Month, Day);
try
DMFicha.IBTodosCONTADOR.AsInteger:=StrToInt(WFicha.DBCONTADOR.Text);
DMFicha.IBTodosPRIMER_APELLIDO.AsString:=WFicha.DBPRIMER_APELLIDO.Text;
DMFicha.IBTodosSEGUNDO_APELLIDO.AsString:=WFicha.DBSEGUNDO_APELLIDO.Text;
DMFicha.IBTodosNOMBRE.AsString:=WFicha.DBNOMBRE.Text;
DMFicha.IBTodosALTA.AsDateTime:=StrToDate(WFicha.DBALTA.Text);
DMFicha.IBTodosBAJA.AsString:='';
DMFicha.IBTodosYEAR.AsInteger:=Year;
DMFicha.IBTodosMES.AsString:=IntToStr(Month);

DMFicha.IBFicha.Post; ¡¡¡¡¡¡¡¡¡¡¡AQUI ES DONDE SALTA EL ERROR!!!!!!!!!!!!!!!!!!!!!!!

except
DMFicha.IBFicha.Cancel;
DMFicha.IBTodos.Cancel;
raise Exception.Create('Existe un trabajador con ese nombre');
exit;
end;

end;

gorsan
23-03-2014, 13:35:34
Hal ....
Que cosa mas simple. Imperdonable. Se me queda cara de tonto y no se que mas decir.

Gracias Casimiro.

Casimiro Notevi
23-03-2014, 15:38:39
Para saber, viajar y leer (http://www.intitec.com/varios/La_Cara_Oculta_De_Delphi_4.pdf) ;)