User Tools

Site Tools


eliminacion_de_subcampos

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
eliminacion_de_subcampos [17/06/2009 16:08]
fernando
eliminacion_de_subcampos [19/06/2009 00:00] (current)
Line 1: Line 1:
 ====== Eliminación de subcampos en registros isis ====== ====== Eliminación de subcampos en registros isis ======
  
-Un "​truco"​ que de vez en cuando necesitamos tener a mano.+Este es un "​truco"​ que de vez en cuando necesitamos tener a mano.
  
-Queremos ​eliminar un subcampo ​específico,​ pero usando ​un ''​proc''​ sólo podemos eliminar fácilmente campos completos:+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 **123**, por poner un ejemplo arbitrario. 
 +  * Supondremos que ni el campo 123 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 =====
  
 <​code>​ <​code>​
-proc='​d980'​+mx base "proc=@borra123f.pft"​
 </​code>​ </​code>​
  
-Supongamos que queremos eliminar del campo 333 solamente el subcampo **f**Ya que tenemos una forma de eliminar el campo completo, hagamos eso y luego volvamos a crear el campo, modificándolo:+donde ''​borra123f.pft''​ es un archivo con el siguiente contenido:
  
 <​code>​ <​code>​
-'d333', +'d123', 
-'a333~', +if replace(v123,​ s('^f',v123^f), ''​) : '​^'​ then 
-    replace(v333, s('​^f',​v333^f), ''​),​ +    ​'<​123>',​ 
-'~',+       replace(v123, s('​^f',​v123^f), ''​),​ 
 +    '</​123>​', 
 +fi
 </​code>​ </​code>​
  
-Tenemos un problema: ​en caso de que el único contenido del campo 333 sea el subcampo fal 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:+Si solamente nos interesa borrar ese subcampo ​en registros ​que cumplan cierta condiciónusaremos ​algo como:
  
 <​code>​ <​code>​
-'​d333',​ +mx base "proc=if <condición> then ,@borra123f.pft, fi"
-if replace(v333,​ s('​^f',​v333^f),​ ''​) ​<> ​'' ​then +
-    '​a333~',​ +
-       ​replace(v333,​ s('​^f',​v333^f),​ ''​), +
-    '​~'​, +
-fi+
 </​code>​ </​code>​
  
-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 ​'^':+===== La explicación ===== 
 + 
 +Queremos ​eliminar un subcampo ​específicopero usando un ''​proc''​ sólo podemos eliminar campos completos:
  
 <​code>​ <​code>​
-'d333', +proc='d123' 
-if replace(v333, s('​^f',​v333^f), ''​) : '​^'​ then +</​code>​ 
-    'a333~', + 
-       ​replace(v333, s('​^f',​v333^f), ''​),​ +Ya que tenemos una forma de eliminar el campo completohagamos eso y luego volvamos a crear el campo, pero modificado: 
-    '~',+ 
 +<​code>​ 
 +'​d123',​ 
 +'<​123>',​ 
 +    ​replace(v123, s('​^f',​v123^f), ''​)
 +'</​123>',​ 
 +</​code>​ 
 + 
 +Tenemos un problemaen caso de que el único contenido del campo 123 sea el subcampo f, al volver a crearlo sin ese subcampo nos habremos quedado con un campo 123 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: 
 + 
 +<​code>​ 
 +'​d123',​ 
 +if replace(v123,​ s('^f',​v123^f),​ ''​) <> '' then 
 +    '<123>', 
 +       ​replace(v123, s('​^f',​v123^f), ''​),​ 
 +    '</​123>​',
 fi fi
 </​code>​ </​code>​
  
-Por supuestoes 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 cisisdonde se puede usar esta sintaxis alternativa (ver [[http://​bvsmodelo.bvsalud.org/download/cisis/CISIS-ManualReferencia-es-5.2.pdf]]):+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 indicadorestambién deberíamos considerar que se trata de un campo vacíoPor lo tanto, nuestra de definición de //campo vacío// es: un campo sin subcamposDicho 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 '​^'​:
  
 <​code>​ <​code>​
-'d333', +'d123', 
-if replace(v333, s('​^f',​v333^f), ''​) : '​^'​ then +if replace(v123, s('​^f',​v123^f), ''​) : '​^'​ then 
-    '<333>',​ +    '<123>',​ 
-       ​replace(v333, s('​^f',​v333^f), ''​),​ +       ​replace(v123, s('​^f',​v123^f), ''​),​ 
-    '</333>',+    '</123>',
 fi fi
 </​code>​ </​code>​
  
 +
 +===== Referencias =====
 +
 +[[http://​bvsmodelo.bvsalud.org/​download/​cisis/​CISIS-ManualReferencia-es-5.2.pdf|Utilitarios CISIS - Manual de Referencia (Versión 5.2)]] (PDF).
  
  
 {{tag>​isis}} {{tag>​isis}}
eliminacion_de_subcampos.1245265689.txt.gz · Last modified: 17/06/2009 00:00 (external edit)