Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-05-2011
RedVenom RedVenom is offline
Miembro
 
Registrado: oct 2003
Ubicación: Tabasco, Mexico
Posts: 110
Poder: 21
RedVenom Va por buen camino
Como capturar mensaje cuando se intenta duplicar una clave primaria de una BD

Quisiera saber si hay alguna forma de capturar el mensaje de error que manda la base de datos cuando se intenta duplicar el valor de una llave primaria, esto es para mostrarle un mensaje personalizado al usuario de la aplicacion en lugar del que mande el sistema.
Les agradezco su ayuda de antemano.
Responder Con Cita
  #2  
Antiguo 24-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Qué base de datos?
Responder Con Cita
  #3  
Antiguo 24-05-2011
RedVenom RedVenom is offline
Miembro
 
Registrado: oct 2003
Ubicación: Tabasco, Mexico
Posts: 110
Poder: 21
RedVenom Va por buen camino
Es SQL Server 2008
Responder Con Cita
  #4  
Antiguo 24-05-2011
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Porque no creas una función para saber si existe tal dato en la tabla, no creo que sea buena idea que la base de datos te devuelva un error de la existencia de dicho dato.

un saludo.
Responder Con Cita
  #5  
Antiguo 24-05-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
¿Cómo estás accediendo? ¿ADO, DBExpress?

Utiliza un Try..Except y captura el mensaje de vuelta. Segun la clase podrás acceder al código o en su defecto al mensaje; A partir de ahí podrás personalizar el mensaje:

Código Delphi [-]
try
  ADOQuery1.Update;
except
  on E:EOLEException do begin
    ==> E.ErrorCode    Codigo de error.
    ==> E.Message      Mensaje de error
  end;
end;

Esto es más o menos lo que puedes utilizar para ADO; Para DbExpress algo similar.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 24-05-2011
RedVenom RedVenom is offline
Miembro
 
Registrado: oct 2003
Ubicación: Tabasco, Mexico
Posts: 110
Poder: 21
RedVenom Va por buen camino
Es que la base de datos sola me devuelve ese error cuando intento duplicar una llave primaria lo que deseo es interceptarlo para que yo muestre mi propio mensaje, no me convence lo de crear una funcion tendria que estar llamando a la funcion cada vez que agrego un registro cuando la base de datos ya te da el mensaje.
Responder Con Cita
  #7  
Antiguo 25-05-2011
Avatar de BlueSteel
[BlueSteel] BlueSteel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Concepción - Chile
Posts: 2.310
Poder: 23
BlueSteel Va por buen camino
Cita:
Empezado por RedVenom Ver Mensaje
Es que la base de datos sola me devuelve ese error cuando intento duplicar una llave primaria lo que deseo es interceptarlo para que yo muestre mi propio mensaje, no me convence lo de crear una funcion tendria que estar llamando a la funcion cada vez que agrego un registro cuando la base de datos ya te da el mensaje.

Creo que deberias pensar mejor lo de la funcion...

Si bien la base te envia un mensaje cuando el codigo de registro esta duplicado, para un sistema en donde se ingresa un registro con grandes cantidades de información... (por unos 30 0 50 campos por lo minimo)... haras que el usuario digite todos los campos.... y cuando presiones guardar se de cuenta que ya existe?

Creo que lo mejor es ingresar el campo clave (codigo, campo clave o como lo llames) y preguntar si en la base existe algun registro con dicho codigo.. si existe lanzas el mensaje que existe un registro... en caso contrario sigues ingresando....


Salu2
__________________
BlueSteel
Responder Con Cita
  #8  
Antiguo 25-05-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por olbeup Ver Mensaje
Porque no creas una función para saber si existe tal dato en la tabla, no creo que sea buena idea que la base de datos te devuelva un error de la existencia de dicho dato.
Para mí, de hecho, es mejor que sea el motor de base de datos quien valide ese tipo de cuestiones y capturar desde la aplicación el mensaje de excepción, convirtiéndolo en algo amigable y entendible por el usuario.

Con una función de verificación no hay garantía de que, entre la llamada a la función y el envío de los datos, otro programa o usuario ocupe el valor que no se quiere duplicar.

Una solución como la de Neftali me parece la más adecuada (o usar el evento OnReconcileError en caso de que RedVenom esté utilizando objetos TClientDataSet). Esperemos a ver qué nos dice.

Saludos.
Responder Con Cita
  #9  
Antiguo 25-05-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Al González Ver Mensaje
Para mí, de hecho, es mejor que sea el motor de base de datos quien valide ese tipo de cuestiones y capturar desde la aplicación el mensaje de excepción, convirtiéndolo en algo amigable y entendible por el usuario.
+1

Correcto. Muy correcto.

Primero porque estaremos haciendo trabajo doble.
Segundo porque si ya hay alguien que saber hacer ese trabajo, mejor que lo haga él (SGBD).
Tercero, porque los métodos de hacerlo del SGDB son mucho más eficientes que hacerlo desde el cliente (delphi).
Cuarto, porque hacerlo nosotros no es tan sencillo como parece, por los temas de concurrencia que comenta Al.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 25-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
+1 Al González
+1 Neftalí
Responder Con Cita
  #11  
Antiguo 25-05-2011
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 BlueSteel Ver Mensaje
Creo que lo mejor es ingresar el campo clave (codigo, campo clave o como lo llames) y preguntar si en la base existe algun registro con dicho codigo.. si existe lanzas el mensaje que existe un registro... en caso contrario sigues ingresando....
Esto tiene el problema de concurrencia que ya han mencionado. Lo que he hecho a veces, para evitar la captura innecesaria es:

1. Preguntar la clave.
2. Insertar un nuevo registro con esa clave.
3. Esperar... (a ver qué dice el servidor )
4. Presentar un formulario para llenar los datos restantes.
5. Hacer el UPDATE a la base.

Por cierto, además del try-except también puede usarse el evento OnPostError del DataSet.

// Saludos
Responder Con Cita
  #12  
Antiguo 25-05-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Y uno más para Casimiro +1. Por darme su voto.
Responder Con Cita
  #13  
Antiguo 26-05-2011
RedVenom RedVenom is offline
Miembro
 
Registrado: oct 2003
Ubicación: Tabasco, Mexico
Posts: 110
Poder: 21
RedVenom Va por buen camino
Estoy usando ADODataset no entendi muy bien el codigo que me dio neftali en donde lo debo colocar para capturar y como lo paso al mensaje que yo deseo presentar.
Les agradezco mucho suayu da y opinion, ah y si yo tambien soy de la opinion de usar lo que ya hace la base de datos en lugar de volvr a programar lo que ya esta programado y verificado.
Responder Con Cita
  #14  
Antiguo 26-05-2011
RedVenom RedVenom is offline
Miembro
 
Registrado: oct 2003
Ubicación: Tabasco, Mexico
Posts: 110
Poder: 21
RedVenom Va por buen camino
Ya logre poner mi mensaje cuando da el error la Base de Datos puse el siguiente codigo en el evento OnPostError y si aparece mi mensaje pero despues de que le doy aceptar aparece enseguida el mensaje de error de la base de datos, ahora mi pregunta es como le hago para que solo aparezca mi mensaje??, y otra cuestion y si solo quisiera interceptar ciertos errores de la base de datos se podria hacer??

Código Delphi [-]
procedure TForm1.ADODataSet1PostError(DataSet: TDataSet; E: EDatabaseError;
  var Action: TDataAction);
begin
   MessageDlg('MENSAJE DE ERROR: '+E.Message, mtWarning, [mbOK], 0);
end;
Responder Con Cita
  #15  
Antiguo 26-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Eso es porque lo has ejecutado desde delphi, pruébalo desde fuera, verás
Responder Con Cita
  #16  
Antiguo 26-05-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.267
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Eso es porque lo has ejecutado desde delphi, pruébalo desde fuera, verás
O desactiva los mensajes de error en el IDE;
Tool / Debugger Options / Languages Exceptions / Stop on Delphi Exceptions
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #17  
Antiguo 26-05-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Neftali Ver Mensaje
O desactiva los mensajes de error en el IDE;
Tool / Debugger Options / Languages Exceptions / Stop on Delphi Exceptions
Y te acuerdas de activarlo después, ya que no volverás a ver un error, aunque exista.
Responder Con Cita
  #18  
Antiguo 26-05-2011
RedVenom RedVenom is offline
Miembro
 
Registrado: oct 2003
Ubicación: Tabasco, Mexico
Posts: 110
Poder: 21
RedVenom Va por buen camino
Y como seria desde fuera??
Responder Con Cita
  #19  
Antiguo 26-05-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Cita:
Empezado por RedVenom Ver Mensaje
Y como seria desde fuera??
Ejecutas directamente desde Windows el ejecutable generado por Delphi, no desde el IDE...


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #20  
Antiguo 26-05-2011
RedVenom RedVenom is offline
Miembro
 
Registrado: oct 2003
Ubicación: Tabasco, Mexico
Posts: 110
Poder: 21
RedVenom Va por buen camino
Me sigue apareciendo lo mismo primero el mensaje y luego el que manda la base de datos. Alguna sugerencia??
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cuando elegir una particion primaria y cuando una extendida o logica JoAnCa Varios 1 17-05-2008 23:35:43
Mensaje para no duplicar la clave primaria de la base de datos ivansito PHP 8 08-08-2007 00:53:51
Como copiar un registro cambiando el campo de clave primaria Javi2 SQL 2 17-09-2004 20:49:50
cambiar la clave primaria con SQL User_Baja_2 SQL 8 18-06-2004 08:41:31
cambiar una clave primaria User_Baja_2 SQL 3 06-10-2003 18:03:38


La franja horaria es GMT +2. Ahora son las 02:52:07.


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