Campos calculados

En FileMaker, un campo calculado obtiene el valor según la fórmula que se utilice en “Especificar cálculo”.

Si todos los campos que participan en la fórmula pertenecen al mismo registro, entonces el resultado se almacenará en el campo. Cada vez que se edite alguno de los campos referenciados, el cálculo se refrescará y se actualizará el resultado en el campo. El resultado del cálculo queda almacenado en el campo calculado y se puede gestionar para indexaciones, búsquedas, relaciones, etc.

Si en la fórmula participa algún campo que no pertenece al mismo registro (campos de almacenamiento global, campos relacionados, campos de sumario u otros campos calculados no almacenados), entonces el resultado no se almacena en el campo calculado. El resultado no se escribe en ningún campo, sólo se guarda la expresión, la fórmula. Los campos de cálculo que contienen referencias a campos externos al registro no pueden ser almacenados en la BD y por lo tanto no permiten ser indexados.

FileMaker ofrece la opción de no almacenar tampoco los resultados en el primer caso, pero ello debe ser explicitado por el desarrollador en la pestaña “Almacenamiento” del cuadro de  diálogo “Especificar cálculo”. Por ejemplo, si un campo se calcula mediante la expresión Get( CurrentTimestamp ) y lo definimos de almacenamiento, el campo contendrá el valor de fecha y hora en el momento de la evaluación (cuando cerremos la definición del cálculo). Pero si nos interesa mostrar en una presentación el valor “vivo” de fecha y hora mostrando dicho campo, deberemos definirlo de no-almacenamiento.

Campos con autointroducción calculada

Un campo con autointroducción calculada, en el que permitimos reemplazar el valor existente, se comporta exactamente igual que un campo calculado cuando en éste todos los campos que intervienen pertenecen al mismo registro. Cada vez que se modifique alguno de los campos referenciados, el cálculo se refrescará y se actualizará el resultado en el campo.

En el caso anterior, el único valor añadido que aporta la autointroducción calculada sobre el campo calculado, es la posibilidad de que en la introducción de datos, el usuario pueda sobrescribir el resultado del cálculo. Ésto no es posible hacerlo con un campo calculado.

Los campos en los que especificamos autointroducción son siempre almacenados por FileMaker. Ésta es una peculiaridad muy interesante, pues si en la fórmula en la que especificamos el cálculo de autointroducción, participa algún campo que no pertenece al mismo registro (como campos de almacenamiento global o campos relacionados),  el resultado si se almacenará en el campo. Este hecho puede utilizarse en algunos casos para ‘solucionar’ la limitación de FileMaker de almacenar en campos los resultados de cálculos en los que participan campos externos al registro. 

Cuando en el cálculo de autointroducción participan campos externos, el recálculo de la expresión no se producirá automáticamente cuando cambie el valor del campo externo. El recálculo se deberá ‘disparar’  de manera forzada mediante la introducción en la fórmula de algún campo del propio registro, el cual disparará el recálculo al modificarse su contenido.

Cómo disparar el recálculo de una autointroducción

Como hemos dicho, si en la fórmula de cálculo de autointroducción interviene algún campo del propio registro, ya tenemos el problema resuelto. Pero,…en muchos casos no nos va a intervenir ningún campo del propio registro. ¿Cómo podemos disparar el recálculo en estos casos?

Para fijar ideas vamos a poner un ejemplo. Imaginemos que tenemos un sistema que gestiona partes de trabajo. Durante la un parte ( o boletín) de trabajo queremos recoger los paros de producción que se producen indicando la tipología. Para ello establecemos la siguiente relación:1

El nombre  del paro pude modificarse a lo largo del tiempo, pero nosotros queremos guardar el nombre que tenía cuando se produjo dicho paro en cada uno de los partes. Para ello añadimos un campo en ListaParos::nombre:

 

Si definimos ListaParos::nombre = Paro::nombre como un campo calculado, el resultado no se almacenará y por lo tanto cuando cambie Paro::nombre también nos cambiaría ListaParos::nombre, con lo que no habríamos logrado nuestro objetivo. La solución es definir ListaParos::nombre como un campo de autointroducción calculada:

 

Importante observar el recuadro en rojo. Indica que debemos permitir cambios en el resultado aún cuando ya tenga un valor. Con esta definición, en el momento de crear un registro en ListaParos, FileMaker intentaría resolver este cálculo, para lo cual necesitará que ListaParos::id_Paro tenga un valor válido.  Pero si al crear el registro en ListaParos no se hubiera establecido todavía id_Paro entonces no podría resolver el cálculo. Por lo tanto, necesitamos un disparador del cálculo. ListaParos::id_Paro es nuestra solución. Queremos que cada vez que dicho campo se modifique, se recalcule el campo ListaParos:.nombre.

Para hacerlo, FileMaker siempre nos ofrece una puerta trasera, aunque a veces es pequeña y está muy escondida. En este caso hemos encontrado no una sinó dos puertas traseras…La primera se llama Evaluate y la segunda Let.

Evaluate

Entre otras muchas aplicaciónes, la función Evaluate nos permite desencadenar un cálculo definiendo los ‘disparadores’ o triggers que queramos. Vamos a modificar la fórmula de cálculo de ListaParos::nombre por la siguiente expresión:

Con esta expresión evaluaremos Paro::nombre (observar que va entrecomillado – ver documentación de la función Evaluate) cada vez que se modifique id_Paro. Por lo tanto si cuando habíamos creado el registro en ListaParos, todavía no habíamos establecido ListaParos::id_Paro, y por lo tanto inicialmente no se había podido resolver el cálculo, en el momento que se establezca ListaParos::id_Paro se disparará el cálculo. Si en algún momento, el operario, pensara que otro tipo de paro aplica mejor al problema acaecido, modificará ListaParos::id_Paro, y se volverá a disparar el recalculo.

Let

Utilizando esta función podemos lograr exactamente el mismo efecto que lográbamos con Evaluate. Para ello vamos a modificar la fórmula de cálculo de ListaParos::nombre por la siguiente expresión:

 

Con esta expresión logramos que cada vez que se modifique ListaParos::id_Paros se recalcule el valor de ListaParos::nombre. Notar que en este caso Paro::nombre no va entrecomillado.

Ambas soluciones son perfectamente válidas y la elección de una u otra dependerá de con cual de ellas se sienta más cómodo el desarrollador. Personalmente me decanto por la Let, pues para mí gusto es más clara en su estructura.

Feliz FileMaking 🙂