Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   OnValidate .. No funciona en IB? (https://www.clubdelphi.com/foros/showthread.php?t=20244)

PINO72 09-04-2005 16:47:03

OnValidate .. No funciona en IB?
 
Hola amigos:

Leed el siguiente fragmento :

procedure TFichaProveedores.IBProveedoresCCODPROVValidate (Sender : TField);
Var s: String;
begin
// Primero formateo el string para que añada ceros a la izquierda en caso
// de ser inferior a 6 caracteres numéricos.

s:= Format ('%.*d',[6,Strtoint(Sender.AsString)]);

With IBSQLExisteProv do //IBSQL con un Select y el parámetro PROVEEDOR
begin
ParamByName('PROVEEDOR').AsString:= S;
ExecQuery;
If RecordCount > 0 then
DataBaseError ('Código de Proveedor Duplicado') ;
close;
end;
end;

Pues bien : Este método de validación debería mostrar el mensaje de error cuando en la base exista el código duplicado. He comprobado que el IBSQL funciona correctamente, es decir : RecordCount ha llegado a tener valor 1. El problema sobreviene en la ejecución de la excepción, pues ni aparece ningún mensaje de error ni me permite seguir capturando otros datos en la ficha. Por otra parte el estado de inserción de la tabla permanece durante todo el proceso.

¿Puede ser un bug de los IBX?

Gracias de antemano.

Utilizo : IB.7.1 - IBX 7.09 - Delphi 7 y la ficha trabaja con controles DBAware.

roman 10-04-2005 00:52:13

Déjame entender. Si en


Código Delphi [-]
If RecordCount > 0 then
  DataBaseError ('Código de Proveedor Duplicado') ;

pones un punto de corte en la primera línea, ¿estás diciendo que al examinar el valor de RecordCount éste es igual a 1 y aún así la ejecución no continúa en la segunda línea?

De ser así sería verdaderamente sorprendente ya que más que un error de los IBX sería un error del compilador, cosa que veo muy difícil.

Según leo en la ayuda, un IBSQL es del tipo de datasets cuya propiedad RecordCount sólo devuelve los registros que hayas recorrido hasta el momento, es decir, mientras no recorras todos los registros, la propiedad no devuelve el número correcto. Esto no es un error sino que simplemente, por el tipo de acceso al servidor no hay manera de conocer el dato hasta no tener todos los registros. Esto lo puedes entonces solucionar simplemente llamando a IBSQLExisteProv.Next antes de consultar el valor de RecordCount.

// Saludos

PINO72 10-04-2005 15:25:13

Sobre OnValidate
 
Amigo Roman:

El IBSQL funciona como espero, mi problema es que al asignar un evento OnValidate al campo código, este evento no salta en el momento de recibir el nuevo valor, sino que lo hace al "Postear" la tabla. Me interesaría saber que el código esta duplicado o no en el momento de dejar el control TDBEdit asociado y no al aceptar la grabación del registro en el formulario. El evento OnValidate es gestionado internamente por Delphi y se supone que debe de saltar en el momento de transferir la nueva información al buffer del registro activo, pues bien, . ¿No es eso lo que ocurre cuando modifico el contenido del campo DBEdit saliendo del control con la tecla TAB?. Parece que no.

La posibilidad de gestionar esta comprobación mediante el evento OnExit no es viable para mí, ya que salta en cualquier circunstancia que implique la salida del campo, como, por ejemplo, el intento de pulsar un boton con el ratón, o cuando pulso la tecla Esc del formulario, esto lo hace bastante incómodo a mi forma de ver.

Por tanto, ¿ cual puede ser validación idónea e inmediata para los distintos campos mientras se estan capturando los valores?

Espero haberme hecho entender.
Gracias.

PINO72 12-04-2005 09:03:40

Otro Apunte más....
 
Hola :

Siguiendo con esta complicación y esperando que alguien me pueda ayudar os comento que conectando controles BDE , aplicando el evento OnValidate al campo en cuestión, hace saltar el DataBaseError sin problemas.

AGAG4 12-04-2005 16:15:17

Checa Esto...
 
Checa con esto...
Código Delphi [-]
If not isEmpty then 
  DataBaseError ('Código de Proveedor Duplicado') ;
Saludos.


La franja horaria es GMT +2. Ahora son las 03:02:10.

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