Lenguaje de formatos

From ABCD Wiki
Jump to: navigation, search

Una referencia completa al lenguaje de formatos de CDS/Isis se encuentra en: Manual del lenguaje de formatos del CISIS

Extractores de campos

El lenguaje de formatos permite extraer información de un registro CDS/Isis, prepararla y presentarla al usuario por pantalla o enviarla a impresoras u otros medios de salida.

Para extraer información de un registro se usan los extractores de campos, los cuales, en su forma más sencilla se forman con la letra v (en mayúscula o minúscula, indistintamente), seguida por la etiqueta del campo cuyo contenido se desea extraer:

       Vxx    Incluye en la salida el campo cuya etiqueta representa el valor xx
              Ej:v10 

Si el campo posee subcampos, en la extracción del campo se debe indicar el subcampo que se desea acceder

      Vxx^a   Incluye en la salida el subcampo (^a) o 
              equivalente presente en campo con etiqueta xx. Ej: v10^a, v10^r

Cuando el primer subcampo de un elemento de datos es obligatorio, como en el caso de los nombres personales los cuales se forman con el apellido y el nombre propiamente dicho estando siempre presente el apellido; entonces, en este caso no es necesario identificar el apellido con un delimitar de subcampos ya que es un elemento obligarorio. El ingreso se podrá realizar de la siguiente forma:

              Ruiz Alvarado^nFernando 						

El primer subcampo del campo es Ruiz Alvarado y para referenciarlo se usa la construcción ^* lo cual es equivalente a primer subcampo del campo, entendiendose como primer subcampo la cadena de caracteres existente desde el inicio del campo hasta que se encuentre un delimitador de subcampos (^) o el fin del campo. Bajo este concepto, si la etiqueta del campo nombre es 10, el comando

              v10^*,", "v10^n 

producirá como salida

              Ruiz Alvarado, Fernando 				

Extractores virtuales de campo

Estos elementos del lenguaje de formatos se utilizan para generar un literal en el formato de salida, dependiendo de si un campo está presente o ausente. Son los siguientes:

             Dxx 

Presenta en la salida el literal asociado, si el campo con etiqueta xx está presente en el registro:

              Ej: "El campo tiene materias. "d76				

En la salida se incluye el rótulo El campo tiene materias. si el campo 76 está presente en el registro. Si el campo 76 está ausente, no se genera el literal correspondiente

              Nxx 

Coloca en la salida el literal asociado si el campo con etiqueta xx está ausente.

              Ej: "S/F"n43

En la salida aparecerá el literal S/F si el campo 43 está ausente. Si el campo está presente no se genera salida ninguna

En ninguno de estos casos se coloca el contenido del campo en la salida generada.

Extractores parciales de campo

El lenguaje de formatos permite extraer una subcadena de caracteres de un campo especificando el inicio de la cadena a extraer y la longitud de la misma.

Para ilustrar este aspecto, consideremos el caso de un campo de fecha tratado bajo la norma ISO, la cual establece que el ingreso debe realizarse de la siguiente manera: AAAAMMDD, o sea, que el ańo simpre será el primer elemento del campo y constará de dos dígitos, a continuación se colocará el mes, siempre con dos dígitos y al final del día, también con dos dígitos.

El ańo, al ser el primer elemento del campo, está desplazado 0 (cero) caracteres respecto al inicio del campo; el mes está desplazado 4 caracteres respecto al inicio del campo y el día está desplazado 6 caracteres respecto al inicio del campo.

Gráficamente, ésto corresponde a la siguiente situación:

         Contenido del campo   Desplazamientos respecto al orígen del campo
               20011001		      01234567				 		

Para extraer porciones de un campo, el lenguaje de formatos permite expresar una porción de un campo en términos de su posición respecto al orígen (desplazamiento) y de la cantidad de caracteres a tomar en cuenta a partir de esa posicion inicial (longitud). El símbolo para identificar el valor del desplazamiento es el * (asterisco) y la longitud se expresa con símbolo . (punto). Entonces, la construcción

               Vxx*D.L    extraerá L caracteres del campo xx tomados a partir del
                          desplazamiento D respecto al inicio del campo.		

Ej. Si el campo 44 se ingresó con el valor 20010915, tendremos:

                v44*6.2 = 15
                v44*4.2 = 09
                v44*0.4 = 2001 

Si el desplazamiento es cero, esto es, la porción que deseamos obtener se encuentra al inicio del campo, entonces, no es necesario especificar es desplazamiento sino lo solo la longitud del segmento a extraer.

                Ejm: v44*0.4 = v44.4		

Si la longitud del segmento que deseamos extraer se ubica a partir de un desplazamiento x hasta el final del campo, no es necesario especificar la longitud a extraer.

                Ejm: v44*6.2 = v44*6 

Al omitirse la longitud se toma desde la posición 6 el resto de caracteres presentes en el campo (2)

Literales

Como ya mencionamos en la sección Estructuras CDS/Isis, estas bases de datos están orientadas a almacenar información cuyo mayor componente sea texto, a través de registros de longitud variable. Este tipo de información generalmente se presenta en forma de párrafo y muy pocas veces en reportes columnares. Al formar párrafos debemos utilizar signos de puntuación para separar los elementos de datos. Por ello, el lenguaje de formatos del CDS/Isis está orientado hacia la formación de párrafos con la inclusión de rótulos, signos de puntuación y otros elementos de edición para la separación de los campos del registro.

Los elementos de separación generalmente toman la forma de literales. Entonces, podemos definir un literal como un caracter o cadena de caracteres que precede (pre-literal) o continúa (post-literal) a un campo para darle legibiidad a la información presentada.

Existen varios tipos de literales:

Condicionales Se incluyen en la salida si el campo asociado está presente. Se encierran entre comillas dobles (").
   Ej: "Autor: "v10," / Título: "v12

En este caso en la salida se coloca el rótulo Autor si está presente el subcampo a del campo 10, luego se coloca el contenido del subcampo a del campo 10 y se termina la edición del campo 10 con un punto. A continuación se coloca el valor / Título si está presente el campo

Incondicionales Se incluyen en la salida siempre, sin estar asociados a campo alguno. Se encierran entre apóstrofes (')
   Ej: 'Listado de Autores',V10^a 

El rótulo Listado de Autores se coloca en la salida independientemente de la presencia o ausencia del subcampo a del campo 10

Si el literal condicional precede al campo se denomina pre-literal; si lo continúa se denomina post-literal. En la construcción

       "Autor: "v10^a 

el literal "Autor: " es un pre-literal del subcampo a y su aparición en la salida está condicionada a la presencia del subcampo a del campo 10.

En la construcción

       "Autor: "v10^a"," , v10^b 

el subcampo a posee un pre-literal y un post-literal, representado este último por el caracter , (coma). Esto quiere decir que si el subcampo a está presente tendremos su contenido precedido por el rótulo Autor: y seguido por una coma. Pero en la construcción

       "Autor: "v10^a , ","v10^b 

el literal ", " ya no es un post-literal del sub-campo a sino un pre-literal del subcampo b. La causa?. Hemos introducido un elemento de separación (la coma) que permite guiar al procesador del lenguaje del formato para avisarle donde tiene que hacer una pausa para comenzar una nueva sentencia. La coma es un elemento importante dentro del lenguaje de formatos ya que nos permite guiar al procesador de comandos para darle sentido exacto a la forma como deseamos combinar los elementos del lenguaje. Ejemplo de uso de literales:

 Tag  Contenido               Formato                     Salida 
  3   ^a330.987^bM319^cd      v3^a,"."v3^b,"."v3^c        330.987.M319.d
  3   ^a330.987^bM319^cd      v3^*,"/"v3^b,"/"v3^c        330.987/M319/d
  3   ^a330.987^bM319^cd      v3^*.3,"/"v3^b,"/"v3^c      330/M319/d
  3   ^a330.987^bM319^cd      v3^a*4                      987 
  3   ^a330.987^bM319^cd      v3*2.3                      330
  9   Documentos de Reuniones v9                          Documentos de Reuniones
  9   Documentos de Reuniones v9^*                        Documentos de Reuniones
 10   Mantellini^bHéctor      v10^*,", "v10^b             Mantellini, Héctor 
 10   Mantellini^bHéctor      v10^b," "v10^*              Héctor Mantellini
 44   19890314                v44.4                       1989
 44   19890314                v44*4                       0314
 44   19890314                v44*4.2                     03
 44   19890314                v44*6,"-"v44*4.2,"-"v44.4   14-03-1989
 44   19890314                v44.4,"-"v44*4.2,"-"v44*6   1989-03-14
 44   19890314                v44.6                       198903	   

Hemos visto que un literal está asociado al campo o subcampo que inmediatamente lo continúa o precede. Entonces, żqué hacer si tenemos un campo con tres subcampos y queremos colocar un literal antes del campo sin importar el subcampo que esté presente?. Tomemos como ejemplo el siguiente contenido:

         26:     ^aBolivia^bUnesco^c-1965 

el cual queremos desplegar de la siguiente manera: Pié de Imprenta: Bolivia. Unesco (-1965) El formato

       "Pié de imprenta: "v26^a,". "v26^b," ("v26^c")" 

produce la salida deseada solo si el subcampo a está presente. Si está ausente no se genera el rótulo asociado Pié de imprenta. Para solucionar esta situación utilizamos los Extractores virtuales de campo con lo que expresaríamos el formato de la siguiente manera:

       "Pié de imprenta: "d26,v26^a". ",v26^b," ("v26^c")".	

Note también que el literal ". " ya no es un preliteral de v26^b sino un post-literal de v26^a lo cual se logró moviendo la coma que separa los elementos de formato. Este cambio se hizo ya que el punto que separa el ^a del ^b no puede puede estar condicionado al ^b ya que si el ^a no está presente tendríamos en la salida un punto que no estaría asociado a ningún dato.

Espaciado vertical

Genera el salto de línea únicamente si la línea no está vacía. Si se incluyen varios comandos / adyacentes, aunque desde el punto de vista de la sintáxis del lenguaje no se presenta ningún problema, se tendrá el mismo efecto que un comando / sólo; esto es, los / nunca generarán líneas en blanco.
# Salto de línea incondicional

El uso del comando # puede generar un problema en aquellos casos donde el campo seleccionado esté ausente. Esta situación se ilustra más claramente por el siguiente ejemplo:

    /#v10/#v20/#v30 . . . . .

Si todos los campos están presentes en el registro, el resultado será que cada uno de los campos 10, 20 y 30 se muestran en una nueva línea y están precedidos por una línea en blanco. Sin embargo, si el campo 20 no existe, habrá dos líneas en blanco entre el campo 10 y el 30. Esto puede ser indeseable si lo que en realidad se desea es una línea en blanco entre los campos, indistintamente de la presencia o ausencia de alguno de ellos. En ese caso, el formato anterior no producirá los resultados deseados.

El caracter % se ha previsto para resolver esta situación. Su efecto es el de suprimir todas las líneas en blanco contiguas (en caso de que las haya), entre la línea actual y la última línea que no esté en blanco en el momento de la ejecución del comando. Por lo tanto, el formato:

    %##v10%##v20%##v30 . . . . .

producirá una y sólo una línea entre cada campo, aun cuando uno o más de ellos estén ausentes de un registro dado


Campos repetibles

Un campo es repetible cuando sus elementos de datos ocurren más de una vez al interior del registro. Ejemplo:

       Campo repetible sin subcampos
         76:  Organizaciones Latinoamericanas 
         76:  Programas 
         76:  Organizaciones Internacionales 
         76:  Bibliotecas
       Campo repetible con subcampos
         101:  ^n10^m1^l1^fCompra^p19980909^rElite^q20000^w19990323^zGPM
         101:  ^n11^m1^l2^o^fDonación^p19981015^rFlasa^w19990323^zGPM

Cds/Isis provee un conjunto de comandos para dar formato a los campos repetibles ya que éstos no pueden editarse como campo elementales por cuanto hay que suministrar información adicional sobre el tratamiento de las ocurrencias. Si formateamos el campo 76, sin tomar en cuenta que es repetible, a través la siguiente expresión:

      "Descriptores: "v76". " 

obtendremos el siguiente resultado: Descriptores: Organizaciones LatinoamericanasProgramasOrganizaciones InternacionalesBibliotecas.


Como en el formato no estamos especificando que tratamiento queremos darle a las ocurrencias, el lenguaje de formatos extrae cada ocurrencia del campo 76 y la coloca una a continuación de la otra. Los elementos de formato para presentar los campos repetibles son los siguientes:

   Pre-literales condicionales repetibles       Preceden cada ocurrencia del campo
   Post-literales condicionales repetibles      Continúan cada ocurrencia del campo
   Grupos repetibles                            Delimitan la variable que debe ser tratada
                                                como campo repetible				

Los literales repetibles deben venir encerrados entre | y los grupos repetibles se delimitan encerrados entre paréntesis. Ejemplo:

(v76|; |) Organizaciones Latinoamericanas; Programas; Organizaciones Internacionales; Bibliotecas;
(v76/)

Organizaciones Latinoamericanas
Programas
Organizaciones Internacionales
Bibliotecas

(| -|v76| |) -Organizaciones Latinoamericanas -Programas -Organizaciones Internacionales -Bibliotecas
("Materias: "v76|; |) Materias: Organizaciones Latinoamericanas; Programas; Organizaciones Internacionales; Bibliotecas;
    Note que el literal Materias aparece solo con la primera ocurrencia 
    del campo por un ser un literal no repetible.

Tanto en el primer como en el último ejemplo, el último descriptor está seguido por un signo de puntuación (; ). Esta situación puede traernos conflictos en el formato ya que generalmente no requerimos insertar en la última ocurrencia la misma puntuación que en las ocurrencias anteriores, sino un signo que separe el campo en proceso con el campo siguiente. Esta posibilidad la provee el lenguaje de formatos mediante la siguiente construcción:

    "Materias: "v76+|; |		

la cual producirá la siguiente salida:

Materias: Organizaciones Latinoamericanas; Programas; Organizaciones Internacionales; Bibliotecas

donde se ha eliminado el punto y coma al final del último descriptor. En esta nueva construcción hemos prescindido del uso de los paréntesis y combinado el post-literal con la variable 76 utilizando el signo + lo cual interpreta el procesado de comandos como incluir el post-literal en todas las ocurrencias del campo 76, menos en la última.

El formato:

    |; |+v76 

colocará el literal referido antes de todas las ocurrencias menos de la primera.

Los campos repetibles con subcampos generalmente deben formatearse dentro de grupos repetibles, para facilitar la inserción de literales antes o después de cada uno de los subcampos de las ocurrencias del campo. Ejemplos:

        (|No. |v101^n,|, Ej. |v101^l, |, (|v101^f|) |/)
        producirá
        No. 10, Ej. 1, (Compra)
        No. 11, Ej. 1, (Donación) 
    
        (|No. |v101^n,| - |, v101^p*6.2,|/|v101^p*4.2,|/|v101^p.4/)
        producirá
        No. 10 - 09/09/1998
        No. 11 - 15/10/1998		
       (|No. |v101^n,|, Ej. |v101^l, |, v101^f+|, |/)
       producirá
       No. 10, Ej. 1, Compra; No. 11, Ej. 1, Donación


Expresiones booleanas

El comando IF

El comando IF permite implementar formatos sensibles al contexto, o sea, formatos capaces de producir resultados que pueden variar dependiendo del contenido del registro que se está presentando.

Tiene la siguiente forma:

    IF condición THEN formato-1 ELSE formato-2 FI		
    donde:		
          condición   es una expresión booleana
          formato-1   es un formato de CDS/ISIS que será ejecutado 
                      si, y sólo si la expresión booleana expresada por 
                      condición es Verdadera
          formato-2   es un formato de CDS/ISIS que será ejecutado si, 
                      y sólo si la expresión booleana establecida por 
                      condición es Falsa				

La cláusula ELSE formato-2 es opcional y puede ser omitida. Las palabras clave IF, THEN y FI son siempre obligatorias. El comando IF por lo tanto, puede tomar una de las siguientes formas alternas:

         IF condición THEN formato-1 FI
         IF condición THEN formato-1 ELSE formato-2 FI		

Como no hay restricciones en cuanto a los comandos que puedan utilizarse en formato-1 o en formato-2, los comandos IF pueden ser anidados hasta cualquier nivel de profundidad deseada. La palabra clave FI en este caso debe usarse para cerrar cada comando IF (se puede considerar a IF y FI como si fueran un par de paréntesis). Por ejemplo:

       if p(v1) then v24 else if p(v2) and a(v3) then v5 fi fi     

Las expresiones booleanas nos ayudan a determinar si la combinación de varias condiciones es verdadera o falsa y se forman con operandos y operadores. Los operandos de una expresión booleana establecen la condición que se está analizando y pueden ser de dos tipos: {|class=wikitable |- valign=top | Expresiones relacionales ||que comparan dos valores y determinan si existe o no una cierta relación entre ellos, tal como mfn<10 |- valign=top |Funciones booleanas ||tal como p(v24), que regresa un valor de verdadero o falso|} Las expresiones relacionales permiten verificar si dada una relación esta se cumple entre dos o más valores. Su forma general es:

         expresión-1 operador-de-relación expresión-2 
         donde:
         expresión-1          es una expresión numérica o alfanumérica
         operador-de-relación es uno de los siguientes:
                              =      Igual
                              <>     No igual (diferente de)
                              <      Menor que
                              <=     Menor o igual que
                              >      Mayor que
                              >=     Mayor o igual que
                              :      Contiene (puede ser usado sólo con valores 
                                     alfanuméricos o alfabéticos)
         expresión-2          es una expresión numérica o alfanumérica				

expresión-1 y expresión-2 deben ser del mismo tipo, o sea, expresión-1 y expresión-2 deben ser ambas expresiones numéricas o ambas expresiones alfanuméricas. Cuando se comparan expresiones que constan de campos alfanuméricos, se aplican las siguientes reglas:

  • Excepto por el operador ":" (contiene), los valores alfanuméricos se comparan exactamente en la forma en que ocurren, o sea, las letras mayúsculas y minúsculas se comparan de acuerdo con el código ASCII que les corresponde (p.ej. A será considerada menor que a).
  • Si dos expresiones con valores alfanuméricos son de diferente longitud, serán consideradas diferentes
  • Si dos expresiones combinan campos alfanuméricos de diferente longitud y son idénticas, carácter por carácter, hasta el total de la longitud de la más corta, entonces, la más corta será considerada menor que la más larga.
  • El operador : (contiene), busca una cadena de caracteres (definida por expresión-2) en otra cadena (definida por expresión-1). Si el segundo operando existe en cualquier parte del primer operando, el resultado es Verdadero (TRUE). Este operador es insensible al hecho de que los caracteres se hallen en mayúsculas o minúsculas: por lo que las letras minúsculas se consideran iguales a su letra mayúscula correspondiente.Por ejemplo, el resultado de: v10 : 'química' será Verdadero (True) si, y sólo si, el campo 10 contiene la cadena química. En caso contrario, el resultado será Falso (False). Nótese que el segundo operando puede ser cualquier cadena o caracteres, y no necesita ser una palabra como tal. Por lo tanto, en este ejemplo, el resultado será Verdadero no sólo si el campo 10 contiene la palabra química, sino también si contuviera bioquímica, fotoquímicas, químicamente, etc.

Las funciones booleanas son las siguientes:

P(vxx) Evalúa si el campo identificado con vxx está presente en el registro de la base de datos y en caso positivo devuelve el valor verdadero. Si el campo está ausente devuelve el valor falso

A(vxx) ||Evalúa si el campo identificado con vxx está ausente en el registro de la base de datos y en caso positivo devuelve el valor verdadero. Si el campo está presente devuelve el valor falso

En ambos casos, Vxx significa "el campo cuya etiqueta es xx". El otro componente de una expresión booleana son los operadores, los cuales son los siguientes:

NOT (NO) Este operador produce el valor Verdadero, si su operando es Falso; y el valor Falso, si su operando es Verdadero. El operador NOT siempre se aplica a la expresión booleana que le sigue
AND (Y) Este operador produce el valor Verdadero si ambos operandos son Verdadero. Si cualquiera de los dos operandos es Falso, entonces el resultado será Falso
OR (O) Este operador realiza una operación O-inclusivo. El resultado es Verdadero si cualquiera de los dos operandos, o ambos son Verdadero. En caso contrario, es Falso.

Al evaluar expresiones booleanas, y en ausencia de paréntesis, CDS/ISIS ejecutará las operaciones NOT en primer lugar, después las operaciones AND, y finalmente las OR. Las series de dos o más operadores del mismo nivel, se ejecutan de izquierda a derecha. Se pueden usar paréntesis para alterar el orden de evaluación: las expresiones dentro de paréntesis se evalúan antes, y las expresiones entre paréntesis internos a otros, son evaluadas antes que las expresiones externas a los paréntesis.