UNIVERSIDAD VERACRUZANA Facultad de Contaduría y Administración “SISTEMA DE PROGRAMACIÓN ACADEMICA DE LA FACULTAD DE CONTADURIA Y ADMINISTRACIÓN BAJO EL ENFOQUE DE DISEÑO Y PROGRAMACIÓN DE SISTEMAS” TESINA QUE PARA ACREDITAR LA EXPERIENCIA RECEPCIONAL DEL PROGRAMA EDUCATIVO DE: LICENCIADO EN SISTEMAS COMPUTACIONALES ADMINISTRATIVOS PRESENTA JUAN ANTONIO CHIÑAS MATA DIRECTOR DE TRABAJO RECEPCIONAL: DRA. PATRICIA MARTINEZ MORENO COATZACOALCOS VER., A 3 DE ENERO 2012 DEDICATORIA DIOS Porque fue el creador de todas las cosas, el que me ha dado fortaleza para continuar cuando a punto de caer he estado. Porque me ha otorgado la oportunidad de vivir y bendecirme con una familia extraordinaria. Porque hasta el día de hoy me ha proporcionado llegar a este punto gozando de buena salud para alcanzar y conquistar cada uno de mis objetivos, regalándome su inmenso e infinito amor y bondad. Por todos y cada uno de los triunfos y tiempos de dificultad que me ha otorgado en los cuales he aprendido a amarlo más. Papá A ti por haber sido un gran ejemplo en mi vida, sabiéndome brindar todo el apoyo que uno puede imaginar, todo el amor que de tu corazón podía emanar, la comprensión que te caracterizaba y el esfuerzo que me impulsabas aún cuando llegabas agotado. Es por eso que hoy, este trabajo es para ti, donde quiera que estés, sé que estarías orgulloso. Te lo dedico con mi corazón. Mamá A ti por haberme dado la vida y estar en todo momento conmigo, por infundirme ese ánimo para seguir estudiando y creer en todo momento en mí. Aunque hemos pasado por momentos difíciles, siempre has estado apoyándome y brindándome todo tu amor. Porque te entregas sin esperar nada a cambio, por ese gran ejemplo de valentía para enfrentar toda adversidad, esa constancia para continuar en esta vida siguiendo hacia adelante y nunca darte por vencida. Es por eso que este trabajo, que me ha llevado meses prepararlo, es para ti, por brindarme todo tu apoyo, retribuyéndote lo que me has dado desde un principio. Hermanos A mis hermanos por estar en todo momento cerca de mí ayudándome e impulsándome cuando las ganas me hacían falta. Por ese apoyo y cariño que me regalan y que espero que siga uniéndonos. Este trabajo también va para ustedes, para que puedan ver, que cuando algo se propone, sí se puede alcanzar. AGRADECIMIENTOS DIOS Te doy gracias por estar siempre conmigo, por cada una de tus bendiciones a mi vida, por ser la luz en mi camino. Por ser mi mejor amigo en todo momento, mi fortaleza cuando me siento abatido y por la oportunidad de continuar en esta vida. Gracias Dios. A MI PAPÁ Por todas y cada una de las enseñanzas que supiste brindarme, por las experiencias que me compartías para instruirme. Por tu apoyo incondicional en todo momento. Gracias porque esos año en que tuve la dicha de disfrutarte y aprender de ti. Gracias Papá. A MI MAMÁ Por toda tu humildad y entrega que me ha enseñado tanto, por estar siempre conmigo, apoyándome en todo lo que necesitaba para que pudiese salir adelante. Por velar en todo momento para que nada me hiciese falta. A ti te debo todo, horas de consejos, de regaños, de disciplinas, de tristeza y de alegría, de las cuales estoy muy seguro hoy en día, las has aportado con todo el amor que te caracteriza, para forjar en mi un ser integral y que hoy me siento orgulloso de lo que soy. Gracias Mamá, te amo. A MIS HERMANOS Gracias a ustedes mis hermanos, quienes siempre han estado a mi lado, compartiendo todos esos secretos y aventuras que solo se viven entre hermanos. Por esas peleas que nos han ayudado a madurar y aprender a apoyarnos más. Gracias. A MIS AMIGOS Que siempre han estado allí en los momentos que más los he necesitado. Por esa mano dispuesta a levantarme cuando he sentido desfallecer, por ese apoyo incondicional, por esa sincera y entrañable amistad que me han sabido brindar. A esos amigos que siempre me han acompañado y con los cuales he contado desde que los conocí, no menciono nombres, pues la lista es extensa y no quisiera dejar a nadie fuera de ella. Les digo de todo corazón: ¡Gracias! CAPITULO 1 ........................................................................................................................................................ 7 1.1 INTRODUCCIÓN....................................................................................................................................... 8 1.2 PLANTEAMIENTO DEL PROBLEMA .......................................................................................................... 9 1.3 JUSTIFICACIÓN ...................................................................................................................................... 10 1.4 OBJETIVO GENERAL .............................................................................................................................. 11 1.5 OBJETIVOS ESPECÍFICOS ....................................................................................................................... 11 1.6 LIMITACIONES ....................................................................................................................................... 11 1.7 DELIMITACIONES .................................................................................................................................. 12 CAPITULO 2 ...................................................................................................................................................... 13 INTRODUCCIÓN .......................................................................................................................................... 14 2.1 EL CICLO DE VIDA DEL DESARROLLO DE SISTEMAS ............................................................................... 15 2.2 IDENTIFICACIÓN DE PROBLEMAS, OPORTUNIDADES Y OBJETIVOS ...................................................... 15 2.3 DETERMINACIÓN DE LOS REQUERIMIENTOS DE INFORMACIÓN ......................................................... 17 2.4 ANÁLISIS DE LAS NECESIDADES DEL SISTEMA....................................................................................... 18 2.5 DISEÑO DEL SISTEMA RECOMENDADO ................................................................................................ 19 2.6 DESARROLLO Y DOCUMENTACIÓN DEL SOFTWARE ............................................................................. 20 2.7 PRUEBA Y MANTENIMIENTO DEL SISTEMA .......................................................................................... 20 2.8 IMPLEMENTACIÓN Y EVALUACIÓN DEL SISTEMA ................................................................................. 21 2.9 IMPACTO DEL MANTENIMIENTO .......................................................................................................... 22 2.10 PROGRAMACIÓN ................................................................................................................................ 23 2.10.1 ANTECEDENTES .......................................................................................................................... 23 2.10.2 HISTORIA .................................................................................................................................... 23 2.10.3 OBJETIVOS DE LA PROGRAMACIÓN ........................................................................................... 25 2.11 CLASIFICACIÓN LENGUAJES DE PROGRAMACIÓN .............................................................................. 26 2.11.1 PRIMERA GENERACIÓN .............................................................................................................. 26 2.11.2 SEGUNDA GENERACIÓN ............................................................................................................. 27 2.11.3 TERCERA GENERACIÓN .............................................................................................................. 27 2.11.5 QUINTA GENERACIÓN ................................................................................................................ 29 2.12 PROGRAMAS Y ALGORITMOS ............................................................................................................. 30 2.12.1 PROGRAMACIÓN ESTRUCTURADA ............................................................................................. 31 2.12.2 ORÍGENES DE LA PROGRAMACIÓN ESTRUCTURADA ................................................................. 32 2.12.3 ESTRUCTURA SECUENCIAL ......................................................................................................... 32 2.12.4 ESTRUCTURA SELECTIVA O DE SELECCIÓN ................................................................................. 33 2.12.5 ESTRUCTURA ITERATIVA ............................................................................................................ 35 2.12.6 VENTAJAS DE LA PROGRAMACIÓN ESTRUCTURADA ................................................................. 37 2.12.7 INCONVENIENTES DE LA PROGRAMACIÓN ESTRUCTURADA ..................................................... 38 2.13 PROGRAMACIÓN MODULAR .............................................................................................................. 39 2.14 PARADIGMA POR EVENTOS ................................................................................................................ 40 2.14.1SISTEMAS GUI ............................................................................................................................. 40 2.14.2 SISTEMAS CLIENTE-SERVIDOR .................................................................................................... 41 2.14.3 SISTEMAS DE MENSAJES ............................................................................................................ 41 2.14.4 CARACTERÍSTICAS DEL PARADIGMA ORIENTADO A EVENTO .................................................... 42 5 2.15 PROGRAMACIÓN ORIENTADA A OBJETOS .......................................................................................... 43 2.15.1 ANTECEDENTES .......................................................................................................................... 44 2.15.2 CONCEPTOS FUNDAMENTALES .................................................................................................. 45 2.15.3 CARACTERÍSTICAS DE LA POO .................................................................................................... 47 2.16 PROGRAMACION DE APLICACIONES WEB .......................................................................................... 50 2.16.1 DEFINICIÓN................................................................................................................................. 50 2.16.2 GENERALIDADES DE LA PROGRAMACIÓN WEB ......................................................................... 52 2.16.3 LENGUAJE HTML ........................................................................................................................ 52 2.16.4 LENGUAJE JAVASCRIPT ............................................................................................................... 54 2.16.5 LENGUAJE PHP ........................................................................................................................... 54 2.16.6 LENGUAJE ASP ............................................................................................................................ 57 2.16.7 LENGUAJE ASP.NET .................................................................................................................... 57 2.16.8 LENGUAJE JSP ............................................................................................................................. 58 2.16.9 LENGUAJE PYTHON .................................................................................................................... 59 2.16.10 LENGUAJE RUBY ....................................................................................................................... 61 2.17 TEGNOLOGIAS UTILIZADAS EN EL SISTEMA ....................................................................................... 62 2.17.1 PHP ............................................................................................................................................. 62 2.17.2 MYSQL ........................................................................................................................................ 65 CAPÍTULO 3 ...................................................................................................................................................... 67 3.1 DESARROLLO DEL SISTEMA DE PROGRAMACION ACADEMICA DE LA FACULTAD DE CONTADURIA Y ADMINISTRACIÓN ..................................................................................................................... 68 CAPITULO 4 .................................................................................................................................................... 104 INTRODUCCIÓN ........................................................................................................................................ 105 4. 1 CONCLUSIONES Y RESULTADOS ......................................................................................................... 106 4.2 RECOMENDACIONES ........................................................................................................................... 108 4.3 GLOSARIO............................................................................................................................................ 109 4.4 BIBLIOGRAFÍA...................................................................................................................................... 110 4.5 ANEXO ................................................................................................................................................. 111 6 CAPITULO 1 7 1.1 Introducción La Universidad Veracruzana (U.V) es una Institución pública de educación superior, la cual es reconocida como la Universidad de mayor impacto en el sureste de la República Mexicana. Por medio de sus funciones de docencia, investigación, difusión de la cultura y extensión de servicios en sus distintas entidades académicas (facultades, institutos de investigación, organismos de difusión y extensión, entre otros), busca conservar, crear y transmitir la cultura para beneficiar a la sociedad. Se rige según las disposiciones de una Ley de Autonomía, una Ley Orgánica, un Estatuto General y demás Estatutos y Reglamentos derivados creados en la misma Universidad, donde se trata de vincular de modo permanente a la Universidad y la educación que ésta imparte con la sociedad, atendiendo a las nuevas tendencias y condiciones de desarrollo a nivel nacional e internacional. En la Universidad Veracruzana campus Coatzacoalcos, la Facultad de Contaduría y Administración(F.C.A) cuenta con un gran número de estudiantes inscritos en sus aulas fomentando el conocimiento, autonomía, responsabilidad y dedicación. Por ello existen procesos y procedimientos de control que dan seguimiento a cada uno de los estudiantes y su trayectoria académica. Observado esto se ha identificado la necesidad de creación de un sistema de control académico que se adecue a los requerimientos específicos de información en la F.C.A En el presente trabajo se mencionan las etapas incluidas en el ciclo de desarrollo de sistemas contemplando las etapas de diseño y programación de sistemas en un entorno de aplicaciones web. 8 1.2 Planteamiento del problema La Facultad de Contaduría y Administración (F.C.A) de la Universidad Veracruzana campus Coatzacoalcos, carece de un sistema capaz de facilitar la elaboración de la carga académica de los estudiantes al iniciar el periodo escolar, toda esta labor es llevada acabó por la secretaria académica. La secretaria académica de la F.C.A es la encargada de evaluar la trayectoria y carga académica de cada uno de los estudiantes al inicio de cada periodo escolar, esto lo realiza consultando la información de cada estudiante generada por un Sistema Integral de Información Universitaria (SIIU) , por medio de este sistema se pretende lograr que los estudiantes elijan las experiencias educativas que les corresponden según el periodo al que se van a inscribir, logrando de esta manera que el estudiante no tenga un atraso académico. El objetivo principal de esta obra se define en la creación de una aplicación o sistema informático con las características y requerimientos específicos para ofrecer una solución a la problemática existente. Esta consiste en identificar los procedimientos utilizados en la elaboración de la carga académica de los estudiantes. Tal proceso se lleva a cabo en un periodo semestral, a través de la evaluación de ciertos criterios utilizados para autorizar las experiencias educativas correspondientes a cada estudiante, además de dar seguimiento a su trayectoria académica y considerar alternativas que beneficien su avance escolar. El proceso de desarrollo del sistema inicia con la especificación de los requerimientos y la definición del entorno, esto a fin de delimitar las funciones, características y herramientas que se debían diseñar e implementar en siguientes 9 etapas. Esto es realizado bajo la metodología de modelado de lenguaje unificado el cual permite cumplir con esta tarea adecuadamente, a través del uso de esquemas, diagramas y clases que detalladamente describían el sistema. Posteriormente se abordan estrategias para la definición de una base de datos integral y flexible, que permitiese administrar la información de una forma sencilla a través de los scripts de que la aplicación implementase. Cabe mencionar que un objetivo primordial en la congruencia de los datos y la disponibilidad. Es importante mantener una congruencia entre la etapa de análisis y la etapa de desarrollo por lo cual una correcta comunicación será necesaria para llevar a cabo lo que se ha solicitado y planeado. 1.3 Justificación Es de gran importancia y utilidad proveer a la administración académica herramientas que permitan una organizada estructura para llevar a cabo el seguimiento académico de cada estudiante de la facultad. Así mismo hacer más eficiente el control necesario en cada caso particular para analizar y ofrecer alternativas que beneficien a los estudiantes. En la Facultad de Contaduría y Administración la secretaria académica es la que se encarga de ver que experiencias educativas son las que se le otorgan a cada estudiante, este proceso lo realiza manualmente, verificando en la plataforma del SIIU el cual es un sistema propio de la Universidad Veracruzana, donde se puede consultar los datos de los estudiantes, es de ahí donde la secretaria académica analiza, las experiencias educativas del semestre que comienza y se verifica que el estudiante este al corriente con su carga académica del periodo en el que se encuentra cursando. 10 A través de la implementación del sistema propuesto se pretende facilitar la tarea de programación académica realizada cada periodo escolar. 1.4 Objetivo general Desarrollar un sistema que permita administrar un control escolar de estudiantes de la Facultad los de Contaduría y Administración para la toma de decisiones en la asignación de maestros y grupos, bajo el enfoque de diseño y programación de sistemas. 1.5 Objetivos específicos Analizar el sistema bajo el enfoque de lenguaje de modelado unificado(UML), aplicando las normativas generales del estándar. Desarrollar una aplicación flexible y estructurada e integrar elementos que brinden recursos para facilitar las tareas realizadas por los usuarios. Utilizando recursos informáticos de fuente abierta, aprovechando las características que permitan un máximo rendimiento de los recursos de los equipos. Desarrollar Y diseñar herramientas que provean al usuario de alternativas útiles para un trabajo eficiente. 1.6 Limitaciones El tiempo con el que se cuenta es reducido, por lo cual cada una de las etapas abordadas en el desarrollo del sistema deberán realizarse en periodos cortos 11 El usuario principal desempeña diversas ocupaciones, por lo cual no se contara con periodos regulares de comunicación. El acceso a la base de datos principal es inaccesible, lo cual hace necesario la implementación de una base de datos específica para el sistema. 1.7 Delimitaciones El sistema a desarrollar está establecido para uso interno de la Facultad de Contaduría y Administración, por consecuente existe una delimitante en su implantación. Debido al número de usuarios que van a interactuar con el sistema las especificaciones y manuales de referencia al sistema no han sido contemplados. 12 CAPITULO 2 13 Introducción Un sistema de información (SI) es un conjunto de elementos orientados al tratamiento y administración de datos e información, organizados y listos para su posterior uso, generados para cubrir una necesidad (objetivo). (Wikipedia) Dichos elementos formarán parte de alguna de estas categorías: Personas. Datos. Actividades o técnicas de trabajo. Recursos materiales en general (típicamente recursos informáticos y de comunicación, aunque no tienen por qué ser de este tipo obligatoriamente). Figura 1. Elementos de un sistema de información. Todos estos elementos interactúan entre sí para procesar los datos (incluyendo procesos manuales y automáticos) dando lugar a información más elaborada y distribuyéndola de la manera más adecuada posible en una determinada organización en función de sus objetivos. 14 Normalmente el término es usado de manera errónea como sinónimo de sistema de información informático, en parte porque en la mayoría de los casos los recursos materiales de un sistema de información están constituidos casi en su totalidad por sistemas informáticos, pero siendo estrictos, un sistema de información no tiene por qué disponer de dichos recursos. Se podría decir entonces que los sistemas de información informáticos son una subclase o un subconjunto de los sistemas de información en general. 2.1 El Ciclo de Vida del Desarrollo de Sistemas A lo largo de este capítulo de la tesina, se hará referencia al enfoque sistemático que el analista toma en relación con el análisis y diseño de sistemas de información. Gran parte de este enfoque se incluye en el ciclo de vida del desarrollo de sistemas. El cual es un enfoque por fases para el análisis y el diseño cuya premisa principal consiste en que los sistemas se desarrollan mejor utilizando un ciclo específico de actividades del analista y el usuario. Los analistas no se ponen de acuerdo en la cantidad de fases que incluye el ciclo de vida del desarrollo de sistemas, pero en general alaban su enfoque organizado. Aquí hemos dividido el ciclo en siete fases. A pesar de que cada fase se explica por separado, nunca se realiza como un paso aislado. Más bien, es posible que varias actividades ocurran de manera simultánea, y algunas de ellas podrían repetirse. Es más práctico considerar que el SDLC se realiza por fases y no en pasos aislados. 2.2 Identificación de problemas, oportunidades y objetivos En esta primera fase del ciclo de vida del desarrollo de sistemas, el analista se ocupa de identificar problemas, oportunidades y objetivos. Esta etapa es crítica para el éxito del resto del proyecto, pues a nadie le agrada desperdiciar tiempo trabajando en un problema que no era el que se debía resolver. 15 La primera fase requiere que el analista observe objetivamente lo que sucede en un negocio. A continuación, en conjunto con otros miembros de la organización, el analista determina con precisión cuáles son los problemas. Con frecuencia los problemas son detectados por alguien más, y ésta es la razón de la llamada inicial al analista. Las oportunidades son situaciones que el analista considera susceptibles de mejorar utilizando sistemas de información computarizados. El aprovechamiento de las oportunidades podría permitir a la empresa obtener una ventaja competitiva o establecer un estándar para la industria. La identificación de objetivos también es una parte importante de la primera fase. En primer lugar, el analista debe averiguar lo que la empresa trata de conseguir. A continuación, podrá determinar si algunas funciones de las aplicaciones de los sistemas de información pueden contribuir a que el negocio alcance sus objetivos aplicándolas a problemas u oportunidades específicos. Los usuarios, los analistas y los administradores de sistemas que coordinan el proyecto son los involucrados en la primera fase. Las actividades de esta fase consisten en entrevistar a los encargados de coordinar a los usuarios, sintetizar el conocimiento obtenido, estimar el alcance del proyecto y documentar los resultados. El resultado de esta fase es un informe de viabilidad que incluye una definición del problema y un resumen de los objetivos. Figura 2. Elementos de un sistema de información. 16 2.3 Determinación de los requerimientos de información La siguiente fase que enfrenta el analista es la determinación de los requerimientos de información de los usuarios. Entre las herramientas que se utilizan para determinar los requerimientos de información de un negocio se encuentran métodos interactivos como las entrevistas, los muestreos, la investigación de datos impresos y la aplicación de cuestionarios; métodos que no interfieren con el usuario como la observación del comportamiento de los encargados de tomar las decisiones y sus entornos de oficina, al igual que métodos de amplio alcance como la elaboración de prototipos. El desarrollo rápido de aplicaciones es un enfoque orientado a objetos para el desarrollo de sistemas que incluye un método de desarrollo (que abarca la generación de requerimientos de información) y herramientas de software. En la fase de determinación de los requerimientos de información del ciclo de vida, el analista se esfuerza por comprender la información que necesitan los usuarios para llevar a cabo sus actividades. Como se puede ver, varios de los métodos para determinar los requerimientos de información implican interactuar directamente con los usuarios. Esta fase es útil para que el analista confirme la idea que tiene de la organización y sus objetivos. En ocasiones sólo realizan las dos primeras fases del ciclo de vida del desarrollo de sistemas. Esta clase de estudio podría tener un propósito distinto y por lo general la lleva a la práctica un especialista conocido como analista de información. Los implicados en esta fase son el analista y los usuarios, por lo general trabajadores y gerentes del área de operaciones. El analista de sistemas necesita conocer los detalles de las funciones del sistema actual: el quién (la gente involucrada), el qué (la actividad del negocio), el dónde (el entorno donde se desarrollan las actividades), el cuándo (el momento oportuno) y el cómo (la manera en que se realizan los procedimientos actuales) del negocio que se estudia. A continuación el analista debe preguntar la razón por la cual se utiliza el sistema actual. Podría haber buenas razones para realizar los negocios con los 17 métodos actuales, y es importante tomarlas en cuenta al diseñar un nuevo sistema. La reingeniería de procesos de negocios podría ser útil para conceptualizar el negocio de una manera creativa. Al término de esta fase, el analista debe conocer el funcionamiento del negocio y poseer información muy completa acerca de la gente, los objetivos, los datos y los procedimientos implicados. 2.4 Análisis de las necesidades del sistema La siguiente fase que debe enfrentar el analista tiene que ver con el análisis de las necesidades del sistema. De nueva cuenta, herramientas y técnicas especiales auxilian al analista en la determinación de los requerimientos. Una de estas herramientas es el uso de diagramas de flujo de datos para graficar las entradas, los procesos y las salidas de las funciones del negocio en una forma gráfica estructurada. A partir de los diagramas de flujo de datos se desarrolla un diccionario de datos que enlista todos los datos utilizados en el sistema, así como sus respectivas especificaciones. Durante esta fase el analista de sistemas analiza también las decisiones estructuradas que se hayan tomado. Las decisiones estructuradas son aquellas en las cuales se pueden determinar las condiciones, las alternativas de condición, las acciones y las reglas de acción. Existen tres métodos principales para el análisis de decisiones estructuradas: español estructurado, tablas y árboles de decisión. En este punto del ciclo de vida del desarrollo de sistemas, el analista prepara una propuesta de sistemas que sintetiza sus hallazgos, proporciona un análisis de costo/beneficio de las alternativas y ofrece, en su caso, recomendaciones sobre lo que se debe hacer. Si la administración de la empresa considera factible alguna de las recomendaciones, el analista sigue adelante. Cada problema de sistemas es único, y nunca existe sólo una solución correcta. 18 2.5 Diseño del sistema recomendado En la fase de diseño del ciclo de vida del desarrollo de sistemas, el analista utiliza la información recopilada en las primeras fases para realizar el diseño lógico del sistema de información. El analista diseña procedimientos precisos para la captura de datos que aseguran que los datos que ingresen al sistema de información sean correctos. Además, el analista facilita la entrada eficiente de datos al sistema de información mediante técnicas adecuadas de diseño de formularios y pantallas. La concepción de la interfaz de usuario forma parte del diseño lógico del sistema de información. La interfaz conecta al usuario con el sistema y por tanto es sumamente importante. La fase de diseño también incluye el diseño de archivos o bases de datos que almacenarán gran parte de los datos indispensables para los encargados de tomar las decisiones en la organización. Una base de datos bien organizada es el cimiento de cualquier sistema de información. En esta fase el analista también interactúa con los usuarios para diseñar la salida (en pantalla o impresa) que satisfaga las necesidades de información de estos últimos. Finalmente, el analista debe diseñar controles y procedimientos de respaldo que protejan al sistema y a los datos, y producir paquetes de especificaciones de programa para los programadores. Cada paquete debe contener esquemas para la entrada y la salida, especificaciones de archivos y detalles del procesamiento; también podría incluir árboles o tablas de decisión, diagramas de flujo de datos, un diagrama de flujo de sistema, y los nombres y funciones de cualquier rutina de código previamente escrita. 19 2.6 Desarrollo y documentación del software En la quinta fase del ciclo de vida del desarrollo de sistemas, el analista trabaja de manera conjunta con los programadores para desarrollar cualquier software original necesario. Entre las técnicas estructuradas para diseñar y documentar software se encuentran los diagramas de estructura, los diagramas de NassiShneiderman y el pseudocódigo. El analista se vale de una o más de estas herramientas para comunicar al programador lo que se requiere programar. Durante esta fase el analista también trabaja con los usuarios para desarrollar documentación efectiva para el software, como manuales de procedimientos, ayuda en línea y sitios Web que incluyan respuestas a preguntas frecuentes (FAQ) en archivos "Léame" que se integrarán en el nuevo software. La documentación indica a los usuarios cómo utilizar el software y lo que deben hacer en caso de que surjan problemas derivados de este uso. Los programadores desempeñan un rol clave en esta fase porque diseñan, codifican y eliminan errores sintácticos de los programas de cómputo. Si el programa se ejecutará en un entorno de mainframe, se debe crear un lenguaje de control de trabajos Para garantizar la calidad, un programador podría efectuar un repaso estructurado del diseño o del código con el propósito de explicar las partes complejas del programa a otro equipo de programadores. 2.7 Prueba y mantenimiento del sistema Antes de poner el sistema en funcionamiento es necesario probarlo. Es mucho menos costoso encontrar los problemas antes que el sistema se entregue a los usuarios. Una parte de las pruebas las realizan los programadores solos, y otra la llevan a cabo de manera conjunta con los analistas de sistemas. Primero se realiza una serie de pruebas con datos de muestra para determinar con precisión cuáles son los problemas y posteriormente se realiza otra con datos reales del sistema actual. 20 El mantenimiento del sistema de información y su documentación empiezan en esta fase y se llevan a cabo de manera rutinaria durante toda su vida útil. Gran parte del trabajo habitual del programador consiste en el mantenimiento, y las empresas invierten enormes sumas de dinero en esta actividad. Parte del mantenimiento, como las actualizaciones de programas, se pueden realizar de manera automática a través de un sitio Web. Muchos de los procedimientos sistemáticos que el analista emplea durante el ciclo de vida del desarrollo de sistemas pueden contribuir a garantizar que el mantenimiento se mantendrá al mínimo. 2.8 Implementación y evaluación del sistema Ésta es la última fase del desarrollo de sistemas, y aquí el analista participa en la implementación del sistema de información. En esta fase se capacita a los usuarios en el manejo del sistema. Parte de la capacitación la imparten los fabricantes, pero la supervisión de ésta es responsabilidad del analista de sistemas. Además, el analista tiene que planear una conversión gradual del sistema anterior al actual. Este proceso incluye la conversión de archivos de formatos anteriores a los nuevos, o la construcción de una base de datos, la instalación de equipo y la puesta en producción del nuevo sistema. Se menciona la evaluación como la fase final del ciclo de vida del desarrollo de sistemas principalmente en aras del debate. En realidad, la evaluación se lleva a cabo durante cada una de las fases. Un criterio clave que se debe cumplir es si los usuarios a quienes va dirigido el sistema lo están utilizando realmente. Debe hacerse hincapié en que, con frecuencia, el trabajo de sistemas es cíclico. Cuando un analista termina una fase del desarrollo de sistemas y pasa a la siguiente, el surgimiento de un problema podría obligar al analista a regresar a la fase previa y modificar el trabajo realizado. 21 2.9 Impacto del mantenimiento Después de instalar un sistema, se le debe dar mantenimiento, es decir, los programas de cómputo tienen que ser modificados y actualizados cuando lo requieran. El mantenimiento se realiza por dos razones. La primera es la corrección de errores del software. No importa cuán exhaustivamente se pruebe el sistema, los errores se cuelan en los programas de cómputo. Los errores en el software comercial para PC se documentan como "anomalías conocidas", y se corrigen en el lanzamiento de nuevas versiones del software o en revisiones intermedias. En el software hecho a la medida, los errores se deben corregir en el momento que se detectan. La otra razón para el mantenimiento del sistema es la mejora de las capacidades del software en respuesta a las cambiantes necesidades de una organización, que por lo general tienen que ver con alguna de las siguientes tres situaciones: 1. Con frecuencia, después de familiarizarse con el sistema de cómputo y sus capacidades, los usuarios requieren características adicionales. 2. El negocio cambia con el tiempo. 3. El hardware y el software cambian a un ritmo acelerado. 22 2.10 Programación 2.10.1 Antecedentes La programación es el proceso de diseñar, escribir, depurar y mantener el código fuente de programas computacionales. El código fuente es escrito en un lenguaje de programación. El propósito de la programación es crear programas que exhiban un comportamiento deseado. El proceso de escribir código requiere frecuentemente conocimientos en varias áreas distintas, además del dominio del lenguaje a utilizar, algoritmos especializados y lógica formal. Programar no involucra necesariamente otras tareas tales como el análisis y diseño de la aplicación (pero sí el diseño del código), aunque sí suelen estar fusionadas en el desarrollo de pequeñas aplicaciones. 2.10.2 Historia Para crear un programa, y que la computadora interprete y ejecute las instrucciones escritas en él, debe usarse un lenguaje de programación. En sus inicios las computadoras interpretaban sólo instrucciones en un lenguaje específico, del más bajo nivel, conocido como código máquina, siendo éste excesivamente complicado para programar. De hecho sólo consiste en cadenas de números 1 y 0 (Sistema binario). Para facilitar el trabajo de programación, los primeros científicos que trabajaban en el área decidieron reemplazar las instrucciones, secuencias de unos y ceros, por palabras o letras provenientes del inglés; codificándolas así y creando un lenguaje de mayor nivel, que se conoce como Assembly o lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la palabra inglesa add (sumar). En realidad escribir en lenguaje ensamblador es básicamente lo mismo 23 que hacerlo en lenguaje máquina, pero las letras y palabras son bastante más fáciles de recordar y entender que secuencias de números binarios. A medida que la complejidad de las tareas que realizaban las computadoras aumentaba, se hizo necesario disponer de un método sencillo para programar. Entonces, se crearon los lenguajes de alto nivel. Mientras que una tarea tan trivial como multiplicar dos números puede necesitar un conjunto de instrucciones en lenguaje ensamblador, en un lenguaje de alto nivel bastará con solo una. Una vez que se termina de escribir un programa, sea en ensamblador o en un lenguaje de alto nivel, es necesario compilarlo, es decir, traducirlo a lenguaje máquina. 2.10.3 Léxico y programación La programación se rige por reglas y un conjunto más o menos reducido de órdenes, expresiones, instrucciones y comandos que tienden a asemejarse a una lengua natural acotada y que además tienen la particularidad de una reducida ambigüedad. Cuanto menos impreciso es un lenguaje de programación, se dice, es más potente. Bajo esta premisa, y en el extremo, el lenguaje más potente existente es el binario, con ambigüedad nula. El lenguaje de programación1 es una “notación para comunicarle a una computadora lo que deseamos que haga” En los lenguajes de programación de alto nivel se distinguen diversos elementos entre los que se incluyen el léxico propio del lenguaje y las reglas semánticas y sintácticas. 1 Louden, K. C. (s.f.). Kenneth C. Louden. Ciencias e Ingenierías. 24 2.10.4 Objetivos de la programación La programación debe perseguir la obtención de programas de calidad. Para ello se establece una serie de factores que determinan la calidad de un programa. Algunos de los factores de calidad más importantes son los siguientes: Corrección: Un programa es correcto si hace lo que debe hacer tal y como se estableció en las fases previas a su desarrollo. Para determinar si un programa hace lo que debe, es muy importante especificar claramente qué debe hacer el programa antes de desarrollarlo y, una vez acabado, compararlo con lo que realmente hace. Claridad: Es muy importante que el programa sea lo más claro y legible posible, para facilitar así su desarrollo y posterior mantenimiento. Al elaborar un programa se debe intentar que su estructura sea sencilla y coherente, así como cuidar el estilo en la edición; de esta forma se ve facilitado el trabajo del programador, tanto en la fase de creación como en las fases posteriores de corrección de errores, ampliaciones, modificaciones, etc. Fases que pueden ser realizadas incluso por otro programador, con lo cual la claridad es aún más necesaria para que otros programadores puedan continuar el trabajo fácilmente. Eficiencia: Se trata de que el programa, además de realizar aquello para lo que fue creado (es decir, que sea correcto), lo haga gestionando de la mejor forma posible los recursos que utiliza. Normalmente, al hablar de eficiencia de un programa, se suele hacer referencia al tiempo que tarda en realizar la tarea para la que ha sido creado y a la cantidad de memoria que necesita, pero hay otros recursos que también pueden ser de consideración al obtener la eficiencia de un programa, dependiendo de su naturaleza . Portabilidad: Un programa es portable cuando tiene la capacidad de poder ejecutarse en una plataforma, ya sea hardware o software, diferente a aquélla en la que se elaboró. La portabilidad es una característica muy deseable para un programa. 25 2.11 Clasificación lenguajes de programación 2.11.1 Primera Generación Al desarrollarse las primeras computadoras electrónicas, se vio la necesidad de programarlas, es decir, de almacenar en memoria la información sobre la tarea que iban a ejecutar. Las primeras se usaban como calculadoras simples; se les indicaban los pasos de cálculo, uno por uno. John Von Neumann desarrolló el modelo que lleva su nombre, para describir este concepto de "programa almacenado". En este modelo, se tiene una abstracción de la memoria como un conjunto de celdas, que almacenan simplemente números. Estos números pueden representar dos cosas: los datos, sobre los que va a trabajar el programa; o bien, el programa en sí. Se tenía el problema de representar las acciones que iba a realizar la computadora, y que la memoria, al estar compuesta por switches correspondientes al concepto de bit, solamente nos permitía almacenar números binarios. La descripción y uso de los opcodes es lo que llamamos lenguaje de máquina. Es decir, la lista de códigos que la máquina va a interpretar como instrucciones, describe las capacidades de programación que tenemos de ella; es el lenguaje más primitivo, depende directamente del hardware, y requiere del programador que conozca el funcionamiento de la máquina al más bajo nivel. Los lenguajes más primitivos fueron los lenguajes de máquina. Esto, ya que el hardware se desarrolló antes del software, y además cualquier software finalmente tiene que expresarse en el lenguaje que maneja el hardware. 26 La programación en esos momentos era sumamente tediosa, pues el programador tenía que "bajarse" al nivel de la máquina y decirle, paso a pasito, cada punto de la tarea que tenía que realizar. Además, debía expresarlo en forma numérica; y por supuesto, este proceso era propenso a errores, con lo que la productividad del programador era muy limitada. Sin embargo, hay que recordar que en estos momentos, simplemente aún no existía alternativa. 2.11.2 Segunda Generación El primer gran avance que se dio, como ya se comentó, fue la abstracción dada por el Lenguaje Ensamblador, y con él, el nacimiento de las primeras herramientas automáticas para generar el código máquina. Esto redujo los errores triviales, como podía ser el número que correspondía a una operación, que son sumamente engorrosos y difíciles de detectar, pero fáciles de cometer. Sin embargo, aún aquí es fácil para el programador perderse y cometer errores de lógica, pues debe bajar al nivel de la forma en que trabaja el CPU, y entender bien todo lo que sucede dentro de él. 2.11.3 Tercera Generación Con el desarrollo en los 50s y 60s de algoritmos de más elevado nivel, y el aumento de poder del hardware, empezaron a entrar al uso de computadoras científicos de otras ramas; ellos conocían mucho de Física, Química y otras ramas similares, pero no de Computación, y por supuesto, les era sumamente complicado trabajar con lenguaje Ensamblador en vez de fórmulas. 27 Así, nació el concepto de Lenguaje de Alto Nivel, con el primer compilador de FORTRAN que, como su nombre indica, inició como un "simple" esfuerzo de traducir un lenguaje de fórmulas, al lenguaje ensamblador y por consiguiente al lenguaje de máquina. A partir de FORTRAN, se han desarrollado innumerables lenguajes, que siguen el mismo concepto: buscar la mayor abstracción posible, y facilitar la vida al programador, aumentando la productividad, encargándose los compiladores o intérpretes de traducir el lenguaje de alto nivel, al lenguaje de computadora. Hay que notar la existencia de lenguajes que combinan características de los de alto nivel y los de bajo nivel (es decir, Ensamblador). Mi ejemplo favorito es C: contiene estructuras de programación de alto nivel, y la facilidad de usar librerías que también son características de alto nivel; sin embargo, fue diseñado con muy pocas instrucciones, las cuales son sumamente sencillas, fáciles de traducir al lenguaje de la máquina; y requiere de un entendimiento apropiado de cómo funciona la máquina, el uso de la memoria, etcétera. Por ello, muchas personas consideramos a lenguajes como C (que fue diseñado para hacer sistemas operativos), lenguajes de nivel medio. 2.11.4 Cuarta Generación Los idiomas de la cuarta generación parecen según las instrucciones a las de la tercera generación. Lo nuevo de estos lenguajes son conceptos como clases, objetos y eventos que permiten soluciones más fáciles y lógicos. Lenguajes como C++, java y C# se llaman lenguajes orientadas al objeto. Los idiomas modernos, tal como C++ y Java, no sólo permite las abstracciones, pero permite la implementación impuesta de restricciones en abstracciones. 28 2.11.5 Quinta Generación Como la quinta generación están conocidos los Lenguajes de inteligencia artificial. Han sido muy valorados al principio de las noventa - mientras ahora el desarrollo de software toma otros caminos. Lo que veremos en el futuro es menos dependencia en el idioma, y más en el modelado tal como el lenguaje unificado de modelado (UML). 29 2.12 Programas y algoritmos Un algoritmo es una secuencia no ambigua, finita y ordenada de instrucciones que han de seguirse para resolver un problema. Un programa normalmente implementa (traduce a un lenguaje de programación concreto) uno o más algoritmos. Un algoritmo puede expresarse de distintas maneras: en forma gráfica, como un diagrama de flujo, en forma de código como en pseudocódigo o un lenguaje de programación, en forma explicativa, etc. Los programas suelen subdividirse en partes menores, llamadas módulos, de modo que la complejidad algorítmica de cada una de las partes sea menor que la del programa completo, lo cual ayuda al desarrollo del programa. Un programa está formado por los algoritmos y la estructura de datos. Se han propuesto diversas técnicas de programación cuyo objetivo es mejorar tanto el proceso de creación de software como su mantenimiento. Entre ellas, se pueden mencionar las siguientes: Programación estructurada Programación modular Programación orientada a objetos (POO) Programación declarativa Compilación El programa escrito en un lenguaje de programación (fácilmente comprensible por el programador) es llamado programa fuente y no se puede ejecutar directamente en una computadora. La opción más común es compilar el programa obteniendo un módulo objeto, aunque también puede ejecutarse en forma más directa a través de un intérprete informático. El código fuente del programa se debe someter a un proceso de traducción para convertirlo en lenguaje máquina, código éste directamente ejecutable por el procesador. A este proceso se le llama compilación. 30 Normalmente la creación de un programa ejecutable (un típico.exe para Microsoft Windows o DOS) conlleva dos pasos. El primer paso se llama compilación (propiamente dicho) y traduce el código fuente escrito en un lenguaje de programación almacenado en un archivo a código en bajo nivel (normalmente en código objeto, no directamente a lenguaje máquina). El segundo paso se llama enlazado en el cual se enlaza el código de bajo nivel generado de todos los ficheros y subprogramas que se han mandado compilar y se añade el código de las funciones que hay en las bibliotecas del compilador para que el ejecutable pueda comunicarse directamente con el sistema operativo, traduciendo así finalmente el código objeto a código máquina, y generando un módulo ejecutable. Estos dos pasos se pueden hacer por separado, almacenando el resultado de la fase de compilación en archivos objetos (un típico.obj para Microsoft Windows, DOS o para Unix); para enlazarlos en fases posteriores, o crear directamente el ejecutable; con lo que la fase de compilación se almacena sólo temporalmente. Un programa podría tener partes escritas en varios lenguajes (por ejemplo C, C++ y ensamblador), que se podrían compilar de forma independiente y luego enlazar juntas para formar un único módulo ejecutable. 2.12.1 Programación estructurada La programación estructurada es una técnica para escribir programas (programación de computadora) de manera clara. Para ello se utilizan únicamente tres estructuras: secuencia, selección e iteración. Hoy en día las aplicaciones informáticas son mucho más ambiciosas que las necesidades de programación existentes en los años 1960, principalmente debido a las aplicaciones gráficas, por lo que las técnicas de programación estructurada no son suficientes. Ello ha llevado al desarrollo de nuevas técnicas, tales como la programación orientada a objetos y el desarrollo de entornos de programación que facilitan la programación de grandes aplicaciones. 31 2.12.2 Orígenes de la programación estructurada A finales de los años 1960’s surgió una nueva forma de programar que no solamente daba lugar a programas fiables y eficientes, sino que además estaban escritos de manera que facilitaba su comprensión posterior. El teorema del programa estructurado, propuesto por Böhm-Jacopini, demuestra que todo programa puede escribirse utilizando únicamente las tres instrucciones de control siguientes: Secuencia Instrucción condicional. Iteración (bucle de instrucciones) con condición al principio. Solamente con estas tres estructuras se pueden escribir todos los programas y aplicaciones posibles. Si bien los lenguajes de programación tienen un mayor repertorio de estructuras de control, éstas pueden ser construidas mediante las tres básicas citadas. 2.12.3 Estructura secuencial Una estructura de programa es secuencial si las instrucciones se ejecutan una tras otra, a modo de secuencia lineal, es decir que una instrucción no se ejecuta hasta que finaliza la anterior, ni se bifurca el flujo del programa. 32 2.12.4 Estructura selectiva o de selección La estructura selectiva permite que la ejecución del programa se bifurque a una instrucción (o conjunto) u otras, según un criterio o condición lógica establecida, sólo uno de los caminos en la bifurcación será el tomado para ejecutarse. Ejemplo: IF a > b THEN PRINT a ; " es mayor que " ; b ELSE PRINT a ; " no es mayor que " ; b END IF La instrucción selectiva anterior puede presentar uno de dos mensajes: a es mayor que b o a no es mayor que b, según el resultado de la comparación entre a y b; si el resultado de a > b es verdadero, se presenta el primer mensaje, si es falso se exterioriza el segundo. Las palabras clave IF, THEN, ELSE, y END IF; constituyen la propia estructura de la instrucción condicional (palabra reservadas), proporcionada por el lenguaje, el usuario no debe utilizar sus nombres salvo para este fin. El caso ejemplo se ha codificado en BASIC. IF señala el comienzo de la instrucción condicional, y se espera que después siga la condición lógica de control de la instrucción. 33 THEN señala el fin de la condición, y después estará la instrucción a ejecutar si la condición es verdadera. ELSE es opcional, le sigue la instrucción que se ejecutará si la condición es falsa. END IF indica el final de la estructura, luego de ésta el programa seguirá su curso. Ampliando un poco el ejemplo anterior, con estructuras anidadas: IF a > b THEN PRINT a ; " es mayor que " ; b ELSEIF a < b THEN PRINT a ; " es menor que " ; b ELSE PRINT a ; " es igual que " ; b END IF Este ejemplo permite considerar situaciones en las que se tiene más de dos alternativas. En este caso se ha considerado tres, pero hay situaciones en las que deben considerarse más casos y para ellos se puede repetir las veces que sea necesario la opcional ELSEIF. 34 2.12.5 Estructura iterativa Un bucle iterativo o iteración de una secuencia de instrucciones, hace que se repita su ejecución mientras se cumpla una condición, el número de iteraciones normalmente está determinado por el cambio en la condición dentro del mismo bucle, aunque puede ser forzado o explícito por otra condición. Ejemplo: a= 0 b= 7 DO WHILE b > a PRINT a a= a + 1 LOOP Esta instrucción tiene tres palabras reservadas WHILE, DO y LOOP. DO WHILE: señala el comienzo del bucle ("haga mientras") y después de estas palabras se espera la condición lógica de repetición, si la condición es verdadera pasa el control al cuerpo del bucle, en caso contrario el flujo salta directamente al final de la estructura, saliendo de la misma. LOOP: señala el final del cuerpo de la estructura de bucle. El bucle mientras, se repite mientras la condición sea verdadera, esta condición se comprueba o chequea antes de ingresar al cuerpo del bucle, por lo que el mismo puede que no se ejecute nunca (cuando la condición es falsa desde un principio) o bien que se repita tantas veces como resulte y mientras la condición sea cierta. En el ejemplo se tienen definidas dos variables a y b, que al iniciarse el bucle contienen los valores a=0 y b=7. 35 La condición del bucle es b > a. Si a=0 y b=7. la condición es verdadera, en el cuerpo del bucle se escribe el valor de a en pantalla y luego se incrementa esa variable en una unidad. Entonces pasa a ser a=1 y b=7. ... (se repite la secuencia) ... Cuando a=6 y b=7. la condición sigue siendo verdadera, se escribe el valor de a en pantalla y se incrementa en una unidad. Cuando se llega a que a=7 y b=7. Entonces la condición ya resulta falsa y la instrucción WHILE finaliza, saliendo por LOOP. La salida por pantalla de este ejemplo es 0 1 2 3 4 5 6, y se iteró 7 veces. El lenguaje utilizado en el ejemplo (BASIC), además de tener otras del tipo iterativas, permite utilizar la misma estructura indicada, pero de la siguiente forma: a= 0 b= 7 WHILE b > a PRINT a a= a + 1 WEND Que es absolutamente análoga, en éste formato la palabra reservada WEND marca el fin del bucle y no se utiliza ni DO ni LOOP. 36 2.12.6 Ventajas de la programación estructurada 1. Los programas son más fáciles de entender, pueden ser leídos de forma secuencial, no hay necesidad de hacer engorrosos seguimientos en saltos de línea (GOTO) dentro de los bloques de código para intentar entender la lógica. 2. La estructura de los programas es clara, puesto que las instrucciones están más ligadas o relacionadas entre sí. 3. Reducción del esfuerzo en las pruebas y depuración. El seguimiento de los fallos o errores del programa se facilita debido a su estructura más sencilla y comprensible, por lo que los errores se pueden detectar y corregir más fácilmente. 4. Reducción de los costos de mantenimiento. Análogamente a la depuración, durante la fase de mantenimiento, modificar o extender los programas resulta más fácil. 5. Programas son más sencillos y más rápidos de confeccionar (y se facilita su optimización). 6. Los bloques de código son casi auto-explicativos, lo que reduce y facilita la documentación. 7. Las instrucciones de salto, GOTO, quedan reservadas para construir las instrucciones básicas, si fuera realmente imprescindible. Aunque no se usan de forma directa, por estar prohibida su utilización, están incluidas implícitamente en las instrucciones de selección e iteración. 8. Un programa escrito de acuerdo a los principios de programación estructurada no solamente tendrá una mejor estructura sino también una excelente presentación. 9. Se incrementa el rendimiento de los programadores, comparada con la forma tradicional que utiliza GOTO. 37 La programación estructurada ofrece estos beneficios, pero no se la debe considerar como una panacea ya que el desarrollo de programas es, esencialmente, una tarea de dedicación, esfuerzo y creatividad; programar es casi un arte. 2.12.7 Inconvenientes de la programación estructurada El principal inconveniente de este método de programación es que se obtiene un único bloque de programa, que cuando se hace demasiado grande puede resultar problemático el manejo de su código fuente; esto se resuelve empleando conjuntamente la programación modular, es decir, si es necesario, se definen módulos independientemente, programados y compilados por separado (en realidad esto no es necesario, pero si es recomendable para su mejor mantenimiento y depuración). En realidad, cuando se programa hoy en día (inicios del siglo XXI) se utilizan normalmente, tanto las técnicas de programación estructurada como las de programación modular, de forma conjunta y por lo tanto es muy común que cuando se hace referencia a la programación estructurada muchos entiendan que ella incluye también las técnicas modulares, estrictamente no es así. Un método un poco más sofisticado es la programación por capas, en la que los módulos tienen una estructura jerárquica en la que se pueden definir funciones dentro de funciones o de procedimientos. Si bien las metodologías en cuestión ya son de antigua data, aun en la actualidad la conjunción "Programación estructurada" y "programación modular" es una de la más utilizadas, juntamente con un más moderno paradigma, en pleno auge, completamente distinto, llamado programación orientada a objetos. 38 2.13 Programación modular La programación modular es un paradigma de programación que consiste en dividir un programa en módulos o subprogramas con el fin de hacerlo más legible y manejable. Se presenta históricamente como una evolución de la programación estructurada para solucionar problemas de programación más grandes y complejos de lo que ésta puede resolver. Al aplicar la programación modular, un problema complejo debe ser dividido en varios sub-problemas más simples, y estos a su vez en otros sub-problemas más simples. Esto debe hacerse hasta obtener sub-problemas lo suficientemente simples como para poder ser resueltos fácilmente con algún lenguaje de programación. Ésta técnica se llama refinamiento sucesivo, divide y vencerás ó análisis descendente (Top-Down). Un módulo es cada una de las partes de un programa que resuelve uno de los sub-problemas en que se divide el problema complejo original. Cada uno de estos módulos tiene una tarea bien definida y algunos necesitan de otros para poder operar. En caso de que un módulo necesite de otro, puede comunicarse con éste mediante una interfaz de comunicación que también debe estar bien definida. Si bien un módulo puede entenderse como una parte de un programa en cualquiera de sus formas y variados contextos, en la práctica se los suele tomar como sinónimos de procedimientos y funciones. Pero no necesaria ni estrictamente un módulo es una función o un procedimiento, ya que el mismo puede contener muchos de ellos, no debe confundirse el término "modulo" (en el sentido de programación modular) con términos como "función" o "procedimiento", propios del lenguaje que lo soporte 39 2.14 Paradigma por eventos En contraposición al modelo clásico, la programación orientada a eventos permite interactuar con el usuario en cualquier momento de la ejecución. Esto se consigue debido a que los programas creados bajo esta arquitectura se componen por un bucle exterior permanente encargado de recoger los eventos, y distintos procesos que se encargan de tratarlos. Habitualmente, este bucle externo permanece oculto al programador que simplemente se encarga de tratar los eventos, aunque en algunos lenguajes será necesaria su construcción. Ejemplo de programa orientado a eventos en pseudo lenguaje: While (true){ Switch (event){ case mousse_button_down: case mouse_click: case keypressed: case Else: } } Usos del paradigma dirigido por eventos Una vez descritos algunos de los patrones que conforman la estructura del paradigma dirigido por eventos, a continuación se explican algunos ejemplos de tipos de aplicaciones que en la actualidad hacen uso de este paradigma. 2.14.1Sistemas GUI En la actualidad la mayoría de las personas que utiliza un computador, hacen uso de sistemas que cuentan con interfaces gráficas de usuario (Graphic User Interface o GUI). La estructura de este tipo de sistemas implementa el patrón Handler. Cada elemento de una interfaz gráfica como lo son botones, cajas de 40 selección, cajas de edición entre otros, pueden estar en modo de espera hasta la llegada de un evento como lo es el oprimir algún botón del Mouse sobre uno de los elementos de la GUI, una vez arribado el evento éstos realizan alguna acción. Los módulos que componen a este tipo de sistemas son los siguientes: un elemento que representa los eventos generados externamente por el usuario, un despachador responsable de analizar los eventos que llegan a éste y una serie de manejadores que efectúan alguna operación dependiendo del tipo de evento generado por el usuario. 2.14.2 Sistemas Cliente-Servidor Un tipo de sistema que utiliza el patrón Handler son los llamados sistemas cliente servidor. Este tipo de sistemas está compuesto por dos componentes principales uno o más servidores y uno o más clientes. El servidor puede ser un hardware o componente software cuya función es proporcionar un determinado tipo de servicio a los clientes quienes consumen el servicio. El trabajo de los servidores es esperar por las peticiones de los clientes, responder a las solicitudes de los clientes proporcionando el servicio y finalmente esperar por más peticiones. A continuación se muestra el patrón Handler en este tipo de sistemas. 2.14.3 Sistemas de mensajes Otro tipo de variante del patrón Handler son los sistemas de mensajes. En este tipo de sistemas existen dos componentes, un generador de eventos llamado transmisor y un manejador de eventos llamado receptor. Por lo general los transmisores y receptores se encuentran en distintas ubicaciones físicas o en distintas plataformas. Este tipo de sistemas utiliza un modelo de conexión punto a punto ya que los transmisores conocen a que receptor enviar el mensaje. 41 Un ejemplo de este son los sistemas de correo electrónico, un usuario envía un correo al servidor de correos (sistema de mensajes) el servidor obtiene la dirección del destinatario y lo envía al receptor. 2.14.4 Características del paradigma orientado a evento De una manera general se hace mención a las características de este lenguaje al referir que en el paradigma orientado a evento se pueden determinar acciones dependientes del usuario debido a que el usuario es que da la acción o el evento para la ejecución del programa; además de poder manipular los eventos que les sea concerniente, eventos asociados a métodos y atributos, los cuales son los procedimientos y características a ejecutar en aplicaciones con diferentes acciones, de esta manera en el paradigma orientado a evento se emplean elementos visuales de manera tal de crear un ambiente agradable de trabajo y una interactividad con el programa permitiendo tener contacto con el empleo de los objetivos e los eventos predefinidos; en este paradigma es el usuario quien decide. 42 2.15 Programación orientada a objetos La programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones, para diseñar aplicaciones y programas informáticos. Está basado en varias técnicas, incluyendo herencia, abstracción, polimorfismo y encapsulamiento. Su uso se popularizó a principios de la década de los años 1990’s. En la actualidad, existe variedad de lenguajes de programación que soportan la orientación a objetos.Los objetos son entidades que tienen un determinado estado, comportamiento (método) e identidad: El estado está compuesto de datos, será uno o varios atributos a los que se habrán asignado unos valores concretos (datos). El comportamiento está definido por los métodos o mensajes a los que sabe responder dicho objeto, es decir, qué operaciones se pueden realizar con él. La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras palabras, es su identificador (concepto análogo al de identificador de una variable o una constante). Un objeto contiene toda la información que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interacción llamados métodos, que favorecen la comunicación entre ellos. Esta comunicación favorece a su vez el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separa el estado y el comportamiento. Los métodos (comportamiento) y atributos (estado) están estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de métodos para poder tratar los atributos con los que cuenta. El 43 programador debe pensar indistintamente en ambos conceptos, sin separar ni darle mayor importancia a alguno de ellos. Hacerlo podría producir el hábito erróneo de crear clases contenedoras de información por un lado y clases con métodos que manejen a las primeras por el otro. De esta manera se estaría realizando una programación estructurada camuflada en un lenguaje de programación orientado a objetos. Paradigma orientado a objetos La POO difiere de la programación estructurada tradicional, en la que los datos y los procedimientos están separados y sin relación, ya que lo único que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La programación estructurada anima al programador a pensar sobre todo en términos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan. En la programación estructurada sólo se escriben funciones que procesan datos. Los programadores que emplean POO, en cambio, primero definen objetos para luego enviarles mensajes solicitándoles que realicen sus métodos por sí mismos. 2.15.1 Antecedentes Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo. En este centro, se trabajaba en simulaciones de naves, que fueron confundidas por la explosión combinatoria de cómo las diversas cualidades de diferentes naves podían afectar unas a las otras. La idea surgió al agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamientos. Fueron refinados más tarde en Smalltalk, desarrollado en Simula en Xerox PARC (cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "sobre la marcha" (en tiempo de ejecución) en lugar de tener un sistema basado en programas estáticos. 44 La programación orientada a objetos se fue convirtiendo en el estilo de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de C++, una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de usuario, para las cuales la programación orientada a objetos está particularmente bien adaptada. En este caso, se habla también de programación dirigida por eventos. Las características de orientación a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp, Pascal, entre otros. La adición de estas características a los lenguajes que no fueron diseñados inicialmente para ellas condujo a menudo a problemas de compatibilidad y en la capacidad de mantenimiento del código. Los lenguajes orientados a objetos "puros", por su parte, carecían de las características de las cuales muchos programadores habían venido a depender. Para saltar este obstáculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en métodos orientados a objetos, pero permitiendo algunas características imperativas de maneras "seguras". El Eiffel de Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la aparición de Internet, y a la implementación de la máquina virtual de Java en la mayoría de navegadores. PHP en su versión 5 se ha modificado, soporta una orientación completa a objetos, cumpliendo todas las características propias de la orientación a objetos. 2.15.2 Conceptos fundamentales La programación orientada a objetos es una forma de programar que trata de encontrar una solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes: 45 Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas. Herencia: (por ejemplo, herencia de la clase C a la clase D) Es la facilidad mediante la cual la clase D hereda en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido definidos por la misma D. Por lo tanto, puede usar los mismos métodos y variables publicas declaradas en C. Los componentes registrados como "privados" (private) también se heredan, pero como no pertenecen a la clase, se mantienen escondidos al programador y sólo pueden ser accedidos a través de otros métodos públicos. Esto es así para mantener hegemónico el ideal de OOP. Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos) los mismos que consecuentemente reaccionan a eventos. Se corresponde con los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa). Es una instancia a una clase. Método: Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema. Evento: Es un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento, a la reacción que puede desencadenar un objeto, es decir la acción que genera. Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó. 46 Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método. Estado interno: es una variable que se declara privada, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). No es visible al programador que maneja una instancia de la clase. Componentes de un objeto: atributos, identidad, relaciones y métodos. Identificación de un objeto: un objeto se representa por medio de una tabla o entidad que esté compuesta por sus atributos y funciones correspondientes. En comparación con un lenguaje imperativo, una "variable", no es más que un contenedor interno del atributo del objeto o de un estado interno, así como la "función" es un procedimiento interno del método del objeto. 2.15.3 Características de la POO Existe un acuerdo acerca de qué características contempla la "orientación a objetos", las características siguientes son las más importantes: Abstracción: denota las características esenciales de un objeto, donde se capturan sus comportamientos. Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción. El proceso de abstracción permite seleccionar las características relevantes dentro de un conjunto e identificar comportamientos comunes para definir nuevos tipos de entidades en el mundo real. La abstracción 47 es clave en el proceso de análisis y diseño orientado a objetos, ya que mediante ella podemos llegar a armar un conjunto de clases que permitan modelar la realidad o el problema que se quiere atacar. Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultación, principalmente porque se suelen emplear conjuntamente. Modularidad: Se denomina Modularidad a la propiedad que permite subdividir una aplicación en partes más pequeñas (llamadas módulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las restantes partes. Estos módulos se pueden compilar por separado, pero tienen conexiones con otros módulos. Al igual que la encapsulación, los lenguajes soportan la Modularidad de diversas formas. Principio de ocultación: Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos. Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de 48 diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++. Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que volver a implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en árboles o enrejados que reflejan un comportamiento común. Cuando un objeto hereda de más de una clase se dice que hay herencia múltiple. Recolección de basura: la recolección de basura es la técnica por la cual el entorno de objetos se encarga de destruir automáticamente, y por tanto desvincular la memoria asociada, los objetos que hayan quedado sin ninguna referencia a ellos. Esto significa que el programador no debe preocuparse por la asignación o liberación de memoria, ya que el entorno la asignará al crear un nuevo objeto y la liberará cuando nadie lo esté usando. En la mayoría de los lenguajes híbridos que se extendieron para soportar el Paradigma de Programación Orientada a Objetos como C++ u Object Pascal, esta característica no existe y la memoria debe desasignarse manualmente. 49 2.16 PROGRAMACION DE APLICACIONES WEB 2.16.1 Definición Desarrollo web es un título para el conjunto de tecnologías de software del lado del servidor y del cliente que involucran una combinación de procesos de base de datos con el uso de un navegador en Internet a fin de realizar determinadas tareas o mostrar información. Tradicionalmente un software departamental o incluso un ambicioso proyecto corporativo de gran envergadura es desarrollado en forma standalone, es decir, usando lenguajes ya sea compilados (C, C++, Delphi) semicompilados (Java), o interpretados (Python) para crear tanto la funcionalidad como toda la interfaz de los usuarios, pero cabe perfectamente un desarrollo orientado a web para dichos propósitos, siendo más homogéneo y multiplataforma, y dependiendo de las tecnologías utilizadas, más rápido y robusto tanto para diseñar, implementar y probar, como para su uso una vez terminado. Funcionalmente, el desarrollador web, que es quien realiza esta labor, normalmente sólo se preocupa por el funcionamiento del software, es tarea del diseñador web preocuparse del aspecto finalde la página y del webmaster el integrar ambas partes. Los lenguajes de programación más usados en desarrollo web son principalmente: ASP.NET, PHP y JSP. 50 La base de datos más popular en desarrollo web es MySQL, seguida por Oracle, SQL Server y PostgreSQL. Idealmente un desarrollador web debería conocer, además de al menos un lenguaje de programación y el manejo de al menos una base de datos, HTML, CSS y JavaScript, tres tecnologías que bien trabajadas logran DHTML. También, si el diseñador desea usar Adobe Flex (Flash) debe ser capaz de integrarlo a su solución, o puede dejar los efectos en el mismo DHTML. 51 2.16.2 Generalidades de la programación web Actualmente existen diferentes lenguajes de programación para desarrollar en la web, estos han ido surgiendo debido a las tendencias y necesidades de las plataformas. En el presente artículo pretende mostrar las ventajas y desventajas de los lenguajes más conocidos. Desde los inicios de Internet, fueron surgiendo diferentes demandas por los usuarios y se dieron soluciones mediante lenguajes estáticos. A medida que paso el tiempo, las tecnologías fueron desarrollándose y surgieron nuevos problemas a dar solución. Esto dio lugar a desarrollar lenguajes de programación para las web dinámicas. A continuación daremos una introducción a los diferentes lenguajes de programación para la web. 2.16.3 Lenguaje HTML HTML2, siglas de HyperText Markup Language («lenguaje de marcado de hipertexto»), es el lenguaje de marcado predominante para la elaboración de páginas web. Es usado para describir la estructura y el contenido en forma de texto, así como para complementar el texto con objetos tales como imágenes. HTML se escribe en forma de «etiquetas», rodeadas por corchetes angulares (<,>). HTML también puede describir, hasta un cierto punto, la apariencia de un documento, y puede incluir un script (por ejemplo JavaScript), el cual puede afectar el comportamiento de navegadores web y otros procesadores de HTML. HTML también es usado para referirse al contenido del tipo de MIME text/html o todavía más ampliamente como un término genérico para el HTML, ya sea en forma descendida del XML (como XHTML1.0 y posteriores) o en forma descendida directamente de SGML (como HTML 4.01 y anteriores). 2 LANCKER, L. V. (s.f.). HTML 4: dominar el código fuente. Eni. 52 Sintaxis: <html> <head> ( Cabecera ) </head> <body> ( Cuerpo ) </body> </html> Ventajas: Sencillo que permite describir hipertexto. Texto presentado de forma estructurada y agradable. No necesita de grandes conocimientos cuando se cuenta con un editor de páginas web o WYSIWYG. Archivos pequeños. Despliegue rápido. Lenguaje de fácil aprendizaje. Lo admiten todos los exploradores. Desventajas: Lenguaje estático. La interpretación de cada navegador puede ser diferente. El diseño es más lento. Las etiquetas son muy limitadas. 53 2.16.4 Lenguaje Javascript Este es un lenguaje interpretado, no requiere compilación. Fue creado por Brendan Eich en la empresa Netscape Communications. Utilizado principalmente en páginas web. Es similar a Java, aunque no es un lenguaje orientado a objetos, el mismo no dispone de herencias. La mayoría de los navegadores en sus últimas versiones interpretan código Javascript. El código Javascript puede ser integrado dentro de nuestras páginas web. Para evitar incompatibilidades el World Wide Web Consortium (W3C) diseño un estándar denominadoDOM (en inglés Document Object Model, en su traducción al español Modelo de Objetos del Documento). Ventajas: Lenguaje de scripting seguro y fiable. Los script tienen capacidades limitadas, por razones de seguridad. El código Javascript se ejecuta en el cliente. Desventajas: Código visible por cualquier usuario. El código debe descargarse completamente. Puede poner en riesgo la seguridad del sitio, con el actual problema llamado XSS (significa en inglés Cross Site Scripting renombrado a XSS por su similitud con las hojas de estilo CSS). 2.16.5 Lenguaje PHP 54 Es un lenguaje de programación utilizado para la creación de sitio web. PHP3 es un acrónimo recursivo que significa “PHP Hypertext Pre-processor”, (inicialmente se llamó Personal Home Page). Surgió en 1995, desarrollado por PHP Group. PHP es un lenguaje de script interpretado en el lado del servidor utilizado para la generación de páginas web dinámicas, embebidas en páginas HTML y ejecutadas en el servidor. PHP no necesita ser compilado para ejecutarse. Para su funcionamiento necesita tener instalado Apache o IIS con las librerías de PHP. La mayor parte de su sintaxis ha sido tomada de C, Java y Perl con algunas características específicas. Los archivos cuentan con la extensión (php). Sintaxis: <? $mensaje = “Hola”; echo $mensaje; ?> También puede usarse: <?php $mensaje = “Hola”; echo $mensaje; ?> Ventajas: Muy fácil de aprender. Se caracteriza por ser un lenguaje muy rápido. Soporta en cierta medida la orientación a objeto. Clases y herencia. Es un lenguaje multiplataforma: Linux, Windows, entre otros. Capacidad de conexión con la mayoría de los manejadores de base de datos: MysSQL, PostgreSQL, Oracle, MS SQL Server, entre otras. 3 Ángel Cobo, P. G. (s.f.). PHP y MySQL. Tecnología para el desarrollo de aplicaciones web. Díaz de Santos. 55 Capacidad de expandir su potencial utilizando módulos. Posee documentación en su página oficial la cual incluye descripción y ejemplos de cada una de sus funciones. Es libre, por lo que se presenta como una alternativa de fácil acceso para todos. Incluye gran cantidad de funciones. No requiere definición de tipos de variables ni manejo detallado del bajo nivel. Desventajas: Se necesita instalar un servidor web. Todo el trabajo lo realiza el servidor y no delega al cliente. Por tanto puede ser más ineficiente a medida que las solicitudes aumenten de número. La legibilidad del código puede verse afectada al mezclar sentencias HTML y PHP. La programación orientada a objetos es aún muy deficiente para aplicaciones grandes. Dificulta la modularidad. Dificulta la organización por capas de la aplicación. Seguridad: PHP es un poderoso lenguaje e intérprete, ya sea incluido como parte de un servidor web en forma de módulo o ejecutado como un binario CGI separado, es capaz de acceder a archivos, ejecutar comandos y abrir conexiones de red en el servidor. Estas propiedades hacen que cualquier cosa que sea ejecutada en un servidor web sea insegura por naturaleza. PHP está diseñado específicamente para ser un lenguaje más seguro para escribir programas CGI que Perl o C, y con la selección correcta de opciones de configuración en tiempos de compilación y ejecución, y siguiendo algunas prácticas correctas de programación. 56 2.16.6 Lenguaje ASP Es una tecnología del lado de servidor desarrollada por Microsoft para el desarrollo de sitio web dinámicos. ASP significa en inglés (Active Server Pages), fue liberado por Microsoft en 1996. Las páginas web desarrolladas bajo este lenguaje es necesario tener instalado Internet Information Server (IIS). ASP no necesita ser compilado para ejecutarse. Existen varios lenguajes que se pueden utilizar para crear páginas ASP. El más utilizado es VBScript, nativo de Microsoft. ASP se puede hacer también en Perl and Jscript. El código ASP puede ser insertado junto con el código HTML. Los archivos cuentan con la extensión (asp). Ventajas: Usa Visual Basic Script, siendo fácil para los usuarios. Comunicación óptima con SQL Server. Soporta el lenguaje JScript. Desventajas: Código desorganizado. Se necesita escribir mucho código para realizar funciones sencillas. Tecnología propietaria. Hospedaje de sitios web costosos. 2.16.7 Lenguaje ASP.NET Este es un lenguaje comercializado por Microsoft, y usado por programadores para desarrollar entre otras funciones, sitios web. ASP.NET es el sucesor de la tecnología ASP, fue lanzada al mercado mediante una estrategia de mercado denominada .NET. El ASP.NET fue desarrollado para resolver las limitantes que brindaba tu antecesor ASP. Creado para desarrollar web sencillas o grandes aplicaciones. Para el desarrollo de ASP.NET se puede utilizar C#, VB.NET o J#. Los archivos 57 cuentan con la extensión (aspx). Para su funcionamiento de las páginas se necesita tener instalado IIS con el Framework .Net. Microsft Windows 2003 incluye este framework, solo se necesitará instalarlo en versiones anteriores. Ventajas: Completamente orientado a objetos. Controles de usuario y personalizados. División entre la capa de aplicación o diseño y el código. Facilita el mantenimiento de grandes aplicaciones. Incremento de velocidad de respuesta del servidor. Mayor velocidad. Mayor seguridad. Desventajas: Mayor consumo de recursos. 2.16.8 Lenguaje JSP Es un lenguaje para la creación de sitios web dinámicos, acrónimo de Java Server Pages. Está orientado a desarrollar páginas web en Java. JSP es un lenguaje multiplataforma. Creado para ejecutarse del lado del servidor. JSP fue desarrollado por Sun Microsystems. Comparte ventajas similares a las de ASP.NET, desarrollado para la creación de aplicaciones web potentes. Posee un motor de páginas basado en los servlets de Java. Para su funcionamiento se necesita tener instalado un servidor Tomcat. Sintaxis: <%= new java.util.Date() %> Características: Código separado de la lógica del programa. 58 Las páginas son compiladas en la primera petición. Permite separar la parte dinámica de la estática en las páginas web. Los archivos se encuentran con la extensión (jsp). El código JSP puede ser incrustado en código HTML. Elementos de JSP Los elementos que pueden ser insertados en las páginas JSP son los siguientes: Código: se puede incrustar código “Java”. Directivas: permite controlar parámetros del códigos. Acciones: permite alterar el flujo normal de ejecución de una página. Ventajas: Ejecución rápida del servlets. Crear páginas del lado del servidor. Multiplataforma. Código bien estructurado. Integridad con los módulos de Java. La parte dinámica está escrita en Java. Permite la utilización se servlets. Desventajas: Complejidad de aprendizaje. 2.16.9 Lenguaje Python Es un lenguaje de programación creado en el año 1990 por Guido van Rossum, es el sucesor del lenguaje de programación ABC. Python es comparado habitualmente con Perl. Los usuarios lo consideran como un lenguaje más limpio para programar. Permite la creación de todo tipo de programas incluyendo los sitios web. 59 Su código no necesita ser compilado, por lo que se llama que el código es interpretado. Es un lenguaje de programación multi-paradigma, lo cual fuerza a que los programadores adopten por un estilo de programación particular: Programación orientada a objetos. Programación estructurada. Programación funcional. Programación orientada a aspectos. Sintaxis: Ejemplo de una clase en Phyton: def dibujar_muneco(opcion): if opcion == 1: C.create_line(580, 150, 580, 320, width=4, fill="blue") C.create_oval(510, 150, 560, 200, width=2, fill='PeachPuff') Ventajas: Libre y fuente abierta. Lenguaje de propósito general. Gran cantidad de funciones y librerías. Sencillo y rápido de programar. Multiplataforma. Licencia de código abierto (Opensource). Orientado a Objetos. Portable. Desventajas: Lentitud por ser un lenguaje interpretado. 60 2.16.10 Lenguaje Ruby Es un lenguaje interpretado de muy alto nivel y orientado a objetos. Desarrollado en el 1993 por el programador japonés Yukihiro “Matz” Matsumoto. Su sintaxis está inspirada en Phyton, Perl. Es distribuido bajo licencia de software libre (Opensource). Ruby es un lenguaje dinámico para una programación orientada a objetos rápida y sencilla. Para los que deseen iniciarse en este lenguaje pueden encontrar un tutorial interactivo de ruby. Se encuentra también a disposición de estos usuarios un sitio con informaciones y cursos en español. Características: Existe diferencia entre mayúsculas y minúsculas. Múltiples expresiones por líneas, separadas por punto y coma “;”. Dispone de manejo de excepciones. Ruby puede cargar librerías de extensiones dinámicamente si el (Sistema Operativo) lo permite. Portátil. Ventajas: Permite desarrollar soluciones a bajo Costo. Software libre. Multiplataforma. 61 2.17 TEGNOLOGIAS UTILIZADAS EN EL SISTEMA 2.17.1 PHP PHP es un acrónimo recursivo que significa PHP Hypertext Pre-processor. Fue creado originalmente por Rasmus Lerdorf en 1994; sin embargo la implementación principal de PHP es producida ahora por “The PHP Group” y sirve como el estándar de facto para PHP al no haber una especificación formal. Publicado bajo la Free Software Foundation se considera esta licencia como software libre. Puede ser desplegado en la mayoría de los servidores web y en casi todos los sistemas operativos y plataformas sin costo alguno. El lenguaje PHP se encuentra instalado en más de 20 millones de sitios web y en un millón de servidores, el número de sitios en PHP ha compartido algo de su preponderante sitio con otros nuevos lenguajes no tan poderosos desde agosto de 2005. Este mismo sitio web de Wikipedia está desarrollado en PHP. Es también el módulo Apache más popular entre las computadoras que utilizan Apache como servidor web. El gran parecido que posee PHP con los lenguajes más comunes de programación estructurada, como C y Perl, permiten a la mayoría de los programadores crear aplicaciones complejas con una curva de aprendizaje muy corta. También les permite involucrarse con aplicaciones de contenido dinámico sin tener que aprender todo un nuevo grupo de funciones. Aunque todo en su diseño está orientado a facilitar la creación de sitios webs, es posible crear aplicaciones con una interfaz gráfica para el usuario, utilizando la extensión PHP-Qt oPHP-GTK. También puede ser usado desde la línea de órdenes, de la misma manera como Perl o Python pueden hacerlo; a esta versión de PHP se la llama PHP-CLI. 62 Cuando el cliente hace una petición al servidor para que le envíe una página web, el servidor ejecuta el intérprete de PHP. Éste procesa el script solicitado que generará el contenido de manera dinámica (por ejemplo obteniendo información de una base de datos). El resultado es enviado por el intérprete al servidor, quien a su vez se lo envía al cliente. Mediante extensiones es también posible la generación de archivos PDF, Flash, así como imágenes en diferentes formatos. Permite la conexión a diferentes tipos de servidores de bases de datos tales como MySQL,PostgreSQL, Oracle, ODBC, DB2. XAMPP es un servidor independiente de plataforma, software libre, que consiste principalmente en la base de datos MySQL, el servidor Web Apache y los intérpretes para lenguajes de script: PHP y Perl. El nombre proviene del acrónimo de X (para cualquiera de los diferentes sistemas operativos), Apache, MySQL, PHP, Perl. El programa está liberado bajo la licencia GNU y actúa como un servidor Web libre, fácil de usar y capaz de interpretar páginas dinámicas. Actualmente XAMPP está disponible para Microsoft Windows, GNU/Linux, Solaris, y MacOS X. PHP también tiene la capacidad de ser ejecutado en la mayoría de los sistemas operativos, tales como Unix (y de ese tipo, como Linux o Mac OS X) y Microsoft Windows, y puede interactuar con los servidores de web más populares ya que existe en versión CGI, módulo para Apache, e ISAPI. Ventajas Es un lenguaje multiplataforma. Orientado al desarrollo de aplicaciones web dinámicas con acceso a información almacenada en una base de datos. 63 El código fuente escrito en PHP es invisible al navegador web y al cliente ya que es el servidor el que se encarga de ejecutar el código y enviar su resultado HTML al navegador. Esto hace que la programación en PHP sea segura y confiable. Capacidad de conexión con la mayoría de los motores de base de datos que se utilizan en la actualidad, destaca su conectividad con MySQL y PostgreSQL. Capacidad de expandir su potencial utilizando módulos (llamados ext's o extensiones). Posee una amplia documentación en su sitio web oficial, entre la cual se destaca que todas las funciones del sistema están explicadas y ejemplificadas en un único archivo de ayuda. Es libre, por lo que se presenta como una alternativa de fácil acceso para todos. Permite aplicar técnicas de programación orientada a objetos. Biblioteca nativa de funciones sumamente amplia e incluida. No requiere definición de tipos de variables aunque sus variables se pueden evaluar también por el tipo que estén manejando en tiempo de ejecución. Tiene manejo de excepciones (desde PHP5). Si bien PHP no obliga a quien lo usa a seguir una determinada metodología a la hora de programar (muchos otros lenguajes tampoco lo hacen), aun haciéndolo, el programador puede aplicar en su trabajo cualquier técnica de programación o de desarrollo que le permita escribir código ordenado, estructurado y manejable. Un ejemplo de esto son los desarrollos que en PHP se han hecho del patrón de diseño Modelo Vista Controlador(MVC), que permiten separar el tratamiento y acceso a los datos, la lógica de control y la interfaz de usuario en tres componentes independientes. Inconvenientes Como es un lenguaje que se interpreta en ejecución, para ciertos usos puede resultar un inconveniente que el código fuente no pueda ser ocultado. 64 La ofuscación es una técnica que puede dificultar la lectura del código pero no la impide y, en ciertos casos, representa un costo en tiempos de ejecución. 2.17.2 MYSQL Es un sistema de gestión de bases de datos relacional, multihilo y multiusuario con más de seis millones de instalaciones.1 MySQL AB —desde enero de 2008 una subsidiaria de Sun Microsystems y ésta a su vez de Oracle Corporation desde abril de 2009— desarrolla MySQL como software libre en un esquema de licenciamiento dual. Por un lado se ofrece bajo la GNU GPL para cualquier uso compatible con esta licencia, pero para aquellas empresas que quieran incorporarlo en productos privativos deben comprar a la empresa una licencia específica que les permita este uso. Está desarrollado en su mayor parte en ANSI C. Al contrario de proyectos como Apache, donde el software es desarrollado por una comunidad pública y los derechos de autor del código están en poder del autor individual, MySQL es patrocinado por una empresa privada, que posee el copyright de la mayor parte del código. Esto es lo que posibilita el esquema de licenciamiento anteriormente mencionado. Además de la venta de licencias privativas, la compañía ofrece soporte y servicios. Para sus operaciones contratan trabajadores alrededor del mundo que colaboran vía Internet. MySQL AB fue fundado Axmark, Allan Larssony Michael Widenius. Características de la versión Un amplio subconjunto de ANSI SQL 99, y varias extensiones. Soporte a multiplataforma. Procedimientos almacenados Disparadores (triggers). Vistas actualizables. 65 por David Soporte a VARCHAR INFORMATION_SCHEMA Modo Strict Soporte X/Open XA de transacciones distribuidas; transacción en dos fases como parte de esto, utilizando el motor InnoDB de Oracle. Motores de almacenamiento independientes (MyISAM para lecturas rápidas, InnoDB para transacciones e integridad referencial). Transacciones con los motores de almacenamiento InnoDB, BDB Y Cluster; puntos de recuperación (savepoints) con InnoDB. Soporte para SSL. Query caching Sub-SELECTs (o SELECTs anidados). Réplica con un maestro por esclavo, varios esclavos por maestro, sin soporte automático para múltiples maestros por esclavo. Búsqueda de campos de texto completos usando el motor de almacenamiento MyISAM. Embedded database library Soporte completo para Unicode. Conforme a las reglas ACID usando los motores InnoDB, BDB y Cluster. Shared-nothing clustering through MySQL Cluster. 66 CAPÍTULO 3 67 3.1 DESARROLLO DEL SISTEMA DE PROGRAMACION ACADEMICA DE LA FACULTAD DE CONTADURIA Y ADMINISTRACIÓN 68 BORRAR EXPERIENCIA EDUCATIVA function selecion(){ $con=mysql_query("select *from materia"); echo ' <form name="form2" method="post" action="AM.php?var=3"> Buscar Tutor <select name="select">'; while( $row=mysql_fetch_array($con)) { echo "<option value='".$row[0]."'>".$row[1]."</option>"; } echo'<input name="borrar" type="submit"></form>'; if($_POST['borrar']){ $id=$_POST['select']; echo $id; mysql_query("delete from materia where id_materia='$id'"); {echo "<p>Elemento Borado</p>";} } } Este script permite seleccionar una experiencia educativa por nombre, y poder eliminarla de la base de datos. 69 IMPORTAR EXPERIENCIA EDUCATIVA function formulario( ){ echo <form action="convertir.php" method="post" enctype="multipart/form-data"> <input name="archivo" type="file" size="35" /> 70 <input name="enviar" type="submit" value="Upload File" /> <input name="action" type="hidden value="upload" /> </form>'; } Este script permite llamar a otro script (converit.php) el cual realiza la importación de datos desde una Hoja de Excel a la base de datos mysql. 71 ALTA DE EXPERIENCIA EDUCATIVA function agregar(){ echo ' <table > <tr> <td width="80" scope="row">ID <td width="175"><label> <input type="text" name="id" id="matricula" value= ""> </label></td> </tr> <tr> < td scope="row"> E.Educativa <td><label> <input type="text" name="materia" id="" value="" /> 72 </label></td> </tr> <td scope="row"> Creditos <td><label> <input type="text" name="creditos" id="" value=""/> </label></td> </tr> <tr> <td scope="row">Requisito <td><label> <input type="text" name="requisito" id="" value=""/> </label></td> </tr> <tr><td scope="row">Carrera<td> <label> <select name="carrera" id="carrera"> <option value="1">Sistemas Comp. Admin.</option> <option value="2">Contaduria</option> <option value="3">Administracion</option> <option value="4">Ges. y Dir. de Negocios</option> </select></label> </td> </tr> <tr> <td scope="row">Bloque<td> <label> <select name="bloque" id="semestre"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option><option value="4">4</option> value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> 73 <option </select> </label> </td> </tr> <td scope="row"> <tr> <td><label> <input type="submit" name="enviar" id="button" value="Guardar" /> </label></td></tr></td> La función agregar genera </table>';} ?> un formulario de registro de nuevas experiencias educativas, y los almacena en la base de datos. EXPLORAR OPCIONES EXPERIENCIAS EDUCATIVAS <?php if($_GET['var']==2){agregar();} if($_GET['var']==3){selecion();}?> <?php if($_GET['var']==1){formulario();}?> 74 Este script genera dinámicamente las opciones referentes a los formularios que se muestran según la opción elegida por el usuario. ALTA TUTOR <?php include("conexion.php"); if(isset($_POST['enviar'])){ //variables $id=$_POST['id']; 75 $nombre=$_POST['nombre']; $apellidos=$_POST['apellidos']; //Guardar Datos $consulta=mysql_query("insert into tutor values('$id','$nombre','$apellidos')"); } Este script procesa los datos enviados por el formulario de alta a tutores y utiliza parámetros para almacenar los datos personales de un cada tutor. 76 MODIFICAR TUTOR if(isset($_POST['busca'])){ $id=$_POST['select']; $consulta=mysql_query("select *from tutor where id_tutor='$id'"); 77 $est=mysql_fetch_array($consulta); $id=$est['0']; $nombre=$est[1]; $apellido=$est[2]; } ?> Este código extrae los datos de un tutor especificado por el ID ,y lo asigna a un formulario que permite realizar modificaciones posteriormente. CONSULTA TUTOR <?php } if((isset($_GET['var2']))&&($_GET['var2']=2)){ $con=mysql_query("select *from tutor"); ?> <form name="form2" method="post" action="AT.php?var2=2"> <p>Buscar Tutor <select name="select"><?php while( $row=mysql_fetch_array($con)) { 78 echo "<option value='".$row[0]."'>".$row[1]. " ".$row[2]."</option>"; }?> Este script da la opción de consultar la información de un tutor ,mediante la selección por nombre de los mismos. 79 BORRAR TUTOR <?php if((isset($_GET['var3']))&&($_GET['var3']=3)){ $con=mysql_query("select *from tutor"); ?> <form name="form3" method="post" action="AT.php?var3=3"> <p>Buscar Tutor <select name="select"> <?php while( $row=mysql_fetch_array($con)) echo "<option value='".$row[0]."'>".$row[1]. { ".$row[2]."</option>"; }?> </select> <input name="borrar" type="submit" value="Borrar"> </p> </form> <?php if(isset($_POST['borrar'])){ $id=$_POST['select']; $a=mysql_query("delete from tutor where id_tutor='$id'"); if($a){echo "Elemento Borado";} }} ?> 80 Este script realiza consulta a la base de datos y extrae los datos del tutor especificado para posteriormente borrar el registro adecuado. ALTA ESTUDIANTE <?php include("conexion.php"); $matricula=$_POST['matricula']; $nombre=$_POST['nombre']; $paterno=$_POST['paterno']; $materno=$_POST['paterno']; $carrera=$_POST['carrera']; $semestre=$_POST['semestre']; $consulta=mysql_query("insert into estudiante values('$matricula','$nombre','$paterno','$materno','$carrera',$semestre)"); ?> Este script toma como variables los datos del formulario de alta estudiante para crear un registro en la base de datos. 81 MODIFICAR ESTUDIANTE <?php include("conexion.php"); if(!isset($_POST['enviar'])){ $matricula=$_POST['matricula']; $nombre=$_POST['nombre']; $paterno=$_POST['paterno']; $materno=$_POST['materno']; $carrera=$_POST['carrera']; $semestre=$_POST['semestre']; $consulta=mysql_query("update estudiante set matricula='$matricula', nombre='$nombre',apellido_paterno='$paterno', apellido_materno='$materno',carrera='$carrera',semestre='$semestre' where matricula='$matricula'"); } ?> Este script realiza la consulta a la base de datos de un estudiante para extraer sus datos para poder realizar modificaciones. 82 BORRAR ESTUDIANTE <?php include("conexion.php"); if(!isset($_POST['Borrar'])){ $matricula=$_POST['matricula']; $consulta=mysql_query("Delete from estudiante where matricula='$matricula'”); } ?> Este script permite a cada estudiante, eliminar su información personal del sistema. En caso de ser necesario crear otra cuenta. 83 INGRESAR/CONSULTAR CALIFICACIONES <?php if($_GET['var']==3){ $con=mysql_query("select ,historial.materia_id_materia from historial INNER materia.nombre_materia JOIN materia historial.materia_id_materia=materia.id_materia ON where historial.estudiante_materia='$materia"); if($con){echo'si';} echo ' <form name="form1" method="post" action="IC.php?var=3"> <label></label> <select name="select2" size="1" id="select2">'; while( $row=mysql_fetch_array($con)) { echo "<option value='".$row[0]."'>".$row[1]."</option>"; } echo '</select> <input type="submit" name="ver1" id="button" value="Ver" /> </form>'; } 84 ?> <table width="216" border="0"> <tr> <td width="10" height="26" scope="row"> <td width="196"> <label> <?php if(isset($_GET['var2'])&&($_GET['var2']=2)){ ?> <form action="IC.php" method="post"> <select name="select1" size="1" id="select1"> <option selected="selected" value="1">Primero</option> <option value="2">Segundo</option> <option value="3">Tercero</option> <option value="4">Cuarto</option> </select> </label> <input type="submit" name="ver" id="button" value="Ver" /> </form><?php }?> <?php if(isset($_GET['var1'])&&($_GET['var1']=1)){?> <form name="form1" method="post" action=""> 85 <label></label> <select name="select2" size="1" id="select2"> <?php $con=mysql_query("select *from materia where programa_id_programa='12'"); while( $row=mysql_fetch_array($con)) { echo "<option value='".$row[0]."'>".$row[1]."</option>"; } ?> </select> <input type="submit" name="ver1" id="button" value="Ver" /> </form> <?php } ?> Este script permite generar dos formularios u opciones para que el alumno pueda capturar en el sistema su historial académico. 86 CONSULTA DE HISTORAL Y PROGRAMACION ACADEMICA <?php include("conexion.php"); if(isset($_POST['consultar'])){ $matricula=$_POST['matricula']; $materia=$_POST['materia']; $carrera=$_POST['carrera']; //$con=mysql_query("create view as prueba AS select *from estudiante where matricula like '$clave%'"); 87 mysql_query("drop view prueba"); $con2=mysql_query("create view prueba AS select *from historial where estudiante_matricula like '$matricula%' AND materia_id_materia!='$materia'"); $con=mysql_query("select *from estudiante RIGHT JOIN prueba ON prueba.estudiante_matricula=estudiante.matricula estudiante.carrera='$carrera'"); //while($imp=mysql_fetch_array($con)){ //echo $imp[0]."<p>"; } function consulta(){ $con=mysql_query("select *from materia"); echo ' <select name="materia">'; while( $row=mysql_fetch_array($con)) { echo "<option value='".$row[0]."'>".$row[1]."</option>"; } echo'</form>'; }?> <?php if($_POST['consultar']){?> <table width="430" height="63" border="1"> <tr> <th width="74" height="31" scope="col">Matricula</th> <th width="271" scope="col">Nombre</th> <th width="63" scope="col">Semestre</th> </tr><?php $i=1; while($row=mysql_fetch_array($con)){ 88 WHERE ?> <tr bgcolor= <?php if(($i%2)==0){ echo"#CCCCCC";}?> > <td><center> <span class="Estilo6"><b><font color="#000000"><?php echo $row[0];?> </b></span></font> </center></td> <td><span class="Estilo6"><b><center><font color="#000000"><?php echo $row[1]." ".$row[2]." ".$row[3]?></center></b></span></font></td> <td><span class="Estilo6"><b><center><font color="#000000"><?php $row[6]?></center></b></span></font></td> </tr> <?php $i++; }}?> </table> Este script realiza todas las opciones de consulta y filtrado de experiencias educativas, que permite llevar a cabo el control de programación de carga académica y demanda de experiencias educativas por parte del usuario principal. 89 CONSULTA ESTUDIANTES Y AVANZE ACADEMICO <?php if($_POST['consultar']){?> <table width="430" height="63" border="1"> <tr> <th width="74" height="31" scope="col">Matricula</th> <th width="271" scope="col">Nombre</th> <th width="63" scope="col">Semestre</th> </tr><?php $i=1; while($row=mysql_fetch_array($con)){ ?> 90 <tr bgcolor= <?php if(($i%2)==0){ echo"#CCCCCC";}?> > <td><center> <span class="Estilo6"><b><font color="#000000"><?php echo $row[0];?> </b></span></font> </center></td> <td><span class="Estilo6"><b><center><font color="#000000"><?php echo $row[1]." ".$row[2]." ".$row[3]?></center></b></span></font></td> <td><span class="Estilo6"><b><center><font color="#000000"><?php $row[6]?></center></b></span></font></td> </tr> <?php $i++; }}?> </table> Este script permite consultar a cada estudiante su avance o historial académico, muestra las materias cursadas y pendientes. 91 REPORTES GRAFICOS <?php // content="text/plain; charset=utf-8" require_once ('jpgraph/jpgraph.php'); require_once ('jpgraph/jpgraph_bar.php'); 92 // Create the graph. These two calls are always required $graph = new Graph(350,220,'auto'); $graph->SetScale("intint"); mysql_pconnect('localhost','root','root'); mysql_select_db('sistemauv'); $result=mysql_query("select carrera , COUNT(*) AS car from estudiante RIGHT JOIN prueba ON prueba.estudiante_matricula=estudiante.matricula GROUP BY carrera"); if($result) //$row=mysql_fetch_assoc($result); $y=array(); $i=0; $num=mysql_num_rows($result); while($row=mysql_fetch_assoc($result)){ if($i<$num){ $y[$i]=$row['car']; }$i++;} $x=array("LSCA","LC","LA","LGDN"); //$theme_class="DefaultTheme"; 93 //$graph->SetTheme(new $theme_class()); $datay=$y; // set major and minor tick positions manually $graph->SetBox(false); //$graph->ygrid->SetColor('gray'); $graph->ygrid->SetFill(false); $graph->xaxis->SetTickLabels($x); $graph->xaxis->SetTickSide(SIDE_BOTTOM); $graph->xaxis->scale->ticks->Set(2,1.5); $graph->xaxis->HideTicks(true,true); $graph->yaxis->HideLine(false); $graph->xaxis->HideLine(false); $graph->yaxis->HideLine(false); $graph->yaxis->HideTicks(true,false); $graph->yaxis->scale->ticks->Set(1,1); // Create the bar plots $b1plot = new BarPlot($datay); 94 // ...and add it to the graPH $graph->Add($b1plot); $b1plot->SetColor("white"); $b1plot->SetFillGradient("blue","white",GRAD_LEFT_REFLECTION); $b1plot->SetWidth(45); //$graph->title->Set('ESTADISTICAS'); $graph->xaxis->title->Set('Programas Educativos'); $graph->yaxis->title->Set('Estudiantes'); // Display the graph $graph->Stroke(); ?> Este script genera los reportes gráficos del sistema a través de cadenas de parámetros para la extracción de los datos de la base de datos. 95 CONEXION <?php $dbhost="localhost"; // host del MySQL (generalmente localhost) $dbusuario="root"; // nombre de usuario $dbpassword="root"; // password de acceso para el usuario de la $db="sistemauv"; // Base de datos $conexion = mysql_connect($dbhost,$dbusuario,$dbpassword); echo mysql_error(); mysql_select_db($db, $conexion); echo mysql_error(); ?> Este script realiza la conexión principal a la base de datos en MYSQL. 96 REPORTES EN FORMATO PDF <?php require('fpdf.php'); class PDF_MySQL_Table extends FPDF { 97 var $ProcessingTable=false; var $aCols=array(); var $TableX; var $HeaderColor; var $RowColors; var $ColorIndex; function Header() { //Print the table header if necessary if($this->ProcessingTable) $this->TableHeader(); } function TableHeader() { $this->SetFont('Arial','B',12); $this->SetX($this->TableX); $fill=!empty($this->HeaderColor); if($fill) $this->SetFillColor($this->HeaderColor[0],$this->HeaderColor[1],$this>HeaderColor[2]); foreach($this->aCols as $col) $this->Cell($col['w'],6,$col['c'],1,0,'C',$fill); $this->Ln(); } 98 function Row($data) { $this->SetX($this->TableX); $ci=$this->ColorIndex; $fill=!empty($this->RowColors[$ci]); if($fill) $this->SetFillColor($this->RowColors[$ci][0],$this->RowColors[$ci][1],$this>RowColors[$ci][2]); foreach($this->aCols as $col) $this->Cell($col['w'],5,$data[$col['f']],1,0,$col['a'],$fill); $this->Ln(); $this->ColorIndex=1-$ci; } function CalcWidths($width,$align) { //Compute the widths of the columns $TableWidth=0; foreach($this->aCols as $i=>$col) { $w=$col['w']; if($w==-1) $w=$width/count($this->aCols); elseif(substr($w,-1)=='%') 99 $w=$w/100*$width; $this->aCols[$i]['w']=$w; $TableWidth+=$w; } //Compute the abscissa of the table if($align=='C') $this->TableX=max(($this->w-$TableWidth)/2,0); elseif($align=='R') $this->TableX=max($this->w-$this->rMargin-$TableWidth,0); else $this->TableX=$this->lMargin; } function AddCol($field=-1,$width=-1,$caption='',$align='L') { //Add a column to the table if($field==-1) $field=count($this->aCols); $this->aCols[]=array('f'=>$field,'c'=>$caption,'w'=>$width,'a'=>$align); } function Table($query,$prop=array()) { //Issue query $res=mysql_query($query) or die('Error: '.mysql_error()."<BR>Query: $query"); 100 //Add all columns if none was specified if(count($this->aCols)==0) { $nb=mysql_num_fields($res); for($i=0;$i<$nb;$i++) $this->AddCol(); } //Retrieve column names when not specified foreach($this->aCols as $i=>$col) { if($col['c']=='') { if(is_string($col['f'])) $this->aCols[$i]['c']=ucfirst($col['f']); else $this->aCols[$i]['c']=ucfirst(mysql_field_name($res,$col['f'])); } } //Handle properties if(!isset($prop['width'])) $prop['width']=0; if($prop['width']==0) $prop['width']=$this->w-$this->lMargin-$this->rMargin; if(!isset($prop['align'])) $prop['align']='C'; 101 if(!isset($prop['padding'])) $prop['padding']=$this->cMargin; $cMargin=$this->cMargin; $this->cMargin=$prop['padding']; if(!isset($prop['HeaderColor'])) $prop['HeaderColor']=array(); $this->HeaderColor=$prop['HeaderColor']; if(!isset($prop['color1'])) $prop['color1']=array(); if(!isset($prop['color2'])) $prop['color2']=array(); $this->RowColors=array($prop['color1'],$prop['color2']); //Compute column widths $this->CalcWidths($prop['width'],$prop['align']); //Print header $this->TableHeader(); //Print rows $this->SetFont('Arial','',11); $this->ColorIndex=0; $this->ProcessingTable=true; while($row=mysql_fetch_array($res)) $this->Row($row); $this->ProcessingTable=false; $this->cMargin=$cMargin; $this->aCols=array(); }} ?> 102 <?php require('mysql_table.php'); class PDF extends PDF_MySQL_Table { function Header() { //Title $this->SetFont('Arial','',12); $this->Cell(0,6,'REPORTES',0,1,'C'); $this->Ln(10); //Ensure table header is output parent::Header(); } } //Connect to database mysql_connect('localhost','root','root'); mysql_select_db('sistemauv'); $pdf=new PDF(); $pdf->AddPage(); //First table: put all columns automatically $pdf->Table("select matricula ,nombre,apellido_paterno,apellido_materno from estudiante RIGHT JOIN prueba ON prueba.estudiante_matricula=estudiante.matricula WHERE estudiante.carrera='".$_GET['carrera']."'"); $pdf->Output(); ?> 103 CAPITULO 4 104 Introducción El capítulo final de esta obra tiene el propósito de delimitar y presentar las conclusiones obtenidas a partir de los objetivos planteados, y el trabajo elaborado para la consecución de los mismos. La cual describe los elementos clave que han sustentado el diseño y desarrollo del sistema de programación académica. Así mismo se dedica un apartado de recomendaciones las cuales se realizaron a fin de proponer acciones que si se llevan a cabo brindaran mayores beneficios a los usuarios del sistema y que son un complemento en futuras referencias. Por último se anexa un glosario de términos que atiende a la descripción de terminología mencionada en este proyecto y la cual es un complemento para facilitar la lectura; Y la bibliografía utilizada para la obtención de la información aquí presentada. 105 4. 1 Conclusiones y Resultados El objetivo de esta obra ha sido presentar la planeación y creación de un sistema de programación académica bajo el enfoque de diseño y programación de sistemas de información. Concretamente se han detallado los módulos desarrollados para este proyecto por medio de las distintas tecnologías para aplicaciones web, mismas que están descritas en capítulos anteriores. Cabe mencionar que el producto presentado, es decir el sistema que se diseñó, fue planeado para almacenar los datos relacionados a los estudiantes y su historial académico, datos de tutores, materias y programas académicos, así mismo ofrecer las capacidades de consulta y presentación de reportes que facilitan la labor realizada por el usuario, por lo que se puede señalar que Se cumple con los requerimientos especificados, en una etapa previa de análisis. El desarrollo de este proyecto está delimitado a un enfoque de sistemas convencional, dividido en etapas de ciclo de vida de sistemas, que en este trabajo son análisis, diseño y desarrollo. La etapa de análisis es realizada bajo el enfoque UML, el cual es un estándar de modelado de sistemas, que permite proporciona una serie de lineamientos que permiten un análisis completo y versátil. La fase de diseño es realizada a través de lineamientos para la definición y estructura de datos, implementación de módulos de programación y maquetación y accesibilidad de aplicaciones. La normalización y propiedades de las base de datos relacionales forma parte indispensable del Diseño. Los recursos utilizados para la creación de este sistema, ofrecen características ideales que brindan ventajas significativas en la creación de un sistema con los requisitos identificados en este proyecto. En el desarrollo de sistema se integró lenguajes de programación WEB como lo son HTML, JavaScript, XML, así como un lenguaje de programación de lado de servidor como lo es PHP, el cual ofrece una gran flexibilidad y solides a la aplicación, esto permitió crear una aplicación funcional y escalable a mediano plazo. 106 En relación a esto se menciona que después de finalizar la realización del sistema de programación Académica se han obtenido los siguientes resultados: Procesamiento de consultas o filtros específicos de estudiantes, que permite conocer su condición de inscripción respecto a una experiencia educativa especifica. Registro detallado del historial académico de cada estudiante, el cual permite tener un seguimiento apropiado en próximas inscripciones. Funciones atribuidas al usuario principal (secretario académico) como lo son: alta, baja modificaciones de experiencias educativas, tutores y programas educativos. Descripción grafica de la demanda de experiencias educativas, de los distintos programas existentes. Integración de opciones de registro para los estudiantes y su historial académico. Por ultimo cabe mencionar que se ha realizado un proyecto sólido y con posibilidades de crecimiento, el cual brindara diversos beneficios a los usuarios directos e indirectos. Esperamos sea de gran utilidad y que los beneficios obtenidos justifiquen su realización. 107 4.2 Recomendaciones 1. Se recomienda realizar revisiones periódicas del sistema, con el objetivo de realizar modificaciones, mejoras y corrección de errores. Es importante realizar los cambios de acuerdo a una metodología de programación por módulos, lo cual traerá beneficios a futuros cambios. 2. Es importante mantener un respaldo del sistema y de los datos almacenados, así como un control de versiones, para dar un correcto seguimiento y mantenimiento al sistema. 3. Integrar el sistema a la base de datos principal de la Universidad Veracruzana. 4. Implementar módulos de reportes en formatos PDF y un módulo de exportación de datos a la hoja de cálculos Excel. 108 4.3 Glosario API: Es el conjunto de funciones y procedimientos o métodos, en la programación orientada a objetos que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstracción. Aplicación Web: Son aquellas aplicaciones que los usuarios pueden utilizar accediendo a un servidor web a través de Internet o de una intranet mediante un navegador. Ingeniería de software: Es el área de la ingeniería que ofrece métodos y técnicas para desarrollar y mantener software. Esta ingeniería trata con áreas muy diversas de la informática y de las ciencias de la computación. JavaScript: Es un lenguaje de scripting basado en objetos no tipeado y liviano, utilizado para acceder a objetos en aplicaciones. Servidor: Es una computadora que, formando parte de una red, provee servicios a otras computadoras denominadas clientes. También se suele denominar con la palabra servidor a: Una aplicación informática o programa que realiza algunas tareas en beneficio de otras aplicaciones llamadas clientes. Algunos servicios. SGBD Son un tipo de software muy específico, dedicado a servir de interfaz entre la base de datos, el usuario y las aplicaciones que la utilizan. 109 4.4 Bibliografía Kendall, Kenneth., Kendall, Julie. (2005). Análisis y diseño de sistemas. México: Pearson educación. Louden, K. C. (s.f.). Kenneth C. Louden. Ciencias e Ingenierías. Lancker, L. V. (s.f.). HTML 4: dominar el código fuente. Eni. Senn, James. (1990). Análisis y diseño de sistemas de información. México: Mc Graw Hill. Desarrollo Web . (2009). Recuperado el Octubre de 2011, de http://es.wikipedia.org/wiki/Programaci%C3% Ángel Cobo, P. G. (s.f.). PHP y MySQL. Tecnología para el desarrollo de aplicaciones web. Díaz de Santos. Wikipedia. (2009). Recuperado el 18 de Octubre de 2011, de Octubre de 2011, de http://es.wikipedia.org/wiki/Programaci%C3% Desarrollo Web . (2009). Recuperado http://es.wikipedia.org/wiki/Programaci%C3% 110 el Wikipedia. (2009). Recuperado el 18 de Octubre de 2011, http://es.wikipedia.org/wiki/Programaci%C3% 4.5 Anexo Código del sistema <?php include("conexion.php"); if(isset($_POST['enviar'])){ //variables $id=$_POST['id']; $nombre=$_POST['nombre']; $apellidos=$_POST['apellidos']; //Guardar Datos $consulta=mysql_query("insert into tutor values('$id','$nombre','$apellidos')"); } if(isset($_POST['busca'])){ $id=$_POST['select']; $consulta=mysql_query("select *from tutor where id_tutor='$id'"); $est=mysql_fetch_array($consulta); $id=$est['0']; $nombre=$est[1]; 111 de $apellido=$est[2]; } <script type="text/javascript"> </head><body > <table width="100%" cellspacing="0" class="bodyborder" cellpadding="0" border="0"> <tr> <td valign="top" align="left" width="100%"> <table width="100%" cellspacing="0" cellpadding="0" border="0"> <tr> <td width="100%" align="left" valign="top"> <table width="100%" cellspacing="0" cellpadding="2" border="0"> <tr> <td valign="middle" align="center" width=25 class="status_line" height="17"> <div><a href="http://www.rickyswebtemplates.com/pmd11_04_00"><img src="http://www.rickyswebtemplates.com/pmd11_04_00/template/default/images/h ome.gif" border=0 alt="HOME"></a></div> </td> <td valign="middle" align="left" class="status_line"> <div></div> </td> 112 <td valign="middle" align="right" class="status_line" height="17"> <div><a href="http://www.rickyswebtemplates.com/pmd11_04_00/members/user_login.php" ><span class="status_line">Login Now</span></a></div> </td> </tr> </table> <table width="100%" cellspacing="0" cellpadding="0" border="0"> <tr> <td width="50%" align="left" valign="top"><img src="../../../../../Users/TEMP.JuanAntonio-PC.002/Desktop/Documents/SYSTEM UV/cats.jpg" alt="Universidad Veracruzana" width="105" height="108"><br></td> <td width="50%" align="right" valign="top"><img src="../../../../../Users/TEMP.JuanAntonio-PC.002/Desktop/Documents/SYSTEM UV/lis.png" alt="LIS" width="138" height="100"><br></td> </tr> </table> </td> </tr> <tr> <td width="100%" height="1" bgcolor="#DADADA"> 113 <img src="http://www.rickyswebtemplates.com/pmd11_04_00/template/default/images/pi xel.gif" alt=""><br> </td> </tr> <tr> <td valign="middle" align="left" width="100%"><table width="100%" cellspacing="0" cellpadding="0" border="0"> <tr> <td valign="top" align="center" width="20%"> <!-- SIDEBOX CODE --> <br> <table width="90%" cellspacing="0" cellpadding="5" border="0"> <tr> <td class="border2" width="100%" height="25" valign=middle align=center> <p><span class="text">Menu</span></p> </td> </tr> <tr> <td class="border" width="100%" align="left" valign="top"> <br /> <div class="urbangreymenu"> 114 <h3 class="headerbar"><a href="http://www.dynamicdrive.com/style/">Materias</a></h3> <ul class="submenu"> <li><a href="AM.php?var=1">Importar</a></li> <li><a href="AM.php?var=2">Agregar</a></li> <li><a href="AM.php?var=3">Borrar</a></li> </ul> <h3 class="headerbar"><a href="http://www.javascriptkit.com">Tutores</a></h3> <ul class="submenu"> <li></li> <li></li> <li><a href="AT.php?var=1">Alta</a></li> <li><a href="AT.php?var2=2">Modificacion</a></li> <li><a href="AT.php?var3=3">Borrar</a></li> <ul class="submenu"> <li><a href="CF.php">Matricula</a></li> <li><a href="CF.php?var=2">Alumno</a></li> <p class="Estilo1">Estudiantes</p> 115 <p><img src="../../../../../Users/TEMP.JuanAntonio- PC.002/Desktop/Documents/SYSTEM UV/anigif.gif" alt="Estudiantes" width="201" height="129"></p></td> <td valign="top" align="center" width="60%"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tr> <td valign="middle" align="center" width="100%"></td> </tr> </table> <br> <table width="100%" cellspacing=0 cellpadding=2 border=0> <tr> <td class="border2" width="100%" height="25" valign="middle" align="center"><p>Estudiantes</p></td> </tr> <tr> <td class="border" width="100%" align="left" valign="top"> <form name="searchform" action="http://www.rickyswebtemplates.com/pmd11_04_00/search-all.php" method="get"> </form> <script type="text/javascript"><!-document.getElementById('keyword').focus(); 116 //--></script> </td> </tr> </table> <p></p> <?php if((isset($_GET['var']))&&($_GET['var']=1)){?> <center> <form id="form1" name="form1" method="post" action=""> <table width="216" border="0"> <tr> <td width="61" scope="row">ID <td width="145"><label> <input type="text" name="id" id="matricula" /> </label></td> </tr> <td scope="row">Apellidos<td><label> <input type="text" name="apellidos" id="paterno" /> </label></td> </tr> <tr> <td scope="row"> 117 <td><label> <input type="submit" name="enviar" id="button" value="Guardar" /> </label></td> </tr> </table> </form></center><?php } if((isset($_GET['var2']))&&($_GET['var2']=2)){ $con=mysql_query("select *from tutor"); ?> <form name="form2" method="post" action="AT.php?var2=2"> <p>Buscar Tutor <select name="select"><?php while( $row=mysql_fetch_array($con)) { echo "<option value='".$row[0]."'>".$row[1]. ".$row[2]."</option>"; }?> </select> <input type="submit" name="busca" id="button2" value="Ver"> </p> <label></label> </form> 118 " <center> <form id="form1" name="form1" method="post" action=""> <table width="216" border="0"> <tr> <td width="61" scope="row">ID <td width="145"><label> <input type="text" name="matricula" id="matricula" value="<?php echo $id; ?>"/> </label></td></tr> <td scope="row">Nombre <td><label> <input type="text" name="nombre" id="nombre" value="<?php echo $nombre; ?>" /> </label></td> </tr> <tr> <td scope="row">Apellidos<td><label> <input type="text" name="paterno" id="paterno" value="<?php echo $apellido; ?>"/> </label></td> </tr> <tr> <td scope="row"> 119 <td><label> <input type="submit" name="enviar" id="button" value="Guardar" /> </label></td> </tr> </table> <p>&nbsp;</p> </form></center> <?php } ?> <?php if((isset($_GET['var3']))&&($_GET['var3']=3)){ $con=mysql_query("select *from tutor"); ?> <form name="form3" method="post" action="AT.php?var3=3"> <p>Buscar Tutor <select name="select"> <?php while( $row=mysql_fetch_array($con)) { echo "<option ".$row[2]."</option>"; }?> 120 value='".$row[0]."'>".$row[1]. " </select> <input name="borrar" type="submit" value="Borrar"> </p> </form> <?php if(isset($_POST['borrar'])){ $id=$_POST['select']; $a=mysql_query("delete from tutor where id_tutor='$id'"); if($a){echo "Elemento Borado";} }} ?> <?php include("conexion.php"); if(isset($_POST['consultar'])){ $matricula=$_POST['matricula']; $materia=$_POST['materia']; $carrera=$_POST['carrera']; //$con=mysql_query("create view as prueba AS select *from estudiante where matricula like '$clave%'"); mysql_query("drop view prueba"); $con2=mysql_query("create view prueba AS select *from historial where estudiante_matricula like '$matricula%' AND materia_id_materia!='$materia'"); 121 $con=mysql_query("select *from estudiante RIGHT JOIN prueba ON prueba.estudiante_matricula=estudiante.matricula WHERE estudiante.carrera='$carrera'"); //while($imp=mysql_fetch_array($con)){ //echo $imp[0]."<p>"; } function consulta(){ $con=mysql_query("select *from materia"); echo ' <select name="materia">'; while( $row=mysql_fetch_array($con)) { echo "<option value='".$row[0]."'>".$row[1]."</option>"; } echo'</form>'; }?><p><?php consulta();?> <input type="submit" name="consultar" id="button" value="Consulta" /></p> </form><br></td> </tr> </table><?php if($_POST['consultar']){?> 122 <table width="430" height="63" border="1"> <tr> <th width="74" height="31" scope="col">Matricula</th> <th width="271" scope="col">Nombre</th> <th width="63" scope="col">Semestre</th> </tr><?php $i=1; while($row=mysql_fetch_array($con)){ ?> <tr bgcolor= <?php if(($i%2)==0){ echo"#CCCCCC";}?> > <td><center> <span class="Estilo6"><b><font color="#000000"><?php echo $row[0];?> </b></span></font> </center></td> <td><span class="Estilo6"><b><center><font color="#000000"><?php echo $row[1]." ".$row[2]." ".$row[3]?></center></b></span></font></td> <td><span class="Estilo6"><b><center><font $row[6]?></center></b></span></font></td> </tr> <?php $i++; }}?> 123 color="#000000"><?php <?php include("conexion.php"); $matricula=$_POST['matricula']; $nombre=$_POST['nombre']; $paterno=$_POST['paterno']; $materno=$_POST['paterno']; $carrera=$_POST['carrera']; $semestre=$_POST['semestre']; $consulta=mysql_query("insert into estudiante values('$matricula','$nombre','$paterno','$materno','$carrera',$semestre)");?> <?php include'conexion.php'; $consulta=mysql_query("select *from materia where bloque_materia=1"); while($mat=mysql_fetch_assoc($consulta)){?> <tr> <th scope="row"><div align="center"><?php echo $mat['id_materia']; ?></div></th> <td><div align="center"><?php echo $mat['nombre_materia']; align="center"><?php echo $mat['creditos_materia']; ?></div></td> <td><div ?></div></td> <td></td> <td>&nbsp;</td> </tr><?php }?> 124 <?php include("conexion.php"); if(isset($_POST['consultar'])){ $matricula=$_POST['matricula']; $materia=$_POST['materia']; $carrera=$_POST['carrera']; //$con=mysql_query("create view as prueba AS select *from estudiante where matricula like '$clave%'"); mysql_query("drop view prueba"); $con2=mysql_query("create view prueba AS select *from historial where estudiante_matricula like '$matricula%' AND materia_id_materia!='$materia'"); $con=mysql_query("select *from estudiante RIGHT JOIN prueba ON prueba.estudiante_matricula=estudiante.matricula estudiante.carrera='$carrera'"); //while($imp=mysql_fetch_array($con)){ //echo $imp[0]."<p>"; } function consulta(){ $con=mysql_query("select *from materia"); echo ' <select name="materia">'; 125 WHERE while( $row=mysql_fetch_array($con)) { echo "<option value='".$row[0]."'>".$row[1]."</option>"; } echo'</form>'; } ?> <?php require('fpdf.php'); class PDF_MySQL_Table extends FPDF { 126 var $ProcessingTable=false; var $aCols=array(); var $TableX; var $HeaderColor; var $RowColors; var $ColorIndex; function Header() { //Print the table header if necessary if($this->ProcessingTable) $this->TableHeader(); } function TableHeader() { $this->SetFont('Arial','B',12); $this->SetX($this->TableX); $fill=!empty($this->HeaderColor); if($fill) $this->SetFillColor($this->HeaderColor[0],$this->HeaderColor[1],$this>HeaderColor[2]); foreach($this->aCols as $col) $this->Cell($col['w'],6,$col['c'],1,0,'C',$fill); $this->Ln(); } 127 function Row($data) { $this->SetX($this->TableX); $ci=$this->ColorIndex; $fill=!empty($this->RowColors[$ci]); if($fill) $this->SetFillColor($this->RowColors[$ci][0],$this->RowColors[$ci][1],$this>RowColors[$ci][2]); foreach($this->aCols as $col) $this->Cell($col['w'],5,$data[$col['f']],1,0,$col['a'],$fill); $this->Ln(); $this->ColorIndex=1-$ci; } function CalcWidths($width,$align) { //Compute the widths of the columns $TableWidth=0; foreach($this->aCols as $i=>$col) { $w=$col['w']; if($w==-1) $w=$width/count($this->aCols); elseif(substr($w,-1)=='%') 128 $w=$w/100*$width; $this->aCols[$i]['w']=$w; $TableWidth+=$w; } //Compute the abscissa of the table if($align=='C') $this->TableX=max(($this->w-$TableWidth)/2,0); elseif($align=='R') $this->TableX=max($this->w-$this->rMargin-$TableWidth,0); else $this->TableX=$this->lMargin; } function AddCol($field=-1,$width=-1,$caption='',$align='L') { //Add a column to the table if($field==-1) $field=count($this->aCols); $this->aCols[]=array('f'=>$field,'c'=>$caption,'w'=>$width,'a'=>$align); } function Table($query,$prop=array()) { //Issue query $res=mysql_query($query) or die('Error: '.mysql_error()."<BR>Query: $query"); 129 //Add all columns if none was specified if(count($this->aCols)==0) { $nb=mysql_num_fields($res); for($i=0;$i<$nb;$i++) $this->AddCol(); } //Retrieve column names when not specified foreach($this->aCols as $i=>$col) { if($col['c']=='') { if(is_string($col['f'])) $this->aCols[$i]['c']=ucfirst($col['f']); else $this->aCols[$i]['c']=ucfirst(mysql_field_name($res,$col['f'])); } } //Handle properties if(!isset($prop['width'])) $prop['width']=0; if($prop['width']==0) $prop['width']=$this->w-$this->lMargin-$this->rMargin; if(!isset($prop['align'])) $prop['align']='C'; 130 if(!isset($prop['padding'])) $prop['padding']=$this->cMargin; $cMargin=$this->cMargin; $this->cMargin=$prop['padding']; if(!isset($prop['HeaderColor'])) $prop['HeaderColor']=array(); $this->HeaderColor=$prop['HeaderColor']; if(!isset($prop['color1'])) $prop['color1']=array(); if(!isset($prop['color2'])) $prop['color2']=array(); $this->RowColors=array($prop['color1'],$prop['color2']); //Compute column widths $this->CalcWidths($prop['width'],$prop['align']); //Print header $this->TableHeader(); //Print rows $this->SetFont('Arial','',11); $this->ColorIndex=0; $this->ProcessingTable=true; while($row=mysql_fetch_array($res)) $this->Row($row); $this->ProcessingTable=false; $this->cMargin=$cMargin; $this->aCols=array(); }} ?> 131 <?php require('mysql_table.php'); class PDF extends PDF_MySQL_Table { function Header() { //Title $this->SetFont('Arial','',12); $this->Cell(0,6,'REPORTES',0,1,'C'); $this->Ln(10); //Ensure table header is output parent::Header(); } } //Connect to database mysql_connect('localhost','root','root'); mysql_select_db('sistemauv'); $pdf=new PDF(); $pdf->AddPage(); //First table: put all columns automatically $pdf->Table("select matricula ,nombre,apellido_paterno,apellido_materno from estudiante RIGHT JOIN prueba ON prueba.estudiante_matricula=estudiante.matricula WHERE estudiante.carrera='".$_GET['carrera']."'"); $pdf->Output(); ?> 132 <?php // content="text/plain; charset=utf-8" require_once ('jpgraph/jpgraph.php'); require_once ('jpgraph/jpgraph_bar.php'); 133 // Create the graph. These two calls are always required $graph = new Graph(350,220,'auto'); $graph->SetScale("intint"); mysql_pconnect('localhost','root','root'); mysql_select_db('sistemauv'); $result=mysql_query("select carrera , COUNT(*) AS car from estudiante RIGHT JOIN prueba ON prueba.estudiante_matricula=estudiante.matricula GROUP BY carrera"); if($result) //$row=mysql_fetch_assoc($result); $y=array(); $i=0; $num=mysql_num_rows($result); while($row=mysql_fetch_assoc($result)){ if($i<$num){ $y[$i]=$row['car']; }$i++;} $x=array("LSCA","LC","LA","LGDN"); //$theme_class="DefaultTheme"; 134 //$graph->SetTheme(new $theme_class()); $datay=$y; // set major and minor tick positions manually $graph->SetBox(false); //$graph->ygrid->SetColor('gray'); $graph->ygrid->SetFill(false); $graph->xaxis->SetTickLabels($x); $graph->xaxis->SetTickSide(SIDE_BOTTOM); $graph->xaxis->scale->ticks->Set(2,1.5); $graph->xaxis->HideTicks(true,true); $graph->yaxis->HideLine(false); $graph->xaxis->HideLine(false); $graph->yaxis->HideLine(false); $graph->yaxis->HideTicks(true,false); $graph->yaxis->scale->ticks->Set(1,1); // Create the bar plots $b1plot = new BarPlot($datay); 135 // ...and add it to the graPH $graph->Add($b1plot); $b1plot->SetColor("white"); $b1plot->SetFillGradient("blue","white",GRAD_LEFT_REFLECTION); $b1plot->SetWidth(45); //$graph->title->Set('ESTADISTICAS'); $graph->xaxis->title->Set('Programas Educativos'); $graph->yaxis->title->Set('Estudiantes'); // Display the graph $graph->Stroke(); ?> 136