Campos de fórmula
Celoxis calcula automáticamente el valor de un campo personalizado basado en fórmulas. Este valor se calcula cada vez que se visualiza el campo. El lenguaje de expresiones de fórmulas es sofisticado, lo que permite realizar manipulaciones de datos complejas, incluyendo transformaciones aritméticas, de cadenas y de fechas.

Sintaxis
Celoxis trata todo lo que está entre ${ y } como expresiones. Las fórmulas pueden definirse como expresiones puras, por ejemplo ${me.budget * 0.10}, o contener una mezcla de texto y expresiones como El proyecto ${me.name} se creó el ${me.created} cuando todo lo que está encerrado entre ${ y } se trata como una expresión y se evalúa, mientras que todo lo que está fuera se copia a la salida textualmente tal cual. Para los curiosos, si las fórmulas se adjuntaran a un proyecto cuyo nombre fuera XYZ y cuyo presupuesto fuera de $10,000, la salida sería 1000 y El proyecto XYZ se creó el jueves 20 de junio de 2013 a las 08:30:16 EDT, respectivamente.
El operador punto
El operador punto se utiliza para hacer referencia a una propiedad de un objeto. En el ejemplo ${me.budget * 0.10}, me.budget se refiere al presupuesto del proyecto si el campo personalizado está asociado a él. El operador punto también se puede utilizar para llamar a una función (o método) de un objeto. En el ejemplo ${me.name.toUpperCase()}, toUpperCase es una llamada a una función que convierte el nombre del proyecto a mayúsculas.
Operadores
- Aritmética:
+,-(binario),*,/ydiv,%ymod,-(unario) - Concatenación de cadenas:
+= - Lógico:
y,&&,o,||,no,! - Relacional:
==,eq,!=,ne,<,lt,>,gt,<=,ge,>=,le. Se pueden realizar comparaciones con otros valores o con literales booleanos, de cadena, enteros o de punto flotante. - Vacío: El
vacíoes una operación de prefijo que se puede utilizar para determinar si un valor esnuloo está vacío. - Condicional:
A ? B : C. EvaluarBoC, dependiendo del resultado de la evaluación deA. - Asignación:
= - Punto y coma:
;
La precedencia de los operadores, de mayor a menor y de izquierda a derecha, es la siguiente:
[] .()(Se utiliza para cambiar la precedencia de los operadores)-(unario)¡no! vacío* / div % mod+ -(binario)+=< > <= >= lt gt le ge== != igual a&& y|| o? :=;
Palabras reservadas
Las siguientes palabras están reservadas para el EL y no deben usarse como identificadores:
y | o | no | eq |
nordeste | lt | gt | el |
ge | verdadero | FALSO | nulo |
instancia de | vacío | div | mod |
Ejemplos básicos
| Fórmula | Resultado |
|---|---|
${1 > (4/2)} | FALSO |
${4.0 >= 3} | verdadero |
${100.0 == 100} | verdadero |
${(10*10) ne 100} | FALSO |
${'a' < 'b'} | verdadero |
${'hip' gt 'hit'} | FALSO |
${4 > 3} | verdadero |
${1.2E4 + 1.4} | 12001.4 |
${3 div 4} | 0.75 |
${10 mod 4} | 2 |
${!empty me.code} | Falso si el código del objeto es nulo o una cadena vacía. |
Funciones de utilidad
Se han proporcionado las siguientes funciones auxiliares:
formatoFecha(fecha) | El valor de la fecha formateado (sin la hora) según las preferencias del usuario. |
formatoFechaHora(fechahora) | El formato de fecha y hora según las preferencias del usuario. |
formatoNúmero(número) | El valor formateado del número según la configuración regional del usuario. |
formatoMoneda(número) | El valor de la moneda se formatea según la moneda especificada en las preferencias de la empresa y el formato numérico según la configuración regional del usuario. Por ejemplo: $25,000 |
horasAHHMM(número) | Formatea las horas en el formato HH:MM. Por ejemplo, 2.5 dará como resultado 2:30 |
techo(número) | El entero más cercano mayor que la entrada. Por ejemplo, ${ceil(5.3)} devolverá 6 |
piso(número) | El entero más cercano menor que la entrada. Por ejemplo, ${floor(4.8)} devolverá 4 |
abs(número) | El valor absoluto de un número. Por ejemplo, ${abs(-3.2)} devolverá 3.2 |
ronda(número) | El valor redondeado de la entrada. Por ejemplo, ${round(3.6)} devolverá 4 |
redondearA(dígitos, número) | El valor redondeado del número de entrada al número de dígitos especificado. Por ejemplo, ${roundTo(2, 3.667)} devolverá 3.67; mientras que ${roundTo(0, 3.667)} devolverá 4. |
Cadena.contiene(haystack, needle) | Comprueba si existe una aguja en un pajar. |
Cadena.endsWith(cadena, sufijo) | Comprueba si la cadena termina con el sufijo |
Cadena.reemplazar(txt, buscar, reemplazar) | Reemplaza todas las ocurrencias de búsqueda en txt con reemplazo |
Cadena.startsWith(cadena, prefijo) | Comprueba si la cadena comienza con el prefijo |
String.trim(string) | Elimina los espacios en blanco y los caracteres de control de los extremos de la cadena. |
Cadena.blankIfNull(str) | Si str es nulo, devuelve una cadena vacía; de lo contrario, devuelve la str . |
Fecha.antes(fecha1, fecha2) | Devuelve verdadero si date1 es anterior a date2. |
Fecha.igual(fecha1, fecha2) | Devuelve verdadero si date1 es igual a date2. |
Fecha.después(fecha1, fecha2) | Devuelve verdadero si date1 es posterior a date2. |
Fecha.formato(fecha, formato) | El valor formateado de la fecha según el formato. Para ver los formatos compatibles, consulte esto. |
Fecha.horasEntre(desde, hasta) | Devuelve el número de horas transcurridas entre desde y hasta. |
Fecha.HorasLaboralesEntre(desde, hasta) | Devuelve el número de horas trabajadas entre una fecha y otra según el calendario laboral predeterminado de la empresa. Si transcurren más de 30 días entre ambas fechas, se devuelven las horas trabajadas . |
Fecha.másHoras(fecha, horas) | Agrega horas a la fecha y devuelve esa fecha. |
Fecha.isoToDate(cadena) | Convierte una cadena de texto en formato ISO a una fecha. |
Fecha.ahora() | Devuelve una fecha que representa la fecha y hora actuales |
Colección.tamaño(v) | Devuelve el tamaño de v. |
Colección.contiene(paquete de heno, aguja) | Comprueba si existe una aguja en un pajar. |
Colección.contieneCualquiera(montón de heno, agujas) | Comprueba si existe al menos una aguja en el pajar. |
Colección.contieneTodo(paquete de heno, agujas) | Comprueba si todas las agujas están en el pajar. |
Escribir fórmulas de varias líneas
Para escribir el código de la fórmula en varias líneas, utilice los = y ; . El valor de retorno es la última instrucción de la fórmula. Por ejemplo:
${ apc = yo.actualPercentComplete; ppc = yo.plannedPercentComplete; (apc - ppc)/ppc }El tipo de datos devuelto por la fórmula
Al definir una fórmula, debe seleccionar un tipo de datos de fórmula. Esto le indica al sistema qué valor debe devolver la fórmula. Celoxis formatea automáticamente el valor devuelto según el tipo de datos. Por ejemplo, si indica que el tipo de retorno es una moneda, si su fórmula devuelve el número 10000, el resultado será $10,000; es decir, Celoxis formatea automáticamente el número y le añade el símbolo de la moneda de la empresa.
El objeto yo
El `me` en la fórmula representa el objeto para el cual se está evaluando la fórmula. Por ejemplo, supongamos que nuestro campo de fórmula " Anticipo del cliente" se define como ${me.budget * 0.1}, es decir, representa el 10% del presupuesto. Si hemos asociado este campo tanto a proyectos como a tareas, al evaluar la fórmula para un proyecto, el `me` será un proyecto, mientras que para una tarea será un objeto de tarea.
Referencia de campo
Para ver la lista de campos disponibles, haga clic en la Referencia de campo en la pantalla de agregar/editar campo personalizado. Haga clic en el icono de signo más para expandir la lista de variables disponibles para las distintas entidades.
Manejo de errores
Cuando se produce un error al evaluar una fórmula, por ejemplo, al introducir un número en lugar de una cadena de texto, el mensaje mostrará ERR!.Pase el ratón por encima para obtener una descripción más detallada del problema.
Ejemplos
Supongamos que tenemos un proyecto con los siguientes datos.
| Etiqueta | Campo | Valor |
|---|---|---|
| IDENTIFICACIÓN | identificación | 1234 |
| Nombre | nombre | Preparación del espacio de oficina |
| Comenzar | iniciarCalendario | 10 de enero de 2011 |
| Presupuesto | presupuesto | 5000 |
| Costo estimado | Costo estimado | 4000 |
| Costo real | costo real | 3800 |
A continuación, veremos algunos ejemplos sencillos. Supondremos que la fórmula está asociada a proyectos y que el resultado de ejemplo corresponde al proyecto descrito anteriormente.
| Fórmula | Producción | Comentarios |
|---|---|---|
${me.id * 10} | 12340 | El ID se multiplica por 10 |
yo.id * 10 | yo.id * 10 | No está encerrado entre ${} y, por lo tanto, se copia a la salida textualmente. |
ID:${me.id} | ID:1234 | Texto mezclado con una expresión |
${me.name + 100} | ¡ERRAR! | No se pueden realizar operaciones aritméticas con el tipo String. |
${me.abcd} | ¡ERRAR! | yo no tengo una propiedad llamada abcd. |
${formatDate(me.startCalendar)} | 10 de enero de 2011 | Formatea la fecha de inicio según el estilo de formato de fecha del usuario. |
${me.actualCost gt (me.budget*.9) ? 'ALERTA' : 'OK'} | ALERTA | Un ejemplo de cómo escribir if/then/else |
${formatCurrency(me.budget)} | $ 5,000 | Suponiendo que su símbolo de moneda sea $ |
${round(((yo.presupuesto - yo.costo real)*100)/yo.presupuesto)}% | 24% | Calcula el porcentaje del presupuesto restante |
Ejemplo avanzado: Indicador de estado de tu propio horario
Digamos que desea tener un indicador de estado del cronograma que se base en valores de referencia, es decir, la fecha que realmente le prometió al cliente en lugar de la fecha de finalización del plan actual.
Deberás crear un campo de fórmula, adjuntarlo a los proyectos, establecer su tipo de datos de salida como Texto e ingresar la fórmula de la siguiente manera:
${ pc = me.actualPercentComplete; pFinish = me.projectedFinishCalendar; bFinish = me.baselineFinish; now = Date.now(); label = 'Desconocido'; label = Date.before(pFinish, bFinish) ? 'A tiempo' : label; label = Date.after(pFinish, bFinish) ? 'En riesgo' : label; label = Date.after(now, bFinish) ? 'Retrasado' : label; label = pc == 100 ? 'Completado' : label; label }En la de Color de la fórmula, coloque las asignaciones como:
| Resultado | Color |
|---|---|
A tiempo | Verde |
En riesgo | Naranja |
Atrasado | Rojo |
Terminado | Marrón |
Salida de ejemplo
