Cuándo utilizar PROP:AcceptAll
Publicado: Vie Feb 11, 2011 3:44 pm
Hace algunos días un usuario que daba sus primeros pasos con Clarion planteó un problema que estaba relacionado con el uso de la propiedad AcceptAll. Algunos usuarios nuevos tal vez no conozcan esta propiedad, y los que la conocemos algunas veces dudamos sobre cuándo y cómo usarla.
Veamos un ejemplo. Tenemos un formulario para pago de gastos. La forma de pago más usada es en efectivo, pero además se puede pagar con cheques, conformes, o compensar contra un rubro de la contabilidad donde ya se hizo la previsión del gasto. Tenemos un control para seleccionar "Efectivo" u "Otros" como forma de pago que en el momento de abrir el formulario lo cargamos como "Efectivo". Tenemos además otro control en donde se selecciona la forma de compensación cuando la forma de pago no sea "Efectivo". Allí se puede seleccionar "Cheque", "Conforme" o "Rubro". Este control se inicializa como DISABLED y se pasará a ENABLED cuando en la forma de pago se seleccione "Otros".
Como además de "Efectivo" la forma de pago más habitual es con cheque, la intención es que cuando el usuario seleccione "Otros" en la forma de pago automáticamente se tome "Cheques" como la forma de compensación. Por lo tanto en el EVENT:Accepted del control para la forma de pago escribimos el siguiente código:
¿Qué problemas tenemos con este código? Pues que si el usuario en forma de pago selecciona "Otros" y en tipo de compensación selecciona "Conformes" o "Rubros" al revisar la base de datos nos vamos a encontrar con que la transacción quedó registrada como si se hubiera pagado con un cheque. ¿Cómo sucedió esto? Pues que en el momento de aceptar el formulario, automáticamente se genera un EVENT:Accepted para todos los controles para verificar que algún control por el cual el usuario no pasó no haya quedado en un estado no válido. Al ejecutar el código ingresado para este evento en la forma de pago, como la forma de pago no era "Efectivo" forzó la forma de compensación a "Cheque".
Así que nuestro código correcto para el EVENT:Accepted de la forma de pago deberá ser:
De esta manera, la asignación de "Cheque" como forma de compensación se hará únicamente cuando el usuario realmente cambie la forma de pago.
Dejo planteado un debate para la comunidad: ¿En qué otra situación corresponde utilizar la propiedad AcceptAll de la ventana?
Veamos un ejemplo. Tenemos un formulario para pago de gastos. La forma de pago más usada es en efectivo, pero además se puede pagar con cheques, conformes, o compensar contra un rubro de la contabilidad donde ya se hizo la previsión del gasto. Tenemos un control para seleccionar "Efectivo" u "Otros" como forma de pago que en el momento de abrir el formulario lo cargamos como "Efectivo". Tenemos además otro control en donde se selecciona la forma de compensación cuando la forma de pago no sea "Efectivo". Allí se puede seleccionar "Cheque", "Conforme" o "Rubro". Este control se inicializa como DISABLED y se pasará a ENABLED cuando en la forma de pago se seleccione "Otros".
Como además de "Efectivo" la forma de pago más habitual es con cheque, la intención es que cuando el usuario seleccione "Otros" en la forma de pago automáticamente se tome "Cheques" como la forma de compensación. Por lo tanto en el EVENT:Accepted del control para la forma de pago escribimos el siguiente código:
Código: Seleccionar todo
IF FormaPago = FormaPago:Efectivo
CLEAR(TipoCompensacion)
ELSE
ENABLE(?TipoCompensacion)
TipoCompensacion = TipoCompensacion:Cheque
END
Así que nuestro código correcto para el EVENT:Accepted de la forma de pago deberá ser:
Código: Seleccionar todo
IF FormaPago = FormaPago:Efectivo
CLEAR(TipoCompensacion)
ELSE
IF NOT 0{PROP:AcceptAll}
ENABLE(?TipoCompensacion)
TipoCompensacion = TipoCompensacion:Cheque
END
END
Dejo planteado un debate para la comunidad: ¿En qué otra situación corresponde utilizar la propiedad AcceptAll de la ventana?