6



                          SECCION 4. LENGUAJE DE FORMATEO  
                                       parte b
          _________________________________________________________________

          G. Funciones

          Una funci¢n eval£a un valor (llamado el valor de la  funci¢n o el
          valor regresado),  que es entonces substituido en el lugar  de la
          funci¢n en el c lculo de la expresi¢n. Las funciones pueden tener
          uno o m s argumentos, que deben ser suministrados por el usuario,
          y que son usados en la evaluaci¢n del valor de la funci¢n. Por lo
          tanto, el valor de la funci¢n depende del valor de los argumentos
          que   se  suministren.   Estos  argumentos  se   encierran  entre
          parntesis, y se separan con comas.

          Los argumentos pueden ser de tres tipos:

          formato:  un  formato de  CDS/ISIS,  que puede contener cualquier
              comando de formateo, excepto la funci¢n REF (ver "REF (expre-
              si¢n,  formato)"  en la p g. ). Cuando se usa un formato como
              argumento,  se  pasa a la funci¢n el  texto resultante  de la
              ejecuci¢n del formato, y no el formato mismo.

          expresi¢n  numrica:  cuando se  usa una expresi¢n  numrica como
              argumento,  primero es evaluada,  y el valor  de la expresi¢n
              es pasado a la funci¢n.

          selector de campo:  un argumento que sea selector de  campo puede
              ser un comando de campo o  de subcampo;  no puede contener el
              comando de desplazamiento/longitud.

          Las funciones disponibles,  y los argumentos correspondientes- se
          describen a continuaci¢n,  clasificadas  de  acuerdo  al  tipo de
          valor que regresan.

          1. Funciones numricas

          a. VAL(formato)

          La  funci¢n VAL regresa el  valor numrico  de  su  argumento. El
          argumento formato es  un  formato de  CDS/ISIS,  y puede contener
          cualquier  comando   de  formateo  legal.   CDS/ISIS  ejecuta  el
          argumento  para  generar  una  cadena  de  texto.  Este  texto es
          entonces revisado de izquierda  a derecha hasta que  se encuentre
          un  valor  numrico  v lido  (que  puede  estar  representado  en
          notaci¢n  cient¡fica  exponencial).  La funci¢n VAL  regresa este
          valor  numrico,  convertido a su  representaci¢n  interna  de la
          m quina,  utilizable  para  realizar  c lculos.  Si  no  se  pudo
          identificar un valor numrico v lido, el valor regresado es cero.
          Si el texto contiene m s de un valor numrico, solo se regresa el
          primero. Por ejemplo, (suponiendo que v1^a=10, v1^b=20, y v2=30):






                                         65








          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
                   Formato                                 Valor
             -----------------------                      ---------
                  val('15.79')                             15.79
                  val(v1)                                  10
                  val(v1^a)                                10
                  val(v2)                                  30
                  val("19"v1^b)                            1920
                  val('xxxx7yyyy8zzzz')                    7
                  val('abs. 5.8e-4 ml'                     0.00058
                  val('agua')                              0
                  val('jul-ago 1985')                      0
          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

          N¢tese que el £ltimo ejemplo regresa 0  (y no 1985), debido a que
          CDS/ISIS  toma  el gui¢n  entre jul y ago,  como el inicio  de un
          valor numrico negativo,  y la 'a'  de ago como el  final; por lo
          tanto,  el  valor extra¡do  es  solo  '-',  que resulta en  0. Es
          entonces importante definir claramente  las reglas  de captura de
          datos para  aquellos  campos  o  subcampos  que  ser n  usados en
          c lculos numricos.

          b. RSUM(formato)

          La funci¢n RSUM regresa la suma  de uno o  m s valores numricos.
          El texto producido por el  argumento es  revisado  de izquierda a
          derecha,  al igual que en  la  funci¢n VAL,  y todos  los valores
          numricos que contiene son sumados entre s¡. El valor total de la
          suma ser  el valor de la funci¢n.  Los valores individuales deben
          ser  separados por  uno  o  m s  caracteres  no  numricos,  y es
          responsabilidad del  usuario insertar estos  separadores a travs
          del formato suministrado como  argumento.  RSUM puede usarse para
          calcular la suma de los valores numricos contenidos en todas las
          ocurrencias de un  campo repetible dado.  Por ejemplo (suponiendo
          que   el  campo   1   tiene  cuatro   ocurrencias  que  contienen
          respectivamente 1, 2, 3 y 4):

          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
                  Formato                         Valor
             --------------------                 -------
                  rsum('10,20,30')                   60
                  rsum(v1|;|)                        10
                  rsum(v1|,|,'48,3.5')               61.5
          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
           
          c. RMIN(formato)

          La  funci¢n RMIN  regresa el  valor m¡nimo  de uno  o m s valores
          numricos.  El  texto producido por el  argumento es  revisado de
          izquierda a derecha,  al igual que en la funci¢n VAL, y todos los
          valores numricos que contiene son extra¡dos. El valor algebr ico
          menor de  todos ellos ser   el  valor de la funci¢n.  Los valores
          individuales  deben ser separados por  uno  o  m s  caracteres no
          numricos,  y  es  responsabilidad  del  usuario  insertar  estos
          separadores a travs  del  formato  suministrado  como argumento.
          RMIN  puede  usarse  para  calcular  el  m¡nimo  de  los  valores


                                         66








          numricos  contenidos  en  todas  las  ocurrencias  de  un  campo
          repetible dado.  Por  ejemplo (suponiendo que  el  campo  1 tiene
          cuatro  ocurrencias que contienen respectivamente  10,  20,  30 y
          40):

                 Formato                                  Valor
             --------------------                        -------
                 rmin('1,2,-3')                           -3
                 rmin(v1|;|)                              10
                 rmin(v1|,|,'48,3.5')                     3.5
           
          d. RMAX(formato)

          La  funci¢n RMAX  regresa el  valor m ximo  de uno  o m s valores
          numricos.  El  texto producido por el  argumento es  revisado de
          izquierda a derecha,  al igual que en la funci¢n VAL, y todos los
          valores numricos que contiene son extra¡dos. El valor algebr ico
          m s grande  de  ellos ser   el  valor de la funci¢n.  Los valores
          individuales  deben ser separados por  uno  o  m s  caracteres no
          numricos,  y  es  responsabilidad  del  usuario  insertar  estos
          separadores a travs  del  formato  suministrado  como argumento.
          RMAX  puede  usarse  para  calcular  el  m ximo  de  los  valores
          numricos  contenidos  en  todas  las  ocurrencias  de  un  campo
          repetible dado.  Por  ejemplo (suponiendo que  el  campo  1 tiene
          cuatro  ocurrencias que contienen respectivamente  10,  20,  30 y
          40):

                  Formato                         Valor
             --------------------                 -------
               rmax('1,2,-3')                        2
               rmax(v1|;|)                           40
               rmax(v1|,|,'48,3.5')                  48
           
          e. RAVR(formato)

          La funci¢n RAVR regresa  el valor promedio (media  aritmtica) de
          uno o m s valores numricos.  El texto producido por el argumento
          es revisado de  izquierda a derecha,  al igual que  en la funci¢n
          VAL, y todos los valores numricos que contiene son extra¡dos. Se
          calcula entonces el valor promedio y se regresa como valor  de la
          funci¢n.  Los valores individuales deben ser separados por  uno o
          m s  caracteres  no  numricos,  y es responsabilidad del usuario
          insertar estos separadores a travs del formato suministrado como
          argumento.  RAVR puede usarse para calcular el valor  promedio de
          los valores numricos contenidos en  todas las ocurrencias  de un
          campo repetible dado. Por ejemplo (suponiendo que el campo 1 tie-
          ne cuatro ocurrencias que contienen respectivamente 10,  20, 30 y
          40):

                 Formato                              Valor
              -------------------                     -------
                  ravr('1,2,-3')                          0
                  ravr(v1|;|)                             25
                  ravr(v1|,|,'48,3.5')                    25.25




                                         67








          f. L(formato)

          La  funci¢n L usa el  texto producido por  el  argumento  como un
          trmino de b£squeda en el archivo invertido, y regresa el MFN del
          primer  apuntador (posting),  en  caso  de que lo haya.  Antes de
          buscar  en  el  archivo  invertido,   el  termino  es  convertido
          autom ticamente a may£sculas. Si no se encuentra el trmino en el
          archivo invertido,  el valor de la funci¢n es cero.  la funci¢n L
          se  usa normalmente en  forma conjunta  con la  funci¢n REF, para
          implementar     la     b£squeda    en     tablas     (ver    bajo
          "REF(expresi¢n,formato)"  en la p g.   para ejemplos sobre el uso
          de la funci¢n L).

          N¢tese que el  formato  presentado  como  argumento  es ejecutado
          usando el  modo  de despliegue activo  (ver "Comando MODO"  en la
          p g.  ).  Esto es importante, ya que el uso de un modo incorrecto
          puede  ocasionar que no  se  localice  el  trmino en  el archivo
          invertido.  Como regla general,  debe  utilizarse  el  mismo modo
          usado en la FST del archivo invertido.

          2. Funciones de cadena

          Las  funciones de  cadena  pueden usarse tanto como  operandos de
          expresiones de cadena,  como comandos de formateo. Cuando se usan
          como comando,  el  valor de  la  funci¢n ser   formateado como si
          fuera un campo en el registro.

          a. F(expr-1,expr-2,expr-3)

          La funci¢n F convierte un  valor  numrico  de  su representaci¢n
          interna en punto flotante  a una cadena  de  caracteres. Los tres
          argumentos  son  expresiones  numricas.   El  primer  argumento,
          expr-1,  es  el  n£mero  a ser convertido.  El segundo argumento,
          expr-2  es el ancho m¡nimo de  la salida,  y el tercer argumento,
          expr-3 es el n£mero de posiciones decimales.

          El segundo y  el  tercer  argumento  son  opcionales.  N¢tese sin
          embargo que expr-2 no puede omitirse si expr-3 est  presente.

          expr-2 indica el ancho m¡nimo, o sea, el valor de la funci¢n ser 
          una cadena de caracteres de cuando menos expr-2  caracteres, y si
          el valor numrico convertido requiere expr-2  caracteres o menos,
          ser  ajustado a la derecha dentro de este ancho.  Si el n£mero de
          caracteres  requeridos  para  representar el  valor de  expr-1 es
          mayor que el  ancho especificado,  CDS/ISIS usar   las posiciones
          adicionales que hagan falta.  En  este caso,  la cadena de salida
          ser  de longitud mayor a expr-2 caracteres.

          expr-3  define el n£mero de posiciones decimales. Si se omite, el
          resultado estar  en notaci¢n cient¡fica exponencial, y si tambin
          se omiti¢ expr-2, se usar  un ancho impl¡citamente definido de 16
          caracteres.   Si  se  halla  presente,   el  resultado  ser   una
          representaci¢n redondeada,  en punto fijo  de  expr-1, con expr-3
          d¡gitos  a la  derecha del  punto  decimal.  Si  expr-3  es cero,
          entonces  expr-1  es  primero  redondeado  hasta  el  entero  m s
          pr¢ximo, y se genera la salida como entero, sin punto decimal.


                                         68









          Para los procesos de conversi¢n de punto fijo y  de conversi¢n de
          enteros,  si la parte entera del n£mero es demasiado  grande para
          ser  representada,  la salida  ser  reemplazada por  una serie de
          asteriscos (*).

          La funci¢n F puede ser usada para alinear una columna  de n£meros
          por la  posici¢n  de  su  punto decimal,  seleccionando  el ancho
          adecuado.

          A continuaci¢n se presentan ejemplos de la funci¢n F.

                  Formato                         Valor
                 -------------                ---------------
                  f(1)                    1.000000000E+00
                  f(1,10)                 1.000E+00
                  f(-1,10,2)              -1.00
                  f(1,5,2)                1.00
                  f(1,8,2)                1.00
                  f(mfn,1,0)              4
                  f(mfn,2,0)              4
                  f(mfn,3,0)              4
           
          b. REF(expresi¢n,formato)

          La funci¢n REF permite extraer datos de  un  registro alterno del
          archivo  maestro.  El primer argumento es  una expresi¢n numrica
          que aporta el MFN del registro alterno a ser  seleccionado,  y el
          segundo  argumento es  el  formato que debe  ser  aplicado  a ese
          registro.  Si el valor de expresi¢n no corresponde con el  MFN de
          un registro existente en la base de datos, entonces REF producir 
          una cadena vac¡a (o sea ninguna salida). El proceso realizado por
          la funci¢n REF se representa en la figura 18,  donde se supone el
          registro que se est  formateando es el 1.

          Como  puede  verse  en  este  ejemplo,   la  funci¢n  REF  es  un
          instrumento  muy poderoso,  ya que permite  juntar  datos  que en
          realidad est n guardados en  registros diferentes  de  la base de
          datos,  y  los  hace  aparecer  al  usuario  como  si  estuvieran
          guardados  en  el  mismo registro.  En este  primer  ejemplo, los
          registros 1  y 98 est n ligados por la especificaci¢n en el campo
          4  del registro 1, del MFN del registro asociado, que contiene el
          nombre del pa¡s en ingls y en espa¤ol.  A travs  del formato se
          puede  entonces  seleccionar  cualquiera  de  los   dos  idiomas,
          simplemente  especificando la  etiqueta relevante  en el registro
          asociado.

          En algunos casos,  la liga entre los registros por medio  del MFN
          puede ser inconveniente desde el punto de vista de la  captura de
          atos.  Adem s del hecho de que cualquier error de  tecleo del MFN
          el  registro  asociado   ocasionar    el   despliegue   de  datos
          ncorrectos,  puede  requerirse  tiempo  para  determinar  el  MFN
          orrecto en cada caso.  En el caso presentado en la figura  18 por
          jemplo, es posible que el documento fuente del que se obtienen os
          datos ya contenga  un c¢digo normalizado del pa¡s  ('UK'  en este
          ejemplo).  El uso del MFN como  liga  al registro del  pa¡s puede


                                         69








          entonces requerir una consulta  a un  listado,  o una b£squeda en
          la  base  de  datos  para  descubrir  que  el  MFN  del  registro
          correspondiente a 'UK'  es  el  98;  ser¡a  mucho m s conveniente
          poder indicar 'UK'  en lugar de '98'.  Esta posibilidad existe, y
          puede  lograrse  el  mismo resultado mostrado  en  la  figura 18,
          organizando la base de datos de  modo tal  que pueda aprovecharse
          la funci¢n L (ver bajo "L(formato)").


           ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
           -- MFN 1 ---------------------------+
            |                                   |
            | Etq     Contenido                 |
            | ---  ---------------------------- |
            |   1  Institute for social welfare |
            |   2  5 Delaware Street            |
            |   3  Kensington                   |
            |   4  98                           |
            --------|----------------------------
                    |
                    ---- el campo 4 liga estos registros
                                                    |
                                                    v
           
                                           -- MFN 98 -----------------
                                            |                         |
                 ------- el registro 98 --> | Etq     Contenido       |
                 |       es leido           | ---  ------------------ |
                 |                          |  10  UK                 |
              val(v4)=98          -----------> 11  United Kingdom --  |
                 |                |         |  12  Reyno Unido     |  |
                 |                |         -----------------------|---
                 |                |                                |
                 |                -- v11 se refiere al --          |
                 |                   registro 98        |          |
                 |                                      |          |
                 --- la funci¢n REF usa la              |          |
                     liga en campo 4 ------------       |          |
                                                |       |          |
                 Formato:     mpl,v1/v2/v3/ref(val(v4),v11)        |
                                                                   |
                 Salida:      Institute for social welfare         |
                              5 Delaware Street                    |
                              Kensington                           |
                              United Kingdom <----------------------

                 Formato:     mpl,v1/v2/v3/ref(val(v4),v12)

                 Salida:      Institute for social welfare
                              5 Delaware Street
                              Kensington
                              Reyno Unido
                 Formato:     ref(val(v4),v10)
                 Salida:      UK
          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
          Figura 18


                                         70








          La  funci¢n L encuentra el  MFN que corresponde a  un  trmino de
          b£squeda.  Puede  entonces  usarse  para convertir  una cadena de
          caracteres (como 'UK')  a un MFN.  Para poder usar  la funci¢n L,
          debe  establecerse  una  relaci¢n  £nica  entre  una   cadena  de
          caracteres y el MFN correspondiente.  El archivo invertido provee
          este  mecanismo (ver  "Archivo invertido"  en la p g.  ). En este
          ejemplo por lo tanto,  ser¡a suficiente con invertir  el campo 10
          de  los registros de  'pa¡s'  para establecer una  relaci¢n £nica
          entre el c¢digo del pa¡s y el MFN correspondiente (n¢tese  que el
          concepto de £nico es importante,  ya que la funci¢n L  supone que
          la  llave  que  est   buscando  tiene  uno  y  solo  un apuntador
          (posting). Es responsabilidad del dise¤ador del sistema hacer que
          esta relaci¢n sea £nica,  utilizando en caso necesario un prefijo
          de b£squeda como se indica en "FST  para inversi¢n"  en la p g. .
          La figura 19 ilustra esta tcnica. Se supone aqu¡ que el campo 10
          de los registros de 'pa¡s' se invierte con el prefijo 'CC='.

          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
            __ MFN 1 ____________________________
            |                                   |    FST para inversi¢n
            | Etq     Contenido                 |    ------------------
            | ---  ---------------------------- |    .
            |   1  Institute for social welfare |    .
            |   2  5 Delaware Street            |    10  0 "CC="v10
            |   3  Kensington                   |    .
            |   4  UK                           |
            |_______|___________________________|
                    |
                    |    el campo 4 aporta una liga l¢gica entre el
                    |    registro 1 y el registro 98
                    v         ---------------------|
            _________________ |                    v
            |               | |             __ MFN 98 _________________
            |Arch. invertido| |             |                         |
            |_______________| |             | Etq     Contenido       |
            |               | |             | ---  -------------------|
            |               | |             |  10  UK                 |
            |               | |   -----------> 11  United Kingdom --  |
            | CC=UK  98 -------   |         |  12  Reyno Unido     |  |
            |               |     |         |______________________|__|
            |               |     |                                |
            |_______________|     -- v11 se refiere al -----       |
                 ^                   registro 98           |       |
                 |                                         |       |
                 --- la funci¢n L busca -----------        |       |
                     'CC=UK'                      |        |       |
                                                  |        |       |
                 Formato:     mpl,v1/v2/v3/ref(l("CC="v4),v11)     |
                                                                   |
                 Salida:      Institute for social welfare         |
                              5 Delaware Street                    |
                              Kensington                           |
                              United Kingdom <----------------------

                 Formato:     mpl,v1/v2/v3/ref(val(v4),v12)



                                         71








                 Salida:      Institute for social welfare
                              5 Delaware Street
                              Kensington
                              Reyno Unido

                 Formato:     ref(val(v4),v10)

                 Salida:      UK
          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
          Figura 19

          CDS/ISIS no hace supuestos acerca de la naturaleza de la relaci¢n
          existente entre dos registros.  Simplemente  provee  un mecanismo
          para  ligar registros.  Una implementaci¢n particular normalmente
          ofrecer  al usuario el significado de la relaci¢n a  travs de un
          uso adecuado del lenguaje de formateo  y de  un dise¤o espec¡fico
          de la  base de datos.  Por ejemplo,  si un registro bibliogr fico
          debe estar ligado al registro de un proveedor y a  un registro de
          un usuario que ha  pedido prestado el  documento correspondiente,
          se deben usar  dos campos  diferentes  para guardar  las ligas al
          proveedor  y  al  usuario   para  poder   reflejar  la  diferente
          naturaleza de estas relaciones.

          N¢tese adem s que, como el segundo argumento de la funci¢n REF es
          un formato, es posible usar esta funci¢n en forma recursiva, para
          establecer relaciones  jer rquicas de orden  superior, tales como
          las que se requerir¡an para desplegar  las relaciones jer rquicas
          de un tesaurus.

          En un formato pueden usarse tantas  referencias a la  funci¢n REF
          como  se desee,  siempre y cuando el  l¡mite de salida  (o sea el
          tama¤o  del  rea  de  trabajo)  no  sea excedido.  Este l¡mite es
          actualmente de 8000 caracteres. N¢tese que esta limitaci¢n es una
          restricci¢n  de  implementaci¢n,  m s  que  una  restricci¢n  del
          lenguaje de formateo.

          c. S(formato)

          La funci¢n S regresa el texto producido por su argumento. Como se
          indic¢ antes,  CDS/ISIS no cuenta con operadores  impl¡citos para
          expresiones de  cadenas.  La funci¢n S sin  embargo, puede usarse
          para  realizar  una concatenaci¢n de  cadenas. Es particularmente
          £til en expresiones booleanas,  donde puede usarse  para realizar
          un OR impl¡cito,  que es m s eficiente (y m s conciso) que el uso
          de  un  operador  OR  expl¡cito.   Por  ejemplo,  las  siguientes
          expresiones booleanas:

          s(mdl,v10,v20,v30) : 'agua'
          v10 : 'agua' or v20 : 'agua' or v30 : 'agua'

          son equivalentes (ambas son Verdadero si cualquiera de los campos
          10,  20,  o  30  contienen la  cadena  'agua'),  pero  la primera
          ejecutar  m s r pidamente que la segunda.





                                         72








          d. Llamadas de formato

          En  un  formato se  pueden  invocar programas de  CDS/ISIS Pascal
          escritos  por el  usuario para  realizar  funciones especiales de
          formateo requeridas por alguna aplicaci¢n en particular, y que no
          podr¡an  lograrse  de  otra  manera  a  travs  del  lenguaje  de
          formateo.  Estos  programas  se  denominan  llamadas  de  formato
          (format exits).  Como las llamadas  de  formato son desarrolladas
          para satisfacer necesidades espec¡ficas,  su  descripci¢n se sale
          del  mbito del lenguaje de formateo. CDS/ISIS sin embargo, provee
          una forma normalizada de realizar la interfase entre las llamadas
          de formato y el lenguaje de formateo.

          Desde el punto de vista del lenguaje de formateo,  una llamada de
          formato  es  una funci¢n  de  cadena  con  un  argumento  de tipo
          formato. El argumento es ejecutado y despus se pasa el resultado
          a  la  funci¢n.  La  llamada de  formato  regresa  una  cadena de
          caracteres  que  CDS/ISIS  maneja  como  si  fuera  un  campo del
          registro que se est  formateando.

          Desde el  punto de  vista  de  CDS/ISIS  Pascal,  una  llamada de
          formato es un programa  definido con el atributo  [FORMAT] (vase
          el  manual  de CDS/ISIS Pascal  para mayores  detalles). Antes de
          poderse referir a una llamada de formato dentro de un formato, el
          programa correspondiente debe haberse compilado con xito.

          Las llamadas de formato se invocan del modo siguiente:

          &nombre(formato)                     donde:

          &   identifica que  se trata de la  invocaci¢n de una  llamada de
          formato;

          nombre es el nombre del programa CDS/ISIS Pascal a ser ejecutado;
          formato es el argumento.

          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
                -------------- Llamada de formato ------------------
                |  Program MUESTRA(arg: string; lw,occ: real; str: |
                |                  string)[FORMAT];                |
                |  begin                                           |
                |  str:=arg;                                       |
                |  end.                                            |
                ----------------------------------------------------

               Formato                       Salida
               --------------------------    ----------------------------
               &muestra('xxx')               xxx
               &muestra(v26^a)               Par¡s
               &muestra(mhl,v24)             An Electric hygrometer apparatus for measuring
                                             water-vapour loss from plants in the field.

          &muestra(mhu,v24)(0,5)        AN ELECTRIC HYGROMETER APPARATUS FOR MEASURING
                                        WATER-VAPOUR LOSS FROM PLANTS IN THE FIELD.
          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
          Figura 20


                                         73









          Puede  a¤adirse  a  una  llamada  de  formato,  opcionalmente, un
          comando de sangr¡a (ver "Comando SANGRIA" em la p g. ), mismo que
          CDS/ISIS aplicar  a la cadena de salida. La figura 20 presenta un
          ejemplo  de  una llamada de  formato,  que simplemente regresa el
          argumento como valor de la funci¢n.

          3. Funciones booleanas

          a. P(selector de campo)

          La funci¢n P (presente), regresa Verdadero (True), si el registro
          que se est  formateando contiene cuando menos  una ocurrencia del
          campo o subcampo indicado por el argumento. Por ejemplo:


                    Formato               Valor
                  ------------            -------
                  p(v24)                  Verdadero
                  p(a24^d)                Falso
                  p(v80)                  Falso

          b. A(selector de campo)

          La funci¢n A (ausente),  regresa Verdadero (True), si el registro
          que se est  formateando no contiene ninguna ocurrencia  del campo
          o subcampo indicado por el argumento.

          N¢tese que la ausencia de un campo implica la  ausencia  de todos
          sus subcampos.  Por lo tanto,  si el selector de campo especifica
          un subcampo,  la funci¢n A regresa Verdadero ya sea  que el campo
          est presente y  el subcampo ausente,  o que el  campo mismo est
          ausente. Por ejemplo:

                           Formato                Valor
                          ------------            -------
                          a(v24)                  Falso
                          a(v24^s)                Verdadero
                          a(v26^d)                Verdadero
                          a(v80)                  Verdadero

          H. 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  formateando.

          Se codifica del modo siguiente:

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

          donde:

          condici¢n  es una expresi¢n  booleana definida de  acuerdo con lo
          indicado bajo "Expresiones booleanas" en la p g. ;



                                         74








          formato-1 es un formato de CDS/ISIS que ser  ejecutado si, y solo
          si la expresi¢n booleana es Verdadero;

          formato-2 es un formato de CDS/ISIS que ser  ejecutado si, y solo
          si la expresi¢n booleana es Falso.

          La cl usula ELSE formato-2  es opcional y puede  ser omitida. Las
          palabras  clave IF,  THEN y FI  son siempre  obligatorias, aunque
          formato-1 puede ser omitido cuando sigue una cl usula ELSE (p.ej.
          cuando no  debe  imprimirse  nada  en  caso de que  condici¢n sea
          Verdadero).  El comando IF por lo  tanto,  puede tomar una de las
          formas alternas siguientes:

          IF condici¢n THEN formato-1 FI
          IF condici¢n THEN 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 parntesis). Por ejemplo:

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

          El comando IF es  particularmente £til  para desarrollar formatos
          generalizados  para  bases  de  datos  integradas,  que contienen
          marcas distintivas para cada tipo de registro (t¡picamente, habr 
          un  campo que  contenga  un  c¢digo  que  identifica  al  tipo de
          registro).  Por lo tanto, al verificar el tipo de registro con un
          comando IF,  se puede realizar  con un  solo  formato el formateo
          espec¡fico  para  cada  tipo de registro.  Un ejemplo de  esto se
          presenta  en la figura  21,  para una base de datos  que contiene
          registros de instituciones y de investigadores.

          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
            -- MFN 1 ------------------  -- MFN 2 ---------------------
            | Etq Contenido           |  | Etq Contenido              |
            | --- ------------------  |  | --- ---------------------- |
            |   1 INST                |  |   1 PERS                   |
            |  11 Instituto de la Paz |  |  21 ^aPrez^bJos^cIng.    |
            |  12 Calle Luna 12       |  |  22 45-11-23               |
            |  13 San Jos            |  |  23 <Qu¡mica><F¡sica>      |
            |  14 Costa Rica          |  |  24 1                      |
            ---------------------------  ------------------------------


            Formato:    v1,'-',f(mfn,1,0) / mdl,
                        if v1='INST' then v11/v12(4,4)/v13(4,4)/v14(4,4)/
                        else v21^c" ",v21^b" ", v21^a" "/"Fecha de
          nacimiento: "v22*6.2,


                                         75








                        '.',v22*3.2,'19'v22.2/"Areas de inters:
          "v23/"Trabaja en: "/d24,
                       
          ref(val(v24),v11(4,4)/v12(8,8)/v13(8,8)/v14(8,8)/)fi


            Salida (al formatear el registro 1):

              INST-1
              Instituto de la Paz
                  Calle Luna 12
                  San Jos
                  Costa Rica

            Salida (al formatear el registro 2):

              PERS-2
              Ing. Jos Prez
              Fecha de nacimiento: 23.11.1945
              Areas de inters: Qu¡mica; F¡sica
              Trabaja en:
                  Instituto de la Paz
                      Calle Luna 12
                      San Jos
                      Costa Rica
          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
          Figura 21

          I. Grupos repetibles

          Un  grupo  repetible  consiste  de  un  conjunto  de  comandos de
          formateo  encerrados  entre parntesis.  El  significado  de cada
          comando es el mismo que se  ha  descrito,  excepto que los campos
          repetibles son manejados en forma especial.

          Con  objeto  de  entender  el  concepto de grupos  repetibles, es
          necesario  primero  conocer  como  maneja   CDS/ISIS  los  campos
          repetibles.  En  ausencia  de otras  indicaciones, CDS/ISIS trata
          todas las ocurrencias de un campo  repetible (en el  orden en que
          fueron capturadas), como una sola cadena de texto.

          Un  grupo repetible altera  la  forma en  que  CDS/ISIS manejar¡a
          normalmente  las ocurrencias de  un  campo  repetible, procesando
          cada ocurrencia a la vez,  en lugar de hacerlo con  todas juntas.
          Este proceso puede visualizarse como se muestra en la figura 22.

            Sin usar grupo repetible:

                        ----------  repite para cada ocurrencia
                        |        |
                        V        |
              ------------> v70  ---------/---> continua la ejecuci¢n
                       ^          ^             del formato despus de
                       |          |             la £ltima ocurrencia
                       ------------
                            |


                                         76








                            |
             Las literales repetibles, si las hay,
             son procesadas para cada ocurrencia

            Usando un grupo repetible:

              -- repite para cada ocurrencia --
              |                               |
              V                               |
              ( . . . . . . v70 . . . . . . . )-> continua la ejecuci¢n
                                                  del formato despus de
                                                  la £ltima ocurrencia

             Figura 22

          Cuando  CDS/ISIS  encuentra  el  parntesis  que  abre  un  grupo
          repetible, procede del modo siguiente:

          1. Se inicializa a 1 un contador de ocurrencias.

          2.  El formato encerrado entre parntesis se ejecuta  entonces de
          tal modo que todos los selectores de campo dentro  del grupo solo
          generen  la ocurrencia del campo que corresponde  al  contador de
          ocurrencias actual.

          3.  Si no se gener¢ ninguna salida (p.ej., ya no hubo ocurrencias
          de ning£n campo repetible indicado dentro del grupo), entonces se
          termina el  proceso del grupo repetible.  En  caso  contrario, se
          incrementa  en  1  el contador  de ocurrencias,  y se repiten los
          pasos 2 y 3.

          N¢tese  que todos los comandos  de  formateo  dentro  de un grupo
          repetible son procesados para cada ocurrencia, una a una (como se
          explic¢ antes), incluyendo por lo tanto, campos a los que se hace
          referencia  en  comandos IF,  en expresiones y  en funciones, as¡
          como en funciones de cadena usadas como comandos.

          Debido al  proceso recin  explicado,  no  deben usarse literales
          incondicionales  dentro  de  grupos repetibles (si se  hace esto,
          estas literales ser n  incluidas en la salida  una vez m s  de lo
          que se deber¡a esperar).

          En la  mayor¡a de  los casos,  el  uso  de  comandos  de formateo
          simples,  tal como el comando de modo o  literales repetibles, es
          suficiente para manejar adecuadamente campos repetibles,  como se
          muestra en los ejemplos siguientes:

                   Formato                 Salida
                ------------        -------------------------
                  mpl,v70         Grieve, B.J.Went, F.W.
                  mdl,v70         Grieve, B.J.  Went, F.W.
                  v70+|; |        Grieve, B.J.; Went, F.W.
           





                                         77








          Existen  casos sin embargo,  en  los  que  se  necesita formatear
          campos repetibles  de  otras maneras.  Un  caso  frecuente es por
          ejemplo,  la necesidad de formatear cada ocurrencia  en una nueva
          l¡nea,  lo que solo puede hacerse usando un  campo repetible, tal
          como se muestra:

                     Formato                  Salida
                    ------------     -------------------------
                    v70/v26^a        Grieve, B.J.Went, F.W.
                                     Par¡s

                    (v70/),v26^a     Grieve, B.J.
                                     Went, F.W.
                                     Par¡s
           
          En el primer caso,  el comando de  salto de l¡nea  (/) se ejecuta
          despus de formatear todas las ocurrencias del campo 70, mientras
          que en el segundo caso, se ejecuta despus de cada ocurrencia.

          El ejemplo  de  la  figura  23  muestra  el  manejo  de subcampos
          repetibles (suponiendo que el  registro  contiene dos ocurrencias
          del campo  20,  tal como se indica).  En este caso,  el uso de un
          grupo repetible ha servido para  desplegar en  forma adecuada los
          varios subcampos de cada ocurrencia  del campo repetible,  en una
          forma tabular.

          Contenido del registro:
          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
            20 ^aNew York^bMcGraw Hill^c1988
            20 ^aLondon^bAcademic Press^c1975

            Formato: /(v20^a, c11, v20^b, c30, v20^c/)

            Salida:  New York   McGraw Hill       1988
                     London     Academic Press    1975

            Formato: /v20^a, c11, v20^b, c30, v20^c/

            Salida:  New YorkLondon
                              McGraw HillAcademic Press
                                                  19881975
          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
          Figura 23

            Contenido del registro:
          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
            10 Bedford y Cia.
            20 Analista programador
            10 Consultores S.C.
            20 Programador de sistemas
            10 Universidad de Tabasco
            20 Profesor de computaci¢n

            Formato:  "EMPLEOS ANTERIORES"/#d10,(v10(4,4)/v20(8,8)/#)

            Salida:   EMPLEOS ANTERIORES


                                         78









                          Bedford y Cia.
                              Analista programador

                          Consultores S.C.
                              Programador de sistemas

                          Universidad de Tabasco
                              Profesor de computaci¢n

            Formato:  "EMPLEOS ANTERIORES"/d10,(c4,v10|: |,c30,v20/)

            Salida:   EMPLEOS ANTERIORES
                          Bedford y Cia.:           Analista programador
                          Consultores S.C.          Programador de sistemas
                          Universidad de Tabasco    Profesor de computaci¢n
          ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
          Figura 24

          Si se necesita incluir una literal antes de los  datos producidos
          por un grupo repetible, se puede usar una literal incondicional o
          condicional.  N¢tese  sin embargo,  que  si  se  usa  una literal
          condicional,  debe  estar asociada  con el selector de  campo (un
          grupo repetible no  es  un  selector  de  campo);  debe usarse un
          selector de campo virtual para este prop¢sito (ver la figura 24).

          Como ejemplo complementario de un grupo  repetible, sup¢ngase que
          en un registro de antecedentes personales el campo 10 contiene el
          nombre de la empresa donde ha  trabajado una persona,  y el campo
          20  contiene el  nombre  del puesto que  ocupaba cuando trabajaba
          para una empresa en particular.  En tal registro,  tanto el campo
          10  como el 20  ser¡an repetibles,  ya que una persona pudo haber
          trabajado  para m s de una compa¤¡a.  Este es  un caso en  el que
          existe una relaci¢n l¢gica entre dos campos repetibles. La figura
          24  muestra el uso de un grupo repetible para desplegar estos dos
          campos (tambin ilustra el uso de un selector de campo virtual).

          Los  grupos  repetibles  no  pueden  anidarse  (o  sea,  un grupo
          repetible no puede contener a otro grupo repetible),  a menos que
          el grupo interno est contenido en el argumento de formato de una
          funci¢n  REF.  Por lo tanto,  el ejemplo siguiente es  un formato
          v lido:

                          (v10, ref(val(v20),v10, (v20,v30)))

          mientras que el  siguiente es  inv lido y generar  un  mensaje de
          error:

                          (v10, (v20,v30))

          N¢tese que el uso de un grupo repetible es obligatorio cuando:

          1. se usa un campo repetible como argumento de la funci¢n L;

          2.  El primer argumento de la funci¢n  REF se refiere  a un campo
          repetible.


                                         79









          Debe tambin  considerarse  si  se  requiere  un  grupo repetible
          cuando se usa un campo repetible en  la expresi¢n  booleana de un
          comando IF.

          J. Comando de escape

          En  un  formato utilizado  para  impresi¢n,  es  posible insertar
          secuencias de escape para activar o desactivar  alguna funci¢n de
          la  impresora (tal  como  la  impresi¢n en  tipos  it licos  o en
          negritas),  por supuesto siempre y cuando la impresora responda a
          estas secuencias de escape.  Las secuencias de escape espec¡ficas
          a las que responde la impresora que se  utilice,  se describen en
          el  manual  de  la impresora  que suministr¢ el fabricante  de la
          misma.

          Un comando de escape se codifica del modo siguiente:

                          !/eee/

          donde:

          !               es el identificador de la secuencia de escape;

          /               es el delimitador de la secuencia de escape.
          Puede
                          ser cualquier caracter que no se presente en eee;

          eee             es la secuencia de escape que debe ser enviada a
                          la impresora. (CDS/ISIS en realidad enviar  a la
                          impresora <ESC>eee).

          Por ejemplo,  en  la  mayor¡a  de  las  impresoras,  el siguiente
          formato har  que el campo 24  sea impreso en negritas, y el campo
          44  en  letras  it licas  (el ejemplo tambin muestra  el  uso de
          diferentes delimitadores de la secuencia de escape):

                          !!E!,v24,!;F;,v70+|; |,!{4},v44,![5]

          Restricci¢n de implementaci¢n:  Para la salida a impresora, si se
          usan  comandos  de  escape  para seleccionar  diferentes tipos de
          letras (p.ej.  negritas, it licas, etc.), en general no se podr n
          generar columnas m£ltiples, a menos que el texto al que se aplica
          la secuencia de escape est totalmente contenido en una  l¡nea, y
          su  efecto  sea anulado antes  del  inicio  de  una  nueva l¡nea.
          Adem s,  no debe  seleccionarse un  tipo  de  letra con espaciado
          proporcional cuando se producen salidas en columnas m£ltiples. Si
          se hace esto,  el margen  izquierdo de la segunda l¡nea  y de las
          subsiguientes no se justificar  de manera adecuada.

          Nota para VAX y WANG:  Si se usa la versi¢n VAX o WANG, se pueden
          usar comandos de escape  en formatos que desplieguen  las salidas
          en la pantalla,  para desplegar los campos seleccionados  con una
          presentaci¢n particular, tal como alta intensidad, video inverso,
          subrayado,  etc.  La versi¢n para  IBM PC no soporta  comandos de
          escape para la salida en pantalla.


                                         80









          K. Errores de formateo

          Al  interpretar y ejecutar  un formato,  CDS/ISIS tambin realiza
          una verificaci¢n  de  la  sintaxis  del formato para asegurar que
          cumple con las reglas  del lenguaje  de  formateo.  Cada  vez que
          CDS/ISIS detecta un  error en  el formato,  detiene el formateo y
          presenta el mensaje ***Error de formato  n (donde n  es un c¢digo
          de error).  Para formatos de despliegue y de impresi¢n, cualquier
          salida generada antes de que se detecte el error, aparecer  antes
          del mensaje.  Esto,  junto  con el  mensaje de  error  ayudar  al
          usuario para identificar la parte err¢nea del formato.

          Los c¢digos de error previstos son los siguientes:

          1  Fin del formato,  encontrado  durante el  proceso de  un grupo
             repetible.  Probablemente falta  el  parntesis  de cierre del
             grupo.
          2  Grupo repetible anidado (o sea, un grupo repetible dentro de
             otro grupo repetible)
          8  Comando IF sin THEN
          19 Parntesis ( sin cerrar
          20 Parntesis  )  sin abrir.  Puede tambin ser  generado por un
             operando inv lido en una expresi¢n
          26 Los dos operandos de un operador son de diferente tipo (p.ej.
             intento de sumar un operando de cadena a un n£mero)
          28 El primer argumento suministrado a  la funci¢n REF  no es una
             expresi¢n numrica
          51 Demasiadas literales,  y/o comandos  condicionales asociados
             con un selector de campo
          53 Comando IF no terminado por FI
          54 Signo  +  fuera  de  contexto:  CDS/ISIS esperaba una literal
             repetible despus de un signo +
          55 FI sin el IF correspondiente
          56 Area de trabajo  excedida (overflow):  el formato produce una
             salida  demasiado grande  que  CDS/ISIS  no  puede manejar. El
             l¡mite del  rea de trabajo es de 8000 caracteres
          58 Uno  o m s argumentos  suministrados a la  funci¢n  F  no son
             expresiones numricas
          60 Una funci¢n que  no es de  cadena ha sido  usada como comando
             (solo las funciones de cadena pueden usarse como comandos)
          61 El argumento suministrado a la funci¢n A o a la funci¢n P, no
             es un selector de campo
          99 Comando desconocido (p.ej.  un  nombre  de  funci¢n  o  de un
             comando mal escrito):  puede tambin ser  generado debido a la
             falta de un delimitador al final de una literal
          101  Excedida la  capacidad del  stack  (overflow) (probablemente
               debido a una expresi¢n demasiado compleja)
          102  Intento de usar el stack antes de su inicio (underflow). 
               Puede ser debido a  la no correspondencia de  (si el formato
               est  correcto, indica un problema propio de CDS/ISIS)







                                         81








          L. Adiciones correspondientes a la versi¢n 2.32 [1]

          La versi¢n 2.32  (solo para  PC)  incluye los siguientes comandos
          del  lenguaje  de formateo,  que deber n usarse  solo en formatos
          para  impresi¢n.  En  otros  contextos  (p.ej.  en  una  FST para
          exportaci¢n), generan caracteres sin significado alguno.

                  NC(n)   Nueva columna
                  NP(n)   Nueva p gina

          La  parte '(n)'  es opcional.  Si est  presente,  el comando solo
          operar  si el n£mero de  l¡neas disponibles en la  columna actual
          (para NC), o en la p gina actual (para NP), es menor que n.

          Por  ejemplo,  NP  producir  un  salto  incondicional  de p gina,
          mientras que NP(4) solo generar  una nueva p gina si hay menos de
          4 l¡neas disponibles en la p gina actual.

          ------------
          (1)  Esta secci¢n ha sido a¤adida por el  traductor en  base a la
          informaci¢n contenida en los disketes de la versi¢n  2.32. Por lo
          tanto solo es de car cter informativo y provisional.  La informa-
          ci¢n oficial se incluir  una  vez que est  disponible la versi¢n
          actualizada del manual en ingls (N. del T.).


































                                         82




: