Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
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 12-05-2007
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 FGarcia
¿cual seria la manera de manejar los errores de campo NULL? (y errores en general) ¿Donde se validarian en FB o en delphi? ¿como se validarian?
Este tipo de restricciones deben estar en la base de datos, porque al motor no se le va una y a nosotros puede que sí. Es decir, el motor de la base siempre será infalible para detectar este tipo de errores: campos requeridos, duplicación de claves, claves foráneas inexistentes, etc.

Pero, tal como explica Lepe, cuando un intento de violación de alguna de estas restricciones suceda, el motor lo notifica al cliente en forma de excepción. Esta excepción puede ser capturada en el evento OnPostError del dataset que estés usando, o dejar que pase hasta llegar a ApplicationEvents, como describe Lepe.

De cualquier forma que lo hagas, realmente no estás tú validando los datos; es el motor de la base quien lo hace, y tu aplicación simplemente maneja la notificación de un posible error.

// Saludos
Responder Con Cita
  #2  
Antiguo 12-05-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 22
FGarcia Va por buen camino
De nuevo por aqui!

bueno considerenme como de lento aprendizaje. Hice estas excepciones y triggers:

Código SQL [-]
//LA EXCEPCION
CREATE EXCEPTION NO_PLACAS 'EL NUMERO DE PLACAS ES NECESARIO';

//EL TRIGGER
AS
begin
  if (NEW.placas IS null ) then
    exception NO_PLACAS;
end
//lA EXCEPCION
CREATE EXCEPTION PLACAS_2 'LAS PLACAS ESTAS DUPLICADAS';

//EL TRIGGER
AS
begin
  if (NEW.placas IS not null ) then
    EXCEPTION PLACAS_2;
end

les recuerdo que estoy haciendo un post a la bd y que estoy tratando de capturar los errores al tratar de ingresar un campo vacio o con datos duplicados. ¿Bueno ahora que hago con esto? ¿ Cual seria el codigo a poner? ¿en BeforePost o en PostError?

una vez mas les agradesco su ayuda y atencion.
Responder Con Cita
  #3  
Antiguo 12-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
EMDOError está declarado en mdo.pas

Lo demás fijo que no son erroes, es que no sabe lo que era EMDOError.

Veo que el hilo ha avanzado mucho, pero hace falta tener las cosas algo más claras.

Si el campo placas está declarado como NOT NULL, y en tu programa creas un registro y le das a guardar (sin modificar nada), ya Firebird protestará con un mensaje de error "violation of constraint ENTRADA_1 for table ENTRADA" o algo similar, por tanto, no es necesario ni crear trigger ni excepciones. Pruebalo para que veas como funciona la cosa.

Ahora aplicas una mezcla entre lo dicho por roman y lo mío, esto es, en el dataset entrada de tu form de delphi, localiza el evento onPostError, y añade ShowMessage mostrando los parámetros que trae el evento para ver que te muestra. Ahora en ese evento es donde tendrás que adaptar las rutinas "parseError" y también "IsBDConstraint" para tu caso particular.

Lo mismo para las placas duplicadas, si pones un indice único sobre el campo, Firebird ya protesta, por ende, no hace falta crear la excepción, es más en este caso está mal planteado, ya que si introduce un número de placa correcto (no duplicado), en el trigger solo se compara si es distinto de null y salta la excepción, asi que, no dejará introducir ningún número de placa, ¡ninguno!

OFFTOPIC: Que no te vea yo declarar una excepción así:
Código SQL [-]
CREATE EXCEPTION PLACAS_2 'LAS PLACAS ESTAS DUPLICADAS';
que te pego un tirón de orejas, crealá así:
Código SQL [-]
CREATE EXCEPTION PLACAS_DUPLICADAS  'LAS PLACAS ESTAS DUPLICADAS';



Si quieres dejar pasar las excepciones al ApplicationsEvent, no uses el OnPostError para nada.

Efectivamente me parece más adecuado usar el evento OnPostError del dataset porque está precisamente para eso, para detectar errores al guardar.

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: 12-05-2007 a las 04:25:18.
Responder Con Cita
  #4  
Antiguo 12-05-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 22
FGarcia Va por buen camino
Lepe, Roman: Muchas gracias por la ayuda, la verdad estaba harto pero ya va saliendo esto.

Efectivamente elimine los triggers y exception de la bd ya que tenia los campos declarados como UNIQUE coloque el showmessage para ver el mensaje de horror como dijo Lepe y en realidad no tuve que modificar nada de IsConstraint pues ya lo habia declarado pero como existia la excepcion habia un conflicto en los mensajes a mostrar al eliminar las excepciones quedo el mensjae de Isconstraint.

Aunque aun persiste un error al parecer la operacion de post no se cancela o se queda en el limbo pues aunque corriga el dato de placa el mensaje sigue siendo el mismo y si cierro la aplicacion me aparece el mensaje de "RunTime error 216 at 00438CF9"

Caray! ya parece serie de TV "To be continued"

Gracias
Responder Con Cita
  #5  
Antiguo 12-05-2007
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 22
FGarcia Va por buen camino
Hola!

Bueno despues de tratar de averiguar que pasaba con esa operacion que se quedaba en el limbo acabe haciendo esto:

Código Delphi [-]
//Al generarse un error durante el post
procedure TfrmDatos.MDOEntradaPostError(DataSet: TDataSet;
  E: EDatabaseError; var Action: TDataAction);
begin
  //Si es un error de la base de datos
  if (e is EMDOError) then
  begin
    strDebug := 'SqlCode: ' +inttostr(EMDOError(E).SQLCode) + ' '+ E.ClassName;
    strMessage:= ParseError(EMDOError(E));
    
    Action := daAbort;
  end;
  
  //Y esto fue todo!!!
  MDOEntrada.Close ;
  MDOEntrada.Open ;
  
  //Mostramos el mensaje de error al usuario
  ShowMessage('Al usuario: ' + strMessage + saltodoble +
                'Mensaje de Debug: ' + strDebug + saltodoble );
end;

¡Que cosas!¿no?


Nuevamente me repito muchas gracias por su ayuda y atencion!!!!


p.d. ¡Amenazo con regresar!
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
onValidate de un campo (Excepciones) Caro Conexión con bases de datos 2 06-06-2006 22:33:22
OnValidate .. No funciona en IB? PINO72 Firebird e Interbase 4 12-04-2005 16:15:17
Onvalidate Como se usa servicomp Conexión con bases de datos 1 16-02-2005 04:46:05
OnValidate javiermorales OOP 5 13-11-2003 15:52:52
OnValidate y Foco javiermorales OOP 9 21-05-2003 08:10:16


La franja horaria es GMT +2. Ahora son las 05:42:14.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi