Formatos de salida que integran la información de bases de datos relacionadas

From ABCD Wiki
Revision as of 14:42, 24 November 2013 by Guilda (talk | contribs)
Jump to: navigation, search

A través de un campo de relación (número de control), es posible crear una estructura que relacione registros provenientes de varias bases de datos. Este es el esquema adoptado por ABCD para la relación entre un registro bibliográfico y sus copias, las copias con su disponibilidad en préstamo y los usuarios y sus transacciones (ver el esquema de las Relaciones entre bases de datos en los procesos de gestión de ABCD).

Para desarrollar nuestro ejemplo, supongamos que deseamos obtener este tipo de salida: 700px|centro|link=|border En forma esquematica la relación entre el catálogo, sus copias y las copias habilitadas para préstamo, es la siguiente: centro|link=|border

Esto significa, que un registro en el catálogo bibliográfico puede tener muchos registros en el archivo de copias y a su vez un solo registro en el archivo de copias hablitadas para préstamo. Por lo cual, para producir nuestra salida, desde la base de datos bibliográfica tenemos que hacer una lectura de los registros relacionados en copias y también una lectura de los registros habilitados para préstamo. Todo esto utilizando el número de control de la copia que representa el campo de relación entre las distintas estructuras.

  • Como desde la base de datos bibliográfica (biblo en nuestro ejemplo) queremos acceder las bases copies y loanobjects tenemos que agregar en biblo.par los caminos de acceso a las bases que vamos a relacionar:
       copies.*=%path_database%copies/data/copies.*
       loanobjects.*=%path_database%loanobjects/data/loanobjects.*
       Esto también puede solucionarse definiendo en la carpeta par el archivo syspar.par 
       donde se pueden colocar los recursos compartidos entre todas las bases de datos

Teoría: (ver: Manual del lenguaje de formatos del CISIS

La función que provee el lenguaje de formateo de Isis para relacionar bases de datos es la siguiente:

         ref(mfn, format) 
         ref([master file]mfn, format) 
   
         ref(<expr>,<format>)     
         ref([<format dbname>]<expr>,<format>) 
   

Definición: Ejecuta <format> en el registro seleccionado mediante <expr>. Si se indica <format dbname> se puede referenciar a otra (o la misma) base de datos

Ejemplos:

         ref(l(v3),v1/,v2/,v3/),     
         if ref(['account']l(['user']v2),v4)='active' then |Name: |v10/, fi,     
         (if p(v99) then ref([v99]1,v30/), fi), 

La función REF expresada en la forma:

         ref(mfn, format) 
         ref([master file]mfn, format) 

Relaciona bases de datos utilizando el MFN como campo de relación, es decir, accede el registro relacionado a través de su MFN.

Para extender el alcance de las relaciones entre registros, también se provee la opción de definir una relación utilizando las claves de la lista invertida. Esta forma de relación equivale a:

  • Suministrar una expresión de búsqueda para localizar registros en la base de datos relacionada
  • Ejecutar la búsqueda y obtener el MFN del primer registro que cumple con la condición establecida en la expresión
  • Leer el registro a través del MFN recuperado en el paso anterior

La función 'L permite localizar registros a través de la lista invertida

         l(key) 
         l([inverted file],key)     
   
         l(<format key>)     
         l([<format ifname>]<format key>) 

Definición

Regresa el MFN del primer posting (si lo hubiera) usando la clave generada por el formato <format key> para buscar en el archivo invertido actual. Puede también buscar en otro archivo invertido cuyo nombre se indica mediante el formato <format ifname>. Ejemplo:

         if l(v15)<> 0 then |Term: |v15, fi,   

Fin de la teoría

Combinando la función L con la función REF podemos hacer búsquedas de registros relacionados utilizando expresiones de búsqueda

         REF([base-de-datos] L([archivo invertido],expresion),Formato de despliegue) 

donde,

base-de-datos: base de datos relacionada

archivo invertido: archivo invertido relacionado

expresion: expresión de búsqueda a aplicar sobre el archivo invertido relacionado

formato de despliegue: formato a aplicar sobre el primer registro recuperado desde la base de datos relacionada

Ahora bien, según establece la teoría, la función L recupera solo el mfn del primer registro localizado a través de la expresión de búsqueda suministrada, y en la relación entre la base bibliográfica y sus copias tenemos que un registro bibliográfico puede relacionarse con varios registros en la base de datos de copias.


Ante esta situación, ABCD generó su propia forma de acceso a las relaciones de este tipo, incluyendo en la pft, como preliteral incondicional, el siguiente comando:

         /'$$REF:Base_de_datos, Formato, Expresion de búsqueda'/

donde:


Base_de_datos: Nombre de la base de datos a relacionar, Formato: Formato a aplicar sobre los registros relacionados Expresion de búsqueda: Expresión de búsqueda a aplicar sobre Base_de_datos para obtener los registros relacionados


ABCD analizará la salida obtenida al recuperar el registro bibliográfico y al encontrar la cadena $$REF: revisará el resto de la línea para:

  • aplicar la expresión de búsqueda sobre la base de datos a relacionar
  • obtener los registros localizados y aplicarles el formato suministrado
  • presentar el resultado como parte de la salida del registro bibliográfico


La expresión mencionada ($$REF:) debe suministrarse tal y como se detalla, ya que los valores separados con coma son elementos clave para la ejecución del proceso de relación en sustitución del REF normal que provee el lenguaje de formatos del CISIS. Por ello, si insertamos en nuestro formato de despliegue

          if npost(['copies'],'CN_biblo_'v2)>0 then
              '<p><dd><dd><dd>
              <table border=1>
                <tr>
                  <td colspan=6 bgcolor=#ffffff><b>Total ejemplares</b>:'                
                      f(npost(['copies'],'CN_biblo_'v2),1,0)
                 '</td>
                </tr>
                <tr>
                    <th>No. control</th>
                    <th>Inventario</th>
                    <th>Situación</th>
                    <th>Biblioteca princ.</th>
                    <th>No. copia</th>
                    <th>Disp.préstamo</th>'/   
                   /'$$REF:copies,inven,CN_biblo_'v2/
                 '</tr>
              </table>'
           fi,

En el despliegue del registro bibliográfico obtendremos la información de las copias a través de la lectura de la base de datos copies y aplicando el formato inven.pft sobre los registros recuperados.


El formato inven.pft debe existir en la carpeta pfts de la base de datos copias (tomando en cuenta el lenguaje activo) y como se está accediendo desde de la base de datos bibliográfica (biblo), debe estar incorporado en el archivo biblo.par o en el archivo syspar.par al igual que el camino de acceso hacia la base de datos copies:

         inven.pft=%path_database%copies/pfts/es/inven.pft
         copies.*=%path_database%copies/data/copies.*

inven.pft tiene el siguiente detalle:

          '<tr>
              <td valign=top bgcolor=#ffffff>'v1
                 if a(v1) then ' ' fi,
              '</td>'/
              '<td valign=top bgcolor=#ffffff>'v30
                  if a(v30) then ' ' fi,'</td>'/
              '<td valign=top bgcolor=#ffffff>'
                   if p(v200) then | |v200^a,| |v200^b,fi
                 if a(v200) then ' ' fi,
              '</td>'/
              '<td valign=top bgcolor=#ffffff>'
                  v35
                  if a(v35) then ' ' fi,
              '</td>'/
              '<td valign=top bgcolor=#ffffff>'
                  v63
                  if a(v63) then ' ' fi,
              '</td>'/
              ,e1:=val(v30),
              if npost(['loanobjects'],'CN_'v10'_'v1)=0 then
                 '<td align=center bgcolor=#ffffff> </td>'
              else
                 ref(['loanobjects']l(['loanobjects'],'CN_'v10'_'v1),
                 (if p(v959) and val(v959^i)=e1 then proc('a9999~1~'),
                    '<td align=center bgcolor=#ffffff>'
                        v959^o
                    '</td>' 
                  fi/)
                  if a(v9999) then '<td align=center bgcolor=#ffffff> </td>' fi
                )
              fi