Ir al contenido


Foto

Excepciones y mensajes de error al usuario


  • Por favor identifícate para responder
4 respuestas en este tema

#1 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 06 julio 2009 - 03:27

Hola!

Puedes validar en delphi si el (los) campos(s) que se ingresaran a la bd cumplen ciertas condiciones: No repetidos, Vacios, etc.  Sin embargo FB te permite crear Excepciones con un nombre y un texto:


php
  1. CREATE EXCEPTION CODIGO_VACIO '¡EL CODIGO NO DEBE ESTAR EN BLANCO!';
  2. CREATE EXCEPTION NOMBRE_VACIO '¡DEBE DE INGRESAR UN NOMBRE DE ENTIDAD!';


Segun entiendo esto disminuye el codigo delphi para la validacion, ya que es la bd la que hace la chamba (trabajo)

Mi pregunta es como hacer que el usuario vea ese mensaje de error y no el que trae por defecto (en este caso para la excepcion "Nombre_Vacio")

---------------------------
Elabm
---------------------------
Field 'NOMBRECP' must have a value.
---------------------------
Aceptar 
---------------------------


Gracias, espero sus comentarios!!
 
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 07 julio 2009 - 07:44

Hola,  a continuación te coloco un ejemplo de como hacer lo que necesitas, usando TClientDataset, es un procedimiento único  que sirve para todas las tablas de la BD, que  intercepta el evento OnRenconcileError de todos los TClientDatasets de un módulo y un arcivo de texto de nomnbre Mensajes.txt que contiene los mensajes de error (incluidas las excepciones, constraints, etc. de toda la DB) y que se encuentra en la misma carpeta del ejecutable.

Pongamos como ejemplo  la siguiente BD:(No encuentro las etiquetas)
 


sql
  1. CREATE EXCEPTION CODIGO_VACIO 'EL CODIGO NO DEBE ESTAR EN BLANCO';
  2. CREATE EXCEPTION NOMBRE_VACIO 'DEBE DE INGRESAR UN NOMBRE DE ENTIDAD';
  3.  
  4. CREATE TABLE NOMBRES (
  5.     ID_NOMBRE      INTEGER NOT NULL,
  6.     NOMBRE          VARCHAR(30) NOT NULL ,
  7.     CODIGO          VARCHAR(10) NOT NULL ,
  8.  
  9. PRIMARY KEY (ID_NOMBRE),
  10. CONSTRAINT UQ_CODIGO_REPETIDO UNIQUE (CODIGO)
  11. );
  12.  
  13. CREATE TABLE OTRATABLA (
  14.     ID_TABLA      INTEGER NOT NULL,
  15.     TABLA          VARCHAR(30) NOT NULL ,
  16.  
  17. PRIMARY KEY (ID_TABLA),
  18. CONSTRAINT UQ_TABLA_REPETIDA UNIQUE (TABLA)
  19. );

Hay que agregar en la sección private del módulo el siguiente campo:

 


delphi
  1. private
  2. FErrores: TStringList;

y Luego interceptar el evento OnReconcileError de los TClientDatset así­:
 


delphi
  1. procedure TMiModulo.Conciliacion(DataSet: TCustomClientDataSet;
  2. E: EReconcileError; UpdateKind: TUpdateKind; var Action: TReconcileAction);
  3. const
  4. Archivo = 'Mensajes.txt';
  5. var
  6. I: Integer;
  7. S, N: string;
  8. begin
  9. if not Assigned(FErrores) then
  10. begin
  11. FErrores := TStringList.Create;
  12. S := ExtractFilePath(GetModuleName(HInstance)) + Archivo;
  13. if FileExists(S) then
  14. FErrores.LoadFromFile(S);
  15. end;
  16. S := E.Message;
  17. for I := 0 to FErrores.Count - 1 do
  18. begin
  19. N := FErrores.Names[I];
  20. if Pos(N, S) <> 0 then
  21. begin
  22. S := FErrores.Values[N];
  23. Break;
  24. end;
  25. end;
  26. MessageDlg(S, mtError, [mbOk], 0);
  27. end;

A continuación escribo como deberian ir algunas lineas del archivo de texto:

CODIGO_VACIO=El código no debe estar en blanco//o lo que tu quieras
NOMBRE_VACIO=Debe ingresar un nombre de entidad
UQ_CODIGO_REPETIDO=Este código ya existe
UQ_TABLA_REPETIDA=Esta tabla ya existe

Finalmente si no usas TClientDataset podrias adecuarlas en los correspondientes eventos de tu dataset donde fueren necesarias.

Lástima la falta de etiquetas para que el ejemplo hubiera sido mas claro.
Espero te sirva.

Saludos


  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 07 julio 2009 - 09:18

Hola

Excelente y muy interesante explicación amigo Wilson, gracias por el aporte.

Salud OS

PD, Estamos trabajando con el asunto de las etiquetas, el cambio de versión del sistema de foros tuvo sus efectos colaterales, sin embargo (y mientras las liberamos) puedes utilizarlas manualmente de esta forma:

[NOBBC]


delphi
  1.   //Para código Delphi



cpp
  1.   //Para código C++



csharp
  1.   //Para código C#


[/NOBBC]
  • 0

#4 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 07 julio 2009 - 10:44

Wilson: mas claro ni el agua! muy buen ejemplo.

Habia visto algo asi en CD pero en una manera mas complicada, aunque al final se llega al mismo resultado. Sin embargo yo aun sigo con una duda:

Se declara la excepcion y el texto a mostrar.

CREATE EXCEPTION NOMBRE_VACIO '¡DEBE DE INGRESAR UN NOMBRE DE ENTIDAD!';


pero debo REPETIR la declaracion del texto, en este caso en el archivo txt:

NOMBRE_VACIO=¡DEBE DE INGRESAR UN NOMBRE DE ENTIDAD!'

y he ahi mi duda, ignorancia al respecto ¿para que declarar entonces en la creacion de la excepcion?  :huh:


  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 07 julio 2009 - 11:21

Hay que tener en cuenta cuestiones elementales de diseño, por ejemplo el validar un campo requerido(obligatorio) tiene mas sentido hacerlo en la aplicación cliente que en la BD por cuestiones de tráfico en la red, pero el ejemplo es muy práctico para validar un campo único, para avisar al usuario que no puede borrar cierto registro porque tiene otro relacionado, para controlar excepciones lanzadas por Triggers que comprueban ciertos requisitos mas complejos a la hora de realizar una transacción y un largo etc... que tiene que ver directamente con las necesidades epicifcas de la aplicación.

Saludos
  • 0




IP.Board spam blocked by CleanTalk.