User Tools

Site Tools


eliminacion_de_subcampos

This is an old revision of the document!


Eliminación de subcampos en registros isis

Este es un “truco” que de vez en cuando necesitamos tener a mano.

El problema en términos generales es: eliminar un subcampo X de un campo Y.

Vamos a hacer algunas suposiciones:

  • Digamos que nos interesa eliminar el subcampo f del campo 333, por poner un ejemplo arbitrario.
  • Supondremos que ni el campo 333 ni el subcampo f son repetibles. (Sí, nos conformamos con el caso fácil. Pero es bienvenida una solución más general)

La solución

mx base "proc=@borra-subcampo.pft"

donde borra-subcampo.pft es un archivo con el siguiente contenido:

'd333',
if replace(v333, s('^f',v333^f), '') : '^' then
    '<333>',
       replace(v333, s('^f',v333^f), ''),
    '</333>',
fi

Si solamente nos interesa borrar ese subcampo en registros que cumplan cierta condición, usaremos algo como:

mx base "proc=if <condición> then ,@borra.pft, fi"

La explicación

Queremos eliminar un subcampo específico, pero usando un proc sólo podemos eliminar campos completos:

proc='d333'

Ya que tenemos una forma de eliminar el campo completo, hagamos eso y luego volvamos a crear el campo, pero modificado:

'd333',
'<333>',
    replace(v333, s('^f',v333^f), ''),
'</333>',

Tenemos un problema: en caso de que el único contenido del campo 333 sea el subcampo f, al volver a crearlo sin ese subcampo nos habremos quedado con un campo 333 vacío. Para evitar eso, antes de proceder a re-crear el campo verifiquemos que contiene algo más que el subcampo que deseamos eliminar:

'd333',
if replace(v333, s('^f',v333^f), '') <> '' then
    '<333>',
       replace(v333, s('^f',v333^f), ''),
    '</333>',
fi

Sin embargo, al preguntar si el campo quedaría vacío luego de eliminar el subcampo no estamos detectando el caso de un campo MARC con indicadores. Si nos quedásemos con un campo que sólo contiene indicadores, también deberíamos considerar que se trata de un campo vacío. Por lo tanto, nuestra de definición de campo vacío es: un campo sin subcampos. Dicho de otra forma, sólo nos interesa re-crear el campo si es que aún contiene algún subcampo, y eso lo podemos detectar mediante la presencia del carácter '^':

'd333',
if replace(v333, s('^f',v333^f), '') : '^' then
    '<333>',
       replace(v333, s('^f',v333^f), ''),
    '</333>',
fi

Referencias

eliminacion_de_subcampos.1245294300.txt.gz · Last modified: 18/06/2009 00:00 (external edit)