Herramientas de usuario

Herramientas del sitio


abr:codigo-migracion

Sugerencia: subdividir el archivo en porciones más pequeñas:

'd*',
/* definir variables, e.g. tipo de registro */

,@control-leader.prc,    /* 905/919, 001, 003, 005, 008 */

/* TO-DO: para que el proceso pueda ser más fácilmente reutilizado, en el 008/18-34 separar completamente los distintos tipos de registro: libros, videos, etc. */

,@descripcion.prc,       /* 020, 245, 246?, 250, 260, 300, 490 */

,@puntos-acceso.prc,     /* 100, 110, 111, 130, 700, 710, 711, 730, 740 */

,@analisis-tematico.prc, /* 082, 600, 651?, 653 */

,@datos-locales.prc,     /* 859, 980, 991 */
/* --------------------------------------------------------------------------------
 * br2marc.proc - Proceso de migración a MARC 21 para la Biblioteca Rivadavia
 *
 * Este proceso actúa sobre la base unificada, y luego de la aplicación de un
 * conjunto de gizmos.
 *
 * Uso:
 *      mx bru "proc=@br2marc.pft"
 *
 * Requisitos: mx versión 5.2
 *
 * Campos auxiliares empleados:
 *      9000
 *      9001
 *      9010
 *      9100
 * --------------------------------------------------------------------------------
 */

/* ----------------------------------------------------------------------------------
 * Eliminamos todos los campos del registro original, para así poder crear el nuevo
 * registro desde cero.
 * ----------------------------------------------------------------------------------
 */
'd*',

/* ----------------------------------------------------------------------------------
 * Los registros de videograbaciones requieren un tratamiento diferente.
 * Usamos un campo auxiliar para poder reconocer estos registros fácilmente.
 * ----------------------------------------------------------------------------------
 */
proc('d9100a9100#',
    if s(mpu,v65,mpl) : 'VIDEOGRABACION' then 'VIDEO' else 'LIBRO' fi,
'#'),

/* -----------------------------------------------------------------------
 * Campos MARC 905/919 - Datos de la cabecera (campos locales de Catalis)
 * -----------------------------------------------------------------------
 */
'<905>n</905>',  /* LDR/05: Estado del registro: nuevo */
'<906>',         /* LDR/06: Tipo de registro: 'a' para material impreso, 'g' para videos */ 
    if v9100 = 'VIDEO' then 'g' else 'a' fi,
'</906>',
'<907>m</907>',  /* LDR/07 - Nivel bibliográfico del registro: 'm' para monográfico */
'<908>#</908>',  /* LDR/08 -  */
'<909>#</909>',  /* LDR/09 -  */
'<917>z</917>',  /* LDR/17 - Nivel de codificación: 'z'  */
'<918>u</918>',  /* LDR/18 - Reglas de catalogación: 'u' */
'<919>#</919>',  /* LDR/19 -  */

/* ------------------------------------------
 * Campo MARC 001 - Número de control
 *
 * Almacenamos el MFN que tiene el registro en la base unificada (no tiene relación
 * con los MFN de la base original).
 * ------------------------------------------
 */
'<001>',mfn(6),'</001>',

/* ------------------------------------------
 * Campo MARC 003 - Código MARC de la biblioteca
 *
 * El código asignado por LC.
 * Ver http://www.loc.gov/marc/organizations/org-search-results.php?oid=36589
 * ------------------------------------------
 */
'<003>',
    'AR-BbABR',
'</003>',

/* ------------------------------------------------------------------------
 * Campo MARC 005 - Fecha y hora de última modificación
 *
 * Usamos la fecha y hora de la migración.
 * ------------------------------------------------------------------------
 */
'<005>',
    s(date).8, s(date)*9.6, '.0',
'</005>',

/* ------------------------------------------
 * Campo MARC 008 - Datos codificados
 *
 * Este campo se construye con datos procedentes de varios campos del registro original.
 * ATENCION: el significado de las posiciones 18-34 varía según se trate de libros o videos.
 * Para encarar estas diferencias, podríamos separar completamente el tratamiento de cada caso,
 * o bien (como hacemos acá) usar varios 'if-then-else-fi' a lo largo del camino cada vez que
 * surgen las diferencias.
 *
 *  CASOS RAROS PARA REVISAR
 *  D:\mig\pruebas>mx br0 gizmo=g_pais gizmo=g_idioma proc=@br2marc.proc "pft=if size(v8)<>40 then mfn,x3,f(size(v8),1,0),c16, v8/ fi" now
 *  027337   31    070727fr############0#####und||
 *  043015   38    070727s1900####F###########0#####und||
 *  048823   38    070727s1937####A###########0#####und||
 *  094923   31    070727ag#a##########0#####und||
 *  117138   44    070727s1esu1817####sp############0#####und||
 *  125256   31    070727xx#a##########0#####und||
 *  125952   31    070727sp############0#####und||
 *  125953   31    070727sp############0#####und||
 * ------------------------------------------
 */
 
'<008>',

    /* ------------------------------------------
     * 008/00-05 - Fecha de creación del registro
     * Usamos la fecha de la migración.
     * ------------------------------------------
     */
    mid(date,3,6),
    
    /* ------------------------------------------
     * 008/06    - Tipo de fechas
     * 008/07-10 - Fecha 1
     * 008/11-14 - Fecha 2
     * Nos basamos en el campo FOCAD 45 (Fecha de publicación) y consideramos 3 casos.
     * ------------------------------------------
     */
    
    /* CASO 1: el campo FOCAD 45 posee una fecha completa (4 dígitos), y posiblemente un rango de fechas */

    if val(v45*0.4) > 1500 then,
        /* casos considerados:
            a) 1956
            b) 1956-
            c) 1956-7
            d) 1956-57
            e) 1899-900
            f) 1956-1957
            Los rangos de fechas también pueden aparecer indicados con una barra, p.ej.: 1956/57.
        */
        if v45*4.1 = '-' or v45*4.1 = '/' then  /* fechas múltiples */
            'm',      /* tipo de fechas: 'm' para múltiples */
            v45*0.4,  /* fecha 1 */
            select size(v45*5)        /* fecha 2 */
                case 0   : 'uuuu',  /* si supiéramos que la publicación continúa, pondríamos '9999' */
                case 1   : v45.3, v45*5,
                case 2   : v45.2, v45*5,
                case 3   : v45.1, v45*5,
                case 4   :        v45*5,
                elsecase '####'
            endsel,
        else   /* fecha simple */
            's',      /* tipo de fecha: 's' para fecha única */
            v45*0.4,  /* fecha 1 */
            '####',   /* fecha 2 */
        fi,
        
    /* CASO 2: el campo FOCAD 45 contiene una fecha estimada */
        
    else if v45*3.1 = '-' then,
        /* casos considerados:
            a) 195-
            b) 19--
        */
        's',                   /* fecha única */
        replace(v45,'-','u'),  /* fecha 1 */
        '####',                /* fecha 2: no aplicable */

    /* CASO 3: el campo FOCAD 45 no contiene una fecha o está ausente */

    else if val(v45*0.4) = 0 then,
        /* casos considerados:
            a) el campo 45 está presente, pero no contiene ningún dígito > 0
            b) el campo 45 está ausente
        */
        'n',       /* fecha desconocida */
        'uuuu',    /* fecha 1: desconocida */
        '####',    /* fecha 2: no aplicable */

    fi,fi,fi,
    
    /* ------------------------------------------
     * 008/15-17 - Lugar de publicación
     * Campo FOCAD 48 - Código de país (revisar nombre de campo ??)
     * Sólo usamos la primera ocurrencia del campo FOCAD 48.
     * NOTA: el código ISO fue previamente convertido al código MARC mediante un gizmo.
     * ------------------------------------------
     */
    if p(v48) then
        if size(v48[1]) = 2 then
            v48[1],'#', 
        else
            v48[1].3,
        fi,
    else
        'xx#',  /* 'xx#' para lugar desconocido */
    fi,

    /* Comienzo del bloque de datos dependientes del tipo de material (008/18-34) */
    
    if v9100 = 'LIBRO' then
    
        /* ------------------------------------------
         * 008/18-21 - Ilustraciones
         * Campo FOCAD 52, subcampo i
         * ------------------------------------------
         */
        if p(v52^i) then
            'a###',
        else
            '####',
        fi,
    
    else if v9100 = 'VIDEO' then
    
        /* ------------------------------------------
         * 008/18-20 - Duración
         * Campo FOCAD ??
         * ------------------------------------------
         */
         '---',
         
        /* ------------------------------------------
         * 008/21 - Indefinido
         * ------------------------------------------
         */
        '|',
    fi,fi,
    
    /* ------------------------------------------
     * 008/22 - Audiencia
     * ------------------------------------------
     */
     '|',
     
    if v9100 = 'LIBRO' then
     
        /* ------------------------------------------
         * 008/23 - Forma del ítem
         * ------------------------------------------
         */
         '|',
        
        /* ------------------------------------------
         * 008/24-27 Naturaleza del contenido
         * ------------------------------------------
         */
        /* Averiguamos si hay algún descriptor 'DICCIONARIO' o 'ENCICLOPEDIA' */
        proc('d9000a9000~',(if s(mpu,v65,mpl):'DICCIONARIO' then 'DICC',break, fi),'~'),
        proc('d9001a9001~',(if s(mpu,v65,mpl):'ENCICLOPEDIA' then 'ENCIC',break, fi),'~'),
        
        if v9000 = 'DICC' and v9001 = 'ENCIC' then
            'de##',
        else if v9000 = 'DICC' then
            'd###',
        else if v9001 = 'ENCIC' then
            'e###',
        else
            '####',
        fi,fi,fi,
        
    else if v9100 = 'VIDEO' then
    
        /* ------------------------------------------
         * 008/23-27 - Indefinido
         * ------------------------------------------
         */
        '####',
    
    fi,fi,
    
    /* ------------------------------------------
     * 008/28 - Publicación gubernamental
     * ------------------------------------------
     */
    '|',
    
    if v9100 = 'LIBRO' then
    
        /* ------------------------------------------
         * 008/29 - Publicación de conferencia
         * ------------------------------------------
         */
        '|',
        
        /* ------------------------------------------
         * 008/30 - Festschrift
         * ------------------------------------------
         */
        '|',
        
        /* ------------------------------------------
         * 008/31 - Indice
         * ------------------------------------------
         */
        '|',
     
    else if v9100 = 'VIDEO' then
    
        /* ------------------------------------------
         * 008/29 - Forma del ítem
         * ------------------------------------------
         */
        '|',
    
        /* ------------------------------------------
         * 008/30-31 - Indefinido
         * ------------------------------------------
         */
        '##',
        
    fi,fi,
    
    /* ------------------------------------------
     * 008/32 - Indefinido
     * ------------------------------------------
     */
    '#',
    
    if v9100 = 'LIBRO' then
    
        /* ------------------------------------------
         * 008/33 - Forma literaria
         * ------------------------------------------
         */
        '|',
        
        /* ------------------------------------------
         * 008/34 - Biografía
         * ------------------------------------------
         */
        /* Averiguamos si hay algún nro. de clasificación de la forma 92x */
        proc('d9000a9000~',(if v60.2='92' and not v60.3='929' then 'BIOG',break, fi),'~'),
        
        if s(mpu,v65,mpl) : 'AUTOBIOGRAFIA' then
            'a', /* 'a': autobiografía */
        else if s(mpu,v65,mpl) : 'BIOGRAFIA' or v9000 = 'BIOG' then
            'd', /* 'd': contiene información biográfica */
        else
            '#', /* '#': sin material biográfico */
        fi,fi,
        
    else if v9100 = 'VIDEO' then
    
        /* ------------------------------------------
         * 008/33 - Tipo de material visual
         * ------------------------------------------
         */
        'v',  /* 'v' para videograbación */
        
        /* ------------------------------------------
         * 008/34 - Técnica
         * ------------------------------------------
         */
        '|',
         
    fi,fi,

    /* Fin del bloque de datos dependientes del tipo de material (008/18-34) */
    
    /* ------------------------------------------
     * 008/35-37 - Idioma 
     * Campo FOCAD 50 - Idioma
     * NOTA: el valor del campo fue previamente convertido mediante un gizmo.
     * ------------------------------------------
     */
    if size(v50[1]) = 3 then
        v50[1],
    else
        'und',  /* 'und' para idioma no determinado */
    fi,
    
    /* ------------------------------------------
     * 008/38 - Registro modificado
     * ------------------------------------------
     */
    '|',
    
    /* ------------------------------------------
     * 008/39 - Fuente de la catalogación
     * ------------------------------------------
     */
    '|',
'</008>',


/* ------------------------------------------------------------
 * Campo MARC 020 - ISBN
 *
 * Campo FOCAD 10 - ISBN
 * Campo FOCAD 11 - ISBN (monografía en varios volúmenes)
 * Sólo estamos considerando ISBN-10. Hay ISBN-13 en la base ??? <-- PENDIENTE
 * ------------------------------------------------------------
 */

if p(v10) or p(v11) then
    /* Para poder procesar en una sola pasada tanto el campo 10 como el 11,
       juntamos todos los campos 10 y 11 en un campo auxiliar (9010) */
    proc(
        'd9010',
        if p(v10) then
            (
                'a9010~',v10,'~',
            )
        fi
        if p(v11) then
            (
                'a9010~',v11,'~',
            )
        fi,
    ),
    
    /* Y ahora recorremos todas las ocurrencias de este campo auxiliar */
    (
        /* Creamos un campo auxiliar 9000 con el ISBN normalizado (le quitamos espacios
        y guiones, lo convertimos a mayúsculas ['x' => 'X'] y lo truncamos en 10 caracteres) */
        proc('d9000a9000~',
            left(
                replace(replace(s(mpu,v9010,mpl),
                    ' ',''),
                    '-',''),
                10             /* trunca en 10 caracteres */
            ),
        '~'),

        /* 9001: campo auxiliar para validar el número */
        /* Ver http://en.wikipedia.org/wiki/International_Standard_Book_Number#Check_digit_in_ISBN-10 */
        proc('d9001a9001~',
            f(
                (
                val(mid(v9000[1],1,1)) * 10 +
                val(mid(v9000[1],2,1)) * 9  +
                val(mid(v9000[1],3,1)) * 8  + 
                val(mid(v9000[1],4,1)) * 7  +
                val(mid(v9000[1],5,1)) * 6  +
                val(mid(v9000[1],6,1)) * 5  +
                val(mid(v9000[1],7,1)) * 4  +
                val(mid(v9000[1],8,1)) * 3  +
                val(mid(v9000[1],9,1)) * 2  +
                val(replace(mid(v9000[1],10,2),'X','10')) * 1
                ) 
                /11
                ,1,5
            ),
        '~'),
        /* '<9000>',v9000[1],'</9000>','<9001>',v9001[1],'</9001>' */
        
        /* Creamos un campo MARC 020, y decidimos el subcampo a usar según si el número es válido o no */
        '<020>',
            '##',
            if right(v9001[1],5) = '00000' then
                /* resto cero => ISBN válido */
                '^a',
            else
                /* ISBN inválido */
                '^z',
            fi,
            replace(v9010,'-',''), /* conservamos el valor original del campo, previa eliminación de guiones */
        '</020>',
    )
fi,


/* ------------------------------------------
 * Campo MARC 041 - Códigos de idioma
 *
 * Campo FOCAD 50 - Idioma del documento
 * Creamos un campo MARC 041 sólo si hay más de una ocurrencia del campo FOCAD 50.
 * NOTA: Los códigos deben haber sido convertidos previamente de ISO 639-1 (2 letras)
 * a ISO 639-2 (3 letras).
 * ------------------------------------------
 */

if nocc(v50) > 1 then
    '<041>',
        '0#',
        (
            '^a',v50,
        )
    '</041>',
fi,

/* ------------------------------------------
 * Campo MARC 044 - Códigos de país (??verificar nombre)
 *
 * Campo FOCAD 48 - Código de país (??verificar nombre)
 * Creamos un campo MARC 044 sólo si hay más de una ocurrencia del campo FOCAD 48.
 * ------------------------------------------
 */

/* ------------------------------------------
 * Campo MARC 082 - Clasificación decimal de Dewey
 *
 * Campo FOCAD 60 - Clasificación temática
 * Campo FOCAD 75 - Signatura topográfica
 *
 * Casos:
 *      1. Campo 60 contiene número Dewey (con o sin prefijo de país) => se preserva
 *      2. Campo 60 contiene número Dewey con prefijo 'C ' (consulta) => se preserva, eliminando el prefijo
 *      3. Campo 60 contiene 'JN', 'I-', 'IC'                         => se omite
 *      4. No hay campo 60, pero el 1er subcampo del campo 75 contiene un número Dewey => se usa v75^*
 * El criterio para determinar si un campo 60 o 75 contiene un nro. Dewey es que se cumplan
 * estas dos condiciones:
 *    - que la función val() devuelva un nro. positivo (esto excluye 'JN', 'IC', 'I-')
 *    - que el campo no contenga un guión (esto excluye nros. Brunet)
 * ------------------------------------------
 */

if val(v60^*) > 0 and not v60^* : '-' then
    (
        '<082>',
            '0#',
            '^a',replace(replace(v60,'C ',''),' ',''),
        '</082>',
    ),
else if val(v75^*) > 0 and not v75^* : '-' then
    '<082>',
        '0#',
        '^a',replace(replace(v75^*,'C ',''),' ',''),
    '</082>',
fi,fi,

/* ------------------------------------------
 * 09x ?? (juvenil, infantil)
 * ------------------------------------------
 */

/* ----------------------------------------------------------------------------
 * Campo MARC 245 - Título y mención de responsabilidad
 *
 * Campo FOCAD 24 - Título monográfico
 * Campo FOCAD 14 - Normas, patentes, etc.
 * Campo FOCAD 40 - Nombre de la reunión
 *
 * Mención de responsabilidad: ¡qué problemita!
 * ----------------------------------------------------------------------------
 */
if p(v24) then
    '<245>',
        /* primer indicador */
        if a(v28) and a(v29) then 
            '0',  /* título como punto de acceso principal */
        else
            '1',  /* título como punto de acceso secundario */
        fi, 
        
        /* segundo indicador: caracteres a ignorar */
        if `¬L'¬L´¬` : s('¬',v24.2,'¬') then 
            '2',
        else if '¬La ¬El ¬Le ¬An ¬' : s('¬',v24.3,'¬') then 
            '3',
        else if '¬Las ¬Los ¬The ¬Les ¬... ¬' : s('¬',v24.4,'¬') then 
            '4',
        else if '...' = v24.3 then
            '3',
        else
            '0',
        fi,fi,fi,fi,
        
        /* subcampos */
        '^a',
        if v24^* : ': ' then
            mid(v24^*,1,instr(v24^*,': ')-1),
            ' :^b',
            mid(v24^*,instr(v24^*,': ')+2,size(v24^*))
        else if v24^* : '; ' then
            mid(v24^*,1,instr(v24^*,'; ')-1),
            ' :^b',
            mid(v24^*,instr(v24^*,'; ')+2,size(v24^*))
        else,
            v24^*,
        fi,fi,
        
        /* mención de responsabilidad */
        if p(v24^b) and p(v24^a) then
            '^c', v24^b, ' ', v24^a,
        fi,
            
        /* subcampo h para videos */
        if v9100 = 'VIDEO' then
            '^h[videograbaci¢n]',
            /* PENDIENTE: controlar posición del subcampo h */
        fi,
    '</245>',
fi,

/* ----------------------------------
 * Campo MARC 246 - Variantes del título
 *
 * Campo FOCAD ??
 * ----------------------------------
 */

/* ----------------------------------------------------------------------------
 * Campo MARC 250 - Mención de edición
 *
 * Campo FOCAD 44 - Edición
 * NOTA: los valores fueron previamente normalizados con un gizmo.
 * ----------------------------------------------------------------------------
 */
if p(v44) then
    '<250>',
        '##',
        '^a',v44,
        if right(v44,1) <> '.' then '.', fi, /* puntuación final */
    '</250>',
fi,

/* ----------------------------------------------------------------------------
 * Campo MARC 260 - Datos de edición: lugar, editor, fecha
 *
 * Campo FOCAD 47 - Editor y lugar de edición (R)
 * Campo FOCAD 45 - Fecha de publicación
 * 
 * Casos especiales para testeo:
 *    000744 - p(v45) and a(v47)
 *    001996 - a(v45) and p(v47)
 *    ?????? - a(v45) and a(v47)
 * Casos pendientes:
 *    D:\mig\pruebas>mx br0 proc=@br2marc.proc from=96101 pft=mfn,x3,v260/
 *    096101   ## :^bCONABIP :^bD.N.I. Documento nacional de identidad
 * ----------------------------------------------------------------------------
 */
 
if p(v47) or p(v45) then
    '<260>',
        '##',
        
        /* Editor y lugar */
        if p(v47) then
            if s(mpu,v47,mpl) = 'S.N.T.' then
                '^a[S.l. :^bs.n.]',
            else
                if p(v47^l) then, 
                    '^a',replace(v47^l,'s.l.','[S.l.]'),
                fi,
                /* el campo FOCAD 47 es repetible */
                (
                    if v47.2 <> '^l' then  /* ignoramos ocurrencias que no contienen lugar */
                        ' :^b', replace(v47^*,'s.e.','[s.n.]'),
                    fi,
                )
            fi,
        fi,
        
        /* Fecha */
        if p(v45) then
            
            if p(v47) then ',', fi, /* el subcampo c va precedido de una coma */
            '^c',

            /* CASO 1: el campo 45 posee una fecha completa (4 dígitos), y posiblemente un rango de fechas */

            if val(v45*0.4) > 1500 then,
                /* casos considerados:
                    a) 1956
                    b) 1956-
                    c) 1956-7
                    d) 1956-57
                    e) 1899-900
                    f) 1956-1957
                */
                v45,

            /* CASO 2: el campo contiene una fecha estimada */
                
            else if v45*3.1 = '-' then,
                /* casos considerados:
                    a) 195-
                    b) 19--
                */
                '[',v45,']',

            /* CASO 3: el campo no contiene una fecha (esté o no presente el campo 45) */

            else if val(v45*0.4) = 0 then,
                /* casos considerados:
                    a) el campo 45 está presente, pero no contiene ningún dígito > 0
                    b) el campo 45 está ausente
                */
                
                if p(v260) or p(v45) then /* no creamos un 260 si el registro original carece de datos de edición (47 y 45 de FOCAD) */
                    if p(v45) then
                        '[s.f.]',
                    fi,
                fi,
            fi,fi,fi,
        fi,
        '.',   /* puntuación final */
    '</260>',
fi,

/* ------------------------------------------------
 * Campo MARC 300 - Descripción física
 *
 * Campo FOCAD 52 - Descripción física
 *
 * ¿Es necesario hacer correcciones a los datos originales? (p.ej. normalizar valores)
 *
 * ATENCION: campo 52 repetido
 *   D:\mig\pruebas>mx br0 "pft=if nocc(v52)>1 then mfn,x3,v52+| --- |/ fi" now
 *   086280   215 p.^iil. col.^d26,5 cm. --- Polimodal
 *   096761   Duración 95' --- Versión en inglés con subtítulos en castellano
 * ------------------------------------------------
 */

if p(v52) then
    '<300>',
        '##',
        if v52.1 <> '^' then  /* extensión (páginas) */
            '^a',v52^*,
        fi,
        if p(v52^i) then      /* ilustraciones */   /* es correcto dejar este subcampo tal como viene ??? */
            if v52.1 <> '^' then ' :', fi,
            '^b',v52^i,
        fi,
        if p(v52^d) then      /* dimensiones */
            if v52.1 <> '^' or p(v52^i) then ' ;', fi,
            '^c',v52^d,
        fi,
         /* puntuación final ?? */
    '</300>',
fi,

/* ------------------------------------------------
 * Campo MARC 490 - Mención de serie
 * Campo FOCAD 30 - Título (nivel colección)
 * ------------------------------------------------
 */
if p(v30) then
    (
        '<490>',
            '0#',
            if v30.1 <> '^' then '^a', fi,
            v30,
        '</490>',
    )
fi,

/*
   Para las notas que provienen del campo 59 (que según el caso enviamos a los campos 500, 505 o 511),
   podemos elegir entre 2 métodos:
        1. recorrer una única vez todas las ocurrencias del campo FOCAD 59, y decidir para cada una de
           ellas a qué campo MARC debe ir (500, 505, 511)
        2. por cada uno de los campos MARC a crear (500, 505, 511), recorrer todas las ocurrencias del
           campo FOCAD 59, y para cada una de ellas decidir si debe enviarse a este campo MARC
    Acá estamos usando el método 2.
*/


/* ------------------------------------------------
 * Campo MARC 500 - Nota general
 *
 * Campo FOCAD 59 - Notas
 * Tomamos las notas que no enviamos a campos más específicos (505, 511).
 * ------------------------------------------------
 */
if p(v59) then
    (
        if s(mpu,v59.7,mpl) <> 'ELENCO:' and s(mpu,v59.12,mpl) <> 'INTERPRETES:' and s(mpu,v59.11,mpl) <> 'CONTENIDO: ' then
            '<500>',
                '##',
                '^a',v59
                if right(v59,1) <> '.' then '.', fi, /* puntuación final */
            '</500>',
        fi,
    )
fi,


/* ------------------------------------------------
 * Campo MARC 504 - Nota de bibliografía
 *
 * Campo FOCAD 49 - Número de referencias bibliográficas
 * Construimos una nota usual ('Incluye referencias bibliográficas.') y le insertamos el número
 * almacenado en el campo 49.
 * ------------------------------------------------
 */
if val(v49) > 0 then
    '<504>',
        '##',
        '^aIncluye ', f(val(v49),1,0),' referencias bibliogr ficas.', /* ATENCION: codificación del acento */
    '</504>',
fi,

/* ------------------------------------------------------------------------------
 * Campo MARC 505 - Nota de contenido con formato
 *
 * Campo FOCAD 59 - Notas
 * Tomamos las notas que comiencen con 'Contenido: '.
 * No todas estas notas tendrán el formato prescripto por AACR2, pero se las podrá
 * corregir más tarde.
 * ------------------------------------------------------------------------------
 * ATENCION: en algunos queda esta puntuación final: '.-.'
 */
if p(v59) then
    (
        if s(mpu,v59.11,mpl) = 'CONTENIDO: ' then
            '<505>',
                '##',
                '^a',replace(replace(v59*11,'.- ',' -- '),'. -',' -- '), /* usamos el separador estándar ' -- ' */
                if right(v59,1) <> '.' then '.', fi, /* puntuación final */
            '</505>',
        fi,
    )
fi,

/* ------------------------------------------------------------------------------
 * Campo MARC 511 - Nota de elenco
 *
 * Campo FOCAD 59 - Notas
 * Tomamos las notas que comiencen 'Elenco:' o 'Intérpretes:'.
 * ------------------------------------------------------------------------------
 */
if p(v59) then
    (
        if s(mpu,v59.7,mpl) = 'ELENCO:' or s(mpu,v59.12,mpl) = 'INTERPRETES:' then
            '<511>',
                '0', /* el OPAC no genera etiqueta 'Elenco' */
                '#',
                '^a',v59
                if right(v59,1) <> '.' then '.', fi, /* puntuación final */
            '</511>',
        fi,
    )
fi,


/* ------------------------------------------------
 * Campo MARC 520 - Nota de resumen
 *
 * Campo FOCAD 69 - Resumen
 * ------------------------------------------------
 */

if p(v69) then
    '<520>',
        '##',
        '^a',v69,
        if right(v69,1) <> '.' then '.', fi, /* puntuación final */
    '</520>',
fi,

/* --------------------------------------------------------------------------
 * Campo MARC 100 - Punto de acceso principal--Nombre personal
 * Campo MARC 700 - Punto de acceso secundario--Nombre personal
 *
 * Campo FOCAD 28 - Autor personal (nivel monográfico)
 * Campo FOCAD 22 - Autor personal (nivel analítico)
 * Campo FOCAD 65 - Descriptores
 *    Sólo nombres personales que aparezcan en registros de videograbaciones.
 *    Al usar el criterio de coma-espacio para detectar nombres personales, 
 *    estamos omitiendo nombres como 'Aristóteles', que deben detectarse
 *    manualmente.
 * --------------------------------------------------------------------------
 */ 

if p(v22) then
    (
        if not s(mpu,v24[1],mpl) : s(mpu,v22^*,mpl) then
            '<700>',
                if v22^b <> '' then
                    '1',
                else
                    '0',
                fi,
                '#', /* 2do indicador */
                '^a',replace(v22,'^b',', '),
                if right(v22,1) <> '.' then '.', fi, /* puntuación final */
            '</700>',
        fi,
    )
fi,

if v9100 = 'VIDEO' and p(v65) then
    (
        if  v65 : ', ' then  /* si encontramos coma-espacio suponemos que es un nombre personal */
            '<700>',
                '1', /* 1er indicador */
                '#', /* 2do indicador */
                '^a',v65,
                if right(v65,1) <> '.' then '.', fi, /* puntuación final */
            '</700>',
        fi
    )
fi,

/* ----------------------------------------------------------------------
 * Campo MARC 110 - Punto de acceso principal--Nombre institucional
 * Campo MARC 710 - Punto de acceso secundario--Nombre institucional
 *
 * Campo FOCAD 23 - Autor institucional (nivel analítico)
 * Campo FOCAD 29 - Autor institucional (nivel monográfico)
 * ----------------------------------------------------------------------
 */
if p(v23) or p(v29) then
    /* PENDIENTE */
fi,

/* ------------------------------------------------
 * Campo MARC 130 - Título uniforme
 * ------------------------------------------------
 */
if p(v27) then
    '<130>',
        '0#',
        '^a',v27,
        if right(v27,1) <> '.' then '.', fi, /* puntuación final */
    '</130>',
fi,

/* ----------------------------------------------------------------------------------
 * Campo MARC 600 - Punto de acceso temático--Nombre personal
 *
 * Campo FOCAD 65 - Descriptores
 *    Sólo aquellos que contienen una coma seguida de un espacio (excepto en videos).
 * Campo FOCAD 22 - Autor personal (nivel analítico)
 *    Si el título (campo 24) contiene el apellido de esta persona.
 * PENDIENTE: revisar indicadores
 * ----------------------------------------------------------------------------------
 */

if p(v65) then
    (
        if v65 : ', ' and not v9100 = 'VIDEO' then
            '<600>',
                '##',
                '^a',v65,
                if right(v65,1) <> '.' then '.', fi, /* puntuación final */
            '</600>',
        fi,
    ),
fi,

if p(v22) then
    (
        if s(mpu,v24[1],mpl) : s(mpu,v22^*,mpl) then
            '<600>',
                '14',
                '^a',replace(v22,'^b',', '),
                if right(v22,1) <> '.' then '.', fi, /* puntuación final */
            '</600>'
        fi,
    )
fi,


/* ------------------------------------------------------------------
 * Campo MARC 653 - Descriptores (no controlados)
 *
 * Campo FOCAD 65 - Descriptores
 * Campo FOCAD 20 - Título (nivel analítico)
 *    Esto se debe a una sobreutilización del campo 20 en B.R.
 *    Consideramos descriptores a aquellos que están en MAYUSCULAS.
 * ------------------------------------------------------------------
 */
if p(v65) then
    (
        if not v65 : ', ' then
            '<653>',
                '##^a',v65,
                if right(v65,1) <> '.' then '.', fi, /* puntuación final */
            '</653>',
        fi,
    ),
fi,
 
if p(v20) then
    (
        if s(mpu,v20,mpl) = v20 and not v20 : '/' then  /* excepciones: MS/DOS, CAD/CAM */
            '<653>',
                '##^a',v20,
                if right(v20,1) <> '.' then '.', fi, /* puntuación final */
            '</653>'
        fi,
    )
fi,

/* -------------------------------------------------------
 * Campo MARC 740 - Títulos relacionados/analíticos (no controlados)
 *
 * Campo FOCAD 20 - Título (nivel analítico)
 * Omitimos aquellos que estén completamente en mayúsculas, pues se trata de descriptores
 * y deben enviarse al campo MARC 653.
 * -------------------------------------------------------
 */
if p(v20) then
    (
        if s(mpu,v20,mpl) <> v20 or v20 : '/' then  /* omitimos los que estén en MAYUSCULAS */
            '<740>',
                /* 1er indicador: caracteres a ignorar */
                /* ATENCION: comparar con 2do indicador del campo MARC 245 */
                if `¬L'¬L´¬` : s('¬',v20.2,'¬') then 
                    '2',
                else if '¬La ¬El ¬Le ¬An ¬' : s('¬',v20.3,'¬') then 
                    '3',
                else if '¬Las ¬Los ¬The ¬Les ¬... ¬' : s('¬',v20.4,'¬') then 
                    '4',
                else if '...' = v20.3 then
                    '3',
                else
                    '0',
                fi,fi,fi,fi,
                '2', /* 2do indicador: '2' para título analítico */
                '^a',v20,
            '</740>',
        fi,
    )
fi,

/* ----------------------------------------------------------------------------
 * Campo MARC 859 - Existencias (campo local de Catalis)
 *
 * Tomamos los datos que fueron almacenados en el campo 200 por el proceso de
 * unión de familias de registros.
 * ----------------------------------------------------------------------------
 */

/* ----------------------------------------------------------------------------
 * Campo MARC 980 - Anotaciones al registro (campo local de Catalis)
 *
 * Conservamos los MFN de los registros originales.
 * ----------------------------------------------------------------------------
 */
'<980>',
    '^oMFN base original: ',
'</980>',

/* ----------------------------------------------------------------------------
 * Campo MARC 991 - Usuario que creó el registro (campo local de Catalis)
 *
 * Usamos un identificador para el proceso de migración.
 * ----------------------------------------------------------------------------
 */
'<991>',
    '_MIG_',
'</991>',

migracion

abr/codigo-migracion.txt · Última modificación: por 127.0.0.1