Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-08-2003
andrestsas andrestsas is offline
Miembro
 
Registrado: ago 2003
Ubicación: Tres Arroyos - Pcia Bs. As. - Argentina
Posts: 39
Poder: 0
andrestsas Va por buen camino
Post dbgrid no moverse si campo es nil

Hola a todos

Quisiera saber como tendria que hacer para forzar al usuario, que estando en un DBGRID no pueda salir de ese campo si no ha ingresado un dato, o sea que ese campo no quede en nil.

Desde ya muchas Gracias por su ayuda. Andres.-
Responder Con Cita
  #2  
Antiguo 04-08-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 21
andres1569 Va por buen camino
Hola:

Esa comprobación la puedes hacer a nivel del Dataset, en el evento BeforePost, de esta manera retrasas la comprobación al momento en que el usuario decide grabar el registro. Esto es cuestión de gustos, de gustos del usuario , puesto que quizás esté metiendo datos en tentativa y le moleste que no le deje pasar de un campo determinado. El hacerlo desde el Grid implica interceptar el evento OnColExit (cuando se sale de la columna) y ahí hacer las comprobaciones. De todas formas, ten en cuenta que esta restricción afectará al Grid siempre, aunque el usuario esté solamente navegando por él, pudiendo resultar a veces molesto.

Código:
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
  with DBGrid1 do
  if (SelectedField <> nil) AND (SelectedField.FieldName='Cantidad') AND
     (SelectedField.IsNull) AND (SelectedField.DataSet.State = dsInsert) then 
    Abort;
end;
Comprobamos que el campo sea el que buscamos (FieldName) y que no sea null, y que realmente estamos insertando un nuevo registro (dsInsert). Había pensado en comprobar también que el DataSet estuviera en modo Edición (AND (SelectedField.DataSet.State in [dsInsert, dsEdit])), pero no se obtiene el efecto deseado puesto que cuando el usuario navega por el DBGrid, éste no se pone en Edición salvo que escribamos algo, pero si pasamos de largo sin teclear ni se entera.

De todas formas, ten en cuenta que la comporbación de que el campo no sea null deberá ir igualmente a nivel de tabla, puedes poner Required al campo en cuestión, para que en ningún caso se quede a null. Si lo haces así, el código anterior podría quedar así:

Código:
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
  with DBGrid1 do
  if (SelectedField <> nil) AND (SelectedField.Required) AND
     (SelectedField.IsNull) AND (SelectedField.DataSet.State = dsInsert) then 
    Abort;
end;
__________________
Guía de Estilo
Responder Con Cita
  #3  
Antiguo 04-08-2003
andrestsas andrestsas is offline
Miembro
 
Registrado: ago 2003
Ubicación: Tres Arroyos - Pcia Bs. As. - Argentina
Posts: 39
Poder: 0
andrestsas Va por buen camino
te comento que no me funciona, tal vez yo no fui demasiado claro.

Eso me pasa por no tomarme 2 min. mas y explicar mejor lo que uno quiere obtener. ya aprenderemos.

Lo que yo quiero lograr es lo siguiente :

1- en el DBGRID que trabajo es temporal, ya que cuando guardo los datos que ingreso se blanquea completamente.

2- el Primer campo es un codigo que el usuario ingresa, y lo que quiero hacer es que si no carga un VALOR(en ese campo codigo), no salte a otro campo o pase a otra fila, ya que ese codigo es el codigo del producto, y si pasa a otro campo y completa cantidad por ejemplo y luego graba los datos de la grilla en la tabla, no grabaria el codigo.
Entonces antes de completar otro campo, obligo a que primero carge el codigo del producto.

Espero tener una solucion a este inconveniente. Desde ya muchas gracias por tu tiempo. Andres.-
Responder Con Cita
  #4  
Antiguo 04-08-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 21
andres1569 Va por buen camino
Hola:

Te remito a mi mensaje anterior. Sí que entendí la pregunta, que estaba bastante clara. Lo que ocurre es que no se suele controlar ese cambio de columna, es decir, a nivel del DBGrid, sino que se controla a nivel del DataSet; más aún, en la misma definición de la Base de Datos debes marcar qué campos son requeridos y cuáles no. Si son parte de la clave primaria, como parece, lo lógico es que lo sean.

Si haces eso, luego al ligar desde Delphi un TTable o un TQuery a dicha tabla de la BD, el campo en cuestión es marcado como Required, y el mismo Delphi lanza una excepción si tratas de grabar sin asignarle un valor. Tú no tienes que controlar nada más.

El código que te puse controla que mientras insertas un registro desde un DBGrid, al llegar a la celda del campo requerido no pueda pasar a otro campo (otra celda) hasta que le asignes un valor, pero no evita que cambies de registro (al de arriba o a uno nuevo yendo hacia abajo). Esa comprobación, como te digo, debes realizarla a nivel del DataSet.

Espero haberme explicado. Sigue los pasos que te indico al principio (marcar Required al campo en la Base de Datos) y ya nos dirás.

PD: Si cambias ahora en la BD ese campo a requerido, puesto que en Delphi ya tienes colocado el TTable enlazado a dicha tabla, acuérdate de ir al campo en cuestión y asegúrate que la propiedad Required está a TRUE. Delphi no sabe que has hecho ese cambio.
__________________
Guía de Estilo

Última edición por andres1569 fecha: 04-08-2003 a las 20:34:50.
Responder Con Cita
  #5  
Antiguo 05-08-2003
andrestsas andrestsas is offline
Miembro
 
Registrado: ago 2003
Ubicación: Tres Arroyos - Pcia Bs. As. - Argentina
Posts: 39
Poder: 0
andrestsas Va por buen camino
Talking

Andres, te digo que he estudiado bien lo que enviaste en primera instancia y tenias razon, use el 2 ejemplo que usa Requerid, y marcando el campo en mi table como tal, es como vos decias nomas che.

Funciona perfectamente, si quiero pasar a otro campo a la derecha, no lo hace, si quiero ir a otra fila ya completa, logicamente si me deja, hasta ahi todo perfecto.

Ahora mi pregunta es la siguiente : si el usuario en un momento de distraccion pasa a otro campo sin completar este campo que se encuentra en Requerid, ¿Siempre se va a interrumpir el programa?, ya que abort es lo que me hace, no habra otra manera de que cuando intente hacer esto, se quede en el mismo lugar y de un mensaje de que debe ingresar obligatorimente un valor.

Infinitamente agradecido por tu atencion, y tu interes en ayudarme. Andres.-

Saludos.-
Responder Con Cita
  #6  
Antiguo 05-08-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 21
andres1569 Va por buen camino
Hola:

Tal como habrás podido comprobar, el método Abort lo que hace es evitar que salgas de la celda del campo en cuestión, pero no aborta el programa. Abort es conocido como la excepción silenciosa, aborta el método / procedimiento donde fue llamado (en este caso el método del DBGrid que pretendía cambiar de celda, de ahí que se quede "quieto parao"). Si quieres que el usuario sepa la razón, basta con que le pongas un ShowMessage o un Application.MessageBox antes de llamar a Abort y se lo indiques.

Si abort te da problemas, dices que te aborta el programa, usa SysUtils.abort para que se emplee el procedimiento adecuado (hay otro abort que hace lo que dices).
__________________
Guía de Estilo
Responder Con Cita
  #7  
Antiguo 05-08-2003
andrestsas andrestsas is offline
Miembro
 
Registrado: ago 2003
Ubicación: Tres Arroyos - Pcia Bs. As. - Argentina
Posts: 39
Poder: 0
andrestsas Va por buen camino
Thumbs up

Andres :

Muy util tu informacion, desde ya muchas gracias. Andres
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 01:03:00.


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
Copyright 1996-2007 Club Delphi