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

From ABCD Wiki
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 préstamos de ABCD con la base de datos de copias).

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

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><font face=arial size=2>'v1
                 if a(v1) then ' ' fi,
              '</td>'/
              '<td valign=top bgcolor=#ffffff><font face=arial size=2>'v30
                  if a(v30) then ' ' fi,'</td>'/
              '<td valign=top bgcolor=#ffffff><font face=arial size=2>'
                   if p(v200) then | |v200^a,| |v200^b,fi
                 if a(v200) then ' ' fi,
              '</td>'/
              '<td valign=top bgcolor=#ffffff><font face=arial size=2>'
                  v35
                  if a(v35) then ' ' fi,
              '</td>'/
              '<td valign=top bgcolor=#ffffff><font face=arial size=2>'
                  v63
                  if a(v63) then ' ' fi,
              '</td>'/
              ,s1:=s(mhu,v30,mpl) ,
              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 s(mhu,v959^i,mpl)=s1 then proc('a9999~1~'),
                    '<td align=center bgcolor=#ffffff><font face=arial size=2>'
                        v959^o
                    '</td>' 
                  fi/)
                  if a(v9999) then '<td align=center bgcolor=#ffffff> </td>' fi
                )
              fi

Ver: Tabla de definición de campos de la base de datos copies

El campo v30 contiene el número de inventario asignado a la copia y queremos acceder a la base de datos de objetos habilitados en préstamo para obtener el tipo de registro de ese número de inventario en particular.

Aquí nos encontramos con un problema de manejo de estructuras por cuanto, si bien cada copia es un registro independiente en la base de datos copies, en la base de datos loanobjects todas las copias de un mismo objeto se encuentran agrupadas en un mismo registro en la forma de campo repetible con subcampos. El problema estriba en cómo obtener en loanobjects la'información de una copia en particular, si las mismas están acumuladasen un campo repetible?. Explicaremos una solución al problema.

Cuando expresamos ref(['loanobjects']l(['loanobjects'],'CN_'v10'_'v1), recuperamos de loanobjects un registro con el número de control 'CN_'v10'_'v1 donde v10 es el nombre de la base de datos catalográfica de la copia y V1 es el número de control.

Esta expresión nos recupera un registro que tiene en su interior varios números de inventario, pero solo nos intersa la información del número de inventario de la copia que estamos accediendo en ese momento (v30 en la base de datos de copias).

Por ello, antes de leer loanobjects almacenamos en la variable s1 el número de inventario que estamos procesando en ese momento: ,s1:=s(mpu,v30,mpl),. s1, corresponde a la expresión de una variable que nos provee el lenguaje de formatos CISIS para almacenar en forma virtual valores alfanuméricos.

Una vez que tenemos almacenado el número de inventario, podemos leer el registro que lo contiene en loanobjects, y al ser el campo V959 un campo repetible, tenemos que recorrer todas sus ocurrencias hasta tanto se cumpla la condición s(mpu,v959^i,mpl)=s1 los cual nos dice que en ese momento estamos sobre la ocurrencia que tiene la información del número de inventario que estamos procesando. Cuando la condición se cumple, extraemos el valor v950^o, que corresponde al tipo que se le ha asignado a la copia para efectos de aplicación de la política de préstamo.

proc('a9999~1~') es un artificio que usamos para detectar si se encontró el número de inventario solicitado, para darle una mayor coherencia al formato de presentación

El archivo biblo.par (o el syspar.par) debe contener la ruta de acceso a la base de datos loanobjects