jueves, 29 de enero de 2015

Infopath: Como crear un entero de x cifras fijas

Tras la SharePoint conference del año pasado, Microsoft nos prometió que a finales de 2014 veríamos la primera versión de FoSL (Forms on SharePoint Lists), sin embargo a principios de 2015 seguimos sin ver rastro de dicha tecnología, y muchos nos vemos forzados a seguir utilizando InfoPath a pesar de haberse escenificado su propia “muerte”.
Puestos a seguir con dicha herramienta algún tiempo más, sigamos publicando algún “truco” más sobre la misma.
Recientemente un cliente solicitaba tener generar un ID de formulario basado en el valor de un campo de tipo menú desplegable (el valor eran tres caracteres alfabéticos), un guión bajo, y un número que siempre debía ser de 5 cifras. Un valor de ejemplo sería: AAA_00001
Aunque inicialmente el requerimiento no parezca complejo, al trastear con InfoPath enseguida os daréis cuenta de que no se puede crear por defecto un número de x cifras, ya que si defines un valor numérico (entero), este siempre se genera a partir de las cifras que componen el número en sí, y nunca permite añadir ceros delante suyo. Incluso si definiéramos un “string” con valor por defecto “00000” y luego intentáramos sumarle algún entero (1, por ejemplo) a eso, el resultado sería únicamente el entero, eliminando cualquier cero a la izquierda (1, por ejemplo).
Así pues, ¿Cómo construir un número entero con x cifras dentro del propio Infopath? Creando un campo de tipo string, y asociándole tantas reglas como cifras menos uno tenga el número deseado. En mi ejemplo voy a crear un número de 5 cifras, así que tendré que crear 4 reglas distintas:
  1. para cuando el número sea de una cifra
  2. para cuando el número sea de dos cifras
  3. para cuando el número sea de tres cifras
  4. para cuando el número sea de cuatro cifras
(cuando el número sea de 5 cifras no hará falta crear ninguna regla, pues ya tendrá la longitud deseada).
Además, para cada una de las reglas, usaremos un patrón distinto. ¡Vamos a verlo!
Primero creamos un campo de tipo texto simple, y le otorgamos un valor por defecto, por ejemplo un 1.
image
Una vez tenemos el campo creado, abriremos el Administrador de Reglas,
image
Y crearemos la primera de ellas, de tipo “Action”.
image
Como condición le diremos que el campo que hemos creado cumpla el patrón (“matches pattern”) y en el último desplegable seleccionamos “Select a pattern…”
image
En la pantalla de creación de patrones seleccionamos Custom pattern y tecleamos “\d”, que indica que el string únicamente tiene un dígito de longitud.
image
Aceptamos el patrón y también la condición que hemos creado
image
Ahora tenemos que crear una acción del tipo “Set a field’s value”, donde el campo será nuestro propio string que hemos creado para almacenar el número de 5 cifras (IDNumber), y el valor será una función “concat” que encadenará cuatro ceros con el propio campo (IDNumber)
image 
Al pulsar OK y crear la regla, ya tenemos que cuando el string tenga un único dígito, se le concatenen 4 ceros delante.
Ahora crearemos 3 reglas más, cada una de ellas con condiciones para patrones de 2, 3 y 4 dígitos (“\d\d”, “\d\d\d” y “\d\d\d\d”)
 image    image  image
y en donde la acción sobre el campo IDNumber, sea concatenar 3 ceros, 2 ceros y un cero respectivamente
image  image  image
Al final debería quedarnos unas reglas como las siguientes:
image
Ahora ya tenemos hecho lo más difícil. Faltaría tan solo introducir la lógica en el formulario para que el campo IDnumber asumiera algún valor concreto en algún momento determinado (al pulsar el botón de “guardar”, por ejemplo), y también crear otro campo de tipo String que asumiera un valor como el siguiente:
concat(FunctionalArea; "_"; IDNumber)
Donde “FunctionalArea” sería el valor de un campo de tipo desplegable de opciones.
El resultado final, efectivamente cumpliría el patrón solicitado por el cliente (AAA_00001)
image
¡Eso es todo, amig@s! Aquí estamos contando los días hasta que os pueda contar las primeras experiencias con FoSL!!
¡¡Salud!!