Sistemas y desarrollo

Personalizaciones: Botón Aceptar de Formularios

Personalizaciones: Botón Aceptar Formularios
Share

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.

 
Personalizaciones: Botón Aceptar Formularios
 

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.
 
Personalizaciones: Botón Aceptar Formularios
 
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
 
Personalizaciones: Botón Aceptar Formularios
 

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.
 
Personalizaciones: Botón Aceptar Formularios
 
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.
 
Personalizaciones: Botón Aceptar Formularios
 

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.
 
Personalizaciones: Botón Aceptar Formularios
 

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.

The following two tabs change content below.

Daniel Villarreal

Gerente de Producto at CAPATAZ Software
Ingeniero Electrónico. Se desempeñó en empresas como Fiat Auto Argentina y Delphi, supervisando mantenimiento y producción. Desde 2005 es Gerente de Producto en CAPATAZ Software, coordinando diseño y desarrollo de producto, testing, análisis funcional, documentación, control de cambios e implementación.

Latest posts by Daniel Villarreal (see all)

Comments (2)

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

  2. […] 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 […]

Comment here