Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   limitar Número de caracteres de un DBGRid (https://www.clubdelphi.com/foros/showthread.php?t=55388)

georgejg 15-04-2008 19:05:38

limitar Número de caracteres de un DBGRid
 
Hola Nuevamente,

Me gustaria saber si es posible limitar Número de caracteres de un DBGRid es decir..

Tengo el DBGrid Asociado al DataSource y este a un Query.
realizo la consulta perfectamente y puedo modificar los registros.

en la consulta se muestra campos como "Cantidad" que es de tipo Entero. en la Base de Datos esta con un tamaño de 10 y lo q se requiere es q al realizar la consulta y querer modificarlo no permita ingresar mas de 10 numeros.

por decir algo
Esto es un ejemplo de lo q me permite Digitar o ingresar el DBgrid
"145289654125478562121............"
y asi es como deberia quedar:
"1254782120"

les agradeceria una pronta respuesta.

Saludos.

juanlaplata 15-04-2008 20:55:42

Mira la propiedades del campo en cuestion, para integer podes usar minValue y maxValue, tal ves te puede servir. (Ej: maxValue = 9999999999)

georgejg 16-04-2008 23:35:46

Gracias por contestar juanlaplata

ahora e probado lo q dices y lo hago de la Siguiente manera:

en el Botton "Consultar" al terminar la consulta pongo el Siguiente codigo:

Código Delphi [-]
Masdata.Query11CANTIDAD.MaxValue:= 9999999999;  //(Maximo 10 Caracteres)

Efectivamente lo carga y pone el Query con un Maximo de 10 caracteres ya que al Ingresar en la celda (Por Ejemplo) 11 numeros es decir 12345678901 o mas entonces me Muestra un error Diciendo

12345678901 is not a valid a value for field 'CANTIDAD'. The allowed range is 0 to 9999999999

mas o menos mi traduccion de PitInglis:D
el valor 12345678901 no es un válido para el campo 'CANTIDAD'. La gama permitida es 0 a 9999999999.

y si digito 10 o menos No lanza el error lo q indica q si lo esta validando, pero no con el mensaje adecudo.

E intentado capturar o validar el para poner otro mensaje de Error con el Siguiente Codigo.

Código Delphi [-]
if (Masdata.Query11CANTIDAD.MaxValue >= 99999999999) then  //Mayor o Igual a 11 Caracteres
  begin
    MessageDlg('Error EL Numero Maximo de Caracteres son 10!!',MtError,[MbOk],0);
    Edit11.SetFocus;   //Edit de Prueba
    Abort;
  End;

pero el Problema esta en q no se en q evento colocarlo, lo e intentado en algunos eventos del DBGrid como:
odDrawDataCell, odDrawColumnCell, KeyPress, OnColExit

y eventos del Query como BeforeEdit, OnUpdateError, Pero no funciona..

:( :( :( :(
Si me Podrian dar su Opinion ya sea si el Codigo para Validar el Error esta Mal o si esta bien en q evento de q componente debo ponerlo.

Les Agradesco una pronta respuesta,

Saludos...

juanlaplata 17-04-2008 14:12:01

Bueno, veamos un poco mas, si tienes un query, dataSet, table,lo que sea, y le das doble click (en timepo de diseño no?) se mostrara una pequeña ventanita (Fields editor). Estando este componennte (dataSet,...) en estado Active = True le das botton derecho y Add all Fields. Se agregaran todos los campos de dicho dataset, ... ; y ahi seleccionas el campo que deseas controlar, y en el Object Inspector tienes entre otras las prop que antes mencionabamos e incluso eventos, como por ejemplo onValidate, que en este caso creo seria en el cual poner tu nuevo codigo. Espero te sirva de ayuda.

georgejg 17-04-2008 16:46:39

hola. juanlaplata e probado lo q me digisted y puse la propiedad MaxValue del Query11CANTIDAD directamente sobre el Inspector de Objetos (MaxValue 9999999999) e igual lanza el mensaje si digito mas de 10 caracteres. :)

Ahora el Detalle esta nuevamente al quere Capturar el Error puse el codigo

Código Delphi [-]
if (Masdata.Query11CANTIDAD.MaxValue >= 99999999999) then  //Mayor o Igual a 11 Caracteres
  begin
    MessageDlg('Error EL Numero Maximo de Caracteres son 10!!',MtError,[MbOk],0);
    Abort;
  End;
en el evento OnValidate del Query11CANTIDAD pero no lo toma..

mira el mensaje deberia aparecer si sucede lo siguiente:
1. Digitan mas de 10 Numeros
2. Al salir de la Celda ya sea usando el teclado o mause debe mostrar el Mensage "Error EL Numero Maximo de Caracteres son 10!!" y que el foco quede nuevamente en la celda en la q estaba escribiendo.

no se q evento me controla la Salida de la Celda si lo coloco en el ColExit aparece el error Deseado "Error EL Numero Maximo de Caracteres son 10!!" pero no me Deja ingresar a la Columna.

asi q no se si me podria decir cual es el Evento q controla la Salida de una Celda para poner el codigo alli y probar nuevamente.

De antemano gracias por la atencion prestada..


Saludos..

georgejg 18-04-2008 15:39:29

Hola a Todos con respecto al tema..

encontre este hilo el cual puede darle un nuevo rumbo a la solucion de este dilema.

si nos fijamos en el encontramos que efectivamente como decia nuestro compañero juanlaplata la validacion se debia hacer en el Evento OnValidate del QueryCANTIDAD.

en el hilo se encuentra un codigo dado por Roman q adecuandolo a lo q se tiene quedaria de la siguiente manera:

Código Delphi [-]
procedure Masdata.Query11CANTIDADValidate(Sender: TField);
begin
  if Sender.AsString = '' then
     raise Exception.Create('El Campo no Puede Quedar en Blanco!');  //Efectivamente valida el campo en blanco y no lo deja continuar hasta q digite algo
end;

y si agregamos el codigo para validar el numero de caracteres segun el ejemplo quedaria de la siguiente manera:

Código Delphi [-]
procedure TBDMasdata.Query11CANTIDADValidate(Sender: TField);
begin
    if Sender.AsString = '' then
    raise Exception.Create('El Campo no Puede Quedar en Blanco!');

    if Query11CANTIDAD.MaxValue >= 999999 then
      begin
        raise Exception.Create('El Valor Maximo es de 5!!');
      end;
end;

efectivamente el mensaje lo muestra pero ahora el problema radica en q asi escriban 2 numeros en todo caso muestra la validacion lo cual es erroneo ya q solo deberia salir si digitan mas de 5 numeros.

por lo tanto la validacion esta mal hecha ya e intentado varias maneras incluso la q se venia manejando al principio pero nada.

si alguien me puede dar su opinion acerca de la validacion seria muy importante Gracias.

Saludos

roman 18-04-2008 16:51:57

MaxValue es una propiedad del componente Query1CANTIDAD que establece el valor máximo del campo. Tú mismo la has puesto antes en 999999 y por tanto la comparación >= siempre es cierta. Lo que debes usar es el valor mismo el campo y compararlo contra MaxValue:

Código Delphi [-]
if Sender.AsInteger > Query1CANTIDAD.MaxValue then
  raise Exception.Create('El Valor Maximo es de 5!!');

// Saludos

georgejg 18-04-2008 19:18:16

Solucionado....
 
Primero Agradecerles a juanlaplata y a roman por sus opiniones fueron de gran importancia.

ahora siguiendo con el ejemplo de roman en el cual utilizaba el Sender.AsInteger o Sender.AsString funcionaba con el primero pero si lo utilizaba en mas de dos validaciones este no lo ejecutaba de la manera adecuada.

al final el Codigo q se utilizo fue el siguiente.

Código Delphi [-]
  
if Query11CANTIDAD.AsString = '' then
   begin
      Raise Exception.Create('El Campo Cantidad No Puede Quedar en Blanco!!');
   end;

if Query11CANTIDAD.AsInteger > 999999999 then
   begin
      Raise Exception.Create('El Numero Maximo de Caracteres es 10!!');
   end;

el primero valida q el campo no quede en blanco y el segundo valida q el numero de caracteres no sea superior a 9

Nuevamente Gracias por sus opiniones.
hasta la Proxima :)

Saludos...

laukri 29-04-2008 14:21:26

Hola a todos!
Yo pongo el codigo en el onValidate del campo, y lanzo la exception... pero cuando la capturo?...
Los ubico un poco en la situacion... tengo que hacer un control de stock y quiero verificar que al momento de hacer la factura y al poner la cantidad que quiero del producto, este no supere el stock diponible...

Código Delphi [-]
 
procedure TDMDocumento.cdsDetalleCANTIDADValidate(Sender: TField);
begin
  dm.cdsArticulos.Open;
  dm.cdsArticulos.Locate('idArticulo', cdsDetalleARTICULO.AsInteger,[loCaseInsensitive]);
   if Sender.AsInteger > dm.cdsArticulosCANTIDAD.AsInteger then
   raise Exception.Create('¡No hay Stock suficiente!');
end;

tengo esto en el onValidate... donde capturo la exception?
desde ya agradezco su ayuda... Saludos
P/d: uso delphi 2007 y firebird 2.0


La franja horaria es GMT +2. Ahora son las 08:08: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