UNIVERSIDAD CENTRAL DEL ECUADOR FACULTAD DE INGENIERÍA, CIENCIAS FÍSICAS Y MATEMÁTICA CARRERA DE INGENIERÍA INFORMÁTICA APLICACIÓN WEB PARA EL MONITOREO DE INDICADORES DE DESARROLLO ECONÓMICO PARA LAS COMUNIDADES UBICADAS EN LOS CANTONES RIOBAMBA, GUANO Y PELILEO DE LA PROVINCIA DE CHIMBORAZO TRABAJO DE GRADUACIÓN PREVIO A LA OBTENCIÓN DEL TÍTULO DE INGENIERO INFORMÁTICO AUTOR: GALO SANTIAGO QUISIGUINA CASTILLO TUTOR: ING. RENÉ ALFONSO CARRILLO FLORES QUITO – ECUADOR 2015 DEDICATORIA A Dios porque antes de yo nacer ya pensó en mí y en este logro. A mi mamá Carmen, que me dio la vida y que con su amor ha sido uno de los soportes de estos largos años de estudio. A mi padre Galo, que con su ayuda incondicional me ha demostrado que no hay mejores amigos que los padres. A mi hermano de quien aprendo cada día y siempre ha estado dispuesto a escucharme y animarme. A mi tía Mariana Sánchez y mis tíos Leonor y Carlos Quisigüiña, por su apoyo en los momentos difíciles. A mis tíos Yolanda y Gonzalo Quisigüiña, quienes siempre me motivaron a ser un profesional cuando estuvieron con vida por lo cual les rindo este pequeño homenaje. Galo Santiago Quisiguina Castillo ii AGRADECIMIENTO Agradezco a la gloriosa Universidad Central del Ecuador por haberme brindado acogida durante estos largos años de estudio, la cual se convirtió en un segundo hogar. A los docentes de la Facultad de Ingeniería, Ciencias Físicas y Matemática, por darme el conocimiento necesario para poder desenvolverme como ser humano y como profesional. Al Ing. René Carrillo por su paciencia y guía durante el desarrollo y culminación del presente trabajo. Al Ing. Ivan Naula por su tiempo y ayuda para sacar adelante este proyecto. Al Ing. Aldrín Flores, quien siempre estuvo pendiente de que el trabajo de graduación terminara exitosamente. Le quedo eternamente agradecido. iii AUTORIZACIÓN DE LA AUTORÍA INTELECTUAL Yo, GALO SANTIAGO QUISIGUINA CASTILLO, en calidad de autor del trabajo de investigación o tesis realizada sobre APLICACIÓN WEB PARA EL MONITOREO DE INDICADORES DE DESARROLLO ECONÓMICO PARA LAS COMUNIDADES UBICADAS EN LOS CANTONES RIOBAMBA, GUANO Y PELILEO DE LA PROVINCIA DE CHIMBORAZO, por la presente autorizo a la Universidad Central del Ecuador hacer uso de todos los contenidos que me pertenecen o de parte de los que contiene esta obra, con fines estrictamente académicos o de investigación. Los derechos que como autor me corresponden, con la excepción de la presente autorización, seguirán vigentes a mi favor, de conformidad con lo establecido en los artículos 5, 6, 8, 19 y demás pertinentes de la Ley de Propiedad Intelectual y su Reglamento. Quito, 27 de Mayo de 2015 Galo Santiago Quisiguina Castillo C.C. 1714914304 iv CERTIFICADO DE CULMINACIÓN DEL TUTOR v CERTIFICADO DE CULMINACIÓN DE TESIS vi SOLICITUD CALIFICACIÓN DEL TRABAJO DE GRADUACIÓN vii RESULTADO DEL TRABAJO DE GRADUACIÓN viii CONTENIDO DEDICATORIA .............................................................................................................................................................. II AGRADECIMIENTO ................................................................................................................................................... III AUTORIZACIÓN DE LA AUTORÍA INTELECTUAL ...................................................................................... IV CERTIFICADO DE CULMINACIÓN DEL TUTOR .............................................................................................V CERTIFICADO DE CULMINACIÓN DE TESIS ................................................................................................ VI SOLICITUD CALIFICACIÓN DEL TRABAJO DE GRADUACIÓN .......................................................... VII RESULTADO DEL TRABAJO DE GRADUACIÓN ...................................................................................... VIII CONTENIDO ................................................................................................................................................................. IX LISTA DE ILUSTRACIONES .................................................................................................................................. XI LISTA DE TABLAS ................................................................................................................................................. XIII RESUMEN .................................................................................................................................................................. XIV ABSTRACT .................................................................................................................................................................. XV CERTIFICADO DE TRADUCCIÓN .................................................................................................................... XVI INTRODUCCIÓN ........................................................................................................................................................... 1 CAPITULO 1 ................................................................................................................................................................... 2 1.1 ANTECEDENTES ........................................................................................................................................... 2 1.2 PRESENTACIÓN DEL PROBLEMA ...................................................................................................... 2 1.3 OBJETIVOS ...................................................................................................................................................... 3 1.4 JUSTIFICACION E IMPORTANCIA ......................................................................................................... 4 1.5 MARCO TEÓRICO ......................................................................................................................................... 4 1.6 METODOLOGÍA.............................................................................................................................................. 5 1.7 ALCANCE ......................................................................................................................................................... 7 1.8 LIMITACIONES ............................................................................................................................................ 11 1.9 PLATAFORMA ............................................................................................................................................. 11 1.10 HERRAMIENTAS ........................................................................................................................................ 12 1.11 MARCO ADMINISTRATIVO .................................................................................................................... 17 CAPITULO 2 ................................................................................................................................................................ 20 2 METODOLOGÍA ............................................................................................................................................... 20 CAPITULO 3 ................................................................................................................................................................ 40 3 DESCRIPCION DEL SISTEMA ................................................................................................................... 40 CAPITULO 4 ................................................................................................................................................................ 50 ix 4 PRUEBAS ........................................................................................................................................................... 50 CAPITULO 5 ................................................................................................................................................................ 58 5. CONCLUSIONES Y RECOMENDACIONES .......................................................................................... 58 GLOSARIO ................................................................................................................................................................... 59 BIBLIOGRAFÍA........................................................................................................................................................... 61 ANEXOS ........................................................................................................................................................................ 62 DICCIONARIO DE DATOS ..................................................................................................................................... 64 MANUAL TÉCNICO .................................................................................................................................................. 69 CODIGO FUENTE ...................................................................................................................................................... 70 MANUAL DE USUARIO ........................................................................................................................................149 x LISTA DE ILUSTRACIONES Ilustración 1 Arquitectura 3 Capas.................................................................................................................. 11 Ilustración 2 Actor.................................................................................................................................................... 24 Ilustración 3 Caso de uso .................................................................................................................................... 24 Ilustración 4 Generalización ............................................................................................................................... 24 Ilustración 5 Extiende ............................................................................................................................................ 24 Ilustración 6 Usa ...................................................................................................................................................... 25 Ilustración 7 Interacción entre los Usuarios del Sistema .................................................................... 25 Ilustración 8 Objeto................................................................................................................................................. 30 Ilustración 9 Línea de vida .................................................................................................................................. 30 Ilustración 10 Actor Diagrama de secuencia ............................................................................................. 30 Ilustración 11 Mensaje .......................................................................................................................................... 31 Ilustración 12 Síncrono ......................................................................................................................................... 31 Ilustración 13 Asíncrono ...................................................................................................................................... 31 Ilustración 14 Recursividad ................................................................................................................................ 32 Ilustración 15 Diagrama de Secuencia Administrador.......................................................................... 32 Ilustración 16 Diagrama Secuencia Coordinador ................................................................................... 33 Ilustración 17 Diagrama de secuencia Promotor .................................................................................... 34 Ilustración 18 Estado ............................................................................................................................................. 35 Ilustración 19 Transición simple....................................................................................................................... 35 Ilustración 20 Diagrama de Estados .............................................................................................................. 36 Ilustración 21 Modelo Vista Controlador ...................................................................................................... 38 Ilustración 22 Ingreso al Sistema .................................................................................................................... 40 Ilustración 23 Administración Perfiles ........................................................................................................... 41 Ilustración 24 Mantenimiento Perfiles ........................................................................................................... 42 Ilustración 25 Mantenimiento Usuarios ........................................................................................................ 42 Ilustración 26 Mantenimiento Frecuencias ................................................................................................. 42 Ilustración 27 Mantenimiento Estado ............................................................................................................ 43 Ilustración 28 Mantenimiento Unidades ....................................................................................................... 43 Ilustración 29 Mantenimiento Cargos............................................................................................................ 43 Ilustración 30 Mantenimiento Pantallas ....................................................................................................... 44 Ilustración 31 Ingreso Indicadores .................................................................................................................. 44 Ilustración 32 Monitoreo Indicadores ............................................................................................................ 45 Ilustración 33 Seguimiento Indicadores ....................................................................................................... 45 Ilustración 34 Seguimiento y Resultados .................................................................................................... 46 Ilustración 35 Cumplimiento Actividad .......................................................................................................... 47 Ilustración 36 Cumplimiento Proyecto .......................................................................................................... 48 Ilustración 37 Cumplimiento PDA ................................................................................................................... 49 Ilustración 38 Diagrama Entidad Relación ................................................................................................. 63 Ilustración 39 Arquitectura de la aplicación................................................................................................ 70 Ilustración 40 Módulo Account.......................................................................................................................... 71 Ilustración 41 Módulo App_Code .................................................................................................................... 74 Ilustración 42 Módulo Images ........................................................................................................................... 78 Ilustración 43 Módulo Reportes ....................................................................................................................... 78 Ilustración 44 Módulo Scripts ............................................................................................................................ 79 xi Ilustración 45 Módulo Styles .............................................................................................................................. 79 Ilustración 46 Cadena de conexión ............................................................................................................. 136 Ilustración 47 Página de Ingreso al Sistema .......................................................................................... 150 Ilustración 48 Usuario y/o contraseña incorrecta ................................................................................. 150 Ilustración 49 Pantalla Principal .................................................................................................................... 151 Ilustración 50 Menú Sistema .......................................................................................................................... 151 Ilustración 51 Página de Administración de Perfiles .......................................................................... 152 Ilustración 52 Página de Mantenimiento de Perfiles .......................................................................... 152 Ilustración 53 Página de Mantenimiento de Usuarios ....................................................................... 153 Ilustración 54 Página de Mantenimiento de Frecuencias ................................................................ 153 Ilustración 55 Página de Mantenimiento de Estado ........................................................................... 153 Ilustración 56 Página de Mantenimiento de Unidades ...................................................................... 154 Ilustración 57 Página de Mantenimiento de Cargos ........................................................................... 154 Ilustración 58 Página de Mantenimiento de Pantallas....................................................................... 154 Ilustración 59 Página de Ingreso de Indicadores ................................................................................. 155 Ilustración 60 Página de Monitoreo de Indicadores ............................................................................ 155 Ilustración 61 Página de Seguimiento de Indicadores ...................................................................... 156 Ilustración 62 Seguimiento y Resultados ................................................................................................. 157 Ilustración 63 Cumplimiento Actividad ....................................................................................................... 158 Ilustración 64 Cumplimiento Proyecto ....................................................................................................... 159 Ilustración 65 Cumplimiento PDA ................................................................................................................ 160 Ilustración 66 Cerrar Sesión ........................................................................................................................... 160 xii LISTA DE TABLAS Tabla 1 Cuadro comparativo Lenguajes de programación ................................................................ 13 Tabla 2 Cuadro Comparativo Motor Base de Datos .............................................................................. 14 Tabla 3 Comparativo Modeladores base de Datos ................................................................................ 15 Tabla 4 Comparativo Servidores Web .......................................................................................................... 16 Tabla 5 Recurso Humano ................................................................................................................................... 17 Tabla 6 Presupuesto.............................................................................................................................................. 18 Tabla 7 Caso de uso Administración de Usuarios.................................................................................. 29 Tabla 8 Resultados de la prueba de resolución de pantalla ............................................................. 51 Tabla 9 Resultados de la prueba de resolución de pantalla ............................................................. 52 Tabla 10 Resultados de la prueba de Compatibilidad de navegadores ...................................... 53 Tabla 11 Resultados de la prueba de Compatibilidad de Sistemas Operativos ..................... 54 Tabla 12 Caso para la prueba de desempeño ......................................................................................... 55 Tabla 13 Resultados Prueba Desempeño en base a Hardware ..................................................... 57 xiii RESUMEN APLICACIÓN WEB PARA EL MONITOREO DE INDICADORES DE DESARROLLO ECONÓMICO PARA LAS COMUNIDADES UBICADAS EN LOS CANTONES RIOBAMBA, GUANO Y PELILEO DE LA PROVINCIA DE CHIMBORAZO La organización no gubernamental VISIÓN MUNDIAL ECUADOR brinda apoyo económico a los sectores menos favorecidos del Ecuador, principalmente en áreas rurales. El almacenamiento de los datos necesarios para el trabajo de la ONG se lo viene realizando de una forma manual, sin contar con una herramienta informática adecuada que facilite el manejo de los mismos, lo cual dificulta mantener un control y seguimiento. Debido al procedimiento utilizado para mantener los archivos, se dificulta la condensación y actualización de los datos (información) en la empresa, entorpeciendo el desarrollo del trabajo de los funcionarios (trabajadores) de la ONG, y se desperdicia de tiempo en la búsqueda de información. El presente trabajo de graduación propone implementar en la ONG un sistema informático que permita controlar los Programas de Desarrollo de Área de una manera automatizada, garantizando la confiabilidad, consolidación y seguridad de los datos. DESCRIPTORES: APLICACIÓN WEB / INDICADORES DE DESARROLLO ECONÓMICO / ASP.NET / SQL SERVER / INTERNET INFORMATION SERVICES / CIENCIAS ECONÓMICAS Y SOCIALES xiv ABSTRACT WEB APPLICATION FOR MONITORING OF ECONOMIC DEVELOPMENT INDICATORS FOR COMMUNITIES LOCATED IN RIOBAMBA, GUANO AND PELILEO CANTONES OF CHIMBORAZO PROVINCE The Non-Governmental Organization World Vision ECUADOR provides financial support to the underprivileged sectors of Ecuador mainly in rural areas. The storage of data needed for work of NGO has been doing a manual way, without proper software tool that facilitates the management of them, making it difficult to maintain control and monitor. Because the procedure used to keep files, condensation and updating the data (information) in the company is difficult, hindering the development of the work of officials (employees) of the NGO, and wasted time searching for information. This graduate work at the NGO proposes to implement a computer system to monitor the Area Development Programs in an automated manner, ensuring reliability, consolidation and data security. DESCRIPTORS: WEB APPLICATION / INDICATORS OF ECONOMIC DEVELOPMENT / ASP.NET / SQL SERVER / INTERNET INFORMATION SERVICES / ECONOMIC AND SOCIAL SCIENCES xv CERTIFICADO DE TRADUCCIÓN xvi xvii INTRODUCCIÓN Como respuesta a una necesidad tecnológica se desarrolló una aplicación web que facilite el manejo de indicadores de desarrollo económico de la Organización No Gubernamental Vision Mundial Ecuador. La aplicación constará de dós modulos principales que abarcan el proceso manual que se venía realizando en la ONG. El módulo de Gestión Administrativa contiene el manejo de perfiles de acuerdo al rol asignado por el Director de Visión Mundial Ecuador, cambios de claves, ingreso y actualización de datos de los usuarios. En el módulo de Gestión de Indicadores se tiene la creación de cargos, pantallas, unidades, frecuencias, estados; ingreso, monitoreo y seguimiento de indicadores. Además contiene reportes de acuerdo a la necesidad planteada por el usuario. 1 CAPITULO 1 1.1 ANTECEDENTES Desde la creación de WORLD VISION ECUADOR, el almacenamiento de los datos necesarios para el trabajo de la misma se lo viene realizando de una forma manual, sin contar con una herramienta informática adecuada que facilite el manejo de los mismos, lo cual dificulta mantener un control y seguimiento de los mismos. Por el procedimiento utilizado para mantener los archivos, se hace difícil la condensación y actualización de los datos (información) en la empresa, entorpeciendo el desarrollo del trabajo de los funcionarios (trabajadores) de la ONG, y también un desperdicio de tiempo en la búsqueda de información. El presente trabajo de graduación propone implementar en la ONG un sistema informático que permita llevar un control de los PDAs de una manera automatizada, garantizando la confiabilidad, consolidación y seguridad de los datos manejados en la mencionada ONG. 1.2 PRESENTACIÓN DEL PROBLEMA 1.2.1 Planteamiento del problema Mantener el registro y seguimiento manual de los Programas de Desarrollo de Área que gestiona la ONG WORLD VISION ECUADOR, presenta varios inconvenientes como los mencionados a continuación: Al momento de registrar un PDA, es necesario el manejo y mantenimiento de expedientes físicos o en un software no especializado para este trabajo, lo cual dificulta en muchas ocasiones la pronta búsqueda de datos específicos del sistema. Si es necesario actualizar una descripción o cambio en el PDA, en muchas ocasiones es necesario generar nuevos informes lo que deriva en el aumento de archivos, dificultando el manejo del PDA. Susceptibilidad a errores en el cálculo y manejo de los fondos económicos recibidos o destinados para los PDAs. 2 No existe una adecuada organización en el proceso de registro de las áreas de estudio a nivel nacional. No contar con un sistema automatizado dificulta la asignación del personal para los diferentes procesos a seguir para el avance del PDA. Al no contar con un adecuado sistema informático, los reportes necesarios deben realizarlos los miembros del equipo, con el consiguiente problema del tiempo invertido al igual que la dificultad que representan los mismos. 1.2.2 Propósito del sistema De lo antes expuesto, se ha considerado la necesidad de crear e implementar una herramienta informática para la automatización de los procesos a seguir para la mejor administración, registro y seguimiento de los PDAs, logrando así obtener un mejor rendimiento en cuanto al control de los mismos. 1.3 OBJETIVOS 1.3.1 Objetivo General Implementar una Aplicación Web para el Monitoreo de Programas de Desarrollo de Área para la ONG World Vision Ecuador, de manera que le permita llevar un control preciso y en forma automatizada de los indicadores, reduciendo así la probabilidad de generación de errores al momento de manipular la información, y al mismo tiempo garantizar la autenticidad de la misma. 1.3.2 Objetivos Específicos Automatizar el registro y seguimiento de los PDAs manejados por la ONG. Consolidar la información de los PDAs de una forma organizada, accesible y actualizada, permitiendo de esta forma mantener un control estricto Generación de reportes que incluyan gráficos y tablas para el mejor entendimiento de los indicadores. 3 1.4 JUSTIFICACION E IMPORTANCIA Al solicitar la creación de un sistema para el registro y control de los diferentes Programas de Desarrollo de Área que tiene a su cargo la ONG World Vision Ecuador, se contribuye a crear estándares para el registro de los indicadores para los Programas de Desarrollo de Área. Además, permitirá optimizar el capital entregado en cada una de las comunidades ya que se podrá medir el beneficio en cuanto al mejoramiento de la calidad de vida de niños, adolescentes, jóvenes, familias de la comunidad. Será útil para el manejo óptimo y eficiente de la información de forma automatizada, que al ser ingresada de manera progresiva y recurrente, reflejará datos confiables y veraces respaldados por las seguridades correspondientes. 1.5 MARCO TEÓRICO El proceso del registro y control de los Programas de Desarrollo de Área manejados por la ONG posee una gran importancia, ya que en este se toma en cuenta las actividades (más delicadas) principales y esenciales de la ONG en las comunidades. En consecuencia, la creación (ejecución, desarrollo) del Sistema de Monitoreo de Indicadores de Desarrollo Económico, representa una solución para agilitar el proceso convirtiéndose en una herramienta útil e indispensable tanto para la ONG como para la comunidad. Al desarrollar e implementar la aplicación (sistema, programa), se desea brindar a la comunidad un producto (software) de calidad, adaptable y con las características adecuadas para solventar las necesidades de los usuarios. Además el sistema aportará flexibilidad y automatización a los procesos requeridos por la ONG y conjuntamente permitirá generar una serie de 4 reportes necesarios para el trabajo (procedimiento) del personal técnico de la organización, y a la vez útil para la toma de decisiones. 1.6 METODOLOGÍA La metodología es el conjunto de reglas y pasos estrictos que se siguen para desarrollar una aplicación informática completa. Hay diversas metodologías, algunas incluso registradas (hay que pagar por utilizarlas). La serie de pasos a seguir son (relacionados con el ciclo de vida de la aplicación): [1] Análisis [2] Diseño [3] Codificación [4] Ejecución [5] Prueba [6] Mantenimiento [1] Análisis El análisis consiste en el estudio de los requisitos que ha de cumplir la aplicación, de acuerdo a la toma de los requerimiento brindad por los clientes. [2] Diseño En esta fase se crean esquemas (diagramas de flujo, diagramas de la BD, cronograma de actividades, etc.) que simbolizan a la aplicación. En estos esquemas se pueden simbolizar: la organización de los datos de la aplicación, el orden de los procesos que tiene que realizar la aplicación, la estructura física (en cuanto a archivos y carpetas) que utilizará la aplicación, etc. 5 [3] Codificación Escritura de la aplicación utilizando un lenguaje de programación (C Sharp o C#). Si se utiliza un lenguaje orientado a objetos, la herramienta de diseño debe ser una herramienta que permita utilizar objetos. [4] Ejecución Tras la escritura del código, mediante un software especial se traduce a código interpretable por el ordenador (código máquina). En este proceso pueden detectarse errores en el código que impiden su transformación. En ese caso el software encargado de la traducción (normalmente un compilador o un intérprete) avisa de esos errores para que el programador los pueda corregir. [5] Prueba Se trata de testear la aplicación para verificar que su funcionamiento es el correcto. Para ello se comprueban todas las entradas posibles, comprobando que las salidas son las correspondientes. [6] Mantenimiento En esta fase se crea la documentación del programa. Gracias a esa documentación se pueden corregir futuros errores o renovar el programa para incluir mejoras detectadas, operaciones que también se realizan en esta fase. El desarrollo del proyecto a realizarse será en base al modelo en ESPIRAL, que conlleva las siguientes fases: La atención se centra en la evaluación y reducción del riesgo del proyecto, dividiendo el proyecto en segmentos más pequeños y proporcionar más facilidad de cambio durante el proceso de desarrollo, 6 así como ofrecer la oportunidad de evaluar los riesgos y con un peso de la consideración de la continuación del proyecto durante todo el ciclo de vida. Cada viaje alrededor de la espiral atraviesa cuatro cuadrantes básicos: 1) Determinar objetivos, alternativas, y desencadenantes de la iteración. 2) Evaluar alternativas; Identificar y resolver los riesgos. 3) Desarrollar y verificar los resultados de la iteración. 4) Plan de la próxima iteración. Cada ciclo comienza con la identificación de los interesados y sus condiciones de ganancia y termina con la revisión. 1.7 ALCANCE Para definir el alcance del proyecto, a continuación se describe los módulos que tendrá la aplicación web: Módulo de Registro de la Zona Zona: El sistema debe permitir al usuario el ingreso del nombre de la zona en la cual se está trabajando. Provincia: El sistema debe permitir al usuario el ingreso de la provincia a la cual pertenece la zona. Cantón: El sistema debe permitir al usuario el ingreso de los cantones pertenecientes a la zona. 7 Parroquia: El sistema debe permitir al usuario el ingreso de las parroquias pertenecientes a la zona. Etnia: El sistema debe permitir al usuario el ingreso de las etnias que van a ser beneficiadas. Módulo de Registro de Indicadores El sistema debe permitir al usuario ingresar información general que comparten los indicadores. Dicha información se detalla a continuación: Categoría Nombre Objetivo Valor Mínimo Valor Deseable (óptimo): El sistema debe permitir al usuario el ingreso de un valor aceptable del indicador. Esto no significa que el indicador no pueda tener valores mayores. Valor Actual Frecuencia Los indicadores que se generarán a través del sistema son los siguientes: Categoría: Indicadores para Proyectos Agrícolas. Nombre: Número de productores con aumento de ingresos. Objetivo: Medir el número de productores que incrementan sus ingresos en base a la producción agrícola del proyecto. Frecuencia: Semestral. Fórmula: ∑ 8 Nombre: Incremento de ingresos finales. Objetivo: Medir el incremento de los ingresos en dólares (USD) de los beneficiarios al final del proyecto agrícola. Frecuencia: Semestral. Fórmula: ( ) Nombre: Productividad agrícola. Objetivo: Medir los kilogramos por hectárea (Kg/Ha) que se ha obtenido de la cosecha de un determinado producto. Frecuencia: Semestral. Fórmula: ( ) Categoría: Indicadores para Proyectos Pecuarios. Nombre: Número de productores con aumento de ingresos. Objetivo: Medir el número de productores que incrementan sus ingresos en base a la producción pecuaria del proyecto. Frecuencia: Semestral. Fórmula: ∑ Nombre: Incremento de ingresos finales. Objetivo: Medir el incremento de los ingresos en dólares (USD) de los beneficiarios al final del proyecto pecuario. 9 Frecuencia: Semestral Fórmula: ( ) Nombre: Productividad pecuaria. Objetivo: Medir los kilogramos o litros por hectárea (Kg o Lt/Ha) que se han obtenido del proyecto pecuario. Frecuencia: Semestral Fórmula: ( ) Categoría: Indicadores para Proyectos Industriales (con productos agrícolas, no agrícolas) o de servicios. Nombre: Número de beneficiarios con aumento de ingresos. Objetivo: Medir el número de beneficiarios directos que incrementan sus ingresos en base a la producción industrial del proyecto. Frecuencia: Semestral. Fórmula: ∑ Nombre: Incremento de ingresos finales. Objetivo: Medir el incremento de los ingresos en dólares (USD) de los beneficiarios al final del proyecto industrial. Frecuencia: Semestral Fórmula: ( ) 10 Módulo de Generación de Reportes El sistema facilitará la generación de reportes tales como: Porcentaje de ejecución o avance del Programa de Desarrollo de Área, Reporte gráfico de Avance financiero vs. Avance físico. Todos los datos necesarios para lograr lo antes mencionado serán almacenados en forma permanente en una base de datos de modo que en cualquier momento se pueda acceder a ellos mediante consultas, para facilitar el trabajo del personal de la ONG. 1.8 LIMITACIONES La aplicación solo generará los indicadores especificados dentro del alcance y no será posible crear nuevos indicadores. La aplicación será alimentada con la información que los miembros de la comunidad autorizados ingresen, por lo que los indicadores reflejarán los posibles errores humanos en la digitación. 1.9 PLATAFORMA 1.9.1 ARQUITECTURA DE LA APLICACIÓN Ilustración 1 Arquitectura 3 Capas 11 1.9.2 DESCRIPCIÓN DE LA ARQUITECTURA Capa 1: Cliente de aplicación • Navegador Web Capa 2: Servidor de Aplicaciones • Internet Information Services Capa 3: Servidor de Datos • Base de datos SqlServer 2008 1.10 HERRAMIENTAS 1.10.1 Cuadro comparativo de lenguajes de programación Titulo: Cuadro comparativo de lenguajes de programación Autor: Galo Santiago Quisigüiña Castillo Fuente: Internet 12 Asp.Net Java Existe un rango amplio y definido de tipos de datos Php 9 8 7 5 9 8 6 10 9 6 9 9 5 6 9 5 9 9 6 6 9 6 48 8 65 9 69 Mínima cantidad de prerrequisitos que requiere para su instalación Adaptabilidad con los sistemas operativos mas usados Portabilidad del código Soporta múltiples servidores web Conectividad con varias bases de datos Curva de aprendizaje Velocidad de compilación Puntaje Total Tabla 1 Cuadro comparativo Lenguajes de programación 1.10.2 Lenguaje de programación Del cuadro comparativo anterior se deduce que la mejor opción es PHP. Debido a políticas y licencias que posee la ONG, el lenguaje de programación escogido es ASP.NET. 13 1.10.3 Cuadro comparativo de Bases de Datos Titulo: Cuadro comparativo de bases de datos Autor: Galo Santiago Quisigüiña Castillo Fuente: Internet SQL Server Oracle MySql ACID(Atomicidad, Consistencia, Aislamiento, Durabilidad) 9 5 8 Almacenamiento e indexación 9 8 7 Procesamiento y optimización de consultas 9 8 7 Control de recuperación 9 8 8 8 9 8 8 9 9 9 5 7 Transacciones ODBC 9 9 9 Integridad Referencial 9 9 9 9 88 9 79 9 81 recurrencia y Herramientas de Gestión y Base de Datos Herramientas para el diseño de Base de Datos Numero de usuarios ilimitados Control de recurrencia múltiples versiones para Puntaje Total Tabla 2 Cuadro Comparativo Motor Base de Datos 1.10.4 Base de Datos Del cuadro comparativo anterior se deduce que la mejor opción es ORACLE. Debido a políticas y licencias que posee la ONG, la base de datos escogida es Microsoft SQL Server 2008. 14 1.10.5 Cuadro comparativo de Modeladores de Base de Datos. Titulo: Cuadro comparativo de modeladores de bases de datos Autor: Galo Santiago Quisigüiña Castillo Fuente: Internet Erwin Soporta las bases de datos más usadas Power Designer 9 9 8 9 Procesos de reingeniería de negocios 9 9 Generación de Diccionario de Datos Puntaje Total 9 35 9 36 Rápida curva aprendizaje de Tabla 3 Comparativo Modeladores base de Datos 1.10.6 Modelador de Base de Datos Del cuadro comparativo anterior se deduce que la mejor opción es POWER DESIGNER y es el modelador de base de datos escogido. 15 1.10.7 Cuadro comparativo de Servidores Web. Titulo: Cuadro comparativo de servidores web Autor: Galo Santiago Quisigüiña Castillo Fuente: Internet Internet Information Cheroke Services e Apache Soporta múltiples lenguajes de programación 9 5 8 9 9 5 9 Invulnerabilidad 8 6 8 Alta disponibilidad 9 8 9 Módulos permanentes 9 9 9 Conexiones seguras 9 9 9 9 9 9 88 8 7 9 75 8 9 5 75 Facilidad de configuración Adaptabilidad a los sistemas operativos más usados Balance de carga Velocidad Soporta SSL Puntaje Total 9 Tabla 4 Comparativo Servidores Web 1.10.8 Servidor Web Del cuadro comparativo anterior se deduce que la mejor opción es APACHE. Debido a políticas y licencias que posee la ONG, el servidor web escogido es Internet Information Services. 16 1.11 MARCO ADMINISTRATIVO 1.11.1 RECURSO HUMANO Para el desarrollo del este tema de tesis, se requiere del siguiente grupo de recursos humanos, con funciones presentadas a continuación: RECURSO HUMANO COMPETENCIAS Ingeniero Planificación y gestión de Informático, (Tutor). proyectos de software. Desarrollo de aplicaciones con metodologías de ágiles. OBSERVACIÓN Conocimientos en: Galo Quisigüiña Desarrollo de Software con Herramientas de Open Egresado de la carrera de Source. Ingeniería Informática. Redes LAN, WAN, MAN. Protocolos de Internet. Administración de Base de Datos Seguridad Informática. Tabla 5 Recurso Humano 17 1.11.2 RECURSOS MATERIALES Los recursos materiales que se van a ser utilizados se detallan a continuación: ITEM No. RUBRO RECURSOS 1 MATERIALES Empastados Papel VALOR UNITARIO CANTIDAD ($) Tinta Suministros (Clips, grapas, etc.) Impresora 8 6 (resma) 6 (cartucho) 1 SUBTOTAL 20,00 5,00 160,00 30,00 30,00 180,00 90,00 20,00 90,00 SUBTOTAL RECURSOS MATERIALES 480,00 RECURSOS 2 ACADEMICOS Internet 6 (meses) Copias 100 SUBTOTAL RECURSOS ACADEMICOS 3 OTROS Hora/Programador 960 (horas) Alimentación 1 (persona) Transporte 1 (persona) Agua 6 (meses) Luz 6 (meses) Teléfono fijo 6 (meses) Teléfono celular 6 (meses) SUBTOTAL OTROS TOTAL IMPREVISTOS (5,50%) TOTAL DEL PRESUPUESTO 30,00 0,03 180,00 3,00 183,00 5,00 150,00 50,00 5,00 10,00 12,00 10,00 4800,00 150,00 50,00 30,00 60,00 72,00 60,00 5222,00 323,68 6208,68 Tabla 6 Presupuesto 18 1.11.3 CRONOGRAMA El análisis, desarrollo e implementación de la APLICACIÓN WEB PARA EL MONITOREO DE INDICADORES DE DESARROLLO ECONÓMICO PARA COMUNIDADES DEL ECUADOR, deberá llevarse a cabo en el plazo máximo de 6 meses el cual se detalla en el siguiente cronograma de actividades (ver Anexo en formato A3): 19 CAPITULO 2 2 METODOLOGÍA 2.1 METODOLOGÍA RUP El Proceso Unificado Racional1, Rational Unified Process en inglés, y sus siglas RUP, es un proceso de desarrollo de software y junto con el Lenguaje Unificado de Modelado UML, constituye la metodología estándar más utilizada para el análisis, implementación y documentación de sistemas orientados a objetos. El RUP no es un sistema con pasos firmemente establecidos, sino que se trata de un conjunto de metodologías adaptables al contexto y necesidades de cada organización, donde el software es organizado como una colección de unidades atómicas llamados objetos, constituidos por datos y funciones, que interactúan entre sí. Análisis El proceso deberá adaptarse a la organización. Para el caso del proyecto se manejan los estándares establecidos por el departamento de Desarrollo Económico de la ONG Visión Mundial Ecuador y tomando en cuenta el alcance del proyecto presentado. Los requerimientos levantados resultaron del análisis de las necesidades de los usuarios. Implementación El proyecto se desarrollará por etapas, donde interactúan continuamente los usuarios para mantener la eficiencia y calidad del producto. La organización proveerá los recursos en sistemas para instalar la plataforma (servidores y otros) necesarios para el proyecto. Documentación Se generará la documentación que permita capacitar a los usuarios y administradores del sistema. En esta se debe incluir manuales (de usuario, técnico, instalación), estructura de la base de datos, diccionario de datos, etc. 2.2 Ciclo de vida RUP El ciclo de vida RUP se divide en 4 fases: Iniciación, Elaboración, Construcción y Transición. 1 http://es.scribd.com/doc/31440864/Metodologia-RUP 20 En cada fase se realizan una o más iteraciones (con el objeto de ir perfeccionando los objetivos, mediante la retroalimentación del usuario) y hasta que no finaliza una fase no se comienza con la siguiente. Por regla general, la fase en la que se realizan más iteraciones es la Construcción. 2.2.1 Iniciación Durante la fase de inicio las iteraciones ponen mayor énfasis en actividades de modelado del negocio y de requisitos. 2.2.1.1 Modelado del negocio En esta fase el equipo se familiarizara más al funcionamiento de la empresa, sobre conocer sus procesos. Entender la estructura y la dinámica de la organización para la cual el sistema va ser desarrollado. Entender el problema actual en la organización objetivo e identificar potenciales mejoras. Asegurar que clientes, usuarios finales y desarrolladores tengan un entendimiento común de la organización objetivo. 2.2.1.2 Requisitos Los requisitos son el contrato que se debe cumplir, de modo que los usuarios finales tienen que comprender y aceptar los requisitos que especifiquemos. Establecer y mantener un acuerdo entre clientes y otros actores que podrían ser afectados sobre lo que el sistema podría hacer. Proveer a los desarrolladores un mejor entendimiento de los requisitos del sistema. Definir el ámbito del sistema. Proveer una base para estimar costos y tiempo de desarrollo del sistema. Definir una interfaz de usuarios para el sistema enfocada a las necesidades y metas del usuario. 2.2.2 Elaboración En la fase de elaboración, las iteraciones se orientan al desarrollo de la línea base de la arquitectura, abarcando los flujos de trabajo de requerimientos, modelo de negocios (refinamiento), análisis, diseño y una parte de la implementación. 2.2.2.1 Análisis y diseño En esta actividad se especifican los requerimientos y se describe cómo se va a implementar en el sistema. Transformar los requisitos al diseño del sistema. 21 Desarrollar una arquitectura para el sistema. Adaptar el diseño para que sea consistente con el entorno de implementación. 2.2.3 Construcción 2.2.3.1 Implementación Se implementan las clases y objetos en ficheros fuente, binarios, ejecutables y demás. El resultado final es un sistema ejecutable. Planificar qué subsistemas deben ser implementados y en qué orden deben ser integrados. Cada implementador decide el orden de los elementos del subsistema. Si encuentra errores de diseño los notifica. Se integra el sistema siguiendo el plan. 2.2.3.2 Pruebas Este flujo de trabajo es el encargado de evaluar la calidad del producto que estamos desarrollando, pero no para aceptar o rechazar el producto al final del proceso de desarrollo, sino que debe ir integrado en todo el ciclo de vida. Encontrar y documentar defectos en la calidad del software. Generalmente asesora sobre la calidad del software percibida. Provee la validación de los supuestos realizados en el diseño y especificación de requisitos por medio de demostraciones concretas. Verificar las funciones del producto de software según lo diseñado. Verificar que los requisitos tengan su apropiada implementación. 2.2.4 Transición Esta actividad tiene como objetivo producir con éxito distribuciones del producto y distribuirlo a los usuarios. Las actividades implicadas incluyen: Probar el producto en su entorno de ejecución final. Empaquetar el software para su distribución. Distribuir el software. Instalar el software. Proveer asistencia y ayuda a los usuarios. Formar a los usuarios y al cuerpo de ventas. Migrar el software existente o convertir bases de datos. 22 2.3 USUARIOS DEL SISTEMA 2.3.1 Administrador del sistema Este usuario tiene privilegios para ingresar a todas las opciones de los módulos. Puede modificar, buscar, generar reportes, crear perfiles y asignar roles dependiendo de la necesidad de la organización. 2.3.2 Coordinador de desarrollo económico Es el responsable de administrar, dirigir y coordinar todas las actividades técnicas del área de desarrollo económico de la organización. Este usuario tiene acceso al módulo de administración de indicadores y generación de reportes. 2.3.3 Promotor de desarrollo económico Es el responsable de ingresar los indicadores financieros para cada una de las áreas de desarrollo económico que se le hayan asignado. Este usuario tiene acceso al módulo de ingreso de indicadores, monitoreo y generación de reportes. 2.4 Requerimientos funcionales Definimos dos módulos que componen el sistema. El módulo de Administración y el módulo de Indicadores Económicos. El módulo de Administración cumplirá con las siguientes especificaciones: Modificación de los indicadores financieros ingresados. Manejo de perfiles de usuarios. El módulo de especificaciones: 2.5 Indicadores Económicos cumplirá con las siguientes Ingreso de indicadores. Monitoreo de indicadores. Seguimiento de Indicadores. Generación de reportes. Casos de Uso Un caso de uso es una descripción de los pasos o las actividades que deberán realizarse para llevar a cabo algún proceso. Los diagramas de casos de uso sirven para especificar la comunicación y el comportamiento de un sistema mediante su interacción con los usuarios y/u otros sistemas. 23 2.5.1 Simbología Actor: Es un rol que un usuario juega con respecto al sistema. Un Actor no necesariamente representa a una persona en particular, sino más bien la labor que realiza frente al sistema. Ilustración 2 Actor Caso de uso: Es una operación/tarea específica que se realiza tras una orden de algún agente externo, sea desde una petición de un actor o bien desde la invocación desde otro caso de uso. Ilustración 3 Caso de uso Asociación de comunicación: Es el tipo de relación más básica que indica la invocación desde un actor o caso de uso a otra operación (caso de uso). Dicha relación se denota con una línea simple. Generalización: Este tipo de relación está orientado exclusivamente para casos de uso (y no para actores). Ilustración 4 Generalización Extends: Relación de dependencia entre dos casos de uso que denota que un caso de uso es una especialización de otro. «extends» Ilustración 5 Extiende Uses: Relación de dependencia entre dos casos de uso que denota la inclusión del comportamiento de un escenario en otro. 24 «uses» Ilustración 6 Usa 2.5.2 Descripción de casos de uso Crear Perfiles Crear Usuarios Administrador del Sistema Crear Indicador Monitorizar Indicador Promotor Desarrollo Económico Coordinador Desarrollo Económico Dar Seguimiento Indicador Consultar Indicadores Visualizar Reportes Administrar Indicadores Ilustración 7 Interacción entre los Usuarios del Sistema Fuente: Departamento de Desarrollo Económico de Visión Mundial Elaborado por: El Tesista 25 DATOS IDENTIFICATIVOS SISTEMA: MONITOREO INDICADORES DE DESARROLLO ECONÓMICO NOMBRE CASO DE USO: Administración de Usuarios USUARIO RESPONSABLE: Administrador del Sistema DESCRIPCION BREVE: Permite administrar los usuarios que accederán al sistema SUBCASO DE USO: Crear Perfiles USUARIO: SISTEMA: 1.- Registrar nombre del Perfil 2.- Selección de módulos (pantallas) que se asocian al Perfil 3.- Guardar los datos del Perfil SUBCASO DE USO: Crear Usuarios USUARIO: SISTEMA: 1.- Registrar nombre de Usuario 2.- Registrar contraseña de Usuario 3.- Registrar perfil asociado al Usuario 4.- Guardar los datos del Usuario NOMBRE CASO DE USO: Administración de Indicadores USUARIO RESPONSABLE: Coordinador de Desarrollo Económico DESCRIPCION BREVE: Permite administrar los indicadores que se ingresan en el sistema SUBCASO DE USO: Dar Seguimiento al Indicador USUARIO: SISTEMA: 1.- Selección del PDA, Área Programática, Proyecto y Actividad 2.- Selección del Indicador a dar 26 seguimiento 3.- Mostrar datos del indicador SUBCASO DE USO: Consultar Indicadores USUARIO: SISTEMA: 1.- Selección del PDA, Área Programática, Proyecto y Actividad 2.- Selección de parámetros de búsqueda 4.- Mostrar datos del indicador SUBCASO DE USO: Visualizar Reportes USUARIO: SISTEMA: 1.- Selección del PDA, Área Programática, Proyecto y Actividad 2.- Selección de parámetros de reporte 4.- Mostrar datos del indicador SUBCASO DE USO: Administrar Indicadores USUARIO: SISTEMA: 1.- Selección del Indicador a administrar 2.- Registrar los datos del Indicador 4.- Guardar datos modificados del indicador NOMBRE CASO DE USO: Creación de Indicadores USUARIO RESPONSABLE: Promotor de Desarrollo Económico DESCRIPCION BREVE: Permite crear los indicadores en el sistema SUBCASO DE USO: Crear Indicador USUARIO: SISTEMA: 27 1.- Selección del PDA, Área Programática, Proyecto y Actividad 2.- Registrar los datos del Indicador 3.- Guardar datos del indicador SUBCASO DE USO: Monitorizar Indicador USUARIO: SISTEMA: 1.- Selección del PDA, Área Programática, Proyecto y Actividad 2.- Selección del Indicador 3.- Registrar datos del indicador 4.- Guardar datos del indicador SUBCASO DE USO: Dar Seguimiento al Indicador USUARIO: SISTEMA: 1.- Selección del PDA, Área Programática, Proyecto y Actividad 2.- Selección del Indicador a dar seguimiento 3.- Mostrar datos del indicador SUBCASO DE USO: Consultar Indicadores USUARIO: SISTEMA: 1.- Selección del PDA, Área Programática, Proyecto y Actividad 2.- Selección de parámetros de búsqueda 4.- Mostrar datos del indicador SUBCASO DE USO: Visualizar Reportes USUARIO: SISTEMA: 1.- Selección del PDA, Área Programática, Proyecto y Actividad 2.- Selección de parámetros de reporte 28 4.- Mostrar datos del indicador Tabla 7 Caso de uso Administración de Usuarios 2.6 REQUISITOS NO FUNCIONALES 2.6.1 Desempeño La aplicación ofrece un buen desempeño ante la concurrencia de usuarios, garantizando tiempos cortos de respuesta ante una petición. 2.6.2 Disponibilidad La aplicación web estará alojada en el servidor de la ONG de acuerdo a su infraestructura de red. El número de usuarios concurrentes que la aplicación permita dependerá del hardware en donde se encuentre instalado. 2.6.3 Escalabilidad La aplicación será construida de tal manera que podrá incorporar en el futuro nuevos requerimientos sin afectar el diseño original. 2.6.4 Facilidades de uso La aplicación será amigable para el usuario. Por ejemplo se mostrarán mensajes informativos, de advertencia y de error de acuerdo a las acciones ejecutadas. 2.6.5 Instalación La aplicación contará con un instalador que se podrá ejecutar bajo sistema operativo Windows. 2.6.6 Mantenimiento y actualización La aplicación será documentada de tal manera que se pueda dar un fácil mantenimiento. 2.6.7 Seguridad Para el acceso al sistema se contará con usuarios y contraseñas las cuales estarán encriptados en la base de datos. 2.6.8 Validación de la información La aplicación contará con validaciones de caracteres. 29 acuerdo al campo y longitud de 2.6.9 Operatividad La operatividad de la aplicación estará garantizada debido a que se maneja mediante navegadores de internet. 2.7 DIAGRAMAS DE SECUENCIA Un diagrama de secuencia es un tipo de diagrama de interacción que muestra cómo funcionan los procesos de uno con el otro y en qué orden. Se trata de una construcción de un gráfico secuencial de avisos . Un diagrama de secuencia que muestra las interacciones de objetos dispuestos en secuencia de tiempo. Representa los objetos y clases que participan en el escenario y la secuencia de mensajes intercambiados entre los objetos necesarios para llevar a cabo la funcionalidad del escenario. 2.7.1 Simbología Objeto: En forma de rectángulo representa una instancia de un objeto en particular, y la línea punteada representa las llamadas a métodos del objeto. Ilustración 8 Objeto Línea de vida: Representa la llamada a métodos del objeto. Ilustración 9 Línea de vida Actor: Representa que o quien inicia una acción dentro del sistema. Es simplemente es un rol que es llevado a cabo por una persona o cosa. Ilustración 10 Actor Diagrama de secuencia Mensaje: El envío de mensajes entre objetos se denota mediante una línea sólida dirigida, desde el objeto que emite el mensaje hacia el objeto que lo ejecuta. 30 El mensaje puede ser simple, síncrono y asíncrono. Simple: Transferencia del control de un objeto a otro. Mensaje1 Ilustración 11 Mensaje Síncrono: El remitente espera una respuesta a un mensaje sincrónico antes de continuar. El diagrama muestra la llamada y el retorno. Los mensajes sincrónicos se utilizan para representar llamadas de función ordinarias dentro de un programa, así como otros tipos de mensaje que se comportan de la misma manera. Mensaje1 Ilustración 12 Síncrono Asíncrono: Un mensaje que no requiere una respuesta antes de que el remitente continúe. Un mensaje asincrónico muestra sólo una llamada del remitente. Se utiliza para representar la comunicación entre subprocesos diferentes o la creación de un nuevo subproceso. Mensaje2 Ilustración 13 Asíncrono Tiempo: Se representa en dirección vertical. El tiempo se inicia en la parte superior y avanza hacia la parte inferior. Un mensaje que esté más cerca de la parte superior ocurrirá antes que uno que esté cerca de la parte inferior. Recursividad: En ocasiones un objeto posee una operación que se invoca a sí misma. A esto se le conoce como recursividad y es una característica fundamental de varios lenguajes de programación. La siguiente figura muestra este tipo de representación: 31 Ilustración 14 Recursividad 2.7.2 Descripción de Diagramas de Secuencia Administrador Perfil Crear Perfil() Base de Datos Usuario Guardar() Guardar Datos() Datos Almacenados() Crear Usuario() Guardar() Guardar Datos Datos Almacenados Ilustración 15 Diagrama de Secuencia Administrador 32 Coordinador Indicador Modificar Indicador() Base de Datos Reporte Guardar() Guardar Datos() Datos Almacenados() Consultar Indicador() Buscar Datos() Guardar Datos() Datos Consultados() Buscar Datos() Crear Reporte() Guardar Datos Datos Consultados() Ilustración 16 Diagrama Secuencia Coordinador 33 Ilustración 17 Diagrama de secuencia Promotor Fuente: Departamento de Desarrollo Económico de Visión Mundial Elaborado por: El Tesista 34 2.8 DIAGRAMAS DE ESTADO Un diagrama de estado muestra la secuencia de estados que un objeto o una interacción pueden atravesar durante su existencia en respuesta a los estímulos que vayan recibiendo, junto con las correspondientes respuestas y acciones. La idea básica es definir una máquina que tiene un número determinado de estados. La máquina recibe eventos del mundo exterior y cada evento provoca que la máquina cambie de un estado a otro. 2.8.1 Simbología Estado: Identifica un periodo de tiempo del objeto (no instantáneo) en el cual el objeto está esperando alguna operación, tiene cierto estado característico o puede recibir cierto tipo de estímulos. Ilustración 18 Estado Eventos: Es una ocurrencia que puede causar la transición de un estado a otro de un objeto. Esta ocurrencia puede ser una de varias cosas: Condición que toma el valor de verdadero o falso Recepción de una señal de otro objeto en el modelo Recepción de un mensaje Paso de cierto periodo de tiempo, después de entrar Transición simple: Es una relación entre dos estados que indica que un objeto en el primer estado puede entrar al segundo estado y ejecutar ciertas operaciones, cuando un evento ocurre y si ciertas condiciones son satisfechas. Ilustración 19 Transición simple Transición compleja: Relaciona tres o más estados en una transición de múltiples fuentes y/o múltiples destinos. Envío de mensajes: Además de mostrar la transición de estados por medio de eventos, puede representarse el momento en el cual se envían mensajes a otros objetos. Acciones: Podemos especificar la solicitud de un servicio a otro objeto como consecuencia de la transición. Se puede especificar el ejecutar una acción como 35 consecuencia de entrar, salir, estar en un estado, o por la ocurrencia de un evento. 2.8.2 Descripción de Diagramas de Estado Inicio Iniciar creación de Indicador Iniciado Ingresar datos Indicador Datos correctos Datos incorrectos Cancelado Ingreso de Indicador Aceptado Registrado Aprobado Rechazado Monitorizado En proceso de Seguimiento Creado Reporte Aceptado Final Ilustración 20 Diagrama de Estados 36 2.9 CONTENIDO DEL PROYECTO 2.9.1 Módulo de Gestión Administrativa Este módulo estará integrado por los siguientes submódulos: perfiles y usuarios 2.9.1.1 Crear los perfiles necesarios para poder ingresar al sistema y hacer uso del mismo de una forma apropiada y segura. Modificar de ser necesario los datos del perfil como: PDAs, pantallas, etc. y se hará una actualización de los mismos. 2.9.1.2 Perfiles Usuarios Crear los usuarios que dependiendo del perfil que se les asigne podrán hacer uso de todas o parte de las funcionalidades del sistema. Modificar de ser necesario los datos del usuario como: nombre, usuario, contraseña, cargo, etc., y se hará una actualización de los mismos. 2.9.2 Módulo de Gestión de Indicadores Este módulo estará integrado por los siguientes submódulos: ingreso de indicadores, monitoreo de indicadores, seguimiento y resultados de indicadores. 2.9.2.1 Crear los indicadores necesarios para poder medir la efectividad del PDA en la zona donde trabaja. Modificar de ser necesario los datos del indicador como: línea base, meta, nivel crítico, etc. 2.9.2.2 Monitoreo de Indicadores Ingresar los valores del indicador según la frecuencia indicada en la anterior pantalla. Modificar de ser necesario los valores como: logro actual, archivos de evidencia. 2.9.2.3 Ingreso de Indicadores Seguimiento y Resultados Ingresar el indicador del cual queremos desplegar la tabla de valores resultado del monitoreo con el respectivo gráfico y comentarios. Agregar de ser necesario comentarios de los resultados obtenidos. 37 2.9.3 PLATAFORMA 2.9.3.1 Plataforma .Net El .NET Framework (que se pronuncia punto net) es una plataforma desarrollada por Microsoft que se ejecuta principalmente en Microsoft Windows. Incluye una gran biblioteca y proporciona interoperabilidad entre lenguajes (cada lenguaje puede utilizar código escrito en otros lenguajes) a través de diversos lenguajes de programación. Los programas escritos para .NET Framework se ejecutan en un ambiente de software conocido como el Common Language Runtime (CLR), una máquina virtual de aplicaciones que proporciona servicios tales como seguridad, gestión de memoria, y el manejo de excepciones. La biblioteca de clases y el CLR en conjunto constituyen el. NET Framework. La Base Class Library de .NET Framework proporciona la interfaz de usuario , acceso a datos , conectividad de base de datos , criptografía , desarrollo de aplicaciones web, algoritmos numéricos y las comunicaciones de red . Programadores producen software mediante la combinación de su propio código fuente con el .NET Framework y otras bibliotecas. El .NET Framework está destinado a ser utilizado por la mayoría de nuevas aplicaciones creadas para la plataforma Windows. Microsoft también produce un entorno de desarrollo integrado en gran parte para software .NET llamado Visual Studio. 2.9.4 MODELO VISTA CONTROLADOR (MVC) Ilustración 21 Modelo Vista Controlador 38 2.9.4.1 MODELO Es la representación de la información con la cual el sistema opera, por lo tanto gestiona todos los accesos a dicha información, tanto consultas como actualizaciones, implementando también los privilegios de acceso que se hayan descrito en las especificaciones de la aplicación (lógica de negocio). Envía a la Vista aquella parte de la información que en cada momento se le solicita para que sea mostrada (típicamente a un usuario). Las peticiones de acceso o manipulación de información llegan al Modelo a través del Controlador. 2.9.4.2 CONTROLADOR Responde a eventos (usualmente acciones del usuario) e invoca peticiones al Modelo cuando se hace alguna solicitud sobre la información (por ejemplo, editar un documento o un registro en una base de datos). También puede enviar comandos a su Vista asociada si se solicita un cambio en la forma en que se presenta de Modelo (por ejemplo, desplazamiento o scroll por un documento o por los diferentes registros de una base de datos), por tanto se podría decir que el Controlador hace de intermediario entre la Vista y el Modelo. 2.9.4.3 VISTA Presenta el Modelo (información y lógica de negocio) en un formato adecuado para interactuar (usualmente la interfaz de usuario) por tanto requiere de dicho Modelo la información que debe representar como salida. 39 CAPITULO 3 Éste capítulo es una descripción de la funcionalidad del sistema como se mencionó en la sección de Introducción la aplicación consta de tres módulos principales: Módulo de Registro de la Zona, Módulo de Registro de Indicadores y Módulo de Generación de Reportes. Dentro del módulo de Registro de la Zona se describe el ingreso de la información concerniente a el lugar Físico donde se van a tomar las muestras (Encuestas, Informes, etc.) para luego crear los respectivos indicadores. En el módulo de Registro de Indicadores se escoge la zona que se ingresó en el módulo descrito anteriormente para llenar los datos necesarios para el indicador. De la información ingresada en el módulo anterior se podrá desplegar reportes mediante el módulo de Generación de Reportes. 3 DESCRIPCION DEL SISTEMA 3.1 Ingreso a la Aplicación Ilustración 22 Ingreso al Sistema A cada usuario se le asignará una clave para acceder al sistema, se ingresa un usuario y una contraseña para en caso de una autenticación exitosa hacer uso de las opciones del sistema de acuerdo al perfil asignado y rol asignado. Para encriptar la contraseña se utiliza una criptografía simétrica donde se usa la misma clave para cifrar y descifrar mensajes. La ventaja de usar un algoritmo simétrico es la imposibilidad de reconstruir la cadena original a partir del resultado, y también la imposibilidad de encontrar dos cadenas de texto que generen el mismo resultado. 40 3.2 Administración Este módulo permite gestionar todos los privilegios de los usuarios que intervienen en la ONG. Existe una opción para cambiar clave, la cual pide ingresar la contraseña anterior. En la opción de usuarios que está disponible solo para el administrador del sistema se puede ingresar los datos de un nuevo empleado y modificar los mismos. 3.2.1 Perfiles de usuario Ilustración 23 Administración Perfiles En perfiles de Usuario, se permite administrar los privilegios de los usuarios, permitiéndole agregar o quitar las opciones y acciones que tiene ya definido el perfil que se seleccione. Si es necesario se puede añadir un nuevo perfil de usuario y asignar privilegios. Ésta opción solo debe estar disponible para el Administrador. 3.3 Mantenimiento Permitir dar mantenimiento a las principales entidades del sistema, es decir actualizar datos o ingresar datos de una nueva entidad como por ejemplo unidades. 41 3.3.1 Mantenimiento de Perfiles Ilustración 24 Mantenimiento Perfiles Se maneja los perfiles del sistema permitiendo ingresar y actualizar los mismos. Se incluye la opción Eliminar. 3.3.2 Mantenimiento de Usuarios Ilustración 25 Mantenimiento Usuarios Se maneja los usuarios del sistema permitiendo ingresar y actualizar los mismos. Se incluye la opción Eliminar y se debe llenar el perfil y cargo al que pertenecen. 3.3.3 Mantenimiento de Frecuencias Ilustración 26 Mantenimiento Frecuencias Se maneja las frecuencias de los indicadores de desarrollo económico permitiendo ingresar y actualizar las mismas. Se incluye la opción Eliminar. 42 3.3.4 Mantenimiento de Estado Ilustración 27 Mantenimiento Estado Se maneja los estados de los Indicadores del sistema permitiendo ingresar y actualizar los mismos. Se incluye la opción Eliminar. 3.3.5 Mantenimiento de Unidades Ilustración 28 Mantenimiento Unidades Se maneja las unidades de medida de los Indicadores del sistema permitiendo ingresar y actualizar las mismas. Se incluye la opción Eliminar. 3.3.6 Mantenimiento de Cargos Ilustración 29 Mantenimiento Cargos Se maneja los cargos que tienen los usuarios del sistema permitiendo ingresar y actualizar los mismos. Se incluye la opción Eliminar. 43 3.3.7 Mantenimiento de Pantallas Ilustración 30 Mantenimiento Pantallas Se maneja las pantallas que tendrán asignadas los perfiles de usuario del sistema permitiendo ingresar y actualizar los mismos. Se incluye la opción Eliminar. 3.4 REGISTRO Se lleva el seguimiento desde la creación del indicador pasando por su registro hasta su fecha de finalización. Con esto ayudamos a los usuarios de acuerdo a su correspondiente perfil a mantener un control sobre los indicadores. 3.4.1 Ingreso de Indicadores Ilustración 31 Ingreso Indicadores Se crea el indicador indicando el PDA al cual va a pertenecer, el Nombre del Proyecto, la Actividad. Al ingresar los datos anteriores se despliegan el Área Programática y el Código de la Actividad. A continuación se puede ingresar la descripción, unidades, línea base, meta final, nivel crítico, fecha para meta final, frecuencia y evidencias. 44 3.4.2 Monitoreo de Indicadores Ilustración 32 Monitoreo Indicadores En esta pantalla se registra la meta que se ha obtenido con respecto al indicador. El número de veces que se realice este registro se delimitó al momento de ingresar la frecuencia del indicador (Ingreso de Indicadores). 3.5 REPORTES Dentro de cada reporte se visualiza la información de acuerdo al PDA, Proyecto, Actividad e Indicador seleccionado. Adicionalmente a cada reporte se le adjuntará un gráfico para mejor comprensión del usuario. Ilustración 33 Seguimiento Indicadores 45 3.5.1 Seguimiento y Resultados Este reporte permite visualizar los datos generales del indicador así como gráficos que describen su comportamiento. Ilustración 34 Seguimiento y Resultados 46 3.5.2 Cumplimiento Actividad Indica el porcentaje de cumplimiento de la actividad que se alimenta de los porcentajes de cumplimiento de cada indicador. Ilustración 35 Cumplimiento Actividad 47 3.5.3 Cumplimiento del Proyecto Indica el porcentaje de cumplimiento del proyecto en base a los porcentajes de cumplimiento de cada actividad. Ilustración 36 Cumplimiento Proyecto 48 3.5.4 Cumplimiento del PDA Indica el porcentaje de cumplimiento del PDA en base a los porcentajes de cumplimiento de cada proyecto. Ilustración 37 Cumplimiento PDA 49 CAPITULO 4 En este capítulo se describen las pruebas de desempeño y compatibilidad efectuadas al sistema. 4 PRUEBAS 4.1 Pruebas La prueba de software es un conjunto de herramientas, técnicas y métodos para poner a prueba la calidad del producto o servicio y así descubrir los defectos antes de que llegue al usuario final. Durante el desarrollo e implementación del sistema se llevó a cabo un proceso iterativo e incremental y las pruebas realizadas al término del desarrollo del sistema son: Pruebas de compatibilidad Pruebas de desempeño 4.1.1 Pruebas de Compatibilidad El objetivo principal de las pruebas de compatibilidad es de identificar errores de funcionalidad o de diseño de un sistema web. En esta prueba analizaremos compatibilidad de resolución, navegadores y sistema operativo. 50 Caso de Uso de Prueba Generar Reporte de Seguimiento y Resultados Propósito Comprobar la correcta visualización Datos de entrada 1. 2. 3. 4. Procedimiento PDA Proyecto Actividad Indicador El usuario ingresa los datos correspondientes al indicador que desea dar seguimiento El sistema despliega la información y gráficos correspondientes. Resultados esperados Visualización de la información correspondiente al indicador Tabla 8 Resultados de la prueba de resolución de pantalla Fuente: Firefox Elaborado por: El Tesista 4.1.1.1 Pruebas de Compatibilidad de resolución de pantalla Definición de prueba De acuerdo al caso de uso se visualizará la información e imágenes de las páginas en diferentes tipos de resoluciones de pantalla. Para esto usamos como tipo de navegador web Firefox bajo el sistema operativo Windows 7. Escenario de prueba Se determinarán diferentes tamaños de resolución de pantalla: Escenario 1: Resolución de pantalla 800*600 Escenario 2: Resolución de pantalla 1024*768 Escenario 3: Resolución de pantalla 1280*600 Escenario 4: Resolución de pantalla 1280*720 Escenario 5: Resolución de pantalla 1600*1900 Métricas 51 Para esta prueba tomamos en cuenta la métrica de verificación de imágenes en las páginas para su análisis. Calificación De acuerdo al análisis de esta prueba se ha dotado de ciertos parámetros de calificación. Visualización total Visualización parcial No hay visualización Resultados Medida Visualización imágenes pantalla Escenario de Escenario 1 en Calificación Observaciones Visualización Parcial La imagen no se distingue bien en la orden Escenario 2 Escenario 3 Escenario 4 Escenario 5 Tabla 9 Resultados de la prueba de resolución de pantalla Fuente: Firefox Elaborado por: El Tesista Análisis de Resultados Como se puede ver en la Tabla 9 se presenta resultados similares a excepción del Escenario 1, debido a que la imagen no se visualiza correctamente. Por tanto, se recomienda que para la utilización del sistema se use monitores con resolución de pantalla 1024*728 o superiores. 4.1.1.2 Pruebas de Compatibilidad de navegador web Definición de prueba Se hace desplieguen revisiones al caso de uso de prueba de forma que se estas páginas en diferentes navegadores. Escenarios de prueba Para la prueba se toma diferentes escenarios que a continuación se detallan: 52 Escenario 1: Navegador Web: Internet Explorer Escenario 2: Navegador Web: Firefox Escenario 3: Navegador Web: Chrome Métricas Para esta prueba se toma las siguientes métricas: Tamaño y posición de las imágenes en las páginas Muestra de mensajes Funcionamiento de componentes visuales Calificación Forma correcta Forma parcial Forma incorrecta Resultados Escenario y Escenario 1 de Escenario 2 Escenario 3 de Escenario 1 Escenario 2 Escenario 3 Funcionamiento Escenario 1 de componentes Escenario 2 visuales Escenario 3 Calificaciones Forma correcta Forma correcta Forma correcta Forma correcta Forma correcta Forma correcta Forma correcta Forma correcta Forma correcta Medida Tamaño posición imágenes Muestra mensajes Observaciones Tabla 10 Resultados de la prueba de Compatibilidad de navegadores Fuente: Navegadores web Elaborado por: El Tesista Análisis de Resultados Durante la ejecución de los tres escenarios de prueba se encontró una similitud entre el comportamiento en los distintos navegadores. Se recomienda el uso de cualquiera de ellos. 4.1.1.3 Pruebas de Compatibilidad de sistemas operativos Definición de prueba De acuerdo al caso de uso de prueba se analizará las páginas del sistema y el funcionamiento en diferentes sistemas operativos. Escenarios de prueba 53 Se han determinado dos escenarios: Escenario 1: Sistema Operativo: Linux Navegador Web: Firefox Escenario 1: Sistema Operativo: Windows 7 Navegador Web: Firefox Métricas Para esta prueba se toman en cuenta las siguientes métricas: Tamaño y posición de las imágenes en las páginas Muestra de mensajes Funcionamiento de componentes visuales Calificación Forma correcta Forma parcial Forma incorrecta Resultados Escenario Medida Tamaño y Escenario 1 posición de Escenario 2 imágenes en las páginas Muestra de Escenario 1 mensajes Escenario 2 Calificaciones Forma correcta Forma correcta Funcionamiento Escenario 1 de componentes Escenario 2 visuales Forma correcta Forma correcta Observaciones Forma correcta Forma correcta Tabla 11 Resultados de la prueba de Compatibilidad de Sistemas Operativos Fuente: Navegadores web Elaborado por: El Tesista Análisis de Resultados Durante la ejecución de los dos escenarios de prueba se encontró problemas de funcionamiento con el Escenario 1 Por tanto el sistema puede ser usado solo bajo sistemas operativos Windows. 54 4.1.2 Pruebas de desempeño El objetivo de este tipo de prueba es analizar y evaluar las características del software, por ejemplo consumo de memoria o procesador. La prueba consta de: Tiempos de respuesta Hardware 4.1.2.1 Prueba de desempeño en base a número de peticiones Casos de Uso de Prueba Generar Reporte de Seguimiento y Resultados Propósito Datos de entrada Procedimiento Comprobar el correcto funcionamiento 1. 2. 3. 4. PDA Proyecto Actividad Indicador El usuario ingresa los datos correspondientes al indicador que desea dar seguimiento El sistema despliega la información y gráficos correspondientes. Resultados esperados Visualización de la información correspondiente al indicador Tabla 12 Caso para la prueba de desempeño Fuente: Documentos de casos de uso Elaborado por: El Tesista Definición de prueba Analizar el tiempo de respuesta para la transición durante el paso 1 y 2 del caso de prueba. Escenarios de prueba Se han determinado el siguiente: Escenario: Procesador: Intel Core i3 3.40 Ghz 55 Memoria RAM: 4 GB Conexión LAN: 100 Mbps Sistema Operativo: Windows 7 Professional Velocidad de conexión a internet: 1 Mbps Métricas Tiempo de respuesta Calificación Ideal Aceptable Inaceptable Resultados El tiempo promedio para acceder a una página es de 65 milisegundos realizando un total de 30 peticiones al servidor. Análisis de Resultados El sistema tiene un tiempo de respuesta en promedio Aceptable. 4.1.2.2 Prueba de desempeño en base a hardware Definición de prueba Validar el consumo de recursos para lo cual usaremos dos equipos con características diferentes. Escenarios de prueba Se han determinado dos: Escenario 1: Procesador: Intel Core i3 3.40 Ghz Memoria RAM: 4 GB Conexión LAN: 100 Mbps 56 Sistema Operativo: Windows 7 Professional Velocidad de conexión a internet: 1 Mbps Escenario 2: Procesador: Intel Core i7 3.6 Ghz Memoria RAM: 8 GB Conexión LAN: 100 Mbps Sistema Operativo: Windows 8.1 Pro Edition Velocidad de conexión a internet: 1 Mbps Métricas Consumo de recursos del sistema, incluye uso de CPU y memoria RAM Tiempos de respuesta frente a la prueba Calificación Uso de CPU Uso de RAM en MB Resultados Medida Escenario Uso del CPU Escenario 1 Escenario 2 Escenario 1 Escenario 2 Uso de RAM Respuesta de Observaciones funcionamiento 21 % 10 % 513 MB 576 MB Tabla 13 Resultados Prueba Desempeño en base a Hardware Fuente: Administrador de tareas de Windows Elaborado por: El Tesista Análisis de Resultados A partir de las características del Escenario 1 o superiores el sistema se desempeña con normalidad. 57 CAPITULO 5 5. CONCLUSIONES Y RECOMENDACIONES A la culminación de este proyecto es posible concluir y recomendar lo siguiente: 5.1 5.2 Conclusiones La Aplicación Web para el Monitoreo de Indicadores de Desarrollo Económico permite dar un seguimiento a los proyectos que maneja la ONG Visión Mundial Ecuador haciendo más eficiente la distribución de los recursos económicos y proporcionando información relevante a las autoridades para la toma de decisiones. Se descubrió falencias en los procesos que lleva a cabo Visión Mundial lo que genera nuevos requerimientos que en el futuro pueden ser corregidos a la par del desarrollo de nuevos sistemas. Se considera como algo fundamental el que las comunidades puedan tener acceso a internet para lograr un mejor aprovechamiento de la Aplicación desarrollada. Recomendaciones Para un mejor entendimiento del proceso de creación de un Indicador de Desarrollo Económico se recomienda investigar temas relacionados a Economía. De esta manera se logrará una comprensión más rápida de la Aplicación. La Aplicación Web se ha adaptado a lo requerido por Visión Mundial Ecuador, permitiendo así un mejor manejo de la información por lo que se recomienda tener un mantenimiento continuo del sistema. Se recomienda tener un respaldo de la base con una frecuencia mensual Se recomienda que a futuro La Aplicación Web para el Monitoreo de Indicadores de Desarrollo Económico se integre con la actual denominada PMA (Planificación y Monitoreo Anual) para lograr una completa integración de la información. 58 GLOSARIO A ADMINISTRADOR DEL SISTEMA, tiene la responsabilidad de ejecutar, mantener, operar y asegurar el correcto funcionamiento de un sistema informático y/o una red de cómputo. ANALISIS, distinción y separación de las partes de un todo hasta llegar a conocer sus principios o elementos. API, interfaz de programación de aplicaciones. AUTOMATIZACIÓN, sustitución de tareas tradicionalmente manuales por las mismas realizadas de manera automática por máquinas. C CASOS DE USO, descripción de los pasos o actividades que deberán realizarse para llevar a cabo algún proceso. D DIAGRAMA DE ESTADO, muestran el conjunto de estados por los cuales pasa un objeto durante su vida en una aplicación en respuesta a eventos. DIAGRAMA DE SECUENCIA, es un tipo de diagrama usado para modelar interacción entre objetos en un sistema según UML. E ESTANDARES, acuerdos (normas) documentados que contienen especificaciones técnicas u otros criterios precisos para ser usados consistentemente como reglas, guías o definiciones de características. F FÓRMULA, conjunto de términos que representa una cantidad o que se utilizan para obtener un valor o resolver un problema. H HTML, Lenguaje de Marcas de HiperTexto que se utiliza para el desarrollo de páginas web. I INFRAESTRUCTURA TECNOLÓGICA, conjunto de todos los elementos tecnológicos que integran un proyecto o sustentan una operación. 59 M MÓDULO, agrupa un conjunto de subprogramas y estructuras de datos. MVC, Patrón de diseño para aplicaciones web (Modelo, Vista, Controlador). P PERFIL DE USUARIO, acceso a la información restringida o no dependiendo de pertenencia a determinado grupo. PLATAFORMA, determinado software y/o hardware con el cual una aplicación es compatible y permite su ejecución. PLUG-IN, aplicación que se relaciona con otra para aportarle una función nueva y generalmente muy específica. R RUP, Proceso de desarrollo de Software (Rational Unified Process). U UML, Lenguaje de Modelado de Sistemas de Software (Unified Modeling Language) 60 BIBLIOGRAFÍA 1. DOUGL, L, Programación Concurrente y Patrones de Diseño, Segunda Edición, Madrid, 2001 2. MÉNDEZ, C, Metodología, Diseño y Desarrollo Investigación, Tercera edición, Bogotá, 2001. del Proceso de 3. WIKIPEDIA, “Proceso Unificado de Rational”, http://es.wikipedia.org/wiki/Rational_Unified_Process 4. WIKIPEDIA, “Modelo–vista–controlador”, http://es.wikipedia.org/wiki/Modelo%E2%80%93vista%E2%80%93controlad or 5. SCRIBD, “Diferencia Entre Los Lenguajes de Programación”, http://es.scribd.com/doc/11522383/Diferencia-Entre-Los-Lenguajes-deProgramacion 6. VARGAS, Yuli, DÍAZ, Mabel, “Diagrama de Secuencia”, http://exposicinds.blogspot.com 7. GOOGLE DOCS, “Cuadro Comparativo”, https://docs.google.com/document/preview?hgd=1&id=1ACvEZgyTjKj_6tqP wbi-gfG_BZr8H7A_fatsUWYpBeA 61 ANEXOS 62 IND_Estados IND_Frecuencias 63 SeguimientoIndicadorID IndicadorID UsuarioID SeguimientoIndicador FechaSeguimientoIndicador SeguidorIndicador int <pk> int <fk1> int <fk2> varchar(100) datetime varchar(100) IND_SeguimientosIndicadores Ilustración 38 Diagrama Entidad Relación IND_Cargos CargoID int <pk> NombreCargo varchar(200) IND_Perfiles IND_PerfilPantalla PantallaID NombrePantalla ModuloPantalla OrdenPantalla int <pk> varchar(100) varchar(100) int IND_Pantallas FK_IND_PERF_REFERENCE_IND_PANT PerfilID int <pk> PerfilPantallaID int <pk> NombrePerfil varchar(200) FK_IND_PERF_REFERENCE_IND_PERF PantallaID int <fk1> PerfilID int <fk2> FK_USUARIOS_CARGOS IND_PerfilPDAS PerfilPDAID int <pk> PerfilID int <fk> FK_USUARIOS_PERFILES PdaID int FK_PERFILPDAS_PERFILES int <pk> int <fk2> int <fk1> varchar(200) varchar(200) varchar(200) datetime IND_Usuarios UsuarioID PerfilID CargoID NombreUsuario Usuario Clave FechaUltimaActividad FK_INDICADORES_USUARIOS int <pk> int <fk> int datetime IND_MonitoreoIndicador MonitoreoIndicadorID IndicadorID FK_IND_MONI_REFERENCE_IND_INDI MetaMonitoreo <fk2> FechaMonitoreo <fk3> <pk> <fk1> FK_SEGUIMIENTOSINDICADORES_USUARIOS FrecuenciaID int <pk> FK_SEGUIMIENTOSINDICADORES_INDICADORES DescripcionFrecuencia varchar(100) int int varchar(100) int int varchar(100) int int int int datetime datetime int IND_Indicadores IndicadorID FK_INDICADORES_ESTADOS FrecuenciaID IND_Evidencias DescripcionIndicador EvidenciaID int <pk> MetaFinalIndicador IndicadorID int <fk> FK_EVIDENCIAS_INDICADORES NivelCriticoIndicador RutaEvidencia varchar(100) EvidenciasIndicador NombreEvidencia varchar(100) ActividadID FechaEvidencia datetime LineaBase EstadoID UsuarioID FechaMetaFinal FK_INDICADORES_FRECUENCIASFechaRegistroFinal MetaRegistroFinal EstadoID int <pk> NemonicoEstado char(1) DescripcionEstado varchar(50) ANEXO A. DICCIONARIO DE DATOS LISTA DE TABLAS NOMBRE IND_Estados IND_Evidencias IND_Indicadores IND_MonitoreoIndicador IND_Frecuencias IND_Usuarios IND_SeguimientosIndicadores IND_Cargos IND_Perfiles IND_PerfilPDAS IND_PerfilPantalla IND_Pantallas DESCRIPCIÓN Se almacena los estados de los indicadores Se almacena la descripción[on de los documentos físicos que respaldan el indicador Se almacena toda la información referente al indicador Relaciona al indicador con su respectivo monitoreo Se almacena la frecuencia con la que serán monitoreados los indicadores Se almacena toda la información referente al usuario del sistema Relaciona al indicador con su respectivo seguimiento Se almacena el cargo del usuario Se almacena los perfiles del sistema Se almacena el perfil del sistema PMA Relaciona al perfil con sus respectivas pantallas Se almacena la información de las pantallas del sistema DESCRIPCIÓN DE TABLAS Tabla IND_Cargos CAMPOS CargoID NombreCargo TIPO int varchar LONGITUD NULL 4 200 X TIPO int char varchar LONGITUD NULL 4 1 X 50 X NOT NULL X PRIMARY KEY X FOREIGN KEY NOT NULL X PRIMARY KEY X FOREIGN KEY Tabla IND_Estados CAMPOS EstadoID NemonicoEstado DescripcionEstado 64 Tabla IND_Evidencias CAMPOS EvidenciaID IndicadorID RutaEvidencia NombreEvidencia FechaEvidencia TIPO LONGITUD NULL int 4 int 4 X varchar 100 X varchar 100 X datetime 8 X NOT NULL X PRIMARY KEY X FOREIGN KEY X Tabla IND_Frecuencias CAMPOS FrecuenciaID DescripcionFrecuencia TIPO int varchar LONGITUD NULL 4 100 X NOT NULL X PRIMARY KEY X FOREIGN KEY NOT NULL X PRIMARY KEY X FOREIGN KEY Tabla IND_Indicadores CAMPOS IndicadorID FrecuenciaID DescripcionIndicador MetaFinalIndicador NivelCriticoIndicador EvidenciasIndicador ActividadID LineaBase EstadoID UsuarioID FechaMetaFinal FechaRegistroFinal MetaRegistroFinal UnidadID TIPO LONGITUD NULL int 4 int 4 X varchar 100 X int 4 X int 4 X varchar 100 X int 4 X int 4 X int 4 X int 4 X datetime 8 X datetime 8 X int 4 X int 4 X X X X Tabla IND_MonitoreoIndicador CAMPOS MonitoreoIndicadorID IndicadorID MetaMonitoreo FechaMonitoreo TIPO LONGITUD NULL int 4 int 4 X int 4 X datetime 8 X 65 NOT NULL X PRIMARY KEY X FOREIGN KEY X Tabla IND_Pantallas CAMPOS PantallaID NombrePantalla ModuloPantalla OrdenPantalla TIPO int varchar varchar int LONGITUD NULL 4 100 X 100 X 4 X NOT NULL X PRIMARY KEY X FOREIGN KEY NOT NULL X PRIMARY KEY X FOREIGN KEY NOT NULL X PRIMARY KEY X FOREIGN KEY Tabla IND_Perfiles CAMPOS PerfilID NombrePerfil TIPO int varchar LONGITUD NULL 4 200 X Tabla IND_PerfilPantalla CAMPOS PerfilPantallaID PantallaID PerfilID TIPO int int int LONGITUD NULL 4 4 X 4 X X X Tabla IND_PerfilPDAS CAMPOS PerfilPDAID PerfilID PdaID TIPO int int int LONGITUD NULL 4 4 X 4 X NOT NULL X PRIMARY KEY X FOREIGN KEY X X Tabla IND_SeguimientosIndicadores CAMPOS SeguimientoIndicadorID IndicadorID UsuarioID SeguimientoIndicador FechaSeguimientoIndicador SeguidorIndicador TIPO LONGITUD NULL int 4 int 4 X int 4 X varchar 100 X datetime 8 X varchar 100 X 66 NOT NULL X PRIMARY KEY X FOREIGN KEY X X Tabla IND_Unidades CAMPOS UnidadID NemonicoUnidad DescripcionUnidad TIPO int char varchar LONGITUD NULL 4 3 X 50 X NOT NULL X PRIMARY KEY X FOREIGN KEY NOT NULL X PRIMARY KEY X VERDADERO VERDADERO FOREIGN KEY Tabla IND_Usuarios CAMPOS UsuarioID PerfilID CargoID NombreUsuario Usuario Clave FechaUltimaActividad TIPO LONGITUD NULL int 4 int 4 X int 4 X varchar 200 X varchar 200 X varchar 200 X datetime 8 X 67 X X MANUAL TÉCNICO APLICACIÓN WEB PARA EL MONITOREO DE INDICADORES DE DESARROLLO ECONÓMICO PARA LAS COMUNIDADES UBICADAS EN LOS CANTONES RIOBAMBA, GUANO Y PELILEO DE LA PROVINCIA DE CHIMBORAZO 68 MANUAL TÉCNICO 1.1 INTRODUCCIÓN La aplicación utiliza una lógica de programación desarrollada en niveles o capas. Para este trabajo se implementó el modelo de 3 capas denominado MVC (Modelo-Vista-Controlador) que proporciona una clara separación entre las distintas responsabilidades de la aplicación. Modelo: Son los datos puros que puestos en el contexto del sistema proveen de información al usuario o a la aplicación Vista: Es la representación del modelo en forma gráfica disponible para la interacción con el usuario. Controlador: Esta capa se encarga de manejar y responder las solicitudes del usuario, procesando la información necesaria y modificando el Modelo en caso de ser necesario. 1.2 Objetivo Explicar cada uno de los componentes de aplicación que fueron creados para cumplir con las especificaciones iniciales, además de detallar las clases que contienen enfocando a la creación de nuevos indicadores. 1.3 Herramientas utilizadas Sistema Operativo Windows 7 Lenguaje de programación Asp.net / C Sharp Entorno de desarrollo integrado (IDE) Visual Studio 2010 Servidor de Aplicaciones Internet Information Services (IIS) 69 Motor de Base de Datos SQL Server 2008 Diseñador de Reportes Crystal Reports 1.4 Requerimientos de Hardware Procesador: Core 2 Duo o superior Memoria: 2 GB RAM mínimo recomendado Disco duro: 40 GB Disponibles en disco Monitor: SVGA 1024 * 968 Tarjeta de red: 10 Mbps o superior CODIGO FUENTE 2.1 VISUALIZACIÓN DE LA ARQUITECTURA DE LA APLICACIÓN Ilustración 39 Arquitectura de la aplicación Como se puede observar en la Ilustración 39 el proyecto esta dividido en 7 módulos: 70 Account App_Code Images Reportes Scripts Styles Views Cada uno de estos módulos sera detallado a continuación: 2.2 Account En esta carpeta se almacena las páginas que controlar el ingreso a la aplicación y cambio de contraseña. Ilustración 40 Módulo Account Login2.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login2.aspx.cs" Inherits="Account_Login2" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <center> <tr <td align="center" valign="middle"> <table width="10%" cellspacing="4" cellpadding="4" border="4" > <tr> <td> <img alt="" src="Images/logo.jpg" /> </td> </tr> <tr> 71 <td valign="middle" align="center"> <table cellspacing="0" cellpadding="3" border="0" > <td> <asp:Label ID="lblUsuario" Text="Usuario" runat="server" /> </td> <td class="textologin" width="20" valign="middle" align="center">:</td> <td> <asp:TextBox ID="txtUsuario" runat="server"></asp:TextBox> </td> <td> <asp:Label ID="lblExiste" runat="server" ForeColor="Red"></asp:Label> </td> </tr> <tr> <td> <asp:Label ID="lblContraseña" Text="Contraseña" runat="server" /> <td class="textologin" width="20" valign="middle" align="center">:</td> </td> <td> <asp:TextBox ID="txtContraseña" runat="server" TextMode="Password"></asp:TextBox> </td> </tr> </table> </td> </table> <%--Botones--%> <table bgcolor="#ff6600"> <tr> <td> <asp:Button ID="btnIngresar" runat="server" Text="Ingresar" onclick="btnIngresar_Click" /> </td> <td> <asp:Button ID="btnLimpiar" runat="server" Text="Cancelar" onclick="btnLimpiar_Click" /> </td> </tr> </table> </td> </tr> </table> </center> 72 </form> </body> </html> Login2.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class Account_Login2 : System.Web.UI.Page { private Conexion c = new Conexion(); protected void Page_Load(object sender, EventArgs e) { lblExiste.Visible = false; } protected void btnIngresar_Click(object sender, EventArgs e) { if (txtUsuario.Text != "") { string perfil = String.Empty; string usuario = String.Empty; string contraseña = String.Empty; if (c.Consulta("select PerfilID from IND_Usuarios where Usuario = '" + txtUsuario.Text + "'").Tables[0].Rows.Count > 0) perfil = c.Consulta("select PerfilID from IND_Usuarios where Usuario = '" + txtUsuario.Text + "'").Tables[0].Rows[0].ItemArray[0].ToString(); if (c.Consulta("select Usuario from IND_Usuarios where Usuario = '" + txtUsuario.Text + "'").Tables[0].Rows.Count > 0) usuario = c.Consulta("select Usuario from IND_Usuarios where Usuario = '" + txtUsuario.Text + "'").Tables[0].Rows[0].ItemArray[0].ToString(); if (c.Consulta("select Clave from IND_Usuarios where Usuario = '" + txtUsuario.Text + "'").Tables[0].Rows.Count > 0) contraseña = c.Consulta("select Clave from IND_Usuarios where Usuario = '" + txtUsuario.Text + "'").Tables[0].Rows[0].ItemArray[0].ToString(); if (usuario == txtUsuario.Text && contraseña == txtContraseña.Text) { Session["Perfil"] = perfil; Response.Redirect("Default.aspx"); } 73 else { //Response.Redirect("Login2.aspx"); lblExiste.Text = "Usuario/contraseña invalidos. Ingrese nuevamente."; lblExiste.Visible = true; } } else { lblExiste.Text = "Usuario/contraseña invalidos. Ingrese nuevamente."; lblExiste.Visible = true; } } protected void btnLimpiar_Click(object sender, EventArgs e) { txtUsuario.Text = ""; txtContraseña.Text = ""; } } 2.3 App_Code En este módulo se encuentran las clases que manejan la conexión a la base de Datos. Ilustración 41 Módulo App_Code Conexion.cs using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; using System.ComponentModel; using System.Drawing; using System.Collections; using System.IO; using System.Web; using System.Data.OleDb; using System.Web.UI.WebControls; public class Conexion { 74 #region Variables public SqlConnection conexion = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["I NDDBConnectionString"].ToString()); public SqlCommand comando = new SqlCommand(); public SqlDataReader drSQL; private SqlDataAdapter adaptador = new SqlDataAdapter(); #endregion #region Constructor public Conexion() { } #endregion #region Métodos public DataSet Consulta(string query) { try { conexion.Open(); SqlDataAdapter da = new SqlDataAdapter(query, conexion); DataSet ds = new DataSet(); da.Fill(ds, "tablas"); return ds; } catch (Exception ex) { throw ex; } finally { conexion.Close(); } } public void EjecutaSQL(string sentenciaSql) { try { conexion.Open(); comando.CommandText = sentenciaSql; comando.Connection = conexion; comando.ExecuteNonQuery(); } catch (Exception e) { throw e; } finally 75 { conexion.Close(); comando.Dispose(); } } public void CargaDropDownList(string sentenciaSql, DropDownList ddl) { try { ddl.Items.Clear(); ddl.Items.Add("Seleccionar..."); int i = 1; foreach (DataRow item in Consulta(sentenciaSql).Tables[0].Rows) { ddl.Items.Add(item[0].ToString()); ddl.Items[i].Value = item[1].ToString(); i++; } } catch (Exception e) { throw e; } } # endregion } ConexionPMA.cs using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; using System.ComponentModel; using System.Drawing; using System.Collections; using System.IO; using System.Web; using System.Data.OleDb; using System.Web.UI.WebControls; public class ConexionPMA { #region Variables public SqlConnection conexion = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["P MADBConnectionString"].ToString()); 76 public SqlCommand comando = new SqlCommand(); public SqlDataReader drSQL; private SqlDataAdapter adaptador = new SqlDataAdapter(); #endregion #region Constructor public ConexionPMA() { } #endregion #region Métodos public DataSet Consulta(string query) { try { conexion.Open(); SqlDataAdapter da = new SqlDataAdapter(query, conexion); DataSet ds = new DataSet(); da.Fill(ds, "tablas"); return ds; } catch (Exception ex) { throw ex; } finally { conexion.Close(); } } public void EjecutaSQL(string sentenciaSql) { try { conexion.Open(); comando.CommandText = sentenciaSql; comando.Connection = conexion; comando.ExecuteNonQuery(); } catch (Exception e) { throw e; } finally { conexion.Close(); comando.Dispose(); } 77 } public void CargaDropDownList(string sentenciaSql, DropDownList ddl) { try { ddl.Items.Clear(); ddl.Items.Add("Seleccionar..."); int i = 1; foreach (DataRow item in Consulta(sentenciaSql).Tables[0].Rows) { ddl.Items.Add(item[0].ToString()); ddl.Items[i].Value = item[1].ToString(); i++; } } catch (Exception e) { throw e; } } # endregion } 2.4 Images En este modulo se encuentran las imágenes parte del sistema. Ilustración 42 Módulo Images 2.5 Reportes Como su nombre lo índica contiene los Crystal Reports del sistema. Ilustración 43 Módulo Reportes 2.6 Scripts 78 Este modulo contiene los archivos javascripts (.js) y de hojas de estilos (.css) necesarios para realizar validaciones e incluir efectos visuales al menú. Ilustración 44 Módulo Scripts 2.7 Styles Este modulo contiene los archivos de hojas de estilos (.css) que controlan la apariencia visual del sitio. Ilustración 45 Módulo Styles 79 2.8 Views Este modulo contiene los archivos de las paginas del sitio las cuales contienen lo siguente: AdministracionPerfiles.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="AdministracionPerfiles.aspx.cs" Inherits="AdministracionPerfiles" %> <%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %> <asp:Content ID="HeaderContent" ContentPlaceHolderID="HeadContent" runat="Server"> </asp:Content> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="Server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:Panel ID="pnlPageHeader" CssClass="page-header" runat="server"> <%--Título--%> <asp:Panel ID="pnlTitle" CssClass="page-header" runat="server"> <h1> <asp:Label ID="lblTitle" runat="server"></asp:Label></h1> </asp:Panel> </asp:Panel> <br /> <asp:Panel ID="pnlFormSection" CssClass="form-section" runat="server"> <asp:Panel ID="pnlContainer" CssClass="container" runat="server" ClientIDMode="Static"> <table> <tr> <td class="label required"> <asp:Label ID="lblPerfil" runat="server"></asp:Label> </td> <td> <asp:DropDownList ID="ddlPerfil" runat="server" AutoPostBack="true" Width="300px" OnSelectedIndexChanged="ddlPerfil_SelectedIndexChanged"> </asp:DropDownList> </td> </tr> </table> <dx:ASPxGridView ID="ASPxGridViewAdminPerfiles" ClientInstanceName="grid" KeyFieldName="PantallaID" 80 OnRowInserting="grid_RowInserting" Width="100%" AutoGenerateColumns="False" OnRowUpdating="grid_RowUpdating" OnRowDeleting="grid_RowDeleting" Visible="false" runat="server"> <SettingsEditing Mode="Inline" /> <Columns> <dx:GridViewCommandColumn VisibleIndex="0"> <EditButton Visible="True" Text="Actualizar"> </EditButton> <NewButton Visible="True" Text="Crear"> </NewButton> <DeleteButton Visible="True" Text="Eliminar"> </DeleteButton> </dx:GridViewCommandColumn> <dx:GridViewDataComboBoxColumn Caption="Pantalla" FieldName="PantallaID" ShowInCustomizationForm="True" VisibleIndex="2"> <PropertiesComboBox DataSourceID="SqlDataSourcePantallas" ValueType="System.Int32" ValueField="PantallaID" TextField="NombrePantalla" Spacing="0"> </PropertiesComboBox> </dx:GridViewDataComboBoxColumn> </Columns> <ClientSideEvents SelectionChanged="grid_SelectionChanged" /> </dx:ASPxGridView> <asp:SqlDataSource ID="SqlDataSourcePantallas" ConnectionString="<%$ ConnectionStrings:INDDBConnectionString %>" runat="server" SelectCommand="select PantallaID, NombrePantalla from IND_Pantallas"> </asp:SqlDataSource> </asp:Panel> </asp:Panel> </asp:Content> AdministracionPerfiles.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Text; using System.Data.SqlClient; public partial class AdministracionPerfiles : System.Web.UI.Page { 81 #region Variables private Conexion c = new Conexion(); private ConexionPMA cPMA = new ConexionPMA(); private DataSet codigo = new DataSet(); #endregion protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { c.CargaDropDownList("select NombrePerfil, PerfilID from IND_Perfiles order by NombrePerfil", ddlPerfil); lblTitle.Text = "Administración de Perfiles"; } } protected void ddlPerfil_SelectedIndexChanged(object sender, EventArgs e) { ASPxGridViewAdminPerfiles.Visible = true; BindGrid(); } protected void grid_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("INSERT INTO [IND_PerfilPantalla] ([PantallaID], [PerfilID]) VALUES ("); sqlQuery.Append(e.NewValues["PantallaID"].ToString() + ", "); sqlQuery.Append(ddlPerfil.SelectedValue + ")"); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewAdminPerfiles.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } 82 protected void grid_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("UPDATE IND_PerfilPantalla SET "); sqlQuery.Append("PantallaID = " + e.NewValues["PantallaID"].ToString() + ","); sqlQuery.Append("PerfilID = " + ddlPerfil.SelectedValue); sqlQuery.Append(" WHERE PantallaID = " + e.Keys["PantallaID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewAdminPerfiles.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowDeleting(object sender, DevExpress.Web.Data.ASPxDataDeletingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("DELETE FROM IND_PerfilPantalla"); sqlQuery.Append(" WHERE PantallaID = " + e.Keys["PantallaID"].ToString()); sqlQuery.Append(" AND PerfilID = " + ddlPerfil.SelectedValue); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewAdminPerfiles.CancelEdit(); } 83 c.conexion.Close(); e.Cancel = true; BindGrid(); } private void BindGrid() { try { c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand("select * from IND_Pantallas pa, IND_PerfilPantalla pp, IND_Perfiles pe where pp.PerfilID = pe.PerfilID and pp.PantallaID = pa.PantallaID and pe.PerfilID = " + ddlPerfil.SelectedValue); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); ASPxGridViewAdminPerfiles.DataSource = dsClaimCat; ASPxGridViewAdminPerfiles.DataBind(); c.conexion.Close(); } catch { Response.Write("Error"); } } } Cargos.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Cargos.aspx.cs" Inherits="Cargos" %> <%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %> <asp:Content ID="HeaderContent" ContentPlaceHolderID="HeadContent" runat="Server"> </asp:Content> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="Server"> <asp:Panel ID="pnlPageHeader" CssClass="page-header" runat="server"> 84 <%--Título--%> <asp:Panel ID="pnlTitle" CssClass="page-header" runat="server"> <h1> <asp:Label ID="lblTitle" runat="server"></asp:Label></h1> </asp:Panel> </asp:Panel> <br /> <asp:Panel ID="pnlFormSection" CssClass="form-section" runat="server"> <asp:Panel ID="pnlContainer" CssClass="container" runat="server" ClientIDMode="Static"> <dx:ASPxGridView ID="ASPxGridViewCargos" ClientInstanceName="grid" KeyFieldName="CargoID" OnRowInserting="grid_RowInserting" Width="100%" AutoGenerateColumns="False" OnRowUpdating="grid_RowUpdating" OnRowDeleting="grid_RowDeleting" runat="server"> <SettingsEditing Mode="Inline" /> <Columns> <dx:GridViewCommandColumn VisibleIndex="0"> <EditButton Visible="True" Text="Actualizar"> </EditButton> <NewButton Visible="True" Text="Crear"> </NewButton> <DeleteButton Visible="True" Text="Eliminar"> </DeleteButton> </dx:GridViewCommandColumn> <dx:GridViewDataTextColumn Caption="Cargo" FieldName="NombreCargo" VisibleIndex="1"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> </Columns> </dx:ASPxGridView> </asp:Panel> </asp:Panel> </asp:Content> Cargos.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Text; using System.Data.SqlClient; public partial class Cargos : System.Web.UI.Page { 85 #region Variables private Conexion c = new Conexion(); private ConexionPMA cPMA = new ConexionPMA(); private DataSet codigo = new DataSet(); #endregion protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { BindGrid(); lblTitle.Text = "Cargos"; } } protected void grid_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("INSERT INTO [IND_Cargos] ([NombreCargo]) VALUES ("); sqlQuery.Append("'" + e.NewValues["NombreCargo"].ToString() + "')"); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewCargos.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("UPDATE IND_Cargos SET "); sqlQuery.Append("NombreCargo = '" + e.NewValues["NombreCargo"].ToString() + "'"); sqlQuery.Append(" WHERE CargoID = " + e.Keys["CargoID"].ToString()); 86 c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewCargos.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowDeleting(object sender, DevExpress.Web.Data.ASPxDataDeletingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("DELETE FROM IND_Cargos"); sqlQuery.Append(" WHERE CargoID = " + e.Keys["CargoID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewCargos.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } private void BindGrid() { try { 87 c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand("select * from IND_Cargos"); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); ASPxGridViewCargos.DataSource = dsClaimCat; ASPxGridViewCargos.DataBind(); c.conexion.Close(); } catch { Response.Write("Error"); } } } EstadosIndicadores.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="EstadosIndicadores.aspx.cs" Inherits="EstadosIndicadores" %> <%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %> <asp:Content ID="HeaderContent" ContentPlaceHolderID="HeadContent" runat="Server"> </asp:Content> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="Server"> <asp:Panel ID="pnlPageHeader" CssClass="page-header" runat="server"> <%--Título--%> <asp:Panel ID="pnlTitle" CssClass="page-header" runat="server"> <h1> <asp:Label ID="lblTitle" runat="server"></asp:Label></h1> </asp:Panel> </asp:Panel> <br /> <asp:Panel ID="pnlFormSection" CssClass="form-section" runat="server"> <asp:Panel ID="pnlContainer" CssClass="container" runat="server" ClientIDMode="Static"> 88 <dx:ASPxGridView ID="ASPxGridViewEstadosIndicadores" ClientInstanceName="grid" KeyFieldName="EstadoID" OnRowInserting="grid_RowInserting" Width="100%" AutoGenerateColumns="False" OnRowUpdating="grid_RowUpdating" OnRowDeleting="grid_RowDeleting" runat="server"> <SettingsEditing Mode="Inline" /> <Columns> <dx:GridViewCommandColumn VisibleIndex="0"> <EditButton Visible="True" Text="Actualizar"> </EditButton> <NewButton Visible="True" Text="Crear"> </NewButton> <DeleteButton Visible="True" Text="Eliminar"> </DeleteButton> </dx:GridViewCommandColumn> <dx:GridViewDataTextColumn Caption="Nemónico" FieldName="NemonicoEstado" VisibleIndex="1"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> <dx:GridViewDataTextColumn Caption="Estado" FieldName="DescripcionEstado" VisibleIndex="2"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> </Columns> </dx:ASPxGridView> <asp:SqlDataSource ID="SqlDataSourceEstadosIndicadores" ConnectionString="<%$ ConnectionStrings:INDDBConnectionString %>" runat="server" SelectCommand="select * from IND_Estados"> </asp:SqlDataSource> </asp:Panel> </asp:Panel> </asp:Content> EstadosIndicadores.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Data.SqlClient; using System.Text; public partial class EstadosIndicadores : System.Web.UI.Page { #region Variables private Conexion c = new Conexion(); private ConexionPMA cPMA = new ConexionPMA(); 89 private DataSet codigo = new DataSet(); #endregion protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { BindGrid(); lblTitle.Text = "Estado de Indicadores"; } } protected void grid_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("INSERT INTO [IND_Estados] (NemonicoEstado, DescripcionEstado) VALUES ("); sqlQuery.Append("'" + e.NewValues["NemonicoEstado"].ToString() + "',"); sqlQuery.Append("'" + e.NewValues["DescripcionEstado"].ToString() + "')"); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewEstadosIndicadores.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("UPDATE IND_Estados SET "); sqlQuery.Append("NemonicoEstado = '" + e.NewValues["NemonicoEstado"].ToString() + "'"); sqlQuery.Append("DescripcionEstado = '" + e.NewValues["DescripcionEstado"].ToString() + "'"); 90 sqlQuery.Append(" WHERE EstadoID = " + e.Keys["EstadoID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewEstadosIndicadores.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowDeleting(object sender, DevExpress.Web.Data.ASPxDataDeletingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("DELETE FROM IND_Estados"); sqlQuery.Append(" WHERE EstadoID = " + e.Keys["EstadoID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewEstadosIndicadores.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } private void BindGrid() { try 91 { c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand("select * from IND_Estados"); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); ASPxGridViewEstadosIndicadores.DataSource = dsClaimCat; ASPxGridViewEstadosIndicadores.DataBind(); c.conexion.Close(); } catch { Response.Write("Error"); } } } Frecuencias.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Frecuencias.aspx.cs" Inherits="Frecuencias" %> <%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %> <asp:Content ID="HeaderContent" ContentPlaceHolderID="HeadContent" runat="Server"> </asp:Content> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="Server"> <asp:Panel ID="pnlPageHeader" CssClass="page-header" runat="server"> <%--Título--%> <asp:Panel ID="pnlTitle" CssClass="page-header" runat="server"> <h1> <asp:Label ID="lblTitle" runat="server"></asp:Label></h1> </asp:Panel> </asp:Panel> <br /> <asp:Panel ID="pnlFormSection" CssClass="form-section" runat="server"> <asp:Panel ID="pnlContainer" CssClass="container" runat="server" ClientIDMode="Static"> 92 <dx:ASPxGridView ID="ASPxGridViewFrecuencias" ClientInstanceName="grid" KeyFieldName="FrecuenciaID" OnRowInserting="grid_RowInserting" Width="100%" AutoGenerateColumns="False" OnRowUpdating="grid_RowUpdating" OnRowDeleting="grid_RowDeleting" runat="server"> <SettingsEditing Mode="Inline" /> <Columns> <dx:GridViewCommandColumn VisibleIndex="0"> <EditButton Visible="True" Text="Actualizar"> </EditButton> <NewButton Visible="True" Text="Crear"> </NewButton> <DeleteButton Visible="True" Text="Eliminar"> </DeleteButton> </dx:GridViewCommandColumn> <dx:GridViewDataTextColumn Caption="Frecuencia" FieldName="DescripcionFrecuencia" VisibleIndex="1"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> </Columns> </dx:ASPxGridView> <asp:SqlDataSource ID="SqlDataSourceFrecuencias" ConnectionString="<%$ ConnectionStrings:INDDBConnectionString %>" runat="server" SelectCommand="select * from IND_Frecuencias"> </asp:SqlDataSource> </asp:Panel> </asp:Panel> </asp:Content> Frecuencias.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Data.SqlClient; using System.Text; public partial class Frecuencias : System.Web.UI.Page { #region Variables private Conexion c = new Conexion(); private ConexionPMA cPMA = new ConexionPMA(); private DataSet codigo = new DataSet(); 93 #endregion protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { BindGrid(); lblTitle.Text = "Frecuencias"; } } protected void grid_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("INSERT INTO [IND_Frecuencias] ([DescripcionFrecuencia]) VALUES ("); sqlQuery.Append("'" + e.NewValues["DescripcionFrecuencia"].ToString() + "')"); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewFrecuencias.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("UPDATE IND_Frecuencias SET "); sqlQuery.Append("DescripcionFrecuencia = '" + e.NewValues["DescripcionFrecuencia"].ToString() + "'"); sqlQuery.Append(" WHERE FrecuenciaID = " + e.Keys["FrecuenciaID"].ToString()); 94 c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewFrecuencias.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowDeleting(object sender, DevExpress.Web.Data.ASPxDataDeletingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("DELETE FROM IND_Frecuencias"); sqlQuery.Append(" WHERE FrecuenciaID = " + e.Keys["FrecuenciaID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewFrecuencias.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } private void BindGrid() { try 95 { c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand("select * from IND_Frecuencias"); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); ASPxGridViewFrecuencias.DataSource = dsClaimCat; ASPxGridViewFrecuencias.DataBind(); c.conexion.Close(); } catch { Response.Write("Error"); } } } IngresoDatos.aspx <%@ Page Title="Ingreso de Datos" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="IngresoDatos.aspx.cs" Inherits="IngresoDatos" %> <%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="Server"> <script type="text/javascript"> // <![CDATA[ function OnPDAChanged(cmbPDA) { grid.GetEditor("NombreProyecto").PerformCallback(cmbPDA.GetValue().toString() ); } // ]]> </script> <asp:Panel ID="pnlFormSection" CssClass="form-section" runat="server"> <asp:Panel ID="pnlPageHeader" CssClass="page-header" runat="server"> <%--Título--%> <asp:Panel ID="pnlTitle" CssClass="page-header" runat="server"> <h1> 96 <asp:Label ID="lblTitle" runat="server"></asp:Label></h1> </asp:Panel> </asp:Panel> <br /> <asp:Panel ID="pnlContainer" CssClass="container" runat="server" ClientIDMode="Static"> <table> <tr> <td class="label required"> <asp:Label ID="lblPDA" runat="server"></asp:Label> </td> <td> <asp:DropDownList ID="ddlPDA" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlPDA_SelectedIndexChanged"> </asp:DropDownList> </td> </tr> <tr> <td class="label required"> <asp:Label ID="lblProyecto" runat="server"></asp:Label> </td> <td> <asp:DropDownList ID="ddlProyecto" runat="server" AutoPostBack="true" Width="300px" OnSelectedIndexChanged="ddlProyecto_SelectedIndexChanged"> </asp:DropDownList> </td> </tr> <tr> <td class="label required"> <asp:Label ID="lblActividad" runat="server"></asp:Label> </td> <td> <asp:DropDownList ID="ddlActividad" runat="server" AutoPostBack="true" Width="300px" OnSelectedIndexChanged="ddlActividad_SelectedIndexChanged"> </asp:DropDownList> </td> <td class="label required"> <asp:Label ID="lblCodActividad" runat="server"></asp:Label> </td> <td> <asp:TextBox ID="txtCodActividad" runat="server" Enabled="false"></asp:TextBox> </td> </tr> <tr> 97 <td class="label required"> <asp:Label ID="lblAreaProgramatica" runat="server"></asp:Label> </td> <td> <asp:TextBox ID="txtAreaProgramatica" runat="server" Enabled="false" Width="300px"></asp:TextBox> </td> </tr> </table> <br /> <dx:ASPxGridView ID="ASPxGridViewIndicadores" ClientInstanceName="grid" Visible="false" OnRowInserting="grid_RowInserting" KeyFieldName="IndicadorID" Width="100%" AutoGenerateColumns="False" OnRowUpdating="grid_RowUpdating" OnRowDeleting="grid_RowDeleting" runat="server"> <SettingsEditing Mode="Inline" /> <Columns> <dx:GridViewCommandColumn Caption="Acciones" VisibleIndex="0"> <EditButton Visible="True" Text="Actualizar"> </EditButton> <NewButton Visible="True" Text="Crear"> </NewButton> <DeleteButton Visible="True" Text="Eliminar"> </DeleteButton> </dx:GridViewCommandColumn> <dx:GridViewDataTextColumn Caption="Descripción del Indicador" FieldName="DescripcionIndicador" VisibleIndex="1"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> <dx:GridViewDataComboBoxColumn Caption="Unidades" FieldName="UnidadID" ShowInCustomizationForm="True" VisibleIndex="2"> <PropertiesComboBox DataSourceID="SqlDataSourceUnidades" ValueType="System.Int32" ValueField="UnidadID" TextField="DescripcionUnidad" Spacing="0"> </PropertiesComboBox> </dx:GridViewDataComboBoxColumn> <dx:GridViewDataTextColumn Caption="Línea Base" FieldName="LineaBase" VisibleIndex="3"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> <dx:GridViewDataTextColumn Caption="Meta Final" FieldName="MetaFinalIndicador" VisibleIndex="4"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> <dx:GridViewDataTextColumn Caption="Nivel Crítico" FieldName="NivelCriticoIndicador" VisibleIndex="5"> 98 <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> <dx:GridViewDataColumn Caption="Fecha Para Meta Final" FieldName="FechaMetaFinal" VisibleIndex="6"> <EditFormSettings Visible="False" /> </dx:GridViewDataColumn> <dx:GridViewDataComboBoxColumn Caption="Frecuencia" FieldName="FrecuenciaID" ShowInCustomizationForm="True" VisibleIndex="7"> <PropertiesComboBox DataSourceID="SqlDataSourceFrecuencias" ValueType="System.Int32" ValueField="FrecuenciaID" TextField="DescripcionFrecuencia" Spacing="0"> </PropertiesComboBox> </dx:GridViewDataComboBoxColumn> <dx:GridViewDataTextColumn Caption="Evidencias" FieldName="EvidenciasIndicador" VisibleIndex="8"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> </Columns> </dx:ASPxGridView> <asp:SqlDataSource ID="SqlDataSourceIndicadores" ConnectionString="<%$ ConnectionStrings:INDDBConnectionString %>" runat="server" SelectCommand="select * from IND_Indicadores"> </asp:SqlDataSource> <asp:SqlDataSource ID="SqlDataSourceFrecuencias" ConnectionString="<%$ ConnectionStrings:INDDBConnectionString %>" runat="server" SelectCommand="select FrecuenciaID, DescripcionFrecuencia from IND_Frecuencias"> </asp:SqlDataSource> <asp:SqlDataSource ID="SqlDataSourceUnidades" ConnectionString="<%$ ConnectionStrings:INDDBConnectionString %>" runat="server" SelectCommand="select UnidadID, DescripcionUnidad from IND_Unidades"> </asp:SqlDataSource> </asp:Panel> </asp:Panel> </asp:Content> IngresoDatos.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; 99 using DevExpress.Web.ASPxEditors; using DevExpress.Web.ASPxClasses; using DevExpress.Web.ASPxGridView; using System.Text; using System.Data.SqlClient; using System.Globalization; public partial class IngresoDatos : System.Web.UI.Page { #region Variables private Conexion c = new Conexion(); private ConexionPMA cPMA = new ConexionPMA(); private DataSet codigo = new DataSet(); #endregion protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { LoadResources(); cPMA.CargaDropDownList("select NombrePda, PdaID from PMA_Pda order by NombrePda", ddlPDA); } } #region LoadResources protected void LoadResources() { lblPDA.Text = "Programa de Desarrollo de Área (PDA):"; lblProyecto.Text = "Nombre del Proyecto:"; lblCodActividad.Text = "Código de la Actividad:"; lblActividad.Text = "Actividad:"; lblAreaProgramatica.Text = "Área Programática:"; lblTitle.Text = "Ingreso de Indicadores"; } #endregion protected void ddlAreaProgramatica_SelectedIndexChanged(object sender, EventArgs e) { cPMA.CargaDropDownList("select a.DescripcionActividad, a.ActividadId from PMA_Resultados r, PMA_Productos p, PMA_Actividades a, PMA_Proyectos py, PMA_CategoriaSector c where r.ResultadoID=p.ResultadoID and p.ProductoID=a.ProductoID and a.CategoriaSectorID=c.CategoriaSectorID and r.ProyectoID= py.ProyectoID and py.PdaID = " + ddlPDA.SelectedValue + " and py.ProyectoID = " + ddlProyecto.SelectedValue, ddlActividad); } 100 protected void ddlProyecto_SelectedIndexChanged(object sender, EventArgs e) { ASPxGridViewIndicadores.Visible = false; ddlActividad.Items.Clear(); txtCodActividad.Text = ""; txtAreaProgramatica.Text = ""; cPMA.CargaDropDownList("select a.DescripcionActividad, a.ActividadId from PMA_Resultados r, PMA_Productos p, PMA_Actividades a, PMA_Proyectos py, PMA_CategoriaSector c where r.ResultadoID=p.ResultadoID and p.ProductoID=a.ProductoID and a.CategoriaSectorID=c.CategoriaSectorID and r.ProyectoID= py.ProyectoID and py.PdaID = " + ddlPDA.SelectedValue + " and py.ProyectoID = " + ddlProyecto.SelectedValue, ddlActividad); } protected void ddlActividad_SelectedIndexChanged(object sender, EventArgs e) { codigo = cPMA.Consulta("select p.MarcoLogicoProducto, a.MarcoLogicoActividad, c.CategoriaSector from PMA_Resultados r, PMA_Productos p, PMA_Actividades a, PMA_Proyectos py, PMA_CategoriaSector c where r.ResultadoID=p.ResultadoID and p.ProductoID=a.ProductoID and a.CategoriaSectorID=c.CategoriaSectorID and r.ProyectoID= py.ProyectoID and py.PdaID = " + ddlPDA.SelectedValue + " and py.ProyectoID = " + ddlProyecto.SelectedValue + " and a.ActividadID = " + ddlActividad.SelectedValue); txtAreaProgramatica.Text = codigo.Tables[0].Rows[0].ItemArray[2].ToString(); txtCodActividad.Text = "01." + "0" + codigo.Tables[0].Rows[0].ItemArray[0].ToString() + ".0" + codigo.Tables[0].Rows[0].ItemArray[1].ToString(); ASPxGridViewIndicadores.Visible = true; BindGrid(); } protected void ddlPDA_SelectedIndexChanged(object sender, EventArgs e) { ddlActividad.Items.Clear(); txtCodActividad.Text = ""; txtAreaProgramatica.Text = ""; cPMA.CargaDropDownList("select distinct(NombreProyecto), ProyectoID from PMA_Proyectos where PdaID = " + ddlPDA.SelectedValue, ddlProyecto); } protected void grid_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("INSERT INTO [IND_Indicadores] ([FrecuenciaID], [DescripcionIndicador], [MetaFinalIndicador], [NivelCriticoIndicador], [EvidenciasIndicador], [ActividadID], [LineaBase], [EstadoID], [UsuarioID], [FechaMetaFinal], [UnidadID]) VALUES ("); 101 sqlQuery.Append(e.NewValues["FrecuenciaID"].ToString() + ","); sqlQuery.Append("'" + e.NewValues["DescripcionIndicador"].ToString() + "',"); sqlQuery.Append(e.NewValues["MetaFinalIndicador"].ToString() + ","); sqlQuery.Append(e.NewValues["NivelCriticoIndicador"].ToString() + ","); sqlQuery.Append("'" + e.NewValues["EvidenciasIndicador"].ToString() + "',"); sqlQuery.Append(ddlActividad.SelectedValue + ","); sqlQuery.Append(e.NewValues["LineaBase"].ToString() + ","); sqlQuery.Append("1,"); sqlQuery.Append("1,"); sqlQuery.Append("'" + String.Format("{0:u}", e.NewValues["FechaMetaFinal"]).Replace("Z", "") + "', "); sqlQuery.Append(e.NewValues["UnidadID"].ToString() + ")"); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewIndicadores.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("UPDATE IND_Indicadores SET "); sqlQuery.Append("FrecuenciaID = " + e.NewValues["FrecuenciaID"].ToString() + ","); sqlQuery.Append("DescripcionIndicador = '" + e.NewValues["DescripcionIndicador"].ToString() + "',"); sqlQuery.Append("MetaFinalIndicador = " + e.NewValues["MetaFinalIndicador"].ToString() + ","); sqlQuery.Append("NivelCriticoIndicador = " + e.NewValues["NivelCriticoIndicador"].ToString() + ","); sqlQuery.Append("EvidenciasIndicador = '" + e.NewValues["EvidenciasIndicador"].ToString() + "',"); sqlQuery.Append("ActividadID = " +ddlActividad.SelectedValue + ","); 102 sqlQuery.Append("LineaBase = " + e.NewValues["LineaBase"].ToString() + ","); sqlQuery.Append("EstadoID = 1,"); sqlQuery.Append("UsuarioID = 1,"); sqlQuery.Append("FechaMetaFinal = '" + String.Format("{0:u}", e.NewValues["FechaMetaFinal"]).Replace("Z", "") + "'"); sqlQuery.Append(" WHERE IndicadorID= "+ e.Keys["IndicadorID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewIndicadores.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowDeleting(object sender, DevExpress.Web.Data.ASPxDataDeletingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("DELETE FROM IND_Indicadores"); sqlQuery.Append(" WHERE IndicadorID = "+ e.Keys["IndicadorID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewIndicadores.CancelEdit(); } 103 c.conexion.Close(); e.Cancel = true; BindGrid(); } private void BindGrid() { try { c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand("select * from IND_Indicadores where ActividadID = " + ddlActividad.SelectedValue); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); ASPxGridViewIndicadores.DataSource = dsClaimCat; ASPxGridViewIndicadores.DataBind(); c.conexion.Close(); } catch { Response.Write("Error"); } } } IngresoMonitoreo.aspx <%@ Page Title="Ingreso de Monitoreo" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="IngresoMonitoreo.aspx.cs" Inherits="IngresoMonitoreo" %> <%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="Server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> 104 </asp:ScriptManager> <asp:Panel ID="pnlFormSection" CssClass="form-section" runat="server"> <asp:Panel ID="pnlPageHeader" CssClass="page-header" runat="server"> <%--Título--%> <asp:Panel ID="pnlTitle" CssClass="page-header" runat="server"> <h1> <asp:Label ID="lblTitle" runat="server"></asp:Label></h1> </asp:Panel> </asp:Panel> <br /> <asp:Panel ID="pnlContainer" CssClass="container" runat="server" ClientIDMode="Static"> <%--<asp:UpdatePanel ID="upPDA" UpdateMode="Conditional" runat="server"> <ContentTemplate>--%> <table> <tr> <td class="label required"> <asp:Label ID="lblPDA" runat="server"></asp:Label> </td> <td> <asp:DropDownList ID="ddlPDA" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlPDA_SelectedIndexChanged"> </asp:DropDownList> </td> </tr> <tr> <td class="label required"> <asp:Label ID="lblProyecto" runat="server"></asp:Label> </td> <td> <asp:DropDownList ID="ddlProyecto" runat="server" AutoPostBack="true" Width="300px" OnSelectedIndexChanged="ddlProyecto_SelectedIndexChanged"> </asp:DropDownList> </td> </tr> <tr> <td class="label required"> <asp:Label ID="lblActividad" runat="server"></asp:Label> </td> <td> <asp:DropDownList ID="ddlActividad" runat="server" AutoPostBack="true" Width="300px" OnSelectedIndexChanged="ddlActividad_SelectedIndexChanged"> </asp:DropDownList> </td> 105 <td class="label required"> <asp:Label ID="lblCodActividad" runat="server"></asp:Label> </td> <td> <asp:TextBox ID="txtCodActividad" runat="server" Enabled="false"></asp:TextBox> </td> </tr> <tr> <td class="label required"> <asp:Label ID="lblAreaProgramatica" runat="server"></asp:Label> </td> <td> <asp:TextBox ID="txtAreaProgramatica" runat="server" Enabled="false" Width="300px"></asp:TextBox> </td> </tr> <tr> <td class="label required"> <asp:Label ID="lblIndicador" runat="server"></asp:Label> </td> <td> <asp:DropDownList ID="ddlIndicador" runat="server" AutoPostBack="true" Width="300px" OnSelectedIndexChanged="ddlIndicador_SelectedIndexChanged"> </asp:DropDownList> </td> </tr> </table> <br /> <dx:ASPxGridView ID="ASPxGridViewIndicador" ClientInstanceName="grid" Visible="false" KeyFieldName="IndicadorID" Width="100%" AutoGenerateColumns="False" runat="server"> <SettingsEditing Mode="Inline" /> <Columns> <dx:GridViewDataTextColumn Caption="Descripción del Indicador" FieldName="DescripcionIndicador" VisibleIndex="1"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> <dx:GridViewDataTextColumn Caption="Meta Final" FieldName="MetaFinalIndicador" VisibleIndex="3"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> <dx:GridViewDataTextColumn Caption="Nivel Crítico" FieldName="NivelCriticoIndicador" VisibleIndex="4"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> 106 <dx:GridViewDataColumn Caption="Fecha Para Meta Final" FieldName="FechaMetaFinal" VisibleIndex="5"> <EditFormSettings Visible="False" /> </dx:GridViewDataColumn> </Columns> </dx:ASPxGridView> <br /> <dx:ASPxGridView ID="ASPxGridViewMonitoreo" ClientInstanceName="grid" KeyFieldName="MonitoreoIndicadorID" Width="100%" AutoGenerateColumns="False" runat="server" Visible="false" OnRowInserting="grid_RowInserting"> <SettingsEditing Mode="Inline" /> <Columns> <dx:GridViewCommandColumn Caption="Acciones" VisibleIndex="0"> <NewButton Visible="True" Text="Ingresar Meta"> </NewButton> </dx:GridViewCommandColumn> <dx:GridViewDataColumn Caption="Meta" FieldName="MetaMonitoreo" VisibleIndex="1"> <EditFormSettings Visible="False" /> </dx:GridViewDataColumn> </Columns> </dx:ASPxGridView> </asp:Panel> </asp:Panel> </asp:Content> IngresoMonitoreo.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using DevExpress.Web.ASPxEditors; using DevExpress.Web.ASPxClasses; using DevExpress.Web.ASPxGridView; using System.IO; using DevExpress.Web.ASPxUploadControl; using System.Data.SqlClient; using System.Text; public partial class IngresoMonitoreo : System.Web.UI.Page { #region Variables private Conexion c = new Conexion(); 107 private ConexionPMA cPMA = new ConexionPMA(); private DataSet codigo = new DataSet(); #endregion protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { LoadResources(); cPMA.CargaDropDownList("select NombrePda, PdaID from PMA_Pda order by NombrePda", ddlPDA); } } #region LoadResources protected void LoadResources() { lblPDA.Text = "Programa de Desarrollo de Área (PDA):"; lblProyecto.Text = "Nombre del Proyecto:"; lblCodActividad.Text = "Código de la Actividad:"; lblActividad.Text = "Actividad:"; lblAreaProgramatica.Text = "Área Programática:"; lblIndicador.Text = "Indicador:"; lblTitle.Text = "Monitoreo de Indicadores"; } #endregion protected void ddlAreaProgramatica_SelectedIndexChanged(object sender, EventArgs e) { cPMA.CargaDropDownList("select a.DescripcionActividad, a.ActividadId from PMA_Resultados r, PMA_Productos p, PMA_Actividades a, PMA_Proyectos py, PMA_CategoriaSector c where r.ResultadoID=p.ResultadoID and p.ProductoID=a.ProductoID and a.CategoriaSectorID=c.CategoriaSectorID and r.ProyectoID= py.ProyectoID and py.PdaID = " + ddlPDA.SelectedValue + " and py.ProyectoID = " + ddlProyecto.SelectedValue, ddlActividad); } protected void ddlProyecto_SelectedIndexChanged(object sender, EventArgs e) { ASPxGridViewIndicador.Visible = false; ASPxGridViewMonitoreo.Visible = false; ddlActividad.Items.Clear(); ddlIndicador.Items.Clear(); txtCodActividad.Text = ""; txtAreaProgramatica.Text = ""; cPMA.CargaDropDownList("select a.DescripcionActividad, a.ActividadId from PMA_Resultados r, PMA_Productos p, PMA_Actividades a, PMA_Proyectos py, PMA_CategoriaSector c where r.ResultadoID=p.ResultadoID and p.ProductoID=a.ProductoID and a.CategoriaSectorID=c.CategoriaSectorID and 108 r.ProyectoID= py.ProyectoID and py.PdaID = " + ddlPDA.SelectedValue + " and py.ProyectoID = " + ddlProyecto.SelectedValue, ddlActividad); } protected void ddlActividad_SelectedIndexChanged(object sender, EventArgs e) { codigo = cPMA.Consulta("select p.MarcoLogicoProducto, a.MarcoLogicoActividad, c.CategoriaSector from PMA_Resultados r, PMA_Productos p, PMA_Actividades a, PMA_Proyectos py, PMA_CategoriaSector c where r.ResultadoID=p.ResultadoID and p.ProductoID=a.ProductoID and a.CategoriaSectorID=c.CategoriaSectorID and r.ProyectoID= py.ProyectoID and py.PdaID = " + ddlPDA.SelectedValue + " and py.ProyectoID = " + ddlProyecto.SelectedValue + " and a.ActividadID = " + ddlActividad.SelectedValue); txtAreaProgramatica.Text = codigo.Tables[0].Rows[0].ItemArray[2].ToString(); txtCodActividad.Text = "01." + "0" + codigo.Tables[0].Rows[0].ItemArray[0].ToString() + ".0" + codigo.Tables[0].Rows[0].ItemArray[1].ToString(); c.CargaDropDownList("select DescripcionIndicador, IndicadorID from IND_Indicadores where ActividadID = " + ddlActividad.SelectedValue, ddlIndicador); } protected void ddlPDA_SelectedIndexChanged(object sender, EventArgs e) { ddlActividad.Items.Clear(); txtCodActividad.Text = ""; txtAreaProgramatica.Text = ""; cPMA.CargaDropDownList("select distinct(NombreProyecto), ProyectoID from PMA_Proyectos where PdaID = " + ddlPDA.SelectedValue, ddlProyecto); } protected void ddlIndicador_SelectedIndexChanged(object sender, EventArgs e) { BindGridIndicador(); ASPxGridViewIndicador.Visible = true; BindGrid(); ASPxGridViewMonitoreo.Visible = true; //UpSeguimiento.Update(); } protected void grid_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("INSERT INTO [IND_MonitoreoIndicador] (IndicadorID, MetaMonitoreo, FechaMonitoreo) VALUES ("); sqlQuery.Append(ddlIndicador.SelectedValue + ","); sqlQuery.Append(e.NewValues["MetaMonitoreo"].ToString() + ","); 109 sqlQuery.Append("'" + String.Format("{0:u}", DateTime.Now).Replace("Z", "") + "')"); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewMonitoreo.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } private void BindGrid() { try { c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand("select * from IND_MonitoreoIndicador where IndicadorID = " + ddlIndicador.SelectedValue); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); ASPxGridViewMonitoreo.DataSource = dsClaimCat; ASPxGridViewMonitoreo.DataBind(); c.conexion.Close(); } catch { Response.Write("Error"); } } private void BindGridIndicador() { 110 try { c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand("select * from IND_Indicadores where ActividadID = " + ddlActividad.SelectedValue + " and IndicadorID = " + ddlIndicador.SelectedValue); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); ASPxGridViewIndicador.DataSource = dsClaimCat; ASPxGridViewIndicador.DataBind(); c.conexion.Close(); } catch { Response.Write("Error"); } } } Pantallas.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Pantallas.aspx.cs" Inherits="Pantallas" %> <%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %> <asp:Content ID="HeaderContent" ContentPlaceHolderID="HeadContent" runat="Server"> </asp:Content> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="Server"> <asp:Panel ID="pnlFormSection" CssClass="form-section" runat="server"> <asp:Panel ID="pnlPageHeader" CssClass="page-header" runat="server"> <%--Título--%> <asp:Panel ID="pnlTitle" CssClass="page-header" runat="server"> <h1> 111 <asp:Label ID="lblTitle" runat="server"></asp:Label></h1> </asp:Panel> </asp:Panel> <br /> <dx:ASPxGridView ID="ASPxGridViewPantallas" ClientInstanceName="grid" KeyFieldName="PantallaID" OnRowInserting="grid_RowInserting" Width="100%" AutoGenerateColumns="False" OnRowUpdating="grid_RowUpdating" OnRowDeleting="grid_RowDeleting" runat="server"> <SettingsEditing Mode="Inline" /> <Columns> <dx:GridViewCommandColumn VisibleIndex="0"> <EditButton Visible="True" Text="Actualizar"> </EditButton> <NewButton Visible="True" Text="Crear"> </NewButton> <DeleteButton Visible="True" Text="Eliminar"> </DeleteButton> </dx:GridViewCommandColumn> <dx:GridViewDataTextColumn Caption = "Pantalla" FieldName="NombrePantalla" VisibleIndex="1"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> <dx:GridViewDataTextColumn Caption = "Módulo" FieldName="ModuloPantalla" VisibleIndex="2"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> <dx:GridViewDataTextColumn Caption = "Orden" FieldName="OrdenPantalla" VisibleIndex="3"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> </Columns> </dx:ASPxGridView> </asp:Panel> </asp:Content> Pantallas.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Text; 112 using System.Data.SqlClient; public partial class Pantallas : System.Web.UI.Page { #region Variables private Conexion c = new Conexion(); private ConexionPMA cPMA = new ConexionPMA(); private DataSet codigo = new DataSet(); #endregion protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { BindGrid(); lblTitle.Text = "Pantallas"; } } protected void grid_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("INSERT INTO [IND_Pantallas] ([NombrePantalla], [ModuloPantalla], [OrdenPantalla]) VALUES ("); sqlQuery.Append("'" + e.NewValues["NombrePantalla"].ToString() + "', "); sqlQuery.Append("'" + e.NewValues["ModuloPantalla"].ToString() + "', "); sqlQuery.Append(e.NewValues["OrdenPantalla"].ToString() + ")"); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewPantallas.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e) 113 { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("UPDATE IND_Pantallas SET "); sqlQuery.Append("NombrePantalla = '" + e.NewValues["NombrePantalla"].ToString() + "', "); sqlQuery.Append("ModuloPantalla = '" + e.NewValues["ModuloPantalla"].ToString() + "', "); sqlQuery.Append("OrdenPantalla = " + e.NewValues["OrdenPantalla"].ToString()); sqlQuery.Append(" WHERE PantallaID= " + e.Keys["PantallaID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewPantallas.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowDeleting(object sender, DevExpress.Web.Data.ASPxDataDeletingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("DELETE FROM IND_Pantallas"); sqlQuery.Append(" WHERE PantallaID = " + e.Keys["PantallaID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewPantallas.CancelEdit(); } 114 c.conexion.Close(); e.Cancel = true; BindGrid(); } private void BindGrid() { try { c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand("select * from IND_Pantallas"); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); ASPxGridViewPantallas.DataSource = dsClaimCat; ASPxGridViewPantallas.DataBind(); c.conexion.Close(); } catch { Response.Write("Error"); } } } Perfiles.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Perfiles.aspx.cs" Inherits="Perfiles" %> <%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %> <asp:Content ID="HeaderContent" ContentPlaceHolderID="HeadContent" runat="Server"> </asp:Content> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="Server"> <asp:Panel ID="pnlPageHeader" CssClass="page-header" runat="server"> <%--Título--%> 115 <asp:Panel ID="pnlTitle" CssClass="page-header" runat="server"> <h1> <asp:Label ID="lblTitle" runat="server"></asp:Label></h1> </asp:Panel> </asp:Panel> <br /> <asp:Panel ID="pnlFormSection" CssClass="form-section" runat="server"> <asp:Panel ID="pnlContainer" CssClass="container" runat="server" ClientIDMode="Static"> <dx:ASPxGridView ID="ASPxGridViewPerfiles" ClientInstanceName="grid" KeyFieldName="PerfilID" OnRowInserting="grid_RowInserting" Width="100%" AutoGenerateColumns="False" OnRowUpdating="grid_RowUpdating" OnRowDeleting="grid_RowDeleting" runat="server"> <SettingsEditing Mode="Inline" /> <Columns> <dx:GridViewCommandColumn VisibleIndex="0"> <EditButton Visible="True" Text="Actualizar"> </EditButton> <NewButton Visible="True" Text="Crear"> </NewButton> <DeleteButton Visible="True" Text="Eliminar"> </DeleteButton> </dx:GridViewCommandColumn> <dx:GridViewDataTextColumn FieldName="NombrePerfil" VisibleIndex="1"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> </Columns> </dx:ASPxGridView> </asp:Panel> </asp:Panel> </asp:Content> Perfiles.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Text; using System.Data.SqlClient; public partial class Perfiles : System.Web.UI.Page { #region Variables 116 private Conexion c = new Conexion(); private ConexionPMA cPMA = new ConexionPMA(); private DataSet codigo = new DataSet(); #endregion protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { BindGrid(); lblTitle.Text = "Perfiles"; } } protected void grid_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("INSERT INTO [IND_Perfiles] ([NombrePerfil]) VALUES ("); sqlQuery.Append("'" + e.NewValues["NombrePerfil"].ToString() + "')"); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewPerfiles.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("UPDATE IND_Perfiles SET "); sqlQuery.Append("NombrePerfil = '" + e.NewValues["NombrePerfil"].ToString() + "'"); sqlQuery.Append(" WHERE PerfilID = " + e.Keys["PerfilID"].ToString()); c.conexion.Open(); SqlCommand cmd; 117 cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewPerfiles.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowDeleting(object sender, DevExpress.Web.Data.ASPxDataDeletingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("DELETE FROM IND_Perfiles"); sqlQuery.Append(" WHERE PerfilID = " + e.Keys["PerfilID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewPerfiles.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } private void BindGrid() { try { c.conexion.Open(); SqlCommand cmd; 118 cmd = new SqlCommand("select * from IND_Perfiles"); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); ASPxGridViewPerfiles.DataSource = dsClaimCat; ASPxGridViewPerfiles.DataBind(); c.conexion.Close(); } catch { Response.Write("Error"); } } } Seguimiento.aspx <%@ Page Title="Seguimiento y Resultados" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Seguimiento.aspx.cs" Inherits="Seguimiento" %> <%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %> <%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="Server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <asp:Panel ID="pnlFormSection" CssClass="form-section" runat="server"> <asp:Panel ID="pnlPageHeader" CssClass="page-header" runat="server"> <%--Título--%> <asp:Panel ID="pnlTitle" CssClass="page-header" runat="server"> <h1> <asp:Label ID="lblTitle" runat="server"></asp:Label></h1> </asp:Panel> </asp:Panel> <br /> <asp:Panel ID="pnlContainer" CssClass="container" runat="server" ClientIDMode="Static"> 119 <asp:UpdatePanel ID="upPDA" UpdateMode="Conditional" runat="server"> <ContentTemplate> <table> <tr> <td class="label required"> <asp:Label ID="lblPDA" runat="server"></asp:Label> </td> <td> <asp:DropDownList ID="ddlPDA" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlPDA_SelectedIndexChanged"> </asp:DropDownList> </td> </tr> <tr> <td class="label required"> <asp:Label ID="lblProyecto" runat="server"></asp:Label> </td> <td> <asp:DropDownList ID="ddlProyecto" runat="server" AutoPostBack="true" Width="300px" OnSelectedIndexChanged="ddlProyecto_SelectedIndexChanged"> </asp:DropDownList> </td> </tr> <tr> <td class="label required"> <asp:Label ID="lblActividad" runat="server"></asp:Label> </td> <td> <asp:DropDownList ID="ddlActividad" runat="server" AutoPostBack="true" Width="300px" OnSelectedIndexChanged="ddlActividad_SelectedIndexChanged"> </asp:DropDownList> </td> <td class="label required"> <asp:Label ID="lblCodActividad" runat="server"></asp:Label> </td> <td> <asp:TextBox ID="txtCodActividad" runat="server" Enabled="false"></asp:TextBox> </td> </tr> <tr> <td class="label required"> <asp:Label ID="lblAreaProgramatica" runat="server"></asp:Label> 120 </td> <td> <asp:TextBox ID="txtAreaProgramatica" runat="server" Enabled="false" Width="300px"></asp:TextBox> </td> </tr> <tr> <td class="label required"> <asp:Label ID="lblIndicador" runat="server"></asp:Label> </td> <td> <asp:DropDownList ID="ddlIndicador" runat="server" AutoPostBack="true" Width="300px" OnSelectedIndexChanged="ddlIndicador_SelectedIndexChanged"> </asp:DropDownList> </td> </tr> </table> <br /> </ContentTemplate> </asp:UpdatePanel> <br /> <asp:UpdatePanel ID="UpSeguimiento" UpdateMode="Conditional" runat="server"> <ContentTemplate> <div class="contenedor-tabla"> <div class="contenedor-fila"> <div class="contenedor-columna"> <CR:CrystalReportViewer ID="VisorCR1" runat="server" AutoDataBind="true" /> </div> </div> <br /> <div class="contenedor-fila"> <div class="contenedor-columna"> <CR:CrystalReportViewer ID="VisorCR2" runat="server" AutoDataBind="true" /> </div> </div> <br /> <div class="contenedor-fila"> <div class="contenedor-columna"> <CR:CrystalReportViewer ID="VisorCR3" runat="server" AutoDataBind="true" /> </div> </div> <br /> <div class="contenedor-fila"> <div class="contenedor-columna"> 121 <CR:CrystalReportViewer ID="VisorCR4" runat="server" AutoDataBind="true" /> </div> </div> </div> </ContentTemplate> </asp:UpdatePanel> </asp:Panel> </asp:Panel> </asp:Content> Seguimiento.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using DevExpress.Web.ASPxEditors; using DevExpress.Web.ASPxClasses; using DevExpress.Web.ASPxGridView; using System.Data.SqlClient; using System.Text; using DevExpress.Web.ASPxUploadControl; using System.IO; using Microsoft.Reporting.WebForms; using CrystalDecisions.CrystalReports.Engine; public partial class Seguimiento : System.Web.UI.Page { #region Variables private Conexion c = new Conexion(); private ConexionPMA cPMA = new ConexionPMA(); private DataSet codigo = new DataSet(); private DataSet sentencia = new DataSet(); #endregion protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { LoadResources(); cPMA.CargaDropDownList("select NombrePda, PdaID from PMA_Pda order by NombrePda", ddlPDA); } } 122 #region LoadResources protected void LoadResources() { lblPDA.Text = "Programa de Desarrollo de Área (PDA):"; lblProyecto.Text = "Nombre del Proyecto:"; lblCodActividad.Text = "Código de la Actividad:"; lblActividad.Text = "Actividad:"; lblAreaProgramatica.Text = "Área Programática:"; lblIndicador.Text = "Indicador:"; lblTitle.Text = "Seguimiento de Indicadores"; } #endregion protected void ddlAreaProgramatica_SelectedIndexChanged(object sender, EventArgs e) { cPMA.CargaDropDownList("select a.DescripcionActividad, a.ActividadId from PMA_Resultados r, PMA_Productos p, PMA_Actividades a, PMA_Proyectos py, PMA_CategoriaSector c where r.ResultadoID=p.ResultadoID and p.ProductoID=a.ProductoID and a.CategoriaSectorID=c.CategoriaSectorID and r.ProyectoID= py.ProyectoID and py.PdaID = " + ddlPDA.SelectedValue + " and py.ProyectoID = " + ddlProyecto.SelectedValue, ddlActividad); } protected void ddlProyecto_SelectedIndexChanged(object sender, EventArgs e) { ddlActividad.Items.Clear(); ddlIndicador.Items.Clear(); txtCodActividad.Text = ""; txtAreaProgramatica.Text = ""; cPMA.CargaDropDownList("select a.DescripcionActividad, a.ActividadId from PMA_Resultados r, PMA_Productos p, PMA_Actividades a, PMA_Proyectos py, PMA_CategoriaSector c where r.ResultadoID=p.ResultadoID and p.ProductoID=a.ProductoID and a.CategoriaSectorID=c.CategoriaSectorID and r.ProyectoID= py.ProyectoID and py.PdaID = " + ddlPDA.SelectedValue + " and py.ProyectoID = " + ddlProyecto.SelectedValue, ddlActividad); VisorCR1.Visible = false; VisorCR2.Visible = false; VisorCR3.Visible = false; VisorCR4.Visible = false; UpSeguimiento.Update(); } protected void ddlActividad_SelectedIndexChanged(object sender, EventArgs e) { codigo = cPMA.Consulta("select p.MarcoLogicoProducto, a.MarcoLogicoActividad, c.CategoriaSector from PMA_Resultados r, PMA_Productos p, PMA_Actividades a, PMA_Proyectos py, 123 PMA_CategoriaSector c where r.ResultadoID=p.ResultadoID and p.ProductoID=a.ProductoID and a.CategoriaSectorID=c.CategoriaSectorID and r.ProyectoID= py.ProyectoID and py.PdaID = " + ddlPDA.SelectedValue + " and py.ProyectoID = " + ddlProyecto.SelectedValue + " and a.ActividadID = " + ddlActividad.SelectedValue); txtAreaProgramatica.Text = codigo.Tables[0].Rows[0].ItemArray[2].ToString(); txtCodActividad.Text = "01." + "0" + codigo.Tables[0].Rows[0].ItemArray[0].ToString() + ".0" + codigo.Tables[0].Rows[0].ItemArray[1].ToString(); c.CargaDropDownList("select DescripcionIndicador, IndicadorID from IND_Indicadores where ActividadID = " + ddlActividad.SelectedValue, ddlIndicador); } protected void ddlPDA_SelectedIndexChanged(object sender, EventArgs e) { ddlActividad.Items.Clear(); ddlIndicador.Items.Clear(); txtCodActividad.Text = ""; txtAreaProgramatica.Text = ""; cPMA.CargaDropDownList("select distinct(NombreProyecto), ProyectoID from PMA_Proyectos where PdaID = " + ddlPDA.SelectedValue, ddlProyecto); VisorCR1.Visible = false; VisorCR2.Visible = false; VisorCR3.Visible = false; VisorCR4.Visible = false; UpSeguimiento.Update(); } protected void ddlIndicador_SelectedIndexChanged(object sender, EventArgs e) { BindGridIndicador(); BindGridMonitoreo(); try { #region Indicadores var reporteIndicadores = new ReportDocument(); var rutaReporteI = Server.MapPath("Reportes\\GeneralIndicador.rpt"); reporteIndicadores.Load(rutaReporteI); reporteIndicadores.SetDataSource(c.Consulta("select p.MarcoLogicoProducto, c.MarcoLogicoActividad," + "d.NombrePda," + "py.NombreProyecto," + "c.DescripcionActividad, " + "cs.CategoriaSector, " + "a.DescripcionIndicador, " + "a.NivelCriticoIndicador, " + "a.MetaFinalIndicador, " + 124 "a.FechaMetaFinal, " + "SUBSTRING(convert(varchar, b.FechaMonitoreo, 103), 1, 11) FechaMonitoreo, " + "b.MetaMonitoreo , " + "((MetaMonitoreo * 100)/ MetaFinalIndicador) PorcentajeCumplimiento " + "from INDDB..IND_Indicadores a," + "INDDB..IND_MonitoreoIndicador b, " + "PMADB2..PMA_Actividades c, " + "PMADB2..PMA_Resultados r, " + "PMADB2..PMA_Productos p," + "PMADB2..PMA_Proyectos py," + "PMADB2..PMA_CategoriaSector cs," + "PMADB2..PMA_Pda d " + "where a.IndicadorID = b.IndicadorID " + "and a.ActividadID = c.ActividadID " + "and r.ResultadoID = p.ResultadoID " + "and p.ProductoID = c.ProductoID " + "and c.CategoriaSectorID = cs.CategoriaSectorID " + "and r.ProyectoID = py.ProyectoID " + "and py.PdaID = d.PdaID " + "and py.PdaID = " + ddlPDA.SelectedValue + "and py.ProyectoID = " + ddlProyecto.SelectedValue + "and a.ActividadID = " + ddlActividad.SelectedValue + "and a.IndicadorID = " + ddlIndicador.SelectedValue).Tables[0]); VisorCR1.ReportSource = reporteIndicadores; VisorCR1.DisplayGroupTree = false; #endregion #region Metas var reporte = new ReportDocument(); var rutaReporteP = Server.MapPath("Reportes\\CumplimientoActividad.rpt"); reporte.Load(rutaReporteP); reporte.SetDataSource(c.Consulta("select a.ActividadID, a.IndicadorID, a.DescripcionIndicador, b.FechaMonitoreo, b.MetaMonitoreo , ((MetaMonitoreo * 100)/ MetaFinalIndicador) PorcentajeCumplimiento from IND_MonitoreoIndicador b, IND_Indicadores a where a.IndicadorID = b.IndicadorID and a.ActividadID = " + ddlActividad.SelectedValue).Tables[0]); VisorCR2.ReportSource = reporte; VisorCR2.DisplayGroupTree = false; #endregion #region Proyecto var reporteProyecto = new ReportDocument(); var rutaReporteProyecto = Server.MapPath("Reportes\\Proyecto.rpt"); 125 reporteProyecto.Load(rutaReporteProyecto); reporteProyecto.SetDataSource(c.Consulta("select py.NombreProyecto Proyecto," + "((MetaMonitoreo * 100)/ MetaFinalIndicador) PorcentajeCumplimiento " + "from INDDB..IND_Indicadores a," + "INDDB..IND_MonitoreoIndicador b, " + "PMADB2..PMA_Actividades c, " + "PMADB2..PMA_Resultados r, " + "PMADB2..PMA_Productos p," + "PMADB2..PMA_Proyectos py," + "PMADB2..PMA_CategoriaSector cs," + "PMADB2..PMA_Pda d " + "where a.IndicadorID = b.IndicadorID " + "and a.ActividadID = c.ActividadID " + "and r.ResultadoID = p.ResultadoID " + "and p.ProductoID = c.ProductoID " + "and c.CategoriaSectorID = cs.CategoriaSectorID "+ "and r.ProyectoID = py.ProyectoID " + "and py.PdaID = d.PdaID " + "and py.PdaID = " + ddlPDA.SelectedValue + " and py.ProyectoID = " + ddlProyecto.SelectedValue).Tables[0]); VisorCR3.ReportSource = reporteProyecto; VisorCR3.DisplayGroupTree = false; #endregion #region Proyectos var reporteActividades = new ReportDocument(); var rutaReporteA = Server.MapPath("Reportes\\CumplimientoProyectos.rpt"); reporteActividades.Load(rutaReporteA); VisorCR4.ReportSource = reporteActividades; VisorCR4.DisplayGroupTree = false; #endregion UpSeguimiento.Update(); c.conexion.Close(); } catch (Exception ex) { throw ex; } finally { c.conexion.Close(); } } 126 private void BindGridIndicador() { try { c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand("select * from IND_Indicadores where ActividadID = " + ddlActividad.SelectedValue + " and IndicadorID = " + ddlIndicador.SelectedValue); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); c.conexion.Close(); } catch (Exception ex) { throw ex; } finally { c.conexion.Close(); } } private void BindGridMonitoreo() { try { c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand("select b.FechaMonitoreo, b.MetaMonitoreo , ((MetaMonitoreo * 100)/ MetaFinalIndicador) Porcentaje from IND_MonitoreoIndicador b, IND_Indicadores a where a.IndicadorID = b.IndicadorID and a.IndicadorID =" + ddlIndicador.SelectedValue); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); c.conexion.Close(); } catch (Exception ex) { throw ex; 127 } finally { c.conexion.Close(); } } } UnidadesIndicadores.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="UnidadesIndicadores.aspx.cs" Inherits="UnidadesIndicadores" %> <%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %> <asp:Content ID="HeaderContent" ContentPlaceHolderID="HeadContent" runat="Server"> </asp:Content> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="Server"> <asp:Panel ID="pnlPageHeader" CssClass="page-header" runat="server"> <%--Título--%> <asp:Panel ID="pnlTitle" CssClass="page-header" runat="server"> <h1> <asp:Label ID="lblTitle" runat="server"></asp:Label></h1> </asp:Panel> </asp:Panel> <br /> <asp:Panel ID="pnlFormSection" CssClass="form-section" runat="server"> <asp:Panel ID="pnlContainer" CssClass="container" runat="server" ClientIDMode="Static"> <dx:ASPxGridView ID="ASPxGridViewUnidadesIndicadores" ClientInstanceName="grid" KeyFieldName="EstadoID" OnRowInserting="grid_RowInserting" Width="100%" AutoGenerateColumns="False" OnRowUpdating="grid_RowUpdating" OnRowDeleting="grid_RowDeleting" runat="server"> <SettingsEditing Mode="Inline" /> <Columns> <dx:GridViewCommandColumn VisibleIndex="0"> <EditButton Visible="True" Text="Actualizar"> </EditButton> <NewButton Visible="True" Text="Crear"> 128 </NewButton> <DeleteButton Visible="True" Text="Eliminar"> </DeleteButton> </dx:GridViewCommandColumn> <dx:GridViewDataTextColumn Caption="Nemónico" FieldName="NemonicoUnidad" VisibleIndex="1"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> <dx:GridViewDataTextColumn Caption="Estado" FieldName="DescripcionUnidad" VisibleIndex="2"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> </Columns> </dx:ASPxGridView> <asp:SqlDataSource ID="SqlDataSourceUnidadesIndicadores" ConnectionString="<%$ ConnectionStrings:INDDBConnectionString %>" runat="server" SelectCommand="select * from IND_Unidades"> </asp:SqlDataSource> </asp:Panel> </asp:Panel> </asp:Content> UnidadesIndicadores.aspx.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Data.SqlClient; using System.Text; public partial class UnidadesIndicadores : System.Web.UI.Page { #region Variables private Conexion c = new Conexion(); private ConexionPMA cPMA = new ConexionPMA(); private DataSet codigo = new DataSet(); #endregion protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { BindGrid(); lblTitle.Text = "Unidades de Indicadores"; } 129 } protected void grid_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("INSERT INTO [IND_Unidades] (NemonicoUnidad, DescripcionUnidad) VALUES ("); sqlQuery.Append("'" + e.NewValues["NemonicoUnidad"].ToString() + "',"); sqlQuery.Append("'" + e.NewValues["DescripcionUnidad"].ToString() + "')"); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewUnidadesIndicadores.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("UPDATE IND_Unidades SET "); sqlQuery.Append("NemonicoUnidad = '" + e.NewValues["NemonicoUnidad"].ToString() + "'"); sqlQuery.Append("DescripcionUnidad = '" + e.NewValues["DescripcionUnidad"].ToString() + "'"); sqlQuery.Append(" WHERE UnidadID = " + e.Keys["UnidadID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); 130 if (i > 0) { e.Cancel = true; ASPxGridViewUnidadesIndicadores.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowDeleting(object sender, DevExpress.Web.Data.ASPxDataDeletingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("DELETE FROM IND_Unidades"); sqlQuery.Append(" WHERE UnidadID = " + e.Keys["UnidadID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewUnidadesIndicadores.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } private void BindGrid() { try { c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand("select * from IND_Unidades"); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); 131 ASPxGridViewUnidadesIndicadores.DataSource = dsClaimCat; ASPxGridViewUnidadesIndicadores.DataBind(); c.conexion.Close(); } catch { Response.Write("Error"); } } } Usuarios.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Usuarios.aspx.cs" Inherits="Usuarios" %> <%@ Register Assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGridView" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxEditors" TagPrefix="dx" %> <asp:Content ID="HeaderContent" ContentPlaceHolderID="HeadContent" runat="Server"> </asp:Content> <asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="Server"> <asp:Panel ID="pnlFormSection" CssClass="form-section" runat="server"> <asp:Panel ID="pnlPageHeader" CssClass="page-header" runat="server"> <%--Título--%> <asp:Panel ID="pnlTitle" CssClass="page-header" runat="server"> <h1> <asp:Label ID="lblTitle" runat="server"></asp:Label></h1> </asp:Panel> </asp:Panel> <br /> <dx:ASPxGridView ID="ASPxGridViewUsuarios" ClientInstanceName="grid" KeyFieldName="UsuarioID" OnRowInserting="grid_RowInserting" Width="100%" AutoGenerateColumns="False" OnRowUpdating="grid_RowUpdating" OnRowDeleting="grid_RowDeleting" runat="server"> <SettingsEditing Mode="Inline" /> <Columns> <dx:GridViewCommandColumn VisibleIndex="0"> <EditButton Visible="True" Text="Actualizar"> </EditButton> <NewButton Visible="True" Text="Crear"> 132 </NewButton> <DeleteButton Visible="True" Text="Eliminar"> </DeleteButton> </dx:GridViewCommandColumn> <dx:GridViewDataComboBoxColumn Caption="Perfil" FieldName="PerfilID" ShowInCustomizationForm="True" VisibleIndex="1"> <PropertiesComboBox DataSourceID="SqlDataSourcePerfiles" ValueType="System.Int32" ValueField="PerfilID" TextField="NombrePerfil" Spacing="0"> </PropertiesComboBox> </dx:GridViewDataComboBoxColumn> <dx:GridViewDataComboBoxColumn Caption="Cargo" FieldName="CargoID" ShowInCustomizationForm="True" VisibleIndex="2"> <PropertiesComboBox DataSourceID="SqlDataSourceCargos" ValueType="System.Int32" ValueField="CargoID" TextField="NombreCargo" Spacing="0"> </PropertiesComboBox> </dx:GridViewDataComboBoxColumn> <dx:GridViewDataTextColumn FieldName="NombreUsuario" VisibleIndex="3"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> <dx:GridViewDataTextColumn FieldName="Usuario" VisibleIndex="4"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> <dx:GridViewDataTextColumn FieldName="Clave" VisibleIndex="5"> <EditFormSettings Visible="False" /> </dx:GridViewDataTextColumn> </Columns> </dx:ASPxGridView> <asp:SqlDataSource ID="SqlDataSourceUsuarios" ConnectionString="<%$ ConnectionStrings:INDDBConnectionString %>" runat="server" SelectCommand="select * from IND_Usuarios"> </asp:SqlDataSource> <asp:SqlDataSource ID="SqlDataSourceCargos" ConnectionString="<%$ ConnectionStrings:INDDBConnectionString %>" runat="server" SelectCommand="select * from IND_Cargos"> </asp:SqlDataSource> <asp:SqlDataSource ID="SqlDataSourcePerfiles" ConnectionString="<%$ ConnectionStrings:INDDBConnectionString %>" runat="server" SelectCommand="select * from IND_Perfiles"> </asp:SqlDataSource> </asp:Panel> </asp:Content> Usuarios.aspx.cs using System; 133 using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Text; using System.Data.SqlClient; public partial class Usuarios : System.Web.UI.Page { #region Variables private Conexion c = new Conexion(); private ConexionPMA cPMA = new ConexionPMA(); private DataSet codigo = new DataSet(); #endregion protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { BindGrid(); lblTitle.Text = "Usuarios"; } } protected void grid_RowInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("INSERT INTO [IND_Usuarios] ([PerfilID], [CargoID], [NombreUsuario], [Usuario], [Clave]) VALUES ("); sqlQuery.Append(e.NewValues["PerfilID"].ToString() + ","); sqlQuery.Append(e.NewValues["CargoID"].ToString() + ","); sqlQuery.Append("'" + e.NewValues["NombreUsuario"].ToString() + "', "); sqlQuery.Append("'" + e.NewValues["Usuario"].ToString() + "', "); sqlQuery.Append("'" + e.NewValues["Clave"].ToString() + "')"); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewUsuarios.CancelEdit(); 134 } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowUpdating(object sender, DevExpress.Web.Data.ASPxDataUpdatingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("UPDATE IND_Usuarios SET "); sqlQuery.Append("PerfilID = " + e.NewValues["PerfilID"].ToString() + ","); sqlQuery.Append("CargoID = " + e.NewValues["CargoID"].ToString() + ","); sqlQuery.Append("NombreUsuario = '" + e.NewValues["NombreUsuario"].ToString() + "', "); sqlQuery.Append("Usuario = '" + e.NewValues["Usuario"].ToString() + "', "); sqlQuery.Append("Clave = '" + e.NewValues["Clave"].ToString() + "'"); sqlQuery.Append(" WHERE UsuarioID= " + e.Keys["UsuarioID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewUsuarios.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } protected void grid_RowDeleting(object sender, DevExpress.Web.Data.ASPxDataDeletingEventArgs e) { StringBuilder sqlQuery = new StringBuilder(); sqlQuery.Append("DELETE FROM IND_Usuarios"); sqlQuery.Append(" WHERE UsuarioID = " + e.Keys["UsuarioID"].ToString()); c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand(sqlQuery.ToString()); cmd.Connection = c.conexion; 135 DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); int i = cmd.ExecuteNonQuery(); if (i > 0) { e.Cancel = true; ASPxGridViewUsuarios.CancelEdit(); } c.conexion.Close(); e.Cancel = true; BindGrid(); } private void BindGrid() { try { c.conexion.Open(); SqlCommand cmd; cmd = new SqlCommand("select * from IND_Usuarios"); cmd.Connection = c.conexion; DataSet dsClaimCat = new DataSet(); SqlDataAdapter dapt = new SqlDataAdapter(cmd); dapt.Fill(dsClaimCat); ASPxGridViewUsuarios.DataSource = dsClaimCat; ASPxGridViewUsuarios.DataBind(); c.conexion.Close(); } catch { Response.Write("Error"); } } } 2.9 Web.config Ilustración 46 Cadena de conexión En este archivo se incluye la cadena de conexión a la base de datos. Su contenido es el siguiente: 136 <?xml version="1.0"?> <!-For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <configSections> <sectionGroup name="devExpress"> <section name="settings" type="DevExpress.Web.ASPxClasses.SettingsConfigurationSection, DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" requirePermission="false"/> <section name="compression" type="DevExpress.Web.ASPxClasses.CompressionConfigurationSection, DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" requirePermission="false"/> <section name="themes" type="DevExpress.Web.ASPxClasses.ThemesConfigurationSection, DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" requirePermission="false"/> <section name="errors" type="DevExpress.Web.ASPxClasses.ErrorsConfigurationSection, DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" requirePermission="false"/> </sectionGroup> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="rptBuildProvider" type="CrystalDecisions.Shared.RptBuildProviderHandler, CrystalDecisions.Shared, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304, Custom=null"/> </sectionGroup> </sectionGroup> </configSections> <appSettings> <add key="CrystalImageCleaner-AutoStart" value="true"/> <add key="CrystalImageCleaner-Sleep" value="60000"/> <add key="CrystalImageCleaner-Age" value="120000"/> </appSettings> <connectionStrings> <add name="INDDBConnectionString" connectionString="Server=localhost;Database=INDDB;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/> <add name="PMADBConnectionString" connectionString="Server=localhost;Database=PMADB2;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/> <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated 137 Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/> <add name="INDDBConnectionStringManual" connectionString="Data Source=HP-PC;Initial Catalog=INDDB;Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings> <system.web> <pages validateRequest="false" clientIDMode="AutoID"> <namespaces> <add namespace="System.Collections.Generic"/> </namespaces> <controls> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxClasses" assembly="DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxCallback" assembly="DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxCallbackPanel" assembly="DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxDataView" assembly="DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxMenu" assembly="DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxNavBar" assembly="DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxPanel" assembly="DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxPopupControl" assembly="DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxRoundPanel" assembly="DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxTabControl" assembly="DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxEditors" assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxGridView" assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> 138 <add tagPrefix="dx" namespace="DevExpress.Web.ASPxGridView.Export" assembly="DevExpress.Web.ASPxGridView.v11.1.Export, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Web.ASPxGridLookup" assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="dx" namespace="DevExpress.Xpo" assembly="DevExpress.Xpo.v11.1.Web, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add tagPrefix="CR" namespace="CrystalDecisions.Web" assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> </controls> </pages> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="DevExpress.Web.ASPxGridView.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="DevExpress.Web.ASPxEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="DevExpress.Data.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="DevExpress.CodeParser.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add assembly="DevExpress.Xpo.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add assembly="DevExpress.Xpo.v11.1.Web, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add assembly="DevExpress.Web.ASPxGridView.v11.1.Export, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add assembly="DevExpress.Web.ASPxThemes.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a"/> <add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="DevExpress.XtraCharts.v11.1.Web, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="DevExpress.XtraCharts.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="DevExpress.Charts.v11.1.Core, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="DevExpress.Utils.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="DevExpress.XtraEditors.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> 139 <add assembly="DevExpress.Printing.v11.1.Core, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="DevExpress.XtraReports.v11.1.Web, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="DevExpress.XtraReports.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.Shared, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.ReportSource, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.ReportAppServer.Controllers, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.ReportAppServer.DataDefModel, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.CrystalReports.Engine, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> <add assembly="CrystalDecisions.ReportAppServer.ClientDoc, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> <add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> <add assembly="DevExpress.Web.ASPxGauges.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="DevExpress.XtraGauges.v11.1.Core, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> <add assembly="DevExpress.XtraGauges.v11.1.Presets, Version=11.1.4.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A"/> </assemblies> <buildProviders> <add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> <add extension=".rpt" type="CrystalDecisions.Web.Compilation.RptBuildProvider, CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> </buildProviders> </compilation> <authentication mode="Forms"> <forms loginUrl="~/Account/Login2.aspx" timeout="20"/> 140 </authentication> <membership> <providers> <clear/> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/"/> </providers> </membership> <profile> <providers> <clear/> <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> </providers> </profile> <roleManager enabled="false"> <providers> <clear/> <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/"/> <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/"/> </providers> </roleManager> <httpModules> <add type="DevExpress.Web.ASPxClasses.ASPxHttpHandlerModule, DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" name="ASPxHttpHandlerModule"/> </httpModules> <httpHandlers> <add path="ASPxUploadProgressHandlerPage.ashx" verb="GET,POST" type="DevExpress.Web.ASPxUploadControl.ASPxUploadProgressHttpHandler, DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" validate="false"/> <add path="CrystalImageHandler.aspx" verb="GET" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> <add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/> </httpHandlers> </system.web> 141 <system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add type="DevExpress.Web.ASPxClasses.ASPxHttpHandlerModule, DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" name="ASPxHttpHandlerModule"/> </modules> <validation validateIntegratedModeConfiguration="false"/> <handlers> <add type="DevExpress.Web.ASPxUploadControl.ASPxUploadProgressHttpHandler, DevExpress.Web.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" verb="GET,POST" path="ASPxUploadProgressHandlerPage.ashx" name="ASPxUploadProgressHandler" preCondition="integratedMode"/> <add name="CrystalImageHandler.aspx_GET" verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304" preCondition="integratedMode"/> <add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> </handlers> </system.webServer> <devExpress> <settings rightToLeft="false"/> <compression enableHtmlCompression="false" enableCallbackCompression="true" enableResourceCompression="true" enableResourceMerging="false"/> <themes enableThemesAssembly="true"/> <errors callbackErrorRedirectUrl=""/> </devExpress> <businessObjects> <crystalReports> <rptBuildProvider> <add embedRptInResource="true"/> </rptBuildProvider> </crystalReports> </businessObjects> </configuration> 2.10 Site.master El sitio web utiliza Master Page, cuyo contenido es el siguiente: 142 <%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="SiteMaster" %> <%@ Register Assembly="DevExpress.Web.ASPxGauges.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGauges" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxGauges.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGauges.Gauges" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxGauges.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGauges.Gauges.Linear" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxGauges.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGauges.Gauges.Circular" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxGauges.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGauges.Gauges.State" TagPrefix="dx" %> <%@ Register Assembly="DevExpress.Web.ASPxGauges.v11.1, Version=11.1.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" Namespace="DevExpress.Web.ASPxGauges.Gauges.Digital" TagPrefix="dx" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head id="Head1" runat="server"> <%--Estilos --%> <link href="~/Styles/Site.css" rel="stylesheet" type="text/css" /> <link href="~/Styles/menu.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> <%--Toggles the icon ?--%> <script type="text/javascript"> $(document).ready(function () { $('.toggle-login').click(function () { $(this).next('#login-content').slideToggle(); $(this).toggleClass('active'); if ($(this).hasClass('active')) $(this).find('span').html('&#x25B2;') else $(this).find('span').html('&#x25BC;') }) }); </script> <%--Handling Menu and items--%> <script type="text/javascript"> $(document).ready(function () { 143 $(".mainmenu").click(function () { var X = $(this).attr('id'); if (X == 1) { $(".submenu").hide(); $(this).attr('id', '0'); } else { $(".submenu").show(); $(this).attr('id', '1'); } }); //Mouse click on sub menus $(".submenu").mouseup(function () { return false }); //Mouse click on my account link $(".mainmenu").mouseup(function () { return false }); //On Document Click $(document).mouseup(function () { $(".submenu").hide(); $(".mainmenu").attr('id', ''); }); }); </script> <title></title> <asp:ContentPlaceHolder ID="HeadContent" runat="server"> </asp:ContentPlaceHolder> </head> <body> <form id="Form1" runat="server"> <div class="page"> <div class="header"> <div class="title"> <img alt="" src="Images/logo.jpg" /> </div> <div class="loginDisplay"> <asp:LoginView ID="HeadLoginView" runat="server" EnableViewState="false"> <AnonymousTemplate> <asp:LinkButton ID="lnkLogOut" runat="server" Text="Cerrar Sesión" OnClick="lnkLogOut_Click"></asp:LinkButton> </AnonymousTemplate> <LoggedInTemplate> [ 144 <asp:LoginStatus ID="HeadLoginStatus" runat="server" LogoutAction="Redirect" LogoutText="Log Out" LogoutPageUrl="~/" /> ] </LoggedInTemplate> </asp:LoginView> </div> <div class="clear hideSkiplink"> <asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal"> </asp:Menu> </div> <div class="main"> <asp:ContentPlaceHolder ID="MainContent" runat="server" /> </div> <div class="clear"> </div> </div> <div class="footer"> </div> </form> </body> </html> Site.master.cs using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class SiteMaster : System.Web.UI.MasterPage { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { } Menu(); } protected void lnkLogOut_Click(object sender, EventArgs e) { Session["Perfil"] = null; 145 Response.Redirect("Login2.aspx"); } protected void Menu() { MenuItem perfiles = new MenuItem("Perfiles", "", "", "~/Perfiles.aspx"); MenuItem usuarios = new MenuItem("Usuarios", "", "", "~/Usuarios.aspx"); MenuItem frecuencias = new MenuItem("Frecuencias", "", "", "~/Frecuencias.aspx"); MenuItem estados = new MenuItem("Estado de Indicadores", "", "", "~/EstadosIndicadores.aspx"); MenuItem unidades = new MenuItem("Unidades de Indicadores", "", "", "~/UnidadesIndicadores.aspx"); MenuItem ingresod = new MenuItem("Ingreso de Indicadores", "", "", "~/IngresoDatos.aspx"); MenuItem ingresom = new MenuItem("Monitoreo de Indicadores", "", "", "~/IngresoMonitoreo.aspx"); MenuItem seguimiento = new MenuItem("Seguimiento de Indicadores", "", "", "~/Seguimiento.aspx"); MenuItem cargos = new MenuItem("Cargos", "", "", "~/Cargos.aspx"); MenuItem pantallas = new MenuItem("Pantallas", "", "", "~/Pantallas.aspx"); string tipo = ""; if (Session["Perfil"] != null) tipo = (string)Session["Perfil"]; else Response.Redirect("Login2.aspx"); switch (tipo) { case "1": NavigationMenu.Items.Add(perfiles); NavigationMenu.Items.Add(usuarios); NavigationMenu.Items.Add(frecuencias); NavigationMenu.Items.Add(estados); NavigationMenu.Items.Add(unidades); NavigationMenu.Items.Add(ingresod); NavigationMenu.Items.Add(ingresom); NavigationMenu.Items.Add(seguimiento); NavigationMenu.Items.Add(cargos); NavigationMenu.Items.Add(pantallas); break; case "2": NavigationMenu.Items.Add(usuarios); NavigationMenu.Items.Add(frecuencias); NavigationMenu.Items.Add(estados); NavigationMenu.Items.Add(unidades); NavigationMenu.Items.Add(ingresod); NavigationMenu.Items.Add(ingresom); 146 NavigationMenu.Items.Add(seguimiento); NavigationMenu.Items.Add(cargos); break; case "3": NavigationMenu.Items.Add(frecuencias); NavigationMenu.Items.Add(estados); NavigationMenu.Items.Add(unidades); NavigationMenu.Items.Add(ingresod); NavigationMenu.Items.Add(ingresom); NavigationMenu.Items.Add(seguimiento); break; default: NavigationMenu.Items.Add(perfiles); //NavigationMenu.Items.Add(aperfiles); NavigationMenu.Items.Add(usuarios); NavigationMenu.Items.Add(frecuencias); NavigationMenu.Items.Add(estados); NavigationMenu.Items.Add(unidades); NavigationMenu.Items.Add(ingresod); NavigationMenu.Items.Add(ingresom); NavigationMenu.Items.Add(seguimiento); NavigationMenu.Items.Add(cargos); break; } } } 147 MANUAL DE USUARIO APLICACIÓN WEB PARA EL MONITOREO DE INDICADORES DE DESARROLLO ECONÓMICO PARA LAS COMUNIDADES UBICADAS EN LOS CANTONES RIOBAMBA, GUANO Y PELILEO DE LA PROVINCIA DE CHIMBORAZO 148 MANUAL DE USUARIO 1. INTRODUCCIÓN El objetivo principal de este manual es explicar de manera detallada el funcionamiento de la Aplicación Web a los usuarios para que sirva de guía. Este documento brinda el soporte necesario para aportar un alto conocimiento para el manejo de los módulos y todas sus opciones, con lo que se logra optimizar el tiempo de trabajo. 2. MÓDULOS DEL SISTEMA La Aplicación Web está conformada por dos modulos principales que abarcan la administración y la automatización de los indicadores de desarrollo económico. Dentro del módulo de Administración se da mantenimiento a las principales entidades que intervienen en la aplicación. Dentro del módulo de Registro y Seguimiento se detalla el ingreso de los indicadores de desarrollo económico. En la sección final se presenta los reportes los cuales constan de tablas y gráficos estadísticos para una mejor comprensión de la información. 3. Requerimientos de Hardware Procesador: Core 2 Duo o superior Memoria: 2 GB RAM mínimo recomendado Disco duro: 40 GB Disponibles en disco Monitor: SVGA 1024 * 968 Tarjeta de red: 10 Mbps o superior 149 4. DESCRIPCIÓN DE FUNCIONALIDAD DEL SISTEMA La pantalla de ingreso al sistema es la siguiente: Ilustración 47 Página de Ingreso al Sistema Elaborado por: El Tesista A cada usuario se le asignará una clave para acceder al sistema, se ingresa un usuario y una contraseña para en caso de una autenticación exitosa hacer uso de las opciones del sistema de acuerdo al perfil asignado y rol asignado. En caso de no ingresar correctamente el usuario y/o contraseña se despliega el siguiente mensaje: Ilustración 48 Usuario y/o contraseña incorrecta Para encriptar la contraseña se utiliza una criptografía simétrica donde se usa la misma clave para cifrar y descifrar mensajes. La ventaja de usar un algoritmo simétrico es la imposibilidad de reconstruir la cadena original a partir del resultado, y también la imposibilidad de encontrar dos cadenas de texto que generen el mismo resultado. 150 4.1 Página principal Una vez ingresados los datos correctos se debe hacer clic en el botón Ingresar con lo cual podemos visualizar la siguiente pantalla: Ilustración 49 Pantalla Principal 4.2 Menú Ilustración 50 Menú Sistema 4.3 Administración Este módulo permite gestionar todos los privilegios de los usuarios que intervienen en la ONG. Existe una opción para cambiar clave, la cual pide ingresar la contraseña anterior. En la opción de usuarios que está disponible solo para el administrador del sistema se puede ingresar los datos de un nuevo empleado y modificar los mismos. 151 4.3.1 Administración Perfiles de Usuario Ilustración 51 Página de Administración de Perfiles Elaborado por: El Tesista Se despliega al hacer clic en Perfiles en el menú principal. Permite administrar los privilegios de los usuarios, permitiéndole agregar o quitar las opciones y acciones que tiene ya definido el perfil que se seleccione, al hacer clic sobre los vínculos Actualizar, Crear o Eliminar respectivamente. Si es necesario se puede añadir un nuevo perfil de usuario y asignar privilegios. Ésta opción solo debe estar disponible para el Administrador. 4.4 Mantenimiento Permitir dar mantenimiento a las principales entidades del sistema, es decir actualizar datos o ingresar datos de una nueva entidad como por ejemplo unidades. 4.4.1 Mantenimiento Perfiles Ilustración 52 Página de Mantenimiento de Perfiles Elaborado por: El Tesista Se maneja los perfiles del sistema mediante los vínculos Actualizar, Crear o Eliminar. 152 4.4.2 Mantenimiento de Usuarios Ilustración 53 Página de Mantenimiento de Usuarios Elaborado por: El Tesista Se maneja los usuarios del sistema mediante los vínculos Actualizar, Crear o Eliminar. En el caso de hacer clic en Crear se debe llenar el perfil y cargo al que pertenece el usuario. 4.4.3 Mantenimiento de Frecuencias Ilustración 54 Página de Mantenimiento de Frecuencias Elaborado por: El Tesista Se maneja las frecuencias de los indicadores de desarrollo económico mediante los vínculos Actualizar, Crear o Eliminar. 4.4.4 Mantenimiento de Estado Ilustración 55 Página de Mantenimiento de Estado Elaborado por: El Tesista Se maneja los estados de los Indicadores del sistema mediante los vínculos Actualizar, Crear o Eliminar. 153 4.4.5 Mantenimiento de Unidades Ilustración 56 Página de Mantenimiento de Unidades Elaborado por: El Tesista Se maneja las unidades de medida de los indicadores de desarrollo económico mediante los vínculos Actualizar, Crear o Eliminar. 4.4.6 Mantenimiento de Cargos Ilustración 57 Página de Mantenimiento de Cargos Elaborado por: El Tesista Se maneja los cargos que tienen los usuarios del sistema mediante los vínculos Actualizar, Crear o Eliminar. 4.4.7 Mantenimiento de Pantallas Ilustración 58 Página de Mantenimiento de Pantallas Elaborado por: El Tesista 154 Se maneja las pantallas que tendrán asignadas los perfiles de usuario del sistema mediante los vínculos Actualizar, Crear o Eliminar. 4.5 Registro Se lleva el seguimiento desde la creación del indicador pasando por su registro hasta su fecha de finalización. Con esto ayudamos a los usuarios de acuerdo a su correspondiente perfil a mantener un control sobre los indicadores. 4.5.1 Ingreso de Indicadores Ilustración 59 Página de Ingreso de Indicadores Elaborado por: El Tesista Se crea el indicador indicando el PDA al cual va a pertenecer, el Nombre del Proyecto, la Actividad. Al ingresar los datos anteriores se despliegan el Área Programática y el Código de la Actividad. A continuación se puede ingresar la descripción, unidades, línea base, meta final, nivel crítico, fecha para meta final, frecuencia y evidencias. Una vez ingresados los datos hacer clic en el vínculo Update para guardar en la base. 4.5.2 Monitoreo de Indicadores Ilustración 60 Página de Monitoreo de Indicadores 155 Elaborado por: El Tesista En esta pantalla se registra la meta que se ha obtenido con respecto al indicador. El número de veces que se realice este registro se delimitó al momento de ingresar la frecuencia del indicador (Ingreso de Indicadores). 4.6 Reportes Dentro de cada reporte se visualiza la información de acuerdo al PDA, Proyecto, Actividad e Indicador seleccionado. Adicionalmente a cada reporte se le adjuntará un gráfico para mejor comprensión del usuario. Ilustración 61 Página de Seguimiento de Indicadores Elaborado por: El Tesista 156 4.6.1 Seguimiento y Resultados Este reporte permite visualizar los datos generales del indicador así como gráficos que describen su comportamiento. Ilustración 62 Seguimiento y Resultados Elaborado por: El Tesista 157 4.6.2 Cumplimiento Actividad Indica el porcentaje de cumplimiento de la actividad que se alimenta de los porcentajes de cumplimiento de cada indicador. Ilustración 63 Cumplimiento Actividad Elaborado por: El Tesista 158 4.6.3 Cumplimiento del Proyecto Indica el porcentaje de cumplimiento del proyecto en base a los porcentajes de cumplimiento de cada actividad. Ilustración 64 Cumplimiento Proyecto Elaborado por: El Tesista 159 4.6.4 Cumplimiento del PDA Indica el porcentaje de cumplimiento del PDA en base a los porcentajes de cumplimiento de cada proyecto. Ilustración 65 Cumplimiento PDA Elaborado por: El Tesista 4.6.5 Cerrar Sesión Para salir del sistema hacer clic en el botón Cerrar Sesión. Luego se mostrará la página de Ingreso al sistema. Ilustración 66 Cerrar Sesión Elaborado por: El Tesista 160