Ejemplos de cálculos de ventana

Esta sección contiene más ejemplos de cálculos de ventana y explicaciones de su funcionamiento. Pero en primer lugar hay una versión ampliada del enunciado de requisitos y un cálculo de la plantilla correspondiente con marcadores de posición. Pueden utilizarse para escribir cálculos básicos.

Cuando el TRIGGER_FIELD de TRIGGER_OBJECT se establece como TRIGGER_OBJECT, cambia la PROPIEDAD de VALUE a verdadero/falso.

El cálculo correspondiente a este enunciado de requisitos es:

Copiar
import System
static def GetAttributeValue(Incident):
    PropertyState = false
    if TRIGGER_OBJECT.TRIGGER_FIELD != null and TRIGGER_OBJECT.TRIGGER_FIELD._Title == 'VALUE':
        PropertyState = true    
    return String.Format(":SetPROPERTY(TARGET, {0});", PropertyState)

Cuando se reemplazan los marcadores de posición del enunciado de requisitos del cálculo y a continuación se agrega TRIGGER_FIELD al panel Dependencias en el Editor de cálculos se obtiene el cálculo requerido. También se recomienda reemplazar todas las referencias a "PropertyState" por un nombre de variable más descriptivo.

El resto de la sección ofrece ejemplos basados en el cálculo anterior y explica la lógica. Ejemplos posteriores amplían el cálculo aún más.

El indentado en los cálculos es fundamental y establece el alcance de las funciones. Por tanto, si se copia algún ejemplo de este manual, debe asegurarse de mantener el indentado correcto al pegarlo en el Editor de cálculos.

Uso de la instrucción if para restablecer valores

El ejemplo siguiente amplía el ejemplo mostrado en Preparación de los cálculos de ventana, para que el campo Impacto se establezca como no obligatorio y se convierta en obligatorio solo si el campo Urgencia se establece como Urgente. Si el campo estuviera vacío (con valor nulo)o contiene otro valor, el campo Impacto se vuelve a convertir en no obligatorio.

El enunciado de requisitos es:

Cuando Urgencia sea Urgente, el valor de SetMandatory de Impacto cambia a verdadero.

El desencadenador es el campo Urgencia, el atributo objetivo es Impacto y la función de ventana es :SetMandatory(,).

La estructura más adecuada para un cálculo de ventana es:

  • Al inicio, definir una variable que contenga el valor verdadero o falso para la función de ventana.
  • A continuación, construir la instrucción que hace cambiar dicha variable consecuentemente cuando se selecciona cada valor.
  • Para terminar, devolver el parámetro verdadero/falso de la función de ventana establecido utilizando la variable.

Por ejemplo:

Copiar
import System
static def GetAttributeValue(Incident):
    MandatoryUrgency = false
    if Incident._IncidentUrgency != null and Incident._IncidentUrgency._Title == 'Urgente':
        MandatoryUrgency = true
    return String.Format(":SetMandatory(_Impact, {0});", MandatoryUrgency)

Las líneas tercera, cuarta y última están indentadas un espacio, mientras la quinta lo está dos espacios.

La tercera línea crea la variable MandatoryUrgency con el valor inicial falso. Es el valor predeterminado más común en los cálculos.

La cuarta línea comprueba si el valor de Urgencia es Urgente (Incident._IncidentUrgency._Title == 'Urgente'). Observe que antes de que este cálculo pueda comprobar el valor del atributo Incident._IncidentUrgency._Title, el lenguaje requiere que antes se compruebe que el objeto del atributo no es nulo (Incident._IncidentUrgency != null).

Si la cuarta línea resulta ser verdadera y Urgencia no es nulo y tiene el valor Urgente, se ejecuta la quinta línea que establece el valor de la variable MandatoryUrgency como verdadero.

Para terminar se ejecuta la sexta línea, que asigna el valor del atributo calculado. Puesto que se referencia una variable, el lenguaje exige que se genere la cadena de retorno utilizando una función String.Format. Esta tiene la forma: String.Format("function(attribute, {0});", variable), en la que {0} se sustituye por la variable al generar la cadena, para obtener :SetMandatory(_Impact,MandatoryUrgency);. De forma predeterminada, MandatoryUrgency es falso, por lo que el campo Impacto es no obligatorio. Sin embargo, si Urgencia tiene el valor Urgente, se cumplen las condiciones indicadas en la cuarta línea y se ejecuta la quinta línea. Esto asigna el valor verdadero a MandatoryUrgency, con lo que el campo Impacto pasa a ser obligatorio.

Hay que observar que en las líneas tercera y quinta se utiliza un solo signo igual =, mientras que en la cuarta se utiliza un doble signo igual ==.
= significa "igualar a" y == significa "¿es igual a?"

Actualización de dos campos con un solo cálculo

El ejemplo siguiente muestra cómo se pueden actualizar dos campos utilizando un solo cálculo similar al ejemplo anterior. En este ejemplo, los campos Elemento de configuración y Tipo de elemento de configuración solo se muestran si Categoría tiene el valor Hardware.

El enunciado de requisitos es:

Cuando la Categoría sea Hardware, se cambiará el valor de SetHidden del Elemento de configuración Y del Tipo de elemento de configuración a falso.

El desencadenador es Categoría, los atributos objetivo son Elemento de configuración Y del Tipo de elemento de configuración y la función de ventana es :SetHidden(,).

Copiar
import System
static def GetAttributeValue(Incident):
    HideCI = true
    if Incident.Category != null and Incident.Category.FullName == 'Hardware':
        HideCI = false
    return String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{1});", HideCI, HideCI)

Las líneas tercera, cuarta y sexta están indentadas un espacio, mientras que la quinta lo está dos espacios. La larga sexta línea aparece en el editor como una sola línea.

La tercera línea asigna el valor verdadero a la variable HideCI.

La cuarta línea comprueba que Categoría no es nula y tiene el valor Hardware.

Si la cuarta línea es verdadera, se ejecuta la quinta línea, que asigna falso a HideCI.

Para terminar, la sexta línea asigna el valor String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{1});", HideCI, HideCI) al atributo cálculo. De forma predeterminada, HideCI es verdadero, por lo que los campos Tipo de elemento de configuración y Elemento de configuración están ocultos. Sin embargo, si Categoría tiene el valor Hardware, entonces se cumplen las condiciones indicadas en la cuarta línea y se ejecuta la quinta línea. De esta forma se asigna el valor Falso a la variable HideCI, por lo que los campos Tipo de elemento de configuración y Elemento de configuración se vuelven visibles.

Al utilizar String.Format para devolver el valor de más de una función con variables, se debe referir a ellas en la función como números entre llaves y después agregar las variables en el mismo orden. Por ejemplo:

String.Format("function(attribute, {0});function(attribute, {1});function(attribute, {2});", variable 0, variable1, variable 2)

:SetHidden también muestra y oculta la etiqueta asociada con el atributo objetivo. Sin embargo, no es posible utilizar :SetHidden con etiquetas estáticas añadidas desde el árbol Controles del Administrador de ventanas.

Uso de distintas funciones con un solo desencadenador

Los ejemplos anteriores devolvían siempre una sola función de ventana para cambiar el estado de obligatoriedad de uno o más campos o su estado de presentación. Este ejemplo ilustra cómo se pueden actualizar dos funciones distintas en un solo cálculo. Este ejemplo amplía el anterior para hacer que los campos Elemento de configuración y Tipo de elemento de configuración aparezcan si la Categoría tiene el valor Hardware y para hacer obligatorio el campo Tipo de elemento de configuración.

El enunciado de requisitos es:

Cuando Categoría sea Hardware, se cambiará el valor de SetHidden del Elemento de configuración Y del Tipo de elemento de configuración a falso Y cambiará el valor de SetMandatory del Tipo de elemento de configuración a verdadero.

El desencadenador es Categoría, los atributos objetivo son Elemento de configuración Y del Tipo de elemento de configuración y la función de ventana es :SetHidden(,).

Copiar
import System
static def GetAttributeValue(Incident):
    HideCI = true
    MandatoryCI = false
    if Incident.Category != null and Incident.Category.FullName == 'Hardware':
        HideCI = false
        MandatoryCI = true
    return String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{1});:SetMandatory(ConfigurationItemType,{2});", HideCI, HideCI, MandatoryCI)

Las líneas tercera, cuarta y octava están indentadas un espacio, mientras que la quinta lo está dos espacios. La larga octava línea aparece en el editor como una sola línea.

La tercera línea asigna a la variable HideCI el valor verdadero: se desea que de forma predeterminada, los campos CI y Tipo de CI estén ocultos.

La cuarta línea asigna a la variable MandatoryCI el valor falso. De forma predeterminada el campo Tipo de CI no es obligatorio.

Si la quinta línea es verdadera, se ejecutan la sexta y séptima líneas y asignan a HideCI el valor falso y a MandatoryCI el valor verdadero. Ambas líneas se ejecutan porque en este cálculo tienen el mismo indentado.

Para terminar, se ejecuta la octava línea y pasa el valor de HideCI a las dos primeras funciones y el valor de MandatoryCI a la tercera función.

Puesto que se está enviando la misma variable a las dos primeras funciones, la octava línea se podría reescribir así:
return String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{0});:SetMandatory(ConfigurationItemType,{1});", HideCI, MandatoryCI)

Uso de funciones distintas según el valor de un desencadenador

Este ejemplo ilustra cómo utilizar funciones distintas dependiendo del valor seleccionado en el atributo desencadenador. Si la Prioridad tiene el valor Alta, el campo Razón se vuelve obligatorio y editable. Si la Prioridad tiene el valor Baja, el campo Razón se vuelve no obligatorio y de solo lectura. En cualquier otro caso, el campo Razón se queda en su estado predeterminado.

Este cálculo necesita agregar un atributo al objeto Incidencia cuyo nombre esté establecido con el valor _reason.

El enunciado de requisitos es:

Cuando la Prioridad tenga el valor Alta, se cambiará el valor de SetMandatory de Razón a verdadero Y de SetReadOnly de Razón a falso. Cuando Prioridad tenga el valor Baja, se cambiará el valor de SetReadOnly de Razón a verdadero Y de SetMandatory de Razón a falso.

El desencadenador es el campo Prioridad, el atributo objetivo es Razón y las funciones de ventana son :SetMandatory(,) y SetReadOnly(,). También podría escribirse que:

En el resto de las situaciones, se dará a SetMandatory y SetReadOnly de Razón el valor falso.

Lo que indica que el valor predeterminado tanto de SetMandatory como de SetReadOnly de Razón es falso.

Copiar
import System
static def GetAttributeValue(Incident):
    MandatoryReason = false
    ReadOnlyReason = false
    if Incident.Priority != null and Incident.Priority.Title == 'Alta':
        MandatoryReason = true
    elif Incident.Priority != null and Incident.Priority.Title == 'Baja':
        ReadOnlyReason = true
    return String.Format(":SetMandatory(_reason, {0});:SetReadOnly(_reason, {1});", MandatoryReason, ReadOnlyReason)

Las líneas tercera, cuarta quinta, séptima y novena están indentadas un espacio, mientras que la sexta y la octava lo están dos espacios. La larga novena línea aparece en el editor como una sola línea.

La tercera línea asigna a la variable MandatoryReason el valor falso: se desea que de forma predeterminada el campo Razón sea no obligatorio.

La cuarta línea asigna a la variable ReadOnlyReason el valor falso: se desea que de forma predeterminada el campo Razón sea de solo lectura.

Si la quinta línea es verdadera, el campo Prioridad tendrá el valor Alta y se ejecuta la sexta línea, que asigna a MandatoryReason el valor verdadero.

Si la quinta línea NO es verdadera, se ejecuta la séptima línea. La línea elif ("else if") solo se ejecuta si la línea anterior es falsa. Si esta línea es verdadera y el campo Prioridad tiene el valor Baja, se ejecuta la octava línea, que asigna a ReadOnlyReason el valor verdadero.

Para terminar, se ejecuta la novena línea utilizando los valores de MandatoryReason y ReadOnlyReason.

Esto significa que de manera predeterminada, MandatoryReason y ReadOnlyReason son falsos, por lo que el campo Razón es no obligatorio y editable. Sin embargo, si Prioridad tiene el valor Alta, entonces MandatoryReason es verdadero (quinta y sexta líneas), pero ReadOnlyReason es aún falso, por lo que Razón es obligatorio y editable. Sin embargo, si Prioridad tiene el valor Baja, entonces ReadOnlyReason es verdadero (séptima y octava líneas), pero MandatoryReason es falso, por lo que Razón es no obligatorio y de solo lectura.

Uso de fechas en cálculos

Este ejemplo hace que el campo Razón sea obligatorio si la fecha seleccionada en el campo Fecha requerida tiene un valor inferior a siete días desde la fecha actual.

Este cálculo necesita agregar atributos al objeto Incidencia cuyo Nombre esté establecido con los valores _reason y _daterequired. Se debe tener en cuenta no actualizar el mismo campo mediante distintos cálculos.

El enunciado de requisitos es:

Cuando la Fecha requerida esté dentro de los próximos siete días, se cambiará el valor de SetMandatory de Razón a verdadero.

El desencadenador es el campo Fecha requerida, el atributo objetivo es Razón y la función de ventana es :SetMandatory(,).

Copiar
import System
static def GetAttributeValue(Incident):
    MandatoryReason = false
    if Incident._daterequired != null and Incident._daterequired < DateTime.Today.AddDays(7):
        MandatoryReason = true
    return String.Format(":SetMandatory(_reason,{0});", MandatoryReason)

Las líneas tercera, cuarta y última están indentadas un espacio, mientras la quinta lo está dos espacios.

La tercera línea crea una variable llamada MandatoryReason y le asigna el valor falso: se desea que de forma predeterminada el campo Razón sea no obligatorio.

La cuarta línea emplea el método de .Net llamado .AddDays para determinar si Fecha requerida es menor que la fecha de hoy más siete días. Si lo es, se ejecuta la quinta línea, que asigna verdadero a MandatoryReason.

La sexta línea genera la función SetMandatory correspondiente.

Para obtener más información sobre el uso de los métodos .Net en los cálculos, consulte el sitio web de la comunidad Ivanti.