Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Captura Excepcion contravención Primary key en tabla (https://www.clubdelphi.com/foros/showthread.php?t=85483)

gorsan 23-03-2014 11:45:29

Captura Excepcion contravención Primary key en tabla
 
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í:

Código Delphi [-]
   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:
Código SQL [-]
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:

Código Delphi [-]
   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

Código Delphi [-]
   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 ;)


La franja horaria es GMT +2. Ahora son las 07:57:49.

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