Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Validación de Campos y TDBAdvEdit (https://www.clubdelphi.com/foros/showthread.php?t=70218)

PINO72 07-10-2010 17:55:52

Validación de Campos y TDBAdvEdit
 
Saludos a todos.

Tengo un problema con los componentes de la empresa TMS , en concreto con los TDBAdvEdits que estoy probando.

Tengo las validaciones a nivel campos programadas en los correspondientes eventos OnValidate de los objetos TField, pero cuando utilizo estos componentes para mejorar la entrada de texto, no se despliegan los mensajes de error programadas en las excepciones tipo DataBaseError.

El foco permanece en el campo por que falla la validación, pero no me despliega la ventana de error, con lo que no puedo informar al usuario de la circunstancia que provocó el error de validación.

Esta situación no se repite con los controles DBEdit, en los que funcionan perfectamente las excepciones.

Espero que me puedan ayudar, ya que me gustan estos componentes y me gustaría emplearlos en el futuro.


Saludos.

PINO72 19-10-2010 10:30:33

DbAdvEdit y DataBaseError = Sin mensaje
 
Lo que decía, cuando utilizo componentes DbAdvEdit y genero una excepción en el evento OnValidate del campo asociado, no se visualiza el mensaje del DataBaseError, aunque no se me permite salir del foco (Al fallar la validación).

Pongo algo de código;

Código Delphi [-]
 
 
...
//EditCCODCLI es  TDBAdvEdi;
//CDSCabAlb es TClientDataSet
//CDSCabAlbCCODCLI es TStringField
...
 
 
procedure FTichaABMCAlbCli.CDSCabAlbCCODCLIValidate(Sender : Tfield);
Var IBSQL : TIBSQL;
begin
Try
IBSQL:= TIBSQL.Create(nil);
IBSQL.Transaction:= tr;
IBSQL.Sql.Text:= 'Select Count(*) from clientes where CCODCLI = :XCODCLI');
IBSQL.ParamsByName('XCODCLI').AsString:= TrimRight(EditCCODCLI.Text);
IBSQL.ExecQuery;
** AQUI SE PRODUCE EL FALLO . SI SE GENERA LA EXCEPCIÓN NO SE VISUALIZA EL MENSAJE!!!
If IBSQL.RecordCount = 0 then DataBaseError ('El Cliente no existe');
   ****** Aquí
 
finally
IBSQL.Close;
IBSQL.Free;
end;
end;
De nuevo os pido ayuda ...

Saludos.

rastafarey 23-10-2010 05:14:36

Resp
 
IBSQL.ExecQuery;

Es para insert, delete update o execute etc.

pero para para select debes usar open o active:= true;

pero igual tienes un error ya que debes preparar la consulta antes de pasarle el parametro

PINO72 25-10-2010 20:08:02

ExecQuery y Open
 
Ante todo gracias por contestar.

Con respecto a las sentencia ExecQuery, es la que pone en marcha la consulta, sea del tipo que sea a mi entender.

según la ayuda delphi 7:
Metodo : ExecQuery "Call ExecQuery to execute the SQL query."

en cuanto al comando Open es más bien una propiedad, que determina si el dataset está abierto . Cito : Use the Open property to determine if the dataset is open.

Es por eso por lo que utilizo de manera habitual ExecQuery en lugar de Open, ya que también abre de manera automática el dataset.

En cualquier caso, open tambien ejecuta la sentencia SQL al abrir el dataset correspondiente.

En cuanto al método Prepare, estoy de acuerdo en que se debería llamar antes de ejecutar la consulta, sobre todo cuando ejecutamos la misma sentencia SQL cambiando sólo los parámetros, es por eso por lo que hay que "preparar" la sentencia para su ejecución.

Como decía el hecho de que el foco siga prohibiendome salir del campo es signo de que la consulta se realiza correctamente, ya que no encuentra el cliente en la tabla, el problema es únicamente que no se muestra el mensaje que causa el error y que he programado en DatabaseError.

Corrígeme si me estoy equivocando el algo.

Saludos.

rastafarey 26-10-2010 02:25:41

resp
 
Y no es eso lo que estas haciendo pasando un parametro. O pretendes que al pasar el parametro el dataset haga magia y te devuelva algun resultado. Pero si cres que asi esta perfecto yo no te puedo cambiar tu manera de pensar.

PINO72 26-10-2010 13:07:03

IBSQL.ExecQuery;
Es para insert, delete update o execute etc.

No es cierto : ExecQuery pone en marcha la consulta sea del tipo que sea.

"pero para para select debes usar open o active:= true;"

No es cierto : Open es una PROPIEDAD y no un PROCEDIMIENTO. Lo único que arroja es el resultado de conocer si el DATASET está abierto o cerrado. Encima es de sólo lectura (como es lógico). Te respondí que Open tambien ejecuta la consulta (a veces me despistan un poco..).

"pero igual tienes un error ya que debes preparar la consulta antes de pasarle el parametro"

"Igual tienes que preparar la consulta" = No sabes lo que dices.

Cuando se ejecuta una consulta muchas veces y lo único que cambia son los valores de búsqueda, para no cargar al servidor con contínuas aperturas y cierres de transacciones se pasan los parámetros a la consulta. El comando PREPARE no es obligatorio pero si aconsejable utilizarlo para preparar esos parámetros precisamente.

En una consulta que sólo se realiza una vez ( ya que después se destruye el IBSL) no es necesario.


Te aconsejo que mires antes de manuales antes de contestar algo que no sabes. Yo me tomo primero mi tiempo en comprobar el código. En caso de no dar con la solución acudo al club para ver si alguien me ayuda, lo que no me ayuda son respuestas a la ligera.


La magia no existe... Te remito a los artículos:
http://delphiallimite.blogspot.com/2...parmetros.html
http://delphiallimite.blogspot.com/2...con-ibsql.html


Saludos.


La franja horaria es GMT +2. Ahora son las 01:36:13.

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