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:25]
fernando
eliminacion_de_subcampos [19/06/2009 19:01]
fernando
Line 3: Line 3:
 Este es un "​truco"​ que de vez en cuando necesitamos tener a mano. Este es un "​truco"​ que de vez en cuando necesitamos tener a mano.
  
-El problema es: eliminar ​el subcampo ​f del campo 333.+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 ===== ===== La solución =====
  
 <​code>​ <​code>​
-mx base "​proc=@borra.pft"+mx base "​proc=@borra123f.pft"
 </​code>​ </​code>​
  
-donde ''​borra.pft''​ es un archivo con el siguiente contenido:+donde ''​borra123f.pft''​ es un archivo con el siguiente contenido:
  
 <​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>​
 +
 +Si solamente nos interesa borrar ese subcampo en registros que cumplan cierta condición, usaremos algo como:
 +
 +<​code>​
 +mx base "​proc=if <​condición>​ then ,​@borra123f.pft,​ fi"
 </​code>​ </​code>​
  
Line 28: Line 38:
  
 <​code>​ <​code>​
-proc='d980'+proc='d123'
 </​code>​ </​code>​
  
Line 34: Line 44:
  
 <​code>​ <​code>​
-'d333', +'d123', 
-'a333~', +'<123>', 
-    replace(v333, s('​^f',​v333^f), ''​),​ +    replace(v123, s('​^f',​v123^f), ''​),​ 
-'~',+'</​123>​',
 </​code>​ </​code>​
  
-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:+Tenemos un problema: en 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>​ <​code>​
-'d333', +'d123', 
-if replace(v333, s('​^f',​v333^f), ''​) <> ''​ then +if replace(v123, s('​^f',​v123^f), ''​) <> ''​ then 
-    'a333~', +    '<123>', 
-       ​replace(v333, s('​^f',​v333^f), ''​),​ +       ​replace(v123, s('​^f',​v123^f), ''​),​ 
-    '~',+    '</​123>​',
 fi 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 '​^':​+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 '​^':​
  
 <​code>​ <​code>​
-'d333', +'d123', 
-if replace(v333, s('​^f',​v333^f), ''​) : '​^'​ then +if replace(v123, s('​^f',​v123^f), ''​) : '​^'​ then 
-    'a333~', +    '<123>', 
-       ​replace(v333, s('​^f',​v333^f), ''​),​ +       ​replace(v123, s('​^f',​v123^f), ''​),​ 
-    '~',+    '</​123>​',
 fi fi
 </​code>​ </​code>​
  
-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]]):​ 
  
-<​code>​ +===== Referencias ===== 
-'​d333',​ + 
-if replace(v333, s('​^f',​v333^f), ''​) : '​^'​ then +[[http://​bvsmodelo.bvsalud.org/​download/​cisis/​CISIS-ManualReferencia-es-5.2.pdf|Utilitarios CISIS - Manual de Referencia ​(Versión 5.2)]] (PDF). 
-    '<​333>',​ +
-       ​replace(v333, s('​^f',​v333^f), ''​),​ +
-    '</​333>',​ +
-fi +
-</​code>​+
  
 {{tag>​isis}} {{tag>​isis}}
eliminacion_de_subcampos.txt · Last modified: 19/06/2009 00:00 (external edit)