Notas del Motor de Script Versión 2 y Notas Anteriores

El proceso de scripting que utiliza la versión de motor 2 o superior del motor requiere una sintaxis adicional que permite aprovechar la funcionalidad de XPath 2. En general, cualquier variable declarada se considerará una cadena. Es decir, si la intención es crear un estado de cuenta matemático, es necesario declarar explícitamente el tipo de datos de las variables, como enteros, números o fechas.

Nota: A menos que se especifique lo contrario, todos los ejemplos de XPath proporcionados en este tema pertenecen a la Versión 1 del motor, es decir, XPath 1. Los estados de cuenta que funcionan mediante XPath 1 no necesariamente funcionan para XPath 2. Esto es especialmente cierto cuando se ejecutan operaciones matemáticas. Consulte los ejemplos a continuación.

Aritmética de Fecha y Hora

Los tipos de datos de intervalo y de fecha y hora de XPath soportan funciones y operaciones aritméticas ('+', '-', '*', etc.) que se puede utilizar para realizar cálculos de tiempo de la misma manera que se utiliza '1 + xs:integer(value)' para cálculos numéricos.

Comparación de duración:

if ("(xs:dateTime(fn:current-dateTime()) - xs:dateTime($updateDateTimeX))
   ge xs:dayTimeDuration(concat('PT', BO/hoursBetweenStatisticsUpdate, 'H'))")
   goto 60;
end-if;

Comparación de fechas:

if ("xs:date(parm/endDate) < xs:date(parm/startDate)")
   terminate with error (11108, 11507 element='endDate');
end-if;

Comparación de una fecha con la fecha actual:

if ("xs:date(parm/startDate) <= xs:date($CURRENT-DATE)")
   terminate with error (11108, 11507 element='endDate');
end-if;

Cálculo de fin de mes:

// covert to ISO
move "concat($year,'-',$mon2,'-01T00:00:00')" to $monthStart; 
 
// calculate
move "xs:dateTime($monthStart) + xs:yearMonthDuration('P1M') - xs:dayTimeDuration('P0DT1S')" 
  to $monthEnd;
 
// convert from ISO to OUAF
move "concat($year,'-',$mon2,'-',substring(string($monthEnd),9,2),'-23.59.59')" to $endDateTime;
Nota: Los formatos de fecha, hora e intervalo de XPath usan el standard ISO, que se debe convertir en formatos soportados en el marco.

Comparación de Fechas y Horas en Formato de Cadena

El formato de cadena similar a ISO para la fecha y la hora conserva la siguiente secuencia, que se rellena con ceros: AAA MM DD HH MM SS. Independientemente de los separadores, este formato será apropiado para las operaciones de comparación. En particular, los valores de fecha y hora en el formato del marco “AAAA-MM-DD.HH.MM.SS” se pueden utilizar con los operadores “=”, “!=”, así como con “>”, “>=”, “<”, “<=”.

// retrieve framework date/time value
invokeBS 'CM-MAXMSRMT' using "CM-MAXMSRMT";
move "string(cm-MAXMSRMT/results[1]/measurementDateTime)" to $lastMsmtDT;
 
// construct another date/time
move "concat($year,'-01-01-00.00.00')" to $startDateTime;
 
// compare using string operators
if ("$lastMsmtDT >= $startDateTime")
    move "substring($lastMsmtDT,1,4)" to $latestMsrmtYear;

Conversión de Fechas y Horas entre el Marco e ISO

Solamente es necesario convertir las fechas y las horas del formato del marco a ISO para las operaciones aritméticas de fecha y hora. Las comparaciones se pueden realizar directamente con el formato del marco. La única diferencia que existe entre el formato de fecha y hora del marco e ISO son los separadores:

Marco: “AAAA-MM-DD.HH.MM.SS”

ISO: “AAAA-MM-DDTHH:MM:SS”

Ejemplo de conversión del formato del marco a ISO:

move "concat(substring($ouafDT, 1, 10), 'T', translate(substring($ouafDT, 12),'.',':'))" to $isoDT;

Ejemplo de conversión de ISO al formato del marco:

move "concat(substring($isoDT, 1, 10), '.', translate(substring($isoDT, 12),':','.'))" to $ouafDT;

Redondeo de Dinero con una Escala Dinámica de Divisa

Dado que diferentes divisas soportan diferentes cantidades de decimales, el marco proporciona una API para redondear un importe monetario en función de una divisa determinada.

move "parm/amount" to $qnty;
move "currency/decimals" to $decimals;
move "fn:round(xs:decimal($qnty) * math:exp10(xs:double($decimals))) 
  div math:exp10(xs:double($decimals))" to "parm/roundedAmount";

Ciclo a través de las secuencias

En XPath 2, se puede organizar un ciclo sobre una secuencia de enteros, no solo una lista de nodos.

En el ejemplo, se muestra un ciclo sobre un rango de meses. Esta es una creación de formación de secuencias en XPath. La lista de nodos de XPath que conocemos es otro tipo de secuencia.

for ($month in "1 to 12")

En este ejemplo se muestra un ciclo sobre un rango de años determinado en orden descendente:

for ($year in "fn:reverse(parm/startYear to parm/endYear)")
     move "concat($year,'-01-01-00.00.00')" to $startDateTime;
     move "concat($year,'-12-31-23.59.59')" to $endDateTime;
     ...   

En este ejemplo se muestra un ciclo a través de una lista de nodos con ‘índice’ que permite acceder a otras listas de nodos:

for ($idx in "1 to count(parm/touData/touList)")
     move "parm/touData/touList[$idx]" to $tou;   // access any list with this index   

La sintaxis anterior se puede utilizar como una alternativa elegante para mantener los índices por separado, por ejemplo, en lugar de lo siguiente:

move “0” to $idx;
for ($item in "parm/touData/touList")
     move “1 + xs:integer($idx)” to $idx;

Relleno de Cadenas y Formato Decimal

Esto se utiliza con formatos de entrada o de salida específicos. Se puede aplicar al cero, al espacio y a otros tipos de relleno.

En este ejemplo se muestran los prefijos para los componentes de fecha y hora, como la producción de “2010-01-02” en lugar de “2010-1-2”.

move "substring(concat('0',string($month)), string-length(string($month)), 2)" to $mon2; 

En este ejemplo se muestra el sufijo que permite agregar la alineación rellenada con ceros decimales, como la producción de “12.30” y “4.00” en lugar de “12.3” y “4”. En el ejemplo se realizan tres tareas: redondeo a 2 decimales, inserción de un punto si es necesario y relleno con ceros.

// round and zero-pad to 2 decimals
move "$item/amount" to $qty;
move "fn:round(xs:double($qty) * 100) div 100" to $qty;
move "string($qty)" to $qty;
move "concat(substring-before(concat($qty,'.'),'.'),'.',substring(concat(substring-after($qty,'.'),'00'),1,2))" to $qty;

Operación ternaria

Esto permite elegir valores en función de una condición, de modo que se puede utilizar como una sola expresión en lugar de un bloque if/else. Se conoce en C/C++ como ‘cond ? value1 : value2’ o en BASIC, como ‘IFF(cond, value1, value2)’. En XPath, la sintaxis es la siguiente: "if (cond) then value1 else value2". Tenga en cuenta que este no es el bloque de scripting condicional de nivel superior.

En XPath, es una expresión que se puede combinar con otras expresiones. En el proceso de scripting, se puede usar de la siguiente manera:

move "if (string(D1-UnitOfMeasure/measuresPeakQuantity) = 'D1MP') then 'D1MX' else 'D1SM' " to $func;

Procesamiento de canalización-363.3

En el proceso de scripting, no es fácil crear un simple código reutilizable, ya que no hay funciones locales, y una llamada de script independiente significa un gasto de códigos y requiere parámetros de empaquetamiento y desempaquetamiento. Para evitar tener que copiar y pegar el mismo bloque de código entre destinos de script similares, considere la ‘canalización’, es decir, divida el proceso total en diferentes pasos de nivel superior, algunos de los cuales se pueden compartir en rutas alternativas. Esto es común en la preparación de parámetros y el formato de salida. Un resultado intermedio entre las etapas se puede almacenar en una estructura de “parámetro”.

En lugar de este código:

if ("type = A")
   prepare params ...
   call services for A ...
   format output ...
end-if;
if ("type = B")
   prepare params ...
   call services for B ...
   format output ...
end-if;

Considere esta alternativa:

prepare params ...

if ("type = A")
   call services for A ...
end-if;
if ("type = B")
   call services for B ...
end-if;

format output ...

Funciones de XPath 2

El motor de script versiones 2 y superiores soporta las Funciones y los Operadores de XQuery 1.0, y la versión standard de XQuery 1.0 con algunas mínimas limitaciones. A continuación, se proporcionan los URL de ambas especificaciones. El primer enlace tiene las funciones y los operadores disponibles para usar en XQuery.

  • http://www.w3.org/TR/xpath-functions/

  • http://www.w3.org/TR/xquery/

Los siguientes tienen acceso a sistemas de archivos locales solamente. (Para otros protocolos, como http, devolverán una secuencia vacía):

  • fn:doc

  • fn:collection