CASO DE USO: Agregando validaciones de negocio a partir de los datos de la grilla
En este artículo, mostramos de forma sintética un ejemplo de personalización de Botón Aceptar del formulario Calificación de Partidas – Modificación. Nuestro cliente nos planteó la necesidad de validar que todos los renglones del comprobante de Calificación de Partidas (Renglones de CP), tenga completado su valor, para que se pueda confirmar su Generación. El ejemplo, muestra cómo validar y utilizar datos existentes en la grilla de un formulario secundario de CAPATAZ.
En forma extensiva, se puede utilizar este ejemplo, como base, para crear otras reglas de negocio que validen los datos que contiene la grilla del formulario del proceso. Los pasos son:
- Abrir el formulario del proceso que contiene la grilla.
- Acceder al código a personalizar haciendo clic secundario del mouse, para editar el código fuente.
- Editar el código fuente. Guardar los cambios.
- Probar el código personalizado.
Nota: Para poder acceder al editor de código personalizado, se debe establecer/verificar el parámetro USUARIOS_EDICION_FUNCIONES_APERTURA_CAPATAZ, de la sección SEGURIDAD en los Parámetros de la empresa.
Código Fuente Original (autogenerado por CAPATAZ)
Al ingresar al editor de código fuente, CAPATAZ auto generará un código base, para comenzar la personalización.
Como se ve en la muestra de este código base autogenerado, se retorna un valor lógico (.F. Falso, .T. Verdadero) por medio de la variable m.vf
Formulario y Botón Aceptar
Si el usuario presiona ACEPTAR en el formulario, primeramente se evalúa el código personalizado.
Si resulta FALSO, el formulario no avanza con la ACEPTACION y el control vuelve al FORMULARIO.
Si resulta VERDADERO, el formulario, avanza con la ACEPTACIÓN, continuando las validaciones internas que tiene cada formulario.
Observar, que el botón quedó con fuente naranja, indicando que tiene aplicada un código personalizado (Apertura). Esta personalización puede ser quitada fácilmente del botón, haciendo botón secundario sobre el Aceptar y luego eliminar.
Apertura del Botón Aceptar
Aquí se muestra el código de ejemplo implementado.
Apertura funcionando
Al ejecutar el formulario, luego de que el usuario presiona el botón ACEPTAR, se muestra el mensaje que establecimos en el código de ejemplo. En este caso, la personalización del botón devuelve FALSO, con lo cual, no continuará la ACEPTACIÓN del formulario, quedando a la espera o CANCELACIÓN por parte del usuario.
Código Fuente – Versión 1
Este es el código fuente (Versión 1) comentado.
LPARAMETERS m.fo AS Form LOCAL m.vf AS Boolean m.vf = .T. * Establece RecordSet de la Grilla. (En la mayoría de los formularios se puede acceder a la grilla de esta forma) m.rsgrilla = m.fo.ul_grid1.DataSource * Se mueve a la primer fila de la grilla para luego recorrerla. m.rsgrilla.movefirst() * Recorre el RecordSet de la Grilla, fila a fila hasta el final. DO WHILE NOT m.rsgrilla.EOF() IF m.rsgrilla.Fields("Valor").value = '' && Evalúa del la columna "Valor" es vacía INFORMA("Atributo sin valor: "+m.rsgrilla.Fields("nom_atr_cp").value) && Informa si el atributo no tienen valor m.vf = .F. && Si encuentra un atributo sin valor, devuelve .F. (FALSE) y no avance el formulario ENDIF m.rsgrilla.movenext() && Se mueve a la próxima fila. ENDDO RETURN m.vf
Código Fuente – Versión 2 (mejorada)
Esta versión 2, primero verifica que exista algún renglón en la grilla, para luego evaluar su valor. La versión 1, generaba un resultado inesperado, ante esta situación.
LPARAMETERS m.fo AS Form LOCAL m.vf AS Boolean m.vf = .T. * Establece RecordSet de la Grilla. (En la mayoría de los formularios se puede acceder a la grilla de esta forma) m.rsgrilla = m.fo.ul_grid1.DataSource IF m.rsgrilla.Recordcount() > 0 && Evalúa si hay registros en la grilla * Se mueve a la primer fila de la grilla para luego recorrerla. m.rsgrilla.movefirst() * Recorre el RecordSet de la Grilla, fila a fila hasta el final. DO WHILE NOT m.rsgrilla.EOF() IF m.rsgrilla.Fields("Valor").value = '' && Evalúa del la columna "Valor" es vacía INFORMA("Atributo sin valor: "+m.rsgrilla.Fields("nom_atr_cp").value) && Informa si el atributo no tienen valor m.vf = .F. && Si encuentra un atributo sin valor, devuelve .F. (FALSE) y no avance el formulario ENDIF m.rsgrilla.movenext() && Se mueve a la próxima fila. ENDDO ENDIF RETURN m.vf
Conclusiones
Con este sencillo ejemplo y sumando imaginación, se pueden desarrollar nuevas validaciones de negocio en los formularios de CAPATAZ que tienen la estructura similar al ejemplo, es decir, formulario con botón Aceptar y grilla.
Daniel Villarreal
Latest posts by Daniel Villarreal (see all)
- Gestión de Proyectos en CAPATAZ 2018 - 10 octubre, 2018
- Mantenimiento preventivo para rodados - 22 septiembre, 2018
- Personalizaciones: Botón Aceptar de Formularios - 28 febrero, 2018
Excelente aporte.
Lo apliqué en un requerimiento para restringir la cantidad máxima a entregar para el insumo según el porcentaje de Tolerancia máxima especificada en la extensión del artículo.
A continuación el código de la apertura:
LPARAMETERS m.fo AS Form, m.id_ent AS Variant
LOCAL m.vf AS Boolean, m.Ctd_max as decimal(3,2)
m.vf = .T.
* Establece RecordSet de la Grilla. (En la mayoría de los formularios se puede acceder a la grilla de esta forma)
m.rsgrilla = m.fo.Xpressqgrid1.DataSource
IF m.rsgrilla.Recordcount() > 0 && Evalúa si hay registros en la grilla
* Se mueve a la primer fila de la grilla para luego recorrerla.
m.rsgrilla.movefirst()
* Recorre el RecordSet de la Grilla, fila a fila hasta el final.
DO WHILE NOT m.rsgrilla.EOF()
TEXT TO m.tsql TEXTMERGE NOSHOW
SELECT COD_ARTICU, P_TOL_MAX FROM CZAS31 WHERE cod_articu = ‘<>’
into cursor tolerancia
ENDTEXT
Isql(m.tsql)
scatter memvar
m.Ctd_max = (m.rsgrilla.Fields(«Req»).value + (m.rsgrilla.Fields(«Req»).value * m.P_TOL_MAX/100)) && Calcula la cantidad máxima a entregar para el artículo.
IF m.rsgrilla.Fields(«Entregar»).value > m.Ctd_max && Evalúa que la cantidad a «Entregar» no sea mayor que la tolerancia permitida
INFORMA(«La Ctd. a Entregar del Insumo: «+m.rsgrilla.Fields(«Cod_Insumo»).value+» supera la tolerancia Máxima establecida para el artículo») && Informa si está por sobre el máximo de tolerancia
m.vf = .F. && Si encuentra un atributo sin valor, devuelve .F. (FALSE) y no avance el formulario
ENDIF
m.rsgrilla.movenext() && Se mueve a la próxima fila.
ENDDO
ENDIF
RETURN m.vf
[…] forma de plantilla para ayudarle. Para complementar, anteriormente ya fue publicada la nota “Personalizaciones: Botón Aceptar de Formularios“, escrita por Daniel Villarreal. Este escrito aporta otras maneras similares de apoyarse en […]