EgImportExport

De Egeasy
Saltar a: navegación, buscar

EgImportExport es una aplicación perteneciente al paquete de aplicaciones de egeasy. Su finalidad es permitir al administrador importar o exportar objetos a un centro concreto. Para ello, se utiliza la tecnología XML como estándar de intercambio de información, estructurando la información y permitiendo que dicho intercambio se pueda realizar entre diferentes plataformas.

En este artículo explicaremos cómo configurar la aplicación para ejecutar tanto una exportación como una importación, así como a saber interpretar y entender la información en los ficheros XML ya que se trabajará con ellos.

Configuración de parámetros

Para poder ejecutar egImportExport, es necesario que en la misma carpeta donde se encuentre su ejecutable exista un fichero llamado egImportExport.ini. En este fichero especificaremos los parámetros de entrada de la aplicación, que son los siguientes:

  • USER_NAME: usuario con el que se conectará la aplicación para acceder al centro sobre el que se va a realizar la importación o exportación. El usuario debe estar dado de alta en el centro y estar activo.
  • PASSWORD: palabra de paso asociada al usuario, si la tuviera.
  • CENTER: nombre del centro al que se va a conectar la aplicación. El centro debe estar arrancado.
  • DIR_CONFIGURATIONS: ruta donde se encuentran los ficheros de importación o exportación. En estos fichero se incluyen los parámetros de configuración de la importación o exportación.

Ejemplo:

Parámetros de egImportExport

Una vez tenemos configurado el fichero .ini, veamos cómo crear el fichero de configuración en función de la operación a ejecutar.

Ficheros de configuración

Para la importación (.imp)

Como ya hemos dicho, para realizar una de los dos operaciones, es necesario configurar el fichero asociado a la operación a ejecutar. En este caso, se trata de una importación.

El fichero de configuración de una importación tendrá como nombre el que se le quiera dar, seguido de la extensión .imp (nombre.imp). En su contenido se incluirán aquellos parámetros que configurarán las características de la importación. Dichos parámetros son:

  • OBJECT_DIR: ruta donde se encuentran los objetos a importar, representados como ficheros .xml.
  • IMPORTED_DIR: ruta donde se irán moviendo los ficheros .xml cuyos objetos se hayan importado con éxito.
  • DOCUMENT_DIR: ruta donde se incluyen los documentos que se quieran importar, si los hubiere.
  • MODE: modo de importación.

Ejemplo:

Parámetros para la exportación

Como se puede ver en la imagen anterior, el parámetro MODE tiene asignado el modo ALL. Éste, es uno de los tres modos de importación que pueden ser asignados. Como se ve en el ejemplo, estos tres modos aparecen incluidos en una línea justo debajo del parámetro "MODE", ya que tienen que estar incluidos en el fichero de configuración.

Veamos a continuación las particularidades de cada modo:

  • FOUND: en este modo de importación, sólo se importarán aquellos objetos que ya se encuentren creados en el centro, limitándose a actualizar la información de éstos.
  • NOT_FOUND: en esta modalidad, se importarán sólo aquellos objetos que no sean encontrados en el centro, de forma que tendrán que ser creados.
  • ALL: esta modalidad es en realidad la unión de las dos anteriores. De manera que si el objeto que queremos importar ya está creado actualiza su información, y si no se encuentra, se crea.

Una vez hemos terminado de configurar el fichero, hay que tener en cuenta ciertos aspectos antes de iniciar la importación.

Los directorios que hemos especificado en el fichero de configuración deben ser creados manualmente ya que si no están creados, la aplicación no los creará por sí sola.

Una vez creados los directorios, tendremos que almacenar en los directorios correspondientes aquellos ficheros .xml que queramos importar, así como los ficheros .doc que también se quieran importar.

A la hora de almacenar los ficheros .xml en la carpeta de documentos a importar, es necesario tener en cuenta el nombre que tendrán estos ficheros. El único aspecto a controlar es que no se repita ningún nombre. Una recomendación es establecer alguna regla de nomenclatura que garantice la exclusividad de los mismos. Por ejemplo, nombrarlos mediante el tipo de contenedor y una enumeración siempre creciente.

Para que se lleve a cabo la importación, las declaraciones de los componentes en XML han de coincidir siempre con los declarados en egEasy. Si la intención es la de importar información de otra plataforma, se recomienda la realización de una exportación previa del tipo de contenedor que se quiera generar, obteniendo la adecuada declaración en XML. Cada contenedor a importar de un mismo tipo, diferirá sólo en los datos; nunca en la estructura.

El dominio es otro punto a tener en cuenta. Si los contenedores a importar tienen como dominio un objeto del sistema, sólo es necesario identificar el tipo y el componente; y la aplicación ubicará correctamente el contenedor. En cambio, si el dominio es otro contenedor, se requiere identificar ese contenedor mediante un fichero .xml; que permita a la aplicación diferenciarlo entre todos los posible contenedores de un mismo tipo. Esto obliga a tener en cuenta no sólo la generación de los nuevos contenedores para la importación, sino además la necesidad de exportar los contenedores que sean dominio de los nuevos.

Una vez comprobados todos los parámetros y requisitos que necesita la importación para ejecutarse correctamente, ya es posible lanzar la aplicación egImportExport y efectuar la importación. Si el proceso se realiza correctamente, los ficheros .xml importados se moverán a la carpeta especificada en el parámetro "IMPORTED_DIR".

Téngase en cuenta, que la importación de un contenedor cuyo archivo se encuentra en el historial de las exportaciones e importaciones, implica la actualización del contenedor ya existente. Aunque la intención fuera la generar un objeto nuevo.

Para la exportación (.exp)

Para realizar una exportación de objetos, al igual que para la importación, es necesario incluir un fichero de configuración de la exportación, de extensión .exp, en el directorio especificado en el fichero .ini. Este fichero, incluirá los parámetros de configuración que determinarán el comportamiento de la exportación. Dichos parámetros son:

  • OBJECT_CLASS: nombre de la definición de aquellos objetos que se quieren exportar.
  • OUTPUT_DIR: directorio de destino de los objetos exportados.
  • DOCUMENT_DIR: directorio de destino de aquellos documentos que hayan sido exportados.
  • EXPORT_CASCADE: parámetro booleano que especifica si se activa la exportación en cascada; es decir, que todos aquellos objetos que estén incluidos o vinculados al objeto inicial serán también exportados. Para activarlo le asignaremos la letra "S" y para desactivarlo le asignaremos la letra "N".
  • MODE: al igual que para las importaciones, puede haber varios modos de exportar objetos que explicaremos más adelante.

Ejemplo:

Parámetros para la importación

Al realizar una exportación, es posible que nos interese realizar una exportación que afecte sólamente a los objetos que cumplan ciertas características. Para ello, seleccionaremos uno de los tres modos de exportación que explicamos a continuación:

  • NOT_EXPORTED: se exportan aquellos objetos que nunca han sido exportados.
  • MODIFIED: se exportan aquellos objetos que han sido modificados respecto a su última exportación
  • ALL: es la unión de los dos modos anteriores. En este modo, los objetos que no se exportarán serán aquellos que hayan sido exportados anteriormente y que desde entonces, no han sido modificados.

Pero, ¿cómo sabe la aplicación qué objetos han sido o no exportados alguna vez?

Para ello existe una tabla en la base de datos del centro, que se crea automáticamente al instalar el centro, donde se registran los objetos que han sido exportados y cuándo han sido exportados por última vez. Por tanto, cuando elegimos un modo de exportación concreto, utilizará esta tabla para saber si ha sido exportado el objeto (para el modo NOT_EXPORTED). Si por el contrario tenemos seleccionado el modo MODIFIED, la forma de saber si un contenedor que se va a exportar ha sido modificado en comparación con su última exportación, es accediendo al atributo Modified en la cabecera del fichero .xml de la última exportación. Ese valor se comparará con la propiedad que guarda la última fecha de modificación del objeto en egeasy, y si son distintas, se procederá a una nueva exportación. Para que la comparación sea posible, es necesario mantener los ficheros .xml de la última exportación en el directorio especificado para ello, o si lo cambiamos, mover los ficheros al nuevo directorio.

Una vez ejecutada la exportación, la nomenclatura de los nombres de los ficheros .xml generados será la siguiente RRC@DRC@NOMBRE_DEL_OBJETO.

Estructura de un objeto en fichero XML

Como ya sabemos, la tecnología utilizada por egImportExport para representar objetos y poder realizar el intercambio de información es XML. Es por ello que saber interpretar la información que incluye un fichero .xml y cómo se estructura es fundamental para poder realizar las operaciones de exportación o importación de objetos.

A continuación iremos explicando las marcas equivalentes a todas aquellas definiciones que afecten a un objeto en ODL.

Formato del contenedor

La estructura base para representar un contenedor en XML es la siguiente:

<Container id="RRC" name="texto" typeName="texto">
   <Header>
      <Domain domain_filename="archivo.xml" typeName="texto" componentName="texto"/>
      <Created date="año:mes:día" user_id="texto"/>
      <Modified date="año:mes:día" user_id="texto"/></Header>
   <Components>
      ...
   <Components/>
</Container>

La marca "Container" contiene tres atributos cuya utilidad es identificar al objeto. El atributo id contendrá el RRC del objeto, el atributo name el nombre del objeto y el atributo typeName contendrá el nombre de la definición del contenedor. Si se utilizan prefijos en la definición del contenedor, tienen que ser incluidos en el typeName.

En la marca "Header" se muestra información relativa a propiedades del objeto como su dominio, su fecha de creación o su fecha de modificación. A su vez, existe una marca para cada una de estas propiedades.

En la etiqueta "Domain" se especificará el dominio del objeto utilizando tres atributos. El atributo domain_filename sólo se utilizará cuando el dominio del objeto que vamos a importar es otro objeto que también importaremos, de manera que tendremos que especificar su fichero .xml. Para el resto de los casos, incluida la exportación, este atributo estará vacío (""). En el atributo typeName se especificará el objeto del sistema en el que está alojada el componente especificado en el atributo componentName.

Las marcas "Created" y "Modified" tienen dos atributos: date y user_id. Si queremos realizar una importación, estos atributos estarán vacíos, ya que se le asigna la fecha y usuario asociado a la importación. Para el caso de la exportación, los valores se tomarán del objeto exportado.

Por último, tenemos la marca "Components", donde se incluyen todas aquellas definiciones que se pueden declarar en un contenedor, que a continuación iremos explicando.

Formato de los componentes

Existen dos atributos que son compartidos por todos los componentes y que lo identifican: los atributos name y typeName. Además, muchos de ellos comparten una misma estructura a la hora de declararlos en XML.

Formulario

<Form name="texto" typeName="texto">(secciones|campos)</Form>

secciones|campos hace referencia a las declaraciones hechas en el formulario.

Sección

<Section name="texto" typeName="texto">campos</Section>

campos hace referencia con cada uno de los campos de la sección.

Documento

<Document name="texto" typeName="texto" subject="texto">archivo.rtf[tabla de remisiones]</Document>

Las tablas de remisiones es un componente que puede o no estar definido, pero que sólo aparece una vez.

Tabla de remisiones

<FieldTable name="texto" typeName="texto">
   <Header>
      <Column name="texto"/></Header>
   <Rows/>
</FieldTable>

Una tabla de remisiones se comporta igual que una tabla de campos exceptuando que permite definir secciones.

Colección

<Collection name="texto" typeName="texto">
   <Header>
      <Column name="_filename"/>
      <Column name="texto"/></Header>
   <Rows>
      <Row>
         <Column name="_filename"/>archivo.xml</Column>
         <Column name="texto">texto</Column></Row></Rows>
</Collection>

La cabecera declara la columna del sistema _filename, que es independiente a la declaración de colección. El resto son las columnas de la definición. Cada fila será la misma cabecera donde las declaraciones Column contienen los valores de esa entrada en la colección.

Clasificador

<Classifier name="texto" typeName="texto">
   <Document document_filename="archivo" document_date="día/mes/año" document_user="texto">archivo</Document></Classifier>

Por cada archivo adjunto existirá una entrada de tipo Document. En la exportación, el nombre del documento document_filename varía del nombre del documento exportado por una necesidad de diferenciar documentos de distintos contenedores que coinciden en su denominación.

<Catalog name="Contenido" typeName="Contenido">
   <Header>
      <Column name="_filename"/>
      <Column name="texto"/></Header>
   <Rows>
      <Row>
         <Column name="_filename"/>archivo.xml</Column>
         <Column name="texto">texto</Column></Row></Rows>
</Catalog>

La cabecera se define con las tres columnas independientes de la declaración y el resto de columnas Column especificadas en la declaración. Cada fila será la misma cabecera donde las columnas contienen los valores de esa entrada en el catálogo.

Campos

Texto, entero, real, lógico, memo, fecha y hora
<FieldString name="texto" typeName="texto">texto</FieldString>
<FieldInteger name="texto" typeName="texto">número</FieldInteger>
<FieldSingle name="texto" typeName="texto">número</FieldSingle>
<FieldBoolean name="texto" typeName="texto">[si|no]</FieldBoolean>
<FieldMemo name="texto" typeName="texto">texto</FieldMemo>
<FieldDate name="texto" typeName="texto">año:mes:día</FieldDate>
<FieldTime name="texto" typeName="texto">hora:minutos:segundo</FieldTime>
Moneda
<FieldCurrency name="texto" typeName="texto" currency="texto">número</FieldCurrency>

En el atributo currency se especifica la moneda a utilizar. Sus posibles valores son "euro" o "peseta".

Código
<FieldCode name="texto" typeName="texto" code="texto">texto</FieldCode>

El atributo code corresponderá al código introducido. Y el valor de la declaración es el rótulo asociado al código dado.

Firma
<FieldSignature name="texto" typeName="texto" date="año:mes:día" user_id="texto" user_drc="número" user_name="texto" position="texto"/>

La importación de una firma no es posible por su particularidad respecto a otros tipos de campos, aunque se permite su declaración en el fichero .xml, aunque realmente, ésta será ignorada.

En el atributo position se especifica el cargo de la persona que firma.

Timbre
<FieldStamp name="texto" typeName="texto" date="año:mes:día" user_id="número" user_drc="número" user_name="texto">texto</FieldStamp>

Comparte la particularidad del campo firma, ya que éste tampoco se puede importar. Al igual que el campo firma, se permite su declaración pero a la hora de importar, será ignorada.

Vínculo
<FieldReference name="texto" typeName="texto" target_filename="archivo.xml">texto</FieldReference>

Cuando realizamos una importación, el objeto vinculado se especifica en el atributo target_filename, que será un fichero .xml. Por tanto, tendremos que realizar antes una exportación del objeto que vamos a vincular, para así obtener su fichero .xml. Si el atributo está vacío, (""), el campo no tendrá ningún vinculo asignado.

Cuando realizamos una exportación, y el vacío indica que no existe el vínculo. El valor de la declaración es la etiqueta del mismo y es informativo. El valor es ignorado en la importación del campo, pues es determinado por el sistema.

Lista de comprobación
<FieldCheckTable name="texto" typeName="texto"><Item selected="[yes|no]">texto</Item></FieldCheckTable>

El atributo Item es cada una de las entradas de la lista de comprobación.

Tabla
<FieldTable name="texto" typeName="texto">
   <Header>
      <Column name="texto"/></Header>
   <Rows/>
</FieldTable>

La marca Column es cada una de las columnas declaradas en la tabla, independientemente del tipo de la misma. Cada fila será el conjunto de declaraciones de campos definidas en la cabecera.

Ejemplos

Ejemplo 1

El siguiente ejemplo corresponde con una ficha con datos personales. Formado por un formulario con campos simple y dos secciones.

<?xml version="1.0"?>
<Container id="12503" name="12345678E" typeName="Otra persona física">
   <Header>
      <Domain domain_filename="" typeName="Otras personas físicas" componentName="contenido"/>
      <Created date="2003:11:14" user_id=""/>
      <Modified date="2003:11:14" user_id=""/></Header>
   <Components>
      <Form name="Datos generales" typeName="Datos generales">
         <FieldString name="N.I.F." typeName="N.I.F.">12345678E</FieldString>
         <FieldString name="Nombre y apellidos" typeName="Nombre y apellidos">Carlos Arvelo Mejía</FieldString>
         <FieldString name="Domicilio" typeName="Domicilio">c\Güimar nº 27</FieldString>
         <FieldString name="Código postal" typeName="Código postal">35230</FieldString>
         <FieldString name="Localidad" typeName="Localidad">Arrecife</FieldString>
         <FieldString name="Provincia" typeName="Provincia">Las Palmas</FieldString>
         <FieldString name="Isla" typeName="Isla">Lanzarote</FieldString>
         <FieldString name="Teléfono" typeName="Teléfono">928854323</FieldString>
         <FieldString name="Fax" typeName="Fax">928854323</FieldString>
         <FieldString name="Correo electrónico" typeName="Correo electrónico">carvelo@hotmail.com</FieldString>
         <Section name="Datos a efectos de notificación" typeName="Datos a efectos de notificación">
            <FieldString name="Domicilio (a.e.n.)" typeName="Domicilio (a.e.n.)">c\Güimar nº 27</FieldString>
            <FieldString name="Código postal (a.e.n.)" typeName="Código postal (a.e.n.)">35230</FieldString>
            <FieldString name="Localidad (a.e.n.)" typeName="Localidad (a.e.n.)">Arrecife</FieldString>
            <FieldString name="Provincia (a.e.n.)" typeName="Provincia (a.e.n.)">Las Palmas</FieldString>
            <FieldString name="Isla (a.e.n.)" typeName="Isla (a.e.n.)">Lanzarote</FieldString></Section>
         <FieldMemo name="Observaciones" typeName="Observaciones">Ejemplo de contenedor: Otra persona física</FieldMemo>
         <Section name="Datos personales" typeName="Datos personales">
            <FieldDate name="Fecha de nacimiento" typeName="Fecha de nacimiento">1956:09:24</FieldDate>
            <FieldString name="Sexo" typeName="Sexo">Hombre</FieldString>
            <FieldString name="Nacionalidad" typeName="Nacionalidad">Española</FieldString></Section></Form></Components>
</Container>

Ejemplo 2

El siguiente ejemplo corresponde con la exportación de una ficha con datos de un alumno.

<?xml version="1.0"?>
<Container id="1723" name="11555" typeName="Alumno">
   <Header>
      <Domain domain_filename="" typeName="Alumnos" componentName="Listado"/>
      <Created date="2006:02:24" user_id="Nacho Méndez"/>
      <Modified date="2006:02:24" user_id="Nacho Méndez"/></Header>
   <Components>
      <Form name="Datos personales" typeName="Datos personales">
         <FieldString name="N.I.F." typeName="N.I.F.">45297666H</FieldString>
         <FieldString name="Nombre" typeName="Nombre">Julian</FieldString>
         <FieldString name="Apellidos" typeName="Apellidos">Mejias López</FieldString>
         <FieldString name="Nº Expediente" typeName="Nº Expediente">1555</FieldString>
         <FieldTable name="Asignaturas" typeName="Asignaturas">
            <Header>
               <Column name="Nombre asignatura"/>
               <Column name="Puntuación"/>
            <Rows>
               <Row>
                  <FieldString name="Nombre asignatura" typeName="Nombre asignatura">Gestión Aplicada</FieldString>
                  <FieldSingle name="Puntuación" typeName="Puntuación">7</FieldSingle></Row>
               <Row>
                  <FieldString name="Nombre asignatura" typeName="Nombre asignatura">Marketing 2</FieldString>
                  <FieldSingle name="Puntuación" typeName="Puntuación">8,5</FieldSingle></Row></Rows></FieldTable></Form>
      <Classifier name="Datos adjuntos" typeName="Datos adjuntos"/>
   </Components>
</Container>

Ejemplo 3

El siguiente ejemplo es válido para la importación de datos de alumnos.

<?xml version="1.0"?>
<Container id="" name="" typeName="Alumno">
   <Header>
      <Domain domain_filename="" typeName="Alumnos" componentName="Listado"/></Header>
   <Components>
      <Form name="Datos personales" typeName="Datos personales">
         <FieldString name="N.I.F." typeName="N.I.F.">43323366G</FieldString>
         <FieldString name="Nombre" typeName="Nombre">Ramón</FieldString>
         <FieldString name="Apellidos" typeName="Apellidos">Díaz Rodríguez</FieldString>
         <FieldString name="Nº Expediente" typeName="Nº Expediente">1002</FieldString>
         <FieldTable name="Asignaturas" typeName="Asignaturas">
            <Header>
               <Column name="Nombre asignatura"/>
               <Column name="Puntuación"/>
            <Rows>
               <Row>
                  <FieldString name="Nombre asignatura" typeName="Nombre asignatura">Gestión Aplicada</FieldString>
                  <FieldSingle name="Puntuación" typeName="Puntuación">6</FieldSingle></Row>
               <Row>
                  <FieldString name="Nombre asignatura" typeName="Nombre asignatura">Marketing 2</FieldString>
                  <FieldSingle name="Puntuación" typeName="Puntuación">4,5</FieldSingle></Row></Rows></FieldTable></Form>
      <Classifier name="Datos adjuntos" typeName="Datos adjuntos"/>
   </Components>
</Container>

Como se observa, para realizar una importación no es necesario especificar por completo la cabecera del contenedor, dichos datos son generados por la aplicación. Pero es imprescindible el typename del contenedor y su dominio.

Los atributos de los componentes han de coincidir siempre con los declarados en egEasy, para que la importación se lleve a cabo correctamente. Es lógico realizar una exportación previa a la importación y reconocer en ella la declaración adecuada de todos los componentes de ese tipo de contenedor. Cada contenedor a importar de un mismo tipo diferirá sólo en los datos, nunca en los atributos de cada declaración de componente.