Universidad Tecnologica de Queretaro Digitally signed by Universidad Tecnologica de Queretaro DN: cn=Universidad Tecnologica de Queretaro, c=MX, o=Universidad Tecnologica de Queretaro, ou=UTEQ, [email protected] Date: 2007.08.06 14:44:00 -06'00' UNIVERSIDAD TECNOLÓGICA DE QUERÉTARO Voluntad ● Conocimiento ● Servicio BASE DE DATOS INDUCCIÓN TEMPLE Y MANTENIMIENTO Reporte de Estadía para obtener el Título de Técnico Superior Universitario en Electrónica y Automatización RODOLFO CASILLAS VILLA Santiago de Querétaro, Qro. Agosto de 2006 2 UNIVERSIDAD TECNOLÓGICA DE QUERÉTARO Voluntad ● Conocimiento ● Servicio BASE DE DATOS INDUCCIÓN TEMPLE Y MANTENIMIENTO Reporte de Estadía para obtener el Título de Técnico Superior Universitario en Electrónica y Automatización ASESOR DE LA EMPRESA ING. ELOY E. DURÁN RODRÍGUEZ ASESOR DE LA ESCUELA ING. DAVID VÁZQUEZ RAZO ALUMNO RODOLFO CASILLAS VILLA Santiago de Querétaro, Qro. Agosto de 2006 3 AGRADECIMIENTOS En primer lugar me gustaría agradecer a mis padres, Luz Francisca Villa Pérez y Rodolfo Casillas Suárez, por el apoyo que siempre he tenido de ellos y los valores que me inculcaron, los cuales me han servido para alcanzar metas que son difíciles de alcanzar; pero, no imposibles. Y a toda mi familia que me apoyaron para que yo siguiera estudiando aunque tuviéramos que estar separados, ya que toda mi familia se encuentra en Hermosillo, Sonora. Les agradezco a todos los maestros de la carrera de Electrónica y Automatización por todos los conocimientos que he obtenido a través de ellos, ya que muchas veces contaban sus experiencias laborales, sus consejos y preocupaciones, así como la que me brindaron. Le agradezco a mi asesor de escuela el Ing. David Vázquez Razo por ayudarme en mi estadía. A mi tutor Ubaldo Flora, le agradezco su apoyo en todo momento y a mis compañeros del grupo E-39, ya que mantuvimos una amistad y el grupo nunca se desintegro, siempre fue el mismo. Agradezco al Ing. Eloy E. Durán Rodríguez por haberme permitido realizar la estadía en su empresa ITM y el apoyo que me proporcionó en el transcurso de ésta. 4 ÍNDICE AGRADECIMIENTOS ÍNDICE INTRODUCCIÓN CAPÍTULO I. ANTECEDENTES GENERALES DE LA EMPRESA Pág. 1.1 Antecedentes de la empresa .......................................................11 1.2 Misión .........................................................................................12 1.3 Visión..........................................................................................12 1.4 Política de calidad.......................................................................12 1.5 Organización...............................................................................13 1.6 Campo de desarrollo nacional ...................................................14 1.7 Proceso general de producción ...................................................15 CAPÍTULO II. EL PROYECTO 2.1 Antecedentes...............................................................................17 2.2 Definición del proyecto .............................................................17 2.3 Objetivo ......................................................................................17 2.4 Alcance .......................................................................................18 5 2.5 Plan de trabajo ...........................................................................18 2.5.1 Separación de actividades.........................................18 2.5.2 Secuencia de actividades ..........................................19 2.5.3 Asignación de tiempos .............................................19 2.5.4 Gráfica de Gantt ......................................................20 CAPÍTULO III. MARCO TEÓRICO 3.1 Base de datos ..............................................................................22 3.1.1 Origen de la base de datos ...........................................22 3.1.2 Ventajas de la base de datos en la organización. .........23 3.2 Visual Basic................................................................................24 3.2.1 Métodos directos de base de datos...............................25 3.2.2 Actualización de la base de datos ................................27 3.2.3 Cadenas de conexión...................................................27 CAPÍTULO IV. DESARROLLO DEL PROYECTO 4.1 Adquisición de datos ..................................................................30 4.1.1 Archivos ......................................................................30 4.2 Tablas, registros y campos .........................................................31 4.2.1 Índices..........................................................................32 4.2.2 Procedimientos almacenados.......................................33 4.3 Vistas ..........................................................................................33 4.3.1 Triggers........................................................................34 4.3.2 Diagramas de bases de datos .......................................34 6 4.3.3 Usuarios .......................................................................35 4.4 Programación..................................................................35 4.5 Ventanas del programa ...............................................................38 CAPÍTULO V. ACTIVIDADES DIVERSAS 5.1 Introducción................................................................................50 5.2 Actividades .................................................................................50 CAPÍTULO VI. EVALUACIÓN ECONÓMICA Y RESULTADOS OBTENIDOS 6.1 Evaluación económica................................................................52 6.2 Resultados obtenidos ..................................................................52 CONCLUSIONES Conclusiones.....................................................................................54 BIBLIOGRAFÍA Bibliografía.......................................................................................56 GLOSARIO Glosario ............................................................................................58 ANEXO Anexo código fuente.........................................................................60 7 INTRODUCCIÓN Una base de datos es un sistema de almacenamiento de información. Esta definición es válida, sin embargo no se ajusta a la realidad, una base de datos es algo más que el "lugar" donde se almacenan nuestros datos. En ellas, almacenamos no sólo información, sino también una serie de objetos, procedimientos y reglas, que garantizan la integridad y la fiabilidad de los datos, para cubrir las necesidades requeridas por una empresa. Es muy importante y obligatorio, que en el momento de diseñar una base de datos, se estudie de qué modo se va a obtener el máximo rendimiento a la hora de procesar la información. Para ello, contamos con una serie de estructuras y herramientas que garantizan la velocidad de acceso a datos, como por ejemplo los índices. En SQL SERVER, se almacena en la propia base de datos los credenciales de usuarios, donde se gestionan los permisos de acceso. Para limitar el uso que pueda hacer un determinado usuario sobre nuestros datos. El propósito de crear una base de datos es desarrollar ésta utilizando Microsoft Visual Studio 2005, Microsoft SQL Server 2000 como motor de bases de datos. 8 En el capítulo I, se mencionan los antecedentes de la empresa, donde se relata como surgió la empresa y en que se especializa, que en este caso es en elaborar inductores. El capítulo II, muestra como surge la necesidad del proyecto, el plan de trabajo y la separación de actividades que se realizó para poder obtener la asignación de tiempos, y así elaborar la gráfica de Gantt. En el capítulo III, el marco teórico, se explican brevemente los conceptos teórico-práctico que se utilizaron en el proyecto como referencia, que ayudaron en la realización de la base de datos. El capítulo IV, muestra el desarrollo del proyecto mostrando a detalle la base de datos. En el capítulo V, trata de las actividades diversas que se realizaron en el trayecto de estadía que no necesariamente tienen que estar relacionadas con el proyecto. Y por último el capítulo IV muestra los resultados del proyecto, en el cual se menciona como funciona la base de datos. 9 CAPÍTULO I ANTECEDENTES GENERALES DE LA EMPRESA 10 1.1 Antecedentes de la empresa La empresa lleva por nombre I.T.M. S. A. de C.V. (Inducción Temple y Mantenimiento). Su giro principal es la maquila y temple por inducción y la fabricación de herramientas para equipos de inducción. Se encuentra ubicada en San José el Alto, Querétaro, Qro. Surgió en octubre de 1997. Las personas directamente involucradas con la compañía son el Ing. Eloy Durán Rodríguez y el Ing. Rubén Escobedo Amescua. Nace debido a que en aquellos tiempos no existían muchas empresas que se dedicaran al mismo sector y las pocas que había eran de origen extranjero. Una de las principales ventajas que I.T.M. tiene contra su competencia es el precio, calidad y el trato que tiene con sus clientes. Su proceso primordial estriba en el calentamiento por inducción, ya que es una tecnología que tuvo sus comienzos hace ya muchos años. En nuestro país esta tecnología es poco conocida y se utiliza en forma muy limitada debido a su poca promoción, sin embargo, haciendo un comparativo entre los distintos métodos de calentamiento se puede apreciar que el calentamiento por inducción tiene algunas ventajas que lo hacen muy competitivo. 11 1.2 Misión “Reparar y modernizar equipos de inducción, fabricar herramental y manipular tratamiento térmico que asegure la satisfacción de nuestros clientes y la superación de la competencia.” 1.3 Visión “Ser una organización netamente nacional capaz de suministrar productos y servicios de calidad de clase mundial a precios justos para superar las expectativas de nuestros clientes, con el objetivo de que siempre seamos su primera opción.” 1.4 Política de Calidad “Ser la primera compañía cien por ciento mexicana, incursionando en el campo del calentamiento por inducción, con experiencia, excelencia en el servicio, precios y calidad de clase mundial.” 12 1.5 Organización La empresa está constituida por siete personas. - Gerente general: Encargado de procesos administrativos como venta, compras, etc. - Gerente de operación: Encargado de supervisar todas las operaciones productivas como maquinados, soldadura, maquila, además establece procesos, ingeniería, etc. - Técnico: programación de equipos, elaboración de tableros. - Jefe de taller: responsable de facilitar la operación del taller mediante el requerimiento de herramientas, materiales y la asignación de tareas. - Mecánico: opera las diferentes maquinas, herramientas, etc. para la fabricación de los diferentes componentes requeridos en la manufactura de los diferentes productos que se elaboran. - Ayudantes: son auxiliares que facilitan las labores del jefe de taller y el mecánico. El organigrama de la empresa se muestra a continuación en la figura 1.1 13 Inducción Temple y Mantenimiento S.A. de C.V. Gerente de operación Técnico Gerente general Administradora Jefe de taller Mecánico Ayudante general Ayudante general Figura 1.1 Organigrama de I.T.M. 1.6 Campo de desarrollo nacional o internacional El campo de la empresa es principalmente la industria automotriz nacional y algunas compañías extranjeras del mismo ramo. Con respecto al mercado nacional lo integran compañías como DELPHI, CARDANES, FORJAS SPICER, Dana, TRW FOMASA, PRINVER, REMY Alternadores, RAIMSA, etc. En cuanto a compañías extranjeras 14 con relación comercial tienen a DELPHI y varias compañías INTEGRANTEL del grupo INDUCTOHEAT. 1.7 Proceso general de producción Los servicios que ofrece I.T.M. son: - Fabricación de inductores y reparación de herramental para calentamiento por inducción. - Reparación y modernización del equipo de inducción. - Compra, venta y reacondicionamiento de equipo de inducción usado. - Maquila de temple por inducción. - Desarrollo de proceso para tratamiento térmico por inducción. - Entre otros. 15 CAPÍTULO II EL PROYECTO 16 2.1 Antecedentes El proyecto (base de datos) nace porque desde que la empresa inicio actividades se ha llevado un sistema de registro de administración no muy eficaz y esto influye de manera ineficiente al momento de negociar con los clientes. Algunos aspectos importantes que se desconocen son: como se lleva a cabo el proceso de fabricación o reparación, la negociación con el cliente y su resultado poco difuso y la falta de un buen control de tiempo, lo que genera algunas perdidas. 2.2 Definición del proyecto La base de datos consiste en elaborar un formato en archivo electrónico donde se registren los datos del cliente, el trabajo que se le está realizando, los tiempos de maquinado, el historial del producto, lista de materiales, costos e imágenes del producto; así como, transporte (traslados del equipo del cliente al taller y del taller al cliente). 2.3 Objetivo El proyecto ayudara a: - Facilitar la cotización - Facilitar el control de garantía - Estimar tiempos de entrega 17 2.4 Alcance La importancia de una buena base de datos consiste en poder tener la información de todos los productos o datos, para tener acceso en el momento que sean requeridos por alguien, pudiendo agregar imágenes fotográficas de las piezas o cualquier cosa que sea necesaria. Esto cambiará muchas cosas de la empresa, ya que se podrá apreciar el tiempo que tarda en hacer las cosas y poder mejorar muchas actividades. Para que todo salga mejor es necesario tener una buena administración en lo que la empresa produce y lo que vende. 2.5 Plan de trabajo A continuación se detallarán las diversas actividades a través de las cuales se realizará el proyecto, asignación de tiempos y gráfica de Gantt. 2.5.1 Separación de actividades 1. Obtener los datos necesarios para la base de datos. 2. Elaborar el programa con un fácil manejo. 3. Plantear el desarrollo del proyecto. 4. Empezar la programación. 5. Almacenar los datos que tienen desde el año 2000. 18 6. Pruebas de programación. 7. Aprobación. 2.5.2 Secuencia de actividades 1. Desarrollo de ideas para el proyecto. 2. Investigación de los productos que se almacenan. 3. Los datos requeridos por las empresas. 4. Elaboración del formato para la colocación de los datos. 5. Empezar la programación. 6. Almacenar los datos que sean requeridos 7. Probar el programa. 8. Aprobación. 2.5.3 Asignación de tiempos 1. Desarrollo de ideas para el proyecto. 2 días 2. Investigación de los productos que se almacenan. 5 días 3. Los datos requeridos por las empresas. 2 días 4. Elaboración del formato para la colocación de los datos. 1 día 5. Empezar la programación. 40 días 6. Almacenar los datos que sean requeridos 10 días 7. Probar el programa. 1 día 8. Aprobación. 2 días 19 2.5.4 Gráfica de Gantt La siguiente gráfica de Gantt nos muestra las actividades contra tiempos programados que ayudaran al logro del proyecto, como se muestra a continuación en la figura 2.1 8-11 Mayo 12-18 Mayo 19-22 Mayo 23 Mayo 24Mayo-18Julio 19Julio-2Agosto 3 Agosto 5Agosto 1 2 3 4 5 6 7 8 Figura 2.1 Gráfica de Gantt 20 CAPÍTULO III MARCO TEÓRICO 21 3.1 Base de datos Definición de base de datos.- Conjunto de información almacenada en memoria auxiliar que permite acceso directo y un conjunto de programas que manipulan esos datos. Base de datos es un conjunto exhaustivo no redundante de datos estructurados organizados independientemente de su utilización y su implementación en máquina accesibles en tiempo real y compatibles con usuarios concurrentes con necesidad de información diferente y no predicable en tiempo. 3.1.1 Origen de la base de datos La historia de las bases de datos surge desde mediados de los años sesenta, en 1970 Codd propuso el modelo relacional; este modelo es el que ha marcado la línea de investigación por muchos años, ahora se encuentran los modelos orientados a objetos. 22 3.1.2 Ventajas del uso de la base de datos en la organización 1. Independencia de datos y tratamiento. - Cambio en datos no implica cambio en programas y viceversa (menor coste de mantenimiento). 2. Coherencia de resultados. - Reduce redundancia. - Acciones lógicamente únicas. - Se evita inconsistencia. 3. Mejora en la disponibilidad de datos. - No hay dueño de datos (no igual a ser públicos). - Ni aplicaciones ni usuarios. - Guardamos descripción (idea de catálogos). 4. Cumplimiento de ciertas normas. - Restricciones de seguridad. - Accesos (usuarios a datos). - Operaciones (operaciones sobre datos). 23 3.2 Visual Basic El fundador y CEO de Microsoft, Bill Gates, fue el primero en articular la visión del concepto de «aplicaciones personalizables» en su artículo «Beyond Macro Processing» («más allá del procesamiento de macros»), publicado hace ya más de diez años en la revista Byte. En él, Gates afirmaba estar convencido de la necesidad de contar con un entorno sofisticado que pudiera compartirse e incluirse en el software de aplicaciones productivas. Si, según pensaba, los programadores pudieran contar con herramientas de desarrollo integradas directamente en una aplicación, podrían optimizar sus conocimientos, llevar los paquetes de aplicaciones «más allá del procesamiento de macros» y crear potentes soluciones a partir de la capacidad funcional de las aplicaciones existentes. La programación visual evoluciona al surgir la pregunta de por qué se persiste en comunicarse con las computadoras usando lenguajes de programación textual, tan solo si pudiéramos ser más productivos y el campo de las computadoras estuviese más accesible a una gran cantidad de personas, simplemente dibujaríamos las imágenes que nos vienen a la mente cuando consideramos soluciones a algún problema en particular. Visual BASIC es un producto hecho por Microsoft que permite al usuario crear fácilmente programas (para Windows) poderosos y completos, por ejemplo, programas para bases de datos, controles “Active X”, y programas cliente/servidor para redes. 24 En Visual Studio 2003, los desarrolladores tenían un determinado número de componentes de acceso a datos. Sin embargo, combinar estos componentes era a menudo tedioso y no fomentaba una buena reutilización de los objetos. En Visual Studio 2005, se ha ampliado el acceso a datos con tipo mediante un nuevo objeto llamado TableAdapter. Con los TableAdapters, interactuar con los objetos de datos en el equipo cliente y enviar actualizaciones a una base de datos, resulta mucho más sencillo. Los TableAdapters encapsulan los objetos necesarios para comunicarse con una base de datos y proporcionar métodos para realizar el acceso a los datos con tipos seguros. 3.2.1 Métodos directos de base de datos Además de los métodos de actualización de DataTable que ofrecen los TableAdapters, tiene también la posibilidad de generar métodos que escriban directamente en la base de datos, sin necesidad de modificar una DataTable y enviarla a la base de datos. Esta opción se controla mediante la propiedad GenerateDBDirectMethods del objeto TableAdapter del diseñador de Dataset. Los métodos DBDirect que se generan son Insert, Delete y una sobrecarga de Update que admite un parámetro de tipo seguro para cada campo de la DataTable. A continuación se muestra la tabla de referencia para TableAdaprter en la figura 4.1 25 Referencia rápida de las propiedades de TableAdapter . Generación de código Base Class Clase de la que heredará el TableAdapter. Es importante que los TableAdapters hereden de System.Component.ComponentModel para que se puedan arrastrar al Form Designer. ConnectionModifier Visibilidad externa del objeto de conexión que utiliza el TableAdapter Modifier Visibilidad externa del TableAdapter Nombre Nombre del TableAdapter. . Datos Connection Información utilizada para generar el objeto de conexión de la conexión de la base de datos. Aquí es donde se establece la cadena de conexión. GenerateDBDirectMethods Propiedad booleana que indica si se deben generar métodos que permitan enviar comandos directamente a la base de datos, sin utilizar las DataTables. InsertCommand, SelectCommand, Configuración para los objetos System.Data.DbCommand UpdateCommand, subyacentes que se utilizan para obtener los datos y enviar DeleteCommand los cambios a la base de datos. CommandText Texto del comando que se ejecutará en la base de datos. Según el tipo de comando, este texto puede ser una instrucción SQL, un nombre de procedimiento almacenado o un nombre de función. CommandType Tipo de comando que representa el texto del comando. Esta propiedad puede ser Text, Stored Procedure o TableDirect. Parámetros Colección de parámetros que debe utilizarse al llamar al comando. Figura 4.1 TableAdapter 26 3.2.2 Actualización de la base de datos La manera más habitual de actualizar una base de datos es enviar los cambios que contienen uno o varios objetos DataTable a la base de datos. TableAdapters proporciona varias sobrecargas del método Update para facilitar esta tarea. Cada una de estas sobrecargas reenvía el parámetro pasado al método Update del DataAdapter subyacente. 3.2.3 Cadenas de conexión Visual Studio 2005 presenta como novedad los valores de configuración con tipo a los que se puede obtener acceso mediante programación. Los TableAdapters aprovechan esta característica para ofrecer las cadenas de conexión almacenadas en el archivo app.config de la aplicación. Si se utiliza una cadena de conexión almacenada como una configuración con tipo, puede cambiar la cadena de conexión del archivo app.config y todos los TableAdapters de la aplicación se conectarán a la base de datos utilizando la nueva cadena de conexión. El uso de valores de configuración con tipo presenta la ventaja adicional de proporcionar valores predeterminados si no se puede encontrar el valor de configuración en el archivo app.configura. 27 En vez de generar una excepción, la clase de valores de configuración generada devuelve el valor que se estableció durante la compilación. Para TableAdapters, se utilizará la cadena de conexión utilizada para desarrollar la aplicación cuando no se encuentre ningún otro valor para la cadena de conexión. Los TableAdapters facilitan en gran medida el acceso a los proveedores de bases de datos y ofrecen una manera con tipos seguros de ejecutar comandos en la base de datos. Gracias a las clases parciales y a la herencia, es posible ampliarlos para que lleven a cabo prácticamente cualquier tarea que sea necesaria. En este artículo, hemos visto de manera general las características de los TableAdapters y cómo interactúan con los otros elementos del proyecto. Con estas características puede aprovechar la funcionalidad de TableAdapter para crear rápidamente objetos de acceso a base de datos con grandes posibilidades de reutilización. 28 CAPÍTULO IV DESARROLLO DEL PROYECTO 29 4.1 Adquisición de datos Se comenzó a desarrollar el proyecto basándose en crear una base de datos, la cual pueda tener todo lo necesario para que el usuario pueda manipularlo con facilidad. En cualquier aplicación de software (o al menos en su mayoría), es requisito imprescindible el almacenamiento de información para posteriormente ser mostrada, manipulada o eliminada. Para poder comenzar a trabajar con las bases de datos, es necesario conocer primero una serie de conceptos que nos ayude a entender como funcionan. 4.1.1 Archivos En la creación de la base de datos, el diseñador puede nombrarla como desee especificar su lugar de destino. El propio SQL SERVER, creará la estructura lógica con los archivos necesarios. Estos archivos serán el archivo principal de datos, y el archivo de registros. Si por ejemplo, se crea una base de datos con el nombre "Empresa", SQL SERVER, ésta creará dos archivos con los siguientes nombres y extensiones: - Empresa_Data.MDF (Archivo principal de datos). - Empresa_Log.LDF (Archivo de registros). 30 Por lo tanto la base de datos queda almacenada en estos dos archivos, pudiendo elegir el destino de ambos. Es frecuente encontrarse, con que estos dos archivos se encuentran en unidades de almacenamiento distintas. Tanto por seguridad, como por rendimiento, de modo que si falla una de las unidades no se pierdan todos los archivos. 4.2 Tablas, registros y campos. Las bases de datos están formadas por bloques de información básicos, estos bloques reciben el nombre de tablas, lo que antiguamente se denominaban ficheros o archivos. Una tabla, es un conjunto de información con características comunes. Es decir, almacena información sobre un concepto en común. Por ejemplo en la base de datos de una empresa, existirá una tabla que guarde información de los inductores, otra que almacene los datos de los socios, etc., estas tablas, están compuestas de registros. Un registro es cada uno de los elementos de información de la tabla. En el ejemplo de la base de datos de la empresa, un registro es cada uno de los socios almacenados en la tabla socios. A su vez, cada registro está formado por unidades fundamentales denominadas campos. Un campo es la unidad de información que interesa almacenar para cada 31 registro. En nuestro ejemplo, los registros estarían formados por los siguientes campos, nombre de socio, apellidos, número de socio, etc. 4.2.1 Índices Es fácil encontrar bases de datos con tablas cuyo tamaño aumenta con facilidad, pudiendo contener millones de registros. En estos casos el acceso a determinada información puede ser lento y costoso. Habrá operaciones de consulta que obliguen a recorrer la tabla entera, desde su primer registro hasta el último, esto repercute directamente en la aplicación, convirtiéndola en una aplicación lenta y pesada. De ahí la importancia del diseño de la base de datos. Para acelerar el acceso a la información se cuenta con los índices. Un índice almacena una serie de claves que permite al servidor acelerar sus consultas. El índice no sólo sirve para aumentar la velocidad, sirve además para fijar un orden en los registros, tener registros únicos, etc., de modo que cuando se modifica el contenido de una tabla que afecta algún índice, SQL SERVER debe modificar los datos de la tabla y los índices que afectan a la misma. 32 4.2.2 Procedimientos almacenados. Un servidor de base de datos no sólo puede manipular información de sus tablas, sino que tiene la capacidad de interpretar código en un lenguaje SQL para la programación de una serie de funciones u operaciones. Este código SQL se puede encapsular en un procedimiento o varios y se almacena en la propia base de datos. Por lo tanto podemos escribir procedimientos en SQL para realizar las tareas deseadas sobre nuestra base de datos y almacenarlos, para más adelante con una sencilla llamada se ejecuten las instrucciones. Estos procedimientos reciben el nombre de procedimientos almacenados y se pueden encontrar como Stored procedures, o también se les suele denominar simplemente como SP. 4.3 Vistas Trabajando con una base de datos, nos encontramos con tareas habituales, que se repiten constantemente. De este modo es muy frecuente realizar peticiones de datos muy similares que requieres consultas SQL semejantes. Gracias a las vistas podemos crear unas bases de datos con consultas para uso habitual. 33 El modo de trabajo es relativamente sencillo, se trata de unas tablas especiales donde sus datos provienen de una o más tablas en función de la consulta SQL creada. Por ejemplo, se puede crear una vista para que de manera sencilla, mediante un número de socio devuelva toda la información requerida (alquileres pendientes, alquileres realizados, etc.) 4.3.1 Triggers Un trigger es un suceso que se dispara cuando se provoca un determinado evento. Es habitual vincular un trigger a un procedimiento almacenado, de modo que cuando se provoque el trigger, se ejecute el procedimiento almacenado. 4.3.2 Diagramas de bases de datos Una de las herramientas que sirven de ayuda al diseñador de bases de datos es el diagrama de bases de datos. Se trata de una herramienta gráfica donde podemos situar tablas y establecer las relaciones existentes entre ellas. De este modo se puede tener una vista de la estructura genérica de la base de datos. 34 4.3.3 Usuarios En las bases de datos se pueden añadir tantos usuarios como sea necesario y otorgarles los permisos correspondientes. De este modo, podemos limitarnos a un usuario para que sólo tenga acceso a determinadas tablas, y fijar las operaciones que puede realizar sobre las mismas. SQL SERVER crea siempre un usuario por defecto; se trata del usuario dbo (database owner) que es el propietario o creador de la base de datos. 4.4 Programación En SQL SERVER se creó la base de datos y en la tabla 4. 1 se muestran los detalles de la misma. Aquí se detallan los datos principales de la base de datos, ya que se describen los elementos utilizados, para la realización del mismo. El nombre del campo, por ejemplo, en el programa vendría siendo una etiqueta llamada empresa, en el tipo de datos por ejemplo, texto; lo que va a llevar ese espacio será todo texto, y el número de caracteres indica cuantas letras en este caso podría llevar. 35 Nombre del campo Tipo de datos Número de caracteres Empresa Texto 15 CódigoITM Texto 10 CodigoInd Texto 30 FechaReg Fecha/Hora Fecha corta Detalles Texto 255 ListaMate Texto 255 TiempoMaqui Texto 255 Costos Texto 255 Cotización Texto 255 Observaci Texto 255 Historial Texto 100 Calidad Número Entero Tabla 4.1 Detalles Se especificó el campo “código de ITM” como la clave principal de la base de datos (la clave principal es el único registro que no puede repetirse y el cual no puede quedar en blanco), ya varias funciones de la programación realizada dependen de ella. 36 En la clave principal se especifica el tipo de producto registrado, por ejemplo: ITMN### La clave principal debe llevar las letras: ITM seguidas por la letra N que significa que ese inductor es nuevo y # son los números sin que se repitan. ITMR### La letra R significa que se le tendrá que realizar alguna reparación. Así, con estos datos, la empresa registra sus productos y la clave principal es una de las herramientas más importantes para la realización de la base de datos. 37 4.5 Ventanas del programa Ventana principal de la base de datos. Figura 4.2 Ventana principal Esta ventana es la principal, donde se puede apreciar una lista formada con un ListBox donde aparecen todos los clientes registrados en la empresa. En la parte inferior izquierda se aprecia un Label donde aparece la hora enlazada con el reloj de la computadora. 38 En la parte derecha se aprecian 2 opciones y un botón; en la opción “Ver todos los registros” aparece la ventana de datos que se muestra en la figura 4.5, en la cual se puede modificar, agregar o eliminar un registro. En la opción “Buscar registro” se enlaza a la ventana detalles mostrada en la figura 4.3 y se ejecuta el código en el botón buscar de la ventana detalles mostrada en la figura 4.3. El botón “opciones avanzadas” abre un panel donde se muestran dos opciones más, que son “Exportar e Importar” donde abren una ventana adicional donde se van a manejar la entrada y la salida de datos del programa, esto es por sí alguna vez el usuario prefiere cambiar de computadora, y pueda llevarse todos los registros en la base de datos ya capturados en el programa actual. La otra opción te permite cambiar el password que es necesario para poder ejecutar el código del botón “Exportar e Importar”. De regreso al ListBox, cuando se le da doble click a una empresa en la lista, se abre la ventana de la figura 4.3 donde aparecen todos los detalles incluyendo una imagen del inductor registrado si es que la hay, la ventana detalles se muestra a continuación. 39 Figura 4.3 Detalles Aquí se muestran los detalles de la empresa, como se puede ver, lo primero que se aprecia es el nombre de la empresa, código ITM. Aquí se puede observar que el ejemplo de la figura 4.3 ITMR001 es un registro de un inductor reparado, porque en su código se le agregó la letra R de reparación. En el código de inductor, se pone el número de serie del inductor, pero si no cuentan con uno, no es necesario ponérselo. En la lista de inductores podemos ver un ListBox con todos los registros de inductores hechos por la empresa I.T.M. donde se puede seleccionar uno para ver todos sus detalles, así como se ve en la figura 4.3, el botón “Volver” nos regresa a la ventana principal de la figura 4.2. 40 En la parte donde se encuentra el logotipo de la empresa I.T.M. Inducción, Temple y Mantenimiento se encuentra una etiqueta que dice “Ver opciones” ésta muestra las opciones que se encuentran en la figura 4.4. Figura 4.4 Opciones de la ventana detalles El botón “Agregar imagen” importa a los archivos del programa una imagen guardándola con el nombre del código de ITM para que cuando se navegue en los inductores registrados de la empresa, pueda desplegarse en el PictureBox que se encuentra en la parte superior derecha de la figura 4.3. El botón “Eliminar imagen” busca la imagen con el nombre de código de ITM para eliminarla permanentemente de la computadora. El botón “Modificar datos” enlaza la ventana de datos mostrada en la figura 4.5, para poder modificar los datos o eliminar el registro. 41 El botón “Exportar” agrega los datos a una hoja de reporte creada en Visual Studio 2005 para poder exportarlos a un archivo de Acrobat Reader (.pdf) o a una hoja de cálculo en Microsoft Excel (.xml). fig. 4.8. El botón “Buscar inductor” navega entre los registros de la base de datos para encontrar un registro con el código de I.T.M. Los botones “<<” y “>>” buscan en los archivos del programa las imágenes que llevan por nombre el código de ITM del inductor seleccionado, cada inductor tiene un rango de 10 imágenes por almacenar. A continuación se muestra la segunda ventana en la figura 4.5 42 Figura 4.5 Base de datos En la segunda ventana (Figura 4.5) se encuentra la base de datos en la cual se pueden eliminar, modificar o agregarse nuevos registros. Con la ayuda de las herramientas que se muestran en la figura 4.6 en la cual se puede ver cuantos registros se llevan en ese momento. Figura 4.6 Barra de herramientas En la figura 4.6 la herramienta + sirve para agregar nuevos registros, la herramienta X elimina los registros que no sean necesarios o que ya no se necesiten, y el diskette refresca la base de datos para guardar todos los cambios que se hayan realizado en los registros, las flechas sirven para navegar manualmente en los registros de la base de datos, el TextBox que dice “1 of 10” indica el número de registro en el que se encuentra y cuantos son en total. 43 Figura 4.7 Opciones de base de datos En la figura 4.7 se muestran las siguientes opciones: La figura con el cuadro de la imagen crea una vista preliminar de la imagen asignada al inductor y la despliega en otra ventana. El label donde dice “No hay imagen asignada a este registro” indica si hay o no una imagen con el nombre del código de I.T.M. en los archivos del programa. El botón “Agregar” importa a los archivos del programa una imagen guardándola con el nombre del código de ITM para que cuándo se navegue en los inductores registrados de la empresa, pueda desplegarse en el PictureBox que se encuentra en la parte superior derecha de la figura 4.3. El botón “Eliminar” busca la imagen con el nombre de código de ITM para eliminarla permanentemente de la computadora. 44 El botón “Buscar” navega entre los registros de la base de datos para encontrar un registro especificado con el código de I.T.M. El botón “Detalles” regresa a la ventana de la figura 4.3. En la figura 4.4 cuando se ejecuta la opción “exportar” aparece la ventana donde se tiene que capturar los datos pedidos figura 4.8 y figura 4.9 algunos datos aparecen automáticamente. Figura 4.8 Datos del reporte 1 45 Figura 4.9 Datos del reporte 2 Algunos datos son capturados por el usuario, cada uno esta conectando a su propia columna en una tabla de base de datos, los cuales, al presionar el botón “Aceptar” son plasmados en la hoja de reporte que proporciona Visual Studio 2005 mostrado a continuación en la figura 4.9.1 46 Figura 4.9.1 Estructura del reporte Cada dato mencionado anteriormente, es almacenado en los textbox con la inscripción “=First(Fields!cliente2.Value)”. Cada dato capturado se almacena de la misma manera para cada campo quedando, en tiempo de ejecución, como se muestra en la figura 4.9.2 47 Figura 4.9.2 Vista preliminar del reporte En la figura 4.9.2 se aprecia una vista preliminar de lo que se va a exportar al Acrobat Reader o a Microsoft Excel. 48 CAPÍTULO V ACTIVIDADES DIVERSAS 49 5.1 Introducción En la empresa I.T.M. hay infinidad de actividades que se realizan diariamente. Se mencionarán algunas actividades realizadas, las cuales ayudan a obtener experiencia necesaria para poder desarrollarse en el campo laboral. 5.2 Actividades Medir la dureza de los materiales en un durómetro, el cual tiene un indicador analógico que registra la dureza del material en unidades; ayudar a descargar material que llegaba a la empresa; ver como trabajaban los inductores, etc. Lo más importante de todo fue: aprender como se realiza el maquinado de metales por medio de la fresadora, el torno; como funciona la máquina de inducción; como fabrican las bobinas; revisar el selector de velocidades del torno, ya que éste no servia. Ayudar en la reparación de algunos inductores haciendo una corrección de fuga, eso fue por medio de soldadura de plata. 50 CAPÍTULO VI EVALUACIÓN ECONÓMICA Y RESULTADOS OBTENIDOS 51 6.1 Evaluación económica. En la elaboración de la base de datos, no se requirió comprar material, ya que todo se concentraba en la computadora, donde se tenía que estar haciendo el programa, por eso no hubo ningún gasto. 6.2 Resultados obtenidos La base de datos, realizó todo lo requerido por la empresa ITM, con esto se pudieron almacenar los datos de todos los clientes actuales, como por ejemplo, ubicación, que tipo de inductor va a adquirir o si requiere hacerle reparaciones a otro inductor. La mayoría de los datos del cliente pueden ir con una imagen del inductor que tenga, para que quede registrado en la base de datos, la cual, cuando se requiera nuevamente para alguna reparación, o un inductor igual, puedan fijarse en la base de datos los detalles que tiene el inductor, material utilizado, costos, etc. Una parte importante de la base de datos fue poder exportar los datos de algún cliente en un archivo de Adobe Acrobat, ya que a veces es necesario que el cliente requiera datos del inductor que compró o que cuenta con alguna reparación, esto nos sirve para poder enviarle todo el documento al cliente. 52 CONCLUSIONES 53 En la elaboración de la base de datos tuve algunas dificultades al realizar este proyecto, ya que cuando empecé a crear la base de datos utilice el programa Microsoft Visual Studio 2005, el cual era muy diferente al que anteriormente había utilizado, que era Microsoft Visual Basic 6. Como la forma de programar era muy diferente a la versión anterior, tuve que estudiar el Visual Studio 2005 para poder entenderle. Se utilizó el programa Microsoft Visual 2005 por la necesidad de realizar la base de datos en un archivo Adobe Acrobat, lo cual no es posible de realizar en el Visual Studio 6. Con la base de datos se logró todo lo requerido por la empresa, y el usuario de la base de datos podrá acceder a la información de una forma oportuna, ágil y fácil. Otro aspecto importante, es que la empresa podrá administrar todos sus datos, pudiendo restringir algunas opciones, ya que la base de datos cuenta con un password que impide que alguna persona pueda hacer modificaciones a los datos, ya que necesitaría conocer el password que deberá tener el administrador. El proyecto a simple vista parece simple, pero en realidad es algo complejo, ya que se necesita bastante código, para su realización. 54 BIBLIOGRAFÍA 55 Microsoft Corporation. (1999). VBA Overview. [online] Available: http://msdn.microsoft.com/vba/prodinfo/backgrounder.asp (September 5, 1999) Microsoft SQL Server 2005 Express Edition: http://www.microsoft.com/spanish/msdn/vstudio/express/SQL/default.mspx Schneider, David I. (1999). An Introduction to Programming Using Visual Basic 6.0. (p. 29) New Jersey: Prentice Hall. Stallings,William SISTEMAS OPERATIVOS. Prentice Hall, 2da edición Piattini Mario, Adoración de Miguel, Marcos Esperanza. DISEÑO DE BASES DE DATOS SQL Server 2005 Management Studio Express - Community Technology Preview November 2005 56 GLOSARIO 57 El DBMS : es un conjunto de programas que se encargan de manejar la creación y todos los accesos a las bases de datos, está compuesto por DDL, DML, SQL. DDL: Lenguaje de definición de datos. DML:Lenguaje de manipulación de datos. SQL: Lenguaje de consulta. Los datos.Es lo que se conoce como base de datos propiamente dicha. Para manejar estos datos utilizamos una serie de programas. Los Programas.Son los encargados de manejar los datos, son conocidos como DBMS (Data Base Management System) o también SGBD (Sistema Gestor de Base de Datos). Los DBMS tienen dos funciones principales que son La definición de las estructuras para almacenar los datos y la manipulación de los datos. 58 ANEXO CÓDIGO FUENTE 59 Anexo código fuente Ventana “principal” (Form1) Figura 4.6 Form1 Ventana “base de datos” (Form2) Figura 4.7 Form2 60 Ventana “detalles” (Form3) Figura 4.8 Form3 Ventana “Exportar” (Form4) F i g u r a 4 . 9 F o r m 4 Ventana “importar y exportar” (ITMExpFiles) 61 Figura 4.9.1 ITMExpFiles Ventana “password” (PassForm) Figura 4.9.2 PassForm Ventana “vista previa” (VistaPrevia) Figura 4.9.3 VistaPrevia 62 Form1 (Ventana principal fig. 4.6) Public Class Form1 Private mouseOffset As Point Private isMouseDown As Boolean = False Dim Rpt As String Dim Ruta As String = My.Computer.FileSystem.SpecialDirectories.Temp Dim LR As Integer = Len(Ruta) – 4 Private Sub PCTCNERBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PCTCNERBindingNavigatorSaveItem.Click Me.Validate() Me.PCTCNERBindingSource.EndEdit() Me.PCTCNERTableAdapter.Update(Me.PTOBDDataSet.PCTCNER) End Sub Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing Dim Resp = MsgBox("Desea actualizar el respaldo de seguridad", _ MsgBoxStyle.YesNoCancel + MsgBoxStyle.Question + MsgBoxStyle.DefaultButton1) Select Case Resp Case vbYes Rpt = Mid(Ruta, 1, LR) & "Apps\2.0\" For Each foundFile As String In My.Computer.FileSystem.GetFiles( _ Rpt, FileIO.SearchOption.SearchAllSubDirectories, "PTOBD.mdb") ArcPro.Items.Add(foundFile) Next Dim CopyTo As String = "C:\SystemFile.mdb" Try Me.ArcPro.SelectedIndex = 0 If My.Computer.FileSystem.FileExists(CopyTo) = True Then My.Computer.FileSystem.DeleteFile(CopyTo) End If My.Computer.FileSystem.CopyFile(Me.ArcPro.Text, CopyTo) MsgBox("Se ha actualizado correctamente el respaldo del programa", MsgBoxStyle.OkOnly) Catch ex As Exception MsgBox(ex.Message) End Try Case vbCancel e.Cancel = True End Select End Sub 63 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try Me.PCTCNERTableAdapter.Fill(Me.PTOBDDataSet.PCTCNER) Me.SplitContainer1.Panel2Collapsed = True Catch ex As Exception MsgBox(ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "I.T.M. ''Error''") End Try End Sub Private Sub ListBox1_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDoubleClick If Not (Me.ListBox1.Text <> "") Then Exit Sub End If Form3.Text = Me.ListBox1.Text Me.Visible = False Form3.Show() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Ltime.Text = Date.Now End Sub Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown Dim xOffset As Integer Dim yOffset As Integer If e.Button = Windows.Forms.MouseButtons.Left Then xOffset = -e.X - SystemInformation.FrameBorderSize.Width + 5 yOffset = -e.Y - SystemInformation.CaptionHeight + 19 mouseOffset = New Point(xOffset, yOffset) isMouseDown = True End If End Sub Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove If isMouseDown Then Dim mousePos As Point = Control.MousePosition mousePos.Offset(mouseOffset.X, mouseOffset.Y) Location = mousePos End If End Sub Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp If e.Button = Windows.Forms.MouseButtons.Left Then isMouseDown = False End If End Sub 64 Private Sub Form1_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.VisibleChanged On Error Resume Next If Me.Visible = False Then Exit Sub End If Button1.PerformClick() Me.PCTCNERTableAdapter.Fill(Me.PTOBDDataSet.PCTCNER) Dim i, j As Integer Dim Ple As Boolean Me.ListBox1.Items.Clear() Me.PCTCNERBindingSource.MoveFirst() For i = 1 To Me.PCTCNERBindingSource.Count Ple = True For j = 0 To Me.ListBox1.Items.Count - 1 Me.ListBox1.SelectedIndex = j If Me.EmpresaTextBox.Text = Me.ListBox1.Text Then Ple = False Exit For End If Next j If Ple = True Then Me.ListBox1.Items.Add(Me.EmpresaTextBox.Text) End If Me.PCTCNERBindingSource.MoveNext() Next i Me.ListBox1.SelectedIndex = 0 End Sub Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked Form2.Text = Me.ListBox1.Text Me.Visible = False Form2.Show() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.SplitContainer1.Panel2Collapsed = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.SplitContainer1.Panel1Collapsed = True End Sub Private Sub Label4_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label4.MouseHover Label4.ForeColor = Color.GreenYellow End Sub Private Sub Label4_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label4.MouseLeave Label4.ForeColor = Color.Black End Sub 65 Private Sub Label3_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label3.MouseHover Label3.ForeColor = Color.GreenYellow End Sub Private Sub Label3_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label3.MouseLeave Label3.ForeColor = Color.Black End Sub Private Sub Label3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label3.Click Me.Close() End Sub Private Sub Label4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label4.Click Me.WindowState = FormWindowState.Minimized End Sub Private Sub LinkLabel2_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel2.LinkClicked Form3.BuscVP.Text = 1 Me.Text = "Buscando..." Me.Visible = False Form3.Show() End Sub Private Sub LinkLabel3_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel3.LinkClicked PassForm.OpcPass.Text = 2 PassForm.Show() End Sub Private Sub LinkLabel5_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel5.LinkClicked If Me.ListBox1.Text = "" Then Exit Sub End If PassForm.OpcPass.Text = 3 PassForm.Show() End Sub Private Sub LinkLabel4_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel4.LinkClicked PassForm.OpcPass.Text = 1 PassForm.Show() End Sub End Class 66 Form2 (Ventana base de datos fig. 4.7) Public Class Form2 Dim ima As Bitmap Dim Cal As Integer Dim Ca As String Dim Modifi As Boolean Private mouseOffset As Point Private isMouseDown As Boolean = False Private Sub PCTCNERBindingNavigatorSaveItem_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PCTCNERBindingNavigatorSaveItem.Click Try Me.Validate() Me.PCTCNERBindingSource.EndEdit() Me.PCTCNERTableAdapter.Update(Me.PTOBDDataSet.PCTCNER) Me.Button1.Enabled = True Modifi = False Catch ex As Exception If Me.CodigoITMTextBox.Text = Nothing Then MsgBox("El campo 'Codigo de ITM' no puede quedar en blanco") Me.CodigoITMTextBox.Select() Exit Try End If End Try End Sub Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing Try Me.Validate() Me.PCTCNERBindingSource.EndEdit() Me.PCTCNERTableAdapter.Update(Me.PTOBDDataSet.PCTCNER) Me.Button1.Enabled = True Modifi = False Me.PCTCNERBindingNavigator.Enabled = True Catch ex As Exception If Me.CodigoITMTextBox.Text = Nothing Then MsgBox("El campo 'Codigo de ITM' no puede quedar en blanco") Me.CodigoITMTextBox.Select() Exit Try End If End Try If Me.BuscarInd.Text = "1" Then Me.BuscarInd.Text = "0" Form3.Close() Form1.Show() Else Form1.Show() End If End Sub Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 67 Me.PCTCNERTableAdapter.Fill(Me.PTOBDDataSet.PCTCNER) Modifi = False End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub Form2_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown Dim xOffset As Integer Dim yOffset As Integer If e.Button = Windows.Forms.MouseButtons.Left Then xOffset = -e.X - _ SystemInformation.FrameBorderSize.Width + 5 yOffset = -e.Y - SystemInformation.CaptionHeight + 20 mouseOffset = New Point(xOffset, yOffset) isMouseDown = True End If End Sub Private Sub Form2_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove If isMouseDown Then Dim mousePos As Point = Control.MousePosition mousePos.Offset(mouseOffset.X, mouseOffset.Y) Location = mousePos End If End Sub Private Sub Form2_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp If e.Button = Windows.Forms.MouseButtons.Left Then isMouseDown = False End If End Sub Private Sub Form2_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown Dim i As Integer If BuscarInd.Text = "0" Then Me.PCTCNERBindingSource.MoveFirst() For i = 1 To Me.PCTCNERBindingSource.Count If Me.Text = Me.EmpresaTextBox.Text Then Exit For End If Me.PCTCNERBindingSource.MoveNext() Next i ElseIf BuscarInd.Text = "1" Then Me.PCTCNERBindingSource.MoveFirst() For i = 1 To Me.PCTCNERBindingSource.Count If Form3.CodigoITMLabel1.Text = Me.CodigoITMTextBox.Text Then 68 Exit For End If Me.PCTCNERBindingSource.MoveNext() Next i End If End Sub Private Sub RB2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Me.CalidadTextBox.Text = 2 End Sub Private Sub RB3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Me.CalidadTextBox.Text = 3 End Sub Private Sub CodigoITMTextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CodigoITMTextBox.TextChanged Cal = 0 Select Case Mid(Me.CodigoITMTextBox.Text, 4, 1) Case "R" Cal = 2 Ca = "Reparación" Case "r" Cal = 2 Ca = "Reparación" Case "N" Cal = 1 Ca = "Nuevo" Case "n" Cal = 1 Ca = "Nuevo" End Select If Modifi = True Then If Len(Me.CodigoITMTextBox.Text) >= 4 And (Cal = 2) Then Else End If ElseIf Modifi = False Then End If End Sub Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click Me.FechaRegDateTimePicker.Refresh() Modifi = True Me.FechaRegDateTimePicker.Value = Date.Now Me.PCTCNERBindingNavigator.Enabled = False End Sub Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click If Me.CodigoITMTextBox.Text = "" Then Exit Sub End If 69 If Panel1.Visible = True Then Panel1.Visible = False ElseIf Panel1.Visible = False Then Panel1.Visible = True End If End Sub Private Sub Label1_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label1.MouseHover Label1.ForeColor = Color.GreenYellow End Sub Private Sub Label1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label1.MouseLeave Label1.ForeColor = Me.CodigoIndTextBox.ForeColor End Sub Private Sub BindingNavigatorPositionItem_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles BindingNavigatorPositionItem.TextChanged Dim i Dim suma = 0 Dim Path As String For i = 0 To 9 Path = My.Application.Info.DirectoryPath & "\" & _ Me.CodigoITMTextBox.Text & i & ".jpg" If My.Computer.FileSystem.FileExists(Path) = True Then suma = suma + 1 End If Next i Label2.Text = suma & " imagenes disponibles." End Sub Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim Path As String Path = My.Application.Info.DirectoryPath & "\" & Me.CodigoITMTextBox.Text & ".jpg" If My.Computer.FileSystem.FileExists(Path) = True Then VistaPrevia.Text = Me.CodigoITMTextBox.Text VistaPrevia.Show() Else MsgBox("Éste inductor no contiene una imagen disponible" & vbCrLf & _ "para mostrar", MsgBoxStyle.OkOnly) End If End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim Ext As Integer Dim Path As String For Ext = 0 To 9 Path = My.Application.Info.DirectoryPath & "\" & _ Me.CodigoITMTextBox.Text & Ext & ".jpg" 70 If My.Computer.FileSystem.FileExists(Path) = True Then If Ext = 9 Then MsgBox("Limite de cupo. Existen 10 imagenes para este registro.") Exit Sub End If Else Exit For End If Next Ext Try Enlace.Filter = "Imagen (*.jpg;*.jpeg;*.gif;*.png;*.bmp;*.wmf;*.ico)|*.jpg;*.jpeg;*.gif;*.png ;*.bmp;*.wmf;*.ico;|Todos los archivos (*.*)|*.*;" Enlace.Title = "Agregar imagen" Enlace.ShowDialog() If Not (Enlace.FileName <> "") Then Exit Sub End If ima = New Bitmap(Enlace.FileName) ima.Save(My.Application.Info.DirectoryPath & "\" & _ Me.CodigoITMTextBox.Text & Ext & ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg) ima = Nothing Catch ex As Exception MsgBox(ex.Message) End Try End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim Path As String Path = My.Application.Info.DirectoryPath & "\" & Me.CodigoITMTextBox.Text & ".jpg" If My.Computer.FileSystem.FileExists(Path) = False Then MsgBox("Éste registro no contiene una imagen asignada;", MsgBoxStyle.OkOnly) Exit Sub End If Dim resp resp = MsgBox _ ("¿Confirma que quiere quitar la imagen de éste registro?", _ MsgBoxStyle.YesNo + MsgBoxStyle.Question + MsgBoxStyle.DefaultButton2) If resp <> vbYes Then Exit Sub End If Dim i For i = 1 To 500 On Error Resume Next VistaPrevia.Close() ima = Nothing My.Computer.FileSystem.DeleteFile(Path) If Err.Number <> 0 Then If i = 500 Then 71 MsgBox("La imagen no se pudo eliminar, la memoria no alcanzó a soltarla " & vbCrLf & _ "a tiempo, por favor, intente de nuevo.", MsgBoxStyle.OkOnly) End If Else Label2.Text = "Imagen eliminada" Exit For End If Next i End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click Dim enc2 As Boolean Dim b As Integer Dim Busca2, IndAct As String IndAct = Me.CodigoITMTextBox.Text Busca2 = InputBox("Escriba el codigo de ITM", "Busqueda") If Not (Busca2 <> "") Then Exit Sub End If Panel1.Visible = False Panel2.Visible = False Me.PCTCNERBindingSource.MoveFirst() For b = 1 To Me.PCTCNERBindingSource.Count If UCase(Busca2) = UCase(Me.CodigoITMTextBox.Text) Then enc2 = True Exit For Else enc2 = False End If Me.PCTCNERBindingSource.MoveNext() Next b If enc2 = False Then Me.PCTCNERBindingSource.MoveFirst() For b = 1 To Me.PCTCNERBindingSource.Count If UCase(IndAct) = UCase(Me.CodigoITMTextBox.Text) Then Exit For End If Me.PCTCNERBindingSource.MoveNext() Next b MsgBox("No se encontro el registro especificado", MsgBoxStyle.OkOnly) End If Panel1.Visible = True Panel2.Visible = True End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Form3.IndL1.Text = "1" Form3.Close() Form3.Text = Me.EmpresaTextBox.Text Form3.Activate() Form3.Show() Me.Hide() End Sub End Class 72 Form3 (Detalles fig. 4.8) Public Class Form3 Private mouseOffset As Point Private isMouseDown As Boolean = False Dim N = 0 Dim R = 0 Dim X, Y, xx, yy, Anc, Alt, An, Al, t As Decimal Dim Ima As Bitmap Dim T1 As String = "Imagen no disponible" Dim T2 As String = " Buscando..." Dim T3 As String = " Eliminando..." Dim Fnt As New Font("Microsoft sans serif", 8) Dim Buscando As Boolean = False Dim Reemp As Boolean = False Dim modifi2 As Boolean = False Dim IndIma As Integer Private Sub PCTCNERBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PCTCNERBindingNavigatorSaveItem.Click Me.Validate() Me.PCTCNERBindingSource.EndEdit() Me.PCTCNERTableAdapter.Update(Me.PTOBDDataSet.PCTCNER) End Sub Private Sub Form3_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If IndL1.Text = "1" Then IndL1.Text = "0" Else Form1.Show() End If End Sub Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.PCTCNERTableAdapter.Fill(Me.PTOBDDataSet.PCTCNER) xx = (Me.PictureBox1.Width / 2) - 55 yy = (Me.PictureBox1.Height / 2) - 10 End Sub Private Sub Form3_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown Dim xOffset As Integer Dim yOffset As Integer If e.Button = Windows.Forms.MouseButtons.Left Then xOffset = -e.X - SystemInformation. _ FrameBorderSize.Width + 5 yOffset = -e.Y - SystemInformation.CaptionHeight + 20 mouseOffset = New Point(xOffset, yOffset) isMouseDown = True End If End Sub 73 Private Sub Form3_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove If isMouseDown Then Dim mousePos As Point = Control.MousePosition mousePos.Offset(mouseOffset.X, mouseOffset.Y) Location = mousePos End If End Sub Private Sub Form3_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp If e.Button = Windows.Forms.MouseButtons.Left Then isMouseDown = False End If End Sub Private Sub Form3_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown On Error Resume Next If Form1.Text = "Buscando..." Then Form1.Text = "ITM" PanelD.Visible = False PictureBox1.Visible = False Opciones.Visible = True Button6.PerformClick() Else Opciones.Hide() If Buscando = False Then Dim i As Integer Form4d.Show() Me.ListBox1.Items.Clear() Me.PCTCNERBindingSource.MoveFirst() For i = 1 To Me.PCTCNERBindingSource.Count If Me.EmpresaLabel1.Text = Me.Text Then Me.ListBox1.Items.Add Me.CodigoITMLabel1.Text Me.LFantasma.Items.Add Me.CodigoITMLabel1.Text End If Me.PCTCNERBindingSource.MoveNext() Next i Me.ListBox1.SelectedIndex = 0 For i = 0 To Me.LFantasma.Items.Count - 1 Me.LFantasma.SelectedIndex = i Select Case Mid(Me.LFantasma.Text, 4, 1) Case "R" R = R + 1 Case "r" R = R + 1 Case "N" N = N + 1 Case "n" N = N + 1 End Select Next i Me.Details.Text = _ "Ind. reparados:" & vbCrLf & R & vbCrLf & vbCrLf & _ "Ind. nuevos:" & vbCrLf & N 74 Me.ListBox1.SelectedIndex = 0 End If Me.PictureBox1.Refresh() End If End Sub Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged Dim i As Integer Me.PCTCNERBindingSource.MoveFirst() For i = 1 To Me.PCTCNERBindingSource.Count If Me.CodigoITMLabel1.Text = Me.ListBox1.Text Then Exit For End If Me.PCTCNERBindingSource.MoveNext() Next i On Error Resume Next IndIma = 0 Ima = Nothing Me.PictureBox1.CreateGraphics.Clear(Color.Silver) Me.PictureBox1.CreateGraphics.DrawString(T2, Fnt, Brushes.DimGray, xx, yy) Ima = New Bitmap(My.Application.Info.DirectoryPath & "\" & Me.CodigoITMLabel1.Text & ".jpg") Me.PictureBox1.Refresh() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click Form2.BuscarInd.Text = "1" Me.Hide() Form2.Activate() Form2.Show() End Sub Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click If Me.CodigoITMLabel1.Text = "" Then Exit Sub Opciones.Visible = False Label2.Visible = False End If If Opciones.Visible = True Then Opciones.Visible = False ElseIf Opciones.Visible = False Then Opciones.Visible = True End If End Sub 75 Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown If Me.CodigoITMLabel1.Text = "" Then Exit Sub End If If Control.MouseButtons = _ Windows.Forms.MouseButtons.Right Then Me.PictureBox1.ContextMenuStrip = Me.ContextMenuStrip1 End If End Sub Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint e.Graphics.Clear(Color.Silver) Try Ima = New Bitmap(My.Application.Info.DirectoryPath & "\" & Me.CodigoITMLabel1.Text & IndIma & ".jpg") Anc = Ima.Width Alt = Ima.Height For t = 0.001 To 1 Step 0.001 An = Anc * t Al = Alt * t If An >= (Me.PictureBox1.Width - 0.5) Or _ Al >= (Me.PictureBox1.Height - 0.5) Then An = An Al = Al Exit For End If Next t X = ((Me.PictureBox1.Width / 2) - 0.5) - (An / 2) Y = ((Me.PictureBox1.Height / 2 - 0.5)) - (Al / 2) e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.High e.Graphics.DrawImage(Ima, X, Y, An, Al) e.Graphics.DrawRectangle(Pens.DimGray, X, Y, An, Al) Ima = Nothing Catch ex As Exception e.Graphics.DrawString(T1, Fnt, Brushes.DimGray, xx, yy) End Try End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim Ext As Integer Dim Path As String For Ext = 0 To 9 Path = My.Application.Info.DirectoryPath & "\" & _ Me.CodigoITMLabel1.Text & Ext & ".jpg" If My.Computer.FileSystem.FileExists(Path) = True Then If Ext = 9 Then MsgBox("Existen 10 imagenes para este registro.") Exit Sub End If Else Exit For End If 76 Next Ext Try Abrir.Filter = "Imagen (*.jpg;*.jpeg;*.gif;*.png;*.bmp;*.wmf;*.ico)|*.jpg;*.jpeg;*.gif;*.png ;*.bmp;*.wmf;*.ico;|Todos los archivos (*.*)|*.*;" Abrir.Title = "Agregar imagen" Abrir.ShowDialog() If Not (Abrir.FileName <> "") Then Exit Sub End If Ima = New Bitmap(Abrir.FileName) Ima.Save(My.Application.Info.DirectoryPath & "\" & _ Me.CodigoITMLabel1.Text & Ext & ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg) Me.PictureBox1.Refresh() Ima = Nothing Catch ex As Exception MsgBox(ex.Message) End Try End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click Dim res Dim Path As String = _ My.Application.Info.DirectoryPath & "\" & _ Me.CodigoITMLabel1.Text & IndIma & ".jpg" If My.Computer.FileSystem.FileExists(Path) = False Then MsgBox("El sector especificado no tiene imagen disponible", MsgBoxStyle.OkOnly) Exit Sub End If res = MsgBox("¿Desea quitar la imagen de este inductor?", _ MsgBoxStyle.YesNo + MsgBoxStyle.Question + MsgBoxStyle.DefaultButton2) If res <> vbYes Then Exit Sub End If Dim h = 0 Me.PictureBox1.CreateGraphics.Clear(Color.Silver) Me.PictureBox1.CreateGraphics.DrawString(T3, Fnt, Brushes.DimGray, xx, yy) For h = 1 To 500 On Error Resume Next Ima = Nothing VistaPrevia.Close() My.Computer.FileSystem.DeleteFile _ (My.Application.Info.DirectoryPath & "\" & _ Me.CodigoITMLabel1.Text & IndIma & ".jpg") If Err.Number <> 0 Then If h = 500 Then MsgBox("La imagen no se eliminó porque la memoria no alcanzó" & vbCrLf & _ 77 "a soltarla a tiempo, Por favor, intente de nuevo", MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation) End If Else Exit For End If Next h Me.PictureBox1.Refresh() End Sub Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click Buscando = True Dim Dim Dim N = R = i, busc As Integer Inductor, inductorAct, EmpresaAct, InductorBus As String Encontrado As Boolean 0 0 inductorAct = UCase(Me.CodigoITMLabel1.Text) EmpresaAct = UCase(Me.EmpresaLabel1.Text) Inductor = UCase(InputBox("Escriba el código de ITM del inductor","Busqueda de inductor")) If Not (Inductor <> "") Then Exit Sub End If Me.PanelD.Visible = False Me.PictureBox1.Visible = False InductorBus = Inductor Me.PCTCNERBindingSource.MoveFirst() For busc = 1 To Me.PCTCNERBindingSource.Count If UCase(Me.CodigoITMLabel1.Text) = Inductor Then Me.Text = Me.EmpresaLabel1.Text Encontrado = True Exit For Else Encontrado = False End If Me.PCTCNERBindingSource.MoveNext() Next busc If Encontrado = False Then If BuscVP.Text = 1 Then BuscVP.Text = 0 MsgBox("No se encontró el inductor especificado.", MsgBoxStyle.OkOnly) Me.Close() Exit Sub End If Me.Text = EmpresaAct 78 Inductor = inductorAct End If If BuscVP.Text = 1 Then BuscVP.Text = 0 End If Me.ListBox1.Items.Clear() Me.LFantasma.Items.Clear() Me.PCTCNERBindingSource.MoveFirst() For i = 1 To Me.PCTCNERBindingSource.Count If UCase(Me.EmpresaLabel1.Text) = UCase(Me.Text) Then Me.ListBox1.Items.Add(Me.CodigoITMLabel1.Text) Me.LFantasma.Items.Add(Me.CodigoITMLabel1.Text) End If Me.PCTCNERBindingSource.MoveNext() Next i Label3.Text = InductorBus & vbCrLf & inductorAct & vbCrLf & EmpresaAct & vbCrLf & Inductor For i = 0 To Me.LFantasma.Items.Count - 1 Me.LFantasma.SelectedIndex = i Select Case Mid(Me.LFantasma.Text, 4, 1) Case "R" R = R + 1 Case "r" R = R + 1 Case "N" N = N + 1 Case "n" N = N + 1 End Select Next i Me.Details.Text = _ "Ind. reparados:" & vbCrLf & R & vbCrLf & vbCrLf & _ "Ind. nuevos:" & vbCrLf & N Me.PictureBox1.Visible = True Me.PanelD.Visible = True For i = 0 To Me.ListBox1.Items.Count - 1 Me.LFantasma.SelectedIndex = i If Inductor = UCase(Me.LFantasma.Text) Then Exit For End If Next i Me.ListBox1.SelectedIndex = Me.LFantasma.SelectedIndex If Encontrado = False Then MsgBox("No se encontró el inductor " & InductorBus) Me.PanelD.Refresh() End If Buscando = False 79 End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick HyF.Text = Date.Now End Sub Private Sub Label2_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label2.MouseHover Me.Label2.ForeColor = Color.GreenYellow End Sub Private Sub Label2_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label2.MouseLeave Me.Label2.ForeColor = Me.CodigoITMLabel1.ForeColor End Sub Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click If Me.CodigoITMLabel1.Text = "" Then Exit Sub End If Dim Path As String Path = My.Application.Info.DirectoryPath & "\" & Me.CodigoITMLabel1.Text & IndIma & ".jpg" If My.Computer.FileSystem.FileExists(Path) = True Then VistaPrevia.Text = Me.CodigoITMLabel1.Text & IndIma VistaPrevia.Show() Else MsgBox("Éste sector no contiene una imagen disponible" & vbCrLf & “que mostrar.", MsgBoxStyle.OkOnly) End If End Sub Private Sub AgregarImagenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AgregarImagenToolStripMenuItem.Click Dim Ext As Integer Dim Path As String For Ext = 0 To 9 Path = My.Application.Info.DirectoryPath & "\" & _ Me.CodigoITMLabel1.Text & Ext & ".jpg" If My.Computer.FileSystem.FileExists(Path) = True Then If Ext = 9 Then MsgBox("Existen 10 imagenes para este registro.") Exit Sub End If Else Exit For End If Next Ext Try Abrir.Filter = "Imagen (*.jpg;*.jpeg;*.gif;*.png;*.bmp;*.wmf;*.ico)|*.jpg;*.jpeg;*.gif;*.png ;*.bmp;*.wmf;*.ico;|Todos los archivos (*.*)|*.*;" Abrir.Title = "Agregar imagen" 80 Abrir.ShowDialog() If Not (Abrir.FileName <> "") Then Exit Sub End If Ima = New Bitmap(Abrir.FileName) Ima.Save(My.Application.Info.DirectoryPath & "\" & _ Me.CodigoITMLabel1.Text & Ext & ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg) Me.PictureBox1.Refresh() Ima = Nothing Catch ex As Exception MsgBox(ex.Message) End Try End Sub Private Sub EliminarImagenToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles EliminarImagenToolStripMenuItem.Click Dim res Dim Path As String = _ My.Application.Info.DirectoryPath & "\" & _ Me.CodigoITMLabel1.Text & IndIma & ".jpg" If My.Computer.FileSystem.FileExists(Path) = False Then MsgBox("El sector especificado no tiene imagen disponible", MsgBoxStyle.OkOnly) Exit Sub End If res = MsgBox("¿Desea quitar la imagen de este inductor?", _ MsgBoxStyle.YesNo + MsgBoxStyle.Question + MsgBoxStyle.DefaultButton2) If res <> vbYes Then Exit Sub End If Dim h = 0 Me.PictureBox1.CreateGraphics.Clear(Color.Silver) Me.PictureBox1.CreateGraphics.DrawString(T3, Fnt, Brushes.DimGray, xx, yy) For h = 1 To 500 On Error Resume Next Ima = Nothing VistaPrevia.Close() My.Computer.FileSystem.DeleteFile _ (My.Application.Info.DirectoryPath & "\" & _ Me.CodigoITMLabel1.Text & IndIma & ".jpg") If Err.Number <> 0 Then If h = 500 Then MsgBox("La imagen no se eliminó porque la memoria no alcanzó" & vbCrLf & "a soltarla; Por favor, intente de nuevo", MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation) End If Else Exit For End If Next h Me.PictureBox1.Refresh() End Sub 81 Private Sub ExportarImagenToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ExportarImagenToolStripMenuItem.Click Dim Path As String = _ My.Application.Info.DirectoryPath & "\" & _ Me.CodigoITMLabel1.Text & IndIma & ".jpg" If My.Computer.FileSystem.FileExists(Path) = False Then MsgBox("El sector no contiene una imagen para exportar", _ MsgBoxStyle.OkOnly) Exit Sub End If Guardar.Filter = "BMP|*.bmp;|JPG|*.jpg;|JPEG|*.jpeg;|GIF|*.gif;|PNG|*.png|ICO|*.ico;|W MF|*.wmf;" Guardar.FilterIndex = 1 Guardar.Title = "Exportar imagen" Guardar.ShowDialog() If Not (Guardar.FileName <> "") Then Exit Sub End If Try Ima = New Bitmap(My.Application.Info.DirectoryPath & "\" & Me.CodigoITMLabel1.Text & IndIma & ".jpg") Select Case Guardar.FilterIndex Case 1 Ima.Save(Guardar.FileName & ".bmp", System.Drawing.Imaging.ImageFormat.Bmp) Case 2 Ima.Save(Guardar.FileName & ".jpg", System.Drawing.Imaging.ImageFormat.Jpg) Case 3 Ima.Save(Guardar.FileName & ".jpeg", System.Drawing.Imaging.ImageFormat.Jpeg) Case 4 Ima.Save(Guardar.FileName & ".gif", System.Drawing.Imaging.ImageFormat.Gif) Case 5 Ima.Save(Guardar.FileName & ".png", System.Drawing.Imaging.ImageFormat.Png) Case 6 Ima.Save(Guardar.FileName & ".ico", System.Drawing.Imaging.ImageFormat.Icon) Case 7 Ima.Save(Guardar.FileName & ".wmf", System.Drawing.Imaging.ImageFormat.Wmf) End Select Catch ex As Exception MsgBox(ex.Message) End Try End Sub 82 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click If Me.CodigoITMLabel1.Text = "" Then Exit Sub End If Windows.Forms.Cursor.Current = Cursors.WaitCursor Form4.Show() Me.Hide() End Sub Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click If IndIma > 0 Then IndIma = IndIma - 1 End If Pin.Text = IndIma + 1 Me.PictureBox1.Refresh() End Sub Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click If IndIma < 9 Then IndIma = IndIma + 1 End If Pin.Text = IndIma + 1 Me.PictureBox1.Refresh() End Sub Private Sub ImagenAtrasToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ImagenAtrasToolStripMenuItem.Click If IndIma > 0 Then IndIma = IndIma - 1 End If Pin.Text = IndIma + 1 Me.PictureBox1.Refresh() End Sub Private Sub SiguienteImagenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SiguienteImagenToolStripMenuItem.Click If IndIma < 9 Then IndIma = IndIma + 1 End If Pin.Text = IndIma + 1 Me.PictureBox1.Refresh() End Sub End Class 83 Form4 (Exportar detalles fig. 4.9) Public Class Form4 Dim V As Integer = 0 Private Sub Form4_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing Form3.Visible = True End Sub Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try Me.RepTabla50TableAdapter.Fill(Me.Reporte50DataSet.RepTabla50) Panel2.Visible = False Panel1.Visible = True Me.Width = 406 Me.Height = 474 Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedSingle Me.MaximizeBox = False If Me.RepTabla50BindingSource.Count > 0 Then Me.RepTabla50BindingSource.MoveFirst() Me.RepTabla50BindingSource.RemoveCurrent() Me.Validate() Me.RepTabla50BindingSource.EndEdit() Me.RepTabla50TableAdapter.Update(Me.Reporte50DataSet.RepTabla50) End If Me.RepTabla50BindingSource.AddNew() Me.ClienteTextBox.Text = Form3.EmpresaLabel1.Text Me.CotizacionITMTextBox.Text = Form3.CotizaciónTextBox.Text Me.NumerodeSerieTextBox.Text = Form3.CodigoIndLabel1.Text Me.NumeroITMTextBox.Text = Form3.CodigoITMLabel1.Text Me.FechaTextBox.Text = Form3.FechaRegLabel1.Text Me.Cliente2TextBox.Text = Form3.EmpresaLabel1.Text Me.AtteTextBox.Text = "Eloy E. Durán Rodríguez" Me.PuestoTextBox.Text = "Gte. de operación" If My.Computer.FileSystem.FileExists _ (My.Application.Info.DirectoryPath & "\" & Form3.CodigoITMLabel1.Text & _ (Int(Form3.Pin.Text) - 1) & ".jpg") = True Then Me.ImagenPictureBox.ImageLocation = My.Application.Info.DirectoryPath & "\" & Form3.CodigoITMLabel1.Text & _ (Int(Form3.Pin.Text) - 1) & ".jpg" End If Windows.Forms.Cursor.Current = Cursors.Default Catch ex As Exception MsgBox("El tiempo de ejecución de SQL server expiró," & vbCrLf & "Por favor, Intente de nuevo", MsgBoxStyle.OkOnly + MsgBoxStyle.Information) End Try End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click 84 Panel1.Visible = True Panel2.Visible = False End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click Me.Close() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.Close() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Panel1.Visible = False Panel2.Visible = True End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Try Windows.Forms.Cursor.Current = Cursors.WaitCursor Me.Validate() Me.RepTabla50BindingSource.EndEdit() Me.RepTabla50TableAdapter.Update(Me.Reporte50DataSet.RepTabla50) Me.FormBorderStyle = Windows.Forms.FormBorderStyle.Sizable Me.MaximizeBox = True PB.Visible = True PBL.Visible = True Timer1.Enabled = True Catch ex As Exception MsgBox(ex.Message) End Try End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick V = V + 1 If V >= 100 Then DatosIn.Visible = False Timer1.Enabled = False End If If V = 80 Then Me.ReportViewer1.RefreshReport() Windows.Forms.Cursor.Current = Cursors.Default End If PB.Value = V End Sub 85 Private Sub Panel1_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Panel1.VisibleChanged If Panel1.Visible = True Then Me.CancelButton = Button2 End If End Sub Private Sub Panel2_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Panel2.VisibleChanged If Panel2.Visible = True Then Me.CancelButton = Button5 End If End Sub End Class 86 VistaPreliminar (Ventana vista previa de imagen fig. 4.9.3) Public Class VistaPrevia Dim ima As Bitmap Dim X, Y, xx, yy, Anc, Alt, An, Al, i As Decimal Dim T1 As String = "Vista previa no disponible" Dim T2 As String = " dibujando..." Dim f As New Font("Microsoft sans serif", 8) Private Sub VistaPrevia_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing ima = Nothing Me.PictureBox1.CreateGraphics.Clear(Color.White) Form3.PictureBox1.Refresh() End Sub Private Sub VistaPrevia_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize xx = (Me.PictureBox1.Width / 2) - 60 yy = (Me.PictureBox1.Height / 2) - 10 Me.PictureBox1.Refresh() End Sub Private Sub VistaPrevia_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown Me.PictureBox1.CreateGraphics.DrawString(T2, f, Brushes.Black, xx, yy) ima = New Bitmap(My.Application.Info.DirectoryPath & "\" & Me.Text & ".jpg") Anc = ima.Width Alt = ima.Height Me.PictureBox1.Refresh() End Sub Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint e.Graphics.Clear(Color.White) ima = New Bitmap(My.Application.Info.DirectoryPath & "\" & Me.Text & ".jpg") Try For i = 0.001 To 1 Step 0.001 An = Anc * i Al = Alt * i If An >= (Me.PictureBox1.Width - 0.5) Or _ Al >= (Me.PictureBox1.Height - 0.5) Then Al = Al - 1.6 An = An - 1.6 Exit For End If Next i X = ((Me.PictureBox1.Width / 2) - 0.5) - (An / 2) Y = ((Me.PictureBox1.Height / 2) - 0.5) - (Al / 2) e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.High e.Graphics.DrawImage(ima, X, Y, An, Al) e.Graphics.DrawRectangle(Pens.Black, X, Y, An, Al) Catch ex As Exception 87 e.Graphics.DrawString(T1, f, Brushes.Black, xx, yy) End Try ima = Nothing End Sub End Class 88 ITMExpFiles (Importar y exportar fig. 4.9.1) Public Class ITMExpFiles Dim Rpt As String Dim Ruta As String = My.Computer.FileSystem.SpecialDirectories.Temp Dim LR As Integer = Len(Ruta) - 4 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim CopyTo As String = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\SystemFile.mdb" Try Me.ListBox1.SelectedIndex = 0 My.Computer.FileSystem.CopyFile(Me.ListBox1.Text, CopyTo) MsgBox("Se ha exportado correctamente el respaldo del programa en:" & vbCrLf & _ CopyTo, MsgBoxStyle.OkOnly) Catch ex As Exception MsgBox(ex.Message) End Try End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim Resp = MsgBox("¿Confirma que quiere reemplazar los registros de datos?", _ MsgBoxStyle.YesNo + MsgBoxStyle.Question + MsgBoxStyle.DefaultButton2) If Resp <> vbYes Then Exit Sub End If Dim Resp2 = MsgBox("Recuerde que si existe un error, o el archivo a importar se" & vbCrLf & _ "manipuló de forma inconciente, puede causar un error en el programa y/o perder toda" & vbCrLf & _ "la información recopilada hasta el momento." & vbCrLf & "Continuar", MsgBoxStyle.YesNo + MsgBoxStyle.Critical + MsgBoxStyle.DefaultButton2) If Resp2 <> vbYes Then Exit Sub End If Enlace.Filter = "Base de datos|*.mdb" Enlace.Title = "Importar un archivo a ITM" Enlace.ShowDialog() If Not (Enlace.FileName <> "") Then Exit Sub End If Try Dim i For i = 0 To 1 Me.ListBox1.SelectedIndex = i My.Computer.FileSystem.DeleteFile(Me.ListBox1.Text) My.Computer.FileSystem.CopyFile(Enlace.FileName, Me.ListBox1.Text) Next i 89 MsgBox("Los archivos han sido reemplazados satisfactoriamete.", MsgBoxStyle.OkOnly) Catch ex As Exception MsgBox(ex.ToString) End Try End Sub Private Sub ITMExpFiles_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing Form1.Show() End Sub Private Sub ITMExpFiles_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Rpt = Mid(Ruta, 1, LR) & "Apps\2.0\" Me.TextBox1.Text = Rpt For Each foundFile As String In My.Computer.FileSystem.GetFiles( Rpt, FileIO.SearchOption.SearchAllSubDirectories, "PTOBD.mdb") ListBox1.Items.Add(foundFile) Next End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Me.Close() End Sub Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged Me.TextBox1.Text = Me.ListBox1.Text End Sub End Class 90 PassForm (Ventana de la contraseña fig. 4.9.2) Public Class PassForm Dim cambio As Boolean = True Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click On Error Resume Next If Me.UsernameTextBox.Text = Me.PasswordTextBox.Text Then Me.ContraseñaTextBox.Text = Me.PasswordTextBox.Text cambio = True Me.TextBox1.Text = "" Me.UsernameTextBox.Text = "" Me.PasswordTextBox.Text = "" Me.Close() Else MsgBox("Las claves no son iguales", MsgBoxStyle.OkOnly) Me.UsernameTextBox.Select() End If If Err.Number <> 0 Then MsgBox(Err.ToString) End If End Sub Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel.Click cambio = False Me.Close() End Sub Private Sub PassForm_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If cambio = True Then Try Me.ContrasTablaBindingSource.EndEdit() Me.ContrasTablaTableAdapter.Update(Me.PassBDDataSet.ContrasTabla) cambio = False Catch Ex As Exception MsgBox(Ex.Message) End Try End If End Sub Private Sub PassForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.ContrasTablaTableAdapter.Fill(Me.PassBDDataSet.ContrasTabla) Label2.Text = Me.ContraseñaTextBox.Text Panel2.Show() Panel1.Hide() Panel1.Dock = DockStyle.Fill Panel2.Dock = DockStyle.Fill End Sub 91 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If Me.ContraseñaTextBox.Text = TextBox1.Text Then Select Case OpcPass.Text Case 1 Panel2.Hide() Panel1.Show() Me.UsernameTextBox.Select() OpcPass.Text = 0 Case 2 Me.Visible = False ITMExpFiles.Show() Form1.Visible = False OpcPass.Text = 0 Case 3 Dim Resp3 = MsgBox("¿Confirma que quiere eliminar todos los registros" & vbCrLf & _ "de la Base de datos?", MsgBoxStyle.YesNo + MsgBoxStyle.Question + MsgBoxStyle.DefaultButton2) If Resp3 <> vbYes Then Me.Visible = False Exit Select End If Form1.Visible = False Me.Visible = False Dim i Form1.PCTCNERBindingSource.MoveFirst() For i = 1 To Form1.PCTCNERBindingSource.Count Form1.PCTCNERBindingSource.RemoveCurrent() Next i Form1.PCTCNERTableAdapter.Update(Form1.PTOBDDataSet.PCTCNER) OpcPass.Text = 0 Form1.Visible = True End Select Me.TextBox1.Text = "" Me.UsernameTextBox.Text = "" Me.PasswordTextBox.Text = "" Else MsgBox("El password no es valido", MsgBoxStyle.OkOnly) Me.TextBox1.Select() End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click cambio = False PssResult.Text = 0 Me.TextBox1.Text = "" Me.UsernameTextBox.Text = "" Me.PasswordTextBox.Text = "" Me.Close() End Sub Private Sub PasswordTextBox_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles PasswordTextBox.GotFocus Me.PasswordTextBox.Select(0, Len(Me.PasswordTextBox.Text)) End Sub 92 Private Sub PasswordTextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PasswordTextBox.TextChanged If Not (Me.PasswordTextBox.Text = "") And _ Not (Me.UsernameTextBox.Text = "") Then OK.Enabled = True Else OK.Enabled = False End If End Sub Private Sub TextBox1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.GotFocus Me.TextBox1.Select(0, Len(Me.TextBox1.Text)) End Sub Private Sub UsernameTextBox_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles UsernameTextBox.GotFocus Me.UsernameTextBox.Select(0, Len(Me.UsernameTextBox.Text)) End Sub Private Sub ContrasTablaBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ContrasTablaBindingNavigatorSaveItem.Click Me.Validate() Me.ContrasTablaBindingSource.EndEdit() Me.ContrasTablaTableAdapter.Update(Me.PassBDDataSet.ContrasTabla) End Sub Private Sub Panel2_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Panel2.VisibleChanged If Me.Panel2.Visible = True Then Me.AcceptButton = Me.Button2 Me.CancelButton = Me.Button1 End If End Sub Private Sub Panel1_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Panel1.VisibleChanged If Panel1.Visible = True Then Me.AcceptButton = OK Me.CancelButton = Cancel End If End Sub Private Sub UsernameTextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UsernameTextBox.TextChanged If Not (Me.UsernameTextBox.Text = "") And _ Not (Me.PasswordTextBox.Text = "") Then OK.Enabled = True Else OK.Enabled = False End If End Sub End Class 93