Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   dbgrid no moverse si campo es nil (https://www.clubdelphi.com/foros/showthread.php?t=2713)

andrestsas 04-08-2003 13:21:17

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.-

andres1569 04-08-2003 14:24:54

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;


andrestsas 04-08-2003 20:05:17

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.-

andres1569 04-08-2003 20:29:13

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.

andrestsas 05-08-2003 01:09:29

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.-

andres1569 05-08-2003 13:00:49

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).

andrestsas 05-08-2003 14:20:05

Andres :

Muy util tu informacion, desde ya muchas gracias. Andres


La franja horaria es GMT +2. Ahora son las 11:23:59.

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