Ir al contenido


Foto

Optimizando código de validación de campos vací­os


  • Por favor identifícate para responder
45 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 26 abril 2009 - 09:26

Pues eso amigos, tengo un formulario con varios DBEdits donde el usuario debe llenar, hay campos que son obligatorios y otros no, para evitarme hacer un código con muchos:



delphi
  1. DBEdit1.Text := NULL;



ó



delphi
  1. DBEdit1.Text := ' ';



Quise reducirlo de la siguiente manera:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var i: integer;
  3. begin
  4. for i := 0 to 2 do begin
  5.   if (ADOTable1.Fields[i].Value = NULL) then begin
  6.     Showmessage('La Casilla ' +ADOTable1.Fields[i].DisplayLabel+ ' está vací­a.');
  7.     Abort;
  8.   end
  9. end;
  10.     ShowMessage('Todos están llenos');
  11. end;



El code me funciona a medias y tiene sus fallas, luego que recorre todo no vuelve a empezar, reconoce los campos la primera vez y luego todos están llenos y no vuelve a recorrer y la otra es que aquí­ estoy obligando que todos los campos deben estar llenos, también intenté esta otra pero no me pasa del primer campo:


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var i: integer;
  3. begin
  4. for i := 0 to 2 do begin
  5.   if ADOTable1.Fields[i].Required then begin
  6.     Showmessage('La Casilla ' +ADOTable1.Fields[i].DisplayLabel+ ' está vací­a.');
  7.     Abort;
  8.   end
  9. end;
  10.     ShowMessage('Todos están llenos');
  11. end;



¿Alguien me puede mostrar una manera mejor de hacerlo?.

Saludos.
  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 26 abril 2009 - 10:24

Hola
No entiendo muy bien lo que pretendes pero, lo que entiendo:
Tienes muchos dbedit, enlazados a una tabla, NO todos los campos se tienen que llenar, osea algunos pueden estar vací­os.
Primero, no usarí­a adotable
Segundo, no usarí­a dbedits.
Tercero pondrí­a un campo valido, que especifique si es necesario que se rellene.
Cuarto, el recorrido en tal caso lo harí­a por componente no por Campo.
Quinto, limpiarí­a la variable al principio.
No se amigo, seguro no entiendo bien el asunto.
Saludos

  • 0

#3 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 26 abril 2009 - 11:44

Hola,
me pasa un tanto como a Caral, por un lado quieres limpiar los componentes DBEdit, pero por el otro estas es validando que en los campos del ADOTable no esten en blanco  ¿ :|?
Ahora bien, si te funciona la primera vez y en la segunda no, pues me imagino porque en este proceso cambió el estado de la tabla; si es asi deberias plantear bien el algoritmo.

Saludos!
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 26 abril 2009 - 11:55

Hola

Y porque no hacer la validación de los campos que requieren algún dato (NOT NULL) desde el momento mismo de que se está "escribiendo"  en ellos.

Yo usaria un solo evento OnExit para todos los DBEdit's que quieras verificar y mostrar un mensaje de que debe ser llenado.



delphi
  1. procedure TForm1.DBEdit1Exit(Sender: TObject);
  2. begin
  3.   if (sender as TDBEdit).Text = '' then begin
  4.      ShowMessage('Este campo no debe esta vacio');
  5.      (Sender as TDBEdit).SetFocus;
  6.   end;
  7. end;



Asigno todos los DBEdit a este evento y cuando saltan de un campo les enviará el mensaje si lo han dejado vacio.

Salud OS
  • 0

#5 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 26 abril 2009 - 12:17

Saludos.

Enecumene, si tienes los JEDI instalados puedes ver el componente JvValidators que puede realizar esta tarea por ti, es muy sencillo de usar.

Suerte!
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 26 abril 2009 - 12:48

Amigo Ego, más fácil de ahí­ no puede ser :$, Rolphy, tengo las JEDI y probaré ese componente a ver qué tal.

Saludos.
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 26 abril 2009 - 01:05

Hola Fernando, pues me resulta extraño que te funcione una vez y otra no... quizá hay algo por allí­ afecta al dataset, tal vez lo cierras y abres, cambias el estado... habrí­a que ver.

Lo que si yo cambiarí­a es en vez de emplear Value = NULL optarí­a por el uso de IsNull y acompañado de una evaluación Required:



delphi
  1. with ADOTable1.Fields[i] do
  2.   begin
  3.     if IsNull AND Required
  4.       then ....
  5.   end;



La Idea de Eliseo no está demás. Y una buena regla es: "Cuanto más antes se pueda realizar una validación, hacerlo".

Saludos,
  • 0

#8 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 26 abril 2009 - 01:22

Hola
Perdonen que me meta con mi Maistro Egostar. (b)
La idea seria buena siempre y cuando el sistema fuera usado con los tab, o en tal caso obligar al usuario a seguir un orden, también se puede auto destruir en algunos segundos, pero ya se, es mucho. :D
Si el usuario se brinca o no pasa por el dbedit que tiene el código de validación, simplemente lo grabara Null sin mas.
El código de validación tiene que estar en el ultimo paso, revisando todos los dbedits, así­ si se sabrá si hay algún dbedit vací­o.
Solo digo.
Saludos
  • 0

#9 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 26 abril 2009 - 01:47

Hola
Perdonen que me meta con mi Maistro Egostar. (b)
La idea seria buena siempre y cuando el sistema fuera usado con los tab, o en tal caso obligar al usuario a seguir un orden, también se puede auto destruir en algunos segundos, pero ya se, es mucho. :D
Si el usuario se brinca o no pasa por el dbedit que tiene el código de validación, simplemente lo grabara Null sin mas.
El código de validación tiene que estar en el ultimo paso, revisando todos los dbedits, así­ si se sabrá si hay algún dbedit vací­o.
Solo digo.
Saludos


Ciertamente Caral, has dado en el clavo con el asunto de las validaciones con el evento OnExit.

Yo asocio los Label's con los Edit's y les pongo una marca a esos label's que los Edit's deben de estar lleno y hago la validación al final antes de Postear.
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 13 mayo 2009 - 06:26

Siguiendo con este tema y siguiendo la sugerencia de Delphius, ha quedado en un procedimiento así­:



delphi
  1. procedure TFMantenimiento.CamposVacios(Data: TDataSource);
  2. var nIdx: Integer;
  3. begin
  4. for nIdx := 0 to Data.DataSet.FieldCount -1 do begin
  5.   if (Data.DataSet.Fields[nIdx].Value = NULL) And (Data.DataSet.Fields[nIdx].Required = True) then begin
  6.     Showmessage('La Casilla ' +Data.DataSet.Fields[nIdx].DisplayLabel+ ' está vací­a.');
  7.     Abort;
  8.   end
  9. end;
  10.     ShowMessage('Todos están llenos');
  11. end;



Pues todo está funcionando muy bien, pero sólo tiene una pequeña falla, y es que si tengo el foco en uno de los campos requeridos aunque esté lleno aún me dice que debo llenarlo, ahora si cambio el foco pues corre bien, ¿cómo corrigo eso?.

Saludos.
  • 0

#11 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 13 mayo 2009 - 06:54

Hola
Amigo, para aprender y tratar de entender:
Cuando llamas a este procedimiento??, en que paso? (CamposVacios).
Saludos
  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 13 mayo 2009 - 06:56

Al momento de grabar o insertar los datos ;).

Saludos.
  • 0

#13 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 13 mayo 2009 - 07:00

Hola
Perdona, sigo sin entender (que viejo mas necio :D :p).
Creo que usas DBEdits, es asi?.
No entiendo....
Saludos

  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 13 mayo 2009 - 07:11

Sí­, estoy usando DBEdits, fí­jate, normalmente para crear avisos de que una casilla está vací­a y obligar al usuario a llenarlo se hace esto:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   if (DBEdit1.Text = NULL) or (DBEdit1.Text = '') then
  4.     begin
  5.       ShowMessage('La Casilla nombre está vací­a');
  6.       Abort;
  7.     end;
  8.   if (DBEdit2.Text = NULL) or (DBEdit2.Text = '') then
  9.     begin
  10.       ShowMessage('La Casilla apellido está vací­a');
  11.       Abort;
  12.     end;
  13.  
  14. //...Aqui grabamos los datos
  15. end;



Imagí­nate tener 10 DBEdits en la cual sean obligatorios ser llenados por el usuario, un choclo de código ¿no?, pues con ese procedimiento me ahorro muchas lí­neas:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.  
  4. CamposVacios(dsEmpleados);
  5.  
  6. //...Aqui grabamos los datos
  7. end;



¿Cómo ves? :D, ¿se entiende ahora? :D

Saludos.
  • 0

#15 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 13 mayo 2009 - 07:50

Hola
Esa parte la entiendo amigo.
Lo que no sabia es que presionabas un botón para confirmar, creí­ que lo hací­as por procedimiento.
Lo que no me explico es como presionando el botón tienes el foco en algún dbedit?, deberí­a estar en el botón, no?.
En tal caso, no seria fácil en el botón cambiar el foco?, para evitar el error?.
Solo trato de entender y tal vez se te ocurra algo amigo, el maestro eres tu.
Saludos


  • 0

#16 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 13 mayo 2009 - 07:53

No No, cuando hablo del foco no me refiero al botón sino al DBEdit, o sea, si estoy situado en un DBEdit al correr el procedimiento aunque esté lleno ese DBEdit me dice que debo llenarlo, ahora, si me sitúo en otro DBEdit entonces el procedimiento corre perfectamente.

Saludos.
  • 0

#17 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 13 mayo 2009 - 07:57

Hola
Entiendo. :D
Pues esta raro el asunto, no se a que se deba.
Tal vez es una de las razones por las cuales no me gusta usar DBEdits, como están en contacto con la BD suelen traer disgustos, prefiero los edits comunes y silvestres.
Saludos
  • 0

#18 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 13 mayo 2009 - 08:22

Hola



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   i: integer;
  4. begin
  5.   for I := 0 to ComponentCount - 1 do begin
  6.       if (Components[i] is TDBEdit) then begin
  7.           if TDBEdit(Components[i]).Text = '' then
  8.              showmessage(TDBEdit(Components[i]).name+' esta vacio');
  9.       end;
  10.   end;
  11. end;



Salud OS
  • 0

#19 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 mayo 2009 - 08:43

Hola, debo admitir que cuando hice mi sugerencia no ha habí­a probado pero intuí­a que deberí­a funcionar.

Lo que me pregunto es ¿cómo es posible que algo del foco de un DBEdit afecte? ¡Si se ha presionado un botón es porque el foco están en él!

A lo mejor algo del manejo de los DBEdits se me escapa... es que como no los uso y prefiero las consultas SQL...

Me gustarí­a saber que más hace ese botón en el que ejecutas el método CamposVacios.

No se... hay algo que no veo :s

Saludos,
  • 0

#20 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 mayo 2009 - 08:55

Lo que veo es que por un lado está la validación a nivel dataset (Fields[]) y otra a nivel data-ware.... creo que allí­ está el problema: no se ha volcado el dato.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.