Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema para capturar Errores (https://www.clubdelphi.com/foros/showthread.php?t=22515)

carlos gonzalez 17-06-2005 17:18:39

Problema para capturar Errores
 
Hola amigos tengo un problema ojala puedan ayudarme u orientarme, se los voy a agradecer infinitamente, ya tengo mas de una semana y no he podido solucionar este problema., dejen les explico. Lo que quiero es cachar los errores que manda la base de datos cuando se comete un error por ejemplo duplicación de una llave primaria y mandar un mensaje hecho por mí evitando que el sistema truene y siga corriendo.



Anteriormente usaba el EDBEngineError y me jalaba perfectamente, por ejem. El sig. Código lo tenía en el botón de guardar y cuando se cometía un error de duplicación de llaves primarias me manda un mensaje.



procedure TForm33.guardarClick(Sender: TObject);

begin

try



if (pass.Text='') or (pass2.Text='') or(nom.Text='') or (userr.Text='') then

begin

guardar.enabled:=false;

application.messagebox('No Puede Haber Campos Vacios','Validacion De Datos',mb_ok+mb_iconerror);

end

else

begin

tuser.Post;

nom.ReadOnly:=true;

userr.ReadOnly:=true;

pass.ReadOnly:=true;

pass2.Enabled:=false;

primer.Enabled:=true;

siguiente.Enabled:=true;

anterior.Enabled:=true;

ultimo.Enabled:=true;

eliminar.Enabled:=true;

editar.Enabled:=true;

guardar.Enabled:=false;

nuevo.Enabled:=true;

cancelar.Enabled:=false;

salir.Enabled:=true;

tuser.First;

pass2.Text:='';

end;

except

on EDBEngineError do begin

application.messagebox('Este Usuario Ya Existe','Validacion De Usuario',mb_ok+mb_iconerror);

cancelarClick(Sender);

end;

end;

end;









Pero mi problema ahora es que estoy utilizando tablas de DB2 montadas en un servidor AS/400 y la rutina anterior no me funciona., alguien podría ayudarme a salir de este problema, se los voy a agradecer eternamente.



Su amigo Charles



Que DIOS los bendiga

vtdeleon 17-06-2005 17:20:44

AMIGO
UTE NO ENTIENDE QUE NO PUBLIQUE MAS DE UN HILO!!!

LOS DEMAS QUE ME DISCULPEN PERO....LA GENTE NO LEEE!!!:mad:

PD:disculpen la mayuscula tambien:p

carlos gonzalez 17-06-2005 17:26:55

Perdon
 
Perdon por publicar mas de un hilo, soy nuevo en el uso de esta pagina, pero ya ni vuelve a suceder

Saludos tu amigo Charles

vtdeleon 17-06-2005 17:41:02

Saludos

1ero Bienvenido al Foro

2do Leer
Guía de Estilo de los foros
calidad de las preguntas
Utilizar la etiqueta CODE

Asi no volvera a suceder

Disculpa mi manera de contesta ahorita, pero esta semana ha sido un caos:rolleyes:

Lepe 18-06-2005 00:33:24

Independientemente de lo comentado por vtdeleon Comprueba esto:

doble clic a tu tabla tuser. En algún campo tienes la propiedad Required a True?, en delphi.

Si lo tienes, (casi seguro que si) entonces el error de clave duplicada es un EdatabaseError, por eso no entra en el except que tienes puesto.

Puedes poner a ese campo el Required a false, y dejar en tu base de datos Required a True; así si funcionará con el código actual.

Otro tema más grave, es que estas capturando cualquier error de tipo EDBEngineError. El error concreto de violacion de claves es: Integrity Violation

9729 : Key violation.
(en internet buscando por "BDE ERROR CODES", seguro que encuentras el listado completo).

La comprobación correcta será:
Código Delphi [-]
  if (E is EDBEngineError) then
    with EDBEngineError(E).Errors[0] do     
    if ErrorCode = 9729 then
    begin
       // tu mesage box

    end
  else
    raise;

Edito: Faltaba poner .Errors[0] para acceder a ErrorCode, Gracias carlos ;)

Saludos

ContraVeneno 20-06-2005 21:44:51

ESDMssError?????
 
Saludos a todos
Estoy tratando de captura el mismo error de "duplicate key" pero no logro conseguirlo... estoy utilizando SQL server y delphi 5.
el problema es que E no es EDBEngineError, el classname que me muestra es ESDMssError pero tampoco logro encontrar información sobre ese punto.
El error se refiere a "duplicate key" con el número de error 2601 el cuál si he encontrado información... en fin, si alguien tiene alguna pista de hacia donde dirigirme se los agradecría mucho.

este es el código que tengo:
Código Delphi [-]
try
ExecSQL; //Instrucción insert
except on E:Exception do begin
ShowMessage('Error Tipo: '+E.ClassName+', Con el mensaje: '+E.Message);
If (E is EDBEngineError) then //¿nunca es verdadero?
messagebox(handle,'No se puede guardar','Error',MB_ICONERROR);
end; //Fin except
end; //Fin try

Gracias y saludos a todos.

roman 20-06-2005 22:40:16

Cita:

Empezado por ContraVeneno
el problema es que E no es EDBEngineError, el classname que me muestra es ESDMssError pero tampoco logro encontrar información sobre ese punto.

Pues no tendrías más que sustituir EDBEngineError por ESDMssError:

Código Delphi [-]
on E:ESDMssError do
begin

...

end;

// Saludos

ContraVeneno 20-06-2005 23:28:20

Si, yo tambien pense lo mismo... pero delphi no conoce a ESDMssError; al compilar marca(undeclared identifier). Pense que me haría falta una unidad pero hasta ahora ningúna búsqueda a dado resultado con la palabra 'ESDMssError'....
solo se que E.ClassName=ESDMssError pero no logro encontrar información referente a esto...

roman 21-06-2005 00:20:56

Creo que podrías utilizar el Browser de Delphi.

Abre tu proyecto y selecciona View|Browser. Da click derecho en cualquier parte del browser y selecciona Properties y ahí, en Browser Scope (abajo a la derecha) marca el botón All Symbols. Luego selecciona la ficha Globals del browser y recorre hasta la rama de variables y constantes y busca ahí a ver si está el símbolo. En el panel derecho deberá aparecer la unidad en donde está declarada y será la que tienes que incluir.

// Saludos

ContraVeneno 21-06-2005 16:31:48

Antes que nada, gracias por tu tiempo Roman....
Busque en globals y efectivamente, ahi viene listado ESDMssError, pero no me muestra niguna referencia como si lo hace con todos los componentes normales de delphi, incluso aparece EDBEngineError y me muestra su referencia a DBTables. Incluso encontre que junto a EDBEngineError esta ESDEngineError de donde se desprende ESDMssError.

Lo que sucede es porque estoy utilizando unos componentes de la paleta SQLDirect (Son los que utilizaban cuando empezé a trabajar en esta empresa y no se como los obtuvieron.) que de ahi es de donde vienen las letras SD.
Buscando la información de esta paleta me encontre con la solución; que era tan simple que me sorpendí. Tenía que agregar la unidad 'SDEngine' y el código queda así:
Código Delphi [-]
try
 ExecSQL; //Instrucción insert
{Tambien podría ser E:ESDEngineError o E:ESDMssError 
dependiendo del rango de errores que se quieran capturar}
except on E:Exception do 
 if (E is ESDEngineError) then
  with ESDEngineError(E) do
   if ErrorCode = 2601 then
    MessageBox(frmInicial.Handle,'Llave duplicada.','Error',MB_ICONERROR);
end; //Fin try

Gracias Roman por la referencia.

Saludos


La franja horaria es GMT +2. Ahora son las 22:48:56.

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