Eliminación de subcampos en registros isis

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

El problema es: eliminar el subcampo f del campo 333.

La solución

mx base "proc=@borra.pft"

donde borra.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

La explicación

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

proc='d980'

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

'd333',
'a333~',
replace(v333, s('^f',v333^f), ''),
'~',

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
'a333~',
replace(v333, s('^f',v333^f), ''),
'~',
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. En tal caso, el campo se puede considerar vacío si sólo tiene indicadores. Por lo tanto, nuestra de definición de “campo vacío” es: campo sin subcampos. Dicho de otra forma, nos interesa re-crear el campo si 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
'a333~',
replace(v333, s('^f',v333^f), ''),
'~',
fi

Por supuesto, es aplicable la advertencia usual con respecto al uso de un proc para crear campos: el delimitador (en el ejemplo, '~') no debe estar contenido en los datos. Esta limitación ya no existe en la versión más reciente de los cisis, donde se puede usar esta sintaxis alternativa (ver http://bvsmodelo.bvsalud.org/download/cisis/CISIS-ManualReferencia-es-5.2.pdf):

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