Capítulo 8: ANEXOS
8 ANEXOS
8.1 INSTALACIÓN EN SERVIDORES LINUXEste anexo pretende servir de guía para instalar la aplicación desarrollada en un sistema Linux.
Concretamente se detalla el proceso de instalación para un sistema Debian, en este caso Guadalinex. El proceso es similar para otras distribuciones, como Red Hat.
La aplicación desarrollada necesita de la instalación de dos componentes: el servidor de bases de datos MySQL y el contenedor de servlets Apache Tomcat.
8.1.1 MySQLA continuación se detalla paso a paso el proceso de instalación del servidor de bases de datos:
1. Para instalar MySQL, es necesario instalar dos paquetes: mysqlserver y mysqlclient. Para ello, basta con ejecutar las dos siguientes instrucciones en la línea de comandos:
● $ sudo aptget install mysqlserver
● $ sudo aptget install mysqlclient
2. Creamos la contraseña del usuario root de la base de datos, ya que ésta no se crea por defecto:
● $ sudo /usr/bin/mysqladmin u root password clave
3. MySQL inicialmente sólo escucha en la dirección local, es decir, no es accesible desde el exterior. Como la aplicación alojada en el servidor va a ser la que acceda a la base de datos, por seguridad, dejaremos esta opción por defecto. Se puede modificar editando el archivo de configuración de MySQL (/etc/mysql/my.cnf).
4. Creamos el usuario rmcell, que será el propietario de la base de datos de la aplicación (rmcell):
● $ mysql uroot p
● mysql > CREATE USER rmcell IDENTIFIED BY 'rmcell';
5. Creamos la base de datos de la aplicación (rmcell):
● mysql > CREATE DATABASE rmcell;
6. Le damos permisos al usuario rmcell sobre la base de datos rmcell, ya que en la aplicación éste será el usuario que acceda a dicha base de datos.
● mysql > GRANT ALL ON rmcell.* TO rmcell;
7. Restauramos el backup de la base de datos original:
● $ mysql urmcell prmcell rmcell < rmcell_backup.sql
8.1.2 Apache TomcatA continuación se detalla paso a paso el proceso de instalación del servidor de aplicaciones Apache
Tomcat.
188
Capítulo 8: ANEXOS
1. Tomcat necesita, para poder ejecutarse, una máquina virtual java. Por defecto, los sistemas Debian ya la traen instalada, por lo que simplemente creamos un enlace simbólico en /opt/ a la ubicación de java:
● $ ln s /usr/lib/jvm/java1.5.0sun/jre java
2. Descargamos el paquete apachetomcat5.5.x.tar.gz de http://tomcat.apache.org en /opt/
3. Descomprimimos el paquete:
● cd /opt
● tar zxvf apachetomcat5.5.26.tar.gz
4. Creamos un enlace simbólico de /opt/tomcat al directorio de instalación de tomcat:
● ln s /opt/apachetomcat5.5.26 tomcat
5. Añadir las variables de entorno a /opt/tomcat/bin/catalina.sh (justo debajo de los primeros comentarios):
CATALINA_HOME="/opt/tomcat" JAVA_HOME="/opt/java" JAVA_OPTS="server Xmx768m XX:PermSize=256m XX:MaxPermSize=256m" CATALINA_PID="${CATALINA_HOME}/logs/tomcat.pid"
6. Crear el fichero de configuración del script de arranque de tomcat /etc/sysconfig/tomcat:
CATALINA_HOME="/opt/tomcat" TOMCAT_USER="rmcell" CATALINA_PID="${CATALINA_HOME}/logs/tomcat.pid"
7. Crear el script de arranque de tomcat /etc/init.d/tomcat
189
Capítulo 8: ANEXOS
#!/bin/bash## Init file for Tomcat server daemon## description: Tomcat server daemon#
if [ f /etc/sysconfig/tomcat ]then. /etc/sysconfig/tomcatelseecho "Error, no existe el fichero de configuracion '/etc/sysconfig/tomcat'"exit 1fi
export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"RETVAL=1
function esta_activo(){ELPID=`cat ${CATALINA_PID} 2>/dev/null`ACTIVO=`ps axf | grep "${ELPID} " | grep v grep | grep java | wc l`}
case "$1" instart)esta_activoif [ ${ACTIVO} eq 0 ]thensu ${TOMCAT_USER} c "${CATALINA_HOME}/bin/startup.sh"RETVAL=$?elseecho "Error, el servicio Tomcat(${ELPID}) esta activo, abortando..."fi;;stop)esta_activoif [ ${ACTIVO} eq 1 ]thensu ${TOMCAT_USER} c "${CATALINA_HOME}/bin/shutdown.sh"RETVAL=$?sleep 5esta_activoif [ ${ACTIVO} eq 1 ]thenecho "Error, el servicio Tomcat contiua activo. Matando el proceso Tomcat(${ELPID}) ..."
190
Capítulo 8: ANEXOS
su ${TOMCAT_USER} c "kill ${ELPID}"fielseecho "Error, el servicio Tomcat esta inactivo, abortando..."fi;;status)esta_activoif [ ${ACTIVO} eq 1 ]thenecho "El servicio Tomcat esta activo (pid ${ELPID})"RETVAL=0elseecho "El servicio Tomcat esta inactivo"fi;;restart)/etc/init.d/tomcat stopsleep 10/etc/init.d/tomcat start;;
*)echo "Usage: /etc/init.d/tomcat {start|stop|restart|status}"esac
exit ${RETVAL}
Tabla 86: script de arranque de Tomcat
8. Darle permiso de ejecución al script
● chmod 755 /etc/init.d/tomcat
9. Crear los enlaces simbólicos en la estructura /etc/rcx.d/ para que el servicio arranque de forma automática
● cd /etc/rcx.d
● ln s /etc/init.d/tomcat S90tomcat
10. Definir los roles de usuarios de tomcat en /opt/tomcat/conf/tomcatusers.xml
<?xml version="1.0" encoding="UTF8"?> <tomcatusers> <role rolename="manager"/> <user username="rmcell" password="rmcell" roles="manager"/> <user name="tomcat" password="tomcat" roles="tomcat" /> </tomcatusers>
11. Eliminar las aplicaciones por defecto de webapps, y enlazar el manager de tomcat
● cd /opt/tomcat
191
Capítulo 8: ANEXOS
● mv webapps oldwebapps
● mkdir webapps
● cd wepapps
● ln –s ../server/webapps/manager manager
12. Editar el fichero de configuración de Tomcat server.xml. Este fichero debe ser igual que el mostrado a continuación:
192
Capítulo 8: ANEXOS
<?xml version="1.0" encoding="UTF8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className= "org.apache.catalina.core.AprLifecycleListener" /> <Listener className= "org.apache.catalina.mbeans.ServerLifecycleListener" /> <Listener className= "org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className= "org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>
<GlobalNamingResources> <Environment name="simpleValue" type="java.lang.Integer" value="30"/> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcatusers.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />
<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
<Host name="fabricacion" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="/rmcell" docBase="rmcell" reloadable="true" debug="0"> </Context>
</Host>
</Engine>
193
Capítulo 8: ANEXOS
</Service>
</Server>
Tabla 87: archivo de configuración server.xml
13. Cambiar el propietario de todos los archivos de /opt/tomcat
● cd /opt
● chown R rmcell:rmcell tomcat
8.1.3 Despliegue de la aplicaciónLa aplicación la desplegamos en el directorio en el que sirve por defecto el servidor de aplicaciones
Tomcat, es decir, en /opt/tomcat/webapps/. Para ello, debemos copiar en dicha carpeta el archivo comprimido con la aplicación (rmcellApl.tar.gz) y, posteriormente, descomprimirlo:
● $ cd /opt/tomcat/webapps
● $ tar zxvf rmcellApl.tar.gz
A continuación, será necesario arrancar Tomcat. Para ello se ejecuta su script de arranque:
● $ /etc/init.d/tomcat start
La aplicación es accesible desde este momento a través de un navegador web.
194
Capítulo 8: ANEXOS
8.2 INSTALACIÓN EN SERVIDORES WINDOWSEste anexo pretende servir de guía para instalar la aplicación en un servidor Windows. En concreto
se ha comprobado la instalación para un servidor Windows Xp Home Edition.
La aplicación para poder funcionar en una determinada máquina necesita dos componentes: el contenedor de servlets Apache Tomcat y el servidor de bases de datos MySQL.
A continuación se detallan los pasos a seguir para instalar estos componentes y desplegar la aplicación.
8.2.1 Apache Tomcat1. Para la instalación de Apache Tomcat es necesario disponer en el servidor de una JVM (Java
Vietual Machine) Los sistemas Windows suelen traerla instalada. En caso contrario, será necesario descargarla e instalarla previamente.
2. Descargar el instalador para Windows de Apache Tomcat de la página http://tomcat.apache.org. La versión debe ser igual o superior a la 5.5.
3. Instalar el paquete descargado según el procedimiento habitual de instalación en Windows. Al pulsar sobre el ejecutable, un asistente nos irá guiando para instalar correctamente el aplicativo.
4. Una vez finalizada la instalación, el servidor de aplicaciones estará listo para ser ejecutado.
8.2.2 MySQL1. Para instalar el servidor de bases de datos MySQL es necesario en primer lugar descargar el
instalador de la aplicación para el sistema operativo utilizado en el servidor. Está disponible en la página http://www.mysql.com/.
2. Instalar el ejecutable descargado según el procedimiento habitual de instalación en Windows. Un asistente nos guiará para completar la instalación correctamente.
3. Una vez que el servidor está instalado, ejecutamos el cliente MySQL desde línea de comandos, para crear la base de datos y el usuario de la aplicación. Para ello, ejecutamos las siguientes instrucciones en el orden indicado:
● CREATE USER rmcell IDENTIFIED BY 'rmcell';
● CREATE DATABASE rmcell;
● GRANT ALL ON rmcell.* TO rmcell;
4. Finalmente, será necesario volcar el backup de la base de datos en el servidor. Para ello, en primer lugar se instala el paquete de herramientas de desarrollo y administración de MySQL 5.0 mysqlguitools5.0 disponible en http://www.mysql.com/.
5. Ejecutamos MySQL Administrator. En la opción de “Restore” abrimos el fichero de backup de la base de datos (Restore > Open Backup File) e iniciamos el proceso de restauración (Restore > Start Restore).
6. Una vez finalizado el proceso de restauración, la base de datos de la aplicación estará
195
Capítulo 8: ANEXOS
completamente instalada.
8.2.3 Despliegue de la aplicaciónLa aplicación la desplegamos en el directorio en el que sirve por defecto el servidor de aplicaciones
Tomcat, es decir en C:\Archivos de programa\Apache Software Foundation\Tomcat 5.5\webapps. Para ello, debemos copiar en dicha carpeta el archivo comprimido de la aplicación (rmcellAplWXP.tar.gz) y posteriormente descomprimirlo.
196
Capítulo 8: ANEXOS
8.3 INSTALACIÓN PARA DESARROLLOPara desarrollar y mantener la aplicación, es necesario disponer además de los aplicativos
necesarios para el funcionamiento de la misma, Apache Tomcat y MySQL, la herramienta de desarrollo de proyectos Java Eclipse.
En un sistema Linux Debian para instalar el entorno de desarrollo para Java Eclipse se utiliza la herramienta aptget, ejecutando en línea de comandos:
● aptget install eclipse
En un sistema Windows tendremos que descargar Eclipse e instalarlo.
La primera vez que abrimos el entorno de desarrollo Eclipse, nos pedirá que introduzcamos un directorio de trabajo. Ya que la aplicación está desplegada en el /opt/tomcat/webapps/, podemos elegir este directorio.
En el caso de tener en la máquina de desarrollo instalado el sistema operativo Windows, fijaremos el directorio de trabajo a la ubicación de la carpeta webapps de Tomcat para ese caso.
A continuación, y para poder desarrollar y mantener la aplicación con Eclipse, debemos abrir un nuevo proyecto a partir del proyecto existente de rmcell que previamente hemos desplegado en la carpeta webapps de Tomcat según detallan los anexos de de instalación de la aplicación en sistemas Linux y Windows.
Para ello, en el menú superior de Eclipse debemos seleccionar la opción de crear un proyecto nuevo (File > New > Project). Habrá que indicar posteriormente la ubicación del proyecto a abrir, que será la aplicación.
197
Figura 43: selección del escritorio de trabajo en Eclipse
Capítulo 8: ANEXOS
198
Figura 44: creación de proyecto en Eclipse
Capítulo 8: ANEXOS
8.4 ARCHIVO .SQL DE LA BASE DE DATOSEs conveniente hacer copias de seguridad de la base de datos de forma periódica para poder
restaurarla en caso de que ocurra un error inesperado que elimine todos los datos de la misma. Además, las copias de seguridad son también útiles para migrar toda la base de datos de un servidor a otro.
Para obtener un archivo de backup .sql de la base de datos basta con ejecutar la siguiente instrucción en línea de comandos5:
$ mysqldump u usuario ppassword nombre_base_datos > backup.sql
Para el caso de la aplicación desarrollada, el usuario, el password y el nombre de la base de datos son “rmcell”. El fichero de backup podrá tener cualquier nombre, siempre con extensión sql.
Para restaurar el fichero de backup en la base de datos para que ésta quede exactamente igual que en el momento de realizar la copia de seguridad, basta con ejecutar la siguiente orden:
$ mysql u usuario ppassword nombre_base_datos < backup.sql
Para volcar el fichero tiene que existir necesariamente en el servidor MySQL la base de datos, aunque ésta puede estar vacía. Es decir, si queremos, por ejemplo, instalar la aplicación en el servidor definitivo, en primer lugar será necesario crear la base de datos de la aplicación y, a continuación, volcar el fichero de backup de la misma. A partir de ese momento la base de datos estará implementada por completo en el servidor, con todas sus tablas y características.
El fichero de backup .sql no es más que un fichero de texto plano que contiene un conjunto de instrucciones escritas en código sql. Al restaurar el fichero, se solicita al servidor mysqlserver que ejecute dichas sentencias, mediante las cuales se crea en la base de datos el conjunto de tablas, las relaciones entre ellas y los datos de las mismas. El fichero de la base de datos vacía de la aplicación se presenta a continuación:
5 Es necesario tener instalado el cliente de MySQL, MySQLclient, para poder realizar el backup mediante la instrucción indicada. También se pueden realizar archivos de backup con gestores de bases de datos MySQL gráficos como MySQL Query Browser.
199
Capítulo 8: ANEXOS
MySQL dump 10.10
Host: localhost Database: rmcell
Server version 5.0.24aDebian_9ubuntu2.4log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
Table structure for table `maquina`
DROP TABLE IF EXISTS `maquina`;
CREATE TABLE `maquina` (
`codMaquina` int(10) unsigned NOT NULL auto_increment,
`descripcion` varchar(45) NOT NULL,
`estado` tinyint(1) unsigned NOT NULL default '1',
`costeNoUso` int(10) unsigned NOT NULL default '0',
`costeInclusion` int(10) unsigned NOT NULL default '0',
`costeRetirada` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`codMaquina`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
200
Capítulo 8: ANEXOS
Dumping data for table `maquina`
/*!40000 ALTER TABLE `maquina` DISABLE KEYS */;
LOCK TABLES `maquina` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `maquina` ENABLE KEYS */;
Table structure for table `modulo`
DROP TABLE IF EXISTS `modulo`;
CREATE TABLE `modulo` (
`codModulo` int(10) unsigned NOT NULL auto_increment,
`descripcion` varchar(45) NOT NULL,
`cantidad` int(10) unsigned NOT NULL default '1',
`tipo` varchar(1) NOT NULL default '',
`costeNoUso` int(10) unsigned NOT NULL default '0',
`costeInstalacion` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`codModulo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dumping data for table `modulo`
/*!40000 ALTER TABLE `modulo` DISABLE KEYS */;
LOCK TABLES `modulo` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `modulo` ENABLE KEYS */;
201
Capítulo 8: ANEXOS
Table structure for table `operacion`
DROP TABLE IF EXISTS `operacion`;
CREATE TABLE `operacion` (
`codOperacion` int(10) unsigned NOT NULL auto_increment,
`descripcion` varchar(45) NOT NULL,
`estado` tinyint(1) default '1',
PRIMARY KEY (`codOperacion`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dumping data for table `operacion`
/*!40000 ALTER TABLE `operacion` DISABLE KEYS */;
LOCK TABLES `operacion` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `operacion` ENABLE KEYS */;
Table structure for table `plan`
DROP TABLE IF EXISTS `plan`;
CREATE TABLE `plan` (
`codPlan` int(10) unsigned NOT NULL auto_increment,
`descripcion` varchar(45) NOT NULL,
`estado` tinyint(1) unsigned NOT NULL default '1',
`codOperacion` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`codPlan`),
KEY `codOperacionPlan` (`codOperacion`),
CONSTRAINT `codOperacionPlan` FOREIGN KEY (`codOperacion`)
202
Capítulo 8: ANEXOS
REFERENCES `operacion` (`codOperacion`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dumping data for table `plan`
/*!40000 ALTER TABLE `plan` DISABLE KEYS */;
LOCK TABLES `plan` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `plan` ENABLE KEYS */;
Table structure for table `planmaquinamodulo`
DROP TABLE IF EXISTS `planmaquinamodulo`;
CREATE TABLE `planmaquinamodulo` (
`codPlan` int(10) unsigned NOT NULL default '0',
`codMaquina` int(10) unsigned NOT NULL default '0',
`codModulo` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`codPlan`,`codMaquina`,`codModulo`),
KEY `codMaquina` (`codMaquina`),
KEY `codModulo` (`codModulo`),
CONSTRAINT `codMaquina` FOREIGN KEY (`codMaquina`) REFERENCES `maquina` (`codMaquina`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `codModulo` FOREIGN KEY (`codModulo`) REFERENCES `modulo` (`codModulo`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `codPlanMaq` FOREIGN KEY (`codPlan`) REFERENCES `plan` (`codPlan`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dumping data for table `planmaquinamodulo`
203
Capítulo 8: ANEXOS
/*!40000 ALTER TABLE `planmaquinamodulo` DISABLE KEYS */;
LOCK TABLES `planmaquinamodulo` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `planmaquinamodulo` ENABLE KEYS */;
Table structure for table `proceso`
DROP TABLE IF EXISTS `proceso`;
CREATE TABLE `proceso` (
`codProceso` int(10) unsigned NOT NULL auto_increment,
`descripcion` varchar(45) NOT NULL default '""',
`estado` tinyint(1) default '1',
`codProducto` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`codProceso`),
KEY `codProductoProceso` (`codProducto`),
CONSTRAINT `codProductoProceso` FOREIGN KEY (`codProducto`) REFERENCES `producto` (`codProducto`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dumping data for table `proceso`
/*!40000 ALTER TABLE `proceso` DISABLE KEYS */;
LOCK TABLES `proceso` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `proceso` ENABLE KEYS */;
204
Capítulo 8: ANEXOS
Table structure for table `procesooperacion`
DROP TABLE IF EXISTS `procesooperacion`;
CREATE TABLE `procesooperacion` (
`codProceso` int(10) unsigned NOT NULL default '0',
`orden` int(10) unsigned NOT NULL default '0',
`codOperacion` int(10) unsigned NOT NULL default '0',
`tiempo` time NOT NULL default '00:00:00',
PRIMARY KEY (`codProceso`,`orden`,`codOperacion`),
KEY `codOperacion` (`codOperacion`),
CONSTRAINT `codOperacion` FOREIGN KEY (`codOperacion`) REFERENCES `operacion` (`codOperacion`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `codProcesoOp` FOREIGN KEY (`codProceso`) REFERENCES `proceso` (`codProceso`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dumping data for table `procesooperacion`
/*!40000 ALTER TABLE `procesooperacion` DISABLE KEYS */;
LOCK TABLES `procesooperacion` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `procesooperacion` ENABLE KEYS */;
Table structure for table `producto`
DROP TABLE IF EXISTS `producto`;
CREATE TABLE `producto` (
`codProducto` int(10) unsigned NOT NULL auto_increment,
205
Capítulo 8: ANEXOS
`descripcion` varchar(45) NOT NULL,
`estado` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`codProducto`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dumping data for table `producto`
/*!40000 ALTER TABLE `producto` DISABLE KEYS */;
LOCK TABLES `producto` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `producto` ENABLE KEYS */;
Table structure for table `proyecto`
DROP TABLE IF EXISTS `proyecto`;
CREATE TABLE `proyecto` (
`codProyecto` int(10) unsigned NOT NULL auto_increment,
`nombreProyecto` varchar(45) NOT NULL default '',
`fechaProyecto` date NOT NULL default '00000000',
`horaProyecto` time NOT NULL default '00:00:00',
`codUsuario` int(10) unsigned NOT NULL default '1',
`aleatorio` tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (`codProyecto`),
KEY `codUsuarioProyecto` (`codUsuario`),
CONSTRAINT `codUsuarioProyecto` FOREIGN KEY (`codUsuario`) REFERENCES `usuario` (`codUsuario`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dumping data for table `proyecto`
206
Capítulo 8: ANEXOS
/*!40000 ALTER TABLE `proyecto` DISABLE KEYS */;
LOCK TABLES `proyecto` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `proyecto` ENABLE KEYS */;
Table structure for table `proyectoplan`
DROP TABLE IF EXISTS `proyectoplan`;
CREATE TABLE `proyectoplan` (
`codProyecto` int(10) unsigned NOT NULL,
`codPlan` int(10) unsigned NOT NULL,
PRIMARY KEY (`codProyecto`,`codPlan`),
KEY `codPlanProyecto` (`codPlan`),
CONSTRAINT `codPlanProyecto` FOREIGN KEY (`codPlan`) REFERENCES `plan` (`codPlan`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `codProyectoPlan` FOREIGN KEY (`codProyecto`) REFERENCES `proyecto` (`codProyecto`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dumping data for table `proyectoplan`
/*!40000 ALTER TABLE `proyectoplan` DISABLE KEYS */;
LOCK TABLES `proyectoplan` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `proyectoplan` ENABLE KEYS */;
207
Capítulo 8: ANEXOS
Table structure for table `proyectoproceso`
DROP TABLE IF EXISTS `proyectoproceso`;
CREATE TABLE `proyectoproceso` (
`codProyecto` int(10) unsigned NOT NULL,
`codProceso` int(10) unsigned NOT NULL,
PRIMARY KEY (`codProyecto`,`codProceso`),
KEY `codProcesoProy` (`codProceso`),
CONSTRAINT `codProcesoProy` FOREIGN KEY (`codProceso`) REFERENCES `proceso` (`codProceso`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `codProyectoProceso` FOREIGN KEY (`codProyecto`) REFERENCES `proyecto` (`codProyecto`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dumping data for table `proyectoproceso`
/*!40000 ALTER TABLE `proyectoproceso` DISABLE KEYS */;
LOCK TABLES `proyectoproceso` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `proyectoproceso` ENABLE KEYS */;
Table structure for table `proyectoproducto`
DROP TABLE IF EXISTS `proyectoproducto`;
CREATE TABLE `proyectoproducto` (
`codProyecto` int(10) unsigned NOT NULL,
`codProducto` int(10) unsigned NOT NULL,
`demanda` int(10) unsigned NOT NULL,
208
Capítulo 8: ANEXOS
PRIMARY KEY USING BTREE (`codProyecto`,`codProducto`),
KEY `codProducto` (`codProducto`),
CONSTRAINT `codProducto` FOREIGN KEY (`codProducto`) REFERENCES `producto` (`codProducto`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `codProyecto` FOREIGN KEY (`codProyecto`) REFERENCES `proyecto` (`codProyecto`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dumping data for table `proyectoproducto`
/*!40000 ALTER TABLE `proyectoproducto` DISABLE KEYS */;
LOCK TABLES `proyectoproducto` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `proyectoproducto` ENABLE KEYS */;
Table structure for table `usuario`
DROP TABLE IF EXISTS `usuario`;
CREATE TABLE `usuario` (
`codUsuario` int(10) unsigned NOT NULL auto_increment,
`nombre` varchar(45) NOT NULL,
`clave` varchar(45) NOT NULL default '',
`perfil` tinyint(4) NOT NULL default '0',
PRIMARY KEY (`codUsuario`),
UNIQUE KEY `nombre` (`nombre`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Dumping data for table `usuario`
209
Capítulo 8: ANEXOS
/*!40000 ALTER TABLE `usuario` DISABLE KEYS */;
LOCK TABLES `usuario` WRITE;
UNLOCK TABLES;
/*!40000 ALTER TABLE `usuario` ENABLE KEYS */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
Tabla 88: Archivo .sql de la base de datos
210
Capítulo 8: ANEXOS
8.5 EJEMPLO DE ALMACENAMIENTO DE UN PROYECTO EN LA BASE DE DATOS
En este anexo se presenta como se almacena la información de un problema de fabricación en entornos reconfigurables en las diferentes tablas de la base de datos. En concreto se estudia el ejemplo propuesto en [2], que ha servido de base para el análisis y diseño del modelo de datos de la aplicación, así como para la definición de los elementos que forman parte de un proyecto de fabricación de este tipo.
Dicho problema esta formado por una serie de elementos que se recogen en las dos siguientes tablas. En la primera de ellas aparecen los productos, sus demandas y los procesos de fabricación de cada uno de ellos; mientras que en la segunda aparecen las operaciones y sus planes de operación.
211
Capítulo 8: ANEXOS
Producto Proceso de fabricación
Operaciones del proceso de fabricación
Demanda del producto
1 1 3681112 60
2 31112811
2 1 711012 350
2 10111710
3 1 24628 550
2 4682134
4 1 35912 120
2 39129
5 1 5710131 320
2 751105
6 1 2712 75
2 21210
3 2102
7 1 4911138 400
2 11138114
8 1 37115 205
2 75115
9 1 138 45
10 1 7812212 175
2 82912
Tabla 89: productos y sus procesos de fabricación
212
Capítulo 8: ANEXOS
Máquina Módulos básicos Módulos auxiliares Operación
1 1,3 17,22 3
1,3 12,13,15,20,21 10
1,3 11,17,18,20,22 12
2 1,2,5 15,17,18 5
1,2,5 11,14,16,22,24,25 8
3 3,4,6 14,16 1
3,4,6 13,19,24 4
3,4,6 11,12,15,18,20 7
4 3,7 13,14,19 2
3,7 11,12,14,16,18 9
3,7 12,13,14,17,19,20 11
5 5,6,8 18,23 3
5,6,8 13,14,17,18 6
5,6,8 11,15,18,20,21 10
6 4,5,10 16,17,19,23,25 2
4,5,10 20,22 11
4,5,10 11,12,13,15,20 13
7 7,9 20,22,24 1
7,9 13,15,16,18,19,21 11
7,9 14,17 12
8 2,4,7 18,19,21,22,25 7
2,4,7 14,16 13
9 8,9 12,14,15 5
8,9 13,15,16,18,19,24 8
213
Capítulo 8: ANEXOS
8,9 11,17,18,20,21 12
10 1,9,10 11,14,18,22,23 4
1,9,10 17,19 6
Tabla 90: operaciones, máquinas y módulos
A continuación se representa el conjunto de tablas de la base de datos del sistema tras haber almacenado el problema utilizando la aplicación web:+++++++
| codProyecto | nombreProyecto | fechaProyecto | horaProyecto | codUsuario | aleatorio |
+++++++
| 1 | problema tipo | 20081227 | 14:56:59 | 1 | 0 |
+++++++
Tabla 91: tabla 'proyecto'
++++
| codProducto | descripcion | estado |
++++
| 1 | producto 1 | 1 |
| 2 | producto 2 | 1 |
| 3 | producto 3 | 1 |
| 4 | producto 4 | 1 |
| 5 | producto 5 | 1 |
| 6 | producto 6 | 1 |
| 7 | producto 7 | 1 |
| 8 | producto 8 | 1 |
| 9 | producto 9 | 1 |
| 10 | producto 10 | 1 |
++++
Tabla 92: tabla 'producto'
214
Capítulo 8: ANEXOS
++++
| codProyecto | codProducto | demanda |
++++
| 1 | 1 | 60 |
| 1 | 2 | 350 |
| 1 | 3 | 550 |
| 1 | 4 | 120 |
| 1 | 5 | 320 |
| 1 | 6 | 75 |
| 1 | 7 | 400 |
| 1 | 8 | 205 |
| 1 | 9 | 45 |
| 1 | 10 | 175 |
+++
Tabla 93: tabla 'proyectoproducto'
215
Capítulo 8: ANEXOS
+++++
| codProceso | descripcion | estado | codProducto |
+++++
| 1 | proceso 1_1 | 1 | 1 |
| 2 | proceso 2_1 | 1 | 1 |
| 3 | proceso 1_2 | 1 | 2 |
| 4 | proceso 2_2 | 1 | 2 |
| 5 | proceso 1_3 | 1 | 3 |
| 6 | proceso 2_3 | 1 | 3 |
| 8 | proceso 1_4 | 1 | 4 |
| 9 | proceso 2_4 | 1 | 4 |
| 10 | proceso 1_5 | 1 | 5 |
| 11 | proceso 2_5 | 1 | 5 |
| 12 | proceso 1_6 | 1 | 6 |
| 13 | proceso 2_6 | 1 | 6 |
| 14 | proceso 3_6 | 1 | 6 |
| 15 | proceso 1_7 | 1 | 7 |
| 16 | proceso 2_7 | 1 | 7 |
| 17 | proceso 1_8 | 1 | 8 |
| 18 | proceso 2_8 | 1 | 8 |
| 19 | proceso 1_9 | 1 | 9 |
| 20 | proceso 1_10 | 1 | 10 |
| 21 | proceso 2_10 | 1 | 10 |
+++++
Tabla 94: tabla 'proceso'
216
Capítulo 8: ANEXOS
+++
| codProyecto | codProceso |
+++
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
| 1 | 6 |
| 1 | 8 |
| 1 | 9 |
| 1 | 10 |
| 1 | 11 |
| 1 | 12 |
| 1 | 13 |
| 1 | 14 |
| 1 | 15 |
| 1 | 16 |
| 1 | 17 |
| 1 | 18 |
| 1 | 19 |
| 1 | 20 |
| 1 | 21 |
+++
Tabla 95: tabla 'proyectoproceso'
217
Capítulo 8: ANEXOS
++++
| codOperacion | descripcion | estado |
++++
| 1 | operación 1 | 1 |
| 2 | operación 2 | 1 |
| 3 | operación 3 | 1 |
| 4 | operación 4 | 1 |
| 5 | operación 5 | 1 |
| 6 | operación 6 | 1 |
| 7 | operación 7 | 1 |
| 8 | operación 8 | 1 |
| 9 | operación 9 | 1 |
| 10 | operación 10 | 1 |
| 11 | operación 11 | 1 |
| 12 | operación 12 | 1 |
| 13 | operación 13 | 1 |
++++
Tabla 96: tabla 'operación'
218
Capítulo 8: ANEXOS
+++++
| codProceso | orden | codOperacion | tiempo |
+++++
| 1 | 1 | 3 | 00:00:00 |
| 1 | 2 | 6 | 00:00:00 |
| 1 | 3 | 8 | 00:00:00 |
| 1 | 4 | 11 | 00:00:00 |
| 1 | 5 | 12 | 00:00:00 |
| 2 | 1 | 3 | 00:00:00 |
| 2 | 2 | 11 | 00:00:00 |
| 2 | 3 | 12 | 00:00:00 |
| 2 | 4 | 8 | 00:00:00 |
| 2 | 5 | 11 | 00:00:00 |
| 3 | 1 | 7 | 00:00:00 |
| 3 | 2 | 1 | 00:00:00 |
| 3 | 3 | 10 | 00:00:00 |
| 3 | 4 | 12 | 00:00:00 |
| 4 | 1 | 10 | 00:00:00 |
| 4 | 2 | 11 | 00:00:00 |
| 4 | 3 | 1 | 00:00:00 |
| 4 | 4 | 7 | 00:00:00 |
| 4 | 5 | 10 | 00:00:00 |
| 5 | 1 | 2 | 00:00:00 |
| 5 | 2 | 4 | 00:00:00 |
| 5 | 3 | 6 | 00:00:00 |
| 5 | 4 | 2 | 00:00:00 |
| 5 | 5 | 8 | 00:00:00 |
| 6 | 1 | 4 | 00:00:00 |
| 6 | 2 | 6 | 00:00:00 |
| 6 | 3 | 8 | 00:00:00 |
| 6 | 4 | 2 | 00:00:00 |
| 6 | 5 | 13 | 00:00:00 |
| 6 | 6 | 4 | 00:00:00 |
| 8 | 1 | 3 | 00:00:00 |
219
Capítulo 8: ANEXOS
| 8 | 2 | 5 | 00:00:00 |
| 8 | 3 | 9 | 00:00:00 |
| 8 | 4 | 12 | 00:00:00 |
| 9 | 1 | 3 | 00:00:00 |
| 9 | 2 | 9 | 00:00:00 |
| 9 | 3 | 12 | 00:00:00 |
| 9 | 4 | 9 | 00:00:00 |
| 10 | 1 | 5 | 00:00:00 |
| 10 | 2 | 7 | 00:00:00 |
| 10 | 3 | 10 | 00:00:00 |
| 10 | 4 | 13 | 00:00:00 |
| 10 | 5 | 1 | 00:00:00 |
| 11 | 1 | 7 | 00:00:00 |
| 11 | 2 | 5 | 00:00:00 |
| 11 | 3 | 1 | 00:00:00 |
| 11 | 4 | 10 | 00:00:00 |
| 11 | 5 | 5 | 00:00:00 |
| 12 | 1 | 2 | 00:00:00 |
| 12 | 2 | 7 | 00:00:00 |
| 12 | 3 | 12 | 00:00:00 |
| 13 | 1 | 2 | 00:00:00 |
| 13 | 2 | 12 | 00:00:00 |
| 13 | 3 | 10 | 00:00:00 |
| 14 | 1 | 2 | 00:00:00 |
| 14 | 2 | 10 | 00:00:00 |
| 14 | 3 | 2 | 00:00:00 |
| 15 | 1 | 4 | 00:00:00 |
| 15 | 2 | 9 | 00:00:00 |
| 15 | 3 | 11 | 00:00:00 |
| 15 | 4 | 13 | 00:00:00 |
| 15 | 5 | 8 | 00:00:00 |
| 16 | 1 | 11 | 00:00:00 |
| 16 | 2 | 13 | 00:00:00 |
| 16 | 3 | 8 | 00:00:00 |
220
Capítulo 8: ANEXOS
| 16 | 4 | 11 | 00:00:00 |
| 16 | 5 | 4 | 00:00:00 |
| 17 | 1 | 3 | 00:00:00 |
| 17 | 2 | 7 | 00:00:00 |
| 17 | 3 | 11 | 00:00:00 |
| 17 | 4 | 5 | 00:00:00 |
| 18 | 1 | 7 | 00:00:00 |
| 18 | 2 | 5 | 00:00:00 |
| 18 | 3 | 11 | 00:00:00 |
| 18 | 4 | 5 | 00:00:00 |
| 19 | 1 | 1 | 00:00:00 |
| 19 | 2 | 3 | 00:00:00 |
| 19 | 3 | 8 | 00:00:00 |
| 20 | 1 | 7 | 00:00:00 |
| 20 | 2 | 8 | 00:00:00 |
| 20 | 3 | 12 | 00:00:00 |
| 20 | 4 | 2 | 00:00:00 |
| 20 | 5 | 12 | 00:00:00 |
| 21 | 1 | 8 | 00:00:00 |
| 21 | 2 | 2 | 00:00:00 |
| 21 | 3 | 9 | 00:00:00 |
| 21 | 4 | 12 | 00:00:00 |
+++++
Tabla 97: tabla 'procesooperacion'
221
Capítulo 8: ANEXOS
+++++
| codPlan | descripcion | estado | codOperacion |
+++++
| 1 | plan 1_1 | 1 | 1 |
| 2 | plan 1_3 | 1 | 3 |
| 3 | plan 1_12 | 1 | 12 |
| 4 | plan 1_5 | 1 | 5 |
| 5 | plan 1_8 | 1 | 8 |
| 6 | plan 1_4 | 1 | 4 |
| 7 | plan 1_7 | 1 | 7 |
| 8 | plan 2_1 | 1 | 1 |
| 9 | plan 1_2 | 1 | 2 |
| 10 | plan 2_2 | 1 | 2 |
| 11 | plan 2_3 | 1 | 3 |
| 12 | plan 2_4 | 1 | 4 |
| 13 | plan 2_5 | 1 | 5 |
| 14 | plan 1_6 | 1 | 6 |
| 15 | plan 2_6 | 1 | 6 |
| 16 | plan 2_7 | 1 | 7 |
| 17 | plan 2_8 | 1 | 8 |
| 18 | plan 1_9 | 1 | 9 |
| 19 | plan 1_10 | 1 | 10 |
| 20 | plan 2_10 | 1 | 10 |
| 21 | plan 1_11 | 1 | 11 |
| 22 | plan 2_11 | 1 | 11 |
| 23 | plan 3_11 | 1 | 11 |
| 24 | plan 2_12 | 1 | 12 |
| 25 | plan 3_12 | 1 | 12 |
| 26 | plan 1_13 | 1 | 13 |
| 27 | plan 2_13 | 1 | 13 |
+++++
Tabla 98: tabla 'plan'
222
Capítulo 8: ANEXOS
+++
| codProyecto | codPlan |
+++
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
| 1 | 6 |
| 1 | 7 |
| 1 | 8 |
| 1 | 9 |
| 1 | 10 |
| 1 | 11 |
| 1 | 12 |
| 1 | 13 |
| 1 | 14 |
| 1 | 15 |
| 1 | 16 |
| 1 | 17 |
| 1 | 18 |
| 1 | 19 |
| 1 | 20 |
| 1 | 21 |
| 1 | 22 |
| 1 | 23 |
| 1 | 24 |
| 1 | 25 |
| 1 | 26 |
| 1 | 27 |
+++
Tabla 99: tabla 'proyectoplan'
223
Capítulo 8: ANEXOS
+++++++
| codMaquina | descripcion | estado | costeNoUso | costeInclusion | costeRetirada |
+++++++
| 1 | máquina 1 | 1 | 0 | 0 | 0 |
| 2 | máquina 2 | 1 | 0 | 0 | 0 |
| 3 | máquina 3 | 1 | 0 | 0 | 0 |
| 4 | máquina 4 | 1 | 0 | 0 | 0 |
| 5 | máquina 5 | 1 | 0 | 0 | 0 |
| 6 | máquina 6 | 1 | 0 | 0 | 0 |
| 7 | máquina 7 | 1 | 0 | 0 | 0 |
| 8 | máquina 8 | 1 | 0 | 0 | 0 |
| 9 | máquina 9 | 1 | 0 | 0 | 0 |
| 10 | máquina 10 | 1 | 0 | 0 | 0 |
+++++++
Tabla 100: tabla 'maquina'
224
Capítulo 8: ANEXOS
+++++++
| codModulo | descripcion | cantidad | tipo | costeNoUso | costeInstalacion |
+++++++
| 1 | módulo 1 | 1 | B | 0 | 0 |
| 2 | módulo 2 | 1 | B | 0 | 0 |
| 3 | módulo 3 | 1 | B | 0 | 0 |
| 4 | módulo 4 | 1 | B | 0 | 0 |
| 5 | módulo 5 | 1 | B | 0 | 0 |
| 6 | módulo 6 | 1 | B | 0 | 0 |
| 7 | módulo 7 | 1 | B | 0 | 0 |
| 8 | módulo 8 | 1 | B | 0 | 0 |
| 9 | módulo 9 | 1 | B | 0 | 0 |
| 10 | módulo 10 | 1 | B | 0 | 0 |
| 11 | módulo 11 | 1 | A | 0 | 0 |
| 12 | módulo 12 | 1 | A | 0 | 0 |
| 13 | módulo 13 | 1 | A | 0 | 0 |
| 14 | módulo 14 | 1 | A | 0 | 0 |
| 15 | módulo 15 | 1 | A | 0 | 0 |
| 16 | módulo 16 | 1 | A | 0 | 0 |
| 17 | módulo 17 | 1 | A | 0 | 0 |
| 18 | módulo 18 | 1 | A | 0 | 0 |
| 19 | módulo 19 | 1 | A | 0 | 0 |
| 20 | módulo 20 | 1 | A | 0 | 0 |
| 21 | módulo 21 | 1 | A | 0 | 0 |
| 22 | módulo 22 | 1 | A | 0 | 0 |
| 23 | módulo 23 | 1 | A | 0 | 0 |
| 24 | módulo 24 | 1 | A | 0 | 0 |
| 25 | módulo 25 | 1 | A | 0 | 0 |
+++++++
Tabla 101: tabla 'modulo'
225
Capítulo 8: ANEXOS
++++
| codPlan | codMaquina | codModulo |
++++
| 2 | 1 | 1 |
| 2 | 1 | 3 |
| 2 | 1 | 17 |
| 2 | 1 | 22 |
| 3 | 1 | 1 |
| 3 | 1 | 3 |
| 3 | 1 | 11 |
| 3 | 1 | 17 |
| 3 | 1 | 18 |
| 3 | 1 | 20 |
| 3 | 1 | 22 |
| 19 | 1 | 1 |
| 19 | 1 | 3 |
| 19 | 1 | 12 |
| 19 | 1 | 13 |
| 19 | 1 | 15 |
| 19 | 1 | 20 |
| 19 | 1 | 21 |
| 4 | 2 | 1 |
| 4 | 2 | 2 |
| 4 | 2 | 5 |
| 4 | 2 | 15 |
| 4 | 2 | 17 |
| 4 | 2 | 18 |
| 5 | 2 | 1 |
| 5 | 2 | 2 |
| 5 | 2 | 5 |
| 5 | 2 | 11 |
| 5 | 2 | 14 |
| 5 | 2 | 16 |
| 5 | 2 | 22 |
226
Capítulo 8: ANEXOS
| 5 | 2 | 24 |
| 5 | 2 | 25 |
| 1 | 3 | 3 |
| 1 | 3 | 4 |
| 1 | 3 | 6 |
| 1 | 3 | 14 |
| 1 | 3 | 16 |
| 6 | 3 | 3 |
| 6 | 3 | 4 |
| 6 | 3 | 6 |
| 6 | 3 | 13 |
| 6 | 3 | 19 |
| 6 | 3 | 24 |
| 7 | 3 | 3 |
| 7 | 3 | 4 |
| 7 | 3 | 6 |
| 7 | 3 | 11 |
| 7 | 3 | 12 |
| 7 | 3 | 15 |
| 7 | 3 | 18 |
| 7 | 3 | 20 |
| 9 | 4 | 3 |
| 9 | 4 | 7 |
| 9 | 4 | 13 |
| 9 | 4 | 14 |
| 9 | 4 | 19 |
| 18 | 4 | 3 |
| 18 | 4 | 7 |
| 18 | 4 | 11 |
| 18 | 4 | 12 |
| 18 | 4 | 14 |
| 18 | 4 | 16 |
| 18 | 4 | 18 |
| 21 | 4 | 3 |
227
Capítulo 8: ANEXOS
| 21 | 4 | 7 |
| 21 | 4 | 12 |
| 21 | 4 | 13 |
| 21 | 4 | 14 |
| 21 | 4 | 17 |
| 21 | 4 | 19 |
| 21 | 4 | 20 |
| 11 | 5 | 5 |
| 11 | 5 | 6 |
| 11 | 5 | 8 |
| 11 | 5 | 18 |
| 11 | 5 | 23 |
| 14 | 5 | 5 |
| 14 | 5 | 6 |
| 14 | 5 | 8 |
| 14 | 5 | 13 |
| 14 | 5 | 14 |
| 14 | 5 | 17 |
| 14 | 5 | 18 |
| 20 | 5 | 5 |
| 20 | 5 | 6 |
| 20 | 5 | 8 |
| 20 | 5 | 11 |
| 20 | 5 | 15 |
| 20 | 5 | 18 |
| 20 | 5 | 20 |
| 20 | 5 | 21 |
| 10 | 6 | 4 |
| 10 | 6 | 5 |
| 10 | 6 | 10 |
| 10 | 6 | 16 |
| 10 | 6 | 17 |
| 10 | 6 | 19 |
| 10 | 6 | 23 |
228
Capítulo 8: ANEXOS
| 10 | 6 | 25 |
| 22 | 6 | 4 |
| 22 | 6 | 5 |
| 22 | 6 | 10 |
| 22 | 6 | 20 |
| 22 | 6 | 22 |
| 26 | 6 | 4 |
| 26 | 6 | 5 |
| 26 | 6 | 10 |
| 26 | 6 | 11 |
| 26 | 6 | 12 |
| 26 | 6 | 13 |
| 26 | 6 | 15 |
| 26 | 6 | 20 |
| 8 | 7 | 7 |
| 8 | 7 | 9 |
| 8 | 7 | 20 |
| 8 | 7 | 22 |
| 8 | 7 | 24 |
| 23 | 7 | 7 |
| 23 | 7 | 9 |
| 23 | 7 | 13 |
| 23 | 7 | 15 |
| 23 | 7 | 16 |
| 23 | 7 | 18 |
| 23 | 7 | 19 |
| 23 | 7 | 21 |
| 24 | 7 | 7 |
| 24 | 7 | 9 |
| 24 | 7 | 14 |
| 24 | 7 | 17 |
| 16 | 8 | 2 |
| 16 | 8 | 4 |
| 16 | 8 | 7 |
229
Capítulo 8: ANEXOS
| 16 | 8 | 18 |
| 16 | 8 | 19 |
| 16 | 8 | 21 |
| 16 | 8 | 22 |
| 16 | 8 | 25 |
| 27 | 8 | 2 |
| 27 | 8 | 4 |
| 27 | 8 | 7 |
| 27 | 8 | 14 |
| 27 | 8 | 16 |
| 12 | 9 | 1 |
| 12 | 9 | 9 |
| 12 | 9 | 10 |
| 12 | 9 | 11 |
| 12 | 9 | 14 |
| 12 | 9 | 18 |
| 12 | 9 | 22 |
| 12 | 9 | 23 |
| 13 | 9 | 8 |
| 13 | 9 | 9 |
| 13 | 9 | 12 |
| 13 | 9 | 14 |
| 13 | 9 | 15 |
| 17 | 9 | 8 |
| 17 | 9 | 9 |
| 17 | 9 | 13 |
| 17 | 9 | 15 |
| 17 | 9 | 16 |
| 17 | 9 | 18 |
| 17 | 9 | 19 |
| 17 | 9 | 24 |
| 25 | 9 | 8 |
| 25 | 9 | 9 |
| 25 | 9 | 11 |
230
Capítulo 8: ANEXOS
| 25 | 9 | 17 |
| 25 | 9 | 18 |
| 25 | 9 | 20 |
| 25 | 9 | 21 |
| 15 | 10 | 1 |
| 15 | 10 | 9 |
| 15 | 10 | 10 |
| 15 | 10 | 17 |
| 15 | 10 | 19 |
++++
Tabla 102: tabla 'planmaquinamodulo'
231
Capítulo 8: ANEXOS
232