Texto - Universidad Nacional Abierta

Anuncio
UNIVERSIDAD NACIONAL ABIERTA
VICERRECTORADO ACADÉMICO
ÁREA DE INGENIERÍA
CARRERA INGENIERÍA DE SISTEMAS
IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE
LA PROGRAMACIÓN ORIENTADA A ASPECTOS
Autor: Carlos Córdova, C.I.: 8.441.858
Tutor Académico: Ing. Rafael Caldera, C.I.: 7.122.533
Asesor Empresarial: Lic. Ana Fuentes, C.I.: 12.666.425
Cumaná, Centro Local Sucre (17)
Enero, 2007
ii
ÍNDICE DE CONTENIDO
Pág.
AGRADECIMIENTO …..…............................................................................
iii
DEDICATORIA ………....................................................................................
iv
ÍNDICE DE CONTENIDO ..............................................................................
v
RESUMEN .........................................................................................................
viii
INTRODUCCIÓN ............................................................................................. ix
CAPÍTULO I:
El problema
I.1.
Antecedentes del problema ..................................................................... 1
I.2.
Planteamiento del problema ................................................................... 2
I.3.
Objetivo general ……….………............................................................. 4
I.4.
Objetivos específicos .............................................................................. 4
I.5.
Estudio de factibilidad ……………………………………………….... 5
I.6.
Limitaciones y alcance ……………………………………………….... 6
I.7.
Justificación …..……….………............................................................. 7
CAPÍTULO II:
Marco teórico
II.1.
Ingeniería de Software …………………................................................ 8
II.2.
Ingeniería de Requisitos …………………............................................. 9
II.3.
Desarrollo de Software Orientado a Objetos (POO) ….......................... 16
II.4.
Programación Orientada a Objetos (POO) ............................................. 17
II.5.
Desarrollo de Software Orientado a Aspectos (DSOA) ......................... 20
II.5.1 Objetivo principal de DSOA ….………….………………….… 20
II.5.2 Breve reseña histórica ……….………….……..…………….… 21
II.5.3 La separación de incumbencias ………………..…………….… 23
II.5.4 Ventajas de la separación de incumbencias ……………………. 25
iii
II.5.5 Tiranía de la Descomposición dominante …..……………….… 26
II.5.6 Incumbencias Transversales …….……………..…………….… 27
II.5.7 Alternativas de Solución …………………………………….… 28
II.6.
Programación Orientada a Aspectos (POA) ........................................... 29
II.6.1 Terminología Básica ….………….………………………….… 30
II.6.2 Fundamentos de la Programación Orientada a Aspectos ……… 35
II.6.3 Lenguajes Orientados a Aspectos ……………………………… 36
II.6.3.1 Lenguajes de Aspectos de Dominio Específico …….… 37
II.6.3.2 Lenguajes de Aspectos de Propósito General ………… 38
CAPÍTULO III:
Marco metodológico
III.1. Tipo de investigación ............................................................................. 40
III.2. Nivel de la investigación ........................................................................ 40
III.3. Fuentes y técnicas de recolección de información ................................. 40
III.4. Metodología: Análisis y Diseño de Sistemas Orientado a Objetos
usando el Lenguaje Unificado de Modelación (UML) .......................... 41
III.5. Conceptos y diagramas de UML ………................................................ 43
CAPÍTULO IV:
Resultados
IV.1. Análisis de conceptos y definiciones del DSOA y de la POA ............... 47
IV.2. Implementación de la plataforma tecnológica …………….................... 51
IV.2.1
Instalación del lenguaje base (Java) …..……………..…….… 54
IV.2.2
Instalación del lenguaje de aspectos (AspectJ) …..…..……… 57
IV.3. Diseño del caso de estudio ….………………………………………… 61
IV.4. Solución al caso de estudio ……………………..………..…………… 64
IV.4.1
Investigación preliminar ……………...……………..…….… 64
IV.4.2
Requerimientos del sistema …………...……………..…….… 65
iv
IV.4.2.1
Requisitos funcionales ………………………………… 66
IV.4.2.2
Requisitos no funcionales ………..…………………… 67
IV.4.2.3
Requisitos funcionales vs. Requisitos no funcionales … 68
IV.4.3
Diseño del sistema …………………...……………...….….… 69
IV.4.3.1
Modelo de caso de uso ………………..……….……… 69
IV.4.3.2
Diagrama de clases ………………………….………… 70
IV.4.3.3
Diagrama de secuencia …………….……….……….… 71
IV.4.3.4
Diagrama de actividades …………………………….… 72
IV.4.3.5
Especificación de requisitos no funcionales ……..….… 73
IV.4.4
Desarrollo del software ………………...………..……..….… 76
IV.4.4.1
Construcción de la base de datos ….……………..…… 81
IV.4.4.2
Construcción del código base (clases)….…….…..…… 85
IV.4.4.3
Construcción del aspecto (requisitos no funcionales) … 86
IV.4.5 Prueba e implementación …………………………………….. 87
IV.4.5.1
Empaquetado e instalación del código base y aspecto … 87
IV.4.5.2
Creación del origen de datos …..………….……...…… 89
IV.4.5.3
Compilación y ejecución del código base …….…..…… 92
IV.4.5.4
Compilación y ejecución del código base y aspecto …... 94
IV.4.5.5
Comparación sistema base con sistema aspectual …..… 97
IV.4.6. Documentación …………………...…….……………..……… 100
Conclusiones ……............................................................................................... 101
Recomendaciones …........................................................................................... 102
Glosario ……....…............................................................................................... 103
Bibliografía …..…............................................................................................... 107
Anexos …..…....................................................................................................... 112
5
RESUMEN
Este trabajo consiste en la Implementación de Requisitos no Funcionales a
través de la Programación Orientada a Aspectos (POA) en un Sistema de Software.
De manera general, los requisitos funcionales capturan el comportamiento deseado
del sistema y pueden ser expresados como servicios o funciones; mientras los
requisitos no funcionales tales como: seguridad, disponibilidad, respuesta en tiempo
entre otros, especifican las condiciones que debe satisfacer el sistema, restringiendo,
condicionando o controlando la ejecución de los requisitos funcionales. Estos
requisitos no funcionales asociados generalmente a propiedades de calidad del
software y que en muchos casos se diseminan y entrecruzan con la funcionalidad
principal, dificultando su entendimiento, mantenimiento y reutilización, son
conocidos como incumbencias transversales o concerns transversales (“crosscutting
concerns”), dentro del emergente paradigma del Desarrollo de Software Orientado a
Aspectos (“Aspect-Oriented Software Development”, AOSD). Las técnicas utilizadas
en DSOA, se aperturan a partir de las investigaciones y aplicaciones de la POA, y
hacen esto posible al modularizar los aspectos transversales de un sistema de
software. La POA, surge tratando de solucionar dos problemas detectados durante el
proceso de desarrollo de software: el enmarañamiento del código y el hecho de que
determinados conceptos no se localizaban bien con la programación orientada a
objetos, sino que se esparcían entre distintas clases.
La POA, no está consolidada en la comunidad de la ingeniería de software,
actualmente profesionales de la academia y la industria realizan grandes inversiones,
a fin de poner a disposición los adelantos técnicos que permitan transitar hacia la
eficientemente adopción de este paradigma. La aceptación de un nuevo enfoque debe
pasar por la exploración y dominio de las tecnologías inherentes al mismo, al cual
deben incorporarse las Universidades y centros de investigación del país a fin de
apalancar su propio desarrollo tecnológico y contribuir activamente al desarrollo de
nuevas tecnologías.
En primer término se hizo un estudio, análisis y prueba de las tecnologías
inherentes referenciadas por diferentes autores para la aplicación de la POA. En este
estudio se comprobó que los requisitos no funcionales pueden ser manejados como
concerns transversales y los mismos ser implementados a través de la POA. Para
probar esto fue necesario el estudio e implantación de la plataforma tecnológica para
la POA, desarrollar un caso de estudio compuesto por un sistema base y aspecto. Se
aplicó la POA a través del caso de estudio para generar el sistema aspectual y
finalmente se establecieron las conclusiones y recomendaciones producto de los
resultados de la investigación.
Palabras claves: Programación Orientada a Aspectos, POA, DSOA, concerns,
crosscutting concerns, aspecto, pointcut, joint point, advises.
6
INTRODUCCIÓN
Desde sus comienzos, el desarrollo de software ha estado en constante
evolución, y en las últimas décadas han surgido varios paradigmas de programación
que han contribuido a hacerlo más eficiente. Cada etapa de la evolución se vio
marcada por nuevos enfoques para ayudar a los desarrolladores a manejar programas
cada vez más complejos. Los primeros programas se crearon mediante procesos a
través de conmutadores ubicados en el panel frontal de la computadora. Este enfoque
sólo era adecuado para programas pequeños. Seguidamente se inventó el lenguaje
ensamblador que permitió escribir programas más largos, luego otro avance
importante ocurrió en los años 50 cuando se inventó el primer lenguaje de alto nivel
(FORTRAN) [9].
Con los lenguajes de alto nivel, un programador estaba capacitado para
escribir programas con una longitud de varios de miles de líneas; sin embargo, este
enfoque presentaba el inconveniente de tener un código ilegible y difícil de tratar que
se convertía en “código espagueti”. La eliminación del “código espagueti” se
consiguió con la creación de los lenguajes de programación estructurados en los años
sesenta como Algol y Pascal. Con la programación estructurada se hicieron
programas basados en estructuras de control bien definidas, bloques de código, la
ausencia (o mínimo uso) de la instrucción GOTO, y subrutinas independientes que
soportan recursividad y variables locales [9].
Aunque la programación estructurada ha obtenido excelentes resultados
cuando se aplica a programas moderadamente complejos, nuevos enfoques que
promueven la reutilización futura, reducción de posteriores errores y futuro
mantenimiento han aperturado la evolución hacia nuevos paradigmas. A partir de este
punto surge la Programación Orientada a Objetos (POO), con lenguajes como
vii
ideas incorporadas en la programación estructurada y las combina con nuevos y
potentes conceptos que permiten organizar los programas de forma más efectiva. La
POO permite descomponer un problema en subgrupos relacionados. Cada subgrupo
pasa a ser un objeto que contiene sus propias instrucciones y datos, de esta manera la
complejidad se reduce y el programador puede tratar programas más largos. Este
enfoque cuyas principales características son el encapsulamiento, el polimorfismo y
la herencia y cuyos objetivos son la abstracción, la modularidad y la reusabilidad, se
consolidó hasta hoy como el último paradigma en el desarrollo de software [9] [10].
En este contexto y en la búsqueda de resolver múltiples dificultades
presentadas durante el ciclo de vida de desarrollo de software, han surgido durante
los últimos años nuevas propuestas entre las que se destaca, el enfoque de Desarrollo
de Software Orientado a Aspectos (DSOA) [12]; el cual extiende las técnicas
tradicionales de desarrollo y en particular las orientadas a objetos, permitiendo a los
desarrolladores encapsular en módulos separados las propiedades comunes o áreas de
interés que atraviesan el sistema. Este nuevo paradigma orientado a aspecto surge a
partir de la Programación Orientada a Aspectos (POA) [12].
La POA, es un enfoque de programación presentado a finales de 1996 por
Gregor Kiczales en el Centro de Investigación de XEROX en Palo Alto [28] (Palo
Alto Research Center o PARC), tratando de solucionar el enmarañamiento del código
y la dispersión de conceptos originados en la POO de los sistemas. En particular, la
POA introduce un término denominado “Aspecto” para separar o tratar los diferentes
conceptos o puntos de interés que se distribuyen a lo largo del código. Se dice por
tanto que la POA no rompe con las técnicas de POO, por el contrario las
complementa y extiende [28].
viii
En el desarrollo de sistemas de software, el modelado, el diseño y la
implementación de la funcionalidad básica, recogen aspectos que en muchos casos no
son propios al dominio de la aplicación, pero incrementan su complejidad. Estas
funcionalidades apuntan hacia el cumplimiento de requisitos no funcionales e inciden
sobre la calidad del producto final. Estas incumbencias generalmente delimitan las
condiciones en que el sistema presta servicios a los usuarios y se especifican como
seguridad, tolerancia a fallos, persistencia, eficiencia, entre otras. En muchos casos
estas incumbencias se entrecruzan a la funcionalidad principal, este problema es
referido en la bibliografía como incumbencias transversales (“crosscutting concerns”)
[29], dificultando el mantenimiento y evolución del sistema de software. La POA
plantea la solución al problema de las incumbencias transversales, sin embargo no
está muy claro y definido las tecnologías asociadas a este nuevo paradigma. Ante una
diversidad de posiciones y criterios de parte de la comunidad internacional y nacional
resulta importante resaltar que para lograr el dominio y posterior adopción del
paradigma, se hace necesario estimular estudios tendientes al análisis y desarrollo del
conocimiento tecnológico necesario que gira alrededor de la POA. El objetivo de este
trabajo es estudiar las tecnologías propias a la POA para el tratamiento de requisitos
no funcionales, como un punto de partida que permita consolidar este enfoque como
la nueva generación en la evolución de los sistemas de software.
Este trabajo se encuentra estructurado en cuatro capítulos dispuestos de la
siguiente manera:
CAPÍTULO I: Contiene los antecedentes y el planteamiento del problema, los
objetivos generales y específicos, el estudio de factibilidad, las limitaciones, el
alcance y la justificación.
ix
CAPÍTULO II: Abarca el marco teórico, las definiciones y conceptos más
importantes acerca de la Ingeniería de Software, del DSOA y la POA.
CAPÍTULO III: Se describe el tipo y el nivel de la investigación, las fuentes y
técnicas de recolección de información y la metodología empleada para diseñar el
caso de estudio.
CAPÍTULO IV: Comprende el análisis de los conceptos y definiciones del DSOA y
de la POA, la implementación de la plataforma tecnológica para la POA, el diseño del
caso de estudio, el desarrollo del caso de estudio, la implementación del sistema
aspectual y la descripción y análisis de los resultados obtenidos.
Finalmente se presentan las conclusiones y recomendaciones finales.
1
CAPÍTULO I
EL PROBLEMA
I.1.
Antecedentes del problema
El Desarrollo de Software Orientado a Aspectos (DSOA), es una nueva
disciplina que se origina a partir de los avances y resultados de la Programación
Orientada a Aspectos (POA). Aún antes de que surgiera el concepto de programación
orientada a aspectos, el grupo Demeter [18] había considerado y aplicado ideas
similares. Los trabajos del Grupo Demeter, estaban principalmente enfocados en la
programación adaptativa (PA), la cual puede verse como una instancia temprana de la
POA. El término programación adaptativa se introduce en 1991. La PA constituye un
gran avance dentro de la tecnología de software, basada en el uso de autómatas finitos
y una teoría formal de lenguaje para expresar concisamente y procesar eficientemente
conjuntos de caminos en un grafo arquitectónico, como por ejemplo los diagramas de
clase en el Lenguaje de Modelado Unificado (UML).
Para 1995 dos miembros del grupo Demeter Cristina Lopes y
Walter
Huersch, presentaron un reporte técnico sobre la separación de conceptos, incluyendo
varias técnicas como filtros composicionales y PA para tratar con los conceptos
(incumbencias) que se entrecruzan. Este reporte identificó el tema general de
separación de incumbencias y su implementación y se propuso como uno de los
problemas a resolver en el diseño y desarrollo de software [18].
No fue sino hasta 1995 cuando se publicó la primera definición del concepto
de aspecto, realizada también por el grupo Demeter, y se describía de la siguiente
forma: “Un aspecto es una unidad que se define en términos de información parcial
2
de otras unidades”. Esta definición ha evolucionado desde entonces hasta llegar a la
definición actual, la cual se tratará más adelante.
Cristina Lopes y Karl Lieberherr empezaron a trabajar con Gregor Kickzales y
su grupo. A Lopes y Kickzales no les gustó el nombre “Programación Adaptativa” e
introdujeron un mejor término “Programación Orientada a Aspectos” con su propia
definición y terminología. En la literatura se lo considera a Gregor Kickzales como el
creador de este nuevo paradigma [18].
El DSOA, trata el problema de la separación de incumbencias (concerns) de
un sistema, con el propósito de disminuir la complejidad del software y facilitar
características tales como: evolución, adaptabilidad, comprensibilidad entre otras.
La separación de incumbencias no constituye un concepto novedoso en la
comunidad, fue identificado en la década de los 70 por “E. Dijkstra: Discipline of
Programming”, el cual plantea que un problema dado involucra varias incumbencias
que deben ser identificadas y separadas [21].
I.2.
Planteamiento del problema
La ingeniería del software ha utilizado el principio de la separación de
incumbencias (Separation of Concern) para manejar la complejidad del desarrollo del
software mediante la separación de las funcionalidades principales de la aplicación de
otras partes con un propósito específico (generalmente ortogonales a la funcionalidad
principal); ejemplos de estas son: autenticación, seguridad, rendimiento, persistencia,
entre otras. La aplicación final se construye con el código de las funcionalidades
principales más el código de propósito específico a través de la POA [5].
3
La POA es un paradigma que recién está naciendo, son lenguajes y plataformas
de programación que dan soporte a la separación de aspectos. Se están realizando las
primeras experiencias prácticas para mostrar su aplicabilidad, y obtener datos
empíricos que estimulen la investigación en el tema.
El emergente paradigma de la POA no está consolidado en la comunidad de la
ingeniería de software, actualmente profesionales de la academia y la industria
realizan grandes inversiones, a fin de poner a disposición los adelantos técnicos que
permitan transitar eficientemente hacia la adopción de este paradigma. La aceptación
de un nuevo enfoque debe pasar por la exploración y dominio de las tecnologías
inherentes al mismo, al cual deben incorporarse las Universidades y Centros de
Investigación del país a fin de apalancar su desarrollo tecnológico y contribuir con el
desarrollo del mismo. Los resultados de parte de la comunidad internacional son
diversos y muy variados [5][6][8][12], presentando algunas divergencias entre ellos,
tal vez por la falta de estándares; mientras comienzan a aparecer algunas propuestas
nacionales provenientes de algunas universidades del país [2][3].
Ante esta diversidad de posiciones, tecnologías y criterios resulta importante
resaltar que para lograr el dominio y posterior adopción del paradigma, se hace
necesario estimular estudios tendientes al análisis y desarrollo del conocimiento
tecnológico necesario que gira alrededor de la POA. Por lo antes expuesto y
reconociendo la importancia de la investigación dentro de la formación académica y
humanista, en este trabajo se plantea la implementación de requisitos no funcionales a
través de la programación orientada a aspectos en un sistema de software, como un
punto de partida para el desarrollo del conocimiento e investigación en estas
innovadoras tecnologías.
4
I.3.
Objetivo general
Implementar requisitos no funcionales a través de la programación orientada a
aspectos en un sistema de software.
I.4.
Objetivos específicos
• Analizar los principales conceptos y definiciones del DSOA y de la POA.
• Implementar la plataforma tecnológica para la POA.
• Diseñar el caso de estudio, para definir los requisitos funcionales y no
funcionales del sistema de software.
• Desarrollar el sistema de software para el caso de estudio.
• Implementar los requisitos no funcionales (aspectos) sobre el código base
del sistema de software.
• Elaborar la documentación del sistema de software, documentación del
código base, documentación del aspecto y la documentación para los usuarios del
sistema.
5
I.5. Estudio de factibilidad
Factibilidad Técnica
El desarrollo del proyecto se realizó con la tecnología de hardware y software
que se tenía, asimismo se dispuso del personal capacitado para la elaboración del
mismo. En cuanto a la selección del hardware, el equipo disponible posee las
siguientes características:
• Microcomputador Portátil con procesador Mobile AMD Sempron 3100+
• Disco duro de 40 Gb
• Memoria RAM de 256 Mb DDR
• Unidad lectora de CD-ROM
• Unidad de reescritura CD-WR
• Monitor XGAF TFT LCD 15”
• Mouse de tres teclas
• Puerto inalámbrico para redes 802.1 b/s gíreles LAN
• Impresora de inyección de tinta (dispositivo de salida)
En cuanto a la selección del software, se utilizó el sistema operativo Windows
XP de Microsoft Corporation. Además del sistema operativo, se utilizó para el diseño
de la base de datos el manejador de base de datos Microsoft Access 2003 de
Microsoft Corporation, el lenguaje de programación Java JDK Edition 1.5.0 de Sun
Microsystem Corporation para desarrollar el código base, el lenguaje de propósito
general AspectJ versión 1.5.2 de Xerox Park integrado en Eclipse para la
implementación de los aspectos, el decompilador DJ Java Decompiler 3.6 de Atanas
Neshkov.
6
Factibilidad Económica
La creación de este proyecto no conllevó a grandes gastos económicos, ya que
estuvieron a la disposición los recursos para la elaboración del mismo. Este proyecto
contó con todas las herramientas necesarias para que se pudieran desarrollar los
aspectos generales del caso de estudio, determinar cuáles son sus resultados y
formular las conclusiones y recomendaciones.
Factibilidad Operacional
El recurso humano para desarrollar este proyecto estuvo en la capacidad de
cubrir las etapas de planificación, análisis, diseño y construcción, además de conocer
la parte que involucra la terminología y procedimientos del área en estudio. Por otra
parte los recursos materiales, tanto bibliográficos, electrónicos y técnicos con los
cuales se contó, permitieron la libre investigación del paradigma de la POA y avanzar
en forma acertada en la consecución de los objetivos.
I.6. Limitaciones y alcance
Entre las limitaciones que se presentaron para la elaboración del proyecto, cabe
destacar que el estudio y análisis de las definiciones y conceptos básicos acera de la
POA quedaron sujetos al material bibliográfico y la documentación electrónica de
comprobada autenticidad disponible en la web, así como textos de estudio del autor.
El problema planteado estuvo enmarcado dentro del área de estudio de la Ingeniería
de Requisitos, DSOA y POA, específicamente en el estudio de requisitos funcionales
y no funcionales. El contenido del problema sólo se centró en la implementación de
requisitos no funcionales en un sistema de software a través de la POA. En cuanto al
sistema base que conforma el caso de estudio, se realizó la parte de análisis, diseño y
7
construcción, para finalmente hacer las pruebas e implementación del sistema
aspectual.
I.7.
Justificación
La principal razón para la elaboración de este trabajo es que sus resultados van
a contribuir a la evolución de las actividades tecnológicas y científicas del país en
materia de desarrollo de software, persigue promover el uso de los aspectos a lo largo
de todas las actividades del ciclo de vida del software. El objetivo general la POA es
proponer un proceso de desarrollo de software transparente, donde los diversos
“concerns” o incumbencias que son tratados con aspectos sean el eje central del
desarrollo, desde la ingeniería de requisitos hasta la implementación. Este trabajo
busca comprobar la terminología, los conceptos y el funcionamiento de la tecnología
asociada al paradigma de la POA. Estudiar la posibilidad del tratamiento de los
requisitos no funcionales como potenciales incumbencias transversales sensibles a ser
tratadas a través de la POA. Además es propicio señalar que no existe experiencia a
nivel regional en la Universidad Nacional Abierta que trate este tema.
En la mayoría de los casos, cuando se utilizan enfoques como la Programación
Estructurada o la Programación Orientad a Objetos en la construcción de sistemas de
software, el código se encuentra a menudo diseminado sobre muchas partes de la
aplicación, con el inconveniente de estar enmarañado y disperso. El desarrollo de
tales aplicaciones requiere el uso de técnicas más apropiadas para controlar esta
complejidad adicional y hacer que el software sea más estructurado, más fácil de
entender, mantener y reusar. Es aquí donde la POA interviene como el nuevo
paradigma en la evolución de la ingeniería de software.
CAPÍTULO II
MARCO TEÓRICO
II.1.
Ingeniería de Software
La Ingeniería de software es la rama de la ingeniería que crea y mantiene las
aplicaciones de software aplicando tecnologías y prácticas de las ciencias
computacionales, manejo de proyectos, ingeniería, el ámbito de la aplicación, y otros
campos. La ingeniería de software, como las disciplinas tradicionales de ingeniería,
tiene que ver con el costo y la confiabilidad. Algunas aplicaciones de software
contienen millones de líneas de código que se espera funcionen bien en condiciones
siempre cambiantes [7].
La Ingeniería del Software, término utilizado por primera vez por Fritz Bauer
en la primera conferencia sobre desarrollo de software patrocinada por el Comité de
Ciencias de la OTAN celebrada en Garmisch, Alemania, en octubre de 1968, puede
definirse según Alan Davis como "la aplicación inteligente de principios probados,
técnicas, lenguajes y herramientas para la creación y mantenimiento, dentro de un
coste razonable, de software que satisfaga las necesidades de los usuarios" [31].
El término ingeniería de software se usa con una variedad de significados
diferentes:
• Como el término usual contemporáneo de un amplio rango de actividades
que se solía llamar programación y análisis de sistemas.
9
• Como un término amplio de todos los aspectos de la práctica de la
programación de computadoras, en oposición a la teoría, que es llamada
ciencia computacional o computación.
• La ingeniería de software es (1): “la aplicación de un método sistemático,
disciplinado y cuantificable al desarrollo, operación y mantenimiento de
software, esto es, la aplicación de la ingeniería al software” y (2): “el estudio
de los métodos de (1)”, estándar IEEE (Instituto de Ingenieros Eléctricos y
Electrónicos) [31].
II.2.
Ingeniería de Requisitos
En la ingeniería de requisitos se identifica el propósito del sistema y el contexto
en el que será usado. Los requisitos constituyen el enlace entre las necesidades reales
de los clientes, usuarios y otros participantes vinculados al sistema. La ingeniería de
requisitos consiste en un conjunto de actividades y transformaciones que pretenden
comprender las necesidades de un sistema software y convertir la declaración de estas
necesidades en una descripción completa, precisa y documentada de los
requerimientos del sistema siguiendo un determinado estándar. Se divide en cinco
partes que se corresponden con los cinco tipos de actividades que requiere la
construcción de requisitos: recolección, análisis, especificación, validación y gestión
de requisitos [31].
Recolección de requisitos
Se incluyen los métodos y técnicas para la recolección, el reconocimiento y la
comunicación de los requisitos y restricciones funcionales y no funcionales. Es una
10
actividad más “humana” que técnica. Se identifica a los interesados (stakeholders) y
se establecen las primeras relaciones entre ellos y el equipo de desarrollo.
Requisitos Funcionales: Describen los servicios (funciones) que se esperan del
sistema.
Requisitos No Funcionales: Restricciones sobre los requisitos funcionales. Se
distinguen dos tipos de requisitos no funcionales:
• Orientados al usuario: Fiabilidad, Seguridad (security), Seguridad (safety),
Usabilidad, Robustez, Disponibilidad, Rendimiento (Tiempo de respuesta,
Capacidad, Throughput).
• Orientados
al
desarrollador:
Disponibilidad,
Portabilidad,
Adaptabilidad,
Testabilidad, Comprensibilidad.
Fuentes de Requisitos:
• Metas: Factores críticos de éxito (de la empresa).
• Conocimiento del dominio de la aplicación: Cosas que pueden resultar obvias a los
expertos no lo son para los usuarios.
• Los interesados: Los afectados por el sistema.
• El entorno físico que rodea al sistema.
• El entorno organizacional: Los procesos de negocio.
Problemas de la recolección:
• Los usuarios no pueden/saben describir muchas de sus tareas.
• Mucha información importante no llega a verbalizarse.
11
• A veces hay que “inventar” los requisitos.
• La recolección no debería ser un proceso pasivo, sino cooperativo.
Técnicas de recolección:
• Preliminares: Utilizar preguntas libres de contexto.
• Brainstorming: Seleccionar un grupo variado de participantes. Eliminar críticas,
juicios y evaluaciones mientras los participantes sugieren ideas. Producir muchas
ideas. Recogerlas todas por escrito. Otro día, en otra sesión, se evalúan las ideas.
• Entrevistas: Es el método “tradicional”, pero debe usarse en complemento con
otras técnicas, y no debe ser el primer paso de la recolección. Es fundamental:
Entrevistar a la(s) persona(s) adecuadas. Preparar las preguntas con antelación.
Utilizar diagramas, modelos, etc.
• Observación y análisis de tareas: Un observador estudia a los futuros usuarios en
su entorno de trabajo. A veces se utiliza el video. Anota todo aquello que es
susceptible de mejora. Posteriormente, genera una serie de requisitos tentativos.
• Casos de uso / Escenarios: Requisitos en contexto de uso.
• Prototipado: Útiles cuando la incertidumbre es total acerca del futuro sistema. Hay
dos tipos principales: evolutivo y “de usar y desechar” [31].
Análisis de requisitos
Se contemplan los principios y métodos de modelado de los requisitos del
software siguiendo el paradigma de la orientación a objeto. Consiste en detectar y
resolver conflictos entre requisitos. Se precisan los límites del sistema y la
interacción con su entorno. Se trasladan los requisitos de usuario a requisitos del
software (implementables).
12
En el análisis de requisitos se realizan tres tareas fundamentales:
Clasificación:
• En funcionales vs. no funcionales (Capacidades vs. Restricciones).
• Por prioridades.
• Por coste de implementación.
• Por niveles (alto nivel, bajo nivel).
• Según su volatilidad/estabilidad.
• Si son requisitos sobre el proceso o sobre el producto.
Modelización Conceptual:
• Ciertos aspectos de los requisitos se expresan mediante modelos de datos, de
control, de estados, de interacción, de objetos, etc.
• La meta es entender mejor el problema, más que iniciar el diseño de la solución.
• El tipo de modelo elegido depende de la naturaleza del problema, la experiencia
del modelizador, y de la disponibilidad de herramientas. Por decreto el cliente
impone una notación.
Negociación:
• En todo proceso de IR intervienen distintos individuos con distintos y, a veces,
enfrentados intereses.
• Estos conflictos entre requisitos se descubren durante el análisis. El conflicto no es
rechazable, pues los conflictos son fuente de nuevos requisitos.
• Los conflictos nunca se deben resolver “por decreto”, sino mediante un proceso de
(re)negociación [31].
13
Especificación o documentos de requisitos
Esta parte está relacionada con la representación de los requisitos como
resultado de la recopilación y análisis de los mismos. Incluye la aplicación de los
métodos de especificación incluyendo lenguaje natural y lenguajes de modelado. Es
el modo habitual de guardar y comunicar requisitos. Es buena práctica utilizar, al
menos, dos documentos, a distinto nivel de detalle:
DRU: Documento de Requisitos de Usuario (en inglés, URD). El DRU se escribe
desde el punto de vista del usuario/cliente/interesado. Normalmente los requisitos de
usuario, contenidos en la DRU, no poseen demasiado nivel de detalle. Se incluye la
descripción del problema actual (razones por las que el sistema de trabajo actual es
insatisfactorio) y las metas que se espera lograr con la construcción del nuevo
sistema.
ERS: Especificación de Requisitos Software (en inglés, SRS). La ERS desarrolla
mucho más los contenidos de la DRU. Los requisitos del software contenidos en la
ERS son, por tanto, más detallados. Contiene la respuesta a la pregunta “¿Qué
características debe poseer un sistema que nos permita alcanzar los objetivos, y evitar
los problemas, expuestos en la DRU?”.Un documento es cualquier medio electrónico
de almacenamiento y distribución (procesador de textos, base de datos, herramienta
de gestión de requisitos) [31].
Validación de Requisitos
14
El objetivo de la validación de requisitos es descubrir problemas en el
documento de requisitos antes de comprometer recursos a su implementación. Como
resultado de esta validación se produce una línea-base (baseline).
El
documento
debe
revisarse
para
descubrir
omisiones,
conflictos,
ambigüedades, y comprobar la calidad del documento y su grado de adhesión a
estándares.
Línea Base: En el contexto de la Ingeniería de Requisitos, una línea base es un
conjunto de requisitos que han sido formalmente aceptados por todas las personas
implicadas en el proyecto. Una vez que se establece una línea base, futuros cambios a
tales requisitos sólo podrán realizarse por medio de un proceso formal de gestión y
aprobación de cambios.
Revisiones (Reviews): Es la fórmula más empleada para validación. Un grupo de
personas (incluyendo usuarios) se ocupan de revisar el documento de requisitos.
Consta de tres fases:
1. Búsqueda de problemas.
2. Reunión.
3. Acuerdos.
Como guía para identificar problemas habituales, se pueden utilizar listas de
comprobación (“checklists”). Existen checklists adaptadas a distintos tipos de
sistemas. Una checklist debería girar alrededor de los 24 atributos de calidad que
debería poseer una ERS.
Otros métodos de validación:
15
Prototipado: Permite descubrir con rapidez si el usuario se encuentra satisfecho, o
no, con los requisitos (Uso de escenarios/casos de uso).
Validación de modelos: Cuando los requisitos se expresan por medio de modelos (de
objetos, DFDs, etc.).
Validación de su “testabilidad”: El equipo de pruebas debe revisar los requisitos.
Gestión de Requisitos
Consiste, básicamente, en gestionar los cambios a los requisitos. Asegura la
consistencia ente los requisitos y el sistema construido (o en construcción). Consume
grandes cantidades de tiempo y esfuerzo. Abarca todo el ciclo de vida del producto.
La Gestión de Requisitos es necesaria porque los requisitos son volátiles, el entorno
físico y el entorno organizacional cambian, y la propia existencia del sistema va a
generar nuevos requisitos por parte de los usuarios.
Qué implica la Gestión de Requisitos:
• Definir procedimientos de cambios: definen los pasos y los análisis que se
realizarán antes de aceptar los cambios propuestos.
• Cambiar los atributos de los requisitos afectados.
• Mantener la trazabilidad: hacia atrás, hacia delante y entre requisitos.
• Control de versiones del documento de requisitos.
• Herramientas de Gestión de Requisitos: facilitan las tareas relacionadas con la
escritura, trazabilidad y gestión de cambios.
• Organizan los requisitos en bases de datos.
• Gestión (incremental) de lineas-base.
16
• Todas permiten añadir atributos a los requisitos.
• Creación de líneas base: Una línea base (baseline) es un conjunto de requisitos
que, mediante acuerdo entre las partes implicadas, se ha decidido no modificar.
Son aquellos requisitos más importantes que el desarrollador se compromete a
implementar. A lo largo de un proceso de requisitos pueden crearse
(incrementalmente) varias líneas base. Las herramientas de gestión de requisitos
permiten gestionar fácilmente las líneas base. Por ejemplo, los requisitos que
forman parte de una línea base no podrán ser modificados, salvo por usuarios
privilegiados [31].
II.3.
Desarrollo de Software Orientado a Objetos (POO)
El Desarrollo de Software Orientado a Objetos (DSOO) es la tecnología que
permite colocar todos los atributos y métodos de un “objeto” en una estructura
independiente llamada clase. Un objeto contiene toda la información, (los
denominados atributos) que permite definirlo e identificarlo frente a otros objetos
pertenecientes a otras clases (e incluso entre objetos de una misma clase, al poder
tener valores bien diferenciados en sus atributos). A su vez, dispone de mecanismos
de interacción (los llamados métodos) que favorecen la comunicación entre objetos
(de una misma clase o de distintas), y en consecuencia, el cambio de estado en los
propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las
que no se separan (ni deben separarse) información (datos) y procesamiento
(métodos) [7].
La idea de las clases es tener un punto de referencia y describir las similitudes o
diferencias que un objeto específico posee con respecto a los miembros de su propia
clase. Una clase define el conjunto de atributos y comportamientos compartidos por
cada objeto de la clase. Los programadores deben definir las diversas clases en el
17
programa que escriben y crear los objetos a partir de la clase establecida, esto se
conoce con el término de “instanciar” [7].
II.4.
Programación Orientada a Objetos (POO)
La Programación Orientada a Objetos (POO u OOP según siglas en inglés) es
un paradigma de programación que define los programas en términos de "clases de
objetos", objetos que son entidades que combinan estado (es decir, datos),
comportamiento (esto es, procedimientos o métodos) e identidad (propiedad del
objeto que lo diferencia del resto). La programación orientada a objetos expresa un
programa como un conjunto de estos objetos, que colaboran entre ellos para realizar
tareas. Esto permite hacer los programas y módulos más fáciles de escribir, mantener
y reutilizar [32].
Esto difiere de los lenguajes imperativos tradicionales, en los 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. Los programadores de lenguajes imperativos escriben
funciones y después les pasan datos. Los programadores que emplean lenguajes
orientados a objetos definen objetos con datos y métodos y después envían mensajes
a los objetos diciendo qué realicen esos métodos en sí mismos [32].
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, quienes trabajaban en
18
simulaciones de naves, y fueron confundidos por la explosión combinatoria de cómo
las diversas cualidades de diversas naves podían afectar unas a las otras. La idea
ocurrió para agrupar los diversos tipos de naves en diversas clases de objetos, siendo
responsable cada clase de objetos de definir sus propios datos y comportamiento.
Fueron refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox
PARC (y 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
"en marcha" en lugar de tener un sistema basado en programas estáticos [32].
La programación orientada a objetos tomó posición como la técnica 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 orientada a eventos [32].
Las características de orientación a objetos fueron agregadas a muchos
lenguajes existentes durante ese tiempo, incluyendo Ada, BASIC, Lips, Pascal, y
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 a la
capacidad de mantenimiento del código. Los lenguajes orientados a objetos "puros",
por otra 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
19
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 [32].
Características de la POO
Abstracción: 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.
Encapsulamiento: 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.
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 diferentes
tipos, y la invocación de un comportamiento en una referencia producirá el
comportamiento correcto para el tipo real del objeto referenciado.
20
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 reimplementar su comportamiento. Esto
suele hacerse habitualmente agrupando los objetos en clases y estas en árboles que
reflejan un comportamiento común [32].
II.5.
Desarrollo de Software Orientado a Aspectos (DSOA)
El Desarrollo de Software Orientado a Aspectos (DSOA) o ASOD por sus
siglas en inglés, es un nuevo paradigma que cada día despierta más interés y adquiere
más relevancia. Muchos son los eventos sobre DSOA que se han presentado
internacionalmente dentro de la comunidad de Ingeniería de Software, desde el año
1996 cuando se acuñó el término por primera vez, pasando por el primer evento de
DSOA (Workshop on Aspect Oriented Programming ECOOP 1997) hasta la más
reciente edición de Las Jornadas de Ingeniería del Software y Bases de Datos que se
realizan todos los años [20] [33].
II.5.1 Objetivo principal de DSOA
El objetivo principal de DSOA es promocionar la separación de incumbencias
(Separtion of Concern) y llevar a las etapas del ciclo de vida de desarrollo del
software los avances de la POA para tratar su modularización. DSOA aparece para
resolver determinados problemas que se encuentran en el software construido
mediante técnicas convencionales y que están relacionados con la facilidad de
21
reutilización, facilidad de mantenimiento, rapidez en el desarrollo, y en definitiva,
una serie de parámetros que inciden sobre su calidad [21].
II.5.2 Breve reseña histórica
El DSOA es una nueva disciplina que se origina en el año 2002 a partir de los
avances de la POA. El concepto de POA, fue introducido por Gregor Kiczales y su
grupo; sin embargo, antes de que surgiera este concepto el Grupo Demeter, había
considerado y aplicado ideas similares [12] [18] [21].
Los trabajos del Grupo Demeter, estaban principalmente enfocados en la
programación adaptativa (PA), la cual puede verse como una instancia temprana de la
POA. El término programación adaptativa se introduce en 1991. La PA constituye un
gran avance dentro de la tecnología de software, basada en el uso de autómatas finitos
y una teoría formal de lenguaje para expresar concisamente y procesar eficientemente
conjuntos de caminos en un grafo arquitectónico, como por ejemplo los diagramas de
clase en el Lenguaje de Modelado Unificado (UML) [12] [18] [21].
Para 1995 dos miembros del grupo Demeter Cristina Lopes y Walter Huersch,
presentaron un reporte técnico sobre la separación de conceptos, incluyendo varias
técnicas como filtros composicionales y PA para tratar con los conceptos
(incumbencias) que se entrecruzan. Este reporte identificó el tema general de
separación de incumbencias y su implementación y se propuso como uno de los
problemas a resolver en el diseño y desarrollo de software [18].
No fue sino hasta 1995 cuando se publicó la primera definición del concepto
de aspecto, realizada también por el grupo Demeter, y se describía de la siguiente
22
forma: “Un aspecto es una unidad que se define en términos de información parcial
de otras unidades” [18].
Cristina Lopes y Karl Lieberherr empezaron a trabajar con Gregor Kickzales y
su grupo. A Lopes y Kickzales no les gustó el nombre “Programación Adaptativa” e
introdujeron un mejor término “Programación Orientada a Aspectos” con su propia
definición y terminología. En la literatura se lo considera a Gregor Kickzales como el
creador de este nuevo paradigma [18] [21].
En resumen:
•
El Grupo Demeter introduce en 1991 la Programación Adaptativa,
instancia temprana de la programación orientada a aspectos.
•
En 1996 Gregor Kiczales divulgó por primera vez los términos
“Aspecto” y “Programación Orientada a Aspectos”.
•
En 1997 se lleva a cabo el primer evento relacionado con el nuevo
enfoque de la POA: Workshop on Aspect-Oriented Programming
ECOOP 1997.
•
Entre 1997 y 2001 la POA adquiere madurez en los entornos de
investigación.
•
En 2002 la POA da lugar al DSOA.
•
A partir del 2003 la DSOA despierta cada día mayor interés y más
relevancia en los ámbitos de investigación y desarrollo [21].
II.5.3 La separación de incumbencias
23
El principio de separación de incumbencias fue identificado en la década de
1970, plantea que un problema dado involucra varias incumbencias que deben ser
identificadas y separadas. Esta definición en terminología inglesa (separation of
concerns), aparece frecuentemente asociada a traducciones tales como: Separación
de competencias, separación de propiedades, separación de preocupaciones,
separación de áreas de interés, entre otros. En el desarrollo de esta investigación a fin
de unificar términos todos estos son tratados como separación de incumbencias [26].
Las incumbencias (concerns) son los diferentes temas o asuntos de los que es
necesario ocuparse para resolver un problema de desarrollo de software. Una de ellas
es la función específica que debe realizar la aplicación, pero también surgen otras
como por ejemplo distribución, persistencia, replicación, sincronización. Separando
las incumbencias, se disminuye la complejidad a la hora de tratarlas y se puede
cumplir
con
requisitos
relacionados
con
la
calidad
como
adaptabilidad,
mantenibilidad, extensibilidad y reusabilidad. La separación de incumbencias es
simplemente un método para descomponer software en sus módulos, cada uno de los
cuales tratan y encapsula un área particular de interés, llamada incumbencia.
Ejemplo de incumbencias son funciones, clases o tipos de datos, características (tales
como persistencia, impresión, o control de concurrencia) [26].
En muchos casos, es difícil expresar de una forma modular incumbencias
importantes de una aplicación de software. El mayor problema radica en que el
código que las trata se encuentra a menudo diseminado sobre muchas partes de la
aplicación, con el inconveniente de estar “disperso” y “enmarañado”, como se
muestra en la figura 2.1.
24
Buena modularización: una propiedad o funcionabilidad aparece localizad en un módulo
Mala modularización: una propiedad o funcionabilidad aparece dispersa y enmarañada
Figura 2.1
Disperso: (Scattered): La especificación relativa a una propiedad o
funcionalidad no se encuentra localizada en un módulo sino que se encuentra dispersa
en una serie de ellos.
Enmarañado (Tangled): Los diferentes módulos contienen descripciones
mezcladas relativas a varias propiedades o funcionalidades.
Estas responsabilidades, que aparecen diseminadas en el código atravesando
partes del sistema no relacionadas en el modelo, se denominan incumbencias
transversales (crosscutting concerns) [26].
25
II.5.4 Ventajas de la separación de incumbencias
Las ventajas del uso de tecnologías de separación de incumbencias en el
desarrollo de aplicaciones software se resumen básicamente en dar solución a los
problemas planteados por el entrecruce de las mismas. De una forma más detallada,
las ventajas son:
− Representación explícita de las diferentes incumbencias que se engloban
dentro de una aplicación software. Proporciona un alto grado de modularidad
al manejar las diferentes incumbencias como entidades de primera clase.
− Alto grado de reutilización de la aplicación, por un lado, y de las
incumbencias ajenas a la funcionalidad base, por otro. Al mejorar la
modularidad, proporcionando mecanismos de separación y de interacción, se
consigue código más independiente y reutilizable.
− Facilita la comprensión de la funcionalidad base de la aplicación, al eliminar
la mezcla de código.
− Facilita los procesos de mantenimiento y evolución.
II.5.5 Tiranía de la Descomposición dominante
Con las técnicas de modelado convencionales no puede evitarse la mezcla de
aspectos debido a la tiranía de la descomposición dominante. Cuando se descompone
26
y se modulariza un problema, se hace atendiendo a unos criterios donde predominan
una serie de propiedades; pero que, lamentablemente penalizan a otras.
Cuando sucede la mezcla de aspectos, como se muestra en la figura 2.3, la
separación de incumbencias no es siempre una tarea fácil. Cuando los sistemas de
software alcanzan una cierta complejidad, las construcciones de modularización
proporcionadas por los lenguajes actuales se muestran insuficientes.
Usualmente es necesario tener de manera simultánea diferentes dimensiones
de abstracción de conceptos; que además, es posible que se solapen e interactúen. Se
necesita la modularización respecto a diferentes dimensiones, ya sea, por clases,
aspectos, roles o cualquier otro criterio [21].
Mezcla de aspectos
Figura 2.3
Las técnicas actuales de ingeniería del software proporcionan generalmente un
mecanismo de descomposición dominante que no es adecuado para capturar y
representar todas las incumbencias (propósitos) que se pueden encontrar en una
aplicación software. Ejemplos de descomposiciones tiránicas son las clases en el
paradigma orientado a objetos y las funciones en la programación funcional. El
problema de las incumbencias transversales es que son consecuencia de la
27
descomposición del software en módulos basados sólo en la dimensión dominante
por la cual se haya realizado la modularización.
La separación de aspectos sugiere la posibilidad de trabajar en el diseño e
implementación de un sistema con unidades naturales de incumbencias en vez de
hacerlo con unidades impuestas por las herramientas o lenguajes de desarrollo. En
definitiva, la idea es adaptar la modularidad de un sistema para que refleje la manera
en la que un ingeniero razona sobre un problema en vez de adaptar la manera de
razonar al modo que imponen las herramientas y los lenguajes [21].
II.5.6 Incumbencias Transversales
Las incumbencias transversales (crosscutting concerns) afectan a distintas
partes del sistema, son transversales en el sentido, que se cruzan a la estructura
impuesta por la descomposición principal que se haya hecho del sistema de software;
es decir, no caben en ningún modulo [21] [27].
En la POO esto ocurre fácilmente, un ejemplo clásico se podrá ver en la figura
2.2, donde dos clases diferentes punto (Point) y línea (Line) presentan los métodos
(setX, setY, setP1, setP2) encapsulados en el crosscutting concern de notificación de
movimiento de una figura (Display Updating) que podría ser representado como un
aspecto y evitar la redundancia.
28
Figura 2.2
El problema de las incumbencias transversales, sucede cuando estas aparecen
en el sistema y no pueden ser programadas de forma independiente; en ese caso, la
única solución suele ser escribir código repetido que resuelva esa incumbencia para
cada subsistema (clase). Para solucionar estos problemas nace la POA, que
proporciona los mecanismos suficientes para tratar en forma independiente las
incumbencias y convertirlas en aspectos de un sistema [21].
II.5.7 Alternativas de Solución
Contra la tiranía de la descomposición dominante, se debe permitir múltiples
dimensiones de descomposición basadas en SEPARACIÓN DE ASPECTOS, ver
figura 2.4.
Para la implementación de estas funcionalidades (aspectos), idealmente
ortogonales a la funcionalidad básica y para conseguir una adecuada modularización
de un sistema de software, se han desarrollado diversas alternativas tecnológicas que
posibilitan una mejor separación de los conceptos o que las conforman. Gracias a
ellas se pueden capturar las diferentes incumbencias (concern) que componen una
aplicación en entidades bien definidas, de manera apropiada en cada uno de los casos,
eliminando las dependencias inherentes entre cada uno de los módulos.
Estas
tecnologías se agrupan hoy en día de manera general en el paradigma del DSOA.
29
Figura 2.4
II.6.
Programación Orientada a Aspectos (POA)
La Programación Orientada a Aspectos (POA) es un paradigma de
programación que surgió tratando de solucionar dos problemas detectados durante la
construcción de software: el primero, el enmarañamiento del código y el segundo, el
hecho de que determinados objetos no pudiesen ser manejados con la programación
orientada a objetos, distribuyéndose en diferentes clases (dispersión). La POA es un
desarrollo que sigue al paradigma de desarrollo de orientación a objetos [8].
La POA ha sido propuesta como una técnica para mejorar la separación de
concerns (áreas de interés o propiedades) en el software; se encuentra construida
sobre tecnologías previas como la programación orientada a objetos (POO) y la
programación basada en procedimientos; por lo tanto puede decirse que la POA no
rompe con las técnicas de programación orientadas a objetos, por el contrario las
complementa y extiende. De manera general se ha definido la POA como la
tecnología que proporciona la separación de crosscutting concerns introduciendo una
nueva unidad de modularización denominada ASPECTO [8].
La idea principal de esta nueva técnica es modularizar todos los concerns de
importancia en los sistemas complejos, los cuales no pueden ser manejados con los
30
lenguajes orientados a objetos y sus mecanismos de modularidad jerárquica. Se dice
que la POA hace por los crosscutting concerns lo que la POO ha hecho por la
encapsulación de objetos y la herencia; es decir proporciona mecanismos al lenguaje
para capturar explícitamente la estructura transversal, haciendo posible programar
estos crosscutting concerns en una forma modular; obteniendo un código más
sencillo, más fácil de desarrollar y mantener. POA es DSOA en la etapa de
implementación. Son lenguajes y plataformas de programación que dan soporte a la
separación de aspectos [8].
II.6.1
Terminología Básica
Son diversas las definiciones que se utilizan en el enfoque orientado a aspectos,
muchos de los autores utilizan los términos libremente; sin embargo a continuación
se presentan los principales conceptos comunes que han sido definidos dentro de la
comunidad de investigadores. Para algunos de estos términos se prefiere conservar el
nombre en inglés con el fin de evitar ambigüedades en sus descripciones.
Concern: Un concern, figura 2.5, se define como una propiedad o punto de
interés de un sistema. La IEEE define los concerns para un sistema como aquellos
intereses que pertenecen al desarrollo del sistema y su operación, o demás aspectos
que son críticos; o por el contrario, importantes para uno o varios stakeholders. Los
concerns
incluyen
consideraciones
del
sistema
tales
como
performance,
confiabilidad, seguridad, distribución, persistencia, entre otros. Se define un concern
como un requisito de un sistema o consideración que debe ser direccionada con el fin
de satisfacer una meta del sistema; puede ser clasificado en dos categorías: core
concerns capturan la funcionalidad central de un módulo y los crosscutting concern
capturan a nivel del sistema los requisitos secundarios que atraviesan múltiples
módulos [34].
31
Figura 2.5
Crosscutting Concerns: Los crosscutting concerns, figura 2.6, (conocidos en
la comunidad en español como incumbencias entrecruzadas o conceptos
transversales), son aquellas propiedades que se reparten a lo largo de todo el código
de una aplicación, son conceptos que no pueden encapsularse dentro de una unidad
funcional, debido a que atraviesan todo el sistema [33].
2.6 of Concerns (SOC) o separación de
Separación de “Concerns”: LaFigura
Separation
conceptos es un término utilizado desde hace muchos años; fue primero introducido
por Dijkstra, como un principio para encapsular características en entidades separadas
con la finalidad de ubicar en un lugar particular sus cambios y tratarlas una por una
en el tiempo (ejemplo: UML utiliza diferentes modelos para tratar las diversas
32
propiedades del dominio de un problema por separado). Sin embargo, Parnas fue
acreditado por el concepto de SOC cuando propuso la programación modular en
como la mejor manera de estructurar el código de un programa, para hacer software
reutilizable y más simple de evolucionar. Según Parnas, la mejor manera de alcanzar
la SOC es través de la modularización, un proceso de crear módulos que oculten sus
decisiones entre sí [35].
En forma general, la SOC ha sido definida como la habilidad de identificar,
encapsular y manipular partes del software (concerns) que son relevantes para un
propósito particular; la SOC permite reducir la complejidad del software y mejorar la
entendibilidad y trazabilidad a lo largo de un proceso de desarrollo, minimizando el
impacto del cambio que promueve la evolución [35].
Aspecto: Un Aspecto se define como una unidad modular diseñada para
implementar un concern, pueden contener en su definición código y las
correspondientes instrucciones de donde, cuando y como invocarlo. Los Aspectos son
unidades modulares de implementaciones comunes, definidos por medio de
declaraciones de tipo aspecto, las cuales tienen una forma similar a las declaraciones
de las clases en el enfoque orientado a objetos.
En [8] Kiczales define un aspecto de programa o código como la unidad
modular que aparece en otras unidades modulares del programa, similar a una clase
pero con un nivel de abstracción mayor; Kiczales también define un Aspecto como la
estructura que encapsula un crosscutting concern.
33
Figura 2.7
En la figura 2.7 se visualiza la representación del Aspecto (Display Updating)
el cual encapsula el crosscutting concern de notificación de movimiento de una
figura, implementado por los métodos (setX, setY, setP1, setP2). Se dice que este
concern es un crosscutting concern debido a que entrecruza las clases Point y Line
[8].
Join Points: Los Join Points, figura 2.8, o puntos de unión son lugares bien
definidos donde un comportamiento adicional es agregado en la estructura de
ejecución o flujo de un programa. Los Joint Points representan el concepto central de
la Programación Orientada a Aspectos y el de su principal lenguaje de
implementación AspectJ, se definen como puntos en la ejecución dinámica de un
programa interceptados por los aspectos, y en los cuales secciones adicionales de
código denominadas advice pueden ser ejecutadas.
De manera elemental, un joint point es cualquier punto de ejecución
identificable en un sistema, la llamada a un método es un joint point y la ejecución de
un método también lo es; una asignación a una variable, la construcción de un objeto,
una comparación, un manejador de excepciones entre otros, son ejemplos que
permiten identificar tal concepto. Sin embargo; no todos los joint points en un
sistema están disponibles para ser usados, los exposed joint points en el sistema
34
(puntos de unión expuestos) son los únicos lugares posibles en el código donde se
puede ampliar o alterar la ejecución del programa principal [8] [35].
Pointcut: Un pointcut o punto de corte es un conjunto de joint points; también
se definen como una estructura diseñada para identificar y seleccionar los join points
dentro de un programa en AspectJ. Los joint points seleccionados en los pointcuts son
los denominados exponed joint points. Un pointcut es un término particular utilizado
en la programación con AspectJ [8] [35].
Figura 2.8
Advice: Un advice es el comportamiento que ha de ser ejecutado en un joint
point
que ha sido seleccionado. Un advice ayuda a definir “qué hacer”, es un
mecanismo muy similar a un método, usado para declarar el código que debe
ejecutarse en cada joint point que es capturado por el pointcut. Existen tres tipos de
advice: before advice (se ejecuta previo al joint point), after advice (se ejecuta
siguiendo al joint point) y around advice (encierra la ejecución del joint point); este
35
último tiene la habilidad de desviar la ejecución, continuar la ejecución normal o
causar la ejecución con un contexto alterado.
Los pointcuts y advice forman juntos las reglas de entrelazado dinámico
(dynamic crosscutting: tejido de nuevo comportamiento dentro de la ejecución de un
programa) propias de la programación orientada a aspectos; mientras los pointcuts
identifican los joint points requeridos, el advice completa el cuadro determinando las
acciones que ocurrirán en los joint points [8] [35].
II.6.2
Fundamentos de la Programación Orientada a Aspectos
Los tres principales requerimientos de la POA son:
- Un lenguaje para definir la funcionalidad básica, conocido como lenguaje
base o componente. Podría ser un lenguaje imperativo, o un lenguaje no
imperativo (C++, Java, Lisp, ML).
- Uno o varios lenguajes de aspectos, para especificar el comportamiento de
los aspectos. (COOL, para sincronización, RIDL, para distribución, AspectJ,
de propósito general.)
- Un tejedor de aspectos (Weaver), que se encargará de combinar los
lenguajes. Tal proceso se puede retrasar para hacerse en tiempo de ejecución o
en tiempo de compilación.
En la siguiente Figura 2.9, se aprecia la forma en que se trabaja con las
aplicaciones tradicionales y cómo se opera en una aplicación orientada a aspectos.
36
Figura 2.9
En las aplicaciones tradicionales, era suficiente con un compilador o intérprete
que tradujera el programa escrito en un lenguaje de alto nivel a un código
directamente entendible por la máquina.
En las aplicaciones orientadas a aspectos, sin embargo, además del compilador,
hay que tener el tejedor, que nos combine el código que implementa la funcionalidad
básica, con los distintos módulos que implementan los aspectos, pudiendo estar cada
aspecto codificado con un lenguaje distinto [12].
II.6.3
Lenguajes Orientados a Aspectos
Los lenguajes Orientados a Aspectos (LOA) son las herramientas que permiten
soportar el paradigma de la POA, estos lenguajes proporcionan un conjunto de
mecanismos y constructores para capturar aquellos elementos que se diseminan por
todo los sistemas de software. Los LOA permiten separar la definición de la
funcionalidad pura, de la definición de los diferentes aspectos; definen una nueva
unidad de programación de software denominada Aspecto para encapsular las
funcionalidades que cruzan todo el código, deben soportar la separación de concerns
37
como la sincronización, la distribución, el manejo de errores, la optimización de
memoria, la seguridad, la persistencia, etc.
Las implementaciones de los LOA ejecutan dos pasos lógicos: combinan los
concerns individuales utilizando reglas de tejido (weaving rules) y entonces convierte
la información resultante en código ejecutable. Este proceso de combinar los
concerns individuales de acuerdo a esas reglas de tejido es llamado weaving o tejido.
Actualmente se distinguen dos enfoques diferentes en el diseño de lenguajes de
aspectos: lenguajes de aspectos de dominio específico y lenguajes de aspecto de
propósito general.
II.6.3.1
Lenguajes de Aspectos de Dominio Específico
Los LOA de Dominio Específico soportan uno o más de los concerns
distribución, coordinación, manejo de errores, optimización de memoria, seguridad,
persistencia. No pueden soportar otros concerns distintos para los que fueron
especificados, poseen un nivel de abstracción mayor al del lenguaje base. Estos
lenguajes se caracterizan por imponer restricciones en la utilización del lenguaje
base, para garantizar que los conceptos del dominio sean programados en el lenguaje
diseñado para tal fin, evitándose así interferencias entre ambos. Entre algunos de los
lenguajes de aspectos de dominio específico más utilizados se encuentran COOL y
RIDL, el primero trata el concern de sincronización y el segundo la distribución.
COOL (COOrdination Language) es el lenguaje de aspectos de propósito
específico creado por XEROX; permite la sincronización de hilos (threads)
concurrentes, utiliza como lenguaje base una versión restringida de Java. Además de
tratar con los estados de sincronización, proporciona medios para tratar la exclusión
38
de hilos, suspensiones y notificaciones. Un programa COOL consiste de un conjunto
de
módulos
coordinadores.
Los
módulos
coordinadores,
o
directamente
coordinadores, se asocian con las clases a través del nombre. Un mismo coordinador
puede coordinar a más de una clase. La unidad mínima de sincronización es el
método [36].
RIDL (Remote Interaction and Data transfer Language) trata la programación
de interacciones entre componentes remotos, en particular la invocación remota y
transferencia de datos. Un programa RIDL consiste de un conjunto de módulos de
portales. Los módulos de portales o directamente portales se asocian con las clases
por el nombre. Un portal es el encargado de manejar la interacción remota y la
transferencia de datos de la clase asociada a él, y puede asociarse como máximo a una
clase. La unidad mínima de interacción remota es el método [36].
Entre otro de los lenguajes de aspectos de dominio específico puede
mencionarse a Malaj (usado en la programación distribuida) trata los concerns de
distribución y relocalización [36].
II.6.3.2
Lenguajes de Aspectos de Propósito General
Los Lenguajes orientados a Aspectos de Propósito General; están diseñados
para ser utilizados con cualquier tipo de concern. No imponen restricciones en el
lenguaje base utilizado, normalmente tienen el mismo nivel de abstracción que el
lenguaje base y el mismo conjunto de instrucciones. El lenguaje de aspecto de
propósito general más extendido en la actualidad es AspectJ. AspectJ utiliza como
lenguaje base a Java, las instrucciones de los aspectos son escritas también en Java.
39
AspectJ, es una extensión de propósito general para el lenguaje de
programación Java, cuya primera versión fue lanzada en 1998 por el equipo de
Gregor Kiczales; permite extender a Java con una nueva clases de módulos
denominados aspectos, los cuales mejoran la separación de concerns. AspectJ soporta
dos tipos de implementaciones de entrelazado (crosscutting). La primera, entrelazado
dinámico o dynamic crosscutting hace posible definir implementaciones adicionales
para correr ciertos puntos bien definidos en la ejecución de un programa; la segunda,
entrelazado estático o static crosscutting hace posible la modificación de la estructura
estática de los tipos (clases, interfases y otros aspectos) y su comportamiento en
tiempo de compilación, definiendo nuevas operaciones o tipos existentes [33].
Entre otros lenguajes de propósito general pueden mencionarse a JPAL
(Junction Point Aspect Language) lenguaje basado en Joint Points, AspectC
(subconjunto de AspectJ que extiende a C), AspectS (subconjunto de AspectJ que
extiende el ambiente Squeak/Smalltalk), AspectC++ (extiende el lenguaje C++ para
soportar el manejo de aspectos) y HyperJ (identifica, encapsula e integra múltiples
dimensiones de concerns) [33].
CAPÍTULO III
MARCO METODOLÓGICO
40
III.1.
Tipo de investigación
La investigación es del tipo Proyectos Factibles [13], ya que consistió en la
investigación, elaboración y desarrollo de una propuesta de un modelo operativo
viable para solucionar problemas, requerimientos o necesidades de organizaciones o
grupos sociales, y tiene su apoyo en una investigación de tipo documental porque
estuvo basada en la indagación, organización, interpretación y presentación de
información alrededor de la Programación Orientada a Aspectos proveniente de
fuentes bibliográficas y electrónicas reconocidas y de comprobada autenticidad [1].
III.2.
Nivel de la investigación
El nivel de la investigación es descriptivo-analítico, puesto que se basa en la
descripción de los conceptos de la POA, también en el análisis de la información
donde se destacan los aspectos más relevantes, por último se hizo el diseño del
modelo y desarrollo del código del caso de estudio en base a este análisis [1].
III.3. Fuentes y técnicas de recolección de información
Las fuentes de la investigación la conformaron fuentes primarias: grupos de
investigación de la Universidad de Oriente, asistencia a ponencias y jornadas
tecnológicas (Jornadas Tecnológicas PDVSA Sucre 2006 – ASOVAC Sucre 2006);
fuentes secundarias: fuentes bibliografías y electrónicas como textos, monografías,
exposiciones y trabajos de investigación a las que se hacen referencia en este trabajo.
Las técnicas de recolección de información fueron las propias de la investigación
documental: el subrayado, la ficha, la bibliografía, etc. El subrayado fue un
procedimiento muy utilizado para destacar ciertos conceptos, frases o argumentos en
41
las obras que se consultaron. Las fichas constituyeron el instrumento básico para
recoger la información de las distintas fuentes documentales, facilitando la
clasificación de los diversos datos requeridos y que sirvieron para la redacción final
de este trabajo [1][13]. También se hizo uso de las herramientas descargadas de los
sitios web reconocidos que hacen referencia al tema. Entre estos recursos se
encuentran las herramientas para trabajar con la programación de aspectos.
III.4. Metodología: Análisis y Diseño de Sistemas Orientado a Objetos
usando el Lenguaje Unificado de Modelación (UML)
Como el objetivo de este trabajo fue el de implementar requisitos no
funcionales a través de la programación orientada a aspectos en un sistema de
software, se tomó como punto de partida el análisis y diseño orientado a objetos para
la construcción del código base como se hace referencia en [7]. Los sistemas
orientados a objetos describen las entidades como objetos. Los objetos son parte de
un concepto general denominado clases (concepto importante para la POA).
La idea de las clases es tener un punto de referencia y describir las similitudes o
diferencias que un objeto específico posee con respecto a los miembros de su propia
clase. Una clase define el conjunto de atributos y comportamientos compartidos por
cada objeto de la clase. Por ejemplo, los registros de los estudiantes en la sección de
un curso almacenan información similar para cada estudiante. Se podría decir que los
estudiantes constituyen una clase, los valores podrían ser diferentes para cada
estudiante, pero el tipo de información es el mismo. Los programadores deben definir
las diversas clases en el programa que escriben y crear los objetos a partir de la clase
establecida, esto se conoce con el término de “instanciar”. Por ejemplo, un programa
podría instanciar a un estudiante llamado Pedro Pérez como un objeto de la clase
denominada Estudiante [7].
42
En este trabajo se utilizaron clases desarrolladas en el lenguaje de
programación Java y se instanciaron objetos a partir de éstas, para tratar los requisitos
funcionales como, por ejemplo, las transacciones de agregar, editar o eliminar un
registro en un sistema de software (caso de estudio).
Lo que hace a la programación orientada a objetos, y por consiguiente al
análisis y diseño orientado a objetos, diferente de la programación clásica, es la
técnica de colocar todos los atributos y métodos de un objeto en una estructura
independiente, la propia clase. Esta es una situación común en el mundo físico, por
ejemplo, un paquete con harina para pastel empacado es similar a una clase ya que
contiene los ingredientes y las instrucciones para mezclar y hornear el pastel. Un
suéter de lana es similar a una clase porque incluye una etiqueta con instrucciones del
cuidado que advierte que se debe de lavarlo a mano y ponerlo a secar extendido [7].
Igualmente todas las clases del caso de estudio que se desarrollaron en este trabajo
están formadas por atributos y métodos encapsulados en una estructura
independiente.
El lenguaje Unificado de Modelación (UML), por sus siglas en inglés, es el
estándar de la industria para modelar sistemas orientados a objetos, el conjunto de
herramientas UML incluye diagramas que permiten visualizar la construcción de un
sistema orientado a objetos. El UML es una herramienta poderosa que puede mejorar
enormemente la calidad del análisis y diseño de sistemas, y contribuir por tanto a
crear sistemas de información de alta calidad [7]. Se utilizó en este trabajo el lenguaje
Unificado de Modelación (UML) para modelar las clases que integrarán la
funcionabilidad principal del caso de estudio, así como las especificaciones de los
requisitos no funcionales vía aspectos.
43
Con el uso iterativo de UML es posible lograr una mayor comprensión en
relación con los requerimientos del sistema y los procesos que necesitan realizarse en
este último para cumplir dichos requerimientos. Al terminar el análisis y diseño, se
tuvo un conjunto preciso y detallado de especificaciones para las clases, procesos y
otros artefactos del sistema, lo cual contribuye a evitar el costo de volver a codificar a
causa de una pobre planeación inicial. Un artefacto es un término general que se
utiliza para describir cualquier pieza de información usada o producida al desarrollar
sistemas. Podría ser un diagrama, texto descriptivo, instrucciones de usuario, métodos
del código, programas o cualquier otro componente del sistema [7].
III.5.
Conceptos y diagramas de UML
Como se representa en la figura 3.1, UML consiste de cosas, relaciones y
diagramas. Los primeros componentes, o elementos principales de UML se
denominan cosas. Las cosas estructurales son más comunes, son clases, interfases,
clases de uso y muchos otros elementos que proporcionan una forma de crear
modelos. Las cosas estructurales permiten al usuario describir relaciones. Las cosas
de comportamiento describen como funcionan las cosas, las interacciones y las
máquinas de estado son ejemplos de cosas de comportamiento. Las cosas de
agrupamiento se usan para definir límites, un ejemplo de una cosa de agrupamiento es
un paquete. Por último, tenemos las cosas de anotación para que podamos agregar
notas a los programas.
Las relaciones son el pegamento que une las cosas, es útil considerar a las
relaciones de dos formas. Las relaciones estructurales se usan para enlazar las cosas
en los diagramas estructurales, incluyen dependencias, agregaciones, asociaciones y
generalizaciones. Por ejemplo, las relaciones estructurales muestran herencia. Las
relaciones de comportamiento se usan en los diagramas de comportamiento, los
44
cuatro tipos básicos de diagramas de comportamiento son: comunica, incluye,
extiende y generaliza [7].
Categoría UML
Elementos de UML
Detalles específicos de UML
Cosas
Cosas estructurales
Clases
Interfases
Colaboraciones
Casos de uso
Clases activas
Componentes
Nodos
Cosas de comportamiento
Interacciones
Máquinas de estado
Cosas de agrupamiento
Paquetes
Cosas de anotación
Notas
Relaciones estructurales
Dependencias
Agregaciones
Asociaciones
Generalizaciones
Relaciones de comportamiento
Comunica
Incluye
Extiende
Generaliza
Diagramas estructurales
Diagramas de clase
Diagramas de componentes
Diagramas de despliegue
Diagramas de comportamiento
Diagramas de casos de uso
Diagramas de secuencias
Diagramas de colaboración
Diagramas de gráfico de estado
Diagramas de actividades
Relaciones
Diagramas
Figura 3.1
Hay dos tipos principales de diagramas en UML: diagramas estructurales y
diagramas de comportamiento. Los diagramas estructurales se utilizan para describir
las relaciones entre las clases, incluyen diagramas de clases, diagramas de objetos,
diagramas de componentes y diagramas de despliegue. Por otro lado, los diagramas
45
de comportamiento se pueden usar para describir las interacciones entre las personas
(denominadas actores en UML) y la cosa que nos referimos como caso de uso, o
cómo usan los actores el sistema. Los diagramas de comportamiento incluyen
diagramas de caso de uso, diagramas de secuencia, diagramas de colaboración,
diagramas de gráficos de estado y diagramas de actividades.
Los seis diagramas de UML, que más se utilizan son:
1. Diagrama de caso de uso, que describe como se usa el sistema. Los analistas
comienzan con un diagrama de caso de uso.
2. Escenario de caso de uso (aunque técnicamente no es un diagrama), es una
descripción verbal de las excepciones para el comportamiento principal
descrito por el caso de uso principal.
3. Diagrama de actividades, ilustra el flujo general de actividades. Cada caso
de uso podría crear un diagrama de actividades.
4. Diagramas de secuencias, muestran las secuencias de actividades y las
relaciones de las clases, cada caso de uso podría generar una o más
diagramas de secuencias. Una alternativa para un diagrama de secuencias es
un diagrama de colaboración, el cual contiene la misma información en
formato diferente.
5. Diagramas de clases, muestran la clases y las relaciones, los diagramas de
secuencias se usan para determinar las clases en un diagrama gen/esp que
significa (generalización/especialización).
6. Diagramas de gráficos de estado, muestra las transiciones de estado, cada
clase podría crear un diagrama de gráfico de estado el cual es útil para
determinar los métodos de la clase [7].
46
En este trabajo se utilizó la metodología propuesta por Kendall & Kendall [7],
para el Análisis y Diseño de Sistemas usando el Lenguaje Unificado de Modelación
(UML). El desarrollo parte de estos conceptos y diagramas de UML como
herramienta principal para el análisis y diseño orientado a objetos para la
construcción del código base (requisitos funcionales), así mismo se hicieron las
especificaciones del aspecto que servirá de base para implementar los requisitos no
funcionales a través de la programación orientada a aspectos al caso de estudio.
CAPÍTULO IV
RESULTADOS
47
IV.1. Análisis de conceptos y definiciones del DSOA y de la POA
Para probar las tecnologías inherentes a la POA a nivel de implementación, fue
necesario analizar los principales conceptos que de ella se derivan, hacer uso de las
herramientas disponibles para implementar la plataforma tecnológica y comprobar
que esta tecnología en realidad funciona. Antes de desarrollar el caso de estudio,
primero se analizaron los conceptos de “crosscutting concerns”, “aspecto”, “joint
point”, “pointcut” y “advises”, los cuales son fundamentales cuando se trabaja con
aspectos a nivel de implementación. Luego de varias sesiones de trabajo y análisis de
la investigación documental, la aplicación de estos conceptos se basa en lo siguiente:
Los crosscutting concerns son aquellas propiedades (bloques de código) que se
reparten a lo largo de varias clases (POO) de una aplicación, las cuales representan un
inconveniente a la hora de la mantenibilidad del código. El problema radica en que si
se quiere quitar, colocar o modificar alguna de estas propiedades, se tiene el grave
problema de tocar mucho código y trabajar en cada una de las clases afectadas. Estas
incumbencias transversales se pueden modularizar utilizando la POA a través de
aspectos.
Los aspectos son unidades modulares que se definen de manera similar a una
clase en Java (Lenguaje base escogido en este trabajo), con sus propios atributos y
propiedades, con la diferencia que utilizan los mecanismos de joint point para indicar
en que métodos de las clases afectadas se van a insertar las propiedades
modularizadas, los pointcut que definen los cortes y están formados por un conjunto
de joint points, por último están los advises que funcionan de forma parecida a un
método y son los que contienen los bloques de código que conforman las propiedades
modularizadas del aspecto.
48
Para probar el funcionamiento de la tecnología de aspectos, fue necesario
desarrollar clases hechas en Java e implementar aspectos a través de AspectJ. Para
realizar estas pruebas se implantó en primer lugar la plataforma tecnológica para la
POA compuesta por el lenguaje base Java y el tejedor-compilador de aspectos
AspectJ. La escogencia de estas herramientas y la descripción detallada de la
implementación de la plataforma se describe en la próxima sección de este trabajo.
Una clase en Java está formada por tres elementos principales: un nombre único
que las diferencie de las otras clases, los atributos que representan alguna propiedad
de la clase y que se encuentra en todas las instancias de la clase y los métodos que
son la implementación de un servicio de la clase, muestran un comportamiento
común a todos los objetos. En resumen es una función que le indica a las instancias
de la clase que hacer. La sintaxis típica de una clase en Java es:
class NombreClase //Inicio clase
{
atributo_1; //Lista de atributos
atributo_2;
...;
public static void main(String args[]) // Función principal
{
...;
}
public void método1() //Métodos
{ ... }
public void método2()
{ ... }
public void método3()
{ ... }
} //Fin de la clase
Un aspecto en AspectJ tiene una estructura similar a una clase de Java, con sus
atributos y métodos, incorporando los elementos propios como los joint point,
pointcut y advises. La sintaxis típica de un aspecto es:
aspect NombreAspecto //Inicio aspecto
49
{
atributo_1; //Lista de atributos
atributo_2;
...;
pointcut NombrePointcut():(execution(* NombreClase1.método1(..))||
execution(* NombreClase2.método1(..))||
execution(* NombreClase3.método1(..))||
);
///*** Advise: determina el código que ha de ser ejecutado en
cada pointcut
before ():NombrePointcut()
{
...
}
after():NombrePointcut()
{
...
}
public void método1() //Métodos
{ ... }
public void método2()
{ ... }
public void método3()
{ ... }
} //Fin del aspecto
Partiendo de la estructura de estos dos elementos básicos (clases y aspecto), se
hicieron pruebas a nivel de implementación aplicándolo a un ejemplo práctico donde
se desarrolló una clase en Java que ejecutaba un proceso a través de un método que
mostraba un mensaje un número determinado de veces utilizando un bucle “For”. De
la misma forma se desarrolló un aspecto que consistió en medir el tiempo que tardaba
en ejecutarse el método de la clase. Se compiló la clase con Java y se ejecutó en
forma satisfactoria mostrando el mensaje ejecutado por el método de la clase. Luego
se hizo el tejido y compilación de la clase y aspecto con AspectJ, mostrándose los
resultados esperados con la implementación del aspecto. En resumen, la tecnología
referenciada en la bibliografía se probó de la siguiente manera:
1.- Se codificó una clase en Java para ejecutar un proceso determinado.
50
2.- Se codificó un aspecto para medir el tiempo que tardaba en ejecutarse el proceso.
3.- Se compiló la clase en Java y funcionó correctamente.
4.- Se compiló la clase y aspecto con AspectJ y la función asociada se ejecutó.
Código de la función básica
Código del aspecto
public class MiPrograma
{
long total;
public MiPrograma()
{
total = 0;
}
public static void main(String args[])
{
MiPrograma programa = new
MiPrograma();
programa.procesa();
System.out.println("");
System.out.println(" Ha finalizado
el proceso !!");
}
///*** Método "procesa"
public void procesa()
{
System.out.println("");
for(int i = 0; i < 10; i++)
{
///*** Bucle simple que muestra
"Hola Mundo" diez veces
total = total + 1;
System.out.println(" Hola Mundo
!! (" + total + ")");
}
}
}
aspect MiAspecto
{
private long tiempo = 0;
///*** Se define el pointcut
///*** que se ejecuta cuando se ejecuta
El método procesa
pointcut MiPointcut(): execution(*
MiPrograma.procesa(..));
///*** Advise: determina el código que
ha de ser ejecutado en cada pointcut
///*** antes y despues de la función
procesa
before (): MiPointcut()
{
System.out.println(" Entrada en
funcion: " + thisJoinPoint);
tiempo = System.currentTimeMillis();
System.out.println(" Tiempo inicial
en milisegundos : " + tiempo);
}
after(): MiPointcut()
{
System.out.println("");
System.out.println(" Salida de
funcion: " + thisJoinPoint);
System.out.println(" Tiempo final en
milisegundos : " +
System.currentTimeMillis() - tiempo
));
}
}
Figura 4.1
En la figura 4.1 se puede apreciar como el aspecto “MiAspecto” se implanta a
través del pointcut MiPointcut() y ejecuta la función codificada en el advises antes y
después del método “procesa” de la clase “MiPrograma”, con la finalidad de medir el
tiempo que tarda en ejecutarse.
IV.2. Implementación de la plataforma tecnológica
Para implementar el caso de estudio se escogió Java como lenguaje base y
AspectJ como lenguaje de aspectos. Java es un lenguaje de programación de alto
51
nivel de propósito general, multiplataforma y orientado a objetos. La razón de su
escogencia es que Java es independiente de la máquina y del Sistema Operativo lo
que permite ejecutar un programa hecho en Java, por ejemplo, en una computadora
con Linux o Windows, en un PDA, o en un teléfono móvil [37].
Para conseguir esto el código fuente se compila a un lenguaje que no es
específico de la plataforma, sino que es un código intermedio denominado
"bytecode". Este código no es ejecutado directamente, ya que no es comprendido
por la máquina, sino que es interpretado por un programa denominado Máquina
Virtual o más específicamente JVM (Máquina Virtual de Java). La JVM es
específica de la plataforma. De esta forma para ejecutar un programa Java sólo se
necesita la máquina virtual de la plataforma que se esté usando. Así por ejemplo,
existen máquinas virtuales para Sistemas Operativos Windows, Linux, Apple y
Solaris.
Es un lenguaje de propósito general ya que con él se pueden hacer multitud de
cosas: crear tanto programas simples de consola hasta grandes programas en entorno
gráfico, hacer los applets que lucen en las páginas web, los servlets (programas
cliente-servidor más potentes que los clásicos CGI), las JSP (Java Server Pages,
similares a las páginas PHP o ASP), los sockets (programas para redes de
ordenadores), etc [37].
Es un lenguaje orientado a objeto ya que no es un lenguaje adaptado como C++
que desciende de C, sino que es un lenguaje que desde el principio ha sido de objetos:
(casi) todo en él son objetos. Gracias a la orientación a objetos y la máquina virtual
de Java es posible descargar un programa de la red en pocos segundos ya que los
programas que se crean en Java, en general, se basan todos en las clases que
52
incorpora la máquina virtual de Java (algo así como los archivos de librerías). Es
decir, todos los archivos necesarios para que el programa funcione ya los incorpora la
máquina de destino, los posee la JVM. De esta forma los programas en Java son
robustos y potentes [37].
Con respecto al lenguaje de aspectos, AspectJ, es el más maduro y con mayor
número de características de los nombrados en el Capítulo I. AspectJ es una
extensión orientada a aspectos del lenguaje de programación Java. Permite la
aplicación de aspectos a clases Java para la solución de los problemas cruzados. Un
compilador de AspectJ produce ficheros class conformes a la especificación del
bytecode de Java, permitiendo que sean ejecutados en cualquier máquina virtual de
Java. Al utilizar Java como lenguaje base, AspectJ proporciona todos los beneficios
de Java y hace que sea sencillo que los desarrolladores Java entiendan el lenguaje
AspectJ [38].
AspectJ está formado por dos partes: la especificación del lenguaje y la
implementación del lenguaje. La parte de especificación del lenguaje define el
lenguaje en el que se escribe el código; se implementa la funcionalidad principal con
el lenguaje Java y se utilizan las extensiones proporcionadas por AspectJ para
implementar el entrelazado (weaving) de los problemas cruzados. La parte de
implementación de lenguaje proporciona herramientas para compilar, depurar e
integrar AspectJ con los entornos de desarrollo más populares [38].
En AspectJ la implementación de las reglas de entrelazado (weaving) por el
compilador es llamado concerns transversales (crosscutting). Las reglas de
entrelazado atajan hacia múltiples módulos de manera sistemática con el objetivo de
53
modularizar los problemas cruzados. AspectJ define dos tipos de crosscutting,
crosscutting estático y crosscutting dinámico [38].
crosscutting dinámico: Es el entrelazado del nuevo comportamiento durante la
ejecución de un programa. El crosscutting dinámico aumenta o incluso reemplaza el
flujo de ejecución principal del programa de una manera que afecta a los distintos
módulos, por lo tanto modifica el comportamiento del sistema. Por ejemplo, se puede
especificar que una acción determinada sea ejecutada antes de la ejecución de ciertos
métodos o manejadores de excepciones en un conjunto de clases tan sólo
especificando en un módulo separado los puntos de entrelazado (Joint Point) y la
acción a realizar cuando se alcanzan esos puntos (Advises).
crosscutting estático: Es el entrelazado de modificaciones en la estructura estática
(clases, interfases y aspectos) del sistema, como en el caso de estudio de este trabajo.
La aplicación principal del crosscutting estático es dar soporte a la implementación
del crosscutting dinámico. Por ejemplo, se pueden añadir nuevos datos y métodos a
clases e interfases para definir estados de comportamientos específicos a nivel de
clase que pueden ser usados en el crosscutting dinámico. Otro uso del crosscutting
estático es declarar advertencias y errores en tiempo de compilación a través de
múltiples módulos.
IV.2.1
Instalación del lenguaje base (Java)
54
Para desarrollar, compilar y ejecutar las clases (archivos con extensión *.java)
que conforman el código base (requisitos funcionales) de la aplicación que representa
el caso de estudio, fue necesario instalar Java como lenguaje base. En este caso se
utilizó Java JDK Edition 1.5.0.
Paso 1.- Descripción del programa
Para compilar y ejecutar con Java se utiliza habitualmente Java Development
Kit (kit de desarrollo de Java) o jdk, desarrollado por Sun Corporation. El jdk tiene
dos familias principales: Java 2 Standard Edition o J2SE, orientado a uso personal,
y Java 2 Enterprise Edition o J2EE, la edición empresarial. A su vez, cada familia
tiene diferentes versiones, identificadas por una secuencia de números x.y.z. En este
caso se utilizará Java JDK Edition 1.5.0. Java Standard Edition es una herramienta
de uso libre que se puede descargar del sitio web: http://java.sun.com/.
Paso 2.- Instalación del jdk
Para la instalación de Java JDK Edition 1.5.0, Se debió desintalar cualquier versión
de Java del equipo y limpiar las variables de entorno que tengan que ver con Java.
Para instalar el JDK, se ejecutó el programa de instalación del jdk: "jdk-1_5_0_07windows-i586-p.exe". Este archivo se encuentra en la carpeta Java JDK Edition 1.5.0
del CD que acompaña este trabajo.
Se siguieron todas las instrucciones hasta que se comenzaron a copiar todos los
archivos.
55
Cuando terminó la instalación, se pulsó el botón de finalización y se dispuso a
reiniciar el equipo (sólo si es requerido).
Paso 3.- Configuración del jdk
Para configurar el JDK de Java, se procedió pulsando el botón derecho del mouse
sobre "Mi PC" para activar "Propiedades" del menú desplegable. Se seleccionó la
pestaña "Opciones avanzadas" y se pulsó en el botón inferior "Variables de entorno".
Tanto en el cuadro superior “Variables de usuario…” como el inferior “Variables del
sistema”, se localizó una variable que se llama "Path", se hizo clic sobre ella y se
pulsó el botón "Modificar".
56
En el cuadro de “Valor de variable”, se agregó esta instrucción al final: Otras
instrucciones...;C:\Archivos de programa\Java\jdk1.5.0_07\bin.
Se pulsó el botón ACEPTAR. Se procedió a salir de “Variables de entorno” y
“Propiedades del sistema”. Se abrió la "Consola del Sistema", también llamada
"Símbolo del Sistema". Habitualmente se puede encontrar en "Menú Inicio" ->
Programas -> Accesorios. Si no se encuentra, también se puede abrir con "Menú
Inicio" -> Ejecutar, luego escribir "cmd" y pulsar ACEPTAR. En el símbolo del
sistema, se escribió:
Java
Y se pulsó la tecla “ENTER”. En este punto cabe destacar que si se obtiene un
mensaje donde se muestran las opciones de Java, como en la siguiente figura:
El jdk de Java ya está configurado y listo para usarse.
Si por el contrario aparece un mensaje como este:
57
"java" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.
Se debe borrar del "Path" todas las variables de entorno que tengan que ver con Java,
revisar que se han seguido todos los pasos correctamente y volver a repetir el
procedimiento.
IV.2.2
Instalación del lenguaje de aspectos (AspectJ)
Para desarrollar, tejer (weaving), compilar y ejecutar las clases que conforman
el código base (requisitos funcionales) y el aspecto (requisitos no funcionales) para
evaluar los beneficios de la POA, fue necesario además de Java, instalar AspectJ
como lenguaje de aspectos. En este caso se utilizó AspectJ Development
Environment (AJDE) versión 1.5.2.
Paso 1.- Instalación del AspectJ
Para instalar AspectJ AJDE 1.5.2, se necesita tener instalada una versión de Java
previamente.
Se ejecutó el programa de instalación "aspectj-1.5.2.jar" que está en la carpeta
AspectJ AJDE 1.5.2 del CD que acompaña este trabajo.
AspecJ es una herramienta de uso libre que se puede descargar del sitio web:
http://eclipse.org.aspectj/.
Seguidamente aparece el instalador y se pulsó el botón “Next” para continuar.
58
Se seleccionó la máquina virtual de Java a ejecutar, que está en el directorio donde se
instala Java y se pulsó el botón “Next” para continuar.
Se eligió el directorio de trabajo y se pulsó el botón “Install”.
59
Se siguieron las instrucciones hasta que se comenzaron a copiar todos los archivos.
Cuando terminó la instalación, se pulsó el botón de finalización y se dispuso a
reiniciar el equipo (sólo si es requerido).
Paso 2.- Configuración de AspectJ
Para configurar AspectJ, se procedió pulsando el botón derecho del mouse sobre "Mi
PC" para activar "Propiedades" del menú desplegable. Se seleccionó la pestaña
"Opciones avanzadas" y se pulsó en el botón inferior "Variables de entorno".
Tanto en el cuadro superior “Variables de usuario…” como el inferior “Variables del
sistema”, se localizó una variable que se llama "Path", se hizo clic sobre ella y se
pulsó el botón "Modificar". En el cuadro de “Valor de variable”, se agregó esta
instrucción al final: Otras instrucciones...;C:\aspectj1.5\bin.
Se pulsó el botón ACEPTAR. Se procedió a salir de “Variables de entorno” y
“Propiedades del sistema”. En el directorio de instalación, se encuentra el entorno de
desarrollo de AspectJ.
60
Se ejecutó el archivo “ajbrowser.bat”. El aspecto inicial es el siguiente:
Se agregó sólo esta línea en "Tools" -> "Options" -> "AJBrowser Options" en
"Classpath (defaults to current directory): "C:\aspectj1.5\lib\aspectjrt.jar".
AspectJ ya está configurado y listo para usarse.
61
IV.3. Diseño del caso de estudio
El caso de estudio se centra sobre una realidad hipotética en el contexto de un
sistema para la inscripción regular de estudiantes de una universidad denominada
“Universidad Nacional”. Las operaciones implícitas en el proceso de inscripción,
parten del conocimiento y experiencia por parte de los investigadores, a partir del
contacto diario con situaciones reales en otros contextos (UDO, UNA, UCV, entre
otros), las cuales son extraídas de manera conveniente para desarrollar el caso de
estudio. El proceso de inscripción al que se hace referencia parte de tres etapas: La
primera comprende la selección de las asignaturas por parte del estudiante, previa oferta
hecha por la universidad de acuerdo a los pensum de estudio y al histórico o record de
calificaciones del estudiante. La segunda consiste en el registro de la inscripción por parte del
estudiante que consta de la carga académica a cursar y el cumplimiento de los requisitos
exigidos por la universidad, y por último la etapa de validación de la inscripción del
estudiante que realiza el departamento de Control de Estudio en representación de la
universidad con la finalidad de cerrar el proceso de manera formal. Los directivos de la
Universidad han enfatizado, que por problemas presentados anteriormente asociados al
proceso de inscripción, se hace necesario incorporar al sistema mecanismos que permitan
entre otras cosas la seguridad e integridad de los datos críticos registrados, previniendo el
acceso a los mismos por personas no autorizadas; así mismo, contemplar planes de
contingencia que permitan el funcionamiento de las operaciones mas importantes en caso de
que estas se produjeran.
Entre las funciones principales que el sistema debe abarcar están las siguientes:
62
1.- Registrar las asignaturas que conforman los pensum de las carreras que ofrece la
universidad y que estos datos queden almacenados en una base de datos, donde se
especifique código, nombre y unidades crédito de la asignatura. Debe contemplarse
que el sistema no permita la creación de asignaturas con código repetido.
2.- Registrar las matrices curriculares de los pensum de las carreras que ofrece la
universidad y que estos datos queden almacenados en una base de datos, donde se
especifique código de la carrera, nombre de la carrera, código de la asignatura,
nombre de la asignatura, unidades crédito de la asignatura, semestre a la cual
pertenece la asignatura y prerrequisitos.
4.- Registrar los datos personales de los estudiantes de la universidad, tomando en
cuenta que no exista duplicidad. Estos datos deben quedar almacenados en una base
de datos, donde se especifique cédula de identidad, nombre del estudiante, carrera,
dirección, teléfono, correo electrónico, fecha de nacimiento, centro local, etc. Esta
función es considerada crítica y debe protegerse contra posibles fallas que pongan en
peligro la prestación de este servicio y evitar que terceras personas puedan visualizar
o acceder a información del estudiante considerada confidencial (nombre del
estudiante).
3.- Registrar las calificaciones del histórico de notas de los estudiantes de la
universidad y que estos datos queden almacenados en una base de datos, donde se
especifique cédula de identidad, asignatura, calificación, lapso, etc. Esta función debe
protegerse contra posibles fallas que pongan en peligro la prestación de este servicio
y evitar el ingreso de datos erróneos que atenten contra la integridad.
4.- Realizar el proceso de selección de asignaturas de los estudiantes para la
inscripción y que estos datos queden almacenados en una base de datos, donde se
63
especifique cédula de identidad, asignatura, lapso, etc. La oferta de asignaturas se
debe ofrecer de acuerdo al pensum de estudio de la carrera en la cual está inscrito el
estudiante y de acuerdo al cumplimiento de los prerrequisitos exigidos en los pensum
previa comparación con el histórico de notas del estudiante. Para esta función es
necesario evitar el ingreso de datos erróneos y garantizar la prestación del servicio.
5.- Realizar el proceso de registro de inscripción de los estudiantes y que estos datos
queden almacenados en una base de datos, donde se especifique entidad bancaria
donde se deposita el arancel de inscripción, número del baucher, monto del depósito
y fecha del depósito. Esta función debe protegerse de fallas que pongan en peligro la
disponibilidad del servicio e impedir la generación de errores cuando se ingresa la
data.
6.- Imprimir la planilla de inscripción de los estudiantes para su posterior
conformación.
7.- Realizar el proceso de validación de inscripción de los estudiantes y que estos
datos queden almacenados en una base de datos, donde se especifique la
conformación por parte del administrador del sistema de entidad bancaria donde se
deposita el arancel de inscripción, número del baucher, monto del depósito y fecha
del depósito, evitando que no se produzcan errores que afecten la integridad de los
datos y que el servicio esté siempre disponible.
10.- Registrar los usuarios del sistema y que estos datos queden almacenados en una
base de datos, donde se especifique cédula de identidad, nombre usuario, nombre
completo del usuario, contraseña y nivel de acceso. Esta función debe considerar la
disponibilidad del servicio, evitar el ingreso de datos erróneos y que terceras personas
64
puedan visualizar información de los usuarios considerada confidencial (nombre de
usuario y contraseña).
IV.4. Solución al caso de estudio
Para la construcción del sistema base, se tomó como punto de partida el análisis
y diseño orientado a objetos usando UML propuesto por Kendall & Kendall en [7]
basado en la metodología clásica de Ciclo de Vida para el desarrollo de Sistemas la
cual comprende las siguientes fases:
• Investigación preliminar.
• Determinación de los requerimientos del sistema.
• Diseño del sistema.
• Desarrollo del software.
• Prueba de los sistemas.
• Implantación y evaluación.
IV.4.1
Investigación preliminar
La investigación preliminar de este trabajo consistió en conocer las etapas que
se llevan a cabo en el proceso de inscripción regular de una universidad. Con este
propósito se consultó de fuentes directas, visitando y haciendo entrevistas no
estructuradas al personal que labora en las oficinas de control de estudio de las
universidades e institutos de educación superior de la localidad, y se constató que
65
básicamente el proceso de inscripción consiste de tres etapas: La selección de las
asignaturas por parte del estudiante, previa oferta hecha por la universidad de acuerdo
a los pensum de estudio y al histórico o record de calificaciones del estudiante. El
registro de la inscripción por parte del estudiante que consta de la carga académica a
cursar y el cumplimiento de los requisitos exigidos por la universidad. Por último está
la etapa de validación de la inscripción del estudiante por parte de la universidad con
la finalidad de cerrar el proceso de manera formal.
IV.4.2
Requerimientos del sistema
El aspecto fundamental del análisis del sistema y la determinación de los
requerimientos, fue trabajar con los empleados de la oficina de control de estudio de
la universidad. Se hicieron entrevistas no estructuradas al personal involucrado en el
proceso de inscripción. Se revisaron y analizaron los formatos y planillas de
inscripción para determinar los requisitos funcionales y no funcionales del sistema de
inscripción base de este caso de estudio.
Los requisitos funcionales comprende la funcionabilidad básica del sistema,
que está integrada por todos los procesos derivados de las necesidades de los
usuarios. Los requisitos no funcionales comprende la incorporación del concern
“Seguridad”, que le brindará al sistema atributos de confiabilidad, confidencialidad y
disponibilidad, los cuales se describirán más adelante.
66
IV.4.2.1
Requisitos funcionales
1.- Registrar las asignaturas que conforman los pensum de las carreras que ofrece la
universidad.
2.- Registrar las matrices curriculares de los pensum de las carreras que ofrece la
universidad.
4.- Registrar los datos personales de los estudiantes de la universidad.
3.- Registrar las calificaciones del histórico de notas de los estudiantes de la
universidad.
4.- Realizar el proceso de selección de asignaturas de los estudiantes para la
inscripción.
5.- Realizar el proceso de registro de inscripción de los estudiantes.
6.- Imprimir la planilla de inscripción de los estudiantes para su posterior
conformación.
7.- Realizar el proceso de validación de inscripción de los estudiantes.
10.- Registrar los usuarios del sistema.
67
IV.4.2.2
Requisitos no funcionales
1.- Debe contemplarse que el sistema no permita la creación de asignaturas con
código repetido.
2.- Se debe tomar en cuenta que no exista duplicidad en los datos de los estudiantes.
La función de ingresar estudiantes es considerada crítica y debe protegerse contra
posibles fallas que pongan en peligro la prestación de este servicio y evitar que
terceras personas puedan visualizar o acceder a información del estudiante
considerada confidencial (nombre del estudiante).
3.- La función para registrar el histórico del estudiante debe protegerse contra
posibles fallas que pongan en peligro la prestación de este servicio y evitar el ingreso
de datos erróneos que atenten contra la integridad.
4.- Para la función de selección de asignaturas es necesario evitar el ingreso de datos
erróneos y garantizar la prestación del servicio.
5.- El registro de la inscripción debe protegerse de fallas que pongan en peligro la
disponibilidad del servicio e impedir la generación de errores cuando se ingresa la
data.
6.- La función de validación de la inscripción debe contemplar que no se produzcan
errores que afecten la integridad de los datos y que el servicio esté siempre
disponible.
7.- Cuando se registren usuarios al sistema se debe considerar la disponibilidad del
servicio, evitar el ingreso de datos erróneos y mantener la confidencialidad.
68
IV.4.2.3
Requisitos funcionales vs. Requisitos no funcionales
Acceso
Registro de
asignaturas
Integridad
Disponibilidad
Confidencialidad
X
X
X
X
X
X
Registro de
Pensum
Registro
datos
personales de
estudiantes
Registro
histórico de
calificaciones
Selección de
asignaturas
X
Registro de
inscripción
X
X
Imprimir la
planilla de
inscripción
Registro de
validación de
inscripción
Registro de
usuarios
X
X
X
X
X
69
IV.4.3 Diseño del sistema
IV.4.3.1
Modelo de caso de uso
El modelo de caso de uso describe lo que hace el sistema sin describir cómo lo
hace, es decir, es el modelo lógico del sistema. Refleja la vista del sistema desde la
perspectiva de un usuario fuera del mismo (requerimientos). Cada diagrama de caso
de uso está compuesto por dos actores (administrador y estudiante) quienes inician el
evento, el evento que activa el caso de uso y el caso de uso que desempeña las
acciones activadas por el evento. Los casos de uso y los escenarios de caso de uso
para cada función se encuentran en el aneo No. 1.
Registrar
asignatura
<<Incluir>> <<Incluir>>
<<Incluir>>
Registrar
pensum
Registrar
estudiante
<<Incluir>>
Verificar
identidad
<<Incluir>>
<<Incluir>>
Registrar
usuarios
Administrador
Registrar
histórico
<<Incluir>>
<<Incluir>>
Seleccionar
asignaturas
Registrar
inscripción
Estudiante
70
IV.4.3.2
Diagrama de clases
71
IV.4.3.3
Diagrama de secuencia
Los Diagramas de Secuencias representan una interacción entre objetos de
manera secuencial en el tiempo. Muestra la participación de objetos en la interacción
entre sus “líneas de vida” (desde que se instancian) y los mensajes que ellos
organizadamente intercambian en el tiempo. El responsable o ACTOR es quien inicia
el ciclo interactuando inicialmente con la interfaz de usuario: GUI; en seguida se
inician todos los objetos que intervienen en el funcionamiento de la aplicación. En
este diagrama se comienza a observar el comportamiento del sistema a partir de los
eventos generados por los actores. Los diagramas de secuencia para cada función se
encuentran en el aneo No. 2.
Diagrama verificar identidad (1)
::Password
::ControlPassword
::MenuAdministrad
::ConexionODBC
Administrador
Password()
ConexionODBC()
Devuelve la conexión
con el origen de datos
VerificarDatos()
72
IV.4.3.4
Diagrama de actividades
Los diagramas de actividades demuestran las secuencias de actividades de un
proceso. Se utilizan para visualizar, especificar, construir y documentar la dinámica
de un conjunto de objetos o simplemente para modelar el flujo de control de una
operación (método de una clase). Fundamentalmente es un Diagrama de Flujo que
muestra el flujo de control entre las actividades. Los diagramas de actividades para
cada función se encuentran en el aneo No. 3.
Diagrama verificar identidad
Inicio
Usuario y
Contraseña
Obtener
Registro de
Usuario
Usuario y Contraseña
Estado del
Registro
Reingresar datos
Desplegar
mensaje de
error
No encontrado
Encontrado
Cancelar
Desplegar
Menú
Administrador
Fin
Desplegar
Menú
Estudiante
Nivel Administrador
Nivel Estudiante
73
IV.4.3.5
Especificación de requisitos no funcionales
De acuerdo a los requerimientos de seguridad del sistema, y a lo plasmado en la
sección anterior el aspecto estará conformado por tres mecanismos de seguridad: un
mecanismo llamado Excepciones para resguardar la Integridad del sistema, un
mecanismo llamado Operacion para garantizar la Disponibilidad del sistema y un
mecanismo llamado Encriptar para garantizar la Confidencialidad del sistema. Estos
mecanismos atravesarán ortogonalmente a las clases de control en los métodos
comunes a través de “crosscutting” o puntos de insercción.
La función auxiliar a implementar al sistema en estudio consiste en el “Aspecto
Seguridad”, que contiene en su estructura a los “Pointcut”, los “Joint Point” y los
“Advises” términos descritos en el Capítulo I de este trabajo.
Un aspecto “Aspect” se declara de forma similar a una clase. Es la unidad de
código que encapsula los puntos de cortes, avisos, introducciones y declaraciones,
además de sus propios métodos y atributos. La diferencia con una clase es que un
aspecto puede entrecruzar otras clases o aspectos.
Un punto de corte “Pointcut”, permite definir la selección de puntos de unión
(Join Point) dentro del Aspecto.
Los puntos de enlace “Joint Point” son puntos bien definidos en la ejecución de
un programa, entre ellos podemos citar llamadas a métodos y accesos a atributos.
Los avisos “Advises” son acciones que se ejecutan en cada punto de enlace
incluido en un corte. Los avisos tienen acceso a los valores expuestos por el corte.
74
Las tres entidades anteriores son estáticas porque permiten definir
comportamiento adicional que actuará en tiempo de compilación.
Mecanismo para garantizar la integridad del sistema
Las excepciones son la manera de manejar los errores en tiempo de ejecución. La
mayoría de los lenguajes, cuando presentan un error de este tipo lo que hacen es
detener la ejecución del programa. Las excepciones permiten escribir código para
manejar los errores y continuar (si es conveniente) con la ejecución del programa.
pointcut Excepciones(): Maneja los errores en tiempo de ejecución cuando los datos
de entrada no sean correctos, cuando no se encuentre un registro, cuando existan
datos duplicados o errores de tipos de datos a través de las clases de control y así
mantener la integridad de los datos.
Mecanismo para garantizar la disponibilidad del sistema
Los piratas informáticos utilizan programas que causan muchos perjuicios para
registrarse en varias cuentas en un servicio Web o aplicación. Con estas cuentas, los
piratas pueden interrumpir el servicio y causar problemas a los usuarios.
Por ejemplo, los piratas pueden utilizar las cuentas para enviar correo no deseado o
registrar usuarios y datos personales de forma automática, y así producir
congestionamientos que atenten contra la disponibilidad de un sistema.
75
También pueden utilizar programas dañinos para iniciar sesión automáticamente en
cuentas de otros usuarios, cambiar y/o borrar la información suministrada por el
titular correcto de la cuenta causando graves problemas para el mismo.
Para evitar estos inconvenientes se diseñó un mecanismo que obliga a que sea una
persona y no un programa automatizado el que ingrese los datos al sistema. En la
mayoría de los casos, sólo una persona (no un programa) puede reconocer los textos
(números o caracteres) de una imagen. Por esto, este reconocimiento de caracteres y
dígitos en una imagen le proporciona al usuario de este sistema un nivel mayor de
seguridad.
pointcut Operacion(): Ejecuta el método IngresaCaracteres que muestra una imagen
con caracteres, con la finalidad de forzar al operador a escribir estos caracteres para
comprobar que es una persona y no un programa automatizado el que ingresa los
datos a través de las clases de control y así garantizar la disponibilidad del sistema.
Mecanismo para garantizar la confidencialidad del sistema
Con respecto a la privacidad y confidencialidad de los datos, un individuo puede
tener la habilidad para ver, modificar o utilizar la información personal identificable
de cualquier usuario de un sistema. Tal información puede incluir nombre, país,
dirección física, dirección de correo electrónico, número de tarjeta de crédito, número
de seguro social, número de identificación gubernamental. También se le conoce
como información personal o datos personales.
Para evitar que terceras personas puedan ver o acceder a los datos personales. Se
diseñó un mecanismo de encriptamiento de datos que se refiere al proceso de
76
convertir datos en texto cifrado. En el caso del sistema base, los datos que revisten
mayor importancia para su encriptamiento son los nombres de usuario y contraseñas
de acceso al sistema y algunos datos personales de los estudiantes.
pointcut Encriptar(): Ejecuta el método Encriptar que permite encriptar los datos de
mayor importancia para los usuarios del sistema a través de las clases de control y así
garantizar la confidencialidad del sistema.
IV.4.4
Desarrollo del software
Para desarrollar el código base y el aspecto se utilizó el siguiente hardware y
herramientas de programación:
• Microcomputador Portátil con procesador Mobile AMD Sempron 3100+
• Disco duro de 40 Gb
• Memoria RAM de 256 Mb DDR
• Unidad lectora de CD-ROM
• Unidad de reescritura CD-WR
• Monitor XGAF TFT LCD 15”
• Mouse de tres teclas
• Puerto inalámbrico para redes 802.1 b/s gíreles LAN
• Impresora de inyección de tinta (dispositivo de salida)
En cuanto a las herramientas, se utilizó el sistema operativo Windows XP de
Microsoft Corporation. Además del sistema operativo, se utilizó para el diseño y
construcción de la base de datos el manejador de base de datos Microsoft Access
77
2003 de Microsoft Corporation, el lenguaje de programación Java JDK Edition
1.5.0 de Sun Microsystem Corporation para desarrollar el código base, el lenguaje de
propósito general AspectJ versión 1.5.2 de Xerox Park integrado en Eclipse para la
implementación de los aspectos, el decompilador DJ Java Decompiler 3.6 de Atanas
Neshkov.
De acuerdo a los requerimientos del sistema, el código de la aplicación se
desarrolló siguiendo una arquitectura de software por capas, las clases estarán
formadas por clases de interfaz para interactuar con el usuario a través de menús o
cajas de diálogo y capturar los datos, clases de control para hacer las transacciones
propias del sistema desde la interfaz hasta la base de datos donde se hacen los
registros, y una clase de tipo abstracto que servirá para hacer la conexión entre las
clases de control y el origen de datos.
78
Clases de interfaz
Password: Para crear el diálogo que sirve para ingresar usuario y contraseña de
acceso.
MenuAdministrador: Para
crear el menú nivel administrador con todas las
opciones de la aplicación.
MenuEstudiante: Para crear el menú nivel estudiante con sólo las opciones de
inscripción.
Asignaturas: Crea un diálogo que sirve para ingresar datos de asignaturas.
Pensum: Crea un diálogo que sirve ingresar datos de los pensum de estudio.
Estudiantes: Crea un diálogo que sirve para ingresar o mostrar los datos de los
estudiantes.
Historico: Crea un diálogo que sirve para ingresar, cambiar, eliminar o mostrar las
calificaciones del histórico de los estudiantes.
Inscripciones: Crea un diálogo que sirve para ingresar, eliminar o mostrar las
asignaturas seleccionadas por el estudiante para la inscripción.
Validaciones: Crea un diálogo que sirve para validar la inscripción del estudiante.
Usuarios: Crea un diálogo que sirve para ingresar o mostrar los datos de usuario y
contraseña.
Clases de control
ControlPassword: Para trabajar con las funciones que hacen la comprobación de
usuario y contraseña a la base de datos.
ControlAsignaturas: Para trabajar con las funciones que hacen transacciones de los
datos de asignaturas a la base de datos.
ControlPensum: Para trabajar con las funciones que hacen transacciones de los
datos de los pensum de estudio a la base de datos.
79
ControlEstudiantes: Para trabajar con las funciones que hacen transacciones de los
datos personales de los estudiantes a la base de datos.
ControlHistorico: Para trabajar con las funciones que hacen transacciones de los
datos del histórico de notas de los estudiantes a la base de datos.
ControlInscripciones: Para trabajar con las funciones que hacen transacciones de las
asignaturas seleccionadas por los estudiantes a la base de datos.
ControlValidaciones: Para trabajar con las funciones que hacen transacciones de las
validaciones y registros de inscripción de los estudiantes a la base de datos.
ControlUsuarios: Para trabajar con las funciones que hacen transacciones de los
datos de los usuarios a la base de datos.
Clases abstractas
Java.awt.JFrame: Clase del paquete de librerías estándar de Java para crear Frames
o ventanas de interfaz.
Java.awt.JDialog: Clase del paquete de librerías estándar de Java para crear Cajas de
Diálogos de interfaz.
ConexionODBC: Para hacer la conexión entre las clases de control y el origen de
datos.
Aspecto (aspect)
AspectoSeguridad: Para crear el aspecto SEGURIDAD con los atributos: Integridad,
Disponibilidad y Confidencialidad, como requisitos no funcionales comunes para las
clases de control.
80
Puntos de corte (pointcut)
Excepciones: Para crear el mecanismo que garantiza la integridad del sistema
(Advises). Atraviesa ortogonalmente a las clases: ControlPassword, ControlUsuarios,
ControlEstudiantes, ControlAsignaturas, ControlInscripciones, ControlValidaciones
en los métodos VerificarDatos() y BuscarCedula() (Joint Point).
Operacion: Para crear el mecanismo que garantiza la disponibilidad del sistema
(Advises).
Atraviesa
ortogonalmente
a
las
clases:
ControlUsuarios,
ControlEstudiantes, ControlHistorico, ControlInscripciones, ControlValidaciones en
los métodos GuardarDatos() y ActualizarDatos() (Joint Point).
Encriptar: Para crear el mecanismo que garantiza la confidencialidad del sistema
(Advises). Atraviesa ortogonalmente a las clases: ControlPassword, ControlUsuarios,
ControlEstudiantes, en el método IniciarVariables() (Joint Point).
81
IV.4.4.1
Construcción de la base de datos
La base de datos se construyó utilizando la herramienta Microsoft Office
Access 2003 de Microsoft Corporation.
Base de datos: Estudiantes.mdb
Archivo:
Estudiantes.mdb
Ubicación:
Carpeta “TG-319\3-BASE DE DATOS” del CD anexo al informe
Objetivos:
Crear la base de datos y las tablas que manejará el
sistema, definir la estructura de la base de datos y la
normalización.
Tiempo de duración:
1/2 semana
Herramienta utilizada:
Manejador de base de datos Access 2003 de
Microsoft Office 2003 Profesional de Microsoft
Corporation.
Costo estimado:
El costo va a depender de la licencia del software.
Dependencia
Ninguna (es la primera actividad).
(Prelación/Concurrencia):
Lista de entidades de la base de datos
El inventario de entidades muestra los nombres de las tablas que conforman la
base de datos que usará el sistema base para hacer las transacciones propias de un
proceso de inscripción.
USUARIOS: Tabla que contiene los nombres de usuarios y contraseñas.
ESTUDIANTES: Tabla (maestro) que contiene los datos de los estudiantes: cédula,
nombre y apellido, dirección, carrera, sexo, fecha de nacimiento, etc.
82
HISTORICO: Tabla que contiene los datos del histórico de calificaciones del
estudiante.
INSCRIPCIONES: Tabla que almacena los datos de las asignaturas seleccionadas
por el estudiante para la inscripción.
VALIDACIONES: Tabla que almacena los datos del registro de la inscripción del
estudiante, como número del depósito bancario por concepto de aranceles, nombre
del banco, fecha de depósito, monto, etc.
ASIGNATURAS: Tabla para almacenar los datos de todas las asignaturas: código,
nombre de la asignatura y número de créditos.
PENSUM: Tabla que almacena los datos de la matriz curricular de todas las carreras
que ofrece la universidad: código carrera, código asignatura, semestre, pre-requisitos,
etc.
Atributos por entidad, estructura y descripción
En esta sección se representan los campos que conforman las diferentes entidades.
USUARIOS
Nombre del campo
NombreUsuario
NombreCompleto
CedulaUsuario
ClaveUsuario
NivelUsuario
Tipo de datos
Texto
Texto
Número
Texto
Número
Descripción
Nombre del usuario del sistema
Nombre completo del usuario del sistema
Cédula de identidad del usuario
Clave de seguridad del usuario (contraseña)
Nivel de acceso del usuario
83
ESTUDIANTES
Nombre del campo
CedulaEstudiante
NombreEstudiante
FechaNacimiento
SexoEstudiante
DireccionEstudiante
TelefonoEstudiante
CorreoEstudiante
CodigoCarrera
CentroLocal
Tipo de datos
Número
Texto
Fecha/Hora
Texto
Texto
Texto
Texto
Número
Texto
Descripción
Cédula de identidad del estudiante
Nombres y apellidos del estudiante
Fecha de nacimiento del estudiante
Sexo del estudiante (0: Masculino 1:Femenino)
Dirección de habitación del estudiante
Teléfono del estudiante
Correo electrónico del estudiante
Código de la carrera del estudiante
Centro local donde cursa la carrera el estudiante
HISTORICO
Nombre del campo
CedulaEstudiante
CodigoAsignatura
CalificacionAsignatura
LapsoAsignatura
Tipo de datos
Descripción
Número
Cédula de identidad del estudiante
Número
Código de la asignatura
Número
Calificación obtenida
Lapso en que el estudiante obtuvo la
Texto
calificación
INSCRIPCIONES
Nombre del campo
CedulaEstudiante
CodigoCarrera
CodigoAsignatura
LapsoInscripcion
Tipo de datos
Número
Número
Número
Texto
Descripción
Cédula de identidad del estudiante
Código de la carrera del estudiante
Código de la asignatura
Lapso de la inscripción
VALIDACIONES
Nombre del campo
CedulaEstudiante
LapsoInscripcion
BancoDeposito
NumeroDeposito
FechaDeposito
MontoDeposito
ValidacionInscripcion
Tipo de datos
Número
Texto
Texto
Número
Fecha/Hora
Número
Número
Descripción
Cédula de identidad del estudiante
Lapso de la inscripción
Banco donde se realizó el depósito arancel
Número del depósito de los aranceles
Fecha en que se realizó el depósito
Monto del depósito de los aranceles
Valida la inscripción del estudiante
84
ASIGNATURAS
Nombre del campo
CodigoAsignatura
NombreAsignatura
UCAsignatura
Tipo de datos
Descripción
Número
Código de la asignatura
Texto
Nombre de la asignatura
Número
Unidades de crédito de la asignatura
PENSUM
Nombre del campo
CodigoCarrera
CodigoAsignatura
SemestreAsignatura
CodigoPreRequisito1
CodigoPreRequisito2
CodigoPreRequisito3
CodigoPreRequisito4
Tipo de datos
Número
Número
Número
Número
Número
Número
Número
Descripción
Código de la carrera del estudiante
Código de la asignatura
Semestre al cual pertenece la asignatura
Código de pre-requisito de la materia
Código de pre-requisito de la materia
Código de pre-requisito de la materia
Código de pre-requisito de la materia
Relación entre entidades
ESTUDIANTES
CedulaEstudiante NombreEstudiante
FechaNacimiento
SexoEstudiante
DireccionEstudiante
...
HISTORICO
CedulaEstudiante
CodigoAsignatura CalificacionAsignatura
...
LapsoAsignatura
INSCRIPCIONES
CedulaEstudiante
CodigoCarrera
CodigoAsignatura
LapsoInscripcion
...
BancoDeposito
NumeroDeposito
...
VALIDACIONES
CedulaEstudiante
LapsoInscripcion
PENSUM
CodigoCarrera
CodigoAsignatura
SemestreAsignatura CodigoPreRequisito1
ASIGNATURAS
CodigoAsignatura NombreAsignatura
UCAsignatura
...
85
IV.4.4.2
Archivos:
Construcción del código base (clases)
Password.java
ControlPassword.java
MenuAdministrador.java
MenuEstudiante.java
Asignaturas.java
ControlAsignaturas.java
Pensum.java
ControlPensum.java
Estudiantes.java
ControlEstudiantes.java
Historico.java
ControlHistorico.java
Inscripciones.java
ControlInscripciones.java
Validaciones.java
ControlValidaciones.java
Usuarios.java
ControlUsuarios.java
ConexionODBC.java
Ubicación:
Carpeta “TG-319\1-CODIGO BASE-CLASES” del CD anexo al
informe
Objetivos:
Construir el código fuente de las clases que forman el
código base.
Tiempo de duración:
2 semanas
Herramienta utilizada:
Lenguaje de programación Java (JDK Edition 1.5.0)
Costo estimado:
Software de uso libre.
Tiene como prelación la Construcción de la base de
Dependencia
(Prelación/Concurrencia): datos.
El código base se encuentra anexo como la documentación del código base (clases).
Ver anexo No. 4.
86
IV.4.4.3
Archivos:
Construcción del aspecto (requisitos no funcionales)
AspectoSeguridad.java
ArchivoParaTejer.lst
Ubicación:
Carpeta “TG-319\ 2-ASPECTOS” del CD anexo al informe
Objetivos:
Construir el código fuente del aspecto que forma la
función auxiliar del sistema (requisitos no
funcionales)
Tiempo de duración:
2 semanas
Herramienta utilizada:
Lenguaje de aspectos AspectJ (AspectJ versión 1.5.2)
Costo estimado:
Software de uso libre.
Tiene como prelación la Construcción del código base
Dependencia
(Prelación/Concurrencia): (clases).
El código del aspecto se encuentra anexo como la documentación del aspecto. Ver
anexo No. 5.
Para la construcción de las clases hechas en Java (*.java) como para el aspecto
se puede utilizar cualquier editor de textos. En este caso se utilizó el block de notas
de Windows. Para editar una clase de Java con el block de notas de windows:
• Hacer clic con el botón derecho del mouse sobre la clase, ejemplo
“Password.java".
• Del menú que aparece, seleccionar "Abrir con".
• Hacer clic en Block de notas para editar la clase.
87
IV.5. Prueba e implementación
En esta sección se describirá detalladamente los pasos para la implementación
del código de base y la implementación del aspecto (requisitos no funcionales), con la
finalidad de evaluar los resultados y llegar a las conclusiones y recomendaciones
finales de este trabajo con respecto a las ventajas, desventajas, aportes o soluciones
inherentes a esta nueva tecnología.
IV.5.1
Empaquetado e instalación del código base y aspecto
El CD que acompaña a este trabajo contiene todo el código fuente, clases,
aspecto, base de datos y archivos de ayuda del Sistema de Software que sirve como
código base (requisitos funcionales) y del Aspecto Seguridad que sirve de función
auxiliar (requisitos no funcionales). El contenido del CD está dispuesto de la
siguiente manera:
Empaquetado:
Se hizo un empaquetado de los archivos (clases y aspecto) para su instalación
(instalador), con la herramienta INNO SETUP versión 4.0.
Empaquetado con INNO SETUP versión 4.0:
Ubicación en el CD: Raíz del CD (se ejecuta automáticamente o haciendo clic en el
archivo InstalarUNSIRV101.exe).
88
Instalador:
El instalador que se ejecuta por defecto cuando se introduce el CD en la computadora
es el empaquetado hecho con INNO SETUP versión 4.0.
Ubicación en el CD: Raíz del CD (se ejecuta automáticamente cuando se introduce
el CD en la computadora). Los otros archivos que forman parte de este instalador son:
•
autorun.inf (permite la ejecución automática del instalador).
•
UN.ico ( icono que identifica el CD).
•
LEAME.TXT (archivo con las sugerencias para la instalación).
Instalación del sistema
Para instalar el sistema, se debe disponer de una computadora con sistema operativo
Microsoft Windows XP. Introducir el CD que acompaña a este trabajo en la unidad
correspondiente, al cabo de 15 segundos se ejecutará el paquete instalador que se
encuentra en el directorio raíz del CD. Si no se ejecuta la instalación automática, se
debe accesar a la unidad de CD a través del explorador de Windows o “MI PC” y
ejecutar el programa instalador haciendo clic en el archivo Instalar UNSIRV101.exe.
Seguir las instrucciones que se indican en el instalador hasta que aparezca el botón
“Terminar”, si es necesario se debe reiniciar el sistema.
NOTA IMPORTANTE: Este instalador está diseñado y compilado de manera que
copie todas las clases y aspecto necesarias para la ejecución y prueba del sistema, es
importante señalar que se debe tener instalada en el PC la plataforma tecnológica para
la POA (Java y AspectJ en este caso) para el correcto funcionamiento del mismo
como se describe en la sección 4.2 de este capítulo.
89
IV.5.2
Creación del origen de datos
Para utilizar la base de datos “Estudiantes.mdb” y hacer las transacciones
propias de la funcionalidad básica como agregar, modificar y eliminar registros, es
necesario crear el origen de datos. El origen de datos permite hacer la conexión entre
la base de datos y la aplicación base a través del puente JDBC-ODBC.
Qué es JDBC
JDBC (Java DataBase Conectivity), es una interfaz de programación que permite a
los programas Java ejecutar sentencias SQL.
JDBC ya viene incorporado en el JDK (Java Development Kit o Kit de desarrollo de
Java). En este caso se está utilizando el JDK 1.5.0.
Con la tecnología JDBC se puede acceder a DBMS como Oracle, SQL Server, etc., y
existe un driver para cada uno de estos DBMS.
El puente JDBC-ODBC (Open DataBase Conectivity)
Este puente proporciona acceso JDBC API vía uno o más drivers ODBC. Implementa
operaciones JDBC traduciéndolas a ODBC, ODBC las recibe como las operaciones
de un programa aplicativo normal y las implementa en cualquier base de datos para la
cual exista un driver ODBC disponible. En este caso se implementa sobre una base de
datos Microsoft Access 2003.
Gráficamente sería algo como esto:
90
Aplicación Java
Administrador de orígenes de datos (JDBC driver manager)
Controlador
ODBC
driver JDBC
para ODBC
Controlador
ODBC
driver JDBC
para ODBC
Controlador
ODBC
driver JDBC
para ODBC
Origen de
datos X
Origen de
datos Y
Origen de
datos Z
Base de datos
X
Base de datos
Y
Base de datos
Z
Para crear el origen de datos ODBC, primero en “Panel de Control” se abre la opción
“Herramientas administrativas”.
Luego se abre la opción “Orígenes de datos (ODBC).
91
Se selecciona la pestaña “DSN de sistema” y se pulsa el botón “Agregar”.
Se selecciona “Microsoft Access Drives (*.mdb) y se pulsa el botón “Finalizar”.
92
Se crea el nombre del origen de datos “Estudiantes”.
Se pulsa el botón “Seleccionar” para ubicar la base de datos en la carpeta C:\TG319\3-BASE DE DATOS\Estudiantes.mdb.
Para finalizar y crear el origen de datos “Estudiantes” se pulsa el botón ACEPTAR.
IV.5.3
Compilación y ejecución del código base
Una vez instalado los archivos (clases) en la computadora, se pueden compilar
y ejecutar a través del acceso directo que se crea en el escritorio o de forma manual
como se describe más adelante. Para compilar y ejecutar el código base sin aspectos a
través del acceso directo, se debe hacer clic en el icono “UNSIR V.1.0.1.
(S-ASPECTOS)” que se instala en el escritorio, o a través del grupo de programas
UNSIR V.1.0.1.
93
Cómo compilar las clases en java del código base de forma manual
Para compilar y ejecutar clases del código base (requisitos funcionales) con
Java, primero se debe tener instalado correctamente una versión de Java en la
computadora, en este caso "JDK 1.5.0". Para descargar e instalar Java visitar el sitio
web: http://java.sun.com/ o seguir las instrucciones de la sección 4.2 de este capítulo.
Si se tiene instalado Java, de forma correcta, en la computadora, y se instalaron
los archivos de las clases (*.java) en la carpeta de instalación C:\TG-319\1-CODIGO
BASE-CLASES, se debe hacer lo siguiente:
• Ejecutar el archivo por lotes "1Símbolo del sistema (cmd).bat" que se encuentra en
la carpeta C:\TG-319\1-CODIGO BASE-CLASES, haciendo doble clic sobre él
para salir al símbolo del sistema.
• Para compilar una clase, ejemplo "Password.java" (clase principal), desde el
símbolo del sistema escribir lo siguiente: javac Password.java, respetando
mayúsculas y minúsculas y pulsar la tecla ENTER, al cabo de unos segundos se
crearán los archivos compilados de clases (.class).
• Para ejecutar la clase (clase principal que ejecuta el sistema), desde el símbolo del
sistema escribir lo siguiente: java Password y pulsar la tecla ENTER, al cabo de
unos segundos se inicia la aplicación.
Ingreso de nombre de usuario y contraseña de acceso
Para probar la funcionalidad básica cuando se ejecuta el programa, se muestra un
formulario que indica el ingreso del usuario y su contraseña (se puede ingresar al
sistema con el usuario “123” y la contraseña “123” con nivel administrador). Este
94
usuario y contraseña se puede eliminar o modificar en la parte de “Usuarios” del
menú principal, como se describe en el manual de usuario (ver anexo No. 6).
IV.5.4
Compilación y ejecución del código base y aspecto
Una vez instalado los archivos (clases y aspecto) en la computadora, se pueden
compilar y ejecutar a través del acceso directo que se crea en el escritorio o de forma
manual. Para tejer, compilar y ejecutar clases de Java y el aspecto a través del acceso
directo, se debe hacer clic en el icono “UNSIR V.1.0.1. (C-ASPECTOS)” que se
instala en el escritorio, o a través del grupo de programas UNSIR V.1.0.1.
Cómo tejer y compilar las clases en java y el aspecto de forma manual
Para tejer, compilar y ejecutar clases de Java y el aspecto (requisitos no
funcionales), primero se debe tener instalado correctamente una versión de Java en la
computadora, ejemplo " JDK 1.5.0" y una versión de AspectJ, ejemplo "aspectj1.5".
Para descargar e instalar Java visitar el sitio web: http://java.sun.com/ o seguir
las instrucciones de la sección 4.2 de este capítulo.
Para descargar e instalar AspecJ visitar el sitio web: http://eclipse.org.aspectj/ o
seguir las instrucciones de la sección 4.2 de este capítulo.
Si se tiene instalado Java y AspectJ, de forma correcta, en la computadora, y se
instalaron los archivos de las clases y aspecto (*.java) en las carpetas de instalación
C:\TG-319\1-CODIGO BASE-CLASES y C:\TG-319\ 2-ASPECTOS, hacer lo
siguiente:
95
• Ejecutar el archivo por lotes "1Símbolo del sistema (cmd).bat" que se encuentra en
la carpeta C:\TG-319\ 2-ASPECTOS, haciendo doble clic sobre él para salir al
símbolo del sistema.
• En el símbolo del sistema escribir AspectJ y pulsar la tecla ENTER, al cabo de
unos segundos se abre el browser de AspectJ.
• Para tejer, pulse el botón ACEPTAR del mensaje que advierte que se debe cargar
un archivo “*.lst”. Hacer clic en el icono con el signo "+", para abrir el archivo
.lst, "ArchivoParaTejer.lst", que se ubica en la carpeta C:\TG-319\ 2-ASPECTOS.
• Para tejer y compilar, en el menú "Proyect" hacer clic en la opción "Build" y
esperar unos segundos. Se crearán los archivos compilados de clases (.class).
96
• Para ejecutar la aplicación, pulsar el botón con el icono "Options", seleccionar la
pestaña "AjBrowser Options", y escribir el nombre de la clase principal
"Password" en la línea "Run Options" y pulsar el botón "OK".
• Pulsar el botón con el icono "Run" en el menú principal del browser de AspectJ
para correr la aplicación y ver los cambios que produce el aspecto al código base.
97
IV.5.5
Comparación sistema base con sistema aspectual
De acuerdo a la propiedad de calidad evaluada en este trabajo a través de la
POA, que consistió en la implementación del aspecto “Seguridad” y sus atributos:
Integridad, Disponibilidad y Confidencialidad a la aplicación base, se obtuvieron los
siguientes resultados:
Resultados obtenidos
Clase
ControlPassword
ControlUsuarios
ControlUsuarios
ControlUsuarios
ControlAsignatura
Función básica
Sin aspecto
Con aspecto
Ejecuta el mecanismo de
manejo de excepciones y
Verificar identidad
encriptamiento de datos
para usuario y contraseña
Ejecuta el mecanismo de
manejo de excepciones,
Guarda los datos del
encriptamiento de datos
usuario sin manejo de
para usuario y contraseña y
excepciones,
Registrar usuario
obliga a que sea el usuario
encriptamiento de datos ni
del sistema el que ingresa
mecanismo de operación
los datos a través del
mecanismo de operación
Ejecuta el mecanismo de
manejo de excepciones,
Actualiza los datos del
encriptamiento de datos
usuario sin manejo de
para usuario y contraseña y
Cambiar datos usuario excepciones,
obliga a que sea el usuario
encriptamiento de datos ni
del sistema el que actualiza
mecanismo de operación
los datos a través del
mecanismo de operación
Consulta la lista de usuarios Ejecuta el mecanismo de
Consultar datos usuario del sistema sin mecanismo encriptamiento para la datos
de usuario y contraseña
de encriptamiento
Ejecuta el mecanismo de
Guarda los datos de la
Registrar asignatura
asignatura sin manejo de
manejo de excepciones,
excepciones
para mantener la integridad
Verifica la identidad del
usuario sin manejo de
excepciones y
encriptamiento de datos
98
Resultados obtenidos
Clase
ControlEstudiante
ControlEstudiante
ControlEstudiante
ControlHistorico
ControlHistorico
ControlInscripcion
Función básica
Sin aspecto
Con aspecto
Ejecuta el mecanismo de
manejo de excepciones,
encriptamiento de datos
Guarda los datos del
para el nombre del
estudiante sin manejo de
estudiante y datos
excepciones,
Registrar estudiante
personales confidenciales y
encriptamiento de datos ni
obliga a que sea el usuario
mecanismo de operación
del sistema el que ingresa
los datos a través del
mecanismo de operación
Ejecuta el mecanismo de
manejo de excepciones,
encriptamiento de datos
Actualiza los datos del
para el nombre del
estudiante sin manejo de
estudiante y datos
Cambiar datos
excepciones,
estudiante
personales confidenciales y
encriptamiento de datos ni
obliga a que sea el usuario
mecanismo de operación
del sistema el que actualiza
los datos a través del
mecanismo de operación
Ejecuta el mecanismo de
Consulta los datos
encriptamiento para el
personales del estudiante
Consultar datos
nombre del estudiante y
estudiante
sin mecanismo de
datos personales
encriptamiento
confidenciales
Ejecuta el mecanismo de
Guarda los datos del
manejo de excepciones, y
histórico de notas del
obliga a que sea el usuario
Registrar histórico
estudiante sin manejo de
del sistema el que ingresa
excepciones ni mecanismo
los datos a través del
de operación
mecanismo de operación
Ejecuta el mecanismo de
Actualiza los datos del
manejo de excepciones, y
histórico de notas del
obliga a que sea el usuario
Cambiar datos histórico estudiante sin manejo de
del sistema el que ingresa
excepciones ni mecanismo
los datos a través del
de operación
mecanismo de operación
Guarda los datos de la
Ejecuta el mecanismo de
selección de asignaturas del manejo de excepciones, y
estudiante para la
obliga a que sea el usuario
Seleccionar asignaturas
inscripción sin manejo de
del sistema el que ingresa
excepciones ni mecanismo los datos a través del
mecanismo de operación
de operación
99
Resultados obtenidos
Clase
ControlInscripcion
ControlValidacion
ControlValidacion
ControlValidacion
Función básica
Cambiar selección
Sin aspecto
Cambia y actualiza los
datos de la selección de
asignaturas del estudiante
para la inscripción sin
manejo de excepciones ni
mecanismo de operación
Registrar inscripción
Guarda los datos de la
inscripción del estudiante
sin manejo de excepciones
ni mecanismo de operación
Validar inscripción
Valida y guarda los datos
de la inscripción del
estudiante sin manejo de
excepciones ni mecanismo
de operación
Cambiar validación
Cambia la validación y
actualiza los datos de la
inscripción del estudiante
sin manejo de excepciones
ni mecanismo de operación
Ventajas de la POA
Elimina el efecto de código disperso y enmarañado.
Incrementa la calidad del software produciendo código:
• Mejor Modularizado
• Más fácil de entender
• Más fácil de mantener
• Más reutilizable
• En teoría más barato de producir
Con aspecto
Ejecuta el mecanismo de
manejo de excepciones, y
obliga a que sea el usuario
del sistema el que ingresa
los datos a través del
mecanismo de operación
Ejecuta el mecanismo de
manejo de excepciones, y
obliga a que sea el usuario
del sistema el que ingresa
los datos a través del
mecanismo de operación
Ejecuta el mecanismo de
manejo de excepciones, y
obliga a que sea el usuario
del sistema el que ingresa
los datos a través del
mecanismo de operación
Ejecuta el mecanismo de
manejo de excepciones, y
obliga a que sea el usuario
del sistema el que ingresa
los datos a través del
mecanismo de operación
100
IV.6.
Documentación
La documentación del sistema está formada por los listados con el código
fuente de las clases que conforman el sistema base así como el listado del código
fuente del aspecto, esto con la finalidad de interpretar las líneas de código y tener una
idea del diseño del mismo para posteriores modificaciones o detección de errores.
Ver anexos No. 4 y 5.
El manual del usuario presenta una descripción detallada del funcionamiento
del sistema base, comenzando por la compatibilidad del programa, hardware
necesario para su funcionamiento e instalación del mismo. Describe los pasos a
seguir para cargar los datos a las tablas que conforman el sistema, registrar los datos
de los usuarios y estudiantes, realizar los procesos de selección de asignaturas,
registro y validación de inscripción, documentando en forma detallada el
funcionamiento del menú de opciones y de las pantallas de entrada y edición de
datos. Ver anexo No. 6
101
CONCLUSIONES
• La POA, es una realidad a través de la herramienta AspectJ. Esto implica una gran
ventaja. Si el programador ya sabe programar en Java, prácticamente ya está
programando en AspectJ: es una extensión de Java.
• El Sistema Base o nivel de aplicación se mantiene intacto aún después de la
implementación de los aspectos, permitiendo “conectarse” o “desconectarse”
(plug-in, plug-out) a la funcionalidad básica.
• Es posible reducir el trabajo de mantenibilidad de las aplicaciones Orientadas a
Objeto a través del uso de aspectos.
• Es posible implementar requisitos no funcionales a través de la POA.
• El DSOA es actualmente un campo abierto, donde se están realizando las primeras
experiencias prácticas para mostrar su aplicabilidad, se podría decir que se
encuentra en el mismo lugar del Desarrollo de Software Orientado a Objeto hace
quince años.
102
RECOMENDACIONES
• Formar grupos de investigación para lograr la divulgación y avance de esta nueva
tecnología.
• Desarrollar proyectos de investigación a través de la POA.
• Evolucionar hacia la definición de un proceso de ingeniería de requisitos, diseño
arquitectónico e implementación orientada a aspectos centrado en la calidad del
software.
• Establecer alianzas o sistemas de cooperación entre Centros de Investigación y
Universidades del país y del exterior para el desarrollo y aplicación de tecnologías
de software.
103
GLOSARIO
Acceso: Con respecto a la privacidad, es la habilidad de un individuo para ver,
modificar y refutar lo completa y precisa que pueda ser la información personal
identificable (PII) reunida sobre él o ella. Acceso es un elemento de las Prácticas
Honestas de Información.
Advice: Un advice es el comportamiento ha ser ejecutado en un joint point que ha
sido seleccionado. Un advice ayuda a definir “qué hacer”, es un mecanismo muy
similar a un método, usado para declarar el código que debe ejecutarse en cada joint
point que es capturado por el pointcut.
Análisis y diseño de sistemas: Proceso de examinar una situación dada de una
empresa con la intención de mejorarlo mediante nuevos procedimientos. En la fase de
análisis, se recopila e interpreta, se diagnóstica problemas y se utilizan estos hechos a
fin de mejorar el sistema. En la fase de diseño se planea la forma del nuevo sistema
para remplazar o completar el existente.
Aspecto: Un aspecto se define como una unidad modular diseñada para implementar
un concern, pueden contener en su definición código y las correspondientes
instrucciones de donde y cuando invocarlo.
Base de datos: Colección de datos agrupados debido a la semejanza que pueda
existir entre ellos. Una base de datos está compuesta por muchas tablas.
Cifrado: Es un método de encriptación, que utiliza típicamente una clave predefinida
y un algoritmo para transformar texto simple en texto cifrado
104
Concern (Incumbencia): Se define como una propiedad o punto de interés de un
sistema. La IEEE define los concerns para un sistema como aquellos intereses que
pertenecen al desarrollo del sistema y su operación, o demás aspectos que son
críticos; o importantes para uno o varios stakeholders. Los concerns incluyen
consideraciones asociadas a requisitos No funcionales o propiedades de calidad tales
como: performance, confiabilidad, seguridad, distribución entre otros.
Confidencialidad: La habilidad para mantener en reserva la información.
Contraseña: Es una cadena de caracteres que el usuario escribe para verificar su
identidad en una red o en una PC local.
Crosscutting Concerns (Incumbencias Transversales): son aquellas propiedades
que se reparten a lo largo de todo el código de una aplicación, son conceptos que no
pueden encapsularse dentro de una unidad funcional, debido a que atraviesan todo el
sistema.
Datos: Es un hecho aislado que está situado en un contexto significativo mediante
una o varias operaciones de procesamiento. Es parte fundamental de la información.
Disponibilidad: la predisposición para obtener y/o proveer un servicio correcto.
Información: Es el procesamiento de los datos, que puede proporcionar un
conocimiento o bien el entendimiento de ciertos factores.
Integridad: la ausencia de alteraciones inadecuadas del sistema
105
Joint point: Es cualquier punto de ejecución identificable en un sistema, la llamada a
un método es un joint point y la ejecución de un método también lo es; una
asignación a una variable, la construcción de un objeto, una comparación, un
manejador de excepciones entre otros, son ejemplos que permiten identificar tal
concepto.
Pointcut: Un pointcut o punto de corte es un conjunto de joint points; también se
definen como una estructura diseñada para identificar y seleccionar los join points.
Proceso: Actividad que se ejecuta con el fin de obtener un fin específico. Cadena de
procedimientos que deben realizarse de manera lógica y ordenada para conseguir una
respuesta.
Requisito: Es una propiedad que un sistema debe tener para satisfacer al (los) usuario
(s) del mismo.
Requisitos Funcionales: Son los servicios que debe ofrecer el sistema.
Requisitos No Funcionales: A la calidad con la cual los servicios deben
ser
ofrecidos o a restricciones de como ellos deben ser proporcionados.
Seguridad computacional: Es la disciplina, técnicas y herramientas diseñadas para
ayudar a proteger la confidencialidad, integridad y disponibilidad de información y
sistemas.
Sistema: Conjunto de componentes que interactúan entre sí para alcanzar un objetivo
determinado.
106
Sistema automatizado: Sistema basado en el uso de máquinas o computadoras que
contemplen la realización de ciertos procesos de manera automática.
Sistema de información: Es aquel que designa el movimiento de datos o
información entre los diferentes componentes de un sistema.
107
BIBLIOGRAFÍA
[1]
CABRERA, Erubí (1988). La Tesis Paso a Paso. Primera Edición, 1988.
Caracas. Edit. Dolvia.
[2]
CALDERA, Rafael, Castillo I., Losavio F. y Matteo A. (2006). Modelación
de Requisitos, Aspectos y Calidad de Software. XXXII Conferencia
Latinoamericana de Informática, CLEI 2006. Chile.
[3]
CASTILLO, Isi, Caldera R., Losavio F. y Matteo A. (2006). Caracterización
de Sistemas Fiables basada en un modelo estándar de calidad. XXXII
Conferencia Latinoamericana de Informática, CLEI 2006. Chile.
[4]
DEITEL Harvey M. y Paul J. Deitel (2004). Cómo Programar en Java.
Quinta Edición, 2004. México. Edit. Pearson-Prentice Hall.
[5]
FUENTES Lidia, Ana Moreira y Juan Manuel Murillo (2004). Avances en
Desarrollo de Software Orientado a Aspectos. Actas del Segundo Taller de
Desarrollo de Software Orientado a Aspectos. Escuela Politécnica Universidad
de Extremadura. España.
[6]
FUENTES Lidia, Juan Hernández y Ana Moreira (2003). Desarrollo de
Software Orientado a Aspectos. Actas del Taller de Trabajo en Desarrollo de
Software Orientado a Aspectos. Escuela Politécnica Universidad de
Extremadura. España.
[7]
KENDALL Kenneth E. y Julie E. Kendall (2005). Análisis y Diseño de
Sistemas. Sexta Edición, 2005. México. Edit. Pearson-Prentice Hall.
108
[8]
KICZALES G., J. Lamping, A. Mendhekar, C. Maeda, C. Lopes, J.
Loingtier and J.Irwin (1997). Aspect-Oriented Programming. Xerox Palo Alto
Research Center. USA.
[9]
SCHILT Herbert (2000). C++ Guía de Autoenseñanza. Primera Edición,
2000. México. Edit. MacGraw-Hill.
[10] SCHILT Herbert y James Holmes (2004). El Arte de Programar en Java.
Primera Edición, 2004. México. Edit. MacGraw-Hill.
[11] PÉREZ Jennifer, Tour H. Ali, Isidro Ramos y José A. Carsí (2003).
PRISMA: Arquitectura de
Software Orientado a Aspectos y Basada en
Componentes. Actas del Taller de trabajo en Desarrollo de Software Orientado
a Aspectos. Escuela Politécnica Universidad de Extremadura. España.
[12] QUINTERO, Antonia (2000). Visión General de la Programación Orientada a
Aspectos. Departamento de Lenguajes y Sistemas Informáticos, Universidad de
Sevilla. España.
[13] UNA, (2002). Manual de Proyecto de Grado. Tercera reimpresión, 2002.
Caracas.
[14] UNA, (1992). Técnicas de Documentación e Investigación I. Primera edición,
1992. Caracas.
[15] Early Aspect Home Page. [on line]. Disponible en: http://www.earlyaspects.net
109
[16] Eclipse Home Page. [on line]. Disponible en: http://eclipse.org/aspectj/
[17] Grupo Aspect-Oriented Software Special Engineering Home Page.
[on line]. Disponible en: http://www.comp.lancs.ac.uk/computing/aop/
[18] Grupo Demeter Home Page. [on line]. Disponible en:
http://www.ccs.neu.edu/home/lieber/demeter.html
[19] Grupo Evolution Home page. [on line]. Disponible en:
http://www.cse.ucsd.edu/users/wgg/swevolution.html
[20] Grupo de Investigación de Ingeniería de Software Universidad British
Columbia Home Page. [on line]. Disponible en: http://www.cs.ubc.ca/labs/se
[21] Grupo Quercus Home Page. [on line]. Disponible en:
http://quercusseg.unex.es
[22] Grupo TecComm Home Page. [on line]. Disponible en:
http://www.teccomm.les.inf.puc-rio.br/SoCagents/index.htm
[23] Grupo TRESE. Departamento Ciencias de la Computación Universidad
TWENTE. [on line]. Disponible en:
http://trese.cs.utwente.nl/oldhtml/homepage_body.htm
110
[24] Java Download Center. [on line]. Disponible en:
http://www.java.com/es/download/
[25] Java Home Page. [on line]. Disponible en: http://java.sun.com/
[26] KICILLOF, Nicolás (2006). Programación Orientada a Aspectos (AOP).
[on line]. Disponible en:
http://www.microsoft.com/spanish/msdn/comunidad/mtj.net/voices/art152.asp
[27] TANTER, Eric. Más allá de la Orientación al Objeto, Reflexión,
Metaprogramación y Programación por Aspectos. [on line]. Disponible en:
http://www.dcc.uchile.cl/~etanter/courses/tanter-jcc02.pdf
[28] Xerox
PARC,
USA
Home
Page.
[on
line].
Disponible
en:
http://www.parc.xerox.com/
[29] SOMMERVILLE I. y Sawyer, P. Requirements Engineering. A Good
Practice Guide. John Wiley and Sons, New Cork, 1997.
[30] LORENTE L. Mariano, Fernando Asteasuain y Bernardo Ezequiel
Contreras. Programemos en AspectJ. 2005.
[31] MÁRQUEZ, José M. Ingeniería del software. 2005. Universidad de Valladolid
[on line]. Disponible en: http://www.infor.uva.es/
111
[32] WIKIPEDIA. Enciclopedia. [on line]. Disponible en: http://es.wikipedia.org/
[33] REINA A. Visión General de la Programación Orientada a Aspectos. Informe
Interno Nº 2000-11. Departamento de Lenguajes y Sistemas Informática,
Universidad de Sevilla. 2000.
[34] LADDAD R. AspectJ IN ACTION. Practical Aspect-Oriented Programming.
Manning Publications. 2003.
[35] Workshop on Multi-Dimensional Separation of Concerns. International
Conference on Software Engineering, ICSE 2000 [on line]. Disponible en:
www.research.ibm.com/hyperspace/workshops/icse2000
[36] AspectJ Home Page [on line]. Disponible en: www.aspectj.org
[37] GAMAROD [on line]. Disponible en: www.gamarod.com.ar
[38] Tecnologías
Java
Open
oness.sourceforge.net/proyecto
Source
[on
line].
Disponible
en:
112
ANEXOS
1. Modelos de casos de uso.
2. Diagrama de secuencias.
3. Diagrama de actividades.
4. Documentación del código base (clases).
5. Documentación del aspecto.
6. Manual del usuario del sistema.
ANEXO 1
MODELOS DE CASOS DE USO
Diagrama registro de asignaturas
<<Incluir>>
Verificar
identidad
<<Incluir>>
Registrar
asignatura
Cambiar datos
asignatura
Administrador
<<Incluir>>
Eliminar
asignatura
Diagrama registro de pensum
<<Incluir>>
Verificar
identidad
<<Incluir>>
Registrar
pensum
Cambiar datos
pensum
Administrador
<<Incluir>>
Eliminar datos
pensum
Diagrama registro de estudiante
<<Incluir>>
Verificar
identidad
<<Incluir>>
Registrar
estudiante
Cambiar datos
estudiante
Administrador
<<Incluir>>
Eliminar
estudiante
<<Incluir>>
Consultar datos
estudiante
Estudiante
Diagrama registro de histórico
Registrar
histórico
<<Incluir>>
Verificar
identidad
<<Incluir>>
Cambiar datos
histórico
Administrador
<<Incluir>>
Eliminar
histórico
<<Incluir>>
Consultar
histórico
Estudiante
Diagrama selección de asignaturas
Estudiante
Verificar
identidad
<<Incluir>>
<<Incluir>>
Seleccionar
asignaturas
Cambiar
selección
Administrador
<<Incluir>>
Eliminar
selección
Diagrama registro de inscripción
<<Incluir>>
Verificar
identidad
<<Incluir>>
Validar
inscripción
Cambiar
validación
Administrador
<<Incluir>>
Eliminar
validación
<<Incluir>>
Registrar
inscripción
Estudiante
Diagrama registro de usuario
<<Incluir>>
Verificar
identidad
<<Incluir>>
Registrar
usuario
Cambiar datos
usuario
Administrador
<<Incluir>>
Eliminar
usuario
<<Incluir>>
Consultar datos
usuario
Escenarios de casos de uso
Nombre del caso de uso: Verificar identidad
Clase: ControlPassword
Área: Sistema del administrador y estudiante
Actor(es): Administrador y Estudiante
Descripción: Permite al administrador y al estudiante ingresar al sistema
Activar evento: El administrador o estudiante introducen el nombre de usuario y
contraseña y pulsan el botón Aceptar
Pasos desempeñados
Información para los pasos
1. El administrador o estudiante se
conectan al servicio que activa el sistema
Nombre de usuario y contraseña
2. Se lee y verifica el usuario y contraseña
Usuario y contraseña
3. Si el usuario es nivel administrador se
despliega el menú principal con todas las
opciones del sistema
Interfaz Menú del administrador
4. Si el usuario es nivel estudiante se
despliega el menú principal
Interfaz Menú del estudiante
Nombre del caso de uso: Registrar asignatura
Clase: ControlAsignatura
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador registrar los datos de una asignatura
Activar evento: El administrador selecciona la opción Asignaturas del menú e ingresa
los datos como: código de la asignatura, nombre de la asignatura y número de créditos
Pasos desempeñados
Información para los pasos
1. El administrador ingresa los datos de la
asignatura y pulsa el botón Aceptar
Código asignatura, nombre asignatura y
número de créditos
2. Se leen y registran los datos de la
asignatura en la base de datos
Registro de la asignatura
Nombre del caso de uso: Cambiar datos asignatura
Clase: ControlAsignatura
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador cambiar los datos de una asignatura
Activar evento: El administrador selecciona la opción Asignaturas del menú y elige una
asignatura del listado para realizar los cambios
Pasos desempeñados
Información para los pasos
1. El administrador cambia los datos de la
asignatura y pulsa el botón Aceptar
Código asignatura, nombre asignatura y
número de créditos
2. Se leen y actualizan los datos de la
asignatura en la base de datos
Registro de la asignatura
Nombre del caso de uso: Eliminar asignatura
Clase: ControlAsignatura
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador eliminar una asignatura
Activar evento: El administrador selecciona la opción Asignaturas del menú y elige una
asignatura del listado para eliminarla
Pasos desempeñados
Información para los pasos
1. El administrador elige una asignatura y
pulsa el botón Eliminar
Registro de la asignatura
2. Se elimina la asignatura de la base de
datos
Registro de la asignatura
Nombre del caso de uso: Registrar pensum
Clase: ControlPensum
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador registrar los datos de la matriz curricular
Activar evento: El administrador selecciona la opción Pensum del menú e ingresa los
datos como: código de la carrera, código de la asignatura, semestre y prerrequisitos
Pasos desempeñados
Información para los pasos
1. El administrador ingresa los datos de la
matriz curricular y pulsa el botón Aceptar
Código de la carrera, ccódigo asignatura,
semestre y prerrequisitos.
2. Se leen y registran los datos de la matriz
curricular en la base de datos
Registro de la matriz curricular
Nombre del caso de uso: Cambiar datos pensum
Clase: ControlPensum
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador cambiar los datos de matriz curricular
Activar evento: El administrador selecciona la opción Pensum del menú y elige un
registro del listado para realizar los cambios
Pasos desempeñados
Información para los pasos
1. El administrador cambia los datos de la
matriz curricular y pulsa el botón Aceptar
Código carrera, código asignatura,
semestre y prerrequisitos
2. Se leen y actualizan los datos de la
matriz curricular en la base de datos
Registro de la matriz curricular
Nombre del caso de uso: Eliminar pensum
Clase: ControlPensum
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador eliminar una asignatura de la matriz curricular
Activar evento: El administrador selecciona la opción Pensum del menú y elige un
registro del listado para eliminarlo
Pasos desempeñados
Información para los pasos
1. El administrador elige una asignatura de
matriz curricular y pulsa el botón Eliminar
Registro de la matriz curricular
2. Se elimina la asignatura de la matriz
curricular en la base de datos
Registro de la matriz curricular
Nombre del caso de uso: Registrar estudiante
Clase: ControlEstudiantes
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador registrar los datos del estudiante
Activar evento: El administrador selecciona la opción Estudiantes del menú e ingresa
los datos como: número de cédula, nombres y apellidos, dirección, carrera, teléfono,
correo electrónico y centro local
Pasos desempeñados
Información para los pasos
1. El administrador ingresa los datos del
estudiante y pulsa el botón Aceptar
Número de cédula, nombres y apellidos,
dirección, carrera, teléfono, correo
electrónico y centro local
2. Se leen y registran los datos del
estudiante en la base de datos
Registro del estudiante
Nombre del caso de uso: Cambiar datos estudiante
Clase: ControlEstudiantes
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador cambiar los datos del estudiante
Activar evento: El administrador selecciona la opción Estudiantes del menú e ingresa el
número de cédula del estudiante para realizar los cambios
Pasos desempeñados
Información para los pasos
1. El administrador cambia los datos del
estudiante y pulsa el botón Aceptar
Número de cédula, nombres y apellidos,
dirección, carrera, teléfono, correo
electrónico y centro local
2. Se leen y actualizan los datos del
estudiante en la base de datos
Registro de estudiantes
Nombre del caso de uso: Eliminar estudiante
Clase: ControlEstudiantes
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador eliminar un estudiante
Activar evento: El administrador selecciona la opción Estudiantes del menú e ingresa el
número de cédula del estudiante para eliminar los datos
Pasos desempeñados
Información para los pasos
1. El administrador visualiza los datos del
estudiante y pulsa el botón Eliminar
Registro de estudiantes
2. Se elimina el estudiante, el histórico, la
selección de asignaturas, la validación y
registro de inscripción y el usuario de la
base de datos
Registro de estudiantes
Nombre del caso de uso: Consultar datos estudiante Clase: ControlEstudiantes
Área: Sistema del administrador y estudiante
Actor(es): Administrador o Estudiante
Descripción: Permite al administrador o al estudiante consultar los datos personales
Activar evento: El administrador selecciona la opción Estudiantes del menú y elige
consultar estudiantes para visualizar los datos. El estudiante selecciona la opción
Consultar Datos Personales del menú para visualizar los datos
Pasos desempeñados
Información para los pasos
1. El administrador o estudiante selecciona
la opción para consultar los datos
Registro de estudiantes
2. El administrador o estudiante visualiza
los datos personales por pantalla y pulsa el
botón Aceptar
Registro de estudiantes
Nombre del caso de uso: Registrar histórico
Área: Sistema del administrador
Actor(es): Administrador
Clase: ControlHistorico
Descripción: Permite al administrador registrar los datos del histórico de notas del
estudiante
Activar evento: El administrador selecciona la opción Histórico del menú e ingresa el
número de cédula del estudiante para vaciar los datos como: código asignatura,
calificación y lapso
Pasos desempeñados
Información para los pasos
1. El administrador ingresa los datos del
histórico de notas del estudiante y pulsa el
botón Aceptar
Código asignatura, calificación y lapso
2. Se leen y registran los datos del
histórico de notas del estudiante en la base
de datos
Registro del histórico
Nombre del caso de uso: Cambiar datos histórico
Área: Sistema del administrador
Actor(es): Administrador
Clase: ControlHistorico
Descripción: Permite al administrador cambiar los datos del histórico de notas del
estudiante
Activar evento: El administrador selecciona Histórico del menú e ingresa el número de
cédula del estudiante para realizar los cambios
Pasos desempeñados
Información para los pasos
1. El administrador cambia los datos del
histórico de notas del estudiante y pulsa el
botón Aceptar
2. Se leen y actualizan los datos del
histórico de notas del estudiante en la base
de datos
Nombre del caso de uso: Eliminar histórico
Área: Sistema del administrador
Actor(es): Administrador
Código asignatura, calificación y lapso
Registro del histórico
Clase: ControlHistorico
Descripción: Permite al administrador eliminar una asignatura del histórico de notas del
estudiante
Activar evento: El administrador selecciona la opción Histórico del menú e ingresa el
número de cédula del estudiante para eliminar los datos
Pasos desempeñados
Información para los pasos
1. El administrador visualiza los datos del
histórico de notas del estudiante,
selecciona una asignatura y pulsa el botón
Eliminar
Registro del histórico
2. Se elimina la asignatura del histórico de
notas el estudiante de la base de datos
Registro del histórico
Nombre del caso de uso: Consultar datos histórico
Área: Sistema del administrador y estudiante
Actor(es): Administrador o Estudiante
Clase: ControlHistorico
Descripción: Permite al administrador o al estudiante consultar los datos del histórico de
notas del estudiante
Activar evento: El administrador selecciona la opción Histórico del menú e ingresa el
número de cédula del estudiante para visualizar los datos. El estudiante selecciona la
opción Consultar Histórico del menú para visualizar los datos
Pasos desempeñados
Información para los pasos
1. El administrador o estudiante selecciona
la opción para consultar los datos
Registro del histórico
2. El administrador o estudiante visualiza
los datos del histórico de notas del
estudiante por pantalla y pulsa el botón
Aceptar
Registro del histórico
Nombre del caso de uso: Seleccionar asignaturas
Área: Sistema del administrador y estudiante
Actor(es): Administrador o Estudiante
Clase: ControlInscripción
Descripción: Permite al administrador o al estudiante hacer la selección de asignaturas
para la inscripción
Activar evento: El administrador selecciona la opción Seleccionar Asignaturas del
menú e ingresa el número de cédula del estudiante para elegir las asignaturas a inscribir.
El estudiante selecciona la opción Seleccionar Asignaturas del menú para elegir las
asignaturas a inscribir.
Pasos desempeñados
Información para los pasos
1. El administrador o el estudiante
selecciona las asignaturas a inscribir de un
listado y pulsa el botón Guardar
Selección de las asignaturas: código,
nombre, semestre, número de créditos
2. Se lee y registra la selección de
asignaturas del estudiante en la base de
datos
Registro de la selección de asignaturas
Nombre del caso de uso: Cambiar selección
Área: Sistema del administrador
Actor(es): Administrador
Clase: ControlInscripción
Descripción: Permite al administrador cambiar la selección de asignaturas del estudiante
para la inscripción
Activar evento: El administrador selecciona la opción Seleccionar Asignaturas del
menú e ingresa el número de cédula del estudiante para cambiar la selección de las
asignaturas a inscribir
Pasos desempeñados
Información para los pasos
1. El administrador cambia la selección de
asignaturas del estudiante y pulsa el botón
Guardar
2. Se lee y actualiza la selección de
asignaturas del estudiante en la base de
datos
Nombre del caso de uso: Eliminar selección
Área: Sistema del administrador
Actor(es): Administrador
Selección de las asignaturas: código,
nombre, semestre, número de créditos
Registro de la selección de asignaturas
Clase: ControlInscripción
Descripción: Permite al administrador eliminar una asignatura de la selección de
asignaturas del estudiante para la inscripción
Activar evento: El administrador selecciona la opción Seleccionar Asignaturas del
menú e ingresa el número de cédula del estudiante para eliminar los datos
Pasos desempeñados
Información para los pasos
1. El administrador visualiza la selección
de asignaturas del estudiante, selecciona
una asignatura y pulsa el botón Eliminar
Registro de la selección de asignaturas
2. Se elimina la asignatura de la selección
de asignaturas del estudiante de la base de
datos
Registro de la selección de asignaturas
Nombre del caso de uso: Validar inscripción
Área: Sistema del administrador
Actor(es): Administrador
Clase: ControlValidaciones
Descripción: Permite al administrador validar el registro de inscripción del estudiante
Activar evento: El administrador selecciona la opción Registrar Inscripción del menú e
ingresa el número de cédula del estudiante para validar el registro de inscripción
Pasos desempeñados
Información para los pasos
1. El administrador valida el registro de
inscripción del estudiante y pulsa el botón
Guardar
Número del depósito bancario por
concepto de arancel, entidad bancaria,
fecha del depósito, monto
2. Se leen y registran los datos el registro
de inscripción del estudiante en la base de
datos
Registro de inscripción
Nombre del caso de uso: Cambiar validación
Área: Sistema del administrador
Actor(es): Administrador
Clase: ControlValidaciones
Descripción: Permite al administrador cambiar la validación y los datos del registro de
inscripción del estudiante
Activar evento: El administrador selecciona Registrar Inscripción del menú e ingresa el
número de cédula del estudiante para realizar los cambios
Pasos desempeñados
Información para los pasos
1. El administrador cambia la validación y
los datos del registro de inscripción del
estudiante y pulsa el botón Guardar
Número del depósito bancario por
concepto de arancel, entidad bancaria,
fecha del depósito, monto
2. Se leen y actualizan los datos de la
validación y los datos del registro de
inscripción del estudiante en la base de
datos
Registro de inscripción
Nombre del caso de uso: Eliminar validación
Área: Sistema del administrador
Actor(es): Administrador
Clase: ControlValidaciones
Descripción: Permite al administrador eliminar la validación y los datos del registro de
inscripción del estudiante
Activar evento: El administrador selecciona la opción Registrar Inscripción del menú e
ingresa el número de cédula del estudiante para eliminar los datos
Pasos desempeñados
Información para los pasos
1. El administrador visualiza la validación
y los datos del registro de inscripción del
estudiante y pulsa el botón Eliminar
Registro de inscripción
2. Se elimina la validación y el registro de
inscripción del estudiante de la base de
datos
Registro de inscripción
Nombre del caso de uso: Registrar inscripción
Área: Sistema del administrador y estudiante
Actor(es): Administrador o Estudiante
Clase: ControlValidaciones
Descripción: Permite al administrador o al estudiante hacer el registro de la inscripción
Activar evento: El administrador selecciona la opción Registrar Inscripción del menú e
ingresa el número de cédula del estudiante para registrar la inscripción. El estudiante
selecciona la opción Registrar Inscripción del menú para registrar la inscripción
Pasos desempeñados
Información para los pasos
1. El administrador o el estudiante hace el
registro de inscripción y pulsa el botón
Guardar
Número del depósito bancario por
concepto de arancel, entidad bancaria,
fecha del depósito, monto
2. Se leen y registran los datos del registro
de inscripción del estudiante en la base de
datos
Registro de inscripción
Nombre del caso de uso: Registrar usuario
Clase: ControlUsuarios
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador registrar los datos del usuario
Activar evento: El administrador selecciona la opción Usuarios del menú e ingresa los
datos como: usuario, nombres y apellidos, número de cédula, contraseña y nivel de
acceso
Pasos desempeñados
Información para los pasos
1. El administrador ingresa los datos del
usuario y pulsa el botón Aceptar
Usuario, nombres y apellidos, número de
cédula, contraseña y nivel de acceso
2. Se leen y registran los datos del usuario
en la base de datos
Registro del usuario
Nombre del caso de uso: Cambiar datos usuario
Clase: ControlUsuarios
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador cambiar los datos del usuario
Activar evento: El administrador selecciona la opción Usuarios del menú e ingresa el
número de cédula del usuario para realizar los cambios
Pasos desempeñados
Información para los pasos
1. El administrador cambia los datos del
usuario y pulsa el botón Aceptar
Usuario, nombres y apellidos, número de
cédula, contraseña y nivel de acceso
2. Se leen y actualizan los datos del usuario
Registro del usuario
en la base de datos
Nombre del caso de uso: Eliminar usuario
Clase: ControlUsuarios
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador eliminar un usuario
Activar evento: El administrador selecciona la opción Usuarios del menú e ingresa el
número de cédula del usuario para eliminar los datos
Pasos desempeñados
Información para los pasos
1. El administrador visualiza los datos del
usuario y pulsa el botón Eliminar
Registro del usuario
2. Se elimina el usuario de la base de datos
Registro del usuario
Nombre del caso de uso: Consultar datos usuario
Clase: ControlUsuarios
Área: Sistema del administrador
Actor(es): Administrador
Descripción: Permite al administrador consultar los datos del usuario
Activar evento: El administrador selecciona la opción Usuarios del menú y elige
consultar usuarios para visualizar los datos.
Pasos desempeñados
Información para los pasos
1. El administrador selecciona la opción
para consultar los datos
Registro del usuario
2. El administrador visualiza los datos del
usuario por pantalla y pulsa el botón
Aceptar
Registro del usuario
ANEXO 2
DIAGRAMA DE SECUENCIAS
Diagrama verificar identidad (2)
::Password
::ControlPassword
::MenuEstudiante
::ConexionODBC
Estudiante
Password()
ConexionODBC()
Devuelve la conexión
con el origen de datos
VerificarDatos()
Diagrama registrar asignatura
::MenuAdministrad
::Asignaturas
::ControlAsignaturas
::ConexionODBC
Administrador
RegistrarAsignaturas()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
GuardarDatos()
Diagrama cambiar datos asignatura
::MenuAdministrad
::Asignaturas
::ControlAsignaturas
::ConexionODBC
Administrador
RegistrarAsignaturas()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
ActualizarDatos()
Diagrama eliminar asignatura
::MenuAdministrad
::Asignaturas
::ControlAsignaturas
::ConexionODBC
Administrador
RegistrarAsignaturas()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
EliminarDatos()
Diagrama registrar pensum
::MenuAdministrad
::ControlPensum
::Pensum
::ConexionODBC
Administrador
RegistrarPensum()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
GuardarDatos()
Diagrama cambiar datos pensum
::MenuAdministrad
::Pensum
::ControlPensum
::ConexionODBC
Administrador
RegistrarPensum ()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
ActualizarDatos()
Diagrama eliminar pensum
::MenuAdministrad
::Pensum
::ControlPensum
::ConexionODBC
Administrador
RegistrarPensum ()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
EliminarDatos()
Diagrama registrar estudiante
::MenuAdministrad
::Estudiantes
::ControlEstudiantes
::ConexionODBC
Administrador
RegistrarEstudiante()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
GuardarDatos()
Diagrama cambiar datos estudiante
::MenuAdministrad
::Estudiantes
::ControlEstudiantes
::ConexionODBC
Administrador
CambiarEstudiante()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
ActualizarDatos()
Diagrama eliminar estudiante
::MenuAdministrad
::Estudiantes
::ControlEstudiantes
::ConexionODBC
Administrador
EliminarEstudiante()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
EliminarDatos()
Diagrama consultar datos estudiante (1)
::MenuAdministrad
::Estudiantes
::ControlEstudiantes
::ConexionODBC
Administrador
ConsultarEstudiante()
MostrarTabla()
ConexionODBC()
Devuelve la conexión
con el origen de datos
MostrarTabla()
Diagrama consultar datos estudiante (2)
::MenuEstudiante
::Estudiantes
::ControlEstudiantes
::ConexionODBC
Estudiante
DatosPersonales()
Estudiantes()
ConexionODBC()
Devuelve la conexión
con el origen de datos
Estudiantes()
Diagrama registrar histórico
::MenuAdministrad
::Historico
::ControlHistorico
::ConexionODBC
Administrador
HistoricoCalificacio()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
GuardarDatos()
Diagrama cambiar datos histórico
::MenuAdministrad
::Historico
::ControlHistorico
::ConexionODBC
Administrador
HistoricoCalificacio()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
ActualizarDatos()
Diagrama eliminar histórico
::MenuAdministrad
::ControlHistorico
::Historico
::ConexionODBC
Administrador
HistoricoCalificacio()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
EliminarDatos()
Diagrama consultar datos histórico (1)
::MenuAdministrad
::ControlHistorico
::Historico
::ConexionODBC
Administrador
ConsultarHistorico()
Historico()
ConexionODBC()
Devuelve la conexión
con el origen de datos
Historico()
Diagrama consultar datos histórico (2)
::MenuEstudiante
::ControlHistorico
::Historico
::ConexionODBC
Estudiante
ConsultarHistorico()
Historico()
ConexionODBC()
Devuelve la conexión
con el origen de datos
Historico()
Diagrama seleccionar asignaturas (1)
::MenuAdministrad
::Inscripciones
::ControlInscripcion
::ConexionODBC
Administrador
SeleccionarAsig()
Inscripciones()
ConexionODBC()
Devuelve oferta de
asignaturas
Devuelve la conexión
con el origen de datos
IniciarVariables()
VerificarDatos()
GuardarDatos()
Diagrama seleccionar asignaturas (2)
::MenuEstudiante
::Inscripciones
::ControlInscripcion
::ConexionODBC
Estudiante
SeleccionarAsig()
Inscripciones()
ConexionODBC()
Devuelve oferta de
asignaturas
Devuelve la conexión
con el origen de datos
IniciarVariables()
VerificarDatos()
GuardarDatos()
Diagrama cambiar selección
::MenuAdministrad
::Inscripciones
::ControlInscripcion
::ConexionODBC
Administrador
SeleccionarAsig()
Inscripciones()
ConexionODBC()
Devuelve selección de
asignaturas
Devuelve la conexión
con el origen de datos
IniciarVariables()
VerificarDatos()
ActualizarDatos()
Diagrama eliminar selección
::MenuAdministrad
::Inscripciones
::ControlInscripcion
::ConexionODBC
Administrador
SeleccionarAsig()
Inscripciones()
ConexionODBC()
Devuelve selección de
asignaturas
Devuelve la conexión
con el origen de datos
IniciarVariables()
VerificarDatos()
EliminarDatos()
Diagrama validar inscripción
::MenuAdministrad
::Validaciones
::ControlValidacion
::ConexionODBC
Administrador
RegistrarInscripc()
Validaciones()
ConexionODBC()
Devuelve el registro
de inscripción
Devuelve la conexión
con el origen de datos
IniciarVariables()
VerificarDatos()
GuardarDatos()
Diagrama cambiar validación
::MenuAdministrad
::Validaciones
::ControlValidacion
::ConexionODBC
Administrador
RegistrarInscripc()
Validaciones()
ConexionODBC()
Devuelve el registro
de inscripción
Devuelve la conexión
con el origen de datos
IniciarVariables()
VerificarDatos()
ActualizarDatos()
Diagrama eliminar validación
::MenuAdministrad
::Validaciones
::ControlValidacion
::ConexionODBC
Administrador
RegistrarInscripc()
Validaciones()
ConexionODBC()
Devuelve el registro
de inscripción
Devuelve la conexión
con el origen de datos
IniciarVariables()
VerificarDatos()
EliminarDatos()
Diagrama registrar inscripción (1)
::MenuAdministrad
::Validaciones
::ControlValidacion
::ConexionODBC
Administrador
RegistrarInscripc()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
GuadarDatos()
Diagrama registrar inscripción (2)
::MenuEstudiante
::Validaciones
::ControlValidacion
::ConexionODBC
Estudiante
RegistrarInscripc()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
GuadarDatos()
Diagrama registrar usuario
::MenuAdministrad
::ControlUsuarios
::Usuarios
::ConexionODBC
Administrador
RegistrarUsuario()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
GuardarDatos()
Diagrama cambiar datos usuario
::MenuAdministrad
::Usuarios
::ControlUsuarios
::ConexionODBC
Administrador
CambiarUsuario()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
ActualizarDatos()
Diagrama eliminar usuario
::MenuAdministrad
::ControlUsuarios
::Usuarios
::ConexionODBC
Administrador
EliminarUsuario()
IniciarVariables()
VerificarDatos()
ConexionODBC()
Devuelve la conexión
con el origen de datos
EliminarDatos()
Diagrama consultar datos usuario
::MenuAdministrad
::Usuarios
::ControlUsuarios
::ConexionODBC
Administrador
ConsultarUsuarios()
MostrarTabla()
ConexionODBC()
Devuelve la conexión
con el origen de datos
MostrarTabla()
ANEXO 3
DIAGRAMA DE ACTIVIDADES
Diagrama registrar asignatura
Inicio
Código
Nombre
Créditos
Obtener
Registro de
Asignaturas
Código - Nombre - Créditos
Estado del
Registro
Cancelar
Desplegar
mensaje de
error
Reingresar datos
Encontrado
Datos válidos
recibidos
Confirmación
enviada
Fin
Desplegar
confirmación
Actualización
validada
Actualizar
Registro de
Asignaturas
Diagrama cambiar datos asignatura
Inicio
Código
Asignatura
Obtener
Registro de
Asignaturas
Código Asignatura
Estado del
Registro
Cancelar
Reingresar código
Desplegar
mensaje de
error
No encontrado
Datos válidos
recibidos
Fin
Confirmación
enviada
Desplegar
confirmación
Actualización
validada
Actualizar
Registro de
Asignaturas
Diagrama eliminar asignatura
Inicio
Código
Asignatura
Obtener
Registro de
Asignaturas
Código Asignatura
Estado del
Registro
Cancelar
Reingresar código
Desplegar
mensaje de
error
No encontrado
Datos válidos
recibidos
Fin
Confirmación
enviada
Desplegar
confirmación
Eliminación
validada
Eliminar
Asignatura del
Registro
Diagrama registrar pensum
Inicio
Código
Carrera
Semestre
Obtener
Registro de
Pensum
Código - Carrera - Semestre
Estado del
Registro
Cancelar
Reingresar datos
Desplegar
mensaje de
error
Encontrado
Datos válidos
recibidos
Fin
Confirmación
enviada
Desplegar
confirmación
Actualización
validada
Actualizar
Registro de
Pensum
Diagrama cambiar datos pensum
Inicio
Código
Carrera
Asignatura
Obtener
Registro de
Pensum
Código Carrera Asignatura
Estado del
Registro
Cancelar
Reingresar datos
Desplegar
mensaje de
error
No encontrado
Datos válidos
recibidos
Confirmación
enviada
Fin
Desplegar
confirmación
Actualización
validada
Actualizar
Registro de
Pensum
Diagrama eliminar pensum
Inicio
Código
Carrera
Asignatura
Obtener
Registro de
Asignaturas
Código Carrera Asignatura
Estado del
Registro
Cancelar
Reingresar datos
Desplegar
mensaje de
error
No encontrado
Datos válidos
recibidos
Fin
Confirmación
enviada
Desplegar
confirmación
Eliminación
validada
Eliminar
Asignatura del
Registro
Diagrama registrar estudiante
Inicio
Cédula Nombre
Dirección
Teléfono
Obtener
Registro de
Estudiantes
Cédula Nombre Dirección Teléfono
Estado del
Registro
Cancelar
Desplegar
mensaje de
error
Reingresar datos
Encontrado
Datos válidos
recibidos
Confirmación
enviada
Fin
Desplegar
confirmación
Actualización
validada
Actualizar
Registro de
Estudiantes
Diagrama cambiar datos estudiante
Inicio
Número de
Cédula
Obtener
Registro de
Estudiantes
Número de Cédula
Estado del
Registro
Cancelar
Reingresar cédula
Desplegar
mensaje de
error
No encontrado
Encontrado
Fin
Confirmación
enviada
Desplegar
confirmación
Actualizar
Registro de
Estudiantes
Datos válidos
recibidos
Actualización
validada
Cédula Nombre
Dirección
Teléfono
Diagrama eliminar estudiante
Inicio
Número de
Cédula
Obtener
Registro de
Estudiantes
Número de Cédula
Estado del
Registro
Cancelar
Reingresar cédula
Desplegar
mensaje de
error
No encontrado
Datos válidos
recibidos
Confirmación
enviada
Fin
Desplegar
confirmación
Eliminación
validada
Eliminar
Estudiante del
Registro
Diagrama consultar datos estudiante
Inicio
Número de
Cédula
Obtener
Registro de
Estudiantes
Número de Cédula
Estado del
Registro
Cancelar
Reingresar cédula
Desplegar
mensaje de
error
No encontrado
Datos válidos
recibidos
Fin
Desplegar
datos del
estudiante
Diagrama registrar histórico
Inicio
Código
Asignatura
Calificación
Código Asignatura Calificación Lap
Obtener
Registro de
Histórico
Estado del
Registro
Cancelar
Reingresar datos
Desplegar
mensaje de
error
Encontrado
Datos válidos
recibidos
Confirmación
enviada
Fin
Desplegar
confirmación
Actualización
validada
Actualizar
Registro de
Histórico
Diagrama cambiar datos histórico
Inicio
Número de
Cédula
Obtener
Registro de
Histórico
Número de Cédula
Estado del
Registro
Cancelar
Reingresar datos
Desplegar
mensaje de
error
No encontrado
Encontrado
Fin
Confirmación
enviada
Desplegar
confirmación
Actualizar
Registro de
Histórico
Datos válidos
recibidos
Actualización
validada
Código
Asignatura
Calificación
Diagrama eliminar histórico
Inicio
Número de
Cédula
Obtener
Registro de
Histórico
Número de Cédula
Estado del
Registro
Cancelar
Reingresar cédula
Desplegar
mensaje de
error
No encontrado
Datos válidos
recibidos
Confirmación
enviada
Fin
Desplegar
confirmación
Eliminación
validada
Eliminar
Asignatura del
Registro
Diagrama consultar datos histórico
Inicio
Número de
Cédula
Obtener
Registro de
Histórico
Número de Cédula
Estado del
Registro
Cancelar
Reingresar cédula
Desplegar
mensaje de
error
No encontrado
Datos válidos
recibidos
Fin
Desplegar
datos del
Histórico
Diagrama seleccionar asignaturas
Inicio
Número de
Cédula
Obtener
Registro Oferta
Asignaturas
Número de Cédula
Estado del
Registro
Cancelar
No hay selección
Hay selección
Fin
Confirmación
enviada
Desplegar
confirmación
Datos válidos
recibidos
Actualizar
Registro de
Selección
Código
Asignatura
Créditos Sem
Actualización
validada
Diagrama cambiar selección
Inicio
Número de
Cédula
Reingresar cédula
Desplegar
mensaje de
error
Cancelar
Estado del
Registro
No encontrado
Confirmación
enviada
Fin
Obtener
Registro Oferta
Asignaturas
Número de Cédula
Actualizar
Registro de
Selección
Encontrado
Datos válidos
recibidos
Desplegar
confirmación
Actualización
validada
Código
Asignatura
Créditos Sem
Diagrama eliminar selección
Inicio
Número de
Cédula
Obtener
Registro Oferta
Asignaturas
Número de Cédula
Estado del
Registro
Cancelar
Reingresar cédula
Desplegar
mensaje de
error
No encontrado
Datos válidos
recibidos
Confirmación
enviada
Fin
Eliminación
validada
Desplegar
confirmación
Eliminar
Selección del
Registro
Diagrama validar inscripción
Inicio
Número de
Cédula
Reingresar cédula
Desplegar
mensaje de
error
Cancelar
Estado del
Registro
No validada
Confirmación
enviada
Fin
Obtener
Registro de
Inscripción
Número de Cédula
Actualizar
Registro de
Inscripción
Validada
Datos válidos
recibidos
Desplegar
confirmación
Actualización
validada
Num Depósito
Fecha Entidad
Monto
Diagrama cambiar validación
Inicio
Número de
Cédula
Obtener
Registro de
Inscripción
Número de Cédula
Estado del
Registro
Cancelar
No hay cambios
Hay cambios
Fin
Confirmación
enviada
Desplegar
confirmación
Actualizar
Registro de
Inscripción
Datos válidos
recibidos
Num Depósito
Fecha Entidad
Monto
Actualización
validada
Diagrama eliminar validación
Inicio
Número de
Cédula
Obtener
Registro de
Inscripción
Número de Cédula
Estado del
Registro
Cancelar
Reingresar cédula
Desplegar
mensaje de
error
No encontrado
Datos válidos
recibidos
Fin
Confirmación
enviada
Desplegar
confirmación
Eliminación
validada
Eliminar
Registro de
Inscripción
Diagrama registrar inscripción
Inicio
Número de
Cédula
Obtener
Registro de
Inscripción
Número de Cédula
Reingresar cédula
Desplegar
mensaje de
error
Estado del
Registro
Cancelar
Encontrada
Actualizar
Registro de
Inscripción
Confirmación
enviada
Datos válidos
recibidos
Desplegar
confirmación
Fin
No encontrada
Actualización
validada
Num Depósito
Fecha Entidad
Monto
Diagrama registrar usuario
Inicio
Usuario Cédula
Nombre
Contraseña
Usuario Cédula Nombre Contraseña
Obtener
Registro de
Usuarios
Estado del
Registro
Cancelar
Reingresar datos
Desplegar
mensaje de
error
Encontrado
Datos válidos
recibidos
Fin
Confirmación
enviada
Desplegar
confirmación
Actualización
validada
Actualizar
Registro de
Usuarios
Diagrama cambiar datos usuario
Inicio
Número de
Cédula
Obtener
Registro de
Usuarios
Número de Cédula
Estado del
Registro
Cancelar
Reingresar cédula
Desplegar
mensaje de
error
No encontrado
Encontrado
Fin
Confirmación
enviada
Desplegar
confirmación
Actualizar
Registro de
Usuarios
Datos válidos
recibidos
Usuario Cédula
Nombre
Contraseña
Actualización
validada
Diagrama eliminar usuario
Inicio
Número de
Cédula
Obtener
Registro de
Usuarios
Número de Cédula
Estado del
Registro
Cancelar
Reingresar cédula
Desplegar
mensaje de
error
No encontrado
Datos válidos
recibidos
Fin
Confirmación
enviada
Desplegar
confirmación
Eliminación
validada
Eliminar
Usuario del
Registro
Diagrama consultar datos usuario
Inicio
Número de
Cédula
Obtener
Registro de
Usuarios
Número de Cédula
Estado del
Registro
Cancelar
Reingresar cédula
Desplegar
mensaje de
error
No encontrado
Datos válidos
recibidos
Fin
Desplegar
datos del
Usuario
ANEXO 4
DOCUMENTACIÓN DEL CÓDIGO BASE (CLASES)
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: Password (Para crear el diálogo
****
//**** que sirve para ingresar usuario y contraseña de acceso)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//***************************************************************************
// Inicio Clase Password (Clase principal)
//***************************************************************************
public class Password extends JFrame implements ActionListener
{
//*** Se declaran las variables
static boolean nPass = false;
//*** Se crea una instancia IntUsuarios de la clase ControlPassword para
//*** utilizar los métodos de esta clase
ControlPassword IntUsuarios = new ControlPassword();
//*** Se crean los componentes necesarios
JLabel EtiquetaInUsuario = new JLabel("Usuario :");
static TextField CajaTextoInUsuario = new TextField(10);
JLabel EtiquetaInContrasena = new JLabel("Contraseña :");
static TextField CajaTextoInContrasena = new TextField(10);
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/Usuarios.gif");
JLabel EtiquetaUsuario = new JLabel(imagen);
JButton BotonAceptar = new JButton("
JButton BotonCancelar = new JButton("
Aceptar
");
Cancelar
");
//*** Se define el método principal "main" de la Clase Password
public static void main(String[] args)
{
//*** Se ejecuta el constructor Password de la clase Password
new Password();
}
//*** Inicio del constructor Password
public Password()
{
//*** Se define el título y tamaño de la ventana
setTitle("Usuario y contraseña");
setBounds( 0, 0, 280, 210 );
setResizable(false);
//*** Se cambia el icono de la ventana
setIconImage (new ImageIcon("C:/TG-319/4-IMAGENES/UN.gif").getImage());
//*** Se crean los páneles para acomodar los componentes
JPanel PanelEspacioArriba = new JPanel();
JPanel PanelUsuario = new JPanel(new GridLayout(1,2));
JPanel
JPanel
JPanel
JPanel
JPanel
PanelContrasena = new JPanel(new GridLayout(1,2));
Panel1 = new JPanel(new BorderLayout(5,10));
PanelBotones = new JPanel(new GridLayout(1,2,20,3));
Panel2 = new JPanel(new BorderLayout(5,10));
PanelPrincipal = new JPanel(new FlowLayout(FlowLayout.CENTER));
//*** Etiquetas, cajas de texto y botones del diálogo
CajaTextoInUsuario.setText("");
CajaTextoInContrasena.setEchoChar('*');
BotonAceptar.setMnemonic('A');
BotonAceptar.setToolTipText("Verificar usuario...");
BotonCancelar.setMnemonic('C');
BotonCancelar.setToolTipText("Cancelar y salir...");
PanelEspacioArriba.add(EtiquetaUsuario);
PanelEspacioArriba.setLayout( new FlowLayout(FlowLayout.LEFT));
PanelUsuario.add(EtiquetaInUsuario);
PanelUsuario.add(CajaTextoInUsuario);
PanelContrasena.add(EtiquetaInContrasena);
PanelContrasena.add(CajaTextoInContrasena);
Panel1.add(PanelEspacioArriba, BorderLayout.NORTH);
Panel1.add(PanelUsuario, BorderLayout.CENTER);
Panel1.add(PanelContrasena, BorderLayout.SOUTH);
PanelBotones.add(BotonAceptar);
PanelBotones.add(BotonCancelar);
Panel2.add(Panel1, BorderLayout.NORTH);
Panel2.add(PanelBotones, BorderLayout.SOUTH);
// *** Se agrega el panel principal al diálogo
PanelPrincipal.add(Panel2);
getContentPane().add(PanelPrincipal);
//*** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2),
(pantalla.height - cuadro.height)/2);
//*** Se muestra el diálogo
setVisible(true);
//*** Eventos producidos por los botones de la ventana
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
BotonAceptar.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
///*******************************
///*** VITAL
****
///*******************************
IntUsuarios.nControl1 = true;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
MenuEstudiante.nControl3 = false;
MenuEstudiante.nControl4 = false;
MenuEstudiante.nControl6 = false;
MenuEstudiante.nControl9 = false;
MenuEstudiante.nControl11 = false;
//*** Se invocan los métodos IniciarVariables-VerificarDatos de la
//*** clase ControlPassword
IntUsuarios.IniciarVariables();
IntUsuarios.VerificarDatos();
if (nPass == true)
dispose();
}
});
BotonCancelar.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
}
//*** Fin del constructor Password
//*** Se definen los métodos necesarios para abrir y cerra el diálogo
public void actionPerformed(ActionEvent e)
{
Object s = e.getSource();
}
public void CierraVentana()
{
setVisible(false);
dispose();
System.exit(0);
}
}
//***************************************************************************
// Fin Clase Password (Clase principal)
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: MenuAdministrador (Para crear el menú del
****
//**** nivel administrador con todas las opciones de la aplicación)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import
import
import
import
import
java.awt.*;
java.awt.event.*;
javax.swing.*;
java.util.Date;
java.awt.Color;
//***************************************************************************
// Inicio Clase MenuAdministrador
//***************************************************************************
public class MenuAdministrador extends JFrame implements ActionListener
{
//*** Se declaran las variables
String
String
String
String
DiaS = "";
Dia = "";
Mes = "";
Ano = "";
String adUsuario = "";
String adNombre = "";
static String adsCedula = "";
static String adsCedula2 = "";
static String adsCedula3 = "";
static String adsCedula4 = "";
int adCedula = 0;
String fechaTotal = String.valueOf(new Date());
static boolean nIMEU = false;
static boolean nMEU = false;
static String nTituloUsuario = "Registrar usuario y contraseña";
static
static
static
static
static
boolean
boolean
boolean
boolean
boolean
nControl3 = true;
nControl4 = true;
nControl6 = true;
nControl9 = true;
nControl11 = true;
static int nEstUsu = 0;
static String Lapso;
//*** Se crean los componentes necesarios
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/FondoUN.jpg");
JLabel EtiquetaMenu = new JLabel(imagen);
JMenuBar Barra = new JMenuBar();
JMenu Archivo = new JMenu("Archivo");
JMenuItem RegistrarAsignaturas = new JMenuItem("Asignaturas");
JMenuItem RegistrarPensum = new JMenuItem("Pensum");
JMenuItem Salir = new JMenuItem("Salir");
JMenu Estudiantes = new JMenu("Estudiantes");
JMenuItem RegistrarEstudiante = new JMenuItem("Registrar datos estudiante...");
JMenuItem CambiarEstudiante = new JMenuItem("Cambiar datos estudiante...");
JMenuItem EliminarEstudiante = new JMenuItem("Eliminar datos estudiante...");
JMenuItem ConsultarEstudiante = new JMenuItem("Consultar estudiantes...");
JMenu Historico = new JMenu("Histórico");
JMenuItem HistoricoCalificaciones = new JMenuItem("Histórico calificaciones estudiante...");
JMenuItem ConsultarHistorico = new JMenuItem("Consultar histórico estudiante...");
JMenu Inscripciones = new JMenu("Inscripciones");
JMenuItem SeleccionarAsignaturas = new JMenuItem("Seleccionar asignaturas de estudiante..");
JMenuItem RegistrarInscripción = new JMenuItem("Registrar y validar inscripción de
estudiante...");
JMenuItem ConsultarInscripciones = new JMenuItem("Consultar estudiantes inscritos...");
JMenu UsuariosSistema = new JMenu("Usuarios");
JMenuItem RegistrarUsuario = new JMenuItem("Registrar usuario y contraseña...");
JMenuItem CambiarUsuario = new JMenuItem("Cambiar usuario y contraseña...");
JMenuItem EliminarUsuario = new JMenuItem("Eliminar usuario y contraseña...");
JMenuItem ConsultarUsuario = new JMenuItem("Consultar usuarios...");
JMenu Ayuda = new JMenu("Ayuda");
JMenuItem AyudaGeneral = new JMenuItem("Ayuda general...");
JMenuItem Acercade = new JMenuItem("Acerca de...");
JLabel
JLabel
JLabel
JLabel
EtiquetaUsuario = new JLabel();
EtiquetaNombre = new JLabel();
EtiquetaCI = new JLabel();
EtiquetaFecha = new JLabel();
//*** Se define el método principal "main" de la Clase MenuAdministrador
public static void main(String[] args)
{
//*** Se ejecuta el constructor MenuAdministrador de la clase MenuAdministrador
new MenuAdministrador();
}
//*** Inicio del constructor MenuAdministrador
public MenuAdministrador()
{
//*** Se define el título y tamaño de la ventana
setTitle("Universidad Nacional: Sistema de Inscripción Regular");
setBounds( 0, 0, 800, 600 );
setResizable(false);
//*** Se cambia el icono de la ventana
setIconImage (new ImageIcon("C:/TG-319/4-IMAGENES/UN.gif").getImage());
//*** Para ejecutar archivos desde java
final Runtime obj = Runtime.getRuntime();
//*** Barra de menú y opciones del menú
setJMenuBar(Barra);
Barra.add(Archivo);
Archivo.add(RegistrarAsignaturas);
Archivo.add(RegistrarPensum);
Archivo.addSeparator();
Archivo.add(Salir);
Barra.add(Estudiantes);
Estudiantes.add(RegistrarEstudiante);
Estudiantes.add(CambiarEstudiante);
Estudiantes.add(EliminarEstudiante);
Estudiantes.add(ConsultarEstudiante);
Barra.add(Historico);
Historico.add(HistoricoCalificaciones);
Historico.add(ConsultarHistorico);
Barra.add(Inscripciones);
Inscripciones.add(SeleccionarAsignaturas);
Inscripciones.add(RegistrarInscripción);
Inscripciones.add(ConsultarInscripciones);
Barra.add(UsuariosSistema);
UsuariosSistema.add(RegistrarUsuario);
UsuariosSistema.add(CambiarUsuario);
UsuariosSistema.add(EliminarUsuario);
UsuariosSistema.add(ConsultarUsuario);
Barra.add(Ayuda);
Ayuda.add(AyudaGeneral);
Ayuda.add(Acercade);
//*** Se asignan las teclas calientes a las opciones del menú
Archivo.setMnemonic('A');
RegistrarAsignaturas.setMnemonic('n');
RegistrarPensum.setMnemonic('P');
Salir.setMnemonic('S');
Estudiantes.setMnemonic('E');
RegistrarEstudiante.setMnemonic('R');
CambiarEstudiante.setMnemonic('C');
EliminarEstudiante.setMnemonic('m');
ConsultarEstudiante.setMnemonic('o');
Historico.setMnemonic('H');
HistoricoCalificaciones.setMnemonic('n');
ConsultarHistorico.setMnemonic('C');
Inscripciones.setMnemonic('I');
SeleccionarAsignaturas.setMnemonic('S');
RegistrarInscripción.setMnemonic('R');
ConsultarInscripciones.setMnemonic('C');
UsuariosSistema.setMnemonic('s');
RegistrarUsuario.setMnemonic('R');
CambiarUsuario.setMnemonic('C');
EliminarUsuario.setMnemonic('E');
ConsultarUsuario.setMnemonic('o');
Ayuda.setMnemonic('u');
AyudaGeneral.setMnemonic('A');
Acercade.setMnemonic('c');
RegistrarAsignaturas.setToolTipText("Tabla de asignaturas");
RegistrarPensum.setToolTipText("Tabla de pensum por carrera");
Salir.setToolTipText("Salir de la aplicación");
RegistrarEstudiante.setToolTipText("Registrar los datos personales del estudiante");
CambiarEstudiante.setToolTipText("Cambiar los datos personales del estudiante");
EliminarEstudiante.setToolTipText("Eliminar los datos personales del estudiante");
ConsultarEstudiante.setToolTipText("Consultar listado de estudiantes");
HistoricoCalificaciones.setToolTipText("Histórico de calificaciones del estudiante");
ConsultarHistorico.setToolTipText("Consultar el histórico de calificaciones del estudiante");
SeleccionarAsignaturas.setToolTipText("Oferta de asignaturas para la inscripción del
estudiante");
RegistrarInscripción.setToolTipText("Registrar y validar la inscripción del estudiante");
ConsultarInscripciones.setToolTipText("Consultar las inscripciones que han sido validadas");
RegistrarUsuario.setToolTipText("Registra los datos de un usuario en el sistema");
CambiarUsuario.setToolTipText("Cambia los datos de un usuario en el sistema");
EliminarUsuario.setToolTipText("Elimina un usuario del sistema");
ConsultarUsuario.setToolTipText("Consultar los usuario del sistema");
AyudaGeneral.setToolTipText("Muestra la ayuda general");
Acercade.setToolTipText("Muestra el diálogo acerca de...");
//*** Etiquetas y cajas de texto en el menú principal
EtiquetaMenu.add(EtiquetaUsuario);
EtiquetaUsuario.setBounds(20, 10, 215, 20);
EtiquetaUsuario.setFont(new Font("SansSerif", Font.BOLD, 16));
EtiquetaUsuario.setForeground( Color.RED);
EtiquetaUsuario.setBackground( Color.WHITE);
EtiquetaMenu.add(EtiquetaNombre);
EtiquetaNombre.setBounds(20, 50, 500, 30);
EtiquetaNombre.setFont(new Font("SansSerif", Font.BOLD, 20));
EtiquetaNombre.setForeground( Color.BLUE);
EtiquetaNombre.setBackground( Color.WHITE);
EtiquetaMenu.add(EtiquetaCI);
EtiquetaCI.setBounds(20, 80, 215, 20);
EtiquetaCI.setFont(new Font("SansSerif", Font.BOLD, 12));
EtiquetaCI.setForeground( Color.BLUE);
EtiquetaCI.setBackground( Color.WHITE);
IniciarEtiquetas(adUsuario,adNombre,adCedula);
//*** Para mostrar la fecha en la ventana del menú
DiaS = fechaTotal.substring(0,3);
Mes = fechaTotal.substring(4,7);
Dia = fechaTotal.substring(8,10);
Ano = fechaTotal.substring(fechaTotal.length() - 4, fechaTotal.length());
//*** Se muestran los días en español
if (DiaS.equals("Sun"))
DiaS = " Domingo";
if (DiaS.equals("Mon"))
DiaS = " Lunes";
if (DiaS.equals("Tue"))
DiaS = " Martes";
if (DiaS.equals("Wed"))
DiaS = " Miércoles";
if (DiaS.equals("Thu"))
DiaS = " Jueves";
if (DiaS.equals("Fri"))
DiaS = " Viernes";
if (DiaS.equals("Sat"))
DiaS = " Sábado";
//*** Se muestran los meses en español
if (Mes.equals("Jan"))
Mes = "Enero";
if (Mes.equals("Feb"))
Mes = "Febrero";
if (Mes.equals("Mar"))
Mes = "Marzo";
if (Mes.equals("Apr"))
Mes = "Abril";
if (Mes.equals("May"))
Mes = "Mayo";
if (Mes.equals("Jun"))
Mes = "Junio";
if (Mes.equals("Jul"))
Mes = "Julio";
if (Mes.equals("Aug"))
Mes = "Agosto";
if (Mes.equals("Sep"))
Mes = "Septiembre";
if (Mes.equals("Oct"))
Mes = "Octubre";
if (Mes.equals("Nov"))
Mes = "Noviembre";
if (Mes.equals("Dec"))
Mes = "Diciembre";
EtiquetaFecha.setText(DiaS + ", " + Dia + " de " + Mes + " de " + Ano);
EtiquetaMenu.add(EtiquetaFecha);
EtiquetaFecha.setBounds(560, 10, 215, 20); //*** (X, Y, Ancho, Alto)
EtiquetaFecha.setFont(new Font("SansSerif", Font.BOLD, 12));
EtiquetaFecha.setForeground(Color.BLUE);
EtiquetaFecha.setBackground(Color.WHITE);
if (Mes.equals("Jan") || Mes.equals("Feb") || Mes.equals("Mar") || Mes.equals("Apr") ||
Mes.equals("May") || Mes.equals("Jun"))
Lapso = Ano + "-1";
else
Lapso = Ano + "-2";
//*** Se agrega la imagen central en la ventana del menú
add(EtiquetaMenu);
//*** Se centra la ventana del menú en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2),
(pantalla.height - cuadro.height)/2);
//*** Se muestra el menú
setVisible( true );
//*** Eventos producidos por las opciones del menú
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
RegistrarAsignaturas.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase Asignaturas
nIMEU = true;
Asignaturas d = new Asignaturas();
d.setVisible(true);
}
});
RegistrarPensum.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase Pensum
nIMEU = true;
Pensum d = new Pensum();
d.setVisible(true);
}
});
Salir.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
RegistrarEstudiante.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase Estudiante
nIMEU = true;
Estudiantes d = new Estudiantes();
d.setVisible(true);
}
});
CambiarEstudiante.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoCedula
nEstUsu = 1;
nIMEU = true;
nMEU = true;
DialogoCedula d = new DialogoCedula();
d.setVisible(true);
}
});
EliminarEstudiante.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoCedula
nEstUsu = 1;
nIMEU = true;
nMEU = false;
DialogoCedula d = new DialogoCedula();
d.setVisible(true);
}
});
ConsultarEstudiante.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
///*******************************
///*** VITAL
****
///*******************************
nControl4 = false;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = true;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
//*** Se crea una instancia de la clase TablaEstudiante
TablaEstudiantes d = new TablaEstudiantes();
d.setVisible(true);
}
});
HistoricoCalificaciones.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoCedula
nEstUsu = 2;
nIMEU = true;
nMEU = true;
DialogoCedula d = new DialogoCedula();
d.setVisible(true);
}
});
ConsultarHistorico.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoCedula
nEstUsu = 2;
nIMEU = true;
nMEU = false;
DialogoCedula d = new DialogoCedula();
d.setVisible(true);
}
});
SeleccionarAsignaturas.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoCedula
nEstUsu = 3;
nIMEU = true;
nMEU = true;
DialogoCedula d = new DialogoCedula();
d.setVisible(true);
}
});
RegistrarInscripción.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoCedula
nEstUsu = 4;
nIMEU = true;
nMEU = true;
DialogoCedula d = new DialogoCedula();
d.setVisible(true);
}
});
ConsultarInscripciones.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
///*******************************
///*** VITAL
****
///*******************************
ControlValidaciones.nControl12 = true;
ControlUsuarios.nControl2 = false;
ControlPassword.nControl1 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
//*** Se crea una instancia de la clase TablaValidaciones
TablaValidaciones d = new TablaValidaciones();
d.setVisible(true);
}
});
RegistrarUsuario.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase Usuarios
nIMEU = true;
Usuarios d = new Usuarios();
d.setVisible(true);
}
});
CambiarUsuario.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoCedula
nEstUsu = 0;
nIMEU = true;
nMEU = true;
DialogoCedula d = new DialogoCedula();
d.setVisible(true);
}
});
EliminarUsuario.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoCedula
nEstUsu = 0;
nIMEU = true;
nMEU = false;
DialogoCedula d = new DialogoCedula();
d.setVisible(true);
}
});
ConsultarUsuario.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
///*******************************
///*** VITAL
****
///*******************************
ControlUsuarios.nControl2 = true;
ControlPassword.nControl1 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
//*** Se crea una instancia de la clase Usuarios
TablaUsuarios d = new TablaUsuarios();
d.setVisible(true);
}
});
AyudaGeneral.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Ejecuta el archivo de ayuda UNSIR101.HLP
try
{
obj.exec("winhlp32.exe C:/TG-319/5-AYUDA/UNSIR101.HLP");
}
catch (Exception e)
{
System.out.println("Se ha producido un error: "+ e.toString());
}
}
});
Acercade.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoAcercade
DialogoAcercade d = new DialogoAcercade();
d.setVisible(true);
}
});
}
//*** Fin del constructor MenuAdministrador
//*** Se definen los métodos necesarios para abrir y cerrar el menú
public void actionPerformed(ActionEvent e)
{
Object s = e.getSource();
}
public void CierraVentana()
{
setVisible( false );
dispose();
System.exit(0);
}
//*** Se define el método IniciarEtiquetas para mostrar el nombre del usuario y cédula
public void IniciarEtiquetas(String mnuUsuario,String mnuNombre,int mnuCedula)
{
if(mnuUsuario.equals(""))
EtiquetaUsuario.setText("");
else
EtiquetaUsuario.setText("Usuario : " + mnuUsuario);
EtiquetaNombre.setText(mnuNombre);
if(mnuCedula == 0)
EtiquetaCI.setText("");
else
EtiquetaCI.setText("C.I.: " + mnuCedula);
}
//*** Se crea una nueva clase para crear un diáologo que sirve para ingresar
//*** el número de cédula para labores de búsqueda
class DialogoCedula extends JDialog
{
//*** Se crean los componentes necesarios
JLabel EtiquetaCedula = new JLabel("No. de cédula :");
TextField CajaTextoCedula = new TextField(10);
JButton BotonAceptarCedula = new JButton(" Aceptar ");
JButton BotonCancelarCedula = new JButton(" Cancelar ");
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
PanelEspacio = new JPanel();
Panel1 = new JPanel(new GridLayout(1,2));
Panel2 = new JPanel(new BorderLayout(5,10));
Panel3 = new JPanel(new GridLayout(1,2,20,2));
Panel4 = new JPanel(new BorderLayout(5,10));
PanelPrincipal = new JPanel(new FlowLayout(FlowLayout.CENTER));
//*** Constructor de la clase
public DialogoCedula()
{
//*** Se define el título y tamaño de la ventana
super(new Frame(), "Buscar...", true);
setBounds( 0, 0, 280, 155 );
CajaTextoCedula.setText("");
BotonAceptarCedula.setMnemonic('A');
BotonAceptarCedula.setToolTipText("Buscar...");
BotonCancelarCedula.setMnemonic('C');
BotonCancelarCedula.setToolTipText("Cancelar y salir...");
Panel1.add(EtiquetaCedula);
Panel1.add(CajaTextoCedula);
Panel2.add(PanelEspacio, BorderLayout.NORTH);
Panel2.add(Panel1, BorderLayout.SOUTH);
Panel3.add(BotonAceptarCedula);
Panel3.add(BotonCancelarCedula);
Panel4.add(Panel2, BorderLayout.NORTH);
Panel4.add(Panel3, BorderLayout.SOUTH);
PanelPrincipal.add(Panel4);
//*** Se agrega el panel principal al diálogo
getContentPane().add(PanelPrincipal);
//*** Para no cambiar el tamaño de la ventana
setResizable(false);
//*** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos de los botones
BotonAceptarCedula.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
if (nEstUsu == 0)
{
//*** Se crea una instancia IntUsuarios de la clase ControlUsuarios
//*** para utilizar los métodos de esta clase
ControlUsuarios IntUsuarios = new ControlUsuarios();
///*******************************
///*** VITAL
****
///*******************************
nControl3 = true;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
adsCedula = CajaTextoCedula.getText();
if (!adsCedula.equals("") && IntUsuarios.BuscarCedula(adsCedula) == true)
{
dispose();
if (nMEU == true)
{
nTituloUsuario = "Cambiar usuario y contraseña";
}
else
{
nTituloUsuario = "Eliminar usuario y contraseña";
}
Usuarios d = new Usuarios();
d.setVisible(true);
}
else
{
nControl3 = false;
}
}
if (nEstUsu == 1)
{
//*** Se crea una instancia IntEstudiantes de la clase ControlEstudiantes o
//*** para utilizar los métodos de esta clase
ControlEstudiantes IntEstudiantes = new ControlEstudiantes();
///*******************************
///*** VITAL
****
///*******************************
nControl4 = true;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
adsCedula = CajaTextoCedula.getText();
if (!adsCedula.equals("") && IntEstudiantes.BuscarCedula(adsCedula) == true)
{
dispose();
if (nMEU == true)
{
Estudiantes d = new Estudiantes();
d.setTitle("Cambiar datos estudiante");
d.setVisible(true);
}
else
{
Estudiantes d = new Estudiantes();
d.setTitle("Eliminar estudiante");
d.setVisible(true);
}
}
else
{
nControl4 = false;
}
}
if (nEstUsu == 2)
{
//*** Se crea una instancia IntHistorico de la clase ControlHistorico
//*** para utilizar los métodos de esta clase
ControlHistorico IntHistorico = new ControlHistorico();
///*******************************
///*** VITAL
****
///*******************************
nControl6 = true;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
adsCedula2 = CajaTextoCedula.getText();
if (!adsCedula2.equals("") && IntHistorico.BuscarCedula(adsCedula2) == true)
{
dispose();
Historico d = new Historico();
d.setVisible(true);
}
else
{
nControl6 = false;
}
}
if (nEstUsu == 3)
{
//*** Se crea una instancia IntInscripciones de la clase ControlInscripciones
//*** para utilizar los métodos de esta clase
ControlInscripciones IntInscripciones = new ControlInscripciones();
///*******************************
///*** VITAL
****
///*******************************
nControl9 = true;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl11 = false;
adsCedula3 = CajaTextoCedula.getText();
if (!adsCedula3.equals("") && IntInscripciones.BuscarCedula(adsCedula3) == true)
{
dispose();
Inscripciones d = new Inscripciones();
d.setVisible(true);
}
else
{
nControl9 = false;
}
}
if (nEstUsu == 4)
{
//*** Se crea una instancia IntValidaciones de la clase ControlValidaciones
//*** para utilizar los métodos de esta clase
ControlValidaciones IntValidaciones = new ControlValidaciones();
///*******************************
///*** VITAL
****
///*******************************
nControl11 = true;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
MenuAdministrador.nControl3
MenuAdministrador.nControl4
MenuAdministrador.nControl6
MenuAdministrador.nControl9
=
=
=
=
false;
false;
false;
false;
adsCedula4 = CajaTextoCedula.getText();
if (!adsCedula4.equals("") && IntValidaciones.BuscarCedula(adsCedula4) == true)
{
dispose();
Validaciones d = new Validaciones();
if (d.MiTabla1.getRowCount() == 0 && !d.CajaTextoVNombre.getText().equals(""))
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Este estudiante no tiene selección de asignaturas !!","Atención",
JOptionPane.WARNING_MESSAGE);
d.CierraVentana();
}
else
d.setVisible(true);
}
else
{
nControl11 = false;
}
}
}
});
BotonCancelarCedula.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
dispose();
}
});
}
//*** Fin del constructor DialogoCedula
}
//*** Fin de la clase DialogoCedula
//*** Se crea una nueva clase para crear un diáologo que sirve para mostrar
//*** los créditos del sistema
class DialogoAcercade extends JDialog
{
//*** Se crean los componentes necesarios
JLabel EtiquetaAcercade0 =
JLabel EtiquetaAcercade1 =
JLabel EtiquetaAcercade2 =
JLabel EtiquetaAcercade3 =
JLabel EtiquetaAcercade4 =
JLabel EtiquetaAcercade5 =
JLabel EtiquetaAcercade6 =
JLabel EtiquetaAcercade7 =
JLabel.CENTER);
JLabel EtiquetaAcercade8 =
JLabel.CENTER);
JLabel EtiquetaAcercade9 =
JLabel EtiquetaAcercade10=
JLabel.CENTER);
JLabel EtiquetaAcercade11=
JLabel.CENTER);
JLabel EtiquetaAcercade12=
JLabel EtiquetaAcercade13=
JLabel EtiquetaAcercade14=
JLabel EtiquetaAcercade15=
JLabel EtiquetaAcercade16=
JLabel EtiquetaAcercade17=
JLabel EtiquetaAcercade18=
JLabel EtiquetaAcercade19=
new
new
new
new
new
new
new
new
JLabel("
", JLabel.CENTER);
JLabel("UNIVERSIDAD NACIONAL ABIERTA", JLabel.CENTER);
JLabel("CENTRO LOCAL SUCRE - 17", JLabel.CENTER);
JLabel("INGENIERÍA DE SISTEMAS - 236", JLabel.CENTER);
JLabel("
", JLabel.CENTER);
JLabel("TRABAJO DE GRADO - 319", JLabel.CENTER);
JLabel("LAPSO: 2006-2", JLabel.CENTER);
JLabel("IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES",
new JLabel("A TRAVÉS DE LA PROGRAMACIÓN ORIENTADA A ASPECTOS",
new JLabel("
", JLabel.CENTER);
new JLabel("CASO DE ESTUDIO: Aplicación que simula",
new JLabel("el registro de inscripciones regulares de",
new
new
new
new
new
new
new
new
JLabel("una universidad (UNSIR 1.0.1)", JLabel.CENTER);
JLabel("
", JLabel.CENTER);
JLabel("AUTOR: CARLOS CÓRDOVA", JLabel.CENTER);
JLabel("C.I.: 8.441.858", JLabel.CENTER);
JLabel("
", JLabel.CENTER);
JLabel("
", JLabel.CENTER);
JLabel("
", JLabel.CENTER);
JLabel("
", JLabel.CENTER);
JButton BotonAceptarAcercade = new JButton("Aceptar");
JPanel PanelCreditos = new JPanel(new GridLayout(17,1));
JPanel PanelBotones = new JPanel(new GridLayout(1,3,60,1));
JPanel PanelPrincipal = new JPanel(new BorderLayout());
//*** Constructor de la clase
public DialogoAcercade()
{
//*** Se define el título y tamaño de la ventana
super(new Frame(), "Acerca de...", true);
setBounds( 0, 0, 400, 345 );
PanelCreditos.add(EtiquetaAcercade0);
PanelCreditos.add(EtiquetaAcercade1);
PanelCreditos.add(EtiquetaAcercade2);
PanelCreditos.add(EtiquetaAcercade3);
PanelCreditos.add(EtiquetaAcercade4);
PanelCreditos.add(EtiquetaAcercade5);
PanelCreditos.add(EtiquetaAcercade6);
PanelCreditos.add(EtiquetaAcercade7);
PanelCreditos.add(EtiquetaAcercade8);
PanelCreditos.add(EtiquetaAcercade9);
PanelCreditos.add(EtiquetaAcercade10);
PanelCreditos.add(EtiquetaAcercade11);
PanelCreditos.add(EtiquetaAcercade12);
PanelCreditos.add(EtiquetaAcercade13);
PanelCreditos.add(EtiquetaAcercade14);
PanelCreditos.add(EtiquetaAcercade15);
PanelCreditos.add(EtiquetaAcercade16);
BotonAceptarAcercade.setMnemonic('A');
BotonAceptarAcercade.setToolTipText("Salir...");
PanelBotones.add(EtiquetaAcercade17);
PanelBotones.add(BotonAceptarAcercade);
PanelBotones.add(EtiquetaAcercade18);
PanelPrincipal.add("North",PanelCreditos);
PanelPrincipal.add("Center",PanelBotones);
PanelPrincipal.add("South",EtiquetaAcercade19);
//*** Se agrega el panel principal al diálogo
getContentPane().add(PanelPrincipal);
//*** Para no cambiar el tamaño de la ventana
setResizable(false);
//*** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos de los botones
BotonAceptarAcercade.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
dispose();
}
});
}
//*** Fin del constructor DialogoAcercade
}
//*** Fin de la clase DialogoAcercade
}
//***************************************************************************
// Fin Clase MenuAdministrador
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: MenuEstudiante (Para crear el menú del
****
//**** nivel estudiante con sólo las opciones de inscripción)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import
import
import
import
import
java.awt.*;
java.awt.event.*;
javax.swing.*;
java.util.Date;
java.awt.Color;
//***************************************************************************
// Inicio Clase MenuEstudiante
//***************************************************************************
public class MenuEstudiante extends JFrame implements ActionListener
{
//*** Se declaran las variables
String
String
String
String
DiaS = "";
Dia = "";
Mes = "";
Ano = "";
String esUsuario = "";
String esNombre = "";
int esCedula = 0;
static String adsCedula = "";
static String adsCedula2 = "";
static String adsCedula3 = "";
static String adsCedula4 = "";
String fechaTotal = String.valueOf(new Date());
static boolean nIMEU = false;
static boolean nMEU = false;
static
static
static
static
static
boolean
boolean
boolean
boolean
boolean
nControl3 = true;
nControl4 = true;
nControl6 = true;
nControl9 = true;
nControl11 = true;
static String Lapso;
//*** Se crean los componentes necesarios
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/FondoUN.jpg");
JLabel EtiquetaMenu = new JLabel(imagen);
JMenuBar Barra = new JMenuBar();
JMenu Archivo = new JMenu("Archivo");
JMenuItem Salir = new JMenuItem("Salir");
JMenu Consultas = new JMenu("Consultas");
JMenuItem DatosPersonales = new JMenuItem("Datos personales...");
JMenuItem Historico = new JMenuItem("Histórico...");
JMenu Inscripcion = new JMenu("Inscripción");
JMenuItem SeleccionarAsignaturas = new JMenuItem("Seleccionar asignaturas...");
JMenuItem RegistrarInscripción = new JMenuItem("Registrar inscripción...");
JMenu Ayuda = new JMenu("Ayuda");
JMenuItem AyudaGeneral = new JMenuItem("Ayuda general...");
JMenuItem Acercade = new JMenuItem("Acerca de...");
JLabel
JLabel
JLabel
JLabel
EtiquetaUsuario = new JLabel();
EtiquetaNombre = new JLabel();
EtiquetaCI = new JLabel();
EtiquetaFecha = new JLabel();
//*** Se define el método principal "main" de la Clase MenuEstudiante
public static void main(String[] args)
{
//*** Se ejecuta el constructor MenuEstudiante de la clase MenuEstudiante
new MenuEstudiante();
}
//*** Inicio del constructor MenuEstudiante
public MenuEstudiante()
{
//*** Se define el título y tamaño de la ventana
setTitle("Universidad Nacional: Sistema de Inscripción Regular");
setBounds( 0, 0, 800, 600 );
setResizable(false);
//*** Se cambia el icono de la ventana
setIconImage (new ImageIcon("C:/TG-319/4-IMAGENES/UN.gif").getImage());
//*** Para ejecutar archivos desde java
final Runtime obj = Runtime.getRuntime();
//*** Barra de menú y opciones del menú
setJMenuBar(Barra);
Barra.add(Archivo);
Archivo.add(Salir);
Barra.add(Consultas);
Consultas.add(DatosPersonales);
Consultas.add(Historico);
Barra.add(Inscripcion);
Inscripcion.add(SeleccionarAsignaturas);
Inscripcion.add(RegistrarInscripción);
Barra.add(Ayuda);
Ayuda.add(AyudaGeneral);
Ayuda.add(Acercade);
//*** Se asignan las teclas calientes a las opciones del menú
Archivo.setMnemonic('A');
Salir.setMnemonic('S');
Consultas.setMnemonic('C');
DatosPersonales.setMnemonic('D');
Historico.setMnemonic('H');
Inscripcion.setMnemonic('I');
SeleccionarAsignaturas.setMnemonic('S');
RegistrarInscripción.setMnemonic('R');
Ayuda.setMnemonic('u');
AyudaGeneral.setMnemonic('A');
Acercade.setMnemonic('c');
Salir.setToolTipText("Salir de la aplicación");
DatosPersonales.setToolTipText("Muestra los datos personales del estudiante");
Historico.setToolTipText("Muestra el histórico de calificaciones del estudiante");
SeleccionarAsignaturas.setToolTipText("Oferta de asignaturas para seleccionar");
RegistrarInscripción.setToolTipText("Registrar comprobante de pago para la inscripción");
AyudaGeneral.setToolTipText("Muestra la ayuda general");
Acercade.setToolTipText("Muestra el diálogo acerca de...");
//*** Etiquetas y cajas de texto en el menú principal
EtiquetaMenu.add(EtiquetaUsuario);
EtiquetaUsuario.setBounds(20, 10, 215, 20);
EtiquetaUsuario.setFont(new Font("SansSerif", Font.BOLD, 16));
EtiquetaUsuario.setForeground( Color.RED);
EtiquetaUsuario.setBackground( Color.WHITE);
EtiquetaMenu.add(EtiquetaNombre);
EtiquetaNombre.setBounds(20, 50, 500, 30);
EtiquetaNombre.setFont(new Font("SansSerif", Font.BOLD, 20));
EtiquetaNombre.setForeground( Color.BLUE);
EtiquetaNombre.setBackground( Color.WHITE);
EtiquetaMenu.add(EtiquetaCI);
EtiquetaCI.setBounds(20, 80, 215, 20);
EtiquetaCI.setFont(new Font("SansSerif", Font.BOLD, 12));
EtiquetaCI.setForeground( Color.BLUE);
EtiquetaCI.setBackground( Color.WHITE);
IniciarEtiquetas(esUsuario,esNombre,esCedula);
//*** Para mostrar la fecha en la ventana del menú
DiaS = fechaTotal.substring(0,3);
Mes = fechaTotal.substring(4,7);
Dia = fechaTotal.substring(8,10);
Ano= fechaTotal.substring(fechaTotal.length() - 4, fechaTotal.length());
//*** Se muestran los días en español
if (DiaS.equals("Sun"))
DiaS = " Domingo";
if (DiaS.equals("Mon"))
DiaS = " Lunes";
if (DiaS.equals("Tue"))
DiaS = " Martes";
if (DiaS.equals("Wed"))
DiaS = " Miércoles";
if (DiaS.equals("Thu"))
DiaS = " Jueves";
if (DiaS.equals("Fri"))
DiaS = " Viernes";
if (DiaS.equals("Sat"))
DiaS = " Sábado";
//*** Se muestran los meses en español
if (Mes.equals("Jan"))
Mes = "Enero";
if (Mes.equals("Feb"))
Mes = "Febrero";
if (Mes.equals("Mar"))
Mes = "Marzo";
if (Mes.equals("Apr"))
Mes = "Abril";
if (Mes.equals("May"))
Mes = "Mayo";
if (Mes.equals("Jun"))
Mes = "Junio";
if (Mes.equals("Jul"))
Mes = "Julio";
if (Mes.equals("Aug"))
Mes = "Agosto";
if (Mes.equals("Sep"))
Mes = "Septiembre";
if (Mes.equals("Oct"))
Mes = "Octubre";
if (Mes.equals("Nov"))
Mes = "Noviembre";
if (Mes.equals("Dec"))
Mes = "Diciembre";
EtiquetaFecha.setText(DiaS + ", " + Dia + " de " + Mes + " de " + Ano);
EtiquetaMenu.add(EtiquetaFecha);
EtiquetaFecha.setBounds(560, 10, 215, 20); //*** (X, Y, Ancho, Alto)
EtiquetaFecha.setFont(new Font("SansSerif", Font.BOLD, 12));
EtiquetaFecha.setForeground( Color.BLUE);
EtiquetaFecha.setBackground( Color.WHITE);
if (Mes.equals("Jan") || Mes.equals("Feb") || Mes.equals("Mar") || Mes.equals("Apr") ||
Mes.equals("May") || Mes.equals("Jun"))
Lapso = Ano + "-1";
else
Lapso = Ano + "-2";
//*** Se agrega la imagen central en la ventana del menú
add(EtiquetaMenu);
//*** Se centra la ventana del menú en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2),
(pantalla.height - cuadro.height)/2);
//*** Se muestra el menú
setVisible( true );
//*** Eventos producidos por las opciones del menú
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
Salir.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
DatosPersonales.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
ControlEstudiantes.nControl5 = true;
//*** Se crea una instancia de la clase ControlEstudiantes
ControlEstudiantes IntEstudiantes = new ControlEstudiantes();
///*******************************
///*** VITAL
****
///*******************************
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
nControl3 = false;
nControl4 = true;
nControl6 = false;
nControl9 = false;
nControl11 = false;
adsCedula = String.valueOf(ControlPassword.nCedula);
if (adsCedula.equals("0"))
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Se requiere de un usuario y contraseña para consultar los datos !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
else if (IntEstudiantes.BuscarCedula(adsCedula) == true)
{
MenuAdministrador.adsCedula = MenuEstudiante.adsCedula;
MenuEstudiante.adsCedula = "";
nIMEU = true;
Estudiantes d = new Estudiantes();
d.setTitle("Consultar datos personales");
d.CajaTextoCedula.setEditable(false);
d.CajaTextoNombreEstudiante.setEditable(false);
d.CajaTextoDireccion.setEditable(false);
d.CajaTextoTelefono.setEditable(false);
d.CajaTextoCorreo.setEditable(false);
d.ComboCarrera.setEnabled(true);
d.BotonCancelarEstudiante.setText("
Aceptar
");
d.BotonCancelarEstudiante.setMnemonic('A');
d.BotonCancelarEstudiante.setToolTipText("Salir de la consulta...");
d.BotonAceptarEstudiante.setVisible(false);
d.setVisible(true);
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ No existen datos personales para este usuario !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
}
});
Historico.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase ControlHistorico
ControlHistorico IntHistorico = new ControlHistorico();
///*******************************
///*** VITAL
****
///*******************************
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
nControl3 = false;
nControl4 = false;
nControl6 = true;
nControl9 = false;
nControl11 = false;
adsCedula = String.valueOf(ControlPassword.nCedula);
if (adsCedula.equals("0"))
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Se requiere de un usuario y contraseña para consultar los datos !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
else if (IntHistorico.BuscarCedula(adsCedula) == true)
{
MenuAdministrador.adsCedula2 = adsCedula;
adsCedula = "";
nIMEU = true;
Historico d = new Historico();
d.setVisible(true);
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ No existen datos del histórico para este usuario !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
}
});
SeleccionarAsignaturas.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase ControlInscripciones y ControlValidaciones
ControlInscripciones IntInscripciones = new ControlInscripciones();
ControlValidaciones IntValidaciones = new ControlValidaciones();
///*******************************
///*** VITAL
****
///*******************************
ControlValidaciones.nControl12 = false;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
nControl3 = false;
nControl4 = false;
nControl6 = false;
nControl9 = false;
nControl11 = true;
adsCedula = String.valueOf(ControlPassword.nCedula);
if (adsCedula.equals("0"))
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Se requiere de un usuario y contraseña para seleccionar asignaturas !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
else if (IntValidaciones.BuscarRegistro(adsCedula,Lapso) == true &&
IntValidaciones.BuscarCedula(adsCedula) == true)
{
MenuAdministrador.nMEU = true;
MenuAdministrador.adsCedula4 = adsCedula;
adsCedula = "";
nIMEU = true;
Validaciones d = new Validaciones();
d.setTitle("Registro de inscripción");
d.CajaTextoNumDeposito.setEditable(false);
d.CajaTextoMonDeposito.setEditable(false);
d.EtiquetaValidar.setText("
");
d.CheckValidar.setVisible(false);
d.BotonGuardarRegistro.setVisible(false);
d.BotonEliminarRegistro.setVisible(false);
d.setVisible(true);
}
else
{
///*******************************
///*** VITAL
****
///*******************************
ControlInscripciones.nControl10 = true;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlValidaciones.nControl12 = false;
nControl3 = false;
nControl4 = false;
nControl6 = false;
nControl9 = true;
nControl11 = false;
MenuAdministrador.nMEU = true;
MenuAdministrador.adsCedula3 = adsCedula;
adsCedula = "";
nIMEU = true;
if (!MenuAdministrador.adsCedula3.equals("") &&
IntInscripciones.BuscarCedula(MenuAdministrador.adsCedula3) == true)
{
Inscripciones d = new Inscripciones();
d.setVisible(true);
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ No existen datos de inscripción para este usuario !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlInscripciones.nControl10 = false;
nIMEU = false;
}
}
}
});
RegistrarInscripción.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase ControlValidaciones
ControlValidaciones IntValidaciones = new ControlValidaciones();
///*******************************
///*** VITAL
****
///*******************************
ControlValidaciones.nControl12 = true;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
nControl3 = false;
nControl4 = false;
nControl6 = false;
nControl9 = false;
nControl11 = true;
adsCedula = String.valueOf(ControlPassword.nCedula);
if (adsCedula.equals("0"))
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Se requiere de un usuario y contraseña para registrar la inscripción !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
else if (IntValidaciones.BuscarRegistro(adsCedula,Lapso) == true &&
IntValidaciones.BuscarCedula(adsCedula) == true)
{
MenuAdministrador.nMEU = true;
MenuAdministrador.adsCedula4 = adsCedula;
adsCedula = "";
nIMEU = true;
Validaciones d = new Validaciones();
d.setTitle("Registro de inscripción");
d.CajaTextoNumDeposito.setEditable(false);
d.CajaTextoMonDeposito.setEditable(false);
d.EtiquetaValidar.setText("
");
d.CheckValidar.setVisible(false);
d.BotonGuardarRegistro.setVisible(false);
d.BotonEliminarRegistro.setVisible(false);
d.setVisible(true);
}
else if (IntValidaciones.BuscarRegistro(adsCedula,Lapso) == false &&
IntValidaciones.BuscarCedula(adsCedula) == true)
{
MenuAdministrador.nMEU = true;
MenuAdministrador.adsCedula4 = adsCedula;
adsCedula = "";
nIMEU = true;
Validaciones d = new Validaciones();
d.setTitle("Registro de inscripción");
d.EtiquetaValidar.setText("
");
d.CheckValidar.setVisible(false);
d.BotonEliminarRegistro.setVisible(false);
d.BotonImprimirRegistro.setVisible(false);
if (d.MiTabla1.getRowCount() == 0 && !d.CajaTextoVNombre.getText().equals(""))
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ No tiene selección de asignaturas !!","Atención",
JOptionPane.WARNING_MESSAGE);
d.CierraVentana();
}
else
d.setVisible(true);
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ No existen datos de inscripción para este usuario !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlInscripciones.nControl10 = false;
nIMEU = false;
}
}
});
AyudaGeneral.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Ejecuta el archivo de ayuda UNSIR101.HLP
try
{
obj.exec("winhlp32.exe C:/TG-319/5-AYUDA/UNSIR101.HLP");
}
catch (Exception e)
{
System.out.println("Se ha producido un error: "+ e.toString());
}
}
});
Acercade.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoAcercade
DialogoAcercade d = new DialogoAcercade();
d.setVisible(true);
}
});
}
//*** Fin del constructor MenuEstudiante
//*** Se definen los métodos necesarios para abrir y cerrar el menú
public void actionPerformed(ActionEvent e)
{
Object s = e.getSource();
}
public void CierraVentana()
{
setVisible( false );
dispose();
System.exit(0);
}
//*** Se define el método IniciaEtiquetas para mostrar el nombre del usuario y cédula
public void IniciarEtiquetas(String mnuUsuario,String mnuNombre,int mnuCedula)
{
if(mnuUsuario.equals(""))
EtiquetaUsuario.setText("");
else
EtiquetaUsuario.setText("Usuario : " + mnuUsuario);
EtiquetaNombre.setText(mnuNombre);
if(mnuCedula == 0)
EtiquetaCI.setText("");
else
EtiquetaCI.setText("C.I.: " + mnuCedula);
}
//*** Se crea una nueva clase para crear un diáologo que sirve para mostrar
//*** los créditos del sistema
class DialogoAcercade extends JDialog
{
//*** Se crean los componentes necesarios
JLabel EtiquetaAcercade0 =
JLabel EtiquetaAcercade1 =
JLabel EtiquetaAcercade2 =
JLabel EtiquetaAcercade3 =
JLabel EtiquetaAcercade4 =
JLabel EtiquetaAcercade5 =
JLabel EtiquetaAcercade6 =
JLabel EtiquetaAcercade7 =
JLabel.CENTER);
JLabel EtiquetaAcercade8 =
JLabel.CENTER);
JLabel EtiquetaAcercade9 =
JLabel EtiquetaAcercade10=
JLabel.CENTER);
JLabel EtiquetaAcercade11=
JLabel.CENTER);
JLabel EtiquetaAcercade12=
JLabel EtiquetaAcercade13=
JLabel EtiquetaAcercade14=
JLabel EtiquetaAcercade15=
JLabel EtiquetaAcercade16=
JLabel EtiquetaAcercade17=
JLabel EtiquetaAcercade18=
JLabel EtiquetaAcercade19=
new
new
new
new
new
new
new
new
JLabel("
", JLabel.CENTER);
JLabel("UNIVERSIDAD NACIONAL ABIERTA", JLabel.CENTER);
JLabel("CENTRO LOCAL SUCRE - 17", JLabel.CENTER);
JLabel("INGENIERÍA DE SISTEMAS - 236", JLabel.CENTER);
JLabel("
", JLabel.CENTER);
JLabel("TRABAJO DE GRADO - 319", JLabel.CENTER);
JLabel("LAPSO: 2006-2", JLabel.CENTER);
JLabel("IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES",
new JLabel("A TRAVÉS DE LA PROGRAMACIÓN ORIENTADA A ASPECTOS",
new JLabel("
", JLabel.CENTER);
new JLabel("CASO DE ESTUDIO: Aplicación que simula",
new JLabel("el registro de inscripciones regulares de",
new
new
new
new
new
new
new
new
JLabel("una universidad (UNSIR 1.0.1)", JLabel.CENTER);
JLabel("
", JLabel.CENTER);
JLabel("AUTOR: CARLOS CÓRDOVA", JLabel.CENTER);
JLabel("C.I.: 8.441.858", JLabel.CENTER);
JLabel("
", JLabel.CENTER);
JLabel("
", JLabel.CENTER);
JLabel("
", JLabel.CENTER);
JLabel("
", JLabel.CENTER);
JButton BotonAceptarAcercade = new JButton("Aceptar");
JPanel PanelCreditos = new JPanel(new GridLayout(17,1));
JPanel PanelBotones = new JPanel(new GridLayout(1,3,60,1));
JPanel PanelPrincipal = new JPanel(new BorderLayout());
//*** Constructor de la clase
public DialogoAcercade()
{
//*** Se define el título y tamaño de la ventana
super(new Frame(), "Acerca de...", true);
setBounds( 0, 0, 400, 345 );
PanelCreditos.add(EtiquetaAcercade0);
PanelCreditos.add(EtiquetaAcercade1);
PanelCreditos.add(EtiquetaAcercade2);
PanelCreditos.add(EtiquetaAcercade3);
PanelCreditos.add(EtiquetaAcercade4);
PanelCreditos.add(EtiquetaAcercade5);
PanelCreditos.add(EtiquetaAcercade6);
PanelCreditos.add(EtiquetaAcercade7);
PanelCreditos.add(EtiquetaAcercade8);
PanelCreditos.add(EtiquetaAcercade9);
PanelCreditos.add(EtiquetaAcercade10);
PanelCreditos.add(EtiquetaAcercade11);
PanelCreditos.add(EtiquetaAcercade12);
PanelCreditos.add(EtiquetaAcercade13);
PanelCreditos.add(EtiquetaAcercade14);
PanelCreditos.add(EtiquetaAcercade15);
PanelCreditos.add(EtiquetaAcercade16);
BotonAceptarAcercade.setMnemonic('A');
BotonAceptarAcercade.setToolTipText("Salir...");
PanelBotones.add(EtiquetaAcercade17);
PanelBotones.add(BotonAceptarAcercade);
PanelBotones.add(EtiquetaAcercade18);
PanelPrincipal.add("North",PanelCreditos);
PanelPrincipal.add("Center",PanelBotones);
PanelPrincipal.add("South",EtiquetaAcercade19);
//*** Se agrega el panel principal al diálogo
getContentPane().add(PanelPrincipal);
//*** Para no cambiar el tamaño de la ventana
setResizable(false);
//*** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos de los botones
BotonAceptarAcercade.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
dispose();
}
});
}
//*** Fin del constructor DialogoAcercade
}
//*** Fin de la clase DialogoAcercade
}
//***************************************************************************
// Fin Clase MenuEstudiante
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: Asignaturas (Crea un diálogo que sirve para ****
//**** ingresar datos de las asignaturas)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import
import
import
import
import
import
import
java.io.*;
java.sql.*;
java.awt.*;
java.awt.event.*;
javax.swing.*;
javax.swing.table.DefaultTableModel;
javax.swing.table.TableColumn;
//***************************************************************************
// Inicio Clase Asignaturas
//***************************************************************************
public class Asignaturas extends JDialog
{
//*** Se declaran las variables
static boolean nAsig = false;
static
static
static
static
static
static
String AsigCodigo;
String AsigNombre;
int AsigCreditos;
String AsigCodH;
String AsigNomH;
String AsigCreH;
static boolean nIngresa = true;
static String nTituloAsignatura = "Registrar asignatura";
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se crea una instancia IntAsignatura de la clase ControlAsignaturas para
//*** utilizar los métodos de esta clase y hacer las transacciones con la
//*** tabla ASIGNATURAS de la base de datos
ControlAsignaturas IntAsignatura = new ControlAsignaturas();
static
static
static
static
static
DefaultTableModel MiTabla = new DefaultTableModel();
JTable Tabla = new JTable(MiTabla);
JScrollPane scrollPane = new JScrollPane(Tabla);
Object [] Fila = new Object[3];
TableColumn MiColumna = new TableColumn();
JLabel Etiqueta1 = new JLabel("
JLabel Etiqueta2 = new JLabel("
");
");
JButton BotonAsignaturaNueva = new JButton(" Registrar ");
JLabel Etiqueta9 = new JLabel("
");
JButton BotonCambiarAsignatura = new JButton(" Cambiar ");
JLabel Etiqueta10 = new JLabel("
");
JButton BotonEliminarAsignatura = new JButton(" Eliminar ");
JLabel Etiqueta11 = new JLabel("
");
JButton BotonCancelarAsignatura = new JButton(" Cancelar ");
//*** Se define el método principal "main" de la Clase Asignaturas
public static void main(String g[])
{
//*** Se ejecuta el constructor Asignaturas de la clase Asignaturas
Asignaturas p = new Asignaturas();
p.setVisible(true);
//*** Para cerrar la ventana
p.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
}
//*** Inicio del constructor Asignaturas
Asignaturas()
{
//*** Se define el título de la ventana
super(new Frame(), "Asignaturas", true);
//*** Se define el tamaño de la ventana para el diálogo
setBounds( 0, 0, 550, 324 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
PanelEspacioArriba = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelTabla = new JPanel();
PanelBotones = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelPricipal = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelEspacioArriba.add(Etiqueta1);
while (MiTabla.getRowCount() > 0)
{
MiTabla.removeRow(0);
}
Tabla.setPreferredScrollableViewportSize(new Dimension(500,175));
MiTabla.addColumn("Código");
MiTabla.addColumn("Nombre asignatura");
MiTabla.addColumn("U.C.");
while (Tabla.getColumnCount() > 3)
{
MiColumna = Tabla.getColumnModel().getColumn(3);
Tabla.removeColumn(MiColumna);
}
//*** Se hace la conexión y se llena la tabla(listado) con los datos.
try
{
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM ASIGNATURAS ORDER BY CodigoAsignatura";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
Fila[0] = String.valueOf(rs.getInt("CodigoAsignatura"));
Fila[1] = rs.getString("NombreAsignatura");
Fila[2] = String.valueOf(rs.getInt("UCAsignatura"));
MiTabla.addRow(Fila);
}
rs.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
PanelTabla.add(scrollPane, BorderLayout.CENTER);
PanelBotones.add(BotonAsignaturaNueva);
PanelBotones.add(Etiqueta9);
PanelBotones.add(BotonCambiarAsignatura);
PanelBotones.add(Etiqueta10);
PanelBotones.add(BotonEliminarAsignatura);
PanelBotones.add(Etiqueta11);
PanelBotones.add(BotonCancelarAsignatura);
BotonAsignaturaNueva.setMnemonic('R');
BotonAsignaturaNueva.setToolTipText("Registrar asignatura...");
BotonCambiarAsignatura.setMnemonic('m');
BotonCambiarAsignatura.setToolTipText("Cambiar asignatura...");
BotonEliminarAsignatura.setMnemonic('E');
BotonEliminarAsignatura.setToolTipText("Eliminar asignatura...");
BotonCancelarAsignatura.setMnemonic('C');
BotonCancelarAsignatura.setToolTipText("Cancelar y salir...");
// *** Se agrega el panel principal al diálogo
PanelPricipal.add(PanelEspacioArriba);
PanelPricipal.add(PanelTabla);
PanelPricipal.add(PanelBotones);
getContentPane().add(PanelPricipal);
//*** Se desactiva maximizar/minimizar
setResizable(false);
// *** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos producidos por los botones del diálogo
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
BotonAsignaturaNueva.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoAsignatura
nIngresa = true;
nTituloAsignatura = "Registrar asignatura";
DialogoAsignatura d = new DialogoAsignatura();
d.setVisible(true);
}
});
BotonCambiarAsignatura.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoAsignatura
if (Tabla.getSelectedRow() == -1)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe seleccionar una asignatura de la tabla !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
else
{
AsigCodH = Tabla.getValueAt(Tabla.getSelectedRow(),0).toString();
AsigNomH = Tabla.getValueAt(Tabla.getSelectedRow(),1).toString();
AsigCreH = Tabla.getValueAt(Tabla.getSelectedRow(),2).toString();
nIngresa = false;
nTituloAsignatura = "Cambiar asignatura";
DialogoAsignatura d = new DialogoAsignatura();
d.setVisible(true);
}
}
});
BotonEliminarAsignatura.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
if (Tabla.getSelectedRow() == -1)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe seleccionar una asignatura de la tabla !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
else
{
Toolkit.getDefaultToolkit().beep();
int n = JOptionPane.showConfirmDialog(null,"¿ Quiere eliminar la asignatura seleccionada
?",
"Eliminar...",JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION)
{
//*** Se invoca el método EliminarDatos de la clase ControlAsignaturas
AsigCodH = Tabla.getValueAt(Tabla.getSelectedRow(),0).toString();
AsigNomH = Tabla.getValueAt(Tabla.getSelectedRow(),1).toString();
AsigCreH = Tabla.getValueAt(Tabla.getSelectedRow(),2).toString();
IntAsignatura.EliminarDatos(AsigCodH);
MiTabla.removeRow(Tabla.getSelectedRow());
}
}
}
});
BotonCancelarAsignatura.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
}
//*** Fin del constructor Asignaturas
//*** Se definen los métodos necesarios para abrir y cerrar el diálogo
public void actionPerformed(ActionEvent e)
{
Object s = e.getSource();
}
public void CierraVentana()
{
if (MenuAdministrador.nIMEU == true)
{
setVisible(false);
dispose();
}
else
{
setVisible( false );
dispose();
System.exit(0);
}
}
//*** Se crea una nueva clase para crear un diáologo que sirve para ingresar
//*** el código, nombre y número de créditos de la asignatura
class DialogoAsignatura extends JDialog
{
//*** Se crean los componentes necesarios
JLabel EtiquetaAsignatura = new JLabel("Código :");
JLabel Etiqueta1 = new JLabel("
");
JLabel Etiqueta2 = new JLabel("
");
TextField CajaTextoAsignatura = new TextField(5);
JLabel EtiquetaNombreAsignatura = new JLabel("Nombre :");
JLabel Etiqueta3 = new JLabel("
");
JLabel Etiqueta4 = new JLabel("");
TextField CajaTextoNombreAsignatura = new TextField(27);
JLabel EtiquetaCreditos = new JLabel("No.créditos :");
JLabel Etiqueta5 = new JLabel(" ");
JLabel Etiqueta6 = new JLabel("
String[] Creditos = {"1","2","3","4","5","6","7","8","9","10"};
JComboBox ComboCreditos = new JComboBox(Creditos);
JButton BotonAceptarAsig = new JButton("
JLabel Etiqueta9 = new JLabel("
");
JButton BotonCancelarAsig = new JButton("
Aceptar
");
Cancelar
");
public DialogoAsignatura()
{
//*** Se define el título y tamaño de la ventana
super(new Frame(), nTituloAsignatura, true);
setBounds( 0, 0, 345, 225 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
PanelEspacioArriba = new JPanel();
PanelAsignatura = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelNomAsignatura = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelCreditos = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel Panel1 = new JPanel(new BorderLayout(5,5));
JPanel Panel2 = new JPanel(new BorderLayout(5,5));
JPanel PanelBotones = new JPanel(new FlowLayout(FlowLayout.CENTER));
JPanel PanelPricipal = new JPanel(new FlowLayout(FlowLayout.CENTER));
//*** Se hace la conexión y se llena el ComboAsignatura con los
//*** datos de la tabla ASIGNATURA de la base de datos
if (Asignaturas.nIngresa == false)
{
CajaTextoAsignatura.setText(Asignaturas.AsigCodH);
CajaTextoAsignatura.setEditable(false);
CajaTextoNombreAsignatura.setText(Asignaturas.AsigNomH);
ComboCreditos.setSelectedItem(Asignaturas.AsigCreH);
}
else
CajaTextoAsignatura.setEditable(true);
ComboCreditos.setMaximumRowCount(3);
PanelAsignatura.add(EtiquetaAsignatura);
PanelAsignatura.add(Etiqueta1);
PanelAsignatura.add(CajaTextoAsignatura);
PanelAsignatura.add(Etiqueta2);
PanelNomAsignatura.add(EtiquetaNombreAsignatura);
PanelNomAsignatura.add(Etiqueta3);
PanelNomAsignatura.add(CajaTextoNombreAsignatura);
PanelCreditos.add(EtiquetaCreditos);
PanelCreditos.add(Etiqueta5);
PanelCreditos.add(ComboCreditos);
PanelCreditos.add(Etiqueta6);
Panel1.add(PanelEspacioArriba, BorderLayout.NORTH);
Panel1.add(PanelAsignatura, BorderLayout.CENTER);
Panel1.add(PanelNomAsignatura, BorderLayout.SOUTH);
Panel2.add(PanelCreditos, BorderLayout.NORTH);
BotonAceptarAsig.setMnemonic('A');
BotonAceptarAsig.setToolTipText("Guardar asignatura");
BotonCancelarAsig.setMnemonic('C');
BotonCancelarAsig.setToolTipText("Cancelar y salir");
PanelBotones.add(BotonAceptarAsig);
PanelBotones.add(Etiqueta9);
PanelBotones.add(BotonCancelarAsig);
PanelPricipal.add(Panel1);
PanelPricipal.add(Panel2);
PanelPricipal.add(PanelBotones);
getContentPane().add(PanelPricipal);
//*** Para no cambiar el tamaño de la ventana
");
setResizable(false);
//*** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
BotonAceptarAsig.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
///*******************************
///*** VITAL
****
///*******************************
IntAsignatura.nControl8 = true;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
AsigCodH = CajaTextoAsignatura.getText();
AsigNomH = CajaTextoNombreAsignatura.getText().toUpperCase();
AsigCreH = ComboCreditos.getSelectedItem().toString();
IntAsignatura.IniciarVariables();
IntAsignatura.VerificarDatos();
if (nAsig == true)
{
nAsig = false;
dispose();
}
}
});
BotonCancelarAsig.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
dispose();
}
});
}
//*** Fin del constructor DialogoAsignatura
}
//*** Fin de la clase DialogoAsignatura
}
//***************************************************************************
// Fin Clase Asignaturas
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: Pensum (Crea un diálogo que sirve para
****
//**** ingresar datos de los pensum de estudio)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import
import
import
import
import
import
import
java.io.*;
java.sql.*;
java.awt.*;
java.awt.event.*;
javax.swing.*;
javax.swing.table.DefaultTableModel;
javax.swing.table.TableColumn;
//***************************************************************************
// Inicio Clase Pensum
//***************************************************************************
public class Pensum extends JDialog
{
//*** Se declaran las variables
static boolean nPen = false;
static
static
static
static
static
static
static
String
String
String
String
String
String
String
PenCodCa;
PenCodAs;
PenSem;
PenPre1;
PenPre2;
PenPre3;
PenPre4;
static boolean nIngresa = true;
static String nTituloPensum = "Registrar pensum";
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se crea una instancia IntPensum de la clase ControlPensum para
//*** utilizar los métodos de esta clase y hacer las transacciones con la
//*** tabla PENSUM de la base de datos
ControlPensum IntPensum = new ControlPensum();
static
static
static
static
static
DefaultTableModel MiTabla = new DefaultTableModel();
JTable Tabla = new JTable(MiTabla);
JScrollPane scrollPane = new JScrollPane(Tabla);
Object [] Fila = new Object[9];
TableColumn MiColumna = new TableColumn();
JLabel Etiqueta1 = new JLabel("
JLabel Etiqueta2 = new JLabel("
JButton BotonPensumNueva = new JButton("
JLabel Etiqueta15 = new JLabel("
JButton BotonCambiarPensum = new JButton("
JLabel Etiqueta10 = new JLabel("
JButton BotonEliminarPensum = new JButton("
JLabel Etiqueta11 = new JLabel("
JButton BotonCancelarPensum = new JButton("
");
");
Registrar
");
Cambiar
");
Eliminar
");
Cancelar
//*** Se define el método principal "main" de la Clase Pensum
public static void main(String g[])
{
//*** Se ejecuta el constructor Pensum de la clase Pensum
Pensum p = new Pensum();
p.setVisible(true);
");
");
");
");
//*** Para cerrar la ventana
p.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
}
//*** Inicio del constructor Pensum
Pensum()
{
//*** Se define el título de la ventana
super(new Frame(), "Pensum por carrera", true);
//*** Se define el tamaño de la ventana para el diálogo
setBounds( 0, 0, 800, 500 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
PanelEspacioArriba = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelTabla = new JPanel();
PanelBotones = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelPricipal = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelEspacioArriba.add(Etiqueta1);
while (MiTabla.getRowCount() > 0)
{
MiTabla.removeRow(0);
}
Tabla.setPreferredScrollableViewportSize(new Dimension(750,351));
MiTabla.addColumn("Código carrera");
MiTabla.addColumn("Código asignatura");
MiTabla.addColumn("Nombre asignatura");
MiTabla.addColumn("Semestre");
MiTabla.addColumn("U.C.");
MiTabla.addColumn("Pre-requisito 1");
MiTabla.addColumn("Pre-requisito 2");
MiTabla.addColumn("Pre-requisito 3");
MiTabla.addColumn("Pre-requisito 4");
while (Tabla.getColumnCount() > 9)
{
MiColumna = Tabla.getColumnModel().getColumn(9);
Tabla.removeColumn(MiColumna);
}
//*** Se hace la conexión y se llena la tabla(listado) con los datos.
try
{
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM ASIGNATURAS a, PENSUM b" +
" WHERE a.CodigoAsignatura = b.CodigoAsignatura" +
" ORDER BY b.CodigoCarrera,b.SemestreAsignatura,a.CodigoAsignatura";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
Fila[0] = String.valueOf(rs.getInt("CodigoCarrera"));
Fila[1] = String.valueOf(rs.getInt("CodigoAsignatura"));
Fila[2] = rs.getString("NombreAsignatura");
Fila[3] = String.valueOf(rs.getInt("SemestreAsignatura"));
Fila[4] = String.valueOf(rs.getInt("UCAsignatura"));
Fila[5] = String.valueOf(rs.getInt("CodigoPreRequisito1"));
Fila[6] = String.valueOf(rs.getInt("CodigoPreRequisito2"));
Fila[7] = String.valueOf(rs.getInt("CodigoPreRequisito3"));
Fila[8] = String.valueOf(rs.getInt("CodigoPreRequisito4"));
MiTabla.addRow(Fila);
}
rs.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
PanelTabla.add(scrollPane, BorderLayout.CENTER);
PanelBotones.add(BotonPensumNueva);
PanelBotones.add(Etiqueta15);
PanelBotones.add(BotonCambiarPensum);
PanelBotones.add(Etiqueta10);
PanelBotones.add(BotonEliminarPensum);
PanelBotones.add(Etiqueta11);
PanelBotones.add(BotonCancelarPensum);
BotonPensumNueva.setMnemonic('R');
BotonPensumNueva.setToolTipText("Registrar asignatura a pensum...");
BotonCambiarPensum.setMnemonic('m');
BotonCambiarPensum.setToolTipText("Cambiar asignatura de pensum...");
BotonEliminarPensum.setMnemonic('E');
BotonEliminarPensum.setToolTipText("Eliminar asignatura de pensum...");
BotonCancelarPensum.setMnemonic('C');
BotonCancelarPensum.setToolTipText("Cancelar y salir...");
// *** Se agrega el panel principal al diálogo
PanelPricipal.add(PanelEspacioArriba);
PanelPricipal.add(PanelTabla);
PanelPricipal.add(PanelBotones);
getContentPane().add(PanelPricipal);
//*** Se desactiva maximizar/minimizar
setResizable(false);
// *** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos producidos por los botones del diálogo
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
BotonPensumNueva.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoPensum
nIngresa = true;
nTituloPensum = "Registrar pensum";
DialogoPensum d = new DialogoPensum();
d.setVisible(true);
}
});
BotonCambiarPensum.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoPensum
if (Tabla.getSelectedRow() == -1)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe seleccionar una asignatura de la tabla !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
else
{
PenCodCa = Tabla.getValueAt(Tabla.getSelectedRow(),0).toString();
PenCodAs = Tabla.getValueAt(Tabla.getSelectedRow(),1).toString();
PenSem = Tabla.getValueAt(Tabla.getSelectedRow(),3).toString();
PenPre1 = Tabla.getValueAt(Tabla.getSelectedRow(),5).toString();
PenPre2 = Tabla.getValueAt(Tabla.getSelectedRow(),6).toString();
PenPre3 = Tabla.getValueAt(Tabla.getSelectedRow(),7).toString();
PenPre4 = Tabla.getValueAt(Tabla.getSelectedRow(),8).toString();
nIngresa = false;
nTituloPensum = "Cambiar pensum";
DialogoPensum d = new DialogoPensum();
d.setVisible(true);
}
}
});
BotonEliminarPensum.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
if (Tabla.getSelectedRow() == -1)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe seleccionar una asignatura de la tabla !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
else
{
Toolkit.getDefaultToolkit().beep();
int n = JOptionPane.showConfirmDialog(null,"¿ Quiere eliminar la asignatura seleccionada
?",
"Eliminar...",JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION)
{
//*** Se invoca el método EliminarDatos de la clase ControlPensum
PenCodCa = Tabla.getValueAt(Tabla.getSelectedRow(),0).toString();
PenCodAs = Tabla.getValueAt(Tabla.getSelectedRow(),1).toString();
IntPensum.EliminarDatos(PenCodCa,PenCodAs);
MiTabla.removeRow(Tabla.getSelectedRow());
}
}
}
});
BotonCancelarPensum.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
}
//*** Fin del constructor Pensum
//*** Se definen los métodos necesarios para abrir y cerrar el diálogo
public void actionPerformed(ActionEvent e)
{
Object s = e.getSource();
}
public void CierraVentana()
{
if (MenuAdministrador.nIMEU == true)
{
setVisible(false);
dispose();
}
else
{
setVisible( false );
dispose();
System.exit(0);
}
}
//*** Se crea una nueva clase para crear un diáologo que sirve para ingresar
//*** el código, nombre y número de créditos de la pensum
class DialogoPensum extends JDialog
{
//*** Se crean los componentes necesarios
JLabel EtiquetaCarrera = new JLabel("Carrera :");
JLabel Etiqueta1 = new JLabel("
");
String[] Carrera = {"Ingeniería de Sistemas (236)", "Ingeniería Industrial (280)",
"Administración de Empresas (612)","Contaduría Pública (610)"};
JComboBox ComboCarrera = new JComboBox(Carrera);
JLabel EtiquetaAsignatura = new JLabel("Asignatura :");
JLabel Etiqueta3 = new JLabel(" ");
JLabel Etiqueta4 = new JLabel("
");
JComboBox ComboAsignatura = new JComboBox();
JLabel EtiquetaSemestre = new JLabel("Semestre :");
JLabel Etiqueta5 = new JLabel("
");
JLabel Etiqueta6 = new JLabel("
String[] Semestres = {"1","2","3","4","5","6","7","8","9","10"};
JComboBox ComboSemestre = new JComboBox(Semestres);
JLabel EtiquetaPR1
JLabel Etiqueta7 =
JLabel Etiqueta8 =
JComboBox ComboPR1
JCheckBox CheckPR1
");
= new JLabel("Pre-req 1 :");
new JLabel("
");
new JLabel("
");
= new JComboBox();
= new JCheckBox();
JLabel EtiquetaPR2 = new JLabel("Pre-req 2 :");
JLabel Etiqueta9 = new JLabel("
");
JLabel Etiqueta10 = new JLabel("
");
JComboBox ComboPR2 = new JComboBox();
JCheckBox CheckPR2 = new JCheckBox();
JLabel EtiquetaPR3 = new JLabel("Pre-req 3 :");
JLabel Etiqueta11 = new JLabel("
");
JLabel Etiqueta12 = new JLabel("
JComboBox ComboPR3 = new JComboBox();
JCheckBox CheckPR3 = new JCheckBox();
");
JLabel EtiquetaPR4 = new JLabel("Pre-req 4 :");
JLabel Etiqueta13 = new JLabel("
");
JLabel Etiqueta14 = new JLabel("
");
JComboBox ComboPR4 = new JComboBox();
JCheckBox CheckPR4 = new JCheckBox();
JButton BotonAceptarPen = new JButton("
Aceptar
JLabel Etiqueta15 = new JLabel("
");
JButton BotonCancelarPen = new JButton("
Cancelar
");
");
public DialogoPensum()
{
//*** Se define el título y tamaño de la ventana
super(new Frame(), nTituloPensum, true);
setBounds( 0, 0, 355, 378 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
PanelEspacioArriba = new JPanel();
PanelCarrera = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelAsignatura = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelSemestres = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelPR1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelPR2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelPR3 = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelPR4 = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel Panel1 = new JPanel(new BorderLayout(5,5));
JPanel Panel2 = new JPanel(new BorderLayout(5,5));
JPanel Panel3 = new JPanel(new BorderLayout(5,5));
JPanel PanelBotones = new JPanel(new FlowLayout(FlowLayout.CENTER));
JPanel PanelPricipal = new JPanel(new FlowLayout(FlowLayout.CENTER));
//*** Se hace la conexión y se llena el ComboAsignatura con los
//*** datos de la tabla ASIGNATURA
try
{
int i = 0;
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM ASIGNATURAS ORDER BY CodigoAsignatura";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
String asig = String.valueOf(rs.getInt("CodigoAsignatura"));
ComboAsignatura.addItem(asig);
ComboPR1.addItem(asig);
ComboPR2.addItem(asig);
ComboPR3.addItem(asig);
ComboPR4.addItem(asig);
i = i + 1;
}
rs.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
if (Pensum.nIngresa == false)
{
if (PenCodCa.equals("236"))
ComboCarrera.setSelectedIndex(0);
if (PenCodCa.equals("280"))
ComboCarrera.setSelectedIndex(1);
if (PenCodCa.equals("612"))
ComboCarrera.setSelectedIndex(2);
if (PenCodCa.equals("610"))
ComboCarrera.setSelectedIndex(3);
ComboAsignatura.setSelectedItem(Pensum.PenCodAs);
ComboSemestre.setSelectedItem(Pensum.PenSem);
ComboPR1.setSelectedItem(Pensum.PenPre1);
ComboPR2.setSelectedItem(Pensum.PenPre2);
ComboPR3.setSelectedItem(Pensum.PenPre3);
ComboPR4.setSelectedItem(Pensum.PenPre4);
if (!Pensum.PenPre1.equals("0"))
{
CheckPR1.setSelected(true);
ComboPR1.setEnabled(true);
}
else
{
CheckPR1.setSelected(false);
ComboPR1.setEnabled(false);
}
if (!Pensum.PenPre2.equals("0"))
{
CheckPR2.setSelected(true);
ComboPR2.setEnabled(true);
}
else
{
CheckPR2.setSelected(false);
ComboPR2.setEnabled(false);
}
if (!Pensum.PenPre3.equals("0"))
{
CheckPR3.setSelected(true);
ComboPR3.setEnabled(true);
}
else
{
CheckPR3.setSelected(false);
ComboPR3.setEnabled(false);
}
if (!Pensum.PenPre4.equals("0"))
{
CheckPR4.setSelected(true);
ComboPR4.setEnabled(true);
}
else
{
CheckPR4.setSelected(false);
ComboPR4.setEnabled(false);
}
}
else
{
CheckPR1.setSelected(false);
ComboPR1.setEnabled(false);
CheckPR2.setSelected(false);
ComboPR2.setEnabled(false);
CheckPR3.setSelected(false);
ComboPR3.setEnabled(false);
CheckPR4.setSelected(false);
ComboPR4.setEnabled(false);
}
ComboAsignatura.setMaximumRowCount(4);
ComboSemestre.setMaximumRowCount(3);
ComboPR1.setMaximumRowCount(3);
ComboPR2.setMaximumRowCount(3);
ComboPR3.setMaximumRowCount(3);
ComboPR4.setMaximumRowCount(3);
PanelCarrera.add(EtiquetaCarrera);
PanelCarrera.add(Etiqueta1);
PanelCarrera.add(ComboCarrera);
PanelAsignatura.add(EtiquetaAsignatura);
PanelAsignatura.add(Etiqueta3);
PanelAsignatura.add(ComboAsignatura);
PanelAsignatura.add(Etiqueta4);
PanelSemestres.add(EtiquetaSemestre);
PanelSemestres.add(Etiqueta5);
PanelSemestres.add(ComboSemestre);
PanelSemestres.add(Etiqueta6);
PanelPR1.add(EtiquetaPR1);
PanelPR1.add(Etiqueta7);
PanelPR1.add(ComboPR1);
PanelPR1.add(CheckPR1);
PanelPR1.add(Etiqueta8);
PanelPR2.add(EtiquetaPR2);
PanelPR2.add(Etiqueta9);
PanelPR2.add(ComboPR2);
PanelPR2.add(CheckPR2);
PanelPR2.add(Etiqueta10);
PanelPR3.add(EtiquetaPR3);
PanelPR3.add(Etiqueta11);
PanelPR3.add(ComboPR3);
PanelPR3.add(CheckPR3);
PanelPR3.add(Etiqueta12);
PanelPR4.add(EtiquetaPR4);
PanelPR4.add(Etiqueta13);
PanelPR4.add(ComboPR4);
PanelPR4.add(CheckPR4);
PanelPR4.add(Etiqueta14);
Panel1.add(PanelEspacioArriba, BorderLayout.NORTH);
Panel1.add(PanelCarrera, BorderLayout.CENTER);
Panel1.add(PanelAsignatura, BorderLayout.SOUTH);
Panel2.add(PanelSemestres, BorderLayout.NORTH);
Panel2.add(PanelPR1, BorderLayout.CENTER);
Panel2.add(PanelPR2, BorderLayout.SOUTH);
Panel3.add(PanelPR3, BorderLayout.NORTH);
Panel3.add(PanelPR4, BorderLayout.CENTER);
BotonAceptarPen.setMnemonic('A');
BotonAceptarPen.setToolTipText("Guardar pensum");
BotonCancelarPen.setMnemonic('C');
BotonCancelarPen.setToolTipText("Cancelar y salir");
PanelBotones.add(BotonAceptarPen);
PanelBotones.add(Etiqueta15);
PanelBotones.add(BotonCancelarPen);
PanelPricipal.add(Panel1);
PanelPricipal.add(Panel2);
PanelPricipal.add(Panel3);
PanelPricipal.add(PanelBotones);
getContentPane().add(PanelPricipal);
//*** Para no cambiar el tamaño de la ventana
setResizable(false);
//*** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
CheckPR1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
boolean PR1 = true;
PR1 = CheckPR1.isSelected() ? true : false;
ComboPR1.setEnabled(PR1);
}
});
CheckPR2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
boolean PR2 = false;
PR2 = CheckPR2.isSelected() ? true : false;
ComboPR2.setEnabled(PR2);
}
});
CheckPR3.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
boolean PR3 = false;
PR3 = CheckPR3.isSelected() ? true : false;
ComboPR3.setEnabled(PR3);
}
});
CheckPR4.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
boolean PR4 = false;
PR4 = CheckPR4.isSelected() ? true : false;
ComboPR4.setEnabled(PR4);
}
});
BotonAceptarPen.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
int car = ComboCarrera.getSelectedIndex();
if(car == 0)
PenCodCa = "236";
if(car == 1)
PenCodCa = "280";
if(car == 2)
PenCodCa = "612";
if(car == 3)
PenCodCa = "610";
PenCodAs = ComboAsignatura.getSelectedItem().toString();
PenSem = ComboSemestre.getSelectedItem().toString();
if(CheckPR1.isSelected() == true)
PenPre1 = ComboPR1.getSelectedItem().toString();
else
PenPre1 = "0";
if(CheckPR2.isSelected() == true)
PenPre2 = ComboPR2.getSelectedItem().toString();
else
PenPre2 = "0";
if(CheckPR3.isSelected() == true)
PenPre3 = ComboPR3.getSelectedItem().toString();
else
PenPre3 = "0";
if(CheckPR4.isSelected() == true)
PenPre4 = ComboPR4.getSelectedItem().toString();
else
PenPre4 = "0";
boolean nExisteAsig = false;
if (nIngresa == true)
{
for (int i=0; i<Pensum.MiTabla.getRowCount(); i++)
{
if(PenCodCa.equals(Pensum.MiTabla.getValueAt(i,0).toString()) &&
PenCodAs.equals(Pensum.MiTabla.getValueAt(i,1).toString()))
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ La asignatura " + PenCodAs + " ya existe para este pensum !!","Atención",
JOptionPane.WARNING_MESSAGE);
nExisteAsig = true;
break;
}
}
}
if (nExisteAsig == false)
{
IntPensum.IniciarVariables();
IntPensum.VerificarDatos();
if (nPen == true)
{
nPen = false;
dispose();
}
}
}
});
BotonCancelarPen.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
dispose();
}
});
}
//*** Fin del constructor DialogoPensum
}
//*** Fin de la clase DialogoPensum
}
//***************************************************************************
// Fin Clase Pensum
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: Estudiantes (Crea un diálogo que sirve para ****
//**** ingresar o mostrar los datos de los estudiantes)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//***************************************************************************
// Inicio Clase Estudiantes
//***************************************************************************
public class Estudiantes extends JDialog
{
//*** Se declaran las variables
static
static
static
static
static
static
static
static
boolean nEst = false;
int EstDia;
int EstMes;
int EstAno;
int EstSex;
int EstCar;
int EstCen;
boolean nIngresa = true;
//*** Se crea una instancia IntEstudiantes de la clase ControlEstudiantes para
//*** utilizar los métodos de esta clase y hacer las transacciones con la
//*** tabla ESTUDIANTES de la base de datos
ControlEstudiantes IntEstudiantes = new ControlEstudiantes();
//*** Se crean los componentes necesarios
JLabel NumeroCedula = new JLabel("No. de cédula :");
JLabel Etiqueta1 = new JLabel("
");
static TextField CajaTextoCedula = new TextField(10);
JLabel EtiquetaNombreEstudiante = new JLabel("Nombre estudiante :");
JLabel Etiqueta2 = new JLabel(" ");
static TextField CajaTextoNombreEstudiante = new TextField(35);
JLabel
JLabel
JLabel
static
EtiquetaFechaNacimiento = new JLabel("Fecha nacimiento :");
Etiqueta3 = new JLabel("
");
Etiqueta4 = new JLabel("
");
String[] Dia = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15",
"16","17","18","19","20","21","22","23","24","25","26","27","28",
"29","30","31" };
JComboBox ComboDia = new JComboBox(Dia);
static String[] Mes = {"1","2","3","4","5","6","7","8","9","10","11","12"};
JComboBox ComboMes = new JComboBox(Mes);
static String[] Ano = {"1955","1956","1957","1958","1959","1960","1961","1962","1963","1964",
"1965","1966","1967","1968","1969","1970","1971","1972","1973","1974",
"1975","1976","1977","1978","1979","1980","1981","1982","1983","1984",
"1985","1986","1987","1988","1989","1990","1991","1992","1993","1994",};
JComboBox ComboAno = new JComboBox(Ano);
JLabel EtiquetaSexo = new JLabel("Sexo :");
JLabel Etiqueta5 = new JLabel("
JLabel Etiqueta6 = new JLabel("
static String[] Sexo = {"Masculino","Femenino"};
JComboBox ComboSexo = new JComboBox(Sexo);
");
");
JLabel EtiquetaDireccion = new JLabel("Dirección :");
JLabel Etiqueta7 = new JLabel("
");
static TextField CajaTextoDireccion = new TextField(35);
JLabel
JLabel
JLabel
static
EtiquetaTelefono = new JLabel("Teléfono(s) :");
Etiqueta8 = new JLabel("
");
Etiqueta9 = new JLabel("
");
TextField CajaTextoTelefono = new TextField(25);
JLabel
JLabel
JLabel
static
EtiquetaCorreo = new JLabel("Correo (e-mail) :");
Etiqueta10 = new JLabel("
");
Etiqueta11 = new JLabel("
");
TextField CajaTextoCorreo = new TextField(25);
JLabel
JLabel
JLabel
static
EtiquetaCarrera = new JLabel("Carrera :");
Etiqueta12 = new JLabel("
");
Etiqueta13 = new JLabel("
");
String[] Carrera = {"Ingeniería de Sistemas (236)", "Ingeniería Industrial (280)",
"Administración de Empresas (612)","Contaduría Pública (610)"};
JComboBox ComboCarrera = new JComboBox(Carrera);
JLabel
JLabel
JLabel
static
EtiquetaCentro = new JLabel("Centro local :");
Etiqueta14 = new JLabel("
");
Etiqueta15 = new JLabel("
");
String[] Centro = {"Zona Central","Zona Occidental","Zona Oriental","Zona Sur"};
JComboBox ComboCentro = new JComboBox(Centro);
JButton BotonAceptarEstudiante = new JButton("
JLabel Etiqueta16 = new JLabel("
");
JButton BotonCancelarEstudiante = new JButton("
Aceptar
");
Cancelar
");
//*** Se define el método principal "main" de la Clase Estudiantes
public static void main(String g[])
{
//*** Se ejecuta el constructor Estudiantes de la clase Estudiantes
Estudiantes p = new Estudiantes();
p.setVisible(true);
//*** Para cerrar la ventana
p.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
}
//*** Inicio del constructor Estudiantes
Estudiantes()
{
//*** Se define el título de la ventana
super(new Frame(), "Registrar estudiante", true);
//*** Se define el tamaño de la ventana para el diálogo
setBounds( 0, 0, 450, 460 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
PanelEspacioArriba = new JPanel();
PanelCedulaEstudiante = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelNombreEstudiante = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelFechaNacimiento = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelSexo = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelDireccion = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelTelefono = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelCorreo = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelCarrera = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelCentro = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel
JPanel
JPanel
JPanel
Panel1
Panel2
Panel3
Panel4
=
=
=
=
new
new
new
new
JPanel(new
JPanel(new
JPanel(new
JPanel(new
BorderLayout(5,5));
BorderLayout(5,5));
BorderLayout(5,5));
BorderLayout(5,5));
JPanel PanelBotones = new JPanel(new FlowLayout(FlowLayout.CENTER));
JPanel PanelPricipal = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelCedulaEstudiante.add(NumeroCedula);
PanelCedulaEstudiante.add(Etiqueta1);
PanelCedulaEstudiante.add(CajaTextoCedula);
PanelNombreEstudiante.add(EtiquetaNombreEstudiante);
PanelNombreEstudiante.add(Etiqueta2);
PanelNombreEstudiante.add(CajaTextoNombreEstudiante);
PanelFechaNacimiento.add(EtiquetaFechaNacimiento);
PanelFechaNacimiento.add(Etiqueta3);
PanelFechaNacimiento.add(ComboDia);
PanelFechaNacimiento.add(ComboMes);
PanelFechaNacimiento.add(ComboAno);
PanelFechaNacimiento.add(Etiqueta4);
PanelSexo.add(EtiquetaSexo);
PanelSexo.add(Etiqueta5);
PanelSexo.add(ComboSexo);
PanelSexo.add(Etiqueta6);
PanelDireccion.add(EtiquetaDireccion);
PanelDireccion.add(Etiqueta7);
PanelDireccion.add(CajaTextoDireccion);
PanelTelefono.add(EtiquetaTelefono);
PanelTelefono.add(Etiqueta8);
PanelTelefono.add(CajaTextoTelefono);
PanelTelefono.add(Etiqueta9);
PanelCorreo.add(EtiquetaCorreo);
PanelCorreo.add(Etiqueta10);
PanelCorreo.add(CajaTextoCorreo);
PanelCorreo.add(Etiqueta11);
PanelCarrera.add(EtiquetaCarrera);
PanelCarrera.add(Etiqueta12);
PanelCarrera.add(ComboCarrera);
PanelCarrera.add(Etiqueta13);
PanelCentro.add(EtiquetaCentro);
PanelCentro.add(Etiqueta14);
PanelCentro.add(ComboCentro);
PanelCentro.add(Etiqueta15);
Panel1.add(PanelEspacioArriba, BorderLayout.NORTH);
Panel1.add(PanelCedulaEstudiante, BorderLayout.CENTER);
Panel1.add(PanelNombreEstudiante, BorderLayout.SOUTH);
Panel2.add(PanelDireccion, BorderLayout.NORTH);
Panel2.add(PanelTelefono, BorderLayout.CENTER);
Panel2.add(PanelCorreo, BorderLayout.SOUTH);
Panel3.add(PanelFechaNacimiento, BorderLayout.NORTH);
Panel3.add(PanelSexo, BorderLayout.CENTER);
Panel3.add(PanelCarrera, BorderLayout.SOUTH);
Panel4.add(PanelCentro, BorderLayout.NORTH);
PanelBotones.add(BotonAceptarEstudiante);
PanelBotones.add(Etiqueta16);
PanelBotones.add(BotonCancelarEstudiante);
ComboCentro.setMaximumRowCount(3);
CajaTextoCedula.setEditable(true);
CajaTextoNombreEstudiante.setEditable(true);
CajaTextoDireccion.setEditable(true);
CajaTextoTelefono.setEditable(true);
CajaTextoCorreo.setEditable(true);
ComboCarrera.setEnabled(true);
BotonAceptarEstudiante.setText("
Aceptar
");
BotonAceptarEstudiante.setMnemonic('A');
BotonAceptarEstudiante.setToolTipText("Registrar estudiante...");
if (MenuAdministrador.adsCedula.equals(""))
{
nIngresa = true;
CajaTextoCedula.setText("");
CajaTextoNombreEstudiante.setText("");
ComboDia.setSelectedIndex(0);
ComboMes.setSelectedIndex(0);
ComboAno.setSelectedIndex(0);
ComboSexo.setSelectedIndex(0);
CajaTextoDireccion.setText("");
CajaTextoTelefono.setText("");
CajaTextoCorreo.setText("");
ComboCarrera.setSelectedIndex(0);
ComboCentro.setSelectedIndex(0);
}
else
{
nIngresa = false;
if (IntEstudiantes.BuscarCedula(MenuAdministrador.adsCedula) == true)
{
if (MenuAdministrador.nMEU == false)
{
CajaTextoCedula.setEditable(false);
CajaTextoNombreEstudiante.setEditable(false);
CajaTextoDireccion.setEditable(false);
CajaTextoTelefono.setEditable(false);
CajaTextoCorreo.setEditable(false);
ComboCarrera.setEnabled(true);
BotonAceptarEstudiante.setText("
Eliminar
");
BotonAceptarEstudiante.setMnemonic('E');
BotonAceptarEstudiante.setToolTipText("Eliminar estudiante...");
}
else
ComboCarrera.setEnabled(false);
CajaTextoCedula.setText(MenuAdministrador.adsCedula);
CajaTextoCedula.setEditable(false);
CajaTextoNombreEstudiante.setText(IntEstudiantes.vNombre);
ComboDia.setSelectedIndex(IntEstudiantes.vDia);
ComboMes.setSelectedIndex(IntEstudiantes.vMes);
ComboAno.setSelectedIndex(IntEstudiantes.vAno);
ComboSexo.setSelectedIndex(IntEstudiantes.vSexo);
CajaTextoDireccion.setText(IntEstudiantes.vDireccion);
CajaTextoTelefono.setText(IntEstudiantes.vTelefono);
CajaTextoCorreo.setText(IntEstudiantes.vCorreo);
ComboCarrera.setSelectedIndex(IntEstudiantes.vCarrera);
ComboCentro.setSelectedIndex(IntEstudiantes.vCentro);
}
}
BotonCancelarEstudiante.setMnemonic('C');
BotonCancelarEstudiante.setToolTipText("Cancelar y salir...");
// *** Se agrega el panel principal al diálogo
PanelPricipal.add(Panel1);
PanelPricipal.add(Panel2);
PanelPricipal.add(Panel3);
PanelPricipal.add(Panel4);
PanelPricipal.add(PanelBotones);
getContentPane().add(PanelPricipal);
//*** Se desactiva maximizar/minimizar
setResizable(false);
// *** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos producidos por los botones del diálogo
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
BotonAceptarEstudiante.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
///*******************************
///*** VITAL
****
///*******************************
IntEstudiantes.nControl5 = true;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
if (nIngresa == true)
{
//*** Se invocan los métodos IniciarVariables-VerificarDatos de la
//*** clase ControlEstudiantes
EstDia = ComboDia.getSelectedIndex();
EstMes = ComboMes.getSelectedIndex();
EstAno = ComboAno.getSelectedIndex();
EstSex = ComboSexo.getSelectedIndex();
EstCar = ComboCarrera.getSelectedIndex();
EstCen = ComboCentro.getSelectedIndex();
IntEstudiantes.IniciarVariables();
IntEstudiantes.VerificarDatos();
MenuAdministrador.adsCedula = "";
}
else
{
if (MenuAdministrador.nMEU == true)
{
//*** Se invocan los métodos IniciarVariables-VerificarDatos de la
//*** clase ControlEstudiantes
EstDia = ComboDia.getSelectedIndex();
EstMes = ComboMes.getSelectedIndex();
EstAno = ComboAno.getSelectedIndex();
EstSex = ComboSexo.getSelectedIndex();
EstCar = ComboCarrera.getSelectedIndex();
EstCen = ComboCentro.getSelectedIndex();
IntEstudiantes.IniciarVariables();
IntEstudiantes.VerificarDatos();
MenuAdministrador.adsCedula = "";
}
else
{
Toolkit.getDefaultToolkit().beep();
int n = JOptionPane.showConfirmDialog(null,"¿ Quiere eliminar este estudiante ?",
"Eliminar...",JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION)
{
//*** Se invoca el método EliminarDatos de la clase ControlUsuarios
IntEstudiantes.EliminarDatos(MenuAdministrador.adsCedula);
MenuAdministrador.adsCedula = "";
}
else
{
nEst = true;
MenuAdministrador.adsCedula = "";
}
}
}
MenuAdministrador.nTituloUsuario = "Registrar usuario y contraseña";
if (nEst == true)
{
nEst = false;
CierraVentana();
}
}
});
BotonCancelarEstudiante.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
MenuAdministrador.adsCedula = "";
setTitle("Registrar estudiantes");
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
}
//*** Fin del constructor Estudiantes
//*** Se definen los métodos necesarios para abrir y cerrar el diálogo
public void actionPerformed(ActionEvent e)
{
Object s = e.getSource();
}
public void CierraVentana()
{
if (MenuAdministrador.nIMEU == true || MenuEstudiante.nIMEU == true)
{
setVisible(false);
dispose();
}
else
{
setVisible( false );
dispose();
System.exit(0);
}
}
}
//***************************************************************************
// Fin Clase Estudiantes
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: Historico (Crea un diálogo que sirve para
****
//**** ingresar, cambiar, eliminar o mostrar las calificaciones del
****
//**** histórico de los estudiantes)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import
import
import
import
import
import
import
java.io.*;
java.sql.*;
java.awt.*;
java.awt.event.*;
javax.swing.*;
java.text.*;
javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
//***************************************************************************
// Inicio Clase Historico
//***************************************************************************
public class Historico extends JDialog
{
//*** Se declaran las variables
static boolean nHis = false;
static
static
static
static
static
static
String HisCedula;
int HisCar;
int HisCen;
String HisAsiH;
String HisCalH;
String HisLapH;
static double HisIndice = 0;
static double HisTCreditos = 0;
static double HisUCXCAL = 0;
NumberFormat nf;
static boolean nIngresa = true;
static String nTituloHistorico = "Registrar calificación estudiante";
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se crea una instancia IntHistorico de la clase ControlHistorico para
//*** utilizar los métodos de esta clase y hacer las transacciones con la
//*** tabla HISTORICO de la base de datos
ControlHistorico IntHistorico = new ControlHistorico();
//*** Se crean los componentes necesarios
JLabel NumeroCedula = new JLabel("No. de cédula :");
JLabel Etiqueta1 = new JLabel("
");
static TextField CajaTextoCedula = new TextField(10);
JLabel EtiquetaNombreEstudiante = new JLabel("Nombre estudiante :");
JLabel Etiqueta2 = new JLabel(" ");
static TextField CajaTextoNombreEstudiante = new TextField(35);
JLabel
JLabel
JLabel
static
EtiquetaCarrera = new JLabel("Carrera :");
Etiqueta3 = new JLabel("
");
Etiqueta4 = new JLabel("
");
TextField CajaTextoCarrera = new TextField(25);
JLabel
JLabel
JLabel
static
EtiquetaCentroLocal = new JLabel("Centro Local :");
Etiqueta5 = new JLabel("
");
Etiqueta6 = new JLabel("
");
TextField CajaTextoCentro = new TextField(25);
JLabel
JLabel
JLabel
static
EtiquetaIndice = new JLabel("Índice académico :
Etiqueta7 = new JLabel("
Etiqueta8 = new JLabel("
TextField CajaTextoIndice = new TextField(10);
static
static
static
static
static
DefaultTableModel MiTabla = new DefaultTableModel();
JTable Tabla = new JTable(MiTabla);
JScrollPane scrollPane = new JScrollPane(Tabla);
Object [] Fila = new Object[6];
TableColumn MiColumna = new TableColumn();
JButton BotonCalificacionNueva = new JButton("
JLabel Etiqueta9 = new JLabel("
");
JButton BotonCambiarCalificacion = new JButton("
JLabel Etiqueta10 = new JLabel("
");
JButton BotonEliminarCalificacion = new JButton("
");
");
");
Registrar
");
Cambiar
");
Eliminar
");
JLabel Etiqueta11 = new JLabel("
");
JButton BotonCancelarCalificacion = new JButton("
Cancelar
");
//*** Se define el método principal "main" de la Clase Historico
public static void main(String g[])
{
//*** Se ejecuta el constructor Historico de la clase Historico
Historico p = new Historico();
p.setVisible(true);
//*** Para cerrar la ventana
p.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
}
//*** Inicio del constructor Historico
Historico()
{
//*** Se define el título de la ventana
super(new Frame(), "Histórico de calificaciones del estudiante", true);
//*** Se define el tamaño de la ventana para el diálogo
setBounds( 0, 0, 650, 460 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
PanelEspacioArriba = new JPanel();
PanelCedulaHistorico = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelNombreHistorico = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelCarrera = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelCentroLocal = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelTabla = new JPanel();
JPanel
JPanel
JPanel
JPanel
Panel1
Panel2
Panel3
Panel4
=
=
=
=
new
new
new
new
JPanel(new
JPanel(new
JPanel(new
JPanel(new
BorderLayout(5,5));
BorderLayout(5,5));
BorderLayout(5,5));
BorderLayout(5,5));
JPanel PanelBotones = new JPanel(new FlowLayout(FlowLayout.CENTER));
JPanel PanelPricipal = new JPanel(new FlowLayout(FlowLayout.CENTER));
CajaTextoCedula.setEditable(false);
CajaTextoCedula.setText(MenuAdministrador.adsCedula2);
PanelCedulaHistorico.add(NumeroCedula);
PanelCedulaHistorico.add(Etiqueta1);
PanelCedulaHistorico.add(CajaTextoCedula);
CajaTextoNombreEstudiante.setEditable(false);
CajaTextoNombreEstudiante.setText(IntHistorico.vNombre);
PanelNombreHistorico.add(EtiquetaNombreEstudiante);
PanelNombreHistorico.add(Etiqueta2);
PanelNombreHistorico.add(CajaTextoNombreEstudiante);
CajaTextoCarrera.setEditable(false);
CajaTextoCarrera.setText(IntHistorico.CarreraH);
PanelCarrera.add(EtiquetaCarrera);
PanelCarrera.add(Etiqueta3);
PanelCarrera.add(CajaTextoCarrera);
PanelCarrera.add(Etiqueta4);
CajaTextoCentro.setEditable(false);
CajaTextoCentro.setText(IntHistorico.CentroH);
PanelCentroLocal.add(EtiquetaCentroLocal);
PanelCentroLocal.add(Etiqueta5);
PanelCentroLocal.add(CajaTextoCentro);
PanelCentroLocal.add(Etiqueta6);
Panel1.add(PanelEspacioArriba, BorderLayout.NORTH);
Panel1.add(PanelCedulaHistorico, BorderLayout.CENTER);
Panel1.add(PanelNombreHistorico, BorderLayout.SOUTH);
Panel2.add(PanelCarrera, BorderLayout.NORTH);
Panel2.add(PanelCentroLocal, BorderLayout.CENTER);
while (MiTabla.getRowCount() > 0)
{
MiTabla.removeRow(0);
}
Tabla.setPreferredScrollableViewportSize(new Dimension(590,175));
MiTabla.addColumn("Código");
MiTabla.addColumn("Asignatura");
MiTabla.addColumn("Semestre");
MiTabla.addColumn("U.C.");
MiTabla.addColumn("Calificación");
MiTabla.addColumn("Lapso");
while (Tabla.getColumnCount() > 6)
{
MiColumna = Tabla.getColumnModel().getColumn(6);
Tabla.removeColumn(MiColumna);
}
HisUCXCAL = 0;
HisTCreditos = 0;
HisIndice = 0;
//*** Para formato 1.000,00
nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
//*** Se hace la conexión y se llena la tabla(listado) con los datos.
try
{
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM HISTORICO a, ASIGNATURAS b, PENSUM c" +
" WHERE a.CodigoAsignatura = b.CodigoAsignatura AND a.CodigoAsignatura =
c.CodigoAsignatura" +
" ORDER BY c.SemestreAsignatura,a.LapsoAsignatura,a.CodigoAsignatura";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
String ced = String.valueOf(rs.getInt("CedulaEstudiante"));
String cod = String.valueOf(rs.getInt("CodigoCarrera"));
if(ced.equals(MenuAdministrador.adsCedula2) &&
cod.equals(String.valueOf(IntHistorico.vCarrera)) ||
ced.equals(MenuEstudiante.adsCedula) &&
cod.equals(String.valueOf(IntHistorico.vCarrera)))
{
Fila[0] = String.valueOf(rs.getInt("CodigoAsignatura"));
Fila[1] = rs.getString("NombreAsignatura");
Fila[2] = String.valueOf(rs.getInt("SemestreAsignatura"));
Fila[3] = String.valueOf(rs.getInt("UCAsignatura"));
Fila[4] = String.valueOf(rs.getInt("CalificacionAsignatura"));
Fila[5] = rs.getString("LapsoAsignatura");
MiTabla.addRow(Fila);
HisUCXCAL = HisUCXCAL + (Double.parseDouble(Fila[3].toString()) *
Double.parseDouble(Fila[4].toString()));
HisTCreditos = HisTCreditos + Double.parseDouble(Fila[3].toString());
}
}
rs.close();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
PanelTabla.add(scrollPane, BorderLayout.CENTER);
if(MenuAdministrador.nMEU == true)
{
PanelBotones.add(BotonCalificacionNueva);
PanelBotones.add(Etiqueta9);
PanelBotones.add(BotonCambiarCalificacion);
PanelBotones.add(Etiqueta10);
PanelBotones.add(BotonEliminarCalificacion);
PanelBotones.add(Etiqueta11);
PanelBotones.add(BotonCancelarCalificacion);
BotonCalificacionNueva.setMnemonic('R');
BotonCalificacionNueva.setToolTipText("Registrar calificación...");
BotonCambiarCalificacion.setMnemonic('m');
BotonCambiarCalificacion.setToolTipText("Cambiar calificación...");
BotonEliminarCalificacion.setMnemonic('E');
BotonEliminarCalificacion.setToolTipText("Eliminar calificación...");
BotonCancelarCalificacion.setText("
Cancelar
");
BotonCancelarCalificacion.setMnemonic('C');
BotonCancelarCalificacion.setToolTipText("Cancelar y salir...");
}
else
{
if (HisUCXCAL == 0 && HisTCreditos == 0)
HisIndice = 0;
else
HisIndice = HisUCXCAL / HisTCreditos;
CajaTextoIndice.setEditable(false);
CajaTextoIndice.setText(nf.format(HisIndice));
PanelBotones.add(EtiquetaIndice);
PanelBotones.add(CajaTextoIndice);
PanelBotones.add(Etiqueta7);
PanelBotones.add(Etiqueta8);
PanelBotones.add(BotonCancelarCalificacion);
BotonCancelarCalificacion.setText("
Aceptar
");
BotonCancelarCalificacion.setMnemonic('A');
BotonCancelarCalificacion.setToolTipText("Salir de la consulta");
}
// *** Se agrega el panel principal al diálogo
PanelPricipal.add(Panel1);
PanelPricipal.add(Panel2);
PanelPricipal.add(PanelTabla);
PanelPricipal.add(PanelBotones);
getContentPane().add(PanelPricipal);
//*** Se desactiva maximizar/minimizar
setResizable(false);
// *** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos producidos por los botones del diálogo
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
BotonCalificacionNueva.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoCalificacion
nIngresa = true;
nTituloHistorico = "Registrar calificación estudiante";
DialogoCalificacion d = new DialogoCalificacion();
d.setVisible(true);
}
});
BotonCambiarCalificacion.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se crea una instancia de la clase DialogoCalificacion
if (Tabla.getSelectedRow() == -1)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe seleccionar una asignatura de la tabla !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
else
{
HisCedula
HisAsiH =
HisCalH =
HisLapH =
= CajaTextoCedula.getText();
Tabla.getValueAt(Tabla.getSelectedRow(),0).toString();
Tabla.getValueAt(Tabla.getSelectedRow(),4).toString();
Tabla.getValueAt(Tabla.getSelectedRow(),5).toString();
nIngresa = false;
nTituloHistorico = "Cambiar calificación estudiante";
DialogoCalificacion d = new DialogoCalificacion();
d.setVisible(true);
}
}
});
BotonEliminarCalificacion.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
if (Tabla.getSelectedRow() == -1)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe seleccionar una asignatura de la tabla !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
else
{
Toolkit.getDefaultToolkit().beep();
int n = JOptionPane.showConfirmDialog(null,"¿ Quiere eliminar la asignatura y
calificación seleccionada ?",
"Eliminar...",JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION)
{
//*** Se invoca el método EliminarDatos de la clase ControlHistorico
HisCedula = CajaTextoCedula.getText();
HisAsiH = Tabla.getValueAt(Tabla.getSelectedRow(),0).toString();
HisCalH = Tabla.getValueAt(Tabla.getSelectedRow(),4).toString();
HisLapH = Tabla.getValueAt(Tabla.getSelectedRow(),5).toString();
IntHistorico.EliminarDatos(HisCedula,HisAsiH,HisCalH,HisLapH);
MiTabla.removeRow(Tabla.getSelectedRow());
}
}
}
});
BotonCancelarCalificacion.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
}
//*** Fin del constructor Historico
//*** Se definen los métodos necesarios para abrir y cerrar el diálogo
public void actionPerformed(ActionEvent e)
{
Object s = e.getSource();
}
public void CierraVentana()
{
if (MenuAdministrador.nIMEU == true || MenuEstudiante.nIMEU == true)
{
setVisible(false);
dispose();
}
else
{
setVisible( false );
dispose();
System.exit(0);
}
}
//*** Se crea una nueva clase para crear un diáologo que sirve para ingresar
//*** código asignatura, la calificación del estudiante y lapso
class DialogoCalificacion extends JDialog
{
//*** Se crean los componentes necesarios
JLabel EtiquetaAsignatura = new JLabel("Código asignatura :");
JLabel Etiqueta1 = new JLabel(" ");
JLabel Etiqueta2 = new JLabel("
");
JComboBox ComboAsignatura = new JComboBox();
JLabel EtiquetaCalificacion = new JLabel("Calificación :");
JLabel Etiqueta3 = new JLabel("
");
JLabel Etiqueta4 = new JLabel(" ");
String[] Calificacion = {"1","2","3","4","5","6","7","8","9","10"};
JComboBox ComboCalificacion = new JComboBox(Calificacion);
JLabel EtiquetaLapso =
JLabel Etiqueta5 = new
JLabel Etiqueta6 = new
JComboBox ComboLapso =
new JLabel("Lapso :");
JLabel("
JLabel("
new JComboBox();
JButton BotonAceptarCal = new JButton("
JLabel Etiqueta9 = new JLabel("
");
JButton BotonCancelarCal = new JButton("
");
");
Aceptar
Cancelar
");
");
public DialogoCalificacion()
{
//*** Se define el título y tamaño de la ventana
super(new Frame(), nTituloHistorico, true);
setBounds( 0, 0, 300, 228 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
PanelEspacioArriba = new JPanel();
PanelAsignatura = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelCalificacion = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelLapso = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel Panel1 = new JPanel(new BorderLayout(5,5));
JPanel Panel2 = new JPanel(new BorderLayout(5,5));
JPanel PanelBotones = new JPanel(new FlowLayout(FlowLayout.CENTER));
JPanel PanelPricipal = new JPanel(new FlowLayout(FlowLayout.CENTER));
//*** Se hace la conexión y se llena el ComboAsignatura con los
//*** datos de la tabla ASIGNATURA de la base de datos
try
{
int i = 0;
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM PENSUM ORDER BY CodigoAsignatura";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
String car = "";
if (Historico.CajaTextoCarrera.getText().equals("Ingeniería de Sistemas (236)"))
car = "236";
if (Historico.CajaTextoCarrera.getText().equals("Ingeniería Industrial (280)"))
car = "280";
if (Historico.CajaTextoCarrera.getText().equals("Administración de Empresas (612)"))
car = "612";
if (Historico.CajaTextoCarrera.getText().equals("Contaduría Pública (610)"))
car = "610";
if (rs.getString("CodigoCarrera").equals(car))
{
String asig = String.valueOf(rs.getInt("CodigoAsignatura"));
ComboAsignatura.addItem(asig);
i = i + 1;
}
}
rs.close();
nConectaB.close();
for(int j = 1990; j < 2011; j ++)
{
ComboLapso.addItem(String.valueOf(j) + "-1");
ComboLapso.addItem(String.valueOf(j) + "-2");
}
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
if (Historico.nIngresa == false)
{
ComboAsignatura.setSelectedItem(HisAsiH);
ComboCalificacion.setSelectedItem(HisCalH);
ComboLapso.setSelectedItem(HisLapH);
}
PanelAsignatura.add(EtiquetaAsignatura);
PanelAsignatura.add(Etiqueta1);
PanelAsignatura.add(ComboAsignatura);
PanelAsignatura.add(Etiqueta2);
PanelCalificacion.add(EtiquetaCalificacion);
PanelCalificacion.add(Etiqueta3);
PanelCalificacion.add(ComboCalificacion);
PanelCalificacion.add(Etiqueta4);
PanelLapso.add(EtiquetaLapso);
PanelLapso.add(Etiqueta5);
PanelLapso.add(ComboLapso);
PanelLapso.add(Etiqueta6);
Panel1.add(PanelEspacioArriba, BorderLayout.NORTH);
Panel1.add(PanelAsignatura, BorderLayout.CENTER);
Panel1.add(PanelCalificacion, BorderLayout.SOUTH);
Panel2.add(PanelLapso, BorderLayout.NORTH);
BotonAceptarCal.setMnemonic('A');
BotonAceptarCal.setToolTipText("Guardar calificación");
BotonCancelarCal.setMnemonic('C');
BotonCancelarCal.setToolTipText("Cancelar y salir");
PanelBotones.add(BotonAceptarCal);
PanelBotones.add(Etiqueta9);
PanelBotones.add(BotonCancelarCal);
PanelPricipal.add(Panel1);
PanelPricipal.add(Panel2);
PanelPricipal.add(PanelBotones);
getContentPane().add(PanelPricipal);
//*** Para no cambiar el tamaño de la ventana
setResizable(false);
//*** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
BotonAceptarCal.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
///*******************************
///*** VITAL
****
///*******************************
IntHistorico.nControl7 = true;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
HisAsiH = ComboAsignatura.getSelectedItem().toString();
HisCalH = ComboCalificacion.getSelectedItem().toString();
HisLapH = ComboLapso.getSelectedItem().toString();
IntHistorico.IniciarVariables();
IntHistorico.VerificarDatos();
dispose();
}
});
BotonCancelarCal.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
dispose();
}
});
}
//*** Fin del constructor DialogoCalificacion
}
//*** Fin de la clase DialogoCalificacion
}
//***************************************************************************
// Fin Clase Historico
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: Inscripciones (Crea un diálogo que sirve
****
//**** para ingresar, eliminar o mostrar las asignaturas selecionadas
****
//**** por el estudiante para la inscripción)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import
import
import
import
import
import
import
import
import
java.io.*;
java.sql.*;
java.awt.*;
java.awt.event.*;
javax.swing.*;
java.text.*;
java.util.Date;
javax.swing.table.DefaultTableModel;
javax.swing.table.TableColumn;
//***************************************************************************
// Inicio Clase Inscripciones
//***************************************************************************
public class Inscripciones extends JDialog
{
//*** Se declaran las variables
static boolean nInc = false;
static int IncCreditos = 0;
static int IncArancel = 0;
static NumberFormat nf;
String
String
String
String
Dia =
Mes =
Ano =
fecha
static
static
static
static
static
String
String
String
String
String
"";
"";
"";
= String.valueOf(new Date());
IntCod;
IntAsi;
IntSem;
IntUC;
IntLapso;
static boolean nIngresa = true;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se crea una instancia IntInscripciones de la clase ControlInscripciones para
//*** utilizar los métodos de esta clase y hacer las transacciones con la
//*** tabla INSCRIPCIONES de la base de datos
ControlInscripciones IntInscripciones = new ControlInscripciones();
JLabel Etiqueta0 = new JLabel("
");
JLabel ICedula = new JLabel("No. de cédula : ");
JLabel Etiqueta1 = new JLabel(" ");
static TextField CajaTextoICedula = new TextField(10);
JLabel ICentro = new JLabel("Centro local : ");
JLabel Etiqueta2 = new JLabel(" ");
static TextField CajaTextoICentro = new TextField(20);
JLabel ICarrera = new JLabel("Carrera : ");
JLabel Etiqueta3 = new JLabel(" ");
static TextField CajaTextoICarrera = new TextField(30);
JLabel INombre = new JLabel("Nombre
: ");
JLabel Etiqueta4 = new JLabel(" ");
static TextField CajaTextoINombre = new TextField(47);
JLabel ILapso = new JLabel("Lapso
: ");
JLabel Etiqueta5 = new JLabel(" ");
static TextField CajaTextoILapso = new TextField(10);
static
static
static
static
static
DefaultTableModel MiTabla1 = new DefaultTableModel();
JTable Tabla1 = new JTable(MiTabla1);
JScrollPane scrollPane1 = new JScrollPane(Tabla1);
Object [] Fila1 = new Object[4];
TableColumn MiColumna1 = new TableColumn();
static
static
static
static
static
DefaultTableModel MiTabla2 = new DefaultTableModel();
JTable Tabla2 = new JTable(MiTabla2);
JScrollPane scrollPane2 = new JScrollPane(Tabla2);
Object [] Fila2 = new Object[5];
TableColumn MiColumna2 = new TableColumn();
JLabel
JLabel
JLabel
JLabel
static
JLabel
static
Etiqueta6 = new JLabel("
Etiqueta7 = new JLabel("
Etiqueta8 = new JLabel("
TotalCreditos = new JLabel("Total créditos : ");
TextField CajaTextoCreditos = new TextField(10);
TotalAranceles = new JLabel("Total aranceles : ");
TextField CajaTextoAranceles = new TextField(10);
");
");
");
JButton BotonGuardarInscripcion = new JButton("
Guardar
");
JLabel Etiqueta11 = new JLabel("
");
JButton BotonAdicionarMateria = new JButton("
Añadir
");
JLabel Etiqueta12 = new JLabel("
");
JButton BotonQuitarMateria = new JButton("
Quitar
");
JLabel Etiqueta13 = new JLabel("
");
JButton BotonCancelarInscripciones = new JButton("
Cancelar
");
//*** Se define el método principal "main" de la Clase Inscripciones
public static void main(String g[])
{
//*** Se ejecuta el constructor Inscripciones de la clase Inscripciones
Inscripciones p = new Inscripciones();
p.setVisible(true);
//*** Para cerrar la ventana
p.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
}
//*** Inicio del constructor Inscripciones
Inscripciones()
{
//*** Se define el título de la ventana
super(new Frame(), "Inscripción regular", true);
//*** Se define el tamaño de la ventana para el diálogo
setBounds( 0, 0, 800, 535 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
PanelEspacioArriba = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelI1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelI2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
Panel1 = new JPanel(new GridLayout(3,1,2,2));
PanelTablas = new JPanel(new GridLayout(2,1,15,10));
PanelAranceles = new JPanel(new FlowLayout(FlowLayout.RIGHT));
PanelBotones = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelPricipal = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelEspacioArriba.add(Etiqueta0);
CajaTextoICedula.setEditable(false);
CajaTextoICedula.setText(MenuAdministrador.adsCedula3);
CajaTextoICentro.setEditable(false);
CajaTextoICentro.setText(IntInscripciones.vCentro);
CajaTextoICarrera.setEditable(false);
CajaTextoICarrera.setText(IntInscripciones.vCarrera);
PanelI1.add(ICedula);
PanelI1.add(CajaTextoICedula);
PanelI1.add(Etiqueta1);
PanelI1.add(ICentro);
PanelI1.add(CajaTextoICentro);
PanelI1.add(Etiqueta2);
PanelI1.add(ICarrera);
PanelI1.add(CajaTextoICarrera);
CajaTextoINombre.setEditable(false);
CajaTextoINombre.setText(IntInscripciones.vNombre);
CajaTextoILapso.setEditable(false);
Mes = fecha.substring(4,7);
Dia = fecha.substring(8,10);
Ano = fecha.substring(fecha.length() - 4, fecha.length());
if (Mes.equals("Jan") || Mes.equals("Feb") || Mes.equals("Mar") || Mes.equals("Apr") ||
Mes.equals("May") || Mes.equals("Jun"))
{
IntLapso = Ano + "-1";
CajaTextoILapso.setText(IntLapso);
}
else
{
IntLapso = Ano + "-2";
CajaTextoILapso.setText(IntLapso);
}
PanelI2.add(INombre);
PanelI2.add(CajaTextoINombre);
PanelI2.add(Etiqueta4);
PanelI2.add(ILapso);
PanelI2.add(CajaTextoILapso);
Panel1.add(PanelEspacioArriba, BorderLayout.CENTER);
Panel1.add(PanelI1, BorderLayout.CENTER);
Panel1.add(PanelI2, BorderLayout.CENTER);
//*** TABLA1 ***
while (MiTabla1.getRowCount() > 0)
{
MiTabla1.removeRow(0);
}
Tabla1.setPreferredScrollableViewportSize(new Dimension(735,127));
MiTabla1.addColumn("Código asignatura");
MiTabla1.addColumn("Nombre asignatura");
MiTabla1.addColumn("Semestre");
MiTabla1.addColumn("U.C.");
while (Tabla1.getColumnCount() > 4)
{
MiColumna1 = Tabla1.getColumnModel().getColumn(4);
Tabla1.removeColumn(MiColumna1);
}
//*** Se hace la conexión y se llena la tabla (listado) con los datos.
try
{
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM ASIGNATURAS a, PENSUM b" +
" WHERE a.CodigoAsignatura = b.CodigoAsignatura" +
" ORDER BY b.CodigoCarrera,b.SemestreAsignatura,a.CodigoAsignatura";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
boolean nPrerequisito1 = false;
boolean nPrerequisito2 = false;
boolean nPrerequisito3 = false;
boolean nPrerequisito4 = false;
while (rs.next())
{
int cod = rs.getInt("CodigoCarrera");
if(cod == IntInscripciones.car)
{
int cod1 = rs.getInt("CodigoPreRequisito1");
int cod2 = rs.getInt("CodigoPreRequisito2");
int cod3 = rs.getInt("CodigoPreRequisito3");
int cod4 = rs.getInt("CodigoPreRequisito4");
if (cod1 > 0)
{
if ((IntInscripciones.BuscarCalificacion(MenuAdministrador.adsCedula3,cod1) ==
true &&
MenuEstudiante.adsCedula == "") ||
(IntInscripciones.BuscarCalificacion(MenuEstudiante.adsCedula,cod1) == true
&&
MenuAdministrador.adsCedula3 == ""))
nPrerequisito1 = true;
else
nPrerequisito1 = false;
}
else
{
nPrerequisito1 = true;
}
if (cod2 > 0)
{
if ((IntInscripciones.BuscarCalificacion(MenuAdministrador.adsCedula3,cod2) ==
true &&
MenuEstudiante.adsCedula == "") ||
(IntInscripciones.BuscarCalificacion(MenuEstudiante.adsCedula,cod2) == true
&&
MenuAdministrador.adsCedula3 == ""))
nPrerequisito2 = true;
else
nPrerequisito2 = false;
}
else
{
nPrerequisito2 = true;
}
if (cod3 > 0)
{
if ((IntInscripciones.BuscarCalificacion(MenuAdministrador.adsCedula3,cod3) ==
true &&
MenuEstudiante.adsCedula == "") ||
(IntInscripciones.BuscarCalificacion(MenuEstudiante.adsCedula,cod3) == true
&&
MenuAdministrador.adsCedula3 == ""))
nPrerequisito3 = true;
else
nPrerequisito3 = false;
}
else
{
nPrerequisito3 = true;
}
if (cod4 > 0)
{
if ((IntInscripciones.BuscarCalificacion(MenuAdministrador.adsCedula3,cod4) ==
true &&
MenuEstudiante.adsCedula == "") ||
(IntInscripciones.BuscarCalificacion(MenuEstudiante.adsCedula,cod4) == true
&&
MenuAdministrador.adsCedula3 == ""))
nPrerequisito4 = true;
else
nPrerequisito4 = false;
}
else
{
nPrerequisito4 = true;
}
if (nPrerequisito1 == true && nPrerequisito2 == true && nPrerequisito3 == true &&
nPrerequisito4 == true)
{
Fila1[0] = String.valueOf(rs.getInt("CodigoAsignatura"));
Fila1[1] = rs.getString("NombreAsignatura");
Fila1[2] = String.valueOf(rs.getInt("SemestreAsignatura"));
Fila1[3] = String.valueOf(rs.getInt("UCAsignatura"));
String cod5 = Fila1[0].toString();
int cod6 = Integer.parseInt(cod5);
if ((IntInscripciones.BuscarCalificacion(MenuAdministrador.adsCedula3,cod6) ==
false &&
MenuEstudiante.adsCedula == "") ||
(IntInscripciones.BuscarCalificacion(MenuEstudiante.adsCedula,cod6) == false
&&
MenuAdministrador.adsCedula3 == ""))
MiTabla1.addRow(Fila1);
}
}
}
rs.close();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
//*** TABLA2 ***
while (MiTabla2.getRowCount() > 0)
{
MiTabla2.removeRow(0);
}
Tabla2.setPreferredScrollableViewportSize(new Dimension(735,127));
MiTabla2.addColumn("Código");
MiTabla2.addColumn("Asignatura");
MiTabla2.addColumn("Semestre");
MiTabla2.addColumn("U.C.");
MiTabla2.addColumn("Arancel");
while (Tabla2.getColumnCount() > 5)
{
MiColumna2 = Tabla2.getColumnModel().getColumn(5);
Tabla2.removeColumn(MiColumna2);
}
IncCreditos = 0;
IncArancel = 0;
//*** Para formato 1.000,00
nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
//*** Se hace la conexión y se llena la tabla (listado) con los datos.
try
{
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM INSCRIPCIONES a, ASIGNATURAS b, PENSUM c" +
" WHERE a.CodigoAsignatura = b.CodigoAsignatura AND a.CodigoAsignatura =
c.CodigoAsignatura" +
" AND a.CodigoCarrera = c.CodigoCarrera" +
" ORDER BY c.CodigoAsignatura";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
String ced = String.valueOf(rs.getInt("CedulaEstudiante"));
String lap = rs.getString("LapsoInscripcion");
if(ced.equals(MenuAdministrador.adsCedula3) && lap.equals(IntLapso) ||
ced.equals(MenuEstudiante.adsCedula) && lap.equals(IntLapso))
{
Fila2[0] = String.valueOf(rs.getInt("CodigoAsignatura"));
Fila2[1] = rs.getString("NombreAsignatura");
Fila2[2] = String.valueOf(rs.getInt("SemestreAsignatura"));
Fila2[3] = String.valueOf(rs.getInt("UCAsignatura"));
Fila2[4] = "1.000,00";
MiTabla2.addRow(Fila2);
IncCreditos = IncCreditos + Integer.parseInt(Fila2[3].toString());
IncArancel = IncArancel + 1000;
}
}
rs.close();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
CajaTextoCreditos.setText(nf.format(IncCreditos));
CajaTextoAranceles.setText(nf.format(IncArancel));
PanelTablas.add(scrollPane1, BorderLayout.CENTER);
PanelTablas.add(scrollPane2, BorderLayout.CENTER);
PanelTablas.add(PanelAranceles, BorderLayout.CENTER);
CajaTextoCreditos.setEditable(false);
CajaTextoAranceles.setEditable(false);
PanelAranceles.add(Etiqueta6);
PanelAranceles.add(Etiqueta7);
PanelAranceles.add(TotalCreditos);
PanelAranceles.add(CajaTextoCreditos);
PanelAranceles.add(Etiqueta8);
PanelAranceles.add(TotalAranceles);
PanelAranceles.add(CajaTextoAranceles);
PanelBotones.add(BotonGuardarInscripcion);
PanelBotones.add(Etiqueta11);
PanelBotones.add(BotonAdicionarMateria);
PanelBotones.add(Etiqueta12);
PanelBotones.add(BotonQuitarMateria);
PanelBotones.add(Etiqueta13);
PanelBotones.add(BotonCancelarInscripciones);
BotonGuardarInscripcion.setMnemonic('G');
BotonGuardarInscripcion.setToolTipText("Guardar selección de asignaturas");
BotonAdicionarMateria.setMnemonic('A');
BotonAdicionarMateria.setToolTipText("Añadir una asignatura");
BotonQuitarMateria.setMnemonic('Q');
BotonQuitarMateria.setToolTipText("Quitar una asignatura");
BotonCancelarInscripciones.setMnemonic('C');
BotonCancelarInscripciones.setToolTipText("Cancelar y salir...");
// *** Se agrega el panel principal al diálogo
PanelPricipal.add(Panel1);
PanelPricipal.add(PanelTablas);
PanelPricipal.add(PanelAranceles);
PanelPricipal.add(PanelBotones);
getContentPane().add(PanelPricipal);
//*** Se desactiva maximizar/minimizar
setResizable(false);
// *** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos producidos por los botones del diálogo
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
BotonGuardarInscripcion.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
///*******************************
///*** VITAL
****
///*******************************
IntInscripciones.nControl10 = true;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlValidaciones.nControl12 = false;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
IntInscripciones.IniciarVariables();
IntInscripciones.VerificarDatos();
if (nInc == true)
{
nInc = false;
CierraVentana();
}
}
});
BotonAdicionarMateria.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
if (Tabla1.getSelectedRow() == -1)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe seleccionar una asignatura de la tabla 1 !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
else
{
IntCod = Tabla1.getValueAt(Tabla1.getSelectedRow(),0).toString();
IntAsi = Tabla1.getValueAt(Tabla1.getSelectedRow(),1).toString();
IntSem = Tabla1.getValueAt(Tabla1.getSelectedRow(),2).toString();
IntUC = Tabla1.getValueAt(Tabla1.getSelectedRow(),3).toString();
boolean nExisteAsig = false;
for (int i=0; i<MiTabla2.getRowCount(); i++)
{
if(IntCod.equals(MiTabla2.getValueAt(i,0).toString()))
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ La asignatura " + IntCod + " ya fue seleccionada !!","Atención",
JOptionPane.WARNING_MESSAGE);
nExisteAsig = true;
break;
}
}
if (nExisteAsig == false)
{
IncCreditos = IncCreditos + Integer.parseInt(IntUC);
IncArancel = IncArancel + 1000;
if (IncCreditos > 21)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Sólo se permite inscribir un máximo de 21 créditos !!","Atención",
JOptionPane.WARNING_MESSAGE);
IncCreditos = IncCreditos - Integer.parseInt(IntUC);
IncArancel = IncArancel - 1000;
}
else
{
Fila2[0] = IntCod;
Fila2[1] = IntAsi;
Fila2[2] = IntSem;
Fila2[3] = IntUC;
Fila2[4] = "1.000,00";
MiTabla2.addRow(Fila2);
CajaTextoCreditos.setText(nf.format(IncCreditos));
CajaTextoAranceles.setText(nf.format(IncArancel));
}
}
}
}
});
BotonQuitarMateria.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
if (Tabla2.getSelectedRow() == -1)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe seleccionar una asignatura de la tabla 2 !!","Atención",
JOptionPane.WARNING_MESSAGE);
}
else
{
IntUC = Tabla2.getValueAt(Tabla2.getSelectedRow(),3).toString();
IncCreditos = IncCreditos - Integer.parseInt(IntUC);
IncArancel = IncArancel - 1000;
MiTabla2.removeRow(Tabla2.getSelectedRow());
CajaTextoCreditos.setText(nf.format(IncCreditos));
CajaTextoAranceles.setText(nf.format(IncArancel));
}
}
});
BotonCancelarInscripciones.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
}
//*** Fin del constructor Inscripciones
//*** Se definen los métodos necesarios para abrir, cerrar las ventanas e
//*** iniciar etiquetas
public void actionPerformed(ActionEvent e)
{
Object s = e.getSource();
}
public void CierraVentana()
{
if (MenuAdministrador.nIMEU == true || MenuEstudiante.nIMEU == true)
{
setVisible(false);
dispose();
}
else
{
setVisible( false );
dispose();
System.exit(0);
}
}
}
//***************************************************************************
// Fin Clase Inscripciones
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: Validaciones (Crea un diálogo que sirve
****
//**** para validar la inscripción del estudiante)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import
import
import
import
import
import
import
java.io.*;
java.sql.*;
java.awt.*;
java.awt.event.*;
javax.swing.*;
java.text.*;
java.util.Date;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
//***************************************************************************
// Inicio Clase Validaciones
//***************************************************************************
public class Validaciones extends JDialog
{
//*** Se declaran las variables
static boolean nVal = false;
static int ValCreditos = 0;
static int ValArancel = 0;
NumberFormat nf;
String
String
String
String
Dia =
Mes =
Ano =
fecha
static
static
static
static
static
static
static
static
static
String
String
String
String
String
String
String
String
String
"";
"";
"";
= String.valueOf(new Date());
IntCed;
IntLapso;
IntBanco;
IntNumero;
IntDia;
IntMes;
IntAno;
IntMonto;
IntValida;
static boolean nIngresa = true;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se crea una instancia IntValidaciones de la clase ControlValidaciones para
//*** utilizar los métodos de esta clase y hacer las transacciones con la
//*** tabla VALIDACIONES
ControlValidaciones IntValidaciones = new ControlValidaciones();
JLabel Etiqueta0 = new JLabel("
");
JLabel EtiquetaVCedula = new JLabel("No. de cédula : ");
JLabel Etiqueta1 = new JLabel(" ");
static TextField CajaTextoVCedula = new TextField(10);
JLabel EtiquetaVCentro = new JLabel("Centro local : ");
JLabel Etiqueta2 = new JLabel(" ");
static TextField CajaTextoVCentro = new TextField(20);
JLabel EtiquetaVCarrera = new JLabel("Carrera : ");
JLabel Etiqueta3 = new JLabel(" ");
static TextField CajaTextoVCarrera = new TextField(30);
JLabel EtiquetaVNombre = new JLabel("Nombre
: ");
JLabel Etiqueta4 = new JLabel(" ");
static TextField CajaTextoVNombre = new TextField(47);
JLabel EtiquetaVLapso = new JLabel("Lapso
: ");
JLabel Etiqueta5 = new JLabel(" ");
static TextField CajaTextoVLapso = new TextField(10);
static
static
static
static
static
DefaultTableModel MiTabla1 = new DefaultTableModel();
JTable Tabla1 = new JTable(MiTabla1);
JScrollPane scrollPane1 = new JScrollPane(Tabla1);
Object [] Fila1 = new Object[5];
TableColumn MiColumna1 = new TableColumn();
JLabel Etiqueta6 = new JLabel("
JLabel Etiqueta7 = new JLabel("
");
");
JLabel
JLabel
static
JLabel
static
Etiqueta8 = new JLabel("
TotalCreditos = new JLabel("Total créditos : ");
TextField CajaTextoCreditos = new TextField(10);
TotalAranceles = new JLabel("Total aranceles : ");
TextField CajaTextoAranceles = new TextField(10);
");
JLabel
JLabel
JLabel
static
EtiquetaBanco = new JLabel("Banco : ");
Etiqueta14 = new JLabel("");
Etiqueta15 = new JLabel("");
String[] Banco = {"Venezuela (0102203838)","Provincial (0349003940)",
"Caribe (0456201238)","Exterior (02450045340)"};
JComboBox ComboBanco = new JComboBox(Banco);
JLabel EtiquetaNumDeposito = new JLabel("No. dep. : ");
JLabel Etiqueta16 = new JLabel(" ");
static TextField CajaTextoNumDeposito = new TextField(10);
JLabel EtiquetaFecDeposito = new JLabel("Fecha : ");
JLabel Etiqueta17 = new JLabel(" ");
static String[] cDia = {"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15",
"16","17","18","19","20","21","22","23","24","25","26","27","28",
"29","30","31" };
JComboBox ComboDia = new JComboBox(cDia);
static String[] cMes = {"1","2","3","4","5","6","7","8","9","10","11","12"};
JComboBox ComboMes = new JComboBox(cMes);
static String[] cAno = {"1975","1976","1977","1978","1979","1980","1981","1982","1983","1984",
"1985","1986","1987","1988","1989","1990","1991","1992","1993","1994",
"1995","1996","1997","1998","1999","2000","2001","2002","2003","2004",
"2005","2006","2007","2008","2009","2010","2011","2012","2013","2014",};
JComboBox ComboAno = new JComboBox(cAno);
JLabel EtiquetaMonDeposito = new JLabel("Monto : ");
JLabel Etiqueta18 = new JLabel(" ");
static TextField CajaTextoMonDeposito = new TextField(10);
JLabel EtiquetaValidar = new JLabel(" Validar inscripción :");
JLabel Etiqueta19 = new JLabel("
JLabel Etiqueta20 = new JLabel("
JLabel Etiqueta21 = new JLabel("
");
JCheckBox CheckValidar = new JCheckBox();
JButton BotonGuardarRegistro = new JButton("
JLabel Etiqueta10 = new JLabel("
");
JButton BotonEliminarRegistro = new JButton("
JLabel Etiqueta11 = new JLabel("
");
JButton BotonImprimirRegistro = new JButton("
JLabel Etiqueta13 = new JLabel("
");
JButton BotonCancelarRegistro = new JButton("
Guardar
");
");
");
Eliminar
");
Imprimir
");
Cancelar
");
//*** Se define el método principal "main" de la Clase Validaciones
public static void main(String g[])
{
//*** Se ejecuta el constructor Validaciones de la clase Validaciones
Validaciones p = new Validaciones();
p.setVisible(true);
//*** Para cerrar la ventana
p.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
}
//*** Inicio del constructor Validaciones
Validaciones()
{
//*** Se define el título de la ventana
super(new Frame(), "Validar inscripción", true);
//*** Se define el tamaño de la ventana para el diálogo
setBounds( 0, 0, 800, 470 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
PanelEspacioArriba = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelI1 = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelI2 = new JPanel(new FlowLayout(FlowLayout.LEFT));
Panel1 = new JPanel(new GridLayout(3,1,2,2));
PanelTablas = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelAranceles = new JPanel(new FlowLayout(FlowLayout.RIGHT));
PanelBanco = new JPanel(new FlowLayout(FlowLayout.LEFT));
PanelValidar = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelBotones = new JPanel(new FlowLayout(FlowLayout.CENTER));
PanelPricipal = new JPanel(new FlowLayout(FlowLayout.CENTER));
CajaTextoVCedula.setText(MenuAdministrador.adsCedula4);
CajaTextoVCentro.setText(IntValidaciones.nCentro);
CajaTextoVCarrera.setText(IntValidaciones.nCarrera);
CajaTextoVNombre.setText(IntValidaciones.nNombre);
Mes = fecha.substring(4,7);
Dia = fecha.substring(8,10);
Ano = fecha.substring(fecha.length() - 4, fecha.length());
if (Mes.equals("Jan") || Mes.equals("Feb") || Mes.equals("Mar") || Mes.equals("Apr") ||
Mes.equals("May") || Mes.equals("Jun"))
{
IntLapso = Ano + "-1";
CajaTextoVLapso.setText(IntLapso);
}
else
{
IntLapso = Ano + "-2";
CajaTextoVLapso.setText(IntLapso);
}
//*** TABLA1 ***
while (MiTabla1.getRowCount() > 0)
{
MiTabla1.removeRow(0);
}
Tabla1.setPreferredScrollableViewportSize(new Dimension(735,127));
MiTabla1.addColumn("Código");
MiTabla1.addColumn("Asignatura");
MiTabla1.addColumn("Semestre");
MiTabla1.addColumn("U.C.");
MiTabla1.addColumn("Arancel");
while (Tabla1.getColumnCount() > 5)
{
MiColumna1 = Tabla1.getColumnModel().getColumn(5);
Tabla1.removeColumn(MiColumna1);
}
ValCreditos = 0;
ValArancel = 0;
//*** Para formato 1.000,00
nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
//*** Se hace la conexión y se llena la tabla (listado) con los datos.
try
{
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM INSCRIPCIONES a, ASIGNATURAS b, PENSUM c" +
" WHERE a.CodigoAsignatura = b.CodigoAsignatura AND a.CodigoAsignatura =
c.CodigoAsignatura" +
" AND a.CodigoCarrera = c.CodigoCarrera" +
" ORDER BY c.CodigoAsignatura";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
String ced = String.valueOf(rs.getInt("CedulaEstudiante"));
String lap = rs.getString("LapsoInscripcion");
if(ced.equals(MenuAdministrador.adsCedula4) && lap.equals(IntLapso) ||
ced.equals(MenuEstudiante.adsCedula) && lap.equals(IntLapso) )
{
Fila1[0]
Fila1[1]
Fila1[2]
Fila1[3]
Fila1[4]
=
=
=
=
=
String.valueOf(rs.getInt("CodigoAsignatura"));
rs.getString("NombreAsignatura");
String.valueOf(rs.getInt("SemestreAsignatura"));
String.valueOf(rs.getInt("UCAsignatura"));
"1.000,00";
MiTabla1.addRow(Fila1);
ValCreditos = ValCreditos + Integer.parseInt(Fila1[3].toString());
ValArancel = ValArancel + 1000;
}
}
rs.close();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
CajaTextoCreditos.setText(nf.format(ValCreditos));
CajaTextoAranceles.setText(nf.format(ValArancel));
CajaTextoVCedula.setEditable(false);
CajaTextoVCentro.setEditable(false);
CajaTextoVCarrera.setEditable(false);
CajaTextoVNombre.setEditable(false);
CajaTextoVLapso.setEditable(false);
CajaTextoCreditos.setEditable(false);
CajaTextoAranceles.setEditable(false);
PanelEspacioArriba.add(Etiqueta0);
PanelI1.add(EtiquetaVCedula);
PanelI1.add(CajaTextoVCedula);
PanelI1.add(Etiqueta1);
PanelI1.add(EtiquetaVCentro);
PanelI1.add(CajaTextoVCentro);
PanelI1.add(Etiqueta2);
PanelI1.add(EtiquetaVCarrera);
PanelI1.add(CajaTextoVCarrera);
PanelI2.add(EtiquetaVNombre);
PanelI2.add(CajaTextoVNombre);
PanelI2.add(Etiqueta4);
PanelI2.add(EtiquetaVLapso);
PanelI2.add(CajaTextoVLapso);
Panel1.add(PanelEspacioArriba, BorderLayout.CENTER);
Panel1.add(PanelI1, BorderLayout.CENTER);
Panel1.add(PanelI2, BorderLayout.CENTER);
PanelTablas.add(scrollPane1, BorderLayout.CENTER);
PanelAranceles.add(Etiqueta6);
PanelAranceles.add(Etiqueta7);
PanelAranceles.add(TotalCreditos);
PanelAranceles.add(CajaTextoCreditos);
PanelAranceles.add(Etiqueta8);
PanelAranceles.add(TotalAranceles);
PanelAranceles.add(CajaTextoAranceles);
ComboDia.setMaximumRowCount(5);
ComboMes.setMaximumRowCount(5);
ComboAno.setMaximumRowCount(5);
PanelBanco.add(EtiquetaBanco);
PanelBanco.add(ComboBanco);
PanelBanco.add(Etiqueta16);
PanelBanco.add(EtiquetaNumDeposito);
PanelBanco.add(CajaTextoNumDeposito);
PanelBanco.add(Etiqueta17);
PanelBanco.add(EtiquetaFecDeposito);
PanelBanco.add(ComboDia);
PanelBanco.add(ComboMes);
PanelBanco.add(ComboAno);
PanelBanco.add(Etiqueta18);
PanelBanco.add(EtiquetaMonDeposito);
PanelBanco.add(CajaTextoMonDeposito);
PanelValidar.add(Etiqueta19);
PanelValidar.add(EtiquetaValidar);
PanelValidar.add(CheckValidar);
PanelValidar.add(Etiqueta20);
PanelBotones.add(BotonGuardarRegistro);
PanelBotones.add(Etiqueta10);
PanelBotones.add(BotonEliminarRegistro);
PanelBotones.add(Etiqueta11);
PanelBotones.add(BotonImprimirRegistro);
PanelBotones.add(Etiqueta13);
PanelBotones.add(BotonCancelarRegistro);
//*** Verifica si existe el registro de la inscripción
if((!MenuAdministrador.adsCedula4.equals("") && !IntLapso.equals("")) ||
(!MenuEstudiante.adsCedula.equals("") && !IntLapso.equals("")))
{
if(IntValidaciones.BuscarRegistro(MenuAdministrador.adsCedula4,IntLapso) == true ||
IntValidaciones.BuscarRegistro(MenuEstudiante.adsCedula,IntLapso) == true)
{
ComboBanco.setSelectedItem(IntValidaciones.nBanco);
CajaTextoNumDeposito.setText(IntValidaciones.nNumero);
ComboDia.setSelectedItem(IntValidaciones.nDia);
ComboMes.setSelectedItem(IntValidaciones.nMes);
ComboAno.setSelectedItem(IntValidaciones.nAno);
CajaTextoMonDeposito.setText(IntValidaciones.nMonto);
if (IntValidaciones.nValida.equals("1"))
CheckValidar.setSelected(true);
if (IntValidaciones.nValida.equals("0"))
CheckValidar.setSelected(false);
BotonEliminarRegistro.setVisible(true);
BotonImprimirRegistro.setVisible(true);
}
else
{
ComboBanco.setSelectedIndex(0);
CajaTextoNumDeposito.setText("");
ComboDia.setSelectedIndex(0);
ComboMes.setSelectedIndex(0);
ComboAno.setSelectedItem(Ano);
CajaTextoMonDeposito.setText("");
CheckValidar.setSelected(false);
BotonEliminarRegistro.setVisible(false);
BotonImprimirRegistro.setVisible(false);
}
}
else
{
ComboBanco.setSelectedIndex(0);
CajaTextoNumDeposito.setText("");
ComboDia.setSelectedIndex(0);
ComboMes.setSelectedIndex(0);
ComboAno.setSelectedItem(Ano);
CajaTextoMonDeposito.setText("");
CheckValidar.setSelected(false);
BotonEliminarRegistro.setVisible(false);
BotonImprimirRegistro.setVisible(false);
}
BotonGuardarRegistro.setMnemonic('G');
BotonGuardarRegistro.setToolTipText("Guardar registro de inscripción");
BotonEliminarRegistro.setMnemonic('E');
BotonEliminarRegistro.setToolTipText("Eliminar registro de inscripción");
BotonImprimirRegistro.setMnemonic('I');
BotonImprimirRegistro.setToolTipText("Imprimir la planilla de inscripción");
BotonCancelarRegistro.setMnemonic('C');
BotonCancelarRegistro.setToolTipText("Cancelar y salir...");
// *** Se agrega el panel principal al diálogo
PanelPricipal.add(Panel1);
PanelPricipal.add(PanelTablas);
PanelPricipal.add(PanelAranceles);
PanelPricipal.add(PanelBanco);
PanelPricipal.add(PanelValidar);
PanelPricipal.add(PanelBotones);
getContentPane().add(PanelPricipal);
//*** Se desactiva maximizar/minimizar
setResizable(false);
// *** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos producidos por los botones del diálogo
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
BotonGuardarRegistro.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
///*******************************
///*** VITAL
****
///*******************************
IntValidaciones.nControl12 = true;
ControlPassword.nControl1 = false;
ControlUsuarios.nControl2 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
IntCed = CajaTextoVCedula.getText();
IntLapso = CajaTextoVLapso.getText();
IntBanco = ComboBanco.getSelectedItem().toString();
IntNumero = CajaTextoNumDeposito.getText();
IntDia = ComboDia.getSelectedItem().toString();
IntMes = ComboMes.getSelectedItem().toString();
IntAno = ComboAno.getSelectedItem().toString();
IntMonto = CajaTextoMonDeposito.getText();
if (CheckValidar.isSelected() == true)
IntValida = "1";
if (CheckValidar.isSelected() == false)
IntValida = "0";
IntValidaciones.IniciarVariables();
IntValidaciones.VerificarDatos();
if (nVal == true)
{
nVal = false;
CierraVentana();
Toolkit.getDefaultToolkit().beep();
int n = JOptionPane.showConfirmDialog(null,"¿ Quiere imprimir la planilla de inscripción
?",
"Imprimir...",JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION)
IntValidaciones.ImprimePlanilla();
}
}
});
BotonEliminarRegistro.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
{
Toolkit.getDefaultToolkit().beep();
int n = JOptionPane.showConfirmDialog(null,"¿ Quiere eliminar este registro de
inscripción ?",
"Eliminar...",JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION)
{
//*** Se invoca el método EliminarDatos de la clase ControlValidaciones
IntCed = CajaTextoVCedula.getText();
IntLapso = CajaTextoVLapso.getText();
IntValidaciones.EliminarDatos(IntCed,IntLapso);
CierraVentana();
}
}
}
});
BotonImprimirRegistro.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
IntCed = CajaTextoVCedula.getText();
IntLapso = CajaTextoVLapso.getText();
IntBanco = ComboBanco.getSelectedItem().toString();
IntNumero = CajaTextoNumDeposito.getText();
IntDia = ComboDia.getSelectedItem().toString();
IntMes = ComboMes.getSelectedItem().toString();
IntAno = ComboAno.getSelectedItem().toString();
IntMonto = CajaTextoMonDeposito.getText();
if(!IntCed.equals("") && !IntNumero.equals("") && !IntMonto.equals(""))
{
CierraVentana();
IntValidaciones.ImprimePlanilla();
}
}
});
BotonCancelarRegistro.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
}
//*** Fin del constructor Validaciones
//*** Se definen los métodos necesarios para abrir y cerrar el diálogo
public void actionPerformed(ActionEvent e)
{
Object s = e.getSource();
}
public void CierraVentana()
{
if (MenuAdministrador.nIMEU == true || MenuEstudiante.nIMEU == true)
{
setVisible(false);
dispose();
}
else
{
setVisible( false );
dispose();
System.exit(0);
}
}
}
//***************************************************************************
// Fin Clase Validaciones
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: Usuarios (Crea un diálogo que sirve para
****
//**** ingresar o mostrar los datos de usuario y contraseña)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//***************************************************************************
// Inicio Clase Usuarios
//***************************************************************************
public class Usuarios extends JDialog
{
//*** Se declaran las variables
static boolean nUsu = false;
static int UsuNivel;
static boolean nIngresa = true;
//*** Se crea una instancia IntUsuarios de la clase ControlUsuarios para
//*** utilizar los métodos de esta clase y hacer las transacciones con la
//*** tabla USUARIOS de la base de datos
ControlUsuarios IntUsuarios = new ControlUsuarios();
//*** Se crean los componentes necesarios
JLabel EtiquetaUsuario = new JLabel("Usuario :");
static TextField CajaTextoUsuario = new TextField(10);
JLabel EtiquetaNombreUsuario = new JLabel("Nombre usuario :");
static TextField CajaTextoNombreUsuario = new TextField(10);
JLabel EtiquetaCedulaUsuario = new JLabel("Cédula usuario :");
static TextField CajaTextoCedulaUsuario = new TextField(10);
JLabel EtiquetaNivel = new JLabel("Nivel :");
static String[] TipoUsuario = { "Administrador", "Estudiante" };
JComboBox ComboNivel = new JComboBox(TipoUsuario);
JLabel EtiquetaContrasena = new JLabel("Contraseña :");
static TextField CajaTextoContrasena = new TextField(10);
JLabel EtiquetaConfContrasena = new JLabel("Confirmar contraseña :");
static TextField CajaTextoConfContrasena = new TextField(10);
JButton BotonAceptarUsuario = new JButton("
JButton BotonCancelarUsuario = new JButton("
Aceptar
Cancelar
");
");
//*** Se define el método principal "main" de la Clase Usuarios
public static void main(String g[])
{
//*** Se ejecuta el constructor Usuarios de la clase Usuarios
Usuarios p = new Usuarios();
p.setVisible(true);
//*** Para cerrar la ventana
p.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
}
//*** Inicio del constructor Usuarios
Usuarios()
{
//*** Se define el título de la ventana
super(new Frame(), MenuAdministrador.nTituloUsuario, true);
//*** Se define el tamaño de la ventana para el diálogo
setBounds( 0, 0, 360, 310 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
JPanel
PanelEspacioArriba = new JPanel();
PanelUsuario = new JPanel(new GridLayout(1,2));
PanelNombreUsuario = new JPanel(new GridLayout(1,2));
PanelCedulaUsuario = new JPanel(new GridLayout(1,2));
PanelNivel = new JPanel(new GridLayout(1,2));
PanelContrasena = new JPanel(new GridLayout(1,2));
PanelConfContrasena = new JPanel(new GridLayout(1,2));
Panel1 = new JPanel(new BorderLayout(5,10));
Panel2 = new JPanel(new BorderLayout(5,10));
PanelBotones = new JPanel(new GridLayout(1,2,30,3));
Panel3 = new JPanel(new BorderLayout(5,10));
Panel4 = new JPanel(new BorderLayout(5,10));
PanelPricipal = new JPanel(new FlowLayout(FlowLayout.CENTER));
//*** Etiquetas, cajas de texto y botones del diálogo
CajaTextoUsuario.setEditable(true);
CajaTextoNombreUsuario.setEditable(true);
CajaTextoCedulaUsuario.setEditable(true);
CajaTextoContrasena.setEditable(true);
CajaTextoConfContrasena.setEditable(true);
BotonAceptarUsuario.setText("
Aceptar
");
BotonAceptarUsuario.setMnemonic('A');
BotonAceptarUsuario.setToolTipText("Registrar usuario...");
if (MenuAdministrador.adsCedula.equals(""))
{
nIngresa = true;
CajaTextoUsuario.setText("");
CajaTextoNombreUsuario.setText("");
CajaTextoCedulaUsuario.setText("");
CajaTextoContrasena.setText("");
CajaTextoContrasena.setEchoChar('*');
CajaTextoConfContrasena.setText("");
CajaTextoConfContrasena.setEchoChar('*');
ComboNivel.setSelectedIndex(1);
}
else
{
nIngresa = false;
if (IntUsuarios.BuscarCedula(MenuAdministrador.adsCedula) == true)
{
if (MenuAdministrador.nMEU == false)
{
CajaTextoUsuario.setEditable(false);
CajaTextoNombreUsuario.setEditable(false);
CajaTextoCedulaUsuario.setEditable(false);
CajaTextoContrasena.setEditable(false);
CajaTextoConfContrasena.setEditable(false);
BotonAceptarUsuario.setText("
Eliminar
");
BotonAceptarUsuario.setMnemonic('E');
BotonAceptarUsuario.setToolTipText("Eliminar usuario...");
}
CajaTextoUsuario.setText(IntUsuarios.vUsuario);
CajaTextoNombreUsuario.setText(IntUsuarios.vNombre);
CajaTextoCedulaUsuario.setText(MenuAdministrador.adsCedula);
CajaTextoCedulaUsuario.setEditable(false);
CajaTextoContrasena.setText(IntUsuarios.vContrasena);
CajaTextoContrasena.setEchoChar('*');
CajaTextoConfContrasena.setText(IntUsuarios.vContrasena);
CajaTextoConfContrasena.setEchoChar('*');
ComboNivel.setSelectedIndex(IntUsuarios.vNivel);
}
}
BotonCancelarUsuario.setMnemonic('C');
BotonCancelarUsuario.setToolTipText("Cancelar y salir...");
PanelEspacioArriba.setLayout( new FlowLayout(FlowLayout.CENTER));
PanelUsuario.add(EtiquetaUsuario);
PanelUsuario.add(CajaTextoUsuario);
PanelNombreUsuario.add(EtiquetaNombreUsuario);
PanelNombreUsuario.add(CajaTextoNombreUsuario);
PanelCedulaUsuario.add(EtiquetaCedulaUsuario);
PanelCedulaUsuario.add(CajaTextoCedulaUsuario);
PanelNivel.add(EtiquetaNivel);
PanelNivel.add(ComboNivel);
PanelContrasena.add(EtiquetaContrasena);
PanelContrasena.add(CajaTextoContrasena);
PanelConfContrasena.add(EtiquetaConfContrasena);
PanelConfContrasena.add(CajaTextoConfContrasena);
Panel1.add(PanelEspacioArriba, BorderLayout.NORTH);
Panel1.add(PanelUsuario, BorderLayout.CENTER);
Panel1.add(PanelNombreUsuario, BorderLayout.SOUTH);
Panel2.add(PanelCedulaUsuario, BorderLayout.NORTH);
Panel2.add(PanelContrasena, BorderLayout.CENTER);
Panel2.add(PanelConfContrasena, BorderLayout.SOUTH);
PanelBotones.add(BotonAceptarUsuario);
PanelBotones.add(BotonCancelarUsuario);
Panel3.add(PanelNivel, BorderLayout.NORTH);
Panel3.add(PanelBotones, BorderLayout.SOUTH);
Panel4.add(Panel1, BorderLayout.NORTH);
Panel4.add(Panel2, BorderLayout.CENTER);
Panel4.add(Panel3, BorderLayout.SOUTH);
PanelPricipal.add(Panel4);
// *** Se agrega el panel principal al diálogo
getContentPane().add(PanelPricipal);
//*** Se desactiva maximizar/minimizar
setResizable(false);
// *** Se centra el diálogo en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos producidos por los botones del diálogo
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
BotonAceptarUsuario.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
///*******************************
///*** VITAL
****
///*******************************
IntUsuarios.nControl2 = true;
ControlPassword.nControl1 = false;
ControlEstudiantes.nControl5 = false;
ControlHistorico.nControl7 = false;
ControlAsignaturas.nControl8 = false;
ControlInscripciones.nControl10 = false;
ControlValidaciones.nControl12 = false;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
if (nIngresa == true)
{
//*** Se invocan los métodos IniciarVariables-VerificarDatos de la
//*** clase ControlUsuarios
UsuNivel = ComboNivel.getSelectedIndex();
IntUsuarios.IniciarVariables();
IntUsuarios.VerificarDatos();
MenuAdministrador.adsCedula = "";
}
else
{
if (MenuAdministrador.nMEU == true)
{
//*** Se invocan los métodos IniciarVariables-VerificarDatos de la
//*** clase ControlUsuarios
UsuNivel = ComboNivel.getSelectedIndex();
IntUsuarios.IniciarVariables();
IntUsuarios.VerificarDatos();
MenuAdministrador.adsCedula = "";
}
else
{
Toolkit.getDefaultToolkit().beep();
int n = JOptionPane.showConfirmDialog(null,"¿ Quiere eliminar este usuario ?",
"Eliminar...",JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION)
{
//*** Se invoca el método EliminarDatos de la clase ControlUsuarios
IntUsuarios.EliminarDatos(MenuAdministrador.adsCedula);
MenuAdministrador.adsCedula = "";
}
else
{
nUsu = true;
MenuAdministrador.adsCedula = "";
}
}
}
MenuAdministrador.nTituloUsuario = "Registrar usuario y contraseña";
if (nUsu == true)
{
nUsu = false;
CierraVentana();
}
}
});
BotonCancelarUsuario.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
MenuAdministrador.adsCedula = "";
MenuAdministrador.nTituloUsuario = "Registrar usuario y contraseña";
//*** Se ejecuta el método CierraVentana
CierraVentana();
}
});
}
//*** Fin del constructor Usuarios
//*** Se definen los métodos necesarios para abrir, cerrar las ventanas e
//*** iniciar etiquetas
public void actionPerformed(ActionEvent e)
{
Object s = e.getSource();
}
public void CierraVentana()
{
if (MenuAdministrador.nIMEU == true)
{
setVisible(false);
dispose();
}
else
{
setVisible( false );
dispose();
System.exit(0);
}
}
}
//***************************************************************************
// Fin Clase Usuarios
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: ControlPassword (Para trabajar con las
****
//**** funciones que hacen la comprobación de usuario y contraseña
****
//**** a la tabla USUARIOS de la base de datos ESTUDIANTES.MDB)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import java.io.*;
import java.sql.*;
//***************************************************************************
// Inicio Clase ControlPassword
//***************************************************************************
public class ControlPassword
{
//*** Se declaran las variables
static
static
static
static
static
static
static
static
String nUsuario;
String nUsuario2;
String nNombre;
int nCedula;
String nContrasena;
String nConfContrasena;
int nNivel;
String nDato;
static boolean nControl1 = true;
static String tuUsuario;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se define el método principal "main" de la Clase ControlPassword
public static void main(String[] args)
{
//*** Se coloca el método principal sólo como parte de la estructura de
//*** la clase, esta clase está compuesta por todos los métodos que hacen
//*** posible hacer la comprobación de usuario y contraseña en la
//*** tabla USUARIOS de la base de datos
}
//*** Se define el método IniciarVariables para iniciar las variables
public void IniciarVariables()
{
nUsuario = Password.CajaTextoInUsuario.getText();
nUsuario2 = Password.CajaTextoInUsuario.getText();
nContrasena = Password.CajaTextoInContrasena.getText();
nNombre = "";
nCedula = 0;
nNivel = 1;
nDato = "";
}
//*** Se define el método VerificarDatos para verificar usuario y contraseña
public void VerificarDatos()
{
if(!nUsuario.equals("") && !nContrasena.equals(""))
{
nNombre = NombreUsuario(nUsuario,nContrasena,nNombre);
nCedula = CedulaNivelUsuario(nUsuario,nContrasena,nCedula,nNivel,nDato = "ced");
nNivel = CedulaNivelUsuario(nUsuario,nContrasena,nCedula,nNivel,nDato = "niv");
if (!nNombre.equals("") && nCedula != 0)
{
if (nNivel == 0)
{
MenuAdministrador d = new MenuAdministrador();
ObtenerDatos(nNombre);
d.IniciarEtiquetas(nUsuario2,tuUsuario,nCedula);
d.setVisible(true);
Password.nPass = true;
MenuEstudiante.nControl3 = false;
MenuEstudiante.nControl4 = false;
MenuEstudiante.nControl6 = false;
MenuEstudiante.nControl9 = false;
MenuEstudiante.nControl11 = false;
}
else
{
MenuEstudiante d = new MenuEstudiante();
ObtenerDatos(nNombre);
d.IniciarEtiquetas(nUsuario2,tuUsuario,nCedula);
d.setVisible(true);
Password.nPass = true;
MenuAdministrador.nControl3 = false;
MenuAdministrador.nControl4 = false;
MenuAdministrador.nControl6 = false;
MenuAdministrador.nControl9 = false;
MenuAdministrador.nControl11 = false;
}
}
}
}
//*** Se define el método NombreUsuario para retornar el nombre completo del usuario
public String NombreUsuario(String MiUsuario,String MiContrasena,String MiNombre)
{
try
{
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM USUARIOS WHERE NombreUsuario= '" + MiUsuario
+ "' AND ClaveUsuario= '" + MiContrasena + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
MiNombre = rs.getString("NombreCompleto");
}
if(sw == 0)
{
return MiNombre;
}
rs.close();
}
nConectaB.close();
return MiNombre;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
return MiNombre;
}
}
//*** Se define el método CedulaNivelUsuario para retornar la cédula del usuario
//*** y el nivel de acceso
public int CedulaNivelUsuario(String MiUsuario,String MiContrasena,
int MiCedula,int MiNivel,String MiDato)
{
try
{
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM USUARIOS WHERE NombreUsuario= '"+ MiUsuario
+ "' AND ClaveUsuario= '" + MiContrasena + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
MiCedula = rs.getInt("CedulaUsuario");
MiNivel = rs.getInt("NivelUsuario");
}
if(sw == 0)
{
if (MiDato == "ced")
return MiCedula;
else
return MiNivel;
}
rs.close();
}
nConectaB.close();
if (MiDato == "ced")
return MiCedula;
else
return MiNivel;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
if (MiDato == "ced")
return MiCedula;
else
return MiNivel;
}
}
//*** Se define el método ObtenerDatos
public String ObtenerDatos(String MiDato)
{
tuUsuario = MiDato;
return tuUsuario;
}
}
//***************************************************************************
// Fin Clase ControlPassword
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: ControlAsignaturas (Para trabajar con todas ****
//**** las funciones que hacen transacciones a la tabla ASIGNATURAS de
****
//**** la base de datos ESTUDIANTES.MDB)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import java.io.*;
import java.sql.*;
//***************************************************************************
// Inicio Clase ControlAsignaturas
//***************************************************************************
public class ControlAsignaturas
{
//*** Se declaran las variables
static int vCodigo;
static String vNombre;
static String vUC;
static String vDato;
static String vCodigo2;
static boolean nRegistro = false;
static boolean nControl8 = true;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se define el método principal "main" de la Clase ControlAsignaturas
public static void main(String[] args)
{
//*** Se coloca el método principal sólo como parte de la estructura de
//*** la clase, esta clase está compuesta por todos los métodos que hacen
//*** posible hacer transacciones como: agregar, modificar, eliminar,
//*** etc.,en la tabla ASIGNATURAS de la base de datos
}
//*** Se define el método IniciarVariables para inicializar las variables
public void IniciarVariables()
{
vCodigo2 = Asignaturas.AsigCodH;
vNombre = Asignaturas.AsigNomH;
vUC = Asignaturas.AsigCreH;
}
//*** Se define el método VerificarDatos para verificar las asignaturas
public void VerificarDatos()
{
//*** Se registran los datos de las asignaturas a través del método GuardarDatos
if(!vCodigo2.equals("") && !vNombre.equals("") && !vUC.equals(""))
{
if (Asignaturas.nIngresa == true)
{
if (GuardarDatos(vCodigo2,vNombre,vUC) == true && nRegistro == false)
{
nRegistro = false;
Asignaturas.nAsig = true;
}
else
{
nRegistro = false;
Asignaturas.nAsig = false;
}
}
else
{
if (ActualizarDatos(vCodigo2,vNombre,vUC) == true && nRegistro == false)
{
nRegistro = false;
Asignaturas.nAsig = true;
}
else
{
nRegistro = false;
Asignaturas.nAsig = false;
}
}
}
}
//*** Se define el método GuardarDatos para guardar las asignaturas
public boolean GuardarDatos(String MiCodigo,String MiNombre,String MiUC)
{
try
{
if (ControlAsignaturas.nRegistro == false)
{
int cod = Integer.parseInt(MiCodigo);
int uc = Integer.parseInt(MiUC);
nConectaB = nConexion.HacerConexion();
String sql = "INSERT INTO ASIGNATURAS (CodigoAsignatura," +
"NombreAsignatura,UCAsignatura) " +
"VALUES ('"+cod+"', '"+MiNombre+"' , '"+uc+"');";
PreparedStatement ps=nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han guardado los datos...");
Asignaturas.Fila[0] = MiCodigo;
Asignaturas.Fila[1] = MiNombre;
Asignaturas.Fila[2] = MiUC;
Asignaturas.MiTabla.addRow(Asignaturas.Fila);
}
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método ActualizarDatos para actualizar las asignaturas
public boolean ActualizarDatos(String MiCodigo,String MiNombre,String MiUC)
{
try
{
if (ControlAsignaturas.nRegistro == false)
{
int cod = Integer.parseInt(MiCodigo);
int uc = Integer.parseInt(MiUC);
nConectaB = nConexion.HacerConexion();
String sql = "UPDATE ASIGNATURAS SET CodigoAsignatura = '"+cod+"',NombreAsignatura =
'"+MiNombre+
"',UCAsignatura = '"+uc+"' WHERE Val(CodigoAsignatura)= '" + MiCodigo + "'";
PreparedStatement ps=nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han actualizado los datos...");
Asignaturas.Fila[0] = MiCodigo;
Asignaturas.Tabla.setValueAt(Asignaturas.Fila[0],Asignaturas.Tabla.getSelectedRow(),0);
Asignaturas.Fila[1] = MiNombre;
Asignaturas.Tabla.setValueAt(Asignaturas.Fila[1],Asignaturas.Tabla.getSelectedRow(),1);
Asignaturas.Fila[2] = MiUC;
Asignaturas.Tabla.setValueAt(Asignaturas.Fila[2],Asignaturas.Tabla.getSelectedRow(),2);
}
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método EliminarDatos para eliminar la asignatura
public void EliminarDatos(String MiCodigo)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM ASIGNATURAS WHERE Val(CodigoAsignatura)= '" + MiCodigo + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
EliminarHistorico(MiCodigo);
System.out.println("Se han eliminado los datos...");
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
//*** Se define el método EliminarHistorico para eliminar la asignatura del histórico del
estudiante
public void EliminarHistorico(String MiHCodigo)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM HISTORICO WHERE Val(CodigoAsignatura)= '" + MiHCodigo + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
//*** Se define el método EliminarPensum para eliminar la asignatura del pensum de estudio
public void EliminarPensum(String MiHCodigo)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM PENSUM WHERE Val(CodigoAsignatura)= '" + MiHCodigo + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
}
//***************************************************************************
// Fin Clase ControlAsignaturas
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: ControlPensum (Para trabajar con todas
****
//**** las funciones que hacen transacciones a la tabla PENSUM de
****
//**** la base de datos ESTUDIANTES.MDB)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import java.io.*;
import java.sql.*;
//***************************************************************************
// Inicio Clase ControlPensum
//***************************************************************************
public class ControlPensum
{
//*** Se declaran las variables
static
static
static
static
static
static
static
String
String
String
String
String
String
String
vCodCa;
vCodAs;
vSem;
vPre1;
vPre2;
vPre3;
vPre4;
static String vNombreAsignatura;
static String vUC;
static boolean nRegistro = false;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se define el método principal "main" de la Clase ControlPensum
public static void main(String[] args)
{
//*** Se coloca el método principal sólo como parte de la estructura de
//*** la clase, esta clase está compuesta por todos los métodos que hacen
//*** posible hacer transacciones como: agregar, modificar, eliminar,
//*** en la tabla PENSUM de la base de datos
}
//*** Se define el método IniciarVariables para inicializar las variables
public void IniciarVariables()
{
vCodCa = Pensum.PenCodCa;
vCodAs = Pensum.PenCodAs;
vSem = Pensum.PenSem;
vPre1 = Pensum.PenPre1;
vPre2 = Pensum.PenPre2;
vPre3 = Pensum.PenPre3;
vPre4 = Pensum.PenPre4;
}
//*** Se define el método VerificarDatos para verificar los pensum
public void VerificarDatos()
{
//*** Se registran los datos de los pensum a través del método GuardarDatos
if (Pensum.nIngresa == true)
{
if (GuardarDatos(vCodCa,vCodAs,vSem,vPre1,vPre2,vPre3,vPre4) == true && nRegistro == false)
{
nRegistro = false;
Pensum.nPen = true;
}
else
{
nRegistro = false;
Pensum.nPen = false;
}
}
else
{
if (ActualizarDatos(vCodCa,vCodAs,vSem,vPre1,vPre2,vPre3,vPre4) == true && nRegistro ==
false)
{
nRegistro = false;
Pensum.nPen = true;
}
else
{
nRegistro = false;
Pensum.nPen = false;
}
}
}
//*** Se define el método GuardarDatos para guardar los pensum
public boolean GuardarDatos(String MiCarrera,String MiAsignatura,String MiSemestre,String MiPre1,
String MiPre2,String MiPre3,String MiPre4)
{
try
{
if (ControlPensum.nRegistro == false)
{
int car = Integer.parseInt(MiCarrera);
int asi = Integer.parseInt(MiAsignatura);
int sem = Integer.parseInt(MiSemestre);
int pr1 = Integer.parseInt(MiPre1);
int pr2 = Integer.parseInt(MiPre2);
int pr3 = Integer.parseInt(MiPre3);
int pr4 = Integer.parseInt(MiPre4);
nConectaB = nConexion.HacerConexion();
String sql = "INSERT INTO PENSUM (CodigoCarrera,CodigoAsignatura,SemestreAsignatura," +
"CodigoPreRequisito1,CodigoPreRequisito2,CodigoPreRequisito3,CodigoPreRequisito4) " +
"VALUES ('"+car+"', '"+asi+"', '"+sem+"', '"+pr1+"', '"+pr2+"',
'"+pr3+"','"+pr4+"');";
PreparedStatement ps=nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han guardado los datos...");
TomarDatos1();
Pensum.Fila[0]
Pensum.Fila[1]
Pensum.Fila[2]
Pensum.Fila[3]
Pensum.Fila[4]
Pensum.Fila[5]
Pensum.Fila[6]
Pensum.Fila[7]
Pensum.Fila[8]
=
=
=
=
=
=
=
=
=
MiCarrera;
MiAsignatura;
vNombreAsignatura;
MiSemestre;
vUC;
MiPre1;
MiPre2;
MiPre3;
MiPre4;
Pensum.MiTabla.addRow(Pensum.Fila);
}
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método TomarDatos1 para buscar datos de asignaturas
public void TomarDatos1()
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM ASIGNATURAS WHERE Val(CodigoAsignatura)= '" + vCodAs + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
if(rs.getString("CodigoAsignatura").equals(vCodAs))
{
vNombreAsignatura = rs.getString("NombreAsignatura");
vUC = String.valueOf(rs.getInt("UCAsignatura"));
break;
}
}
rs.close();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
}
//*** Se define el método ActualizarDatos para actualizar los pensum
public boolean ActualizarDatos(String MiCarrera,String MiAsignatura,String MiSemestre,String
MiPre1,
String MiPre2,String MiPre3,String MiPre4)
{
try
{
if (ControlPensum.nRegistro == false)
{
int car = Integer.parseInt(MiCarrera);
int asi = Integer.parseInt(MiAsignatura);
int sem = Integer.parseInt(MiSemestre);
int pr1 = Integer.parseInt(MiPre1);
int pr2 = Integer.parseInt(MiPre2);
int pr3 = Integer.parseInt(MiPre3);
int pr4 = Integer.parseInt(MiPre4);
nConectaB = nConexion.HacerConexion();
String sql = "UPDATE PENSUM SET CodigoCarrera = '"+car+"',CodigoAsignatura = '"+asi+
"',SemestreAsignatura = '"+sem+"',CodigoPreRequisito1 = '"+pr1+
"',CodigoPreRequisito2 = '"+pr2+"',CodigoPreRequisito3 = '"+pr3+
"',CodigoPreRequisito4 = '"+pr4+"' WHERE Val(CodigoCarrera)= '" + MiCarrera +
"' AND Val(CodigoAsignatura)= '" + MiAsignatura + "'";
PreparedStatement ps=nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han actualizado los datos...");
TomarDatos1();
Pensum.Fila[0] = MiCarrera;
Pensum.Tabla.setValueAt(Pensum.Fila[0],Pensum.Tabla.getSelectedRow(),0);
Pensum.Fila[1] = MiAsignatura;
Pensum.Tabla.setValueAt(Pensum.Fila[1],Pensum.Tabla.getSelectedRow(),1);
Pensum.Fila[2] = vNombreAsignatura;
Pensum.Tabla.setValueAt(Pensum.Fila[2],Pensum.Tabla.getSelectedRow(),2);
Pensum.Fila[3] = MiSemestre;
Pensum.Tabla.setValueAt(Pensum.Fila[3],Pensum.Tabla.getSelectedRow(),3);
Pensum.Fila[4] = vUC;
Pensum.Tabla.setValueAt(Pensum.Fila[4],Pensum.Tabla.getSelectedRow(),4);
Pensum.Fila[5] = MiPre1;
Pensum.Tabla.setValueAt(Pensum.Fila[5],Pensum.Tabla.getSelectedRow(),5);
Pensum.Fila[6] = MiPre2;
Pensum.Tabla.setValueAt(Pensum.Fila[6],Pensum.Tabla.getSelectedRow(),6);
Pensum.Fila[7] = MiPre3;
Pensum.Tabla.setValueAt(Pensum.Fila[7],Pensum.Tabla.getSelectedRow(),7);
Pensum.Fila[8] = MiPre4;
Pensum.Tabla.setValueAt(Pensum.Fila[8],Pensum.Tabla.getSelectedRow(),8);
}
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método EliminarDatos para eliminar asignaturas del pensum
public void EliminarDatos(String MiCarrera,String MiAsignatura)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM PENSUM WHERE Val(CodigoCarrera)= '" + MiCarrera + "'" +
" AND Val(CodigoAsignatura)= '" + MiAsignatura + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han eliminado los datos...");
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
}
//***************************************************************************
// Fin Clase ControlPensum
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: ControlEstudiantes (Para trabajar con todas ****
//**** las funciones que hacen transacciones a la tabla ESTUDIANTES de
****
//**** la base de datos ESTUDIANTES.MDB)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import
import
import
import
import
import
java.io.*;
java.sql.*;
java.awt.*;
java.awt.event.*;
javax.swing.*;
javax.swing.table.DefaultTableModel;
//***************************************************************************
// Inicio Clase ControlEstudiantes
//***************************************************************************
public class ControlEstudiantes
{
//*** Se declaran las variables
static
static
static
static
static
static
static
static
static
static
static
static
static
static
int vCedula;
String vNombre;
int vDia;
int vMes;
int vAno;
int vSexo;
String vDireccion;
String vTelefono;
String vCorreo;
int vCarrera;
int vCentro;
String vDato;
String vCedula2;
boolean nRegistro = false;
static boolean nControl5 = true;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se define el método principal "main" de la Clase ControlEstudiantes
public static void main(String[] args)
{
//*** Se coloca el método principal sólo como parte de la estructura de
//*** la clase, esta clase está compuesta por todos los métodos que hacen
//*** posible hacer transacciones como: agregar, modificar, eliminar,
//*** buscar estudiantes,etc.,en la tabla ESTUDIANTES de la base de datos
}
//*** Se define el método IniciarVariables para inicializar las variables
public void IniciarVariables()
{
vCedula2 = Estudiantes.CajaTextoCedula.getText();
vNombre = Estudiantes.CajaTextoNombreEstudiante.getText();
vDia = Estudiantes.EstDia;
vMes = Estudiantes.EstMes;
vAno = Estudiantes.EstAno;
vSexo = Estudiantes.EstSex;
vDireccion = Estudiantes.CajaTextoDireccion.getText();
vTelefono = Estudiantes.CajaTextoTelefono.getText();
vCorreo = Estudiantes.CajaTextoCorreo.getText();
vCarrera = Estudiantes.EstCar;
vCentro = Estudiantes.EstCen;
}
//*** Se define el método VerificarDatos para verificar los datos del estudiante
public void VerificarDatos()
{
//*** Se registran los datos del estudiante a través del método GuardarDatos
if(!vCedula2.equals("") && !vNombre.equals("") && !vDireccion.equals(""))
{
if (Estudiantes.nIngresa == true)
{
if (GuardarDatos(vCedula2,vNombre,vDia,vMes,vAno,vSexo,vDireccion,vTelefono,
vCorreo,vCarrera,vCentro) == true && nRegistro == false)
{
nRegistro = false;
Estudiantes.nEst = true;
}
else
{
nRegistro = false;
Estudiantes.nEst = false;
}
}
else
{
if (ActualizarDatos(vCedula2,vNombre,vDia,vMes,vAno,vSexo,vDireccion,vTelefono,
vCorreo,vCarrera,vCentro) == true && nRegistro == false)
{
nRegistro = false;
Estudiantes.nEst = true;
}
else
{
nRegistro = false;
Estudiantes.nEst = false;
}
}
}
}
//*** Se define el método GuardarDatos para guardar los datos de estudiantes
public boolean GuardarDatos(String MiCedula,String MiMiNombre,int MiDia,int MiMes,int MiAno,
int MiSexo,String MiDireccion,String MiTelefono,String MiCorreo,
int MiCarrera,int MiCentro)
{
try
{
if (ControlEstudiantes.nRegistro == false)
{
int ced = Integer.parseInt(MiCedula);
MiDia = MiDia + 1;
MiMes = MiMes + 1;
MiAno = Integer.parseInt(Estudiantes.Ano[MiAno]);
String fecha = String.valueOf(MiDia + "/" + MiMes + "/" + MiAno);
String sexo = Estudiantes.Sexo[MiSexo];
if (MiCarrera == 0)
MiCarrera = 236;
if (MiCarrera == 1)
MiCarrera = 280;
if (MiCarrera == 2)
MiCarrera = 612;
if (MiCarrera == 3)
MiCarrera = 610;
String centro = Estudiantes.Centro[MiCentro];
nConectaB = nConexion.HacerConexion();
String sql = "INSERT INTO ESTUDIANTES (CedulaEstudiante, NombreEstudiante,
FechaNacimiento," +
"SexoEstudiante,DireccionEstudiante," +
"TelefonoEstudiante,CorreoEstudiante,CodigoCarrera,CentroLocal) " +
"VALUES ('"+ced+"', '"+MiMiNombre+"' , '"+fecha+"','"+sexo+"', '"
+MiDireccion+"', '"+MiTelefono+"', '"+MiCorreo+"',
'"+MiCarrera+"', '"+centro+"');";
PreparedStatement ps=nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han guardado los datos...");
}
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método BuscarCedula para buscar datos de estudiantes
public boolean BuscarCedula(String MiCedula)
{
try
{
Integer.parseInt(MiCedula);
vNombre = "";
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM ESTUDIANTES WHERE Val(CedulaEstudiante)= '" + MiCedula +
"'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
vNombre = rs.getString("NombreEstudiante");
String fecha = String.valueOf(rs.getString("FechaNacimiento"));
vDia = Integer.parseInt(fecha.substring(8, 10)) - 1;
vMes = Integer.parseInt(fecha.substring(5, 7)) - 1;
vAno = Integer.parseInt(fecha.substring(0, 4));
int Contador = 0;
for(int i = 1955; i < 1995; i ++)
{
if(i == vAno)
vAno = Contador;
Contador = Contador + 1;
}
String sexo = rs.getString("SexoEstudiante");
if (sexo.equals("Masculino"))
vSexo = 0;
else if (sexo.equals("Femenino"))
vSexo = 1;
vDireccion = rs.getString("DireccionEstudiante");
vTelefono = rs.getString("TelefonoEstudiante");
vCorreo = rs.getString("CorreoEstudiante");
vCarrera = rs.getInt("CodigoCarrera");
if (vCarrera == 236)
vCarrera = 0;
else if (vCarrera == 280)
vCarrera = 1;
else if (vCarrera == 612)
vCarrera = 2;
else if (vCarrera == 610)
vCarrera = 3;
String centro = rs.getString("CentroLocal");
if (centro.equals("Zona Central"))
vCentro = 0;
else if (centro.equals("Zona Occidental"))
vCentro = 1;
else if (centro.equals("Zona Oriental"))
vCentro = 2;
else if (centro.equals("Zona Sur"))
vCentro = 3;
}
if(sw == 0)
{
nConectaB.close();
return false;
}
rs.close();
}
nConectaB.close();
return true;
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método ActualizarDatos para actualizar los datos de estudiantes
public boolean ActualizarDatos(String MiCedula,String MiMiNombre,int MiDia,int MiMes,int MiAno,
int MiSexo,String MiDireccion,String MiTelefono,String MiCorreo,
int MiCarrera,int MiCentro)
{
try
{
if (ControlEstudiantes.nRegistro == false)
{
int ced = Integer.parseInt(MiCedula);
MiDia = MiDia + 1;
MiMes = MiMes + 1;
MiAno = Integer.parseInt(Estudiantes.Ano[MiAno]);
String fecha = String.valueOf(MiDia + "/" + MiMes + "/" + MiAno);
String sexo = Estudiantes.Sexo[MiSexo];
if (MiCarrera == 0)
MiCarrera = 236;
if (MiCarrera == 1)
MiCarrera = 280;
if (MiCarrera == 2)
MiCarrera = 612;
if (MiCarrera == 3)
MiCarrera = 610;
String centro = Estudiantes.Centro[MiCentro];
nConectaB = nConexion.HacerConexion();
String sql= "UPDATE ESTUDIANTES SET CedulaEstudiante = '"+ced+"',NombreEstudiante =
'"+MiMiNombre+
"',FechaNacimiento = '"+fecha+"',SexoEstudiante = '"+sexo+
"',DireccionEstudiante = '"+MiDireccion+"',TelefonoEstudiante =
'"+MiTelefono+"',CorreoEstudiante = '"+MiCorreo+
"',CodigoCarrera = '"+MiCarrera+"',CentroLocal = '"+centro+"' WHERE Val(CedulaEstudiante)
= '"+MiCedula+"'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han actualizado los datos...");
}
return true;
}
catch(Exception e)
{
if (vDato == "Incorrecto")
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Este estudiante ya existe !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlEstudiantes.nRegistro = false;
}
else
{
System.out.println("Se ha producido un error : " + e.toString());
}
return false;
}
}
//*** Se define el método EliminarDatos para eliminar estudiantes
public void EliminarDatos(String MiCedula)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM ESTUDIANTES WHERE Val(CedulaEstudiante)= '" + MiCedula + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
EliminarHistorico(MiCedula);
EliminarInscripcion(MiCedula);
EliminarValidacion(MiCedula);
EliminarUsuario(MiCedula);
Estudiantes.nEst = true;
System.out.println("Se han eliminado los datos...");
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
//*** Se define el método EliminarHistorico para eliminar el histórico del estudiante
public void EliminarHistorico(String MiHCedula)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM HISTORICO WHERE Val(CedulaEstudiante)= '" + MiHCedula + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
//*** Se define el método EliminarInscripcion para eliminar la inscripción del estudiante
public void EliminarInscripcion(String MiHCedula)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM INSCRIPCIONES WHERE Val(CedulaEstudiante)= '" + MiHCedula +
"'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
//*** Se define el método EliminarValidacion para eliminar la validación del estudiante
public void EliminarValidacion(String MiHCedula)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM VALIDACIONES WHERE Val(CedulaEstudiante)= '" + MiHCedula + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
//*** Se define el método EliminarUsuario para eliminar el usuario del sistema
public void EliminarUsuario(String MiHCedula)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM USUARIOS WHERE Val(CedulaUsuario)= '" + MiHCedula + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
}
//*** Se crea una nueva clase para crear una tabla que sirve para consultar
//*** los datos de los estudiantes
class TablaEstudiantes extends JDialog
{
//*** Se declaran las variables
static int teCedula;
static String teNombre;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se crean los componentes necesarios
JButton
JButton
JButton
JButton
JButton
Boton1 = new
Boton2 = new
Boton3 = new
Boton4 = new
BotonAceptar
JButton("");
JButton("");
JButton("");
JButton("");
= new JButton(" Aceptar ");
public TablaEstudiantes()
{
//*** Se define el título y tamaño de la ventana
super(new Frame(), "Consultar estudiantes", true);
setBounds( 0, 0, 460, 310 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
JPanel
PanelEspacio = new JPanel();
PanelTabla = new JPanel();
PanelBotonesTabla = new JPanel(new GridLayout(1,5,10,2));
Panel1Tabla = new JPanel(new BorderLayout(5,9));
PanelPricipalTabla = new JPanel(new FlowLayout(FlowLayout.CENTER));
DefaultTableModel MiTabla = new DefaultTableModel();
JTable Tabla = new JTable(MiTabla);
Tabla.setPreferredScrollableViewportSize(new Dimension(400,175));
JScrollPane scrollPane = new JScrollPane(Tabla);
MiTabla.addColumn("No. de cédula");
MiTabla.addColumn("Nombre del estudiante");
MiTabla.addColumn("Carrera");
//*** Se hace la conexión y se llena la tabla(listado) con los datos.
try
{
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM ESTUDIANTES ORDER BY CedulaEstudiante";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
//*** Se crea un arreglo que será una de las filas de la tabla.
Object [] Fila = new Object[3]; //*** Hay tres columnas en la tabla
String ced = String.valueOf(rs.getInt("CedulaEstudiante"));
Fila[0] = ced;
String nom = rs.getString("NombreEstudiante");
ObtenerDatos(nom);
Fila[1] = teNombre;
int car = rs.getInt("CodigoCarrera");
if (car == 236)
Fila[2] = "Ingeniería de Sistemas";
if (car == 280)
Fila[2] = "Ingeniería Industrial";
if (car == 612)
Fila[2] = "Administración de Empresas";
if (car == 610)
Fila[2] = "Contaduría Pública";
MiTabla.addRow(Fila);
}
rs.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
//*** Tooltips de los botones de la tabla
Boton1.setVisible(false);
Boton2.setVisible(false);
Boton3.setVisible(false);
Boton4.setVisible(false);
BotonAceptar.setMnemonic('A');
BotonAceptar.setToolTipText("Salir de la consulta...");
// *** Se agregan los componentes a los páneles
PanelEspacio.setLayout( new FlowLayout(FlowLayout.CENTER));
PanelTabla.add(scrollPane, BorderLayout.CENTER);
PanelBotonesTabla.add(Boton1);
PanelBotonesTabla.add(Boton2);
PanelBotonesTabla.add(BotonAceptar);
PanelBotonesTabla.add(Boton3);
PanelBotonesTabla.add(Boton4);
Panel1Tabla.add(PanelEspacio, BorderLayout.NORTH);
Panel1Tabla.add(PanelTabla, BorderLayout.CENTER);
Panel1Tabla.add(PanelBotonesTabla, BorderLayout.SOUTH);
PanelPricipalTabla.add(Panel1Tabla);
// *** Se agrega el panel principal a la ventana
add(PanelPricipalTabla);
//*** Se desactiva maximizar/minimizar
setResizable(false);
// *** Se centra la tabla en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos producidos por los botones del diálogo
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
dispose();
}
});
BotonAceptar.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
dispose();
}
});
}
//*** Se define el método ObtenerDatos para cargar los datos a la tabla
public String ObtenerDatos(String MiDato)
{
teNombre = MiDato;
return teNombre;
}
}
//*** Fin de la clase TablaEstudiantes
//***************************************************************************
// Fin Clase ControlEstudiantes
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: ControlHistorico (Para trabajar con todas
****
//**** las funciones que hacen transacciones a la tabla HISTORICO de
****
//**** la base de datos ESTUDIANTES.MDB)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import java.io.*;
import java.sql.*;
//***************************************************************************
// Inicio Clase ControlHistorico
//***************************************************************************
public class ControlHistorico
{
//*** Se declaran las variables
static
static
static
static
static
static
static
int vCedula;
String vNombre;
int vCarrera;
int vCentro;
String vNombreAsignatura;
String vSemestre;
String vUC;
static
static
static
static
static
static
static
static
String CentroH;
String CarreraH;
String AsignaturaH;
String CalificacionH;
String LapsoH;
String vDato;
String vCedula2;
boolean nRegistro = false;
static boolean nControl7 = true;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se define el método principal "main" de la Clase ControlHistorico
public static void main(String[] args)
{
//*** Se coloca el método principal sólo como parte de la estructura de
//*** la clase, esta clase está compuesta por todos los métodos que hacen
//*** posible hacer transacciones como: agregar, modificar, eliminar,
//*** buscar calificaciones,etc.,en la tabla HISTORICO de la base de datos
}
//*** Se define el método IniciarVariables para inicializar las variables
public void IniciarVariables()
{
vCedula2 = Historico.CajaTextoCedula.getText();
AsignaturaH = Historico.HisAsiH;
CalificacionH = Historico.HisCalH;
LapsoH = Historico.HisLapH;
}
//*** Se define el método VerificarDatos para verificar las calificaciones del estudiante
public void VerificarDatos()
{
//*** Se registran los datos del histórico a través del método GuardarDatos
if (Historico.nIngresa == true)
{
if (GuardarDatos(vCedula2,AsignaturaH,CalificacionH,LapsoH) == true && nRegistro == false)
{
nRegistro = false;
Historico.nHis = true;
}
else
{
nRegistro = false;
Historico.nHis = false;
}
}
else
{
if (ActualizarDatos(vCedula2,AsignaturaH,CalificacionH,LapsoH) == true && nRegistro ==
false)
{
nRegistro = false;
Historico.nHis = true;
}
else
{
nRegistro = false;
Historico.nHis = false;
}
}
}
//*** Se define el método GuardarDatos para guardar las calificaciones del estudiante
public boolean GuardarDatos(String MiCedula,String MiAsignatura,String MiCalificacion,String
MiLapso)
{
try
{
if (ControlHistorico.nRegistro == false)
{
int ced = Integer.parseInt(MiCedula);
int car = Integer.parseInt(MiAsignatura);
int cal = Integer.parseInt(MiCalificacion);
nConectaB = nConexion.HacerConexion();
String sql = "INSERT INTO HISTORICO (CedulaEstudiante,CodigoAsignatura," +
"CalificacionAsignatura,LapsoAsignatura) " +
"VALUES ('"+ced+"', '"+car+"' , '"+cal+"', '"+MiLapso+"');";
PreparedStatement ps=nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han guardado los datos...");
TomarDatos1();
TomarDatos2();
Historico.Fila[0]
Historico.Fila[1]
Historico.Fila[2]
Historico.Fila[3]
Historico.Fila[4]
Historico.Fila[5]
=
=
=
=
=
=
MiAsignatura;
vNombreAsignatura;
vSemestre;
vUC;
MiCalificacion;
MiLapso;
Historico.MiTabla.addRow(Historico.Fila);
}
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método TomarDatos1 para buscar datos de asignatura
public void TomarDatos1()
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM ASIGNATURAS WHERE Val(CodigoAsignatura)= '" + AsignaturaH +
"'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
if(rs.getString("CodigoAsignatura").equals(AsignaturaH))
{
vNombreAsignatura = rs.getString("NombreAsignatura");
vUC = String.valueOf(rs.getInt("UCAsignatura"));
break;
}
}
rs.close();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
}
//*** Se define el método TomarDatos2 para buscar datos de pensum
public void TomarDatos2()
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM PENSUM WHERE Val(CodigoAsignatura)= '" + AsignaturaH + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
if(rs.getString("CodigoAsignatura").equals(AsignaturaH))
{
vSemestre = String.valueOf(rs.getInt("SemestreAsignatura"));
break;
}
}
rs.close();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
}
//*** Se define el método BuscarCedula para buscar calificaciones de estudiantes
public boolean BuscarCedula(String MiCedula)
{
try
{
Integer.parseInt(MiCedula);
vNombre = "";
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM ESTUDIANTES WHERE Val(CedulaEstudiante)= '" + MiCedula +
"'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
vNombre = rs.getString("NombreEstudiante");
vCarrera = rs.getInt("CodigoCarrera");
if (vCarrera == 236)
CarreraH = "Ingeniería de Sistemas (236)";
else if (vCarrera == 280)
CarreraH = "Ingeniería Industrial (280)";
else if (vCarrera == 612)
CarreraH = "Administración de Empresas (612)";
else if (vCarrera == 610)
CarreraH = "Contaduría Pública (610)";
CentroH = rs.getString("CentroLocal");
}
if(sw == 0)
{
nConectaB.close();
return false;
}
rs.close();
}
nConectaB.close();
return true;
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método ActualizarDatos para actualizar las calificaciones del estudiante
public boolean ActualizarDatos(String MiCedula,String MiAsignatura,String MiCalificacion,String
MiLapso)
{
try
{
if (ControlHistorico.nRegistro == false)
{
int ced = Integer.parseInt(MiCedula);
int car = Integer.parseInt(MiAsignatura);
int cal = Integer.parseInt(MiCalificacion);
nConectaB = nConexion.HacerConexion();
String sql = "UPDATE HISTORICO SET CedulaEstudiante = '"+ced+"',CodigoAsignatura =
'"+car+
"',CalificacionAsignatura = '"+cal+
"',LapsoAsignatura = '"+MiLapso+"' WHERE Val(CedulaEstudiante)= '" + MiCedula + "' AND "
+
"Val(CodigoAsignatura)= '" +
Historico.Tabla.getValueAt(Historico.Tabla.getSelectedRow(),0).toString() +
"' AND Val(CalificacionAsignatura)= '" +
Historico.Tabla.getValueAt(Historico.Tabla.getSelectedRow(),4).toString() +
"' AND " + "LapsoAsignatura= '" +
Historico.Tabla.getValueAt(Historico.Tabla.getSelectedRow(),5).toString() + "'";
PreparedStatement ps=nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han actualizado los datos...");
TomarDatos1();
TomarDatos2();
Historico.Fila[0] = MiAsignatura;
Historico.Tabla.setValueAt(Historico.Fila[0],Historico.Tabla.getSelectedRow(),0);
Historico.Fila[1] = vNombreAsignatura;
Historico.Tabla.setValueAt(Historico.Fila[1],Historico.Tabla.getSelectedRow(),1);
Historico.Fila[2] = vSemestre;
Historico.Tabla.setValueAt(Historico.Fila[2],Historico.Tabla.getSelectedRow(),2);
Historico.Fila[3] = vUC;
Historico.Tabla.setValueAt(Historico.Fila[3],Historico.Tabla.getSelectedRow(),3);
Historico.Fila[4] = MiCalificacion;
Historico.Tabla.setValueAt(Historico.Fila[4],Historico.Tabla.getSelectedRow(),4);
Historico.Fila[5] = MiLapso;
Historico.Tabla.setValueAt(Historico.Fila[5],Historico.Tabla.getSelectedRow(),5);
}
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método EliminarDatos para eliminar calificaciones
public void EliminarDatos(String MiCedula,String MiAsignatura,String MiCalificacion,String
MiLapso)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM HISTORICO WHERE Val(CedulaEstudiante)= '" + MiCedula + "' AND "
+
"Val(CodigoAsignatura)= '" + MiAsignatura + "' AND Val(CalificacionAsignatura)= '" +
MiCalificacion + "' AND " +
"LapsoAsignatura= '" + MiLapso + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han eliminado los datos...");
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
}
//***************************************************************************
// Fin Clase ControlHistorico
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: ControlInscripciones (Para trabajar con
****
//**** todas las funciones que hacen transacciones a la tabla
****
//**** INSCRIPCIONES de la base de datos ESTUDIANTES.MDB)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import java.io.*;
import java.sql.*;
//***************************************************************************
// Inicio Clase ControlInscripciones
//***************************************************************************
public class ControlInscripciones
{
//*** Se declaran las variables
static
static
static
static
static
static
static
static
int vCedula;
String vNombre;
String vCarrera;
String vCentro;
String vLapso;
String vDato;
String vCedula2;
int car = 0;
static boolean nRegistro = false;
static boolean nControl10 = true;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se define el método principal "main" de la Clase ControlInscripciones
public static void main(String[] args)
{
//*** Se coloca el método principal sólo como parte de la estructura de
//*** la clase, esta clase está compuesta por todos los métodos que hacen
//*** posible hacer transacciones como: agregar, modificar, eliminar,
//*** buscar estudiantes,etc.,en la tabla INSCRIPCIONES de la base de datos
}
//*** Se define el método IniciarVariables para inicializar las variables
public void IniciarVariables()
{
vCedula2 = Inscripciones.CajaTextoICedula.getText();
vNombre = Inscripciones.CajaTextoINombre.getText();
vCarrera = Inscripciones.CajaTextoICarrera.getText();
if (vCarrera.equals("Ingeniería de Sistemas (236)"))
vCarrera = "236";
if (vCarrera.equals("Ingeniería Industrial (280)"))
vCarrera = "280";
if (vCarrera.equals("Administración de Empresas (612)"))
vCarrera = "612";
if (vCarrera.equals("Contaduría Pública (610)"))
vCarrera = "610";
vLapso = Inscripciones.CajaTextoILapso.getText();
}
//*** Se define el método VerificarDatos para verificar los datos de las inscripciones
public void VerificarDatos()
{
//*** Se registran los datos de la inscripción a través del método GuardarDatos
if(!vCedula2.equals("") && !vCarrera.equals("") && !vNombre.equals("") && !vLapso.equals(""))
{
if (GuardarDatos(vCedula2,vCarrera,vLapso) == true && nRegistro == false)
{
nRegistro = false;
Inscripciones.nInc = true;
}
else
{
nRegistro = false;
Inscripciones.nInc = false;
}
}
}
//*** Se define el método GuardarDatos para guardar los datos la inscripción
public boolean GuardarDatos(String MiCedula, String MiCarrera, String MiLapso)
{
try
{
if (ControlInscripciones.nRegistro == false)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM INSCRIPCIONES WHERE Val(CedulaEstudiante) = '" + MiCedula
+ "'" +
" AND LapsoInscripcion = '" + MiLapso + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
for (int i=0; i<Inscripciones.MiTabla2.getRowCount(); i++)
{
int ced = Integer.parseInt(MiCedula);
int car = Integer.parseInt(MiCarrera);
int asi = Integer.parseInt(Inscripciones.MiTabla2.getValueAt(i,0).toString());
nConectaB = nConexion.HacerConexion();
String sql = "INSERT INTO INSCRIPCIONES (CedulaEstudiante,CodigoCarrera," +
"CodigoAsignatura,LapsoInscripcion) " +
"VALUES ('"+ced+"', '"+car+"' , '"+asi+"', '"+MiLapso+"');";
PreparedStatement ps=nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
System.out.println("Se han guardado los datos...");
}
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método BuscarCedula para buscar un estudiante por la cédula
public boolean BuscarCedula(String MiCedula)
{
try
{
Integer.parseInt(MiCedula);
vNombre = "";
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM ESTUDIANTES WHERE Val(CedulaEstudiante) = '" + MiCedula +
"'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
vNombre = rs.getString("NombreEstudiante");
car = rs.getInt("CodigoCarrera");
if(car == 236)
vCarrera = "Ingeniería de Sistemas (236)";
if(car == 280)
vCarrera = "Ingeniería Industrial (280)";
if(car == 612)
vCarrera = "Administración de Empresas (612)";
if(car == 610)
vCarrera = "Contaduría Pública (610)";
vCentro = rs.getString("CentroLocal");
}
if(sw == 0)
{
nConectaB.close();
return false;
}
rs.close();
}
nConectaB.close();
return true;
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método BuscarCalificacion para buscar calificación aprobatoria
public boolean BuscarCalificacion(String MiCedula, int MiAsignatura)
{
try
{
nConectaB = nConexion.HacerConexion();
int sw = 0;
boolean nAprobada = false;
while(sw == 0)
{
String sql = "SELECT * FROM HISTORICO WHERE Val(CedulaEstudiante) = '" + MiCedula + "'"
+
" AND Val(CodigoAsignatura) = '" + MiAsignatura + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
int cal = rs.getInt("CalificacionAsignatura");
if(cal > 5)
nAprobada = true;
}
if(sw == 0)
{
return false;
}
rs.close();
}
nConectaB.close();
return true;
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
}
//***************************************************************************
// Fin Clase ControlInscripciones
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** validaciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: ControlValidaciones (Para trabajar con
****
//**** todas las funciones que hacen transacciones a la tabla
****
//**** VALIDACIONES de la base de datos ESTUDIANTES.MDB)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import
import
import
import
import
import
import
import
import
import
java.io.*;
java.sql.*;
java.awt.*;
java.awt.event.*;
javax.swing.*;
java.text.*;
java.util.Date;
javax.swing.table.DefaultTableModel;
java.awt.image.ImageObserver;
java.awt.Image;
//***************************************************************************
// Inicio Clase ControlValidaciones
//***************************************************************************
public class ControlValidaciones
{
//*** Se declaran las variables
static
static
static
static
static
static
static
static
static
static
static
static
static
static
int vCedula;
String vNombre;
String vCarrera;
String vCentro;
String vLapso;
String vBanco;
String vNumero;
String vDia;
String vMes;
String vAno;
String vMonto;
String vValida;
String vDato;
String vCedula2;
static
static
static
static
static
static
static
static
static
static
static
static
String nNombre;
String nCarrera;
String nCentro;
String nLapso;
String nBanco;
String nNumero;
String nDia;
String nMes;
String nAno;
String nMonto;
String nValida;
int car = 0;
static boolean nRegistro = false;
static boolean nControl12 = true;
Font
Font
Font
Font
fuente1
fuente2
fuente3
fuente4
=
=
=
=
new
new
new
new
Font("Arial",
Font("Arial",
Font("Arial",
Font("Arial",
PrintJob pj;
Graphics pagina;
ImageObserver observer;
String NbrImg;
Font.BOLD, 16);
Font.BOLD, 14);
Font.BOLD, 10);
Font.PLAIN, 10);
static int ValCedula = 0;
static int ValCreditos = 0;
static int ValArancel = 0;
NumberFormat nf1;
NumberFormat nf2;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se define el método principal "main" de la Clase ControlValidaciones
public static void main(String[] args)
{
//*** Se coloca el método principal sólo como parte de la estructura de
//*** la clase, esta clase está compuesta por todos los métodos que hacen
//*** posible hacer transacciones como: agregar, modificar, eliminar,
//*** buscar estudiantes,etc.,en la tabla VALIDACIONES de la base de datos
}
//*** Se define el método IniciarVariables para inicializar las variables
public void IniciarVariables()
{
vCedula2 = Validaciones.IntCed;
vLapso = Validaciones.IntLapso;
vBanco = Validaciones.IntBanco;
vNumero = Validaciones.IntNumero;
vDia = Validaciones.IntDia;
vMes = Validaciones.IntMes;
vAno = Validaciones.IntAno;
vMonto = Validaciones.IntMonto;
vValida = Validaciones.IntValida;
}
//*** Se define el método VerificarDatos para verificar los datos de las validaciones
public void VerificarDatos()
{
//*** Se registran los datos de la validación a través del método GuardarDatos
if(!vNumero.equals("") && !vMonto.equals("") &&
!vLapso.equals(""))
{
if (GuardarDatos(vCedula2,vLapso,vBanco,vNumero,vDia,vMes,vAno,vMonto,vValida) == true &&
nRegistro == false)
{
nRegistro = false;
Validaciones.nVal = true;
}
else
{
nRegistro = false;
Validaciones.nVal = false;
}
}
}
//*** Se define el método GuardarDatos para guardar los datos la validación
public boolean GuardarDatos(String MiCedula, String MiLapso, String MiBanco, String MiNumero,
String MiDia,
String MiMes, String MiAno, String MiMonto, String MiValida)
{
try
{
int ced = Integer.parseInt(MiCedula);
int num = Integer.parseInt(MiNumero);
String fecha = MiDia + "/" + MiMes + "/" + MiAno;
int mon = Integer.parseInt(MiMonto);
int val = Integer.parseInt(MiValida);
if (ControlValidaciones.nRegistro == false)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM VALIDACIONES WHERE Val(CedulaEstudiante) = '" + MiCedula
+ "'" +
" AND LapsoInscripcion = '" + MiLapso + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
nConectaB = nConexion.HacerConexion();
String sql = "INSERT INTO VALIDACIONES
(CedulaEstudiante,LapsoInscripcion,BancoDeposito," +
"NumeroDeposito,FechaDeposito,MontoDeposito,ValidacionInscripcion) " +
"VALUES ('"+ced+"', '"+MiLapso+"' , '"+MiBanco+"', '"+num+"', '"+fecha+"',
'"
+mon+"', '"+val+"');";
PreparedStatement ps=nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han guardado los datos...");
}
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método BuscarCedula para buscar un estudiante por la cédula
public boolean BuscarCedula(String MiCedula)
{
try
{
Integer.parseInt(MiCedula);
nNombre = "";
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM ESTUDIANTES WHERE Val(CedulaEstudiante) = '" + MiCedula +
"'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
nNombre = rs.getString("NombreEstudiante");
car = rs.getInt("CodigoCarrera");
if(car == 236)
nCarrera = "Ingeniería de Sistemas (236)";
if(car == 280)
nCarrera = "Ingeniería Industrial (280)";
if(car == 612)
nCarrera = "Administración de Empresas (612)";
if(car == 610)
nCarrera = "Contaduría Pública (610)";
nCentro = rs.getString("CentroLocal");
}
if(sw == 0)
{
nConectaB.close();
return false;
}
rs.close();
}
nConectaB.close();
return true;
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método BuscarRegistro para el registro de inscripción del estudiante
public boolean BuscarRegistro(String MiCedula, String MiLapso)
{
try
{
Integer.parseInt(MiCedula);
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM VALIDACIONES WHERE Val(CedulaEstudiante) = '" + MiCedula +
"'" +
" AND LapsoInscripcion = '" + MiLapso + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
nBanco = rs.getString("BancoDeposito");
nNumero = String.valueOf(rs.getInt("NumeroDeposito"));
String fecha = String.valueOf(rs.getString("FechaDeposito"));
nDia = String.valueOf(Integer.parseInt(fecha.substring(8, 10)));
nMes = String.valueOf(Integer.parseInt(fecha.substring(5, 7)));
nAno = fecha.substring(0, 4);
nMonto = String.valueOf(rs.getInt("MontoDeposito"));
nValida = rs.getString("ValidacionInscripcion");
}
if(sw == 0)
{
nConectaB.close();
return false;
}
rs.close();
}
nConectaB.close();
return true;
}
catch (Exception e)
{
//System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se Se define el método ImprimePlanilla para imprimir la planilla de inscripción
public void ImprimePlanilla()
{
pj = Toolkit.getDefaultToolkit().getPrintJob(new Frame(), "Imprimir planilla de inscripción",
null);
//*** Para formato 1.000,00
nf1 = NumberFormat.getInstance();
nf1.setMinimumFractionDigits(0);
nf1.setMaximumFractionDigits(0);
nf2 = NumberFormat.getInstance();
nf2.setMinimumFractionDigits(2);
nf2.setMaximumFractionDigits(2);
try
{
pagina = pj.getGraphics();
pagina.setColor(Color.black);
Image L_Img = Toolkit.getDefaultToolkit().getImage("C:/TG-319/4-IMAGENES/UN-1.JPG");
pagina.drawImage(L_Img, 20, 160, 100, 100, Color.black, observer);
pagina.setFont(fuente1);
pagina.drawString("UNIVERSIDAD NACIONAL", 50, 60);
pagina.setFont(fuente2);
pagina.drawString("SECRETARÍA", 50, 75);
pagina.setFont(fuente4);
ValCedula = Integer.parseInt(Validaciones.CajaTextoVCedula.getText());
pagina.drawString("No. de cédula : " + nf1.format(ValCedula), 50, 120);
pagina.drawString("Centro local : " +
Validaciones.CajaTextoVCentro.getText().toUpperCase(), 200, 120);
pagina.drawString("Carrera : " + Validaciones.CajaTextoVCarrera.getText().toUpperCase(),
380, 120);
pagina.drawString("Nombre : " + Validaciones.CajaTextoVNombre.getText().toUpperCase(), 50,
140);
pagina.drawString("Lapso : " + Validaciones.CajaTextoVLapso.getText(), 380, 140);
pagina.setFont(fuente2);
pagina.drawString("INSCRIPCIÓN REGULAR LAPSO " + Validaciones.CajaTextoVLapso.getText(),
170, 180);
pagina.setFont(fuente3);
pagina.drawLine(50, 190, 570, 190);
pagina.drawString("CÓDIGO", 50, 205);
pagina.drawString("ASIGNATURA", 150, 205);
pagina.drawString("SEMESTRE", 300, 205);
pagina.drawString("U.C.", 420, 205);
pagina.drawString("ARANCEL", 500, 205);
pagina.drawLine(50, 210, 570, 210);
pagina.setFont(fuente4);
int Fila = 225;
for (int i=0; i<Validaciones.MiTabla1.getRowCount(); i++)
{
pagina.drawString(Validaciones.MiTabla1.getValueAt(i,0).toString(), 60, Fila);
if (Validaciones.MiTabla1.getValueAt(i,1).toString().length() > 30)
{
String Asignatura = Validaciones.MiTabla1.getValueAt(i,1).toString().substring(0,30);
pagina.drawString(Asignatura, 110, Fila);
}
else
{
pagina.drawString(Validaciones.MiTabla1.getValueAt(i,1).toString(), 110, Fila);
}
pagina.drawString(Validaciones.MiTabla1.getValueAt(i,2).toString(), 325, Fila);
pagina.drawString(Validaciones.MiTabla1.getValueAt(i,3).toString(), 425, Fila);
pagina.drawString(Validaciones.MiTabla1.getValueAt(i,4).toString(), 500, Fila);
Fila = Fila + 10;
}
pagina.drawLine(50, Fila, 570, Fila);
Fila = Fila + 20;
pagina.setFont(fuente3);
pagina.drawString("DEPÓSITOS REALIZADOS", 230, Fila);
Fila = Fila + 10;
pagina.drawLine(50, Fila, 570, Fila);
Fila = Fila + 15;
pagina.drawString("BANCO", 90, Fila);
pagina.drawString("NUM. DEP.", 260, Fila);
pagina.drawString("FECHA", 390, Fila);
pagina.drawString("MONTO", 500, Fila);
Fila = Fila + 5;
pagina.drawLine(50, Fila, 570, Fila);
Fila = Fila + 15;
pagina.setFont(fuente4);
pagina.drawString(Validaciones.IntBanco, 50, Fila);
pagina.drawString(Validaciones.CajaTextoNumDeposito.getText(), 260, Fila);
pagina.drawString(Validaciones.IntDia + "/" + Validaciones.IntMes + "/" +
Validaciones.IntAno, 385, Fila);
ValArancel = Integer.parseInt(Validaciones.CajaTextoMonDeposito.getText());
pagina.drawString(nf2.format(ValArancel), 500, Fila);
Fila = Fila + 10;
pagina.drawLine(50, Fila, 570, Fila);
Fila = Fila + 15;
pagina.setFont(fuente3);
pagina.drawString("ADMINISTRADOR", 70, Fila);
pagina.drawString("ESTUDIANTE", 260, Fila);
pagina.drawString("JEFE DE REGISTRO", 450, Fila);
Fila = Fila + 5;
pagina.drawLine(50, Fila, 570, Fila);
Fila = Fila + 50;
pagina.drawLine(50, Fila, 570, Fila);
pagina.dispose();
pj.end();
}
catch(Exception e)
{
System.out.println("Impresion cancelada...");
}
}
//*** Se define el método EliminarDatos para eliminar el registro de onscripción del estudiante
public void EliminarDatos(String MiCedula,String MiLapso)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM VALIDACIONES WHERE Val(CedulaEstudiante) = '" + MiCedula + "'"
+
" AND LapsoInscripcion = '" + MiLapso + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
}
//*** Se crea una nueva clase para crear una tabla que sirve para consultar
//*** las inscripciones que han sido validadas
class TablaValidaciones extends JDialog
{
//*** Se declaran las variables
static int teCedula;
static String teNombre;
String
String
String
String
String
Dia = "";
Mes = "";
Ano = "";
fecha = String.valueOf(new Date());
MiLapso;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se crean los componentes necesarios
JButton
JButton
JButton
JButton
JButton
Boton1 = new
Boton2 = new
Boton3 = new
Boton4 = new
BotonAceptar
JButton("");
JButton("");
JButton("");
JButton("");
= new JButton(" Aceptar ");
public TablaValidaciones()
{
//*** Se define el título y tamaño de la ventana
super(new Frame(), "Consultar validaciones de inscripción", true);
setBounds( 0, 0, 460, 310 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
JPanel
PanelEspacio = new JPanel();
PanelTabla = new JPanel();
PanelBotonesTabla = new JPanel(new GridLayout(1,5,10,2));
Panel1Tabla = new JPanel(new BorderLayout(5,9));
PanelPricipalTabla = new JPanel(new FlowLayout(FlowLayout.CENTER));
DefaultTableModel MiTabla = new DefaultTableModel();
JTable Tabla = new JTable(MiTabla);
Tabla.setPreferredScrollableViewportSize(new Dimension(400,175));
JScrollPane scrollPane = new JScrollPane(Tabla);
Mes = fecha.substring(4,7);
Dia = fecha.substring(8,10);
Ano = fecha.substring(fecha.length() - 4, fecha.length());
if (Mes.equals("Jan") || Mes.equals("Feb") || Mes.equals("Mar") || Mes.equals("Apr") ||
Mes.equals("May") || Mes.equals("Jun"))
MiLapso = Ano + "-1";
else
MiLapso = Ano + "-2";
MiTabla.addColumn("No. de cédula");
MiTabla.addColumn("Nombre del estudiante");
MiTabla.addColumn("Carrera");
MiTabla.addColumn("Lapso");
//*** Se hace la conexión y se llena la tabla (listado) con los datos.
try
{
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM ESTUDIANTES a, VALIDACIONES b" +
" WHERE a.CedulaEstudiante = b.CedulaEstudiante AND b.LapsoInscripcion = '" + MiLapso + "'"
+
" AND b.ValidacionInscripcion = 1 ORDER BY a.CedulaEstudiante";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
//*** Se crea un arreglo que será una de las filas de la tabla.
Object [] Fila = new Object[4]; //*** Hay cuatro columnas en la tabla
String ced = String.valueOf(rs.getInt("CedulaEstudiante"));
Fila[0] = ced;
String nom = rs.getString("NombreEstudiante");
ObtenerDatos(nom);
Fila[1] = teNombre;
int car = rs.getInt("CodigoCarrera");
if (car == 236)
Fila[2] = "Ingeniería de Sistemas";
if (car == 280)
Fila[2] = "Ingeniería Industrial";
if (car == 612)
Fila[2] = "Administración de Empresas";
if (car == 610)
Fila[2] = "Contaduría Pública";
Fila[3] = rs.getString("LapsoInscripcion");
MiTabla.addRow(Fila);
}
rs.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
//*** Tooltips de los botones de la tabla
Boton1.setVisible(false);
Boton2.setVisible(false);
Boton3.setVisible(false);
Boton4.setVisible(false);
BotonAceptar.setMnemonic('A');
BotonAceptar.setToolTipText("Salir de la consulta...");
// *** Se agregan los componentes a los páneles
PanelEspacio.setLayout( new FlowLayout(FlowLayout.CENTER));
PanelTabla.add(scrollPane, BorderLayout.CENTER);
PanelBotonesTabla.add(Boton1);
PanelBotonesTabla.add(Boton2);
PanelBotonesTabla.add(BotonAceptar);
PanelBotonesTabla.add(Boton3);
PanelBotonesTabla.add(Boton4);
Panel1Tabla.add(PanelEspacio, BorderLayout.NORTH);
Panel1Tabla.add(PanelTabla, BorderLayout.CENTER);
Panel1Tabla.add(PanelBotonesTabla, BorderLayout.SOUTH);
PanelPricipalTabla.add(Panel1Tabla);
// *** Se agrega el panel principal a la ventana
add(PanelPricipalTabla);
//*** Se desactiva maximizar/minimizar
setResizable(false);
// *** Se centra la tabla en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos producidos por los botones del diálogo
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
dispose();
}
});
BotonAceptar.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
dispose();
}
});
}
//*** Se define el método ObtenerDatos para cargar los datos a la tabla
public String ObtenerDatos(String MiDato)
{
teNombre = MiDato;
return teNombre;
}
}
//*** Fin de la clase TablaValidaciones
//***************************************************************************
// Fin Clase ControlValidaciones
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: ControlUsuarios (Para trabajar con todas
****
//**** las funciones que hacen transacciones a la tabla USUARIOS de
****
//**** la base de datos ESTUDIANTES.MDB)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import
import
import
import
import
import
java.io.*;
java.sql.*;
java.awt.*;
java.awt.event.*;
javax.swing.*;
javax.swing.table.DefaultTableModel;
//***************************************************************************
// Inicio Clase ControlUsuarios
//***************************************************************************
public class ControlUsuarios
{
//*** Se declaran las variables
static
static
static
static
static
static
static
static
static
String vUsuario;
String vNombre;
int vCedula;
String vContrasena;
String vConfContrasena;
int vNivel;
String vDato;
String vCedula2;
boolean nRegistro = false;
static boolean nControl2 = true;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se define el método principal "main" de la Clase ControlUsuarios
public static void main(String[] args)
{
//*** Se coloca el método principal sólo como parte de la estructura de
//*** la clase, esta clase está compuesta por todos los métodos que hacen
//*** posible hacer transacciones como: agregar, modificar, eliminar,
//*** buscar usuarios,etc.,en la tabla USUARIOS de la base de datos
}
//*** Se define el método IniciarVariables para inicializar las variables
public void IniciarVariables()
{
vUsuario = Usuarios.CajaTextoUsuario.getText();
vNombre = Usuarios.CajaTextoNombreUsuario.getText();
vCedula2 = Usuarios.CajaTextoCedulaUsuario.getText();
vContrasena = Usuarios.CajaTextoContrasena.getText();
vConfContrasena = Usuarios.CajaTextoConfContrasena.getText();
vNivel = Usuarios.UsuNivel;
}
//*** Se define el método VerificarDatos para verificar los datos del usuario
public void VerificarDatos()
{
//*** Se registran los datos del usuario a través del método GuardarDatos
if(!vUsuario.equals("") && !vNombre.equals("") &&
!vCedula2.equals("") && !vContrasena.equals("") &&
!vConfContrasena.equals("") && vContrasena.equals(vConfContrasena) &&
vUsuario.length() <= 14 && vContrasena.length() <= 8)
{
if (Usuarios.nIngresa == true)
{
if (GuardarDatos(vUsuario,vNombre,vCedula2,vContrasena,vNivel) == true && nRegistro ==
false)
{
nRegistro = false;
Usuarios.nUsu = true;
}
else
{
nRegistro = false;
Usuarios.nUsu = false;
}
}
else
{
if (ActualizarDatos(vUsuario,vNombre,vCedula2,vContrasena,vNivel) == true && nRegistro
== false)
{
nRegistro = false;
Usuarios.nUsu = true;
}
else
{
nRegistro = false;
Usuarios.nUsu = false;
}
}
}
}
//*** Se define el método GuardarDatos para guardar los datos de usuarios
public boolean GuardarDatos(String MiUsuario,String MiNombreUsuario,
String MiCedula,String MiContrasena,int MiNivel)
{
try
{
if (ControlUsuarios.nRegistro == false)
{
int ced = Integer.parseInt(MiCedula);
nConectaB = nConexion.HacerConexion();
String sql = "INSERT INTO USUARIOS (NombreUsuario, NombreCompleto, CedulaUsuario,
ClaveUsuario, NivelUsuario) " +
"VALUES ('"+MiUsuario+"', '"+MiNombreUsuario+"', '"+ced+"',
'"+MiContrasena+"','"+MiNivel+"');";
PreparedStatement ps=nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han guardado los datos...");
}
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método BuscarCedula para buscar datos de usuarios
public boolean BuscarCedula(String MiCedula)
{
try
{
Integer.parseInt(MiCedula);
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM USUARIOS WHERE Val(CedulaUsuario)= '" + MiCedula + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
vUsuario = rs.getString("NombreUsuario");
vNombre = rs.getString("NombreCompleto");
vCedula = rs.getInt("CedulaUsuario");
vContrasena = rs.getString("ClaveUsuario");
vNivel = rs.getInt("NivelUsuario");
}
if(sw == 0)
{
nConectaB.close();
return false;
}
rs.close();
}
nConectaB.close();
return true;
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método ActualizarDatos para actualizar los datos de usuarios
public boolean ActualizarDatos(String MiUsuario,String MiNombreUsuario,
String MiCedula,String MiContrasena,int MiNivel)
{
try
{
if (ControlUsuarios.nRegistro == false)
{
int ced = Integer.parseInt(MiCedula);
nConectaB = nConexion.HacerConexion();
String sql= "UPDATE USUARIOS SET NombreUsuario = '"+MiUsuario+"',NombreCompleto =
'"+MiNombreUsuario+
"',CedulaUsuario = '"+ced+"',ClaveUsuario = '"+MiContrasena+"',NivelUsuario = '"+MiNivel+
"' WHERE Val(CedulaUsuario) = '"+MiCedula+"'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
System.out.println("Se han actualizado los datos...");
}
return true;
}
catch(Exception e)
{
if (vDato == "Incorrecto")
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Este usuario o contraseña ya existe !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlUsuarios.nRegistro = false;
}
else
{
System.out.println("Se ha producido un error : " + e.toString());
}
return false;
}
}
//*** Se define el método EliminarDatos para eliminar usuarios
public void EliminarDatos(String MiCedula)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM USUARIOS WHERE Val(CedulaUsuario)= '" + MiCedula + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
EliminarEstudiante(MiCedula);
EliminarHistorico(MiCedula);
EliminarInscripcion(MiCedula);
EliminarValidacion(MiCedula);
Usuarios.nUsu = true;
System.out.println("Se han eliminado los datos...");
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
//*** Se define el método EliminarEstudiante para eliminar el estudiante del sistema
public void EliminarEstudiante(String MiHCedula)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM ESTUDIANTES WHERE Val(CedulaEstudiante)= '" + MiHCedula + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
//*** Se define el método EliminarHistorico para eliminar el histórico del estudiante
public void EliminarHistorico(String MiHCedula)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM HISTORICO WHERE Val(CedulaEstudiante)= '" + MiHCedula + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
//*** Se define el método EliminarInscripcion para eliminar la inscripción del estudiante
public void EliminarInscripcion(String MiHCedula)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM INSCRIPCIONES WHERE Val(CedulaEstudiante)= '" + MiHCedula +
"'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
//*** Se define el método EliminarValidacion para eliminar la validación del estudiante
public void EliminarValidacion(String MiHCedula)
{
try
{
nConectaB = nConexion.HacerConexion();
String sql = "DELETE * FROM VALIDACIONES WHERE Val(CedulaEstudiante)= '" + MiHCedula + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ps.executeUpdate();
nConectaB.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
}
}
//*** Se crea una nueva clase para crear una tabla que sirve para consultar
//*** los datos de los usuarios
class TablaUsuarios extends JDialog
{
//*** Se declaran las variables
static int tuCedula;
static String tuUsuario;
static String tuNombre;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
//*** Se crean los componentes necesarios
JButton
JButton
JButton
JButton
JButton
Boton1 = new
Boton2 = new
Boton3 = new
Boton4 = new
BotonAceptar
JButton("");
JButton("");
JButton("");
JButton("");
= new JButton(" Aceptar ");
public TablaUsuarios()
{
//*** Se define el título y tamaño de la ventana
super(new Frame(), "Consultar usuarios", true);
setBounds( 0, 0, 460, 310 );
//*** Se crean los páneles para acomodar los componentes
JPanel
JPanel
JPanel
JPanel
JPanel
PanelEspacio = new JPanel();
PanelTabla = new JPanel();
PanelBotonesTabla = new JPanel(new GridLayout(1,5,10,2));
Panel1Tabla = new JPanel(new BorderLayout(5,9));
PanelPricipalTabla = new JPanel(new FlowLayout(FlowLayout.CENTER));
DefaultTableModel MiTabla = new DefaultTableModel();
JTable Tabla = new JTable(MiTabla);
Tabla.setPreferredScrollableViewportSize(new Dimension(400,175));
JScrollPane scrollPane = new JScrollPane(Tabla);
MiTabla.addColumn("Usuario");
MiTabla.addColumn("Nombre de usuario");
MiTabla.addColumn("No. de cédula");
MiTabla.addColumn("Nivel");
//*** Se hace la conexión y se llena la tabla (listado) con los datos.
try
{
nConectaB = nConexion.HacerConexion();
String sql = "SELECT * FROM USUARIOS";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
//*** Se crea un arreglo que será una de las filas de la tabla.
Object [] Fila = new Object[4]; //*** Hay tres columnas en la tabla
String usu = rs.getString("NombreUsuario");
ObtenerDatos(usu);
Fila[0] = tuUsuario;
String nom = rs.getString("NombreCompleto");
ObtenerDatos(nom);
Fila[1] = tuUsuario;
String ced = String.valueOf(rs.getInt("CedulaUsuario"));
Fila[2] = ced;
int niv = rs.getInt("NivelUsuario");
if (niv == 0)
Fila[3] = "Administrador";
if (niv == 1)
Fila[3] = "Estudiante";
MiTabla.addRow(Fila);
}
rs.close();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : "+ e.toString());
}
//*** Tooltips de los botones de la tabla
Boton1.setVisible(false);
Boton2.setVisible(false);
Boton3.setVisible(false);
Boton4.setVisible(false);
BotonAceptar.setMnemonic('A');
BotonAceptar.setToolTipText("Salir de la consulta...");
// *** Se agregan los componentes a los páneles
PanelEspacio.setLayout( new FlowLayout(FlowLayout.CENTER));
PanelTabla.add(scrollPane, BorderLayout.CENTER);
PanelBotonesTabla.add(Boton1);
PanelBotonesTabla.add(Boton2);
PanelBotonesTabla.add(BotonAceptar);
PanelBotonesTabla.add(Boton3);
PanelBotonesTabla.add(Boton4);
Panel1Tabla.add(PanelEspacio, BorderLayout.NORTH);
Panel1Tabla.add(PanelTabla, BorderLayout.CENTER);
Panel1Tabla.add(PanelBotonesTabla, BorderLayout.SOUTH);
PanelPricipalTabla.add(Panel1Tabla);
// *** Se agrega el panel principal a la ventana
add(PanelPricipalTabla);
//*** Se desactiva maximizar/minimizar
setResizable(false);
// *** Se centra la tabla en la pantalla
Dimension pantalla, cuadro;
pantalla = Toolkit.getDefaultToolkit().getScreenSize();
cuadro = this.getSize();
this.setLocation(((pantalla.width - cuadro.width)/2), (pantalla.height - cuadro.height)/2);
//*** Eventos producidos por los botones del diálogo
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
dispose();
}
});
BotonAceptar.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
dispose();
}
});
}
//*** Se define el método ObtenerDatos para cargar los datos a la tabla
public String ObtenerDatos(String MiDato)
{
tuUsuario = MiDato;
return tuUsuario;
}
}
//*** Fin de la clase TablaUsuarios
//***************************************************************************
// Fin Clase ControlUsuarios
//***************************************************************************
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** CÓDIGO BASE - CLASE: ConexionODBC (Carga el driver y hace la
****
//**** conexión con el origen de datos "Estudiantes" a través de un
****
//**** puente JDBC-ODBC)
****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import java.sql.*;
//***************************************************************************
// Inicio Clase ConexionODBC
//***************************************************************************
public class ConexionODBC
{
//*** Se define el método principal "main" de la Clase ConexionODBC
public static void main(String[] args)
{
//*** Se ejecuta el constructor ConexionODBC de la clase ConexionODBC,
//*** esta clase simplemente carga el driver JDBC y hace la conexión con
//*** el origen de datos "Estudiantes" a través de un puente JDBC-ODBC,
//*** para más información sobre el origen de datos consultar el archivo
//*** C:\TG-319\3-BASE DE DATOS\ACERCA DEL ORIGEN DE DATOS.doc
new ConexionODBC();
}
//*** Se define el constructor ConexionODBC para cargar el driver
//*** "sun.jdbc.odbc.JdbcOdbcDriver"
ConexionODBC()
{
try
{
Driver d = (Driver)Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
}
//*** Se define el método HacerConexion para crear la conexión con el origen
//*** de datos "Estudiantes"
public Connection HacerConexion()
{
Connection nConecta = null;
try
{
nConecta = DriverManager.getConnection("jdbc:odbc:Estudiantes","","");
}
catch (Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
}
return nConecta;
}
}
//***************************************************************************
// Fin Clase ConexionODBC
//***************************************************************************
ANEXO 5
DOCUMENTACIÓN DEL ASPECTO
//***************************************************************************
//**** UNIVERSIDAD NACIONAL ABIERTA
****
//**** CENTRO LOCAL SUCRE - 17
****
//**** INGENIERÍA DE SISTEMAS - 236
****
//****
****
//**** TRABAJO DE GRADO - 319
****
//**** LAPSO: 2006-2
****
//**** IMPLEMENTACIÓN DE REQUISITOS NO FUNCIONALES A TRAVÉS DE LA
****
//**** PROGRAMACIÓN ORIENTADA A ASPECTOS
****
//****
****
//**** CASO DE ESTUDIO: Aplicación que simula el registro de
****
//**** inscripciones regulares de una universidad (UNSIR 1.0.1)
****
//****
****
//**** ASPECTO: AspectoSeguridad (Para crear el aspecto SEGURIDAD con
****
//**** los atributos: Integridad, Disponibilidad y Confidencialidad,
****
//**** como requisitos no funcionales común para las clases de control) ****
//****
****
//**** AUTOR: CARLOS CÓRDOVA - C.I.: 8.441.858
****
//***************************************************************************
//***************************************************************************
// Paquetes de la librería de clases estándar de Java
//***************************************************************************
import
import
import
import
java.awt.*;
javax.swing.*;
java.io.*;
java.sql.*;
//***************************************************************************
// Inicio Aspecto AspectoSeguridad
//***************************************************************************
public aspect AspectoSeguridad
{
//*** Se declaran las variables
static
static
static
static
static
static
String SeUsuario;
String SeNombre;
String SeCedula;
String SeContrasena;
String SeConfContrasena;
int SeNivel;
static String SeCaracter;
static String SeCodigo;
static int Img = 0;
//*** Se declara una variable y se crean dos objetos para gestionar el manejo
//*** del origen de datos de la clase ConexionODBC
InputStream nInp = System.in;
InputStreamReader nControl = new InputStreamReader(nInp);
BufferedReader nBuffer = new BufferedReader(nControl);
//*** Se crea una instancia nConexion de la clase ConexionODBC para utilizar
//*** los métodos de esta clase, que hacen el puente JDBC-ODBC
ConexionODBC nConexion = new ConexionODBC();
Connection nConectaB = null;
///************************************************************************
///*** ASPECTO: SEGURIDAD - ATRIBUTO: INTEGRIDAD
///*** POINCUT: MANEJO DE EXCEPCIONES
///************************************************************************
///************************************************************************
///*** POINTCUT Excepciones atraviesa ortogonalmente a las clases:
///*** ControlPassword,ControlUsuarios,ControlEstudiantes,ControlAsignaturas,
///*** ControlInscripciones,ControlValidaciones en los métodos
///*** VerificarDatos(),BuscarCedula
///************************************************************************
pointcut Excepciones(): (execution(*
execution(*
execution(*
execution(*
execution(*
execution(*
execution(*
execution(*
execution(*
ControlPassword.VerificarDatos(..)) ||
ControlUsuarios.VerificarDatos(..)) ||
ControlEstudiantes.VerificarDatos(..))||
ControlAsignaturas.VerificarDatos(..))||
ControlInscripciones.VerificarDatos(..))||
ControlValidaciones.VerificarDatos(..))||
ControlUsuarios.BuscarCedula(..))||
ControlEstudiantes.BuscarCedula(..))||
ControlHistorico.BuscarCedula(..))||
execution(* ControlInscripciones.BuscarCedula(..))||
execution(* ControlValidaciones.BuscarCedula(..)));
///************************************************************************
///*** Advise before: pointcut Excepciones()
///************************************************************************
before (): Excepciones()
{
if (ControlPassword.nControl1 == true)
{
//*** Muestra mensajes de advertencia en caso de que los datos no sean
//*** correctos o cuando no se encuentra un usuario/contraseña a través
//*** de la clase ControlPassword y así mantener la integridad de los datos
if(ControlPassword.nUsuario.equals("") && ControlPassword.nContrasena.equals(""))
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe llenar los campos de Usuario y Contraseña !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlPassword.nUsuario = "";
}
else if (BuscarUsuario(ControlPassword.nUsuario,ControlPassword.nContrasena)== false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Este usuario o contraseña no existe !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlPassword.nUsuario = "";
}
}
if (ControlUsuarios.nControl2 == true)
{
//*** Muestra mensajes de advertencia en caso de que los datos no sean
//*** correctos cuando se quiere ingresar un usuario nuevo a través
//*** de la clase ControlUsuarios y así mantener la integridad de los datos
if(!ControlUsuarios.vUsuario.equals("") && !ControlUsuarios.vNombre.equals("") &&
!ControlUsuarios.vCedula2.equals("") && !ControlUsuarios.vContrasena.equals("") &&
!ControlUsuarios.vConfContrasena.equals(""))
{
if (ControlUsuarios.vUsuario.length() > 14)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ El nombre del usuario debe tener máximo 14 carecteres !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlUsuarios.vCedula2 = "";
}
else if (ControlUsuarios.vContrasena.length() > 8)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ La contraseña del usuario debe tener máximo 8 carecteres !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlUsuarios.vCedula2 = "";
}
else if (ValidarCedula(ControlUsuarios.vCedula2) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe ingresar una valor numérico para la cédula !!","Atención",
JOptionPane.ERROR_MESSAGE);
ControlUsuarios.vCedula2 = "";
}
else if (!ControlUsuarios.vContrasena.equals(ControlUsuarios.vConfContrasena))
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Verifique la confirmación de la contraseña !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlUsuarios.vCedula2 = "";
}
else if (ExisteUsuario(ControlUsuarios.vUsuario,ControlUsuarios.vContrasena) == true)
{
if(Usuarios.nIngresa == true)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Este usuario o contraseña ya existe !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlUsuarios.vCedula2 = "";
}
}
else if (ExisteCedulaUsuario(ControlUsuarios.vCedula2) == true)
{
if(Usuarios.nIngresa == true)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Ya existe un usuario con este número de cédula !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlUsuarios.vCedula2 = "";
}
}
else
{
ControlUsuarios.nRegistro = true;
MenuAdministrador.nMEU = true;
}
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe llenar todos los campos obligatoriamente !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlUsuarios.nRegistro = false;
}
}
if (ControlEstudiantes.nControl5 == true)
{
//*** Muestra mensajes de advertencia en caso de que los datos no sean
//*** correctos cuando se quiere ingresar un estudiante nuevo a través
//*** de la clase ControlEstudiantes y así mantener la integridad de los datos
if(!ControlEstudiantes.vCedula2.equals("") && !ControlEstudiantes.vNombre.equals("") &&
!ControlEstudiantes.vDireccion.equals(""))
{
if (ValidarCedula(ControlEstudiantes.vCedula2) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe ingresar una valor numérico para la cédula !!","Atención",
JOptionPane.ERROR_MESSAGE);
ControlEstudiantes.vCedula2 = "";
}
else if (((ControlEstudiantes.vDia + 1) == 29 && (ControlEstudiantes.vMes + 1) == 2 &&
!Estudiantes.Ano[ControlEstudiantes.vAno].equals("1956") &&
!Estudiantes.Ano[ControlEstudiantes.vAno].equals("1960") &&
!Estudiantes.Ano[ControlEstudiantes.vAno].equals("1964") &&
!Estudiantes.Ano[ControlEstudiantes.vAno].equals("1968") &&
!Estudiantes.Ano[ControlEstudiantes.vAno].equals("1972") &&
!Estudiantes.Ano[ControlEstudiantes.vAno].equals("1976") &&
!Estudiantes.Ano[ControlEstudiantes.vAno].equals("1980") &&
!Estudiantes.Ano[ControlEstudiantes.vAno].equals("1984") &&
!Estudiantes.Ano[ControlEstudiantes.vAno].equals("1988") &&
!Estudiantes.Ano[ControlEstudiantes.vAno].equals("1992")) ||
((ControlEstudiantes.vDia + 1) >= 30 && (ControlEstudiantes.vMes + 1) == 2) ||
((ControlEstudiantes.vDia + 1) == 31 && (ControlEstudiantes.vMes + 1) == 4) ||
((ControlEstudiantes.vDia + 1) == 31 && (ControlEstudiantes.vMes + 1) == 6) ||
((ControlEstudiantes.vDia + 1) == 31 && (ControlEstudiantes.vMes + 1) == 9) ||
((ControlEstudiantes.vDia + 1) == 31 && (ControlEstudiantes.vMes + 1) == 11))
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe ingresar una fecha correcta para este año !!","Atención",
JOptionPane.ERROR_MESSAGE);
ControlEstudiantes.vCedula2 = "";
}
else if (ExisteCedulaEstudiante(ControlEstudiantes.vCedula2) == true)
{
if(Estudiantes.nIngresa == true)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Ya existe un estudiante con este número de cédula !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlEstudiantes.vCedula2 = "";
}
else
{
ControlEstudiantes.nRegistro = true;
MenuAdministrador.nMEU = true;
}
}
else
{
ControlEstudiantes.nRegistro = true;
MenuAdministrador.nMEU = true;
}
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe llenar los campos cédula, nombre y dirección obligatoriamente !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlEstudiantes.nRegistro = false;
}
}
if (ControlAsignaturas.nControl8 == true)
{
//*** Muestra mensajes de advertencia en caso de que los datos no sean
//*** correctos cuando se quiere ingresar una asignatura nueva a través
//*** de la clase ControlAsignaturas y así mantener la integridad de los datos
if(!ControlAsignaturas.vCodigo2.equals("") && !ControlAsignaturas.vNombre.equals("") &&
!ControlAsignaturas.vUC.equals(""))
{
if (ValidarCodigo(ControlAsignaturas.vCodigo2) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe ingresar una valor numérico para el código !!","Atención",
JOptionPane.ERROR_MESSAGE);
ControlAsignaturas.nRegistro = false;
MenuAdministrador.nMEU = false;
}
else if (ExisteCodigoAsignatura(ControlAsignaturas.vCodigo2) == true)
{
if(Asignaturas.nIngresa == true)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Ya existe una asignatura con este número de código !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlAsignaturas.nRegistro = false;
MenuAdministrador.nMEU = false;
}
}
else
MenuAdministrador.nMEU = true;
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe llenar todos los campos obligatoriamente !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlAsignaturas.nRegistro = false;
}
}
if (ControlValidaciones.nControl12 == true && MenuEstudiante.adsCedula.equals(""))
{
//*** Muestra mensajes de advertencia en caso de que los datos no sean
//*** correctos cuando se quiere ingresar una asignatura nueva a través
//*** de la clase ControlValidaciones y así mantener la integridad de los datos
if(!ControlValidaciones.vNumero.equals("") && !ControlValidaciones.vMonto.equals(""))
{
if (ValidarCodigo(ControlValidaciones.vNumero) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe ingresar una valor numérico para el número de depósito !!","Atención",
JOptionPane.ERROR_MESSAGE);
ControlValidaciones.nRegistro = false;
MenuAdministrador.nMEU = false;
}
else if (ValidarCodigo(ControlValidaciones.vMonto) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe ingresar una valor numérico para el monto !!","Atención",
JOptionPane.ERROR_MESSAGE);
ControlValidaciones.nRegistro = false;
MenuAdministrador.nMEU = false;
}
else if ((ControlValidaciones.vDia.equals("29") && ControlValidaciones.vMes.equals("2")
&&
!ControlValidaciones.vAno.equals("1976") &&
!ControlValidaciones.vAno.equals("1980") &&
!ControlValidaciones.vAno.equals("1984") &&
!ControlValidaciones.vAno.equals("1988") &&
!ControlValidaciones.vAno.equals("1992") &&
!ControlValidaciones.vAno.equals("1996") &&
!ControlValidaciones.vAno.equals("2000") &&
!ControlValidaciones.vAno.equals("2004") &&
!ControlValidaciones.vAno.equals("2008") &&
!ControlValidaciones.vAno.equals("2012")) ||
((ControlValidaciones.vDia.equals("30") ||
ControlValidaciones.vDia.equals("31")) &&
(ControlValidaciones.vMes.equals("2"))) ||
(ControlValidaciones.vDia.equals("31") &&
ControlValidaciones.vMes.equals("4")) ||
(ControlValidaciones.vDia.equals("31") &&
ControlValidaciones.vMes.equals("6")) ||
(ControlValidaciones.vDia.equals("31") &&
ControlValidaciones.vMes.equals("9")) ||
(ControlValidaciones.vDia.equals("31") &&
ControlValidaciones.vMes.equals("11")))
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe ingresar una fecha correcta para este año !!","Atención",
JOptionPane.ERROR_MESSAGE);
ControlValidaciones.vMonto = "";
ControlValidaciones.nRegistro = false;
MenuAdministrador.nMEU = false;
}
else
MenuAdministrador.nMEU = true;
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe llenar todos los campos obligatoriamente !!","Atención",
JOptionPane.WARNING_MESSAGE);
ControlValidaciones.nRegistro = false;
}
}
//*** Muestra mensajes de advertencia en caso de que los datos no sean
//*** correctos cuando se quiere ingresar un número de cédula
//*** y así mantener la integridad de los datos a través de las clases
//*** de control
if (MenuAdministrador.nControl3 == true)
{
if (ValidarCedula(MenuAdministrador.adsCedula) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe ingresar una valor numérico para la cédula !!","Atención",
JOptionPane.ERROR_MESSAGE);
MenuAdministrador.nControl3 = false;
}
else if (ExisteCedulaUsuario(MenuAdministrador.adsCedula) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ No existe un usuario con este número de cédula !!","Atención",
JOptionPane.WARNING_MESSAGE);
MenuAdministrador.nControl3 = false;
}
}
if (MenuAdministrador.nControl4 == true)
{
if (ValidarCedula(MenuAdministrador.adsCedula) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe ingresar una valor numérico para la cédula !!","Atención",
JOptionPane.ERROR_MESSAGE);
MenuAdministrador.nControl4 = false;
MenuAdministrador.adsCedula = "";
}
else if (ExisteCedulaEstudiante(MenuAdministrador.adsCedula) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ No existe un estudiante con este número de cédula !!","Atención",
JOptionPane.WARNING_MESSAGE);
MenuAdministrador.nControl4 = false;
MenuAdministrador.adsCedula = "";
}
}
if (MenuAdministrador.nControl6 == true)
{
if (ValidarCedula(MenuAdministrador.adsCedula2) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe ingresar una valor numérico para la cédula !!","Atención",
JOptionPane.ERROR_MESSAGE);
MenuAdministrador.nControl6 = false;
MenuAdministrador.adsCedula2 = "";
}
else if (ExisteCedulaEstudiante(MenuAdministrador.adsCedula2) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ No existe un estudiante con este número de cédula !!","Atención",
JOptionPane.WARNING_MESSAGE);
MenuAdministrador.nControl6 = false;
MenuAdministrador.adsCedula2 = "";
}
else
ControlHistorico.nRegistro = true;
}
if (MenuAdministrador.nControl9 == true)
{
if (ValidarCedula(MenuAdministrador.adsCedula3) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe ingresar una valor numérico para la cédula !!","Atención",
JOptionPane.ERROR_MESSAGE);
MenuAdministrador.nControl9 = false;
}
else if (ExisteCedulaEstudiante(MenuAdministrador.adsCedula3) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ No existe un estudiante con este número de cédula !!","Atención",
JOptionPane.WARNING_MESSAGE);
MenuAdministrador.nControl9 = false;
}
else
ControlInscripciones.nRegistro = true;
}
if (MenuAdministrador.nControl11 == true)
{
if (ValidarCedula(MenuAdministrador.adsCedula4) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Debe ingresar una valor numérico para la cédula !!","Atención",
JOptionPane.ERROR_MESSAGE);
MenuAdministrador.nControl11 = false;
}
else if (ExisteCedulaEstudiante(MenuAdministrador.adsCedula4) == false)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ No existe un estudiante con este número de cédula !!","Atención",
JOptionPane.WARNING_MESSAGE);
MenuAdministrador.nControl11 = false;
}
else
ControlValidaciones.nRegistro = true;
}
}
///************************************************************************
///*** Advise after: pointcut Excepciones()
///************************************************************************
after(): Excepciones()
{
//*** Muestra mensaje de transacción exitosa en caso de que los datos
//*** ingresados a través de las clases de control sean correctos
if (ControlUsuarios.nControl2 == true)
{
if (Usuarios.nUsu == true)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Los datos del usuario fueron guardados con éxito !!","Atención",
JOptionPane.INFORMATION_MESSAGE);
}
}
if (ControlEstudiantes.nControl5 == true)
{
if (Estudiantes.nEst == true)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Los datos del estudiante fueron guardados con éxito !!","Atención",
JOptionPane.INFORMATION_MESSAGE);
}
}
if (ControlHistorico.nControl7 == true)
{
if (Historico.nHis == true)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Los datos del histórico del estudiante fueron guardados con éxito !!","Atención",
JOptionPane.INFORMATION_MESSAGE);
}
}
if (ControlAsignaturas.nControl8 == true)
{
if (Asignaturas.nAsig == true)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Los datos de la materia fueron guardados con éxito !!","Atención",
JOptionPane.INFORMATION_MESSAGE);
}
}
if (ControlInscripciones.nControl10 == true)
{
if (Inscripciones.nInc == true)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Los datos de la selección de asignaturas fueron guardados con éxito !!","Atención",
JOptionPane.INFORMATION_MESSAGE);
}
}
if (ControlValidaciones.nControl12 == true)
{
if (Validaciones.nVal == true)
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Los datos del registro de inscripción fueron guardados con éxito !!","Atención",
JOptionPane.INFORMATION_MESSAGE);
}
}
///************************************************************************
///************************************************************************
///************************************************************************
//*** Desencripta los datos a través de las clases de control
if (MenuAdministrador.nControl3 == true)
{
SeUsuario = Desencriptar(ControlUsuarios.vUsuario);
SeNombre = Desencriptar(ControlUsuarios.vNombre);
SeContrasena = Desencriptar(ControlUsuarios.vContrasena);
ControlUsuarios.vUsuario = SeUsuario;
ControlUsuarios.vNombre = SeNombre;
ControlUsuarios.vContrasena = SeContrasena;
}
if (MenuAdministrador.nControl4 == true && MenuEstudiante.adsCedula.equals("") ||
MenuEstudiante.nControl4 == true)
{
SeNombre = Desencriptar(ControlEstudiantes.vNombre);
ControlEstudiantes.vNombre = SeNombre;
}
if (MenuAdministrador.nControl6 == true && MenuEstudiante.adsCedula.equals("") ||
MenuEstudiante.nControl6 == true)
{
SeNombre = Desencriptar(ControlHistorico.vNombre);
ControlHistorico.vNombre = SeNombre;
}
if (MenuAdministrador.nControl9 == true && MenuEstudiante.adsCedula.equals("") ||
MenuEstudiante.nControl9 == true)
{
SeNombre = Desencriptar(ControlInscripciones.vNombre);
ControlInscripciones.vNombre = SeNombre;
}
if (MenuAdministrador.nControl11 == true && MenuEstudiante.adsCedula.equals("") ||
MenuEstudiante.nControl11 == true)
{
SeNombre = Desencriptar(ControlValidaciones.nNombre);
ControlValidaciones.nNombre = SeNombre;
}
}
///************************************************************************
///*** ASPECTO: SEGURIDAD - ATRIBUTO: DISPONIBILIDAD
///*** POINCUT: OPERACIÓN POR PERSONAS
///************************************************************************
///************************************************************************
///*** POINTCUT Operacion atraviesa ortogonalmente a las clases:
///*** ControlUsuarios,ControlEstudiantes,ControlHistorico,ControlInscripciones,
///*** ControlValidaciones en los métodos GuardarDatos(),ActualizarDatos()
///************************************************************************
pointcut Operacion(): (execution(*
execution(*
execution(*
execution(*
execution(*
execution(*
execution(*
execution(*
ControlUsuarios.GuardarDatos(..)) ||
ControlEstudiantes.GuardarDatos(..))||
ControlHistorico.GuardarDatos(..))||
ControlInscripciones.GuardarDatos(..))||
ControlValidaciones.GuardarDatos(..))||
ControlUsuarios.ActualizarDatos(..))||
ControlEstudiantes.ActualizarDatos(..))||
ControlHistorico.ActualizarDatos(..)));
///************************************************************************
///*** Advise before: pointcut Operacion()
///************************************************************************
before (): Operacion()
{
//*** Ejecuta el método IngresaCaracteres que muestra una imagen con
//*** caracteres, con la finalidad de forzar al operador a escribir estos
//*** caracteres para comprobar que es una persona y no un programa
//*** automatizado el que ingresa los datos a través de las clases de control
if (ControlUsuarios.nControl2 == true)
{
if (ControlUsuarios.nRegistro == true || MenuAdministrador.nMEU == true)
{
IngresaCaracteres();
if (SeCaracter.equals(SeCodigo))
{
ControlUsuarios.nRegistro = false;
if (ExisteUsuario(ControlUsuarios.vUsuario,ControlUsuarios.vContrasena) == true
&& Usuarios.nIngresa == false)
ControlUsuarios.vDato = "Incorrecto";
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Acceso denegado, no se pueden guardar los datos !!","Atención",
JOptionPane.ERROR_MESSAGE);
if (MenuAdministrador.nMEU == true)
ControlUsuarios.nRegistro = true;
}
}
}
if (ControlEstudiantes.nControl5 == true)
{
if (ControlEstudiantes.nRegistro == true || MenuAdministrador.nMEU == true)
{
IngresaCaracteres();
if (SeCaracter.equals(SeCodigo))
{
ControlEstudiantes.nRegistro = false;
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Acceso denegado, no se pueden guardar los datos !!","Atención",
JOptionPane.ERROR_MESSAGE);
if (MenuAdministrador.nMEU == true)
ControlEstudiantes.nRegistro = true;
}
}
}
if (ControlHistorico.nControl7 == true)
{
if (ControlHistorico.nRegistro == true || MenuAdministrador.nMEU == true)
{
IngresaCaracteres();
if (SeCaracter.equals(SeCodigo))
{
ControlHistorico.nRegistro = false;
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Acceso denegado, no se pueden guardar los datos !!","Atención",
JOptionPane.ERROR_MESSAGE);
if (MenuAdministrador.nMEU == true)
ControlHistorico.nRegistro = true;
}
}
}
if (ControlInscripciones.nControl10 == true)
{
if (ControlInscripciones.nRegistro == true || MenuAdministrador.nMEU == true)
{
IngresaCaracteres();
if (SeCaracter.equals(SeCodigo))
{
ControlInscripciones.nRegistro = false;
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Acceso denegado, no se pueden guardar los datos !!","Atención",
JOptionPane.ERROR_MESSAGE);
if (MenuAdministrador.nMEU == true)
ControlInscripciones.nRegistro = true;
}
}
}
if (ControlValidaciones.nControl12 == true)
{
if (ControlValidaciones.nRegistro == true || MenuAdministrador.nMEU == true)
{
IngresaCaracteres();
if (SeCaracter.equals(SeCodigo))
{
ControlValidaciones.nRegistro = false;
}
else
{
Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(null,
"¡¡ Acceso denegado, no se pueden guardar los datos !!","Atención",
JOptionPane.ERROR_MESSAGE);
if (MenuAdministrador.nMEU == true)
ControlValidaciones.nRegistro = true;
}
}
}
}
///************************************************************************
///*** ASPECTO: SEGURIDAD - ATRIBUTO: CONFIDENCIALIDAD
///*** POINCUT: ENCRIPTAMIENTO DE DATOS
///************************************************************************
///************************************************************************
///*** POINTCUT Encriptar atraviesa ortogonalmente a las clases:
///*** ControlPassword,ControlUsuarios,ControlEstudiantes en el método
///*** IniciarVariables()
///************************************************************************
pointcut Encriptar(): (execution(* ControlPassword.IniciarVariables(..))||
execution(* ControlUsuarios.IniciarVariables(..))||
execution(* ControlEstudiantes.IniciarVariables(..)));
///************************************************************************
///*** Advise after: pointcut Encriptar()
///************************************************************************
after(): Encriptar()
{
//*** Encripta los datos a través de las clases de control
if (ControlPassword.nControl1 == true)
{
SeUsuario = Encriptar(ControlPassword.nUsuario);
SeContrasena = Encriptar(ControlPassword.nContrasena);
ControlPassword.nUsuario = SeUsuario;
ControlPassword.nContrasena = SeContrasena;
}
if (ControlUsuarios.nControl2 == true)
{
SeUsuario = Encriptar(ControlUsuarios.vUsuario);
SeNombre = Encriptar(ControlUsuarios.vNombre);
SeContrasena = Encriptar(ControlUsuarios.vContrasena);
SeConfContrasena = Encriptar(ControlUsuarios.vConfContrasena);
ControlUsuarios.vUsuario = SeUsuario;
ControlUsuarios.vNombre = SeNombre;
ControlUsuarios.vContrasena = SeContrasena;
ControlUsuarios.vConfContrasena = SeConfContrasena;
}
if (ControlEstudiantes.nControl5 == true)
{
SeNombre = Encriptar(ControlEstudiantes.vNombre);
ControlEstudiantes.vNombre = SeNombre;
}
}
///************************************************************************
///*** POINTCUT Desencriptar atraviesa ortogonalmente a las clases:
///*** ControlUsuarios,ControlEstudiantes en el método
///*** ObtenerDatos()
///************************************************************************
pointcut Desencriptar(): (execution(*
execution(*
execution(*
execution(*
ControlPassword.ObtenerDatos(..))||
TablaEstudiantes.ObtenerDatos(..))||
TablaValidaciones.ObtenerDatos(..))||
TablaUsuarios.ObtenerDatos(..)));
///************************************************************************
///*** Advise after: pointcut Desencriptar()
///************************************************************************
after(): Desencriptar()
{
//*** Desencripta los datos a través de las clases de control
if (ControlPassword.nControl1 == true)
{
SeUsuario = Desencriptar(ControlPassword.tuUsuario);
ControlPassword.tuUsuario = SeUsuario;
}
if (ControlEstudiantes.nControl5)
{
SeNombre = Desencriptar(TablaEstudiantes.teNombre);
TablaEstudiantes.teNombre = SeNombre;
}
if (ControlValidaciones.nControl12)
{
SeNombre = Desencriptar(TablaValidaciones.teNombre);
TablaValidaciones.teNombre = SeNombre;
}
if (ControlUsuarios.nControl2 == true)
{
SeUsuario = Desencriptar(TablaUsuarios.tuUsuario);
TablaUsuarios.tuUsuario = SeUsuario;
}
}
///************************************************************************
///*** ASPECTO: SEGURIDAD
///*** Métodos y funciones del aspecto AspectoSeguridad
///************************************************************************
//*** Se define el método ValidarCedula para validar si la cédula es un número
public boolean ValidarCedula(String Cedula)
{
try
{
Integer.parseInt(Cedula);
return true;
}
catch (Exception e)
{
return false;
}
}
//*** Se define el método ValidarCodigo para validar si el código es un número
public boolean ValidarCodigo(String Codigo)
{
try
{
Integer.parseInt(Codigo);
return true;
}
catch (Exception e)
{
return false;
}
}
//*** Se define el método ExisteUsuario para buscar si existe usuario y contraseña
public boolean ExisteUsuario(String MiUsuario,String MiContrasena)
{
try
{
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM USUARIOS WHERE NombreUsuario= '" + MiUsuario
+ "' OR ClaveUsuario = '" + MiContrasena + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
}
if(sw == 0)
{
nConectaB.close();
return false;
}
rs.close();
}
nConectaB.close();
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método ExisteCedulaUsuario para buscar si existe un usuario
public boolean ExisteCedulaUsuario(String MiCedula)
{
try
{
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM USUARIOS WHERE Val(CedulaUsuario)= '" + MiCedula + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
}
if(sw == 0)
{
nConectaB.close();
return false;
}
rs.close();
}
nConectaB.close();
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método ExisteCedulaEstudiante para buscar si existe un estudiante
public boolean ExisteCedulaEstudiante(String MiCedula)
{
try
{
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM ESTUDIANTES WHERE Val(CedulaEstudiante)= '" + MiCedula +
"'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
}
if(sw == 0)
{
nConectaB.close();
return false;
}
rs.close();
}
nConectaB.close();
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método ExisteCodigoAsignatura para buscar si existe una asignatura
public boolean ExisteCodigoAsignatura(String MiCodigo)
{
try
{
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM ASIGNATURAS WHERE Val(CodigoAsignatura)= '" + MiCodigo +
"'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
}
if(sw == 0)
{
nConectaB.close();
return false;
}
rs.close();
}
nConectaB.close();
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método BuscarUsuario para buscar usuario y contraseña
public boolean BuscarUsuario(String MiUsuario,String MiContrasena)
{
try
{
nConectaB = nConexion.HacerConexion();
int sw = 0;
while(sw == 0)
{
String sql = "SELECT * FROM USUARIOS WHERE NombreUsuario= '"+ MiUsuario
+ "' AND ClaveUsuario= '" + MiContrasena + "'";
PreparedStatement ps = nConectaB.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next())
{
sw = 1;
}
if(sw == 0)
{
nConectaB.close();
return false;
}
rs.close();
}
nConectaB.close();
return true;
}
catch(Exception e)
{
System.out.println("Se ha producido un error : " + e.toString());
return false;
}
}
//*** Se define el método Encriptar para cifrar una cadena de caracteres
public String Encriptar(String cad)
{
String clue ="";
for(int i = 0; i < cad.length(); i ++)
{
for(int j = 0; j < 256; j ++)
{
if(cad.charAt(i) == (char)j)
{
clue +=((char)(j + 5));
}
}
}
return clue;
}
//*** Se define el método Desencriptar para descifrar una cadena de caracteres
public String Desencriptar(String cad)
{
String clue ="";
for(int i = 0; i < cad.length(); i ++)
{
for(int j = 0; j < 256; j ++)
{
if(cad.charAt(i) == (char)j)
{
clue +=((char)(j - 5));
}
}
}
return clue;
}
//*** Se define el método IngresaCaracteres para forzar al operador a ingresar
//*** los caracteres que se muestran en la imagen
public void IngresaCaracteres()
{
JLabel Etiqueta = new JLabel(" ");
JLabel EtiquetaEscribir = new JLabel("Escriba los caracteres que ve en la imagen");
JLabel EtiquetaCaracter = new JLabel("Caracteres :");
TextField CajaTextoIngresa = new TextField(12);
JLabel EtiquetaImagen = new JLabel();
if (Img == 0)
{
SeCodigo = "G3NJBNKW";
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/Cifrado0.JPG");
EtiquetaImagen.setIcon(imagen);
Img = Img + 1;
}
else if (Img == 1)
{
SeCodigo = "MUHDWW2E";
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/Cifrado1.JPG");
EtiquetaImagen.setIcon(imagen);
Img = Img + 1;
}
else if (Img == 2)
{
SeCodigo = "JCCKKMSM";
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/Cifrado2.JPG");
EtiquetaImagen.setIcon(imagen);
Img = Img + 1;
}
else if (Img == 3)
{
SeCodigo = "88HUDKWA";
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/Cifrado3.JPG");
EtiquetaImagen.setIcon(imagen);
Img = Img + 1;
}
else if (Img == 4)
{
SeCodigo = "2XYCBBGM";
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/Cifrado4.JPG");
EtiquetaImagen.setIcon(imagen);
Img = Img + 1;
}
else if (Img == 5)
{
SeCodigo = "BM8CRRUK";
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/Cifrado5.JPG");
EtiquetaImagen.setIcon(imagen);
Img = Img + 1;
}
else if (Img == 6)
{
SeCodigo = "M6UXCB5C";
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/Cifrado6.JPG");
EtiquetaImagen.setIcon(imagen);
Img = Img + 1;
}
else if (Img == 7)
{
SeCodigo = "3RY8YEX2";
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/Cifrado7.JPG");
EtiquetaImagen.setIcon(imagen);
Img = Img + 1;
}
else if (Img == 8)
{
SeCodigo = "C5R4K99X";
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/Cifrado8.JPG");
EtiquetaImagen.setIcon(imagen);
Img = Img + 1;
}
else
{
SeCodigo = "EDBXEXWA";
ImageIcon imagen = new ImageIcon("C:/TG-319/4-IMAGENES/Cifrado9.JPG");
EtiquetaImagen.setIcon(imagen);
Img = 0;
}
JPanel
JPanel
JPanel
JPanel
JPanel
PanelEscribir = new JPanel();
PanelImagen = new JPanel();
Panel1 = new JPanel(new BorderLayout(5,5));
Panel2 = new JPanel();
PanelPrincipal = new JPanel(new BorderLayout(5,5));
Panel1.add(EtiquetaEscribir, BorderLayout.NORTH);
Panel1.add(EtiquetaImagen, BorderLayout.SOUTH);
Panel2.add(EtiquetaCaracter);
Panel2.add(Etiqueta);
Panel2.add(CajaTextoIngresa);
PanelPrincipal.add(Panel1, BorderLayout.NORTH);
PanelPrincipal.add(Panel2, BorderLayout.SOUTH);
Object[] options = { "
Aceptar
", "
Cancelar
" };
JOptionPane.showOptionDialog(null, PanelPrincipal, "Guardar datos",
JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE,
null, options, options[0]);
SeCaracter = CajaTextoIngresa.getText();
SeCaracter = SeCaracter.toUpperCase();
}
}
//***************************************************************************
// Fin Aspecto AspectoSeguridad
//***************************************************************************
ANEXO 6
MANUAL DEL USUARIO DEL SISTEMA
UNSIR Ver. 1.0.1
SISTEMA PARA EL REGISTRO DE INSCRIPCIÓN
Manual del Usuario
Elaborado por: Carlos Córdova
Tlf.: 0414-7695944
E-Mail: ccarloscc@gmail.com
Cumaná, enero 2.007
i
Contenido
Introducción ....................................................................................................... ii
Capítulo No. 1
Compatibilidad e instalación
Información general .............................................................................................
Instalación ............................................................................................................
Cómo ejecutar UNSIR Ver. 1.0.1 ........................................................................
Usuario y contraseña ............................................................................................
1
3
4
4
Capítulo No. 2
Opciones del menú archivo
Mantenimiento de la tabla asignaturas …............................................................. 6
Mantenimiento de la tabla pensum ……............................................................... 7
Capítulo No. 3
Funciones de la aplicación
Ingresar datos de los estudiantes ……..................................................................
Ingresar datos al histórico de notas …..................................................................
Registrar inscripción …........................................................................................
Ingresar datos de los usuarios del sistema ............................................................
8
10
12
15
Ayuda general ..................................................................................................... 17
ii
Introducción
UNSIR101 es un software desarrollado para registrar las inscripciones
regulares de una universidad. Es un caso de estudio para probar los beneficios que
pueda brindar la Programación Orientada a Aspectos (POA) a la Ingeniería de
Software. Está desarrollado en Java para trabajar bajo sistema operativo Windows
XP.
En este manual se presenta una descripción detallada del funcionamiento del
software UNSIR en su versión 1.0.1. El contenido de este manual está estructurado
en 3 capítulos, comenzando por la compatibilidad del programa, hardware necesario
para su funcionamiento e instalación del mismo, luego se describen los pasos a seguir
para cargar los datos a las tablas que conforman el sistema, registrar datos de los
estudiantes y registrar el proceso de inscripción. Todo esto se desarrolla de forma
amigable viajando por el menú de opciones y las pantallas de entrada y edición de
datos.
1
Capítulo No. 1
Compatibilidad e Instalación
INFORMACIÓN GENERAL
Esta aplicación tiene como objetivo general registrar y procesar los datos de las
inscripciones de los estudiantes de una universidad. Las funciones del código base
están diseñadas para procesar de forma sencilla los requerimientos del sistema. Está
desarrollado en Java para trabajar bajo sistema operativo Windows XP.
Este software está conformado por un menú principal, donde se generan las
funciones de entrada de datos, procesamiento y salida de la información por pantalla
e impresora.
Todas las opciones de la aplicación se pueden ejecutar mediante el menú de opciones.
Tecnología
La plataforma tecnológica mínima para el funcionamiento y operación de este
programa está sujeta a los siguientes requerimientos de hardware y software:
• Microcomputador con procesador Pentium o superior.
• 256 MB de memoria RAM.
• Disco duro de mediana capacidad.
• Unidad de CD-ROM.
• Microsoft Windows XP.
• Java JDK Edition 1.5.0.
2
• AspectJ 1.5.2.
• Microsoft Access 2003.
Software adicional:
DJ Java Decompiler 3.6.
NOTA:
Se recomienda para un mayor rendimiento un microcomputador con procesador
Pentium IV 1.0 Ghz o superior, 512 MB de RAM y un disco duro de gran capacidad.
Este software está diseñado para funcionar preferiblemente bajo Windows XP.
Organización de los datos y seguridad
La Base de Datos (Estudiantes.mdb) está integrada por 7 tablas, las cuales están
ubicadas en la carpeta o directorio donde se instala la aplicación en el equipo. El
nombre y la descripción de estas tablas se muestran a continuación:
USUARIOS
Tabla que contiene los nombres de usuarios y contraseñas.
ESTUDIANTES
Tabla (maestro) que contiene los datos de los estudiantes: cédula, nombre y apellido,
dirección, carrera, sexo, fecha de nacimiento, etc.
HISTORICO
Tabla que contiene los datos del histórico de calificaciones del estudiante.
INSCRIPCIONES
3
Tabla que almacena los datos de las asignaturas seleccionadas por el estudiante para
la inscripción.
VALIDACIONES
Tabla que almacena los datos del registro de la inscripción del estudiante, como
número del depósito bancario por concepto de aranceles, nombre del banco, fecha de
depósito, monto, etc.
ASIGNATURAS
Tabla para almacenar los datos de todas las asignaturas: código, nombre de la
asignatura y número de créditos.
PENSUM
Tabla que almacena los datos de la matriz curricular de todas las carreras que ofrece
la universidad: código carrera, código asignatura, semestre, pre-requisitos, etc.
INSTALACIÓN
Para instalar el sistema, se debe disponer de una computadora con sistema
operativo Microsoft Windows XP. Introducir el CD en la unidad correspondiente, al
cabo de 15 segundos se ejecutará el paquete instalador que se encuentra en el
directorio raíz del CD. Si no se ejecuta la instalación automática, se debe accesar a la
unidad de CD a través del explorador de Windows o “MI PC” y ejecutar el programa
instalador haciendo clic en el archivo InstalarUNSIRV101.exe. Seguir las
instrucciones que se indican en el instalador hasta que aparezca el botón “Terminar”,
si es necesario se debe reiniciar el sistema.
4
NOTA IMPORTANTE: Este instalador está diseñado y compilado de manera que
copie todas las clases necesarias para la ejecución del sistema, es importante señalar
que se debe tener instalado en el PC el Kit de Desarrollo de Java para el correcto
funcionamiento del mismo. Para trabajar con la implementación de aspectos y
AspectJ consulte el archivo de instalación y ejecución (INSTALACION.HLP)
CÓMO EJECUTAR UNSIR VER. 1.0.1
Una vez instalado los archivos (clases) en la computadora, se pueden compilar
y ejecutar a través del acceso directo que se crea en el escritorio. Para compilar y
ejecutar el código base a través del acceso directo, se debe hacer clic en el icono
“UNSIR V.1.0.1. (S-ASPECTOS)” que se instala en el escritorio, o a través del grupo
de programas UNSIR V.1.0.1.
USUARIO Y CONTRASEÑA
El usuario y contraseña por defecto es “123” y “123”, ver Figura 1.1, sin
embargo ésta se puede cambiar en la parte de Usuarios del menú principal.
Figura 1.1 Acceso al sistema
5
Cuando se inicia la aplicación, es necesario ingresar un nombre de usuario y
contraseña para hacer uso del programa y tener acceso a los datos. El nombre de
usuario y contraseña para utilizar la aplicación por primera vez es “123” y “123”
respectivamente con nivel de administrador. Para crear un usuario y contraseña y
hacer uso del programa. Siga los siguientes pasos:
• Escriba su nombre de usuario.
• Escriba su nombre completo.
• Seleccione el nivel de acceso (administrador o estudiante).
• Escriba una contraseña.
• Vuelva a escribir la contraseña para confirmarla.
• Si su contraseña contiene letras mayúsculas debe escribirla de la misma manera
cada vez que inicie la sesión para hacer uso de todas las opciones del programa.
• Anote y memorice su nombre de usuario y contraseña para ingresar al programa.
Contraseña nueva
• En la opción Usuarios del menú principal seleccione Registrar usuario y
contraseña.
• Ingrese los datos requeridos en la pantalla de entrada Registrar usuario y
contraseña y siga las instrucciones antes indicadas.
• Pulse el botón ACEPTAR para salvar los datos.
Dependiendo del nivel de acceso (administrador o estudiante), se mostrarán dos
tipos de menú de opciones. En el menú administrador se tendrá acceso a todas las
opciones del sistema. En el menú estudiante se tendrá acceso sólo a la consulta de
datos y al proceso de inscripción.
6
Capítulo No. 2
Opciones del menú archivo
El menú archivo contiene las opciones: Mantenimiento de la tabla asignaturas y
Mantenimiento de la tabla pensum.
MANTENIMIENTO DE LA TABLA ASIGNATURAS
Con esta opción se puede agregar, modificar o eliminar asignaturas. Para
ejecutar esta función vaya
al menú principal y haga clic en Archivo, luego
desplácese con el puntero del mouse y haga clic en Asignaturas. Una vez en la
pantalla que muestra el listado de las asignaturas pulse el botón REGISTRAR para
agregar una asignatura, CAMBIAR para modificar los datos de una asignatura
existente o ELIMINAR para eliminar una asignatura existente. Si no va a realizar
cambios pulse el botón CANCELAR.
7
MANTENIMIENTO DE LA TABLA PENSUM
Con esta opción se puede agregar, modificar o eliminar asignaturas a los
pensum de estudio de las carreras. Para ejecutar esta función vaya al menú principal
y haga clic en Archivo, luego desplácese con el puntero del mouse y haga clic en
Pensum. Una vez en la pantalla que muestra el listado de la matriz curricular pulse el
botón REGISTRAR para agregar una asignatura a la matriz, CAMBIAR para
modificar los datos de una asignatura existente o ELIMINAR para eliminar una
asignatura existente. Si no va a realizar cambios pulse el botón CANCELAR.
Capítulo No. 3
8
Funciones de la aplicación
INGRESAR DATOS DE LOS ESTUDIANTES
Con esta opción se puede registrar, cambiar y eliminar los datos personales de
un estudiante: número de cédula, nombre y apellido, dirección, fecha de nacimiento,
carrera, teléfono, correo, centro local, etc. Ejecute la siguiente rutina:
A) REGISTRAR ESTUDIANTE:
1) En el menú principal haga clic en Estudiantes, luego desplácese con el puntero
del mouse y haga clic en Registrar estudiante.
2) Una vez en la pantalla Registrar estudiante ingrese los datos requeridos en la
pantalla de entrada.
3) Pulse el botón ACEPTAR para salvar los cambios y regresar al menú principal.
B) CAMBIAR DATOS ESTUDIANTE:
1) En el menú principal haga clic en Estudiantes, luego desplácese con el puntero
del mouse y haga clic en Cambiar datos estudiante.
2) Ingrese el número de cédula del estudiante y pulse el botón ACEPTAR.
3) Una vez en la pantalla Cambiar datos estudiante edite o cambie los datos que se
muestran en la pantalla.
4) Pulse el botón ACEPTAR para salvar los cambios y regresar al menú principal.
C) ELIMINAR DATOS ESTUDIANTE:
9
1) En el menú principal haga clic en Estudiantes,
Estudiantes luego desplácese con el puntero
del mouse y haga clic en Eliminar estudiante.
2) Ingrese el número de cédula del estudiante y pulse el botón ACEPTAR.
3) Una vez en la pantalla Eliminar estudiante pulse el botón ELIMINAR, confirme
la acción a ejecutar para eliminar los datos o cancelar y regresar al menú principal.
D) CONSULTAR ESTUDIANTES:
1) En el menú principal haga clic en Estudiantes, luego desplácese con el puntero
del mouse y haga clic en Consultar datos estudiantes.
2) A continuación se muestra un listado con todos los estudiantes registrados en el
sistema. Pulse el botón ACEPTAR para regresar al menú principal.
10
INGRESAR DATOS AL HISTÓRICO DE NOTAS
Con esta opción se puede registrar, cambiar, eliminar y consultar los datos del
histórico de calificaciones del estudiante. Ejecute la siguiente rutina:
A) REGISTRAR HISTÓRICO DE CALIFICACIONES:
1) En el menú principal haga clic en Histórico, luego desplácese con el puntero del
mouse y haga clic en Histórico calificaciones estudiante.
2) Ingrese el número de cédula del estudiante y pulse el botón ACEPTAR.
3) Una vez en la pantalla Histórico de calificaciones del estudiante pulse el botón
REGISTRAR para seleccionar la asignatura, la calificación obtenida y el lapso
académico.
4) Pulse el botón ACEPTAR para salvar los cambios y regresar a la pantalla
anterior.
5) Pulse el botón CANCELAR para salir al menú principal.
B) CAMBIAR HISTÓRICO DE CALIFICACIONES:
1) En el menú principal haga clic en Histórico, luego desplácese con el puntero del
mouse y haga clic en Histórico calificaciones estudiante.
2) Ingrese el número de cédula del estudiante y pulse el botón ACEPTAR.
3) Una vez en la pantalla Histórico de calificaciones del estudiante seleccione un
registro del listado que aparece en pantalla y pulse el botón CAMBIAR para
cambiar la asignatura, la calificación obtenida y el lapso académico.
4) Pulse el botón ACEPTAR para salvar los cambios y regresar a la pantalla
anterior.
5) Pulse el botón CANCELAR para salir al menú principal.
11
C) ELIMINAR HISTÓRICO DE CALIFICACIONES:
1) En el menú principal haga clic en Histórico, luego desplácese con el puntero del
mouse y haga clic en Histórico calificaciones estudiante.
2) Ingrese el número de cédula del estudiante y pulse el botón ACEPTAR.
3) Una vez en la pantalla Histórico de calificaciones del estudiante seleccione un
registro del listado que aparece en pantalla y pulse el botón ELIMINAR, confirme
la acción para eliminar el registro del histórico del estudiante.
4) Pulse el botón CANCELAR para salir al menú principal.
D) CONSULTAR HISTÓRICO DE CALIFICACIONES:
1) En el menú principal haga clic en Histórico, luego desplácese con el puntero del
mouse y haga clic en Consultar histórico estudiante.
2) Ingrese el número de cédula del estudiante y pulse el botón ACEPTAR.
3) A continuación se muestra el histórico de calificaciones del estudiante y el índice
académico. Pulse el botón ACEPTAR para regresar al menú principal.
12
REGISTRAR INSCRIPCIÓN
Con esta opción se puede seleccionar las asignaturas a inscribir por parte del
estudiante, registrar la inscripción del estudiante, validar la inscripción del estudiante
y consultar las inscripciones que han sido validadas. Cuando el nivel de acceso es de
estudiante, sólo se tienen las opciones de seleccionar las asignaturas y registrar la
inscripción. Ejecute la siguiente rutina:
A) SELECCIONAR ASIGNATURAS:
1) En el menú principal haga clic en Inscripciones, luego desplácese con el puntero
del mouse y haga clic en Seleccionar asignaturas de estudiante.
2) Ingrese el número de cédula del estudiante y pulse el botón ACEPTAR.
3) Una vez en la pantalla Inscripción regular seleccione una asignatura del listado de
ofertas y pulse el botón AÑADIR para agregar la asignatura al listado de
asignaturas a inscribir. Pulse el botón QUITAR para eliminar una asignatura del
listado de asignaturas a inscribir.
4) Pulse el botón GUARDAR para guardar la selección de asignaturas y salir al
menú principal.
13
B) REGISTRAR Y VALIDAR INSCRIPCIÓN:
1) En el menú principal haga clic en Inscripciones, luego desplácese con el puntero
del mouse y haga clic en Registrar y validar inscripción de estudiante.
2) Ingrese el número de cédula del estudiante y pulse el botón ACEPTAR.
3) Una vez en la pantalla Validar inscripción registre el nombre de la entidad
bancaria, número de depósito, fecha de depósito y monto del depósito por
concepto de aranceles, active la casilla de validación y pulse el botón GUARDAR
para guardar el registro de inscripción y salir al menú principal.
4) A continuación se le pregunta al usuario si quiere imprimir la planilla de
inscripción.
NOTA:
14
Cuando el nivel de acceso es de estudiante, sólo se registra la inscripción.
Cuando el nivel de acceso es de estudiante y se registra la inscripción, no se pueden
modificar los datos del registro ni volver a seleccionar asignaturas. Esta opción sólo
es prioridad del nivel administrador.
C) CONSULTAR ESTUDIANTES INSCRITOS:
1) En el menú principal haga clic en Inscripciones, luego desplácese con el puntero
del mouse y haga clic en Consultar estudiantes inscritos.
2) A continuación se muestra el listado con todos los estudiantes que han sido
registrados en el sistema y cuya inscripción fue validada. Pulse el botón
ACEPTAR para regresar al menú principal.
INGRESAR DATOS DE LOS USUARIOS DEL SISTEMA
15
Con esta opción se puede registrar, cambiar o eliminar usuarios y contraseñas
de acceso al sistema. Ejecute la siguiente rutina:
A) REGISTRAR USUARIO:
1) En el menú principal haga clic en Usuarios, luego desplácese con el puntero del
mouse y haga clic en Registrar usuario y contraseña.
2) Una vez en la pantalla Registrar usuario ingrese los datos requeridos en la
pantalla de entrada.
3) Pulse el botón ACEPTAR para salvar los cambios y regresar al menú principal.
B) CAMBIAR DATOS USUARIO:
1) En el menú principal haga clic en Usuarios, luego desplácese con el puntero del
mouse y haga clic en Cambiar usuario y contraseña.
2) Ingrese el número de cédula del usuario y pulse el botón ACEPTAR.
3) Una vez en la pantalla Cambiar usuario y contraseña edite o cambie los datos que
se muestran en la pantalla.
4) Pulse el botón ACEPTAR para salvar los cambios y regresar al menú principal.
C) ELIMINAR DATOS USUARIO:
1) En el menú principal haga clic en Usuarios, luego desplácese con el puntero del
mouse y haga clic en Eliminar usuario y contraseña.
2) Ingrese el número de cédula del usuario y pulse el botón ACEPTAR.
3) Una vez en la pantalla Eliminar usuario y contraseña pulse el botón
ELIMINAR, confirme la acción a ejecutar para eliminar los datos o cancelar y
regresar al menú principal.
16
D) CONSULTAR USUARIOS:
1) En el menú principal haga clic en Usuarios, luego desplácese con el puntero del
mouse y haga clic en Consultar usuarios.
2) A continuación se muestra un listado con todos los usuarios registrados en el
sistema. Pulse el botón ACEPTAR para regresar al menú principal.
NOTA:
* No se permiten crear nuevos usuarios con un nombre de Usuario ya existente.
* No se permiten crear contraseñas que ya existan.
* El número máximo de caracteres para el Usuario es de 14.
* El número máximo de caracteres para la Contraseña es de 8.
17
AYUDA GENERAL
Para ejecutar este sistema de inscripción, debe instalar correctamente en su
computador el JDK de Java (Java JDK Edition 1.5.0.) para compilar y ejecutar las
clases que forman el código base.
Para ejecutar el sistema y probar la tecnología de aspectos, debe instalar
correctamente en su computador AspectJ (AspectJ Development Environment
(AJDE) versión 1.5.2) para hacer el tejido (weaving), compilar y ejecutar las clases
que forman el código base y el aspecto.
Para utilizar la base de datos (Estudiantes.mdb) y hacer transacciones con los
registros como agregar, modificar o eliminar datos a través del sistema, debe crear el
origen de datos.
Para una descripción más detallada, consulte el archivo de ayuda de instalación
y ejecución (INSTALACION.HLP) que se encuentra en el CD anexo.
Descargar