Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-06-2005
carlos gonzalez carlos gonzalez is offline
Miembro
 
Registrado: may 2005
Posts: 108
Poder: 19
carlos gonzalez Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 17-06-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
AMIGO
UTE NO ENTIENDE QUE NO PUBLIQUE MAS DE UN HILO!!!

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

PD:disculpen la mayuscula tambien
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #3  
Antiguo 17-06-2005
carlos gonzalez carlos gonzalez is offline
Miembro
 
Registrado: may 2005
Posts: 108
Poder: 19
carlos gonzalez Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 17-06-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
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
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #5  
Antiguo 18-06-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 20-06-2005 a las 18:11:17. Razón: Código Incompleto.
Responder Con Cita
  #6  
Antiguo 20-06-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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.
__________________

Responder Con Cita
  #7  
Antiguo 20-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #8  
Antiguo 20-06-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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...
__________________

Responder Con Cita
  #9  
Antiguo 21-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #10  
Antiguo 21-06-2005
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
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
__________________


Última edición por ContraVeneno fecha: 21-06-2005 a las 17:07:53. Razón: Solucionado
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 18:23:44.


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
Copyright 1996-2007 Club Delphi