no dejar campos vacios en un formulario de ingreso

283 views
Skip to first unread message

Saúl Piña

unread,
Jan 9, 2014, 10:43:20 AM1/9/14
to publice...@googlegroups.com
Saludos,

existe alguna otra forma de validar ciertos campos que están vacios y obligatoriamente se deba llenar antes de grabar??

por lo pronto utilizo esta forma:

if empty(thisform.text1.value)
messagebox("Vacio")
thisform.text1.setfocus()
else

if empty(thisform.text1.value)
messagebox("Vacio")
thisform.text1.setfocus()
else

etc...
etc...
endif endif

Lo que intento es validar de 70 textbox, solo 25 textbox...

muchas gracias.

Carlos Miguel FARIAS

unread,
Jan 9, 2014, 11:08:37 AM1/9/14
to Grupo Fox
Formas hay muchas, depende de tu experticia en VFP para instrumentarla.
Todos los contenedores (FORM, pages, etc.) tienen una "collection" llamada controls y un contador de la misma.
Si haces un bucle sobre dicha collection, podes obtener su name y su value.
Si los name de los controles a validar los tienes en un array, dentro del bucle, ves is el name esta en el array y si es asi, te fijas que el value no este empty (ojo que 0, un valor posible, da como empty).
Si en el comment de cada control, colocas el mensaje para el usuario, te queda una rutina más o menos genérica.
Saludos: Miguel, La Pampa (RA)


2014/1/9 Saúl Piña <saulpi...@gmail.com>

Fernando D. Bozzo

unread,
Jan 9, 2014, 1:40:05 PM1/9/14
to publice...@googlegroups.com
Saúl, sobre la idea de Miguel te planteo una variante:

Si no querés validar todos los textbox, sino algunos, entonces a la clase de los textbox le agregás una propiedad, por ejemplo "l_validar", que configurás en .T. o .F. según quieras validarla con el método genérico que propone Miguel.

Obviamente, es indispensable que no uses los controles de FoxPro directamente en tus forms, sino una librería donde los hayas subclasado, ya que esta es la regla número uno en cualquier istema orientado a objetos, usar subclases, nunca el control original.


Saludos.-

Fidel Charny

unread,
Jan 9, 2014, 2:26:54 PM1/9/14
to publice...@googlegroups.com
Si ya tenés todo armado y sin dejar de reconocer la superioridad de lo apuntado por Fernando y Miguel, te podés armar de una chapuza como la que sigue (vaya pescado!):

*----------------------
* Init del Formulario
*----------------------
* agrego una propiedad array al form
AddProperty(Thisform,"gaValid[1,2]",null)
* Agrego a la prop. array los controles a validar y los mensajes
DIMENSION thisform.gavalid(3,2)
WITH thisform
.gavalid[1,1]=thisform.text1
.gavalid[1,2]="Debe completar Text1"
.gavalid[2,1]=thisform.text2
.gaValid[2,2]="Debe completar Text2"
.gavalid[3,1]=thisform.text3
.gaValid[3,2]="Debe completar Text3"
ENDWITH

*----------------------
* Punto de validación (botón de grabar, etc)
*----------------------
LOCAL objReturn,i,lcMensaje
objReturn=null
lcMensaje=""
WITH thisform
FOR i=ALEN(.gavalid,1) TO 1 STEP -1
IF EMPTY(.gavalid[i,1].value)
objReturn=.gavalid[i,1]
lcMensaje=.gavalid[i,2]
ENDIF
NEXT
ENDWITH
IF !ISNULL(objReturn)
MESSAGEBOX(lcMensaje)
objREturn.setfocus
RETURN
ENDIF

Saúl Piña

unread,
Jan 9, 2014, 3:04:59 PM1/9/14
to publice...@googlegroups.com
Gracias a Fidel por el "PESCADO" y a fernando y Miguel por enseñarme como pescar, es muy buena la idea que tienen ambos.  la voy a emplear...

Edwin Duran

unread,
Jan 9, 2014, 3:51:14 PM1/9/14
to publice...@googlegroups.com
Mira este ejemplo  que utilizo antes de guargar, como mis textbox, combo, etc los tengo en clase, en ellos creo un propiedad llamada °validar_mensajes° y en mi clse form un metodo llamado °validar_campo_emblanco°, mas abajo veras el codigo del metodo

nota si no usas clase puedes utilizar la propiedad TAG

Saludos

IF  thisform.validar_campo_emblanco() = .t. && verifica si hay campo en blanco

*****aqui coloco el código que quiero guardar

endif





**************************************************
*Elaborado por Edwin Duran
*República Dominicana
* ejecución = thisform.validar_campo_emblanco()
* validar_mensajes  = Esta Propiedad debe crearse en la clase textbox, combobox, etc., se coloca .T. para que realice la validación
*ultima modificacion 13-12-08
************************************************


Local SALIR_FOR
SALIR_FOR = .T.

For I = 1 To Thisform.ControlCount
If SALIR_FOR = .F.
Exit
Endif

If Pemstatus(Thisform.Controls[I], "validar_mensajes",5)
If Empty(Thisform.Controls[I].Value) And Thisform.Controls[I].validar_mensajes = .T.
Messagebox("Informacion no completada "+Thisform.Controls[I].Name,16,"AVISO")
Thisform.Controls[I].SetFocus
SALIR_FOR = .F.
Exit
Endif

Endif


If Thisform.Controls[I].BaseClass  $ "Container" && Determina si el control es un container
For J = 1 To Thisform.Controls[I].ControlCount && PARA CALCULAR CUANTOS objetos EXISTEN
If Pemstatus(Thisform.Controls[I].Controls[j],"validar_mensajes",5)
If  Empty(Thisform.Controls[I].Controls[j].Value) And Thisform.Controls[I].Controls[j].validar_mensajes = .T.
Messagebox("Informacion no completada "+Thisform.Controls[I].Controls[j].Name,16,"AVISO")
Thisform.Controls[I].Controls[j].SetFocus

SALIR_FOR = .F.
Exit
Endif
Endif
Next J
Endif


If Thisform.Controls[I].BaseClass  $ "Pageframe" && Determina si el control es un pageframe
For J = 1 To Thisform.Controls[I].PageCount && PARA CALCULAR CUANTOS PAGE EXISTEN
For K = 1 To Thisform.Controls[I].Pages[J].ControlCount && PARA DETERMINAR CUANTOS OBJETOS TIENE LA PAGINA

If Pemstatus(Thisform.Controls[I].Pages[J].Controls[K],"validar_mensajes",5)
If  Empty(Thisform.Controls[I].Pages[J].Controls[K].Value) And Thisform.Controls[I].Pages[J].Controls[K].validar_mensajes = .T.
Messagebox("Informacion no completada "+Thisform.Controls[I].Pages[J].Controls[K].Name,16,"AVISO")
Thisform.Controls[I].Pages[J].SetFocus
Thisform.Controls[I].Pages[J].Controls[K].SetFocus

SALIR_FOR = .F.
Exit
Endif
Endif

If Thisform.Controls[I].Pages[J].Controls[K].BaseClass  $ "Container" && Determina si el control es un container
For L = 1 To Thisform.Controls[I].Pages[J].Controls[K].ControlCount && PARA DETERMINAR CUANTOS OBJETOS TIENE
If Pemstatus(Thisform.Controls[I].Pages[J].Controls[K].Controls[L],"validar_mensajes",5)
If  Empty(Thisform.Controls[I].Pages[J].Controls[K].Controls[L].Value) And Thisform.Controls[I].Pages[J].Controls[K].Controls[L].validar_mensajes = .T.
Messagebox("Informacion no completada "+Thisform.Controls[I].Pages[J].Controls[K].Controls[L].Name,16,"AVISO")
Thisform.Controls[I].Pages[J].SetFocus
Thisform.Controls[I].Pages[J].Controls[K].Controls[L].SetFocus

SALIR_FOR = .F.
Exit
Endif
Endif
Next J
Endif

If SALIR_FOR = .F.
Exit
Endif
Endfor
If SALIR_FOR = .F.
Exit
Endif
Endfor
If SALIR_FOR = .F.
Exit
Endif
Endif
Endfor
Thisform.Refresh
Return SALIR_FOR

Fidel Charny

unread,
Jan 9, 2014, 7:18:16 PM1/9/14
to publice...@googlegroups.com
Edwin
Siguiendo con el Pescado, te muestro una forma recursiva que detecta los objetos requeridos donde estén (container en page de Pageframe, container en container). Está hecho en una clase custom, utilizando un método recursivo. Los textbox, etc, deben ser subclase, para agregarles la propiedad "Validar_mensajes".
La recursividad soporta en principio 128 niveles, por lo que su utilización en un formulario no debería tener problemas, ya que raramente se superan los 7 niveles.

* Supuestos
* ---------------------------------
* metodo "Dt_EmptyObj"  (Recursivo)
* Clase: Custom
* Nombre de clase "FunMark"
* Biblioteca (vcx) "Marcado"
*-----------------------------------

* En cualquier formulario, punto de validación
LOCAL objfun,lResult

objfun=NEWOBJECT("funmark","marcado")
lResult=objFun.Dt_EmptyObj( thisform )
objFun=null

if !lResult
RETURN
ENDIF
Messagebox("Continúa el procedimiento")

*------------------------------------------
* metodo "Dt_EmptyObj" (recursivo)
*------------------------------------------
LPARAMETERS xoObjeto
LOCAL ocontrol,ocont,objPict,opage

DO case
CASE UPPER(xoObjeto.Baseclass)=="FORM"
* Se crea la propiedad dtoSalir como bandera 
* de salida de recursividad
ADDPROPERTY(_Screen,"dtoSalir",.f.)

FOR EACH oControl IN xoObjeto.Controls
This.Dt_EmptyObj(oControl)
IF _screen.dtoSalir
RETURN !_Screen.dtosalir
ENDIF
ENDFOR
CASE UPPER(xoObjeto.Baseclass)="CONTAINER"

FOR EACH xoObjeto IN xoObjeto.Controls
This.Dt_EmptyObj(xoObjeto)
IF _screen.dtoSalir
RETURN !_Screen.dtosalir
ENDIF
ENDFOR

CASE UPPER(xoObjeto.Baseclass)="PAGEFRAME"

FOR EACH OPAGE IN xoObjeto.pages
FOR EACH objPict IN opage.controls
This.Dt_EmptyObj(OBJPICT)
IF _screen.dtoSalir
RETURN !_Screen.dtosalir
ENDIF
ENDFOR
ENDFOR

CASE INLIST(UPPER(xoObjeto.BaseClass),"TEXTBOX","EDITBOX","COMBOBOX","LIST","SPINNER")
IF PEMSTATUS(xoObjeto,"validar_mensajes",5)
IF EMPTY(xoObjeto.value) AND xoObjeto.validar_mensajes
MESSAGEBOX("Faltan completar valores")

* Si es un PageFrame, será necesario
* Activar la Page Correcta
* de lo contrario el SetFocus quedará oculto.
IF xoObjeto.parent.baseclass="Page"
xoObjeto.parent.parent.ActivePage=xoObjeto.parent.PageOrder
ENDIF
xoObjeto.setfocus
_screen.dtoSalir=.t.
RETURN !_Screen.dtosalir
ENDIF
ENDIF
ENDCASE
RETURN !_Screen.dtosalir


Reply all
Reply to author
Forward
0 new messages