08 0581 CS PDF
08 0581 CS PDF
08 0581 CS PDF
Facultad de Ingeniera
Escuela de Ingeniera en Ciencias y Sistemas
FACULTAD DE INGENIERA
TRABAJO DE GRADUACIN
AL CONFERRSELE EL TTULO DE
I
3.5. Manejo de errores y excepciones ............................................ 56
3.6. Creacin de utilidades ............................................................. 61
3.7. Creacin de clases .................................................................. 64
3.7.1. Atributos ................................................................. 67
3.7.2. Mtodos ................................................................. 69
3.7.3. Instanciacin de clases........................................... 72
3.8. Servicios Web ......................................................................... 74
3.9. Cdigo HTML .......................................................................... 75
3.10. Cdigo script ........................................................................... 82
3.11. Objetos de base de datos ....................................................... 85
3.11.1. Tablas .................................................................... 86
3.11.2. ndices .................................................................... 88
3.11.3. Otros objetos .......................................................... 90
3.11.4. Consultas ............................................................... 92
3.12. Presentacin de la aplicacin .................................................. 95
3.13. Reportes ................................................................................. 97
3.14. Documentacin interna ........................................................... 98
3.15. Documentacin externa .......................................................... 99
II
NDICE DE ILUSTRACIONES
FIGURAS
III
24. Estructura compuesta de la sentencia de seleccin if, en Java ............. 50
25. Estructura de la sentencia de seleccin switch, en C++ ........................ 52
26. Estructura de la sentencia de bucle for, en Visual C# ............................ 53
27. Ejemplo de la sentencia for in en PHP ................................................... 54
28. Estructura de la sentencia de bucle mientras, en PHP .......................... 55
29. Estructura de la sentencia de bucle repetir, en MySql ........................... 55
30. Manejo de excepciones en Java ............................................................ 58
31. Manejo de excepciones en Visual Basic .Net ........................................ 58
32. Manejo de excepciones en Microsoft SQL. Este manejo de___________
excepciones aplica a partir de Microsoft SQL Server 2005 .................... 59
33. Manejo de excepciones en Oracle ......................................................... 59
34. Ejemplo de manejo de excepciones en Java ......................................... 60
35. Notacin para nombrar los mdulos de las utilidades ............................ 61
36. Forma de nombrar los archivos que contienen libreras o mdulos ....... 62
37. Ejemplo para nombrar un mdulo en Oracle ......................................... 63
38. Ejemplo para nombrar una librera en Visual C#.................................... 64
39. Ejemplo de nombre para un archivo que contiene una utilidad .............. 64
40. Notacin para nombrar clases ............................................................... 65
41. Notacin para nombrar los atributos de las clases ................................. 68
42. Notacin para nombrar mtodos de clases ............................................ 70
43. Ejemplo para nombrar clases y objetos en PHP .................................... 72
44. Notacin para nombrar objetos de clases .............................................. 72
45. Ejemplo para funciones que retornan un valor booleano ....................... 74
46. Notacin para nombrar servicios web .................................................... 75
47. Ejemplo de una pgina web................................................................... 81
48. Pgina web en lenguaje HTML y JavaScript .......................................... 82
49. Ejemplo de cdigo script ........................................................................ 84
50. Notacin para nombrar bases de datos ................................................. 86
51. Notacin para nombrar tablas en una base de datos ............................. 87
IV
52. Notacin para nombrar tablas temporales en una base de datos ...........87
53. Notacin para nombrar columnas de tablas ...........................................88
54. Notacin para nombrar ndices de bases de datos.................................89
55. Notacin para nombrar la llave primaria en una tabla ............................91
56. Notacin para nombrar la llave fornea en una tabla .............................92
57. Notacin para nombrar otros objetos de bases de datos .......................92
58. Pgina de categoras de los productos distribuidos por Purina________
Centroamrica .......................................................................................96
59. Script para crear el usuario ADMIN ...................................................... 105
60. Diagrama almacenado en la base de datos bajo el nombre__________
diagSegUsuario ................................................................................... 105
61. Script para crear las preguntas secretas .............................................. 106
62. Procedimiento pcGuardarUsuario (parte 1 de 2) .................................. 106
63. Procedimiento pcGuardarUsuario (parte 2 de 2) .................................. 107
64. Procedimiento pcModificarUsuario (parte 1 de 3) ................................. 108
65. Procedimiento pcModificarUsuario (parte 2 de 3) ................................. 108
66. Procedimiento pcModificarUsuario (parte 3 de 3) ................................. 109
67. Procedimiento pcEliminarUsuario ........................................................ 110
68. Procedimiento pcBuscarPreguntas ...................................................... 111
69. Procedimiento pcBuscarUsuario (parte 1 de 6) .................................... 112
70. Procedimiento pcBuscarUsuario (parte 2 de 6) .................................... 112
71. Procedimiento pcBuscarUsuario (parte 3 de 6) .................................... 113
72. Procedimiento pcBuscarUsuario (parte 4 de 6) .................................... 114
73. Procedimiento pcBuscarUsuario (parte 5 de 6) .................................... 115
74. Procedimiento pcBuscarUsuario (parte 6 de 6) .................................... 115
75. Carpeta del proyecto RecuperarContrasea ........................................ 117
76. Carpeta del proyecto RecuperarContrasea, que contiene las im----------
imgenes utilizadas en los formularios ................................................. 118
V
77. Carpeta del proyecto RecuperarContrasea, que contiene la librera____
utilizada en los formularios .................................................................. 118
78. Carpeta del proyecto RecuperarContrasea, que contiene los________
formularios de la aplicacin ................................................................. 119
79. Definicin de las funciones fPbBolEsLetra, fPbBolEsVocalTildada, ____
fPbBolEsNumero, de libHerramientas.1.0 ............................................ 120
80. Definicin del procedimiento pcPbValidarCaracteres, de____________
libHerramientas.1.0 (parte 1 de 2) ....................................................... 121
81. Definicin del procedimiento pcPbValidarCaracteres, de____________
libHerramientas.1.0 (parte 2 de 2) ....................................................... 122
82. Definicin de la funcin fPbBolValidarEmail, de______________
libHerramientas.1.0.............................................................................. 123
83. Definicin de la funcin fPbSqlConectar, de libHerramientas.1.0 ........ 123
84. Definicin de la funcin fPbStrCifrar, de libHerramientas.1.0 ............... 124
85. Definicin de la funcin fPbTblBuscarUsuario, de________________
libHerramientas.1.0 (parte 1 de 2) ....................................................... 125
86. Definicin de la funcin fPbTblBuscarUsuario, de________________
libHerramientas.1.0 (parte 2 de 2) ....................................................... 126
87. Definicin del procedimiento pcPbModificarUsuario, de_____________
libHerramientas.1.0.............................................................................. 126
88. Procedimiento pcPbGuardarUsuario, de libHerramientas.1.0 .............. 128
89. Definicin del procedimiento pcPbEliminarUsuario, de_____________
libHerramientas.1.0.............................................................................. 129
90. Definicin de la funcin fPbTblBuscarPreguntas, de_______________
libHerramientas.1.0.............................................................................. 130
91. Definicin de la funcin fPbBolEnviarEmail, de__________________
libHerramientas.1.0 (parte 1 de 2) ....................................................... 131
92. Definicin de la funcin fPbBolEnviarEmail, de__________________
libHerramientas.1.0 (parte 2 de 2) ....................................................... 132
VI
93.
93. . Definicin de la funcin fPbVGenerarClave, de__________________
- libHerramientas.1.0 (parte 1 de 2) ........................................................ 133
94.
94. . Definicin de la funcin fPbVGenerarClave, de__________________
_ libHerramientas.1.0 (parte 2 de 2) ........................................................ 133
95.
95. . Atributo de la clase modHerramientas.................................................. 134
96.
96. . Atributos privados de la clase frmAyuda .............................................. 134
97.
97. Procedimiento pcPrLoad de Ayuda.cs.................................................. 135
98.
98. . Ayuda en lnea, cuando inicia sesin el usuario ADMIN ....................... 137
99.
99. . Ayuda en lnea, cuando inicia sesin cualquier usuario que no sea_____
ADMIN ................................................................................................. 138
100. Diseo de la forma Login ..................................................................... 139
101. Constante global de la clase frmInicio .................................................. 140
102. Cdigo de Login.cs .............................................................................. 140
103. Opciones de cualquier usuario que no es ADMIN ................................ 144
104. Opciones del usuario ADMIN ............................................................... 144
105. Opcin EDITAR de cualquier usuario que no es ADMIN ...................... 145
106. Opcin EDITAR del usuario ADMIN ..................................................... 146
107. Opcin AGREGAR del usuario ADMIN ................................................ 147
108. Mensaje de bienvenida enviado por correo electrnico a cada_______
nuevo usuario ...................................................................................... 148
109. Opcin ELIMINAR del usuario ADMIN ................................................. 148
110. Opcin REINICIAR CONTRASEA del usuario ADMIN ...................... 149
111. Mensaje enviado por correo electrnico a cada usuario cuando_______
cambia la contrasea ........................................................................... 149
112. Informe ................................................................................................. 150
113. Cdigo de repInforme.cs ...................................................................... 150
114. Cdigo de DatosUsuario.cs .................................................................. 153
115. Opcin RECUPERAR CLAVE .............................................................. 174
116. Cdigo de RecuperacionClave.cs ........................................................ 175
VII
TABLAS
VIII
GLOSARIO
IX
X
RESUMEN
XI
de estos IDEs se puede conocer el tipo de dato de las variables; pero para los
lenguajes dinmicamente tipificados, no se cuenta con estos entornos de
desarrollo.
XII
prototipo est elaborado en Visual C# y Microsoft SQL, y el segundo en Visual
Basic .NET y Oracle.
XIII
XIV
OBJETIVOS
General
Especficos
XV
XVI
INTRODUCCIN
XVII
alcanzan. En el tercer captulo se desarrolla toda la propuesta, por medio de
diagramas, tablas, ejemplos y guas tiles e interesantes para escribir cdigo
fuente.
XVIII
1. HISTORIA DE LOS ESTNDARES
1
mercado internacional. Afn que tambin conlleva a percibir la informatizacin
como algo indispensable para el crecimiento y optimizacin de los procesos de
cualquier tipo de empresa; ayudndose para ello de la tecnologa, lo cual se
traduce en sistemas de informacin, desarrollados por su propio departamento
de informtica o por una empresa subcontratada.
2
A continuacin un paso por la historia, a travs del tiempo, de los
estndares relacionados con el desarrollo de software; ya que como se dijo
anteriormente, algunos estndares surgieron para regularizar los diversos
lenguajes de programacin, y como se expone en los siguientes prrafos, otros
han surgido con el objeto de regularizar los procesos para el desarrollo de
programas de computacin, alcanzando con ambos, cierto grado de calidad.
1.1. Antecedentes
3
patrocinado por el Departamento de Defensa de los Estados Unidos de
Amrica.
Nivel 1: inicial. Los procesos son muy variados y por lo tanto pobremente
controlados.
4
Nivel 2: gestionado. Existen mtricas bsicas para ejecutar el proceso y
lograr los objetivos.
Nivel 3: definido. Los estndares, procedimientos y descripciones de
procesos, se aplican ms rigurosamente.
Nivel 4: cuantitativamente gestionado. Adems de ser un proceso
definido, ste se controla utilizando tcnicas cuantitativas.
Nivel 5: optimizado. Teniendo un proceso cuantitativamente gestionado,
de forma sistemtica se revisa y modifica para mejorarlo continuamente,
adaptndolo a los objetivos del negocio
Por otro lado, las normas ISO 9000 son normas de calidad y gestin
continua de la misma (mtodos de auditora), establecidas por la Organizacin
Internacional para la Estandarizacin (ISO). stas se pueden aplicar a cualquier
tipo de organizacin o actividad sistemtica, orientada a la produccin de
bienes o servicios.
Una organizacin que cumple con la norma ISO 9001:2000, sigue los
requisitos bsicos en cuanto a normas de calidad; y para incrementar la
excelencia existe la norma ISO 9004:2000, la cual provee directrices para la
mejora del desempeo en sistemas de gestin de calidad.
Tanto CMMI como ISO 9001:2000, son normas que promueven la gestin
continua de la calidad de los procesos, relacionados con la produccin de
software, en el caso del CMMI, y con la produccin de cualquier bien y servicio,
en el caso de ISO 9001:2000. Sin embargo, estas normas no definen guas
5
para escribir los programas de software, tarea de la fase de implementacin del
proceso de desarrollo de software, que consiste en escribir en determinado
lenguaje de programacin una secuencia de instrucciones, que integradas
forman el software, el cual es ejecutado en el hardware del ordenador.
6
En 1813, el qumico sueco Friherre Jns Jacob Berzelius, invent la
notacin para frmulas qumicas, llamada medial capitals, que consiste en
simbolizar cada elemento qumico, con una o dos letras, escribiendo en
mayscula la primera de ellas. Como por ejemplo: MgO, xido de magnesio.
7
prefijo el propsito de la misma (posFila: posicin de una fila); no el tipo de dato
de la variable, como lo sugiere la notacin llamada Sistema Hngaro (iPos:
variable de tipo entero que indica una posicin).
En 1981, cuando Simonyi fue contratado directamente por Bill Gates para
trabajar en Microsoft y dej de laborar en Xerox, se empez a utilizar en la
compaa del empresario Gates, la Aplicacin Hngara, y luego el Sistema
Hngaro. Este ltimo fue utilizado en Microsoft hasta la liberacin del primer
.Net framework (febrero 2002), ya que desde entonces, dicha compaa ha
sugerido no utilizar el sistema hngaro, debido a lo poco popular del mismo a
causa del surgimiento de los IDEs (Integrated development environments), los
cuales muestran el tipo de variable y alertan al usuario de operaciones que
usan tipos de datos incompatibles.
8
tenido las empresas de ampliar su mercado local, lo que las ha orillado a contar
con un respaldo, como lo es una certificacin reconocida internacionalmente,
para ser aceptadas en pases extranjeros.
Otro factor, que tambin ha influido es, contar con una gua prctica y
eficiente que dicte la manera de realizar los procedimientos para alcanzar los
objetivos de la organizacin, independientemente del personal que en ella se
encuentre.
En el caso del software libre, seguir ciertas normas para escribir cdigo,
puede resultar contraproducente para algunas personas, que podran decir que
adoptar este tipo de metodologas, restringe la creatividad de cada individuo.
Sin embargo, estas regularizaciones no pretenden reducir la autonoma de los
desarrolladores, ya que su objetivo es trazar los lmites que enmarcan las
9
prcticas ordenadas que aseguran la portabilidad y mantenimiento de los
programas, alargando as la vida del software; ya que un sistema que no puede
crecer, no durar mucho.
Por otro lado, la piratera es una mala prctica, que ataca directamente al
software propietario, ocupando Guatemala el puesto 22 dentro de los pases
con ms altos ndices de piratera, segn el sexto estudio anual de la BSA,
publicado en mayo de 2009. Por ejemplo, si personas sin autorizacin
reproducen exactamente determinada aplicacin estandarizada, al aplicar
tcnicas de ingeniera inversa y obtener el cdigo fuente que fue desarrollado
utilizando estndares de programacin, no sera tarea difcil apropiarse tambin
del cdigo fuente.
Claro est que para combatir esta mala prctica, los pases deben
promover leyes eficientes que protejan la propiedad intelectual, as como
estrategias a nivel gubernamental que promuevan condiciones para que toda
persona encuentre productos originales, los desee y pueda adquirir. Adems,
cada institucin debe contar con profesionales que aporten soluciones para
proteger las aplicaciones, de reproducciones no autorizadas.
10
Por la misma competencia global, todas las empresas, incluyendo las
productoras de software, estn presionadas a incrementar su eficiencia a bajo
costo, por lo cual la rotacin de personal no debe influir en el presupuesto
establecido peridicamente. Es decir, que un producto de software pueda ser
desarrollado por cualquier analista-programador, luego de tener claro el
proceso, y que descifrar la manera en la que est escrito el programa no sea
toda una odisea que implique costos como el retraso en la entrega o
incumplimiento de los requerimientos.
Al hacer la analoga con la industria textil del siglo XXI, las empresas
productoras de software, deben evitar convertirse en maquilas de software, en
donde lo que importa es producir la mayor cantidad posible al ms bajo costo,
sin incorporar la calidad de la materia prima y del mismo producto final; sino
ms bien, desarrollar con un enfoque ingenieril, adoptando mtodos formales
para iniciar, desarrollar y administrar los proyectos.
11
12
2. IMPORTANCIA DE LA ESTANDARIZACIN
13
los tiempos ajustados de desarrollo, tambin pueden ser un obstculo, al
momento de implementar estndares de programacin.
Por lo que no hay que perder de vista, que los beneficios pueden no ser a
corto plazo, pero la empresa se asegura que en cualquier momento, cualquier
persona del equipo de desarrollo, pueda modificar el sistema desarrollado; que
la administracin del proyecto se simplifique; que el cliente est satisfecho y
tranquilo de tener un software que no solo cumple con sus requerimientos, si no
que fue desarrollado con estndares, obteniendo as un valor agregado en el
producto.
14
interpretacin y reutilizacin del cdigo desarrollado; optimizando el tiempo de
desarrollo y recurso humano, destinado para escribir cdigo nuevo, modificar el
existente o integrarlo con otros sistemas. Esto beneficia a toda empresa que
cuente con un sistema informtico, independientemente de si la organizacin
cuenta con su propio Departamento de Desarrollo, o si subcontrata a otra
empresa para que le desarrolle; ya que siempre tendr un costo.
15
desarrollo, la estructura interna estandarizada facilita el trabajo de las personas
encargadas de migrar de una versin a otra, para que los sistemas se
enriquezcan con las nuevas funcionalidades que incorpora cada versin y as
no se queden obsoletos.
16
Tiende a ser obsoleta. Si los estndares permanecen vigentes durante
largos perodos de tiempo, pueden llegar a conservar caractersticas obsoletas;
por lo que se requiere hacer revisiones peridicas, para innovar y actualizar
dichas regulaciones.
17
18
3. METODOLOGA PARA ESTNDARES DE
PROGRAMACIN DE SOFTWARE EN GUATEMALA: EXTILO
REGULAR 9002
19
son dinmicamente tipificados. Adems, si en una variable de tipo cadena se
almacena cdigo que posteriormente ser ejecutado con la instruccin EXEC
de Microsoft SQL, o bien cdigo HTML construido del lado del servidor para que
sea interpretado del lado del cliente, por medio de una pgina web; el IDE no
mostrar informacin de los tipos de datos de los elementos utilizados, pero el
nombre de ellos s indicar esta informacin.
20
Nombrarlos anteponindoles como prefijo el tipo de archivo que
representa dentro de la aplicacin.
Organizarlos dentro del proyecto, con el objeto de ubicar los archivos
dentro de carpetas como si se estuviera organizando un archivo de
expedientes, lo cual facilita el mantenimiento del sistema y refleja orden.
Crear una carpeta para el proyecto con el nombre del mismo (ver figura 1),
de preferencia en una particin diferente a la del sistema operativo; esto
ayudar a que si ste se daa, los documentos de la particin que contiene el
proyecto podrn recuperarse.
21
Dentro de la carpeta del proyecto, crear las carpetas que contendrn los
diferentes archivos descritos anteriormente, con el objeto de separar en
carpetas las imgenes de las libreras utilizadas, por ejemplo.
22
Figura 3. Archivo dentro de un mdulo de la aplicacin
Siguiendo esta notacin, dentro del mdulo Login del ejemplo, aparte de la
pgina Login.php, puede tenerse otro archivo repLogin.php; lo que ayuda a
identificar rpidamente que repLogin.php contiene el cdigo para generar el
reporte del mdulo, y que Login.php fue desarrollado para gestionar las
credenciales de los usuarios.
23
Figura 4. Hojas de estilo
Figura 5. Imgenes
24
Figura 6. Libreras
25
dentro del programa; luego se desarrolla el programa, por medio de subrutinas,
que a su vez utilizan estructuras de control, clases y manejo de errores para
indicarle al lenguaje lo que debe realizar. Por ltimo, se liberan los recursos
utilizados, por ejemplo liberacin de memoria, cierre de archivos, de conexiones
a la base de datos, entre otros.
26
Los prefijos para indicar si es una variable o una constante son:
Variable --> vr
Constante --> ct
27
Por ejemplo, si se requiere de una variable global que cambie su valor
dependiendo de la accin que realice el usuario desde la aplicacin: ingresar un
nuevo cliente o actualizar los datos de uno ya existente, y que dicho valor se
evale posteriormente para aplicar un descuento si la accin es modificar, la
misma se nombra de la siguiente manera:
vr G SInt Accion
28
Continuacin de la tabla I.
29
Tabla II. Prefijos de los tipos de datos primitivos utilizados en los ----------
-------------- sistemas de gestin de base de datos (SGBD): Oracle, Microsoft
SQL, MySql y PostgreSQL
30
Continuacin de la tabla II.
31
Continuacin de la tabla II.
32
Continuacin de la tabla II.
33
Continuacin de la tabla II.
34
Continuacin de la tabla II.
35
Continuacin de la tabla II.
36
En Oracle tampoco hay manera de declarar variables globales; aunque se
pueden declarar en la seccin de declaracin de un paquete, pero a menos que
al acceder o modificar el valor de la variable, se haga referencia al paquete
(NombrePaquete.NombreVariable), el mbito de la variable solamente ser
dentro del paquete. Otra limitante es que, al modificar el valor de la supuesta
variable global, el cambio aplicar solamente en la sesin actual; si se accede a
la variable desde otra parte del cdigo, el cambio no se ver reflejado, a menos
que se enve como parmetro.
Las variables globales que maneja MySQL se inicializan cada vez que se
inicia el servidor, y solamente pueden ser modificadas si se cuenta con el
privilegio SUPER. Se debe tomar en cuenta que los cambios en las variables
globales sern visibles en las sesiones que se abran luego del cambio; estos no
se vern reflejados en la sesin de los clientes conectados al momento del
cambio, ni siquiera en la del cliente que modific la variable global.
37
Al tener variables globales dentro de las pruebas unitarias, las porciones
de cdigo a probar aumentan, por lo que ya no se tendra una prueba unitaria
sino una prueba de integracin, porque se estaran probando paralelamente
varias partes del cdigo.
vr L Int CantProd
38
Figura 11. Ejemplo de nombre para constante global
ct G Est PerXProy
39
no habr error, porque se crear la variable $vrLIntCodigo, que primero ser
del tipo entero y luego de tipo cadena. Despus si se hace referencia a la
variable $vrLIntCodigo, pensando que su valor es 1, se cometer un error que
no ser fcil de detectar.
40
En el siguiente punto se indica cmo nombrar las subrutinas dentro de un
programa, es decir cmo nombrar los procedimientos y funciones.
41
Los prefijos para indicar si el subprograma es un procedimiento o una
funcin son:
Procedimiento --> pc
Funcin --> f
Procedimiento mbito
Propsito
Tipo de dato
Funcin mbito del valor de
retorno
42
A pesar que en lenguajes como C y C++ todas las subrutinas devuelven
un valor, es aplicable nombrar de diferente manera a los procedimientos y
funciones, porque cuando se declara un procedimiento el valor de retorno se
indica con la palabra void, para sealar que no devuelve nada.
3.3.1. Parmetros
43
Si la subrutina recibe parmetros, la siguiente figura indica cmo
nombrarlos, para as diferenciar las variables de los parmetros recibidos dentro
de la subrutina.
Para los prefijos del tipo de dato, utilizar los indicados en las tablas I y II,
siguiendo el mismo procedimiento definido para indicar el tipo de dato de las
variables y constantes, en el apartado anterior.
44
Por ejemplo, en Visual Basic el mecanismo del argumento transferido se
indica por medio de las palabras reservadas ByVal o ByRef; mientras que en
C++, por defecto los parmetros se pasan por valor, si se requiere transferir un
argumento por referencia se antepone el carcter & al nombre del mismo.
45
Figura 16. Ejemplo de nombre para procedimiento en MySQL
46
Para nombrar los parmetros y los valores de retorno, al igual que para
nombrar las variables y constantes, se sigue la notacin CamelCase,
combinada con el Sistema Hngaro y la Aplicacin Hngara.
Por lo que una funcin en C# que devuelva la cantidad de rutas que fueron
recorridas por un vehculo determinado en un rango de fechas y su valor de
retorno, se nombraran as:
rt Int CantRutas
47
Figura 20. Ejemplo de nombre para funcin en Oracle
rt _ nm _ cantrutas
48
la ejecucin de ciertas instrucciones, ni repetir una misma instruccin, sin tener
que escribir n lneas con el mismo cdigo; por lo cual existen las estructuras
selectivas y repetitivas. Este tipo de estructuras permiten modificar el flujo de
ejecuciones de las instrucciones del programa, de forma condicional (utilizando
expresiones lgicas) o de forma repetitiva.
if ( condicin )
Bloque 1 de sentencias
49
Figura 23. Estructura doble de la sentencia de seleccin if, en Java
if ( condicin )
Bloque 1 de sentencias
else
Bloque 2 de sentencias
if ( condicin )
Bloque 1 de sentencias
else
if ( condicin )
Bloque 2 de sentencias
else
Bloque 3 de sentencias
50
Hay que tener presente que para comparar dos expresiones, en algunos
lenguajes, el operador de igualdad se escribe con dos signos igual (==), y el
operador de asignacin solamente con uno (=). Si en una condicin se coloca
el operador de asignacin, el compilador de C++ s advertir de una incorrecta
asignacin; pero otros como el de Java aceptarn dicha asignacin, y al
ejecutarse el programa, definitivamente el resultado no ser el esperado,
porque lo que se ejecutar ser una asignacin y no una condicin.
51
Figura 25. Estructura de la sentencia de seleccin switch, en C++
switch ( condicin )
case valor 1 :
Bloque 1 de sentencias
break;
case valor 2 :
Bloque 2 de sentencias
break;
default :
Bloque 3 de sentencias
52
ciclo infinito. Cuando el programador no indica explcitamente el nmero de
repeticiones, el cdigo se ejecuta mientras se cumpla la condicin establecida.
Bloque de sentencias
53
En Oracle, Visual C#, PHP, Java, PostgreSQL y C++, para el ciclo
desde/para, se puede indicar si la variable disminuir o incrementar su valor
cada vez que se ejecute el bucle, lo cual deber concordar con el valor inicial y
final que se indiquen en la sentencia. En las otras herramientas de
programacin que implementan este tipo de ciclo, mencionadas en el presente
trabajo, la variable siempre aumenta su valor.
54
hasta que la condicin es verdadera, la cual es evaluada al final de la
estructura, lo que permite ejecutar el bucle al menos una vez.
while ( condicin )
Bloque de sentencias
REPEAT
Bloque de sentencias
UNTIL condicin
END REPEAT
55
Cuando los componentes lxicos utilizados para encerrar estos bloques de
sentencias, son smbolos de puntuacin como las llaves ({}), la llave de inicio
puede escribirse en la misma lnea que la sentencia de control de flujo, para as
reducir el espaciado vertical. O tambin escribir la llave de apertura en la lnea
siguiente de la sentencia de control de flujo, pero seguida de cdigo, para no
dejar en una lnea solamente la llave inicial.
Tanto un error como una excepcin interrumpen el flujo del programa, por
lo que si estos no se manejan, el programa deja de ejecutarse, fomentando
desconfianza y disgusto en el usuario hacia la aplicacin. Para evitar lo
56
anterior, el manejo de estos sucesos inesperados no permite que la aplicacin
colapse y muestra de forma amigable los errores al usuario. Es importante que
el manejo de errores y excepciones tambin incluya el almacenamiento de los
datos asociados a ellos: fecha y hora, fuente en donde se origin (nombre de la
pgina web, clase, librera, ventana, entre otros), ubicacin de la excepcin o
del error (evento, procedimiento, funcin, etc.), nmero de error y descripcin
del mismo.
57
Figura 30. Manejo de excepciones en Java
try
Bloque de sentencias
Bloque de sentencias
Try
Bloque de sentencias
Bloque de sentencias
Finally
Bloque de sentencias
End Try
58
Figura 32. Manejo de excepciones en Microsoft SQL. Este manejo de
___....p...(_excepciones aplica a partir de Microsoft SQL Server 2005
Begin Try
Bloque de sentencias
End Try
Begin Catch
Bloque de sentencias
End Catch
Declare
Declaraciones de variables
Begin
Exception
End;
59
Los lenguajes de programacin y sistemas de gestin de base de datos
tratados en este trabajo, excepto Microsoft SQL, permiten capturar determinado
tipo de excepcin; lo cual ayuda a indicar qu debe realizar la aplicacin cuando
ocurra una divisin entre cero o cuando se viole una restriccin de llave
primaria; pero basndose en que una excepcin ocurre inesperadamente, se
recomienda utilizar manejadores de excepciones generales, que sean capaces
de manejar cualquier tipo de excepcin.
60
Como el manejo de excepciones tambin puede anidarse, se pueden
manejar excepciones especficas, siempre y cuando el ltimo manejador
contenga la excepcin general.
mod Nombre
Como las utilidades pueden ser empleadas por varias aplicaciones y las
aplicaciones pueden incluir una o ms de ellas, es importante invocar a las
estructuras definidas por el usuario, funciones y procedimientos que las
61
componen, por medio del nombre del mdulo; ya que utilizando referencias
completas, aunque los nombres de los elementos dentro de las utilidades sean
los mismos, no habr colisin entre los nombres, evitando as errores de
compilacin o ejecucin, dependiendo del tipo de librera (esttica o dinmica).
Versin de Versin de
lib Nombre . la librera . cambio
62
El detalle de las modificaciones de cada versin puede llevarse como
parte del manual tcnico del proyecto, documentacin que se explica en los
ltimos puntos de este captulo. Tambin pueden llevarse por medio de un
programa de control de versiones, aprovechando los beneficios de estas
aplicaciones para llevar el control de cambios y verificar la compatibilidad de los
mismos al integrar las modificaciones.
Para crear una librera en Visual C# que valide una cuenta de correo
recibida por parmetro, la declaracin de la clase sera:
63
Figura 38. Ejemplo para nombrar una librera en Visual C#
lib ValCuentaCorreo . 1 . 0
64
Figura 40. Notacin para nombrar clases
Caracterstica
Modificador de
cls propia de la clase Propsito
acceso
(opcional)
65
Tabla III. Modificadores de acceso de las clases
Modificador de
Prefijo Descripcin
acceso
Puede invocarse desde cualquier parte, el acceso no es
Pblico Pb restringido.
Privado Pr Se puede acceder solamente desde la clase a la que pertenece.
Puede invocarse desde la misma clase a la que pertenece, o desde
Protegido Prt la clase que la hereda.
Puede accederse desde cualquier parte del cdigo que est
Interno Intr dentro del mismo paquete en donde se haya declarado.
Puede invocarse desde cualquier parte del cdigo, dentro del
Proteccin mismo paquete en donde est declarada, o desde una clase que
interna PIntr la hereda que se encuentre en otro paquete.
Por ejemplo, si la clase es esttica, en Java este tipo de clase debe ser
parte de otra clase, porque no pueden ser instanciadas y por lo tanto solamente
pueden invocarse por la clase a la que pertenecen, al igual que se invocan las
clases privadas. En Visual C# tambin se pueden crear clases estticas, sin
que stas sean parte de otra clase; pero de igual manera no pueden ser
instanciadas y sus mtodos solamente se pueden invocar desde la clase
esttica a la que pertenecen.
66
En Visual C# existen otros modificadores, como abstract y sealed; en Java
se puede utilizar abstract, final y synchronizable. Para identificarlos se sugiere
utilizar los siguientes prefijos al nombrar la clase:
Para implementar una clase, tambin se requiere que sta tenga atributos
y mtodos, elementos que se describen en los siguientes apartados.
3.7.1. Atributos
67
notacin, que de igual manera que la indicada para las variables, constantes,
parmetros y valores de retorno, se emplea la notacin CamelCase, combinada
con el Sistema Hngaro y la Aplicacin Hngara:
Tipo de dato
Caracterstica primitivo
Modificador
at propia del atributo Propsito
de acceso
(opcional)
Tipo de dato
compuesto
En PHP, Visual C#, C++ y Java, a los atributos tambin se les puede
indicar, de forma opcional, la manera en que se pueden utilizar; si no se indica,
el atributo se accede por medio de un objeto de dicha clase, segn la teora
general de la programacin orientada a objetos (POO). Si no se indica este
modificador al declarar el atributo, al nombrarlo tampoco se debe indicar el
prefijo que le corresponde. En la siguiente tabla se listan estas caractersticas
opcionales, con sus prefijos y una breve descripcin:
68
Tabla V. Modificadores que determinan caractersticas propias de los
atributos
Luego de definir los lineamientos para nombrar los atributos de una clase,
se contina en el siguiente apartado, con lo correspondiente a los mtodos que
determinan el comportamiento de una clase.
3.7.2. Mtodos
69
Figura 42. Notacin para nombrar mtodos de clases
Caracterstica Procedimiento
Modificador propia del
md mtodo
de acceso Propsito
(opcional) Tipo de
Funcin dato del
valor de
retorno
70
Tabla VI. Modificadores que determinan caractersticas propias de los
mtodos
Cuando la clase ya tiene definidos sus miembros, est lista para ser
instanciada, a menos que sea una clase esttica o abstracta, por lo que en el
siguiente segmento, se indica cmo deben nombrarse las instancias de las
clases.
71
3.7.3. Instanciacin de clases
obj Nombre
72
Continuacin de la figura 44.
0016
0017 //Funcin que retorna el nombre del libro
0018 public function mdPbFStrDevolverNombre()
0019 { return $this->atPrStrNombre; //devuelve el nombre del libro
0020 }
0021
0022 //Creando el libro El regreso de Sherlock Holmes
0023 $objRegresoSherlockH = new clsPbLibro();
0024
0025 //Desde la nueva instancia de la clase, se llama al mtodo pblico que fija el ISBN y el nombre del
0026 libro
0027 $objRegresoSherlockH->mdPbPcFijaDatos(9781420931648, EL REGRESO DE SHERLOCK
0028 HOLMES);
0029
0030 //Se muestran en pantalla los datos de $objRegresoSherlockH
0031 echo("NUEVO LIBRO DE LA BIBLIOTECA: " . $objRegresoSherlockH->mdPbFStrDevolverISBN() .
0032 " - " . $objRegresoSherlockH->mdPbFStrDevolverNombre() . "\n");
0033 }
73
Figura 45. Ejemplo para funciones que retornan un valor booleano
0001 Funcin en Visual Basic .Net que indica si una cadena es un nmero entero
0002 Public Function fPbBolEsEntero(ByVal pVStrCadena As String) As Boolean
0003 ..
0004 End Function
0005
0006 Funcin de Visual Basic .Net que indica si cierto producto est en determinada tienda
0007 Public Function fPbBolEstaEnTienda(ByVal pVLngProducto As Long, _
0008 ByVal pVSIntTienda As Short) As Boolean
0009 ..
0010 End Function
74
Figura 46. Notacin para nombrar servicios web
Procedimiento mbito
wS Propsito
Tipo de dato del
Funcin mbito
valor de retorno
Los elementos HTML tienen atributos y eventos, los cuales pueden ser
accedidos por medio del atributo id especificado al momento de escribir el
elemento; es decir que se puede acceder a los atributos y eventos por medio
del nombre del elemento, desde un script con la notacin: objeto.evento u
objeto.atributo.
75
Para nombrar los identificadores de los elementos HTML dentro de las
pginas web, se sugiere utilizar la notacin CamelCase, combinada con la
Aplicacin Hngara. Los prefijos para anteponerle al nombre de cada
elemento, se describen en la tabla VII. Se debe tomar en cuenta que, el
atributo id, no es soportado por todas las etiquetas HTML, por lo que en la tabla
se indica el carcter -, para indicar que el elemento no puede identificarse, por
no poseer atributo id. Si no se acceder a los atributos ni eventos de los
elementos HTML, se puede omitir el atributo id al escribir cada elemento.
Aunque los valores del atributo name se puedan repetir dentro de los
elementos HTML de la forma, se recomienda colocar el mismo valor en el
atributo id, para un mismo elemento.
76
En la siguiente tabla no se indica prefijo, para el elemento input, porque
ste puede ser de varios tipos; por lo que en la tabla VIII, se listan los prefijos
para cada uno de los valores que puede tomar el atributo type en esta etiqueta.
77
Continuacin de la tabla VII.
78
Continuacin de la tabla VII.
Los prefijos indicados en la tabla VII, pueden ser aplicados a los nombres
de controles (botones, etiquetas, cajas de texto, etc.) utilizados en formularios
para desarrollar aplicaciones standalone, tambin a nombres de controles web
(controles que provee la caja de herramientas de Visual Studio .Net), a nombres
de componentes de la librera Swing de Java, y tambin para nombrar cualquier
componente GUI (Graphical user interface).
79
Tabla VIII. Prefijos para los valores del atributo type, en el elemento
INPUT
80
Figura 47. Ejemplo de una pgina web
81
Figura 48. Pgina web en lenguaje HTML y JavaScript
Los scripts se pueden clasificar en scripts del lado del cliente y del lado del
servidor; la principal diferencia entre uno y otro radica en el lugar en donde se
procesan: en el servidor que aloja la aplicacin o en la mquina cliente
(mquina del usuario en donde se ejecuta el navegador).
82
El uso de determinado tipo de script depende de los objetivos de la
aplicacin; por ejemplo, si se desean reducir las peticiones hechas al servidor,
los scripts del lado del cliente debern realizar la mayor cantidad de procesos
posibles en la mquina del usuario, para que las peticiones realizadas al
servidor sean solamente las necesarias.
Es importante mencionar que el cdigo del script del lado del cliente puede
ser modificado sin necesidad de compilar la aplicacin, pues es interpretado por
el navegador; lo que provee flexibilidad al momento de una actualizacin; pero
tambin hay que tomar en cuenta que esta caracterstica, permite que el cdigo
sea alterado en la mquina cliente, lo cual puede ser minimizado si el
navegador comprueba las nuevas versiones de las pginas cada vez que se
visite cada sitio web, como se recomienda en el prrafo anterior.
La gran ventaja de los scripts del lado del servidor, es que el cdigo no
puede ser accedido desde la mquina cliente; las credenciales para la conexin
a la base de datos, por ejemplo, quedan fuera del alcance de la mquina
cliente.
83
Dentro de los lenguajes script del lado del cliente, se encuentran
JavaScript (o JScript) y VBScript, siendo el primero el ms utilizado, ya que
VBScript solamente puede ser interpretado por Internet Explorer. En esta
clasificacin, tambin cabe mencionar la tcnica AJAX (Asynchronous
JavaScript And XML), que es una combinacin de JavaScript y XML, empleada
en las aplicaciones web, para ejecutar cdigo del lado del cliente (por medio de
JavaScript), manteniendo una comunicacin asncrona con el servidor en
segundo plano (a travs de XML). Para esta clase de scripts tambin aplica la
metodologa descrita hasta el momento.
Los scripts del lado del cliente pueden estar dentro de un archivo, que
ser incluido en la cabecera de la pgina HTML, como si fuera una librera;
prctica que se sugiere seguir para mantener la programacin modular. Como
en algunas ocasiones es imprescindible incluir cdigo dentro de la misma
pgina HTML, ya sea con lenguaje script del lado del cliente o del lado del
servidor, tambin se sugiere seguir la metodologa Extilo Regular 9002.
84
Luego de exponer la mayor parte de lineamientos para programar cdigo
en el desarrollo de aplicaciones, y para escribir instrucciones que son comunes
entre los lenguajes de programacin y gestores de bases de datos, en el
siguiente apartado, se detallan las especificaciones para nombrar objetos
propios de las bases de datos.
Para almacenar los datos, las bases de datos estn formadas por objetos,
los cuales son definidos por el lenguaje de definicin de datos (DDL, Data
Definition Language), gestionados por el lenguaje de manipulacin de datos
(DML, Data Manipulation Language), y asegurados (niveles de acceso) por el
lenguaje de control de datos (DCL, Data Control Language).
Cabe mencionar que cada gestor tiene su propia sintaxis, pero todos ellos
se basan en el lenguaje de consulta estructurado SQL (Structured Query
Language) para administrar las bases de datos; por lo que la sintaxis de cada
SGBD mencionado en el presente trabajo, queda fuera del alcance de esta
metodologa, ms no as, la notacin para nombrar los objetos definidos por el
DDL, y para definir la estructura de consultas empleando el DML.
85
3.11.1. Tablas
bd Nombre
Teniendo la base de datos, se pueden crear las tablas, las cuales son una
coleccin de filas y columnas, en donde las filas son tambin llamadas tuplas o
registros, que tienen el valor asignado a cada columna o atributo de la tabla. Y
cada columna, es un campo de determinado tipo de dato, que define la
estructura de la tabla.
86
Figura 51. Notacin para nombrar tablas en una base de datos
Abreviatura del
tbl mdulo al que Nombre
pertenece
Figura 52. Notacin para nombrar tablas temporales en una base de datos
Para indicar el mbito, se utilizarn los mismos prefijos indicados para los
mbitos de las variables: L si la tabla es visible solamente en la sesin actual, y
G, si es visible en todas las sesiones activas de la base de datos.
87
Al crear una tabla, ya sea una tabla permanente, temporal o una variable
de tipo tabla, se deben indicar sus columnas, y para nombrarlas se sugiere la
siguiente notacin utilizando CamelCase:
3.11.2. ndices
88
Figura 54. Notacin para nombrar ndices de bases de datos
89
Continuacin de la tabla IX.
90
Tabla X. Prefijos para otros objetos frecuentemente utilizados en las
bases de datos
Objeto de la base de
Prefijo Descripcin
datos
Tabla lgica definida por una consulta,
que est basada en una o ms tablas o
Vista view vistas.
Subrutina que se ejecuta
automticamente cuando una tabla o
vista (en algunos SGBD) es modificada
Desencadenador por eventos DML, DDL o DCL (conexin o
(trigger) tgr inicio de sesin a la BDD).
Representa grficamente las tablas y sus
Diagrama diag relaciones.
Conjunto de permisos para gestionar
determinados objetos de la base de
Rol rol datos.
Usuario de la base de datos que tiene
Usuario usr uno o ms roles.
En Microsoft SQL, este objeto es el que
permite que un usuario pueda
Inicio de sesin lgin conectarse a la BDD.
Nombre de la
pK tabla
91
Figura 56. Notacin para nombrar la llave fornea en una tabla
Nombre de la Nombre de la
fK tabla secundaria tabla principal
Aunque los diagramas no son objetos creados por el DDL, son grficos
utilizados dentro del SGBD, principalmente para mostrar las relaciones entre las
tablas de la base de datos.
3.11.4. Consultas
92
as las ventajas expuestas al final del punto dos del presente captulo, ventajas
que se obtienen cuando se aplica la programacin top-down, estructurada o
modular.
93
las restricciones (llave primaria o fornea), los atributos agregados
acepten valores nulos o tengan un valor establecido por defecto, por
mencionar algunas consideraciones.
Con ello, en la sentencia SELECT solamente las columnas necesarias
sern transportadas, especialmente si la tabla tiene un nmero
significativo de ellas, reduciendo as el tamao de la informacin
transferida.
94
3.12. Presentacin de la aplicacin
Seguir un mismo estilo para los colores y los conos, por ejemplo utilizar
colores pastel o combinar tonalidades de un mismo color, en toda la
interfaz. Para los conos, incluir en la API (Application Programming
Interface), imgenes con colores similares y del mismo tema, por ejemplo
en el sitio Purina Centroamrica, que vende productos para mascotas, los
conos utilizados son del mismo tipo, es decir, no se muestra un perro
como dibujo animado, sino la foto de los animales son de un perro y de un
gato reales.
95
Si por la naturaleza o por el objetivo de la aplicacin, no es viable aplicar
los lineamientos anteriores, se pueden omitir, ya que el objetivo de implementar
los mismos es, mantener uniformidad a nivel visual.
96
Cuando el selector conectado a un estilo sea una clase, para nombrarlo se
sugiere anteponerle el prefijo cls, al nombre de la clase, utilizando la notacin
con CamelCase.
3.13. Reportes
97
3.14. Documentacin interna
98
3.15. Documentacin externa
99
El documento que indica cmo operar el sistema, es el manual de usuario;
el cual describe los requisitos y procedimiento de instalacin, y tambin cada
opcin del programa. Este documento enfocado al usuario, quien desconoce el
software, tendr los siguientes puntos:
100
asignar el prefijo para nombrarlos y proponer los lineamientos ms adecuados,
tomando de referencia los estndares dispuestos en el presente trabajo.
101
102
4. CDIGO FUENTE QUE GESTIONA USUARIOS DE UN
SISTEMA Y PERMITE RECUPERAR LA CONTRASEA DE UN
USUARIO
103
Aunque en la aplicacin, la llave para cifrar las credenciales de acceso a la
base de datos y la cuenta de correo electrnico desde la que se envan los
emails, no estn cifrados ni ocultos, se recomienda que en todo sistema estos
datos estn cifrados o bien almacenados en algn lugar de acceso restringido.
104
Figura 59. Script para crear el usuario ADMIN
105
Figura 61. Script para crear las preguntas secretas
106
Figura 63. Procedimiento pcGuardarUsuario (parte 2 de 2)
107
respuesta indicada se guarda el dato asocindolo al cdigo de la pregunta que
le corresponda.
108
Figura 66. Procedimiento pcModificarUsuario (parte 3 de 3)
109
Para eliminar un usuario se utiliza el procedimiento pcEliminarUsuario, el
cual primero elimina las preguntas que pudiera tener asociadas el usuario, y
luego elimina el registro en tblSegUsuario, cuyo Id sea igual al valor recibido por
parmetro, siempre y cuando no sea el usuario ADMIN.
110
tblSegPregunta, y pcBuscarUsuario (figuras 69 - 74) devuelve datos de la tabla
tblSegUsuario con base al valor del parmetro de entrada @pVsIntOpcion.
@pVsIntOpcion puede tomar cinco valores, de 0 a 4, si el parmetro tiene otro
valor se retorna 2, indicando que la opcin no es vlida. Este procedimiento
retorna 1 cuando s se encuentran datos para la opcin solicitada.
111
Figura 69. Procedimiento pcBuscarUsuario (parte 1 de 6)
112
En la figura anterior, se muestra el cdigo que se ejecuta cuando
@pVsIntOpcion tiene valor de 0: si existe un usuario cuyo nombre y correo
electrnico sean los indicados por parmetro, se devuelven los datos del
usuario (excepto la clave) junto con una de las preguntas que el usuario tenga
en tblSegUsuarioPregunta, elegida aleatoriamente.
0041
0042 RETURN 1 --El usuario y el email s son correctos
0043 END
0044 END
0045 ELSE
0046 BEGIN
0047 --Consultar si el usuario existe
0048 IF @pVsIntOpcion = 1
0049 BEGIN
0050 IF EXISTS (SELECT Usuario.intId As Id
0051 FROM tblSegUsuario Usuario
0052 WHERE Usuario.vchUsuario =
0053 LTRIM(RTRIM(@pVVchUsuario))
0054 AND Usuario.intId <> @pVIntId
0055 )
0056 BEGIN
0057 RETURN 1 --El usuario s existe
0058 END
0059 END
0060 ELSE
113
Figura 72. Procedimiento pcBuscarUsuario (parte 4 de 6)
0061 BEGIN
0062 --Consultar si el usuario y la clave son correctos
0063 IF @pVsIntOpcion = 2
0064 BEGIN
0065 IF EXISTS (SELECT Usuario.intId As Id
0066 FROM tblSegUsuario Usuario
0067 WHERE Usuario.vchUsuario =
0068 LTRIM(RTRIM(@pVVchUsuario))
0069 AND Usuario.vchClave =
0070 LTRIM(RTRIM(@pVVchClave))
0071 )
0072 BEGIN
0073 SELECT Usuario.intId As Id,
0074 Usuario.vchUsuario As Usuario,
0075 Usuario.vchClave As Clave,
0076 Usuario.vchNombres As Nombres,
0077 Usuario.vchApellidos As Apellidos,
0078 Usuario.vchEmail As EMail
0079 FROM tblSegUsuario Usuario
0080 WHERE Usuario.vchUsuario =
0081 LTRIM(RTRIM(@pVVchUsuario))
0082 AND Usuario.vchClave =
0083 LTRIM(RTRIM(@pVVchClave))
0084
0085 RETURN 1 --El usuario y la clave s son correctos
0086 END
0087 END
0088 ELSE
114
Figura 73. Procedimiento pcBuscarUsuario (parte 5 de 6)
0089 BEGIN
0090 --Buscar el usuario por Id
0091 IF @pVsIntOpcion = 3
0092 BEGIN
0093 IF EXISTS (SELECT Usuario.intId As Id
0094 FROM tblSegUsuario Usuario
0095 WHERE Usuario.intId = @pVIntId
0096 )
0097 BEGIN
0098 SELECT Usuario.intId As Id,
0099 Usuario.vchUsuario As Usuario,
0100 Usuario.vchNombres As Nombres,
0101 Usuario.vchApellidos As Apellidos,
0102 Usuario.vchEmail As EMail
0103 FROM tblSegUsuario Usuario
0104 WHERE Usuario.intId = @pVIntId
0105
0106 RETURN 1 --El usuario s existe
0107 END
0108 END
0109 ELSE
Se retornan los datos de todos los usuarios (excepto la clave), junto con
el campo TIENE PREGUNTA SECRETA, cuyo valor depende de si en
tblSegUsuarioPregunta existe ms de alguna pregunta secreta para cada
usuario, cuando @pVsIntOpcion tiene valor de 4; los datos de esta consulta se
devuelven ordenados por Id.
0110 BEGIN
0111 --Buscar los datos de todos los usuarios
0112 IF @pVsIntOpcion = 4
0113 BEGIN
0114 SELECT Usuario.intId As ID,
0115 Usuario.vchUsuario As USUARIO,
0116 Usuario.vchNombres As NOMBRES,
0117 Usuario.vchApellidos As
0118 APELLIDOS,
0119 Usuario.vchEmail As [E-MAIL],
115
Continuacin de la figura 74.
0120 CASE
0121 WHEN EXISTS (SELECT
0122 Resp.*
0123 FROM tblSegUsuarioPregunta
0124 Resp
0125 WHERE
0126 Resp.intId = Usuario.intId)
0127 THEN 'S'
0128 ELSE 'NO'
0129 END As
0130 [TIENE PREGUNTA SECRETA]
0131 FROM tblSegUsuario Usuario
0132 ORDER BY ID
0133
0134 RETURN 1 --Se consultaron los datos de usuarios
0135 END
0136 ELSE
0137 BEGIN
0138 RETURN 2 --No es una opcin vlida
0139 END
0140 END
0141 END
0142 END
0143 END
0144
0145 IF @@ERROR <> 0
0146 BEGIN
0147 RETURN 3 --Error del SQL
0148 END
0149 ELSE
0150 BEGIN
0151 RETURN 0 --No hay datos de usuarios
0152 END
0153 END
0154
116
Dentro del folder del proyecto, se distribuyen por carpeta, las imgenes
utilizadas dentro del programa, una librera y los formularios, como se muestra
en las siguientes figuras.
117
Figura 76. Carpeta del proyecto RecuperarContrasea, que contiene las
imgenes utilizadas en los formularios
118
Figura 78. Carpeta del proyecto RecuperarContrasea, que contiene los
los formularios
formularios dedelalaaplicacin
aplicacin
119
Figura 79. Definicin de las funciones fPbBolEsLetra,
_ fPbBolEsVocalTildada, fPbBolEsNumero, de
libHerramientas.1.0
0032 //Indica si la tecla recibida es una letra minscula o mayscula, no incluye vocales tildadas
0033 public bool fPbBolEsLetra(ref KeyPressEventArgs pRKpTecla) {
0034 //Letras maysculas
0035 if ((pRKpTecla.KeyChar >= 65 && pRKpTecla.KeyChar <= 90) || pRKpTecla.KeyChar == '' ||
0036 //Letras minsculas
0037 (pRKpTecla.KeyChar >= 97 && pRKpTecla.KeyChar <= 122) || pRKpTecla.KeyChar == '') {
0038 return true;
0039 }
0040 else {
0041 return false;
0042 }
0043 }
0044 //Indica si la tecla recibida es una vocal tildada minscula o mayscula
0045 public bool fPbBolEsVocalTildada(ref KeyPressEventArgs pRKpTecla) {
0046 //Vocales minsculas tildadas
0047 if (pRKpTecla.KeyChar == 225 || pRKpTecla.KeyChar == 233 || pRKpTecla.KeyChar == 237 ||
0048 pRKpTecla.KeyChar == 243 || pRKpTecla.KeyChar == 250 ||
0049 //Vocales maysculas tildadas
0050 pRKpTecla.KeyChar == 193 || pRKpTecla.KeyChar == 201 || pRKpTecla.KeyChar == 205 ||
0051 pRKpTecla.KeyChar == 211 || pRKpTecla.KeyChar == 218) {
0052 return true;
0053 }
0054 else {
0055 return false;
0056 }
0057 }
0058 //Indica si la tecla recibida es un nmero
0059 public bool fPbBolEsNumero(ref KeyPressEventArgs pRKpTecla) {
0060 //nmeros
0061 if (pRKpTecla.KeyChar >= 48 && pRKpTecla.KeyChar <= 57) {
0062 return true;
0063 }
0064 else {
0065 return false;
0066 }
0067 }
120
Figura 80. Definicin del procedimiento pcPbValidarCaracteres, de
libHerramientas.1.0 (parte 1 de 2)
121
Figura 81. Definicin del procedimiento pcPbValidarCaracteres, de
libHerramientas.1.0 (parte 2 de 2)
122
fPbBolValidarEmail: valida que la sintaxis de la cuenta de correo indicada,
sea correcta, utilizando una expresin regular.
123
fPbStrCifrar: por seguridad se cifra la contrasea de cada usuario, y para
validar si la clave ingresada en la aplicacin coincide con la registrada en
el sistema, estos valores se comparan cifrados; adems la aplicacin no
cuenta con el procedimiento para descifrar.
124
Figura 85. Definicin de la funcin fPbTblBuscarUsuario, de
libHerramientas.1.0 (parte 1 de 2)
125
Figura 86. Definicin de la funcin fPbTblBuscarUsuario, de
( libHerramientas.1.0 (parte 2 de 2)
126
Continuacin de la figura 87.
0298 vrLSQLComando.Parameters.AddWithValue("@pVVchNombres",
0299 pVStrNombres);
0300 vrLSQLComando.Parameters.AddWithValue("@pVVchApellidos",
0301 pVStrApellidos);
0302 vrLSQLComando.Parameters.AddWithValue("@pVVchEmail", pVStrEmail);
0303 vrLSQLComando.Parameters.AddWithValue("@pVVchRespuesta1",
0304 pVStrRespuesta1);
0305 vrLSQLComando.Parameters.AddWithValue("@pVVchRespuesta2",
0306 pVStrRespuesta2);
0307 vrLSQLComando.Parameters.AddWithValue("@pVVchRespuesta3",
0308 pVStrRespuesta3);
0309 vrLSQLComando.Parameters.AddWithValue("@pVVchRespuesta4",
0310 pVStrRespuesta4);
0311 vrLSQLComando.Parameters.AddWithValue("@pVVchRespuesta5",
0312 pVStrRespuesta5);
0313 vrLSQLComando.Parameters.AddWithValue("@pVsIntOpcion", pVsIntOpcion);
0314 SqlParameter vrLSQLRetorno = vrLSQLComando.Parameters.Add(
0315 new SqlParameter("@pVsIntRetorno", SqlDbType.SmallInt));
0316 vrLSQLRetorno.Direction = ParameterDirection.ReturnValue;
0317
0318 //Ejecutar la consulta
0319 vrLSQLComando.Connection = pRSQLConexion;
0320 vrLSQLComando.ExecuteNonQuery();
0321 pRsIntResultado = Convert.ToInt16(
0322 vrLSQLComando.Parameters["@pVsIntRetorno"].Value);
0323 }
0324 else {
0325 MessageBox.Show("NO SE PUDO ESTABLECER CONEXIN A LA BASE " +
0326 "DE DATOS", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
0327 }
0328 }
0329 catch (Exception pVExExcepcion) {
0330 pRsIntResultado = 10;
0331 MessageBox.Show(pVExExcepcion.ToString(), "ERROR", MessageBoxButtons.OK,
0332 MessageBoxIcon.Error);
0333 }
0334 }
127
Figura 88. Procedimiento pcPbGuardarUsuario, de libHerramientas.1.0
128
pcPbEliminarUsuario: se elimina un usuario por medio de esta subrutina,
invocando a pcEliminarUsuario.
129
fPbTblBuscarPreguntas: para ejecutar pcBuscarPreguntas se invoca a
este procedimiento, y as poder mostrarle al usuario el catlogo de
preguntas secretas disponibles.
130
fPbBolEnviarEmail: cuando se crea un nuevo usuario, se recupera o se
reinicia la contrasea, se envan las credenciales de acceso va correo
electrnico a la cuenta registrada del usuario en el sistema, utilizando
como remitente la cuenta notificacion.sistema.gt@gmail.com.
131
Figura 92. Definicin de la funcin fPbBolEnviarEmail, de
libHerramientas.1.0 (parte 2 de 2)
0507 vrLSmtpCorreoSaliente.Credentials =
0508 new NetworkCredential("notificacion.sistema.gt@gmail.com", "notific@c1on");
0509
0510 try {
0511 //Enviar el mensaje
0512 vrLSmtpCorreoSaliente.Send(vrLMsgMensaje);
0513 }
0514 catch (SmtpFailedRecipientException pVSmtpExExcepcion) {
0515 MessageBox.Show(pVSmtpExExcepcion.Message, "ERROR",
0516 MessageBoxButtons.OK, MessageBoxIcon.Error);
0517 return false;
0518 }
0519 catch (Exception pVExExcepcion) {
0520 MessageBox.Show(pVExExcepcion.Message, "ERROR",
0521 MessageBoxButtons.OK, MessageBoxIcon.Error);
0522 return false;
0523 }
0524 return true;
0525 }
132
Figura 93. Definicin de la funcin fPbVGenerarClave, de
libHerramientas.1.0 (parte 1 de 2)
133
Figura 95. Atributo de la clase modHerramientas
Todos los formularios tienen un cono de ayuda, que al presionar abre una
ventana que provee ayuda en lnea. Para ello se tiene una nica forma Ayuda,
que muestra determinado texto con base al valor de sus atributos privados
(figuras 98 y 99), los cuales son fijados por cada formulario que la invoca:
134
Como frmAyuda es un elemento de tipo Cuadro Acerca de, que es una
plantilla incluida en Visual Studio, a continuacin se muestra el cdigo aadido
al archivo Ayuda.cs:
135
Continuacin de la figura 97.
136
Continuacin de la figura 97.
0096 "--> Los botones tienen acceso directo: Alt + la primera letra de la leyenda del botn.";
0097 break;
0098 default:
0099 break;
0100 }
0101 }
137
Figura 99. Ayuda en lnea, cuando inicia sesin cualquier usuario
que no sea ADMIN
138
RECUPERAR CLAVE: si el usuario no tiene su contrasea para ingresar,
puede presionar este botn en donde se muestra otra ventana que solicita
el ingreso del usuario, correo electrnico y la respuesta exacta de una de
las preguntas secretas que configur el usuario.
139
Figura 101. Constante global de la clase frmInicio
0001 /********************************************************************************************************/
0002 /* Archivo: Login.cs */
0003 /* Descripcin: Forma para ingresar credenciales de acceso. */
0004 /* Autor: Norma M. Chonay V. */
0005 /* Fecha de creacin: 23/02/2011 */
0006 /* Fecha de ltima modificacin: 23/02/2011 */
0007 /* Autor de ltima modificacin: Norma M. Chonay V. */
0008 /* Versin: 1.1 */
0009 /* Prerrequisitos: Ninguno */
0010 /********************************************************************************************************/
0011
0012 using System;
0013 using System.Collections.Generic;
0014 using System.ComponentModel;
0015 using System.Data;
0016 using System.Drawing;
0017 using System.Linq;
0018 using System.Text;
0019 using System.Windows.Forms;
0020 using RecuperarContrasea.Librerias;
0021 using RecuperarContrasea.modSeguridad;
0022
0023 namespace RecuperarContrasea {
0024 public partial class frmInicio : Form {
0025 public frmInicio() {
0026 InitializeComponent();
0027 }
0028
140
Continuacin de la figura 102.
141
Continuacin de la figura 102.
0082
0083 //Pasar los datos del usuario a frmDatosUsuario
0084 frmDatosUsuario vrLfrmDatosUsuario = new frmDatosUsuario();
0085 vrLfrmDatosUsuario.mdPbIntId =
0086 Convert.ToInt32(vrLTblDatos.Rows[0]["Id"]);
0087 vrLfrmDatosUsuario.mdPbStrUsuario =
0088 vrLTblDatos.Rows[0]["Usuario"].ToString();
0089 vrLfrmDatosUsuario.mdPbStrClave =
0090 vrLTblDatos.Rows[0]["Clave"].ToString();
0091 vrLfrmDatosUsuario.mdPbStrNombres =
0092 vrLTblDatos.Rows[0]["Nombres"].ToString();
0093 vrLfrmDatosUsuario.mdPbStrApellidos =
0094 vrLTblDatos.Rows[0]["Apellidos"].ToString();
0095 vrLfrmDatosUsuario.mdPbStrEmail =
0096 vrLTblDatos.Rows[0]["EMail"].ToString();
0097
0098 vrLSqlConexion.Close();
0099 vrLfrmDatosUsuario.ShowDialog(this);
0100 txtUsuario.Focus();
0101 }
0102 else {
0103 MessageBox.Show("NO HAY DATOS DEL USUARIO", "ERROR",
0104 MessageBoxButtons.OK,
0105 MessageBoxIcon.Error);
0106 txtUsuario.Focus();
0107 }
0108 break;
0109 case 2:
0110 MessageBox.Show("LA OPCIN DE BSQUEDA INDICADA NO ES " +
0111 "VLIDA", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
0112 txtUsuario.Focus();
0113 break;
0114 case 3:
0115 MessageBox.Show("HUBO UN ERROR EN LA BASE DE DATOS", "ERROR",
0116 MessageBoxButtons.OK,
0117 MessageBoxIcon.Error);
0118 txtUsuario.Focus();
0119 break;
0120 default:
0121 //Error mostrado en la librera
0122 txtUsuario.Focus();
0123 break;
0124 }
0125 }
0126 else {
0127 MessageBox.Show("NO SE PUDO ESTABLECER CONEXIN A LA BASE " +
0128 "DE DATOS", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
0129 txtUsuario.Focus();
0130 }
0131 }
0132 else {
0133 MessageBox.Show("DEBE INGRESAR USUARIO Y CONTRASEA", "ERROR",
0134 MessageBoxButtons.OK,
142
Continuacin de la figura 102.
0135 MessageBoxIcon.Warning);
0136 txtUsuario.Focus();
0137 }
0138 }
0139 catch (Exception pVExExcepcion) {
0140 MessageBox.Show(pVExExcepcion.ToString(), "ERROR",
0141 MessageBoxButtons.OK, MessageBoxIcon.Error);
0142 txtUsuario.Focus();
0143 }
0144 }
0145 //Si se presiona el botn CANCELAR, se limpia el texto ingresado en los controles
0146 private void pcPrClicCancelar(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
0147 txtUsuario.Text = "";
0148 txtClave.Text = "";
0149 txtUsuario.Focus();
0150 }
0151 //Al presionar el botn RECUPERAR CLAVE se abre frmRecuperacionClave
0152 private void pcPrClicRecuperarClave(object pVObjTipoObjeto,
0153 EventArgs pVEvtEvento) {
0154 //Llamar a la ventana para recuperar clave
0155 txtUsuario.Text = "";
0156 txtClave.Text = "";
0157 frmRecuperacionClave vrLfrmRecuperacionClave = new frmRecuperacionClave();
0158 vrLfrmRecuperacionClave.ShowDialog(this);
0159 }
0160 //Al dar clic en el cono de AYUDA
0161 private void pcPrAyudaLogin(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
0162 //Llamar a la ventana de ayuda en lnea
0163 frmAyuda vrLfrmAyudaLogin = new frmAyuda();
0164 vrLfrmAyudaLogin.mdPbStrNomPadre = this.Name;
0165 vrLfrmAyudaLogin.mdPbStrNomOpcion = "";
0166 vrLfrmAyudaLogin.mdPbStrNomModalidad = "";
0167 vrLfrmAyudaLogin.ShowDialog(this);
0168 }
0169 }
0170 }
143
cualquier otro usuario, solamente podr modificar sus propios datos: usuario,
nombres, apellidos, direccin de correo electrnico, preguntas secretas y
contrasea.
144
La diferencia entre la opcin EDITAR del usuario ADMIN y de los dems
usuarios, es que el usuario administrador no puede modificar su nombre de
usuario, ya que dentro de toda la aplicacin, con este valor es que se reconoce
cuando el usuario que inici sesin es el administrador.
145
Figura 106. Opcin EDITAR del usuario ADMIN
146
genera una contrasea, y se envan las credenciales de acceso al email
indicado.
147
Figura 108. Mensaje de bienvenida enviado por correo electrnico a
cada nuevo usuario
148
Figura 110. Opcin REINICIAR CONTRASEA del usuario ADMIN
149
Al presionar el cono de informe, se abre la siguiente ventana, mostrando
los datos de todos los usuarios registrados en el sistema.
0001 /********************************************************************************************************/
0002 /* Archivo: repInforme.cs */
0003 /* Descripcin: Forma para mostrar el reporte. */
0004 /* Autor: Norma M. Chonay V. */
0005 /* Fecha de creacin: 06/03/2011 */
0006 /* Fecha de ltima modificacin: 06/03/2011 */
0007 /* Autor de ltima modificacin: Norma M. Chonay V. */
0008 /* Versin: 1.1 */
0009 /* Prerrequisitos: Ninguno */
0010 /********************************************************************************************************/
0011
0012 using System;
150
Continuacin de la figura 113.
151
Continuacin de la figura 113.
0066 case 2:
0067 MessageBox.Show("LA OPCIN DE BSQUEDA INDICADA NO ES VLIDA",
0068 "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
0069 vrLBolCerrar = true;
0070 break;
0071 case 3:
0072 MessageBox.Show("HUBO UN ERROR EN LA BASE DE DATOS", "ERROR",
0073 MessageBoxButtons.OK, MessageBoxIcon.Error);
0074 vrLBolCerrar = true;
0075 break;
0076 default:
0077 //Error mostrado en la librera
0078 vrLBolCerrar = true;
0079 break;
0080 }
0081 }
0082 else {
0083 MessageBox.Show("NO SE PUDO ESTABLECER CONEXIN A LA BASE DE " +
0084 "DATOS", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
0085 vrLBolCerrar = true;
0086 }
0087 vrLSqlConexion.Close();
0088 }
0089 catch (Exception pVExExcepcion) {
0090 MessageBox.Show(pVExExcepcion.ToString(), "ERROR", MessageBoxButtons.OK,
0091 MessageBoxIcon.Error);
0092 vrLBolCerrar = true;
0093 }
0094 if (vrLBolCerrar == true) {
0095 this.Dispose();
0096 this.Close();
0097 }
0098 }
0099 }
0100 }
152
Figura 114. Cdigo de DatosUsuario.cs
0001 /********************************************************************************************************/
0002 /* Archivo: DatosUsuario.cs */
0003 /* Descripcin: Forma para consultar datos y modificarlos. */
0004 /* Autor: Norma M. Chonay V. */
0005 /* Fecha de creacin: 27/02/2011 */
0006 /* Fecha de ltima modificacin: 27/02/2011 */
0007 /* Autor de ltima modificacin: Norma M. Chonay V. */
0008 /* Versin: 1.1 */
0009 /* Prerrequisitos: Ninguno */
0010 /********************************************************************************************************/
0011
0012 using System;
0013 using System.Collections.Generic;
0014 using System.ComponentModel;
0015 using System.Data;
0016 using System.Drawing;
0017 using System.Linq;
0018 using System.Text;
0019 using System.Windows.Forms;
0020 using RecuperarContrasea.Librerias;
0021
0022 namespace RecuperarContrasea.modSeguridad {
0023 public partial class frmDatosUsuario : Form {
0024 public frmDatosUsuario() {
0025 InitializeComponent();
0026 }
0027
0028 //Instanciar la librera de utilidades
0029 modHerramientas modHerr = new modHerramientas();
0030
0031 //Procedimiento Load
0032 private void pcPrLoad(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
0033 grBxPrincipal.Size = new System.Drawing.Size(598, 151);
0034 this.Size = new System.Drawing.Size(631, 249);
0035 //Mostrar los datos del usuario
0036 pcPrMostrarDatos();
0037
0038 //Si es el usuario administrador
0039 if (mdPbStrUsuario == "ADMIN") {
0040 picAgregar.Visible = true;
0041 picQuitar.Visible = true;
0042 picInforme.Visible = true;
0043 picClave.Visible = true;
0044 }
0045
0046 //Colocar las preguntas en los controles
0047 pcPrObtenerPreguntas();
0048 }
0049
0050 /**************************************************************************************************/
0051 /*********************** VALIDACIN DE DATOS EN LOS CONTROLES *****************/
0052 /**************************************************************************************************/
153
Continuacin de la figura 114.
154
Continuacin de la figura 114.
0106
0107 //En los checkboxs no se validan los carcteres ingresados, solamente si se presiona
0108 //la tecla ENTER
0109 private void pcPrValidarChkPregunta4(object pVObjTipoObjeto,
0110 KeyPressEventArgs pVKpTecla) {
0111 modHerr.pcPbValidarCaracteres(ref pVKpTecla, txtRespuesta4, 6);
0112 }
0113
0114 //En los checkboxs no se validan los carcteres ingresados, solamente si se presiona
0115 //la tecla ENTER
0116 private void pcPrValidarChkPregunta5(object pVObjTipoObjeto,
0117 KeyPressEventArgs pVKpTecla) {
0118 modHerr.pcPbValidarCaracteres(ref pVKpTecla, txtRespuesta5, 6);
0119 }
0120
0121 //Valida los carcteres ingresados en el control txtRespuesta1
0122 private void pcPrValidarTxtRespuesta1(object pVObjTipoObjeto,
0123 KeyPressEventArgs pVKpTecla) {
0124 modHerr.pcPbValidarCaracteres(ref pVKpTecla, chkPregunta2, 5);
0125 }
0126
0127 //Valida los carcteres ingresados en el control txtRespuesta2
0128 private void pcPrValidarTxtRespuesta2(object pVObjTipoObjeto,
0129 KeyPressEventArgs pVKpTecla) {
0130 modHerr.pcPbValidarCaracteres(ref pVKpTecla, chkPregunta3, 5);
0131 }
0132
0133 //Valida los carcteres ingresados en el control txtRespuesta3
0134 private void pcPrValidarTxtRespuesta3(object pVObjTipoObjeto,
0135 KeyPressEventArgs pVKpTecla) {
0136 modHerr.pcPbValidarCaracteres(ref pVKpTecla, chkPregunta4, 5);
0137 }
0138
0139 //Valida los carcteres ingresados en el control txtRespuesta4
0140 private void pcPrValidarTxtRespuesta4(object pVObjTipoObjeto,
0141 KeyPressEventArgs pVKpTecla) {
0142 modHerr.pcPbValidarCaracteres(ref pVKpTecla, chkPregunta5, 5);
0143 }
0144
0145 //Valida los carcteres ingresados en el control txtRespuesta5
0146 private void pcPrValidarTxtRespuesta5(object pVObjTipoObjeto,
0147 KeyPressEventArgs pVKpTecla) {
0148 modHerr.pcPbValidarCaracteres(ref pVKpTecla, txtClave, 5);
0149 }
0150
0151 //Valida los carcteres ingresados en el control txtClave
0152 private void pcPrValidarTxtClaveAnt(object pVObjTipoObjeto,
0153 KeyPressEventArgs pVKpTecla) {
0154 modHerr.pcPbValidarCaracteres(ref pVKpTecla, txtClaveNueva, 1);
0155 }
0156
0157 //Valida los carcteres ingresados en el control txtClaveNueva
0158 private void pcPrValidarTxtClaveNueva(object pVObjTipoObjeto,
155
Continuacin de la figura 114.
156
Continuacin de la figura 114.
157
Continuacin de la figura 114.
158
Continuacin de la figura 114.
159
Continuacin de la figura 114.
0371 }
0372 }
0373
0374 //Se validan y actualizan los datos ingresados en la opcin EDITAR
0375 private void pcPrModificar() {
0376 try {
0377 //Quitar espacios
0378 txtNombres.Text = txtNombres.Text.ToUpper().Trim();
0379 txtApellidos.Text = txtApellidos.Text.ToUpper().Trim();
0380 txtUsuario.Text = txtUsuario.Text.ToUpper().Trim();
0381 txtEmail.Text = txtEmail.Text.ToUpper().Trim();
0382 txtRespuesta1.Text = txtRespuesta1.Text.Trim();
0383 txtRespuesta2.Text = txtRespuesta2.Text.Trim();
0384 txtRespuesta3.Text = txtRespuesta3.Text.Trim();
0385 txtRespuesta4.Text = txtRespuesta4.Text.Trim();
0386 txtRespuesta5.Text = txtRespuesta5.Text.Trim();
0387
0388 //Validar que no estn vacos
0389 if (txtId.Text != "" & txtUsuario.Text != "" &
0390 txtNombres.Text != "" & txtApellidos.Text != "" &
0391 txtEmail.Text != "") {
0392 //Validar la direccin de correo electrnico
0393 if (modHerr.fPbBolValidarEmail(txtEmail.Text) == true) {
0394 //Validar las contraseas
0395 bool vrLBolSeguir = true;
0396 //Si ms de algn campo tiene datos
0397 if (txtClave.Text != "" || txtClaveNueva.Text != "" || txtConfClave.Text != "") {
0398 //Validar si la clave del control txtClave es la misma que la que est registrada
0399 if (mdPbStrClave == modHerr.fPbStrCifrar(txtClave.Text)) {
0400 //Validar que la nueva clave y la confirmacin tengan datos
0401 if (txtClaveNueva.Text != "" & txtConfClave.Text != "") {
0402 //Validar que la nueva clave, sea la misma en los 2 controles
0403 if (txtClaveNueva.Text != txtConfClave.Text) {
0404 MessageBox.Show("LA NUEVA CONTRASEA NO COINCIDE " +
0405 "CON LA CONFIRMACIN DE LA MISMA", "ERROR",
0406 MessageBoxButtons.OK, MessageBoxIcon.Warning);
0407 txtClaveNueva.Focus();
0408 vrLBolSeguir = false;
0409 }
0410 }
0411 else {
0412 MessageBox.Show("DEBE INGRESAR LA NUEVA CONTRASEA Y " +
0413 "LA CONFIRMACIN DE LA MISMA", "ERROR",
0414 MessageBoxButtons.OK, MessageBoxIcon.Warning);
0415 txtClaveNueva.Focus();
0416 vrLBolSeguir = false;
0417 }
0418 }
0419 else {
0420 MessageBox.Show("LA <<CONTRASEA ANTERIOR>> INGRESADA " +
0421 "EN EL FORMULARIO NO COINCIDE CON LA ALMACENADA EN " +
0422 "EL SISTEMA ACTUALMENTE", "ERROR", MessageBoxButtons.OK,
0423 MessageBoxIcon.Warning);
160
Continuacin de la figura 114.
0424 txtClave.Focus();
0425 vrLBolSeguir = false;
0426 }
0427 }
0428
0429 //Si pas las validaciones de las contraseas
0430 if (vrLBolSeguir == true) {
0431 vrLBolSeguir = fPrBolValidarPreguntas();
0432 //Si pas las validaciones de las preguntas
0433 if (vrLBolSeguir == true) {
0434 Int16 vrLsIntResultado = 0;
0435 string vrLStrClave = mdPbStrClave;
0436 //Conectarse a SQL
0437 System.Data.SqlClient.SqlConnection vrLSqlConexion;
0438 vrLSqlConexion = modHerr.fPbSqlConectar();
0439
0440 //Verificar si el usuario ya existe
0441 modHerr.fPbTblBuscarUsuario(Convert.ToInt32(txtId.Text), txtUsuario.Text,
0442 "", "", 1, ref vrLSqlConexion, ref vrLsIntResultado);
0443 switch (vrLsIntResultado) {
0444 case 0:
0445 //Hacer las modificaciones en la BDD
0446 if (txtClaveNueva.Text != "") {
0447 vrLStrClave = modHerr.fPbStrCifrar(txtClaveNueva.Text);
0448 }
0449
0450 modHerr.pcPbModificarUsuario(Convert.ToInt32(txtId.Text),
0451 txtUsuario.Text, vrLStrClave, txtNombres.Text, txtApellidos.Text,
0452 txtEmail.Text, txtRespuesta1.Text, txtRespuesta2.Text,
0453 txtRespuesta3.Text, txtRespuesta4.Text, txtRespuesta5.Text, 1,
0454 ref vrLSqlConexion, ref vrLsIntResultado);
0455 switch (vrLsIntResultado) {
0456 case 0:
0457 MessageBox.Show("NO SE REALIZ LA ACTUALIZACIN DE " +
0458 "DATOS, EL USUARIO NO EXISTE", "ERROR",
0459 MessageBoxButtons.OK, MessageBoxIcon.Error);
0460 txtUsuario.Focus();
0461 break;
0462 case 1:
0463 MessageBox.Show("DATOS ACTUALIZADOS.", "NOTIFICACIN",
0464 MessageBoxButtons.OK, MessageBoxIcon.Information);
0465 break;
0466 case 3:
0467 MessageBox.Show("NO SE REALIZ LA ACTUALIZACIN DE " +
0468 "DATOS, HUBO UN ERROR EN LA BASE DE DATOS",
0469 "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
0470 txtUsuario.Focus();
0471 break;
0472 default:
0473 //Error mostrado en la librera
0474 txtUsuario.Focus();
0475 break;
0476 }
161
Continuacin de la figura 114.
0477
0478 vrLSqlConexion.Close();
0479 this.Dispose();
0480 this.Close();
0481 break;
0482 case 1:
0483 MessageBox.Show("EL USUARIO INDICADO YA EXISTE", "ERROR",
0484 MessageBoxButtons.OK, MessageBoxIcon.Error);
0485 txtUsuario.Focus();
0486 break;
0487 case 2:
0488 MessageBox.Show("LA OPCIN DE BSQUEDA INDICADA NO " +
0489 "ES VLIDA", "ERROR", MessageBoxButtons.OK,
0490 MessageBoxIcon.Error);
0491 txtUsuario.Focus();
0492 break;
0493 case 3:
0494 MessageBox.Show("HUBO UN ERROR EN LA BASE DE DATOS",
0495 "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
0496 txtUsuario.Focus();
0497 break;
0498 default:
0499 //Error mostrado en la librera
0500 txtUsuario.Focus();
0501 break;
0502 }
0503 }
0504 }
0505 }
0506 else {
0507 MessageBox.Show("LA DIRECCIN DE CORREO ELECTRNICO NO ES " +
0508 "VLIDA", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Warning);
0509 txtEmail.Focus();
0510 }
0511 }
0512 else {
0513 MessageBox.Show("TODOS LOS CAMPOS SON OBLIGATORIOS", "ERROR",
0514 MessageBoxButtons.OK, MessageBoxIcon.Warning);
0515 txtUsuario.Focus();
0516 }
0517 }
0518 catch (Exception pVExExcepcion) {
0519 MessageBox.Show(pVExExcepcion.ToString(), "ERROR", MessageBoxButtons.OK,
0520 MessageBoxIcon.Error);
0521 txtUsuario.Focus();
0522 }
0523 }
0524
0525 //Se validan los datos y se actualiza la contrasea en la opcin REINICIAR
0526 private void pcPrReiniciarClave() {
0527 try {
0528 //Validar que no estn vacos
0529 if (txtUsuario.Text != "" & txtEmail.Text != "") {
162
Continuacin de la figura 114.
163
Continuacin de la figura 114.
164
Continuacin de la figura 114.
165
Continuacin de la figura 114.
0689
0690 vrLSqlConexion.Close();
0691 pcPrCancelar(true);
0692 }
0693 else {
0694 MessageBox.Show("NO SE HA SELECCIONADO EL USUARIO A ELIMINAR",
0695 "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Warning);
0696 btnCancelar.Focus();
0697 }
0698 }
0699 catch (Exception pVExExcepcion) {
0700 MessageBox.Show(pVExExcepcion.ToString(), "ERROR", MessageBoxButtons.OK,
0701 MessageBoxIcon.Error);
0702 btnCancelar.Focus();
0703 }
0704 }
0705
0706 //Se busca al usuario por el Id y se muestran los datos en los controles
0707 private void pcPrBuscarUsuario() {
0708 try {
0709 //Validar que se haya ingresado el id
0710 if (txtId.Text != "") {
0711 //Validar que no sea el usuario ADMINISTRADOR
0712 if ((grBxPrincipal.Text == "REINICIANDO ...") ||
0713 ((txtId.Text != "1") && (grBxPrincipal.Text == "ELIMINANDO ..."))) {
0714 //Conectarse a SQL
0715 System.Data.SqlClient.SqlConnection vrLSqlConexion;
0716 vrLSqlConexion = modHerr.fPbSqlConectar();
0717
0718 //Validar si se pudo establecer la conexin con SQL
0719 if (vrLSqlConexion != null) {
0720 DataTable vrLTblDatos = new DataTable();
0721 Int16 vrLsIntResultado = 0;
0722 vrLTblDatos = modHerr.fPbTblBuscarUsuario(Convert.ToInt32(txtId.Text), "", "",
0723 "", 3, ref vrLSqlConexion, ref vrLsIntResultado);
0724 switch (vrLsIntResultado) {
0725 case 0:
0726 MessageBox.Show("EL USUARIO NO EXISTE", "ERROR",
0727 MessageBoxButtons.OK, MessageBoxIcon.Warning);
0728 txtId.Focus();
0729 break;
0730 case 1:
0731 //Validar si la consulta devolvi datos
0732 if (vrLTblDatos.Rows.Count == 1) {
0733 //Mostrar los datos del usuario
0734 txtUsuario.Text = vrLTblDatos.Rows[0]["Usuario"].ToString();
0735 txtNombres.Text = vrLTblDatos.Rows[0]["Nombres"].ToString();
0736 txtApellidos.Text = vrLTblDatos.Rows[0]["Apellidos"].ToString();
0737 txtEmail.Text = vrLTblDatos.Rows[0]["EMail"].ToString();
0738
0739 txtUsuario.Enabled = false;
0740 btnAceptar.Text = "&ACEPTAR";
0741 btnAceptar.Focus();
166
Continuacin de la figura 114.
0742 }
0743 else {
0744 MessageBox.Show("NO HAY DATOS DEL USUARIO", "ERROR",
0745 MessageBoxButtons.OK, MessageBoxIcon.Error);
0746 txtId.Focus();
0747 }
0748 break;
0749 case 2:
0750 MessageBox.Show("LA OPCIN DE BSQUEDA INDICADA NO ES " +
0751 "VLIDA", "ERROR", MessageBoxButtons.OK,
0752 MessageBoxIcon.Error);
0753 txtId.Focus();
0754 break;
0755 case 3:
0756 MessageBox.Show("HUBO UN ERROR EN LA BASE DE DATOS",
0757 "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
0758 txtId.Focus();
0759 break;
0760 default:
0761 //Error mostrado en la librera
0762 txtId.Focus();
0763 break;
0764 }
0765 }
0766 else {
0767 MessageBox.Show("NO SE PUDO ESTABLECER CONEXIN A LA BASE " +
0768 "DE DATOS", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
0769 txtId.Focus();
0770 }
0771 vrLSqlConexion.Close();
0772 }
0773 else {
0774 MessageBox.Show("EL USUARIO ADMINISTRADOR NO SE PUEDE ELIMINAR",
0775 "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Warning);
0776 txtId.Text = "";
0777 txtId.Focus();
0778 }
0779 }
0780 else {
0781 MessageBox.Show("DEBE INGRESAR EL CDIGO DE USUARIO", "ERROR",
0782 MessageBoxButtons.OK, MessageBoxIcon.Warning);
0783 txtId.Focus();
0784 }
0785 }
0786 catch (Exception pVExExcepcion) {
0787 MessageBox.Show(pVExExcepcion.ToString(), "ERROR", MessageBoxButtons.OK,
0788 MessageBoxIcon.Error);
0789 txtId.Focus();
0790 }
0791 }
0792
0793 //Se buscan las preguntas y se pasan los datos a los controles
0794 private void pcPrObtenerPreguntas() {
167
Continuacin de la figura 114.
0795 try {
0796 //Conectarse a SQL
0797 System.Data.SqlClient.SqlConnection vrLSqlConexion;
0798 vrLSqlConexion = modHerr.fPbSqlConectar();
0799
0800 //Validar si se pudo establecer la conexin con SQL
0801 if (vrLSqlConexion != null) {
0802 DataTable vrLTblDatos = new DataTable();
0803 Int16 vrLsIntResultado = 0;
0804 vrLTblDatos = modHerr.fPbTblBuscarPreguntas(ref vrLSqlConexion,
0805 ref vrLsIntResultado);
0806 switch (vrLsIntResultado) {
0807 case 0:
0808 MessageBox.Show("NO HAY PREGUNTAS PARA MOSTRAR", "ERROR",
0809 MessageBoxButtons.OK, MessageBoxIcon.Warning);
0810 vrLSqlConexion.Close();
0811 this.Dispose();
0812 this.Close();
0813 break;
0814 case 1:
0815 //Validar si la consulta devolvi datos
0816 if (vrLTblDatos.Rows.Count == 5) {
0817 //Pasar los datos a los controles
0818 for (int i = 0; i <= 4; i++) {
0819 Control ctrPregunta = null;
0820
0821 //Apuntar al checkbox correspondiente
0822 switch (i) {
0823 case 0:
0824 ctrPregunta = chkPregunta1;
0825 break;
0826 case 1:
0827 ctrPregunta = chkPregunta2;
0828 break;
0829 case 2:
0830 ctrPregunta = chkPregunta3;
0831 break;
0832 case 3:
0833 ctrPregunta = chkPregunta4;
0834 break;
0835 case 4:
0836 ctrPregunta = chkPregunta5;
0837 break;
0838 }
0839
0840 //Si el control apunta a un checkbox vlido
0841 if (ctrPregunta != null) {
0842 ctrPregunta.Text = vrLTblDatos.Rows[i]["PREGUNTA"].ToString();
0843 ctrPregunta = null;
0844 }
0845 }
0846 }
0847 else {
168
Continuacin de la figura 114.
169
Continuacin de la figura 114.
0901 pcPrCancelar(false);
0902 }
0903
0904 grBxPrincipal.Text = pVStrNomOpcion;
0905 grBxPrincipal.Size = new System.Drawing.Size(598, 193);
0906 this.Size = new System.Drawing.Size(631, 295);
0907
0908 //Habilitar los controles
0909 pcPrDeshabilitarControles(false);
0910 pcPrDeshabilitarBotones(true, 151);
0911 pnlClave.Visible = false;
0912 pnlPreguntas.Visible = false;
0913 txtId.Enabled = true;
0914 btnAceptar.Text = "&BUSCAR";
0915
0916 //Limpiar los controles
0917 pcPrInicializarDatos();
0918
0919 MessageBox.Show(pVStrMensaje + " Y LUEGO PRESIONE EL BOTN <<BUSCAR>>",
0920 "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
0921 txtId.Focus();
0922 }
0923
0924 /**************************************************************************************************/
0925 /**************************************** FUNCIONES *****************************************/
0926 /**************************************************************************************************/
0927 //Se valida que el usuario haya seleccionado al menos una pregunta
0928 //e ingresado la respuesta
0929 private bool fPrBolValidarPreguntas() {
0930 bool vrLBolCorrecto = false;
0931 Int16 vrLsIntContador = 0;
0932 //Validar que mas de alguna pregunta est seleccionada
0933 if (chkPregunta1.Checked == false & chkPregunta2.Checked == false
0934 & chkPregunta3.Checked == false & chkPregunta4.Checked == false
0935 & chkPregunta5.Checked == false) {
0936 MessageBox.Show("DEBE ELEGIR AL MENOS UNA PREGUNTA SECRETA E " +
0937 "INDICAR SU RESPUESTA", "ERROR", MessageBoxButtons.OK,
0938 MessageBoxIcon.Warning);
0939 chkPregunta1.Focus();
0940 }
0941 else {
0942 //Validar que cada pregunta tenga su respuesta
0943 pcPrValidarCadaPregunta(chkPregunta1.Checked, txtRespuesta1, ref vrLsIntContador);
0944 pcPrValidarCadaPregunta(chkPregunta2.Checked, txtRespuesta2, ref vrLsIntContador);
0945 pcPrValidarCadaPregunta(chkPregunta3.Checked, txtRespuesta3, ref vrLsIntContador);
0946 pcPrValidarCadaPregunta(chkPregunta4.Checked, txtRespuesta4, ref vrLsIntContador);
0947 pcPrValidarCadaPregunta(chkPregunta5.Checked, txtRespuesta5, ref vrLsIntContador);
0948
0949 if (vrLsIntContador == 0) {
0950 //Si no hubo error al validar las preguntas
0951 vrLBolCorrecto = true;
0952 }
0953 else {
170
Continuacin de la figura 114.
171
Continuacin de la figura 114.
1007 }
1008 else {
1009 //Se hacen las validaciones para reiniciarle contrasea al usuario indicado
1010 pcPrReiniciarClave();
1011 }
1012 }
1013 }
1014 break;
1015 default:
1016 break;
1017 }
1018 }
1019
1020 //Si se presiona el botn CANCELAR
1021 private void pcPrClicCancelar(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
1022 //Se llama al procedimiento pcPrCancelar
1023 pcPrCancelar(true);
1024 }
1025
1026 //Al dar clic en la imagen AGREGAR, se habilitan los controles
1027 private void pcPrClicAgregar(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
1028 //Si se est en alguna opcin
1029 if (grBxPrincipal.Text != "") {
1030 pcPrCancelar(false);
1031 }
1032
1033 grBxPrincipal.Text = "AGREGANDO ...";
1034 grBxPrincipal.Size = new System.Drawing.Size(598, 193);
1035 this.Size = new System.Drawing.Size(631, 295);
1036
1037 //Habilitar los controles
1038 pcPrDeshabilitarControles(true);
1039 pcPrDeshabilitarBotones(true, 151);
1040 pnlClave.Visible = false;
1041 pnlPreguntas.Visible = false;
1042
1043 //Limpiar los controles
1044 pcPrInicializarDatos();
1045 txtUsuario.Focus();
1046 }
1047
1048 //Al dar clic en la imagen REINICIAR CONTRASEA, se habilitan los controles
1049 private void pcPrClicReiniciarClave(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
1050 //Indicarle al usuario que primero debe ingresar el ID del usuario a quien se le
1051 //reiniciar la clave
1052 pcPrParaBuscarDatosUsuario("REINICIANDO ...", "INGRESE EL ID DEL USUARIO A " +
1053 "QUIEN LE REINICIAR LA CONTRASEA");
1054 }
1055
1056 //Al dar clic en la imagen EDITAR, se habilitan los controles
1057 private void pcPrClicEditar(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
1058 //Si se est en alguna opcin
1059 if (grBxPrincipal.Text != "") {
172
Continuacin de la figura 114.
1060 pcPrCancelar(true);
1061 }
1062
1063 grBxPrincipal.Text = "EDITANDO ...";
1064 grBxPrincipal.Size = new System.Drawing.Size(598, 504);
1065 this.Size = new System.Drawing.Size(631, 607);
1066
1067 //Habilitar los controles
1068 pcPrDeshabilitarControles(true);
1069 pcPrDeshabilitarBotones(true, 460);
1070 //Si es el usuario administrador
1071 if (mdPbStrUsuario == "ADMIN") {
1072 txtNombres.Focus();
1073 }
1074 else {
1075 txtUsuario.Focus();
1076 }
1077 }
1078
1079 //Al dar clic en la imagen ELIMINAR, se habilitan los controles
1080 private void pcPrClicEliminar(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
1081 //Indicarle al usuario que primero debe ingresar el ID del usuario a eliminar
1082 pcPrParaBuscarDatosUsuario("ELIMINANDO ...", "INGRESE EL ID DEL USUARIO " +
1083 "A ELIMINAR");
1084 }
1085
1086 //Al dar clic en el cono de INFORME
1087 private void pcPrClicInforme(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
1088 //Llamar a la ventana del informe
1089 frmInforme vrLfrmInforme = new frmInforme();
1090 vrLfrmInforme.ShowDialog(this);
1091 }
1092
1093 //Al dar clic en el cono de AYUDA
1094 private void pcPrClicAyudaDatosUsuario(object pVObjTipoObjeto,
1095 EventArgs pVEvtEvento) {
1096 //Llamar a la ventana de ayuda en lnea
1097 frmAyuda vrLfrmAyudaDatosUsuario = new frmAyuda();
1098 vrLfrmAyudaDatosUsuario.mdPbStrNomPadre = this.Name;
1099 vrLfrmAyudaDatosUsuario.mdPbStrNomOpcion = grBxPrincipal.Text;
1100 vrLfrmAyudaDatosUsuario.mdPbStrNomModalidad = mdPbStrUsuario;
1101 vrLfrmAyudaDatosUsuario.ShowDialog(this);
1102 }
1103 }
1104 }
173
Si se presiona el botn RECUPERAR CLAVE, se debe ingresar el usuario
y correo electrnico registrados en el sistema, ya que al presiona el botn
VALIDAR, con base a estos datos se ubica al usuario; si no coinciden los datos,
no se podr recuperar la clave.
174
Figura 116. Cdigo de RecuperacionClave.cs
0001 /********************************************************************************************************/
0002 /* Archivo: RecuperacionClave.cs */
0003 /* Descripcin: Forma para cambiar la clave. */
0004 /* Autor: Norma M. Chonay V. */
0005 /* Fecha de creacin: 27/02/2011 */
0006 /* Fecha de ltima modificacin: 27/02/2011 */
0007 /* Autor de ltima modificacin: Norma M. Chonay V. */
0008 /* Versin: 1.1 */
0009 /* Prerrequisitos: Ninguno */
0010 /********************************************************************************************************/
0011
0012 using System;
0013 using System.Collections.Generic;
0014 using System.ComponentModel;
0015 using System.Data;
0016 using System.Drawing;
0017 using System.Linq;
0018 using System.Text;
0019 using System.Windows.Forms;
0020 using RecuperarContrasea.Librerias;
0021
0022 namespace RecuperarContrasea.modSeguridad {
0023 public partial class frmRecuperacionClave : Form {
0024 public frmRecuperacionClave() {
0025 InitializeComponent();
0026 }
0027
0028 //Instanciar la librera de utilidades
0029 modHerramientas modHerr = new modHerramientas();
0030
0031 /**************************************************************************************************/
0032 /*********************** VALIDACIN DE DATOS EN LOS CONTROLES *****************/
0033 /**************************************************************************************************/
0034 //Valida los carcteres ingresados en el control txtEmail
0035 private void pcPrValidarTxtEmail(object pVObjTipoObjeto, KeyPressEventArgs pVKpTecla) {
0036 modHerr.pcPbValidarCaracteres(ref pVKpTecla, btnValidar, 3);
0037 }
0038
0039 //Valida los carcteres ingresados en el control txtUsuario
0040 private void pcPrValidarTxtUsuario(object pVObjTipoObjeto,
0041 KeyPressEventArgs pVKpTecla) {
0042 modHerr.pcPbValidarCaracteres(ref pVKpTecla, txtEmail, 1);
0043 }
0044
0045 //Valida los carcteres ingresados en el control txtRespuesta
0046 private void pcPrValidarTxtRespuesta(object pVObjTipoObjeto,
0047 KeyPressEventArgs pVKpTecla) {
0048 modHerr.pcPbValidarCaracteres(ref pVKpTecla, btnAceptar, 5);
0049 }
0050
0051 /**************************************************************************************************/
0052 /****************************** EVENTOS DE LOS CONTROLES ***************************/
0053 /**************************************************************************************************/
175
Continuacin de la figura 116.
0054 //Si se presiona el botn VALIDAR, se validan los datos ingresados y se muestra
0055 //una de las preguntas secretas registradas para el usuario
0056 private void pcPrClicValidar(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
0057 try {
0058 //Validar que no estn vacos los controles
0059 if (txtUsuario.Text != "" & txtEmail.Text != "") {
0060 //Validar la direccin de correo electrnico
0061 if (modHerr.fPbBolValidarEmail(txtEmail.Text) == true) {
0062 DataTable vrLTblDatos = new DataTable();
0063 Int16 vrLsIntResultado = 0;
0064
0065 //Conectarse a SQL
0066 System.Data.SqlClient.SqlConnection vrLSqlConexion;
0067 vrLSqlConexion = modHerr.fPbSqlConectar();
0068
0069 //Consultar en la BDD si el usuario y el email coinciden
0070 vrLTblDatos = modHerr.fPbTblBuscarUsuario(-1, txtUsuario.Text.ToUpper().Trim(),
0071 "", txtEmail.Text.ToUpper().Trim(), 0, ref vrLSqlConexion,
0072 ref vrLsIntResultado);
0073 switch (vrLsIntResultado) {
0074 case 0:
0075 MessageBox.Show("NO SE PUEDE RECUPERAR LA CLAVE, LA " +
0076 "INFORMACIN INDICADA NO EST REGISTRADA EN EL SISTEMA",
0077 "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
0078 break;
0079 case 1:
0080 //Validar si la consulta devolvi datos
0081 if (vrLTblDatos.Rows.Count == 1) {
0082 //Mostrar la pregunta secreta
0083 if (vrLTblDatos.Rows[0]["Pregunta"].ToString() != "") {
0084 lblPregunta.Text = vrLTblDatos.Rows[0]["Pregunta"].ToString();
0085 mdPbStrRespuesta = vrLTblDatos.Rows[0]["Respuesta"].ToString();
0086 btnAceptar.Enabled = true;
0087 txtRespuesta.Enabled = true;
0088 txtRespuesta.Focus();
0089 }
0090 else {
0091 MessageBox.Show("NO SE PUEDE RECUPERAR LA CLAVE, EL " +
0092 "USUARIO NO TIENE REGISTRADA NINGUNA PREGUNTA " +
0093 "SECRETA", "ERROR", MessageBoxButtons.OK,
0094 MessageBoxIcon.Error);
0095 vrLSqlConexion.Close();
0096 this.Dispose();
0097 this.Close();
0098 }
0099 }
0100 else {
0101 MessageBox.Show("LA INFORMACIN INDICADA, NO EST " +
0102 "REGISTRADA EN EL SISTEMA", "ERROR", MessageBoxButtons.OK,
0103 MessageBoxIcon.Error);
0104 txtUsuario.Focus();
0105 }
0106 break;
176
Continuacin de la figura 116.
0107 case 2:
0108 MessageBox.Show("LA OPCIN DE BSQUEDA INDICADA NO ES " +
0109 "VLIDA", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
0110 vrLSqlConexion.Close();
0111 this.Dispose();
0112 this.Close();
0113 break;
0114 case 3:
0115 MessageBox.Show("HUBO UN ERROR EN LA BASE DE DATOS", "ERROR",
0116 MessageBoxButtons.OK, MessageBoxIcon.Error);
0117 vrLSqlConexion.Close();
0118 this.Dispose();
0119 this.Close();
0120 break;
0121 default:
0122 //Error mostrado en la librera
0123 break;
0124 }
0125 vrLSqlConexion.Close();
0126 }
0127 else {
0128 MessageBox.Show("LA DIRECCIN DE CORREO ELECTRNICO NO ES " +
0129 "VLIDA", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Warning);
0130 txtEmail.Focus();
0131 }
0132 }
0133 else {
0134 MessageBox.Show("TODOS LOS CAMPOS SON OBLIGATORIOS", "ERROR",
0135 MessageBoxButtons.OK, MessageBoxIcon.Warning);
0136 txtUsuario.Focus();
0137 }
0138 }
0139 catch (Exception pVExExcepcion) {
0140 MessageBox.Show(pVExExcepcion.ToString(), "ERROR", MessageBoxButtons.OK,
0141 MessageBoxIcon.Error);
0142 txtUsuario.Focus();
0143 }
0144 }
0145
0146 //Si se presiona el botn ACEPTAR y si los datos ingresados son vlidos,
0147 //se reinicia la contrasea
0148 private void pcPrClicAceptar(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
0149 try {
0150 txtRespuesta.Text = txtRespuesta.Text.Trim();
0151 txtUsuario.Text = txtUsuario.Text.ToUpper().Trim();
0152 txtEmail.Text = txtEmail.Text.ToUpper().Trim();
0153
0154 //Validar que no estn vacos
0155 if (txtUsuario.Text != "" & txtEmail.Text != "" & txtRespuesta.Text != "") {
0156 //Validar la direccin de correo electrnico
0157 if (modHerr.fPbBolValidarEmail(txtEmail.Text) == true) {
0158 //Validar que la respuesta sea la que est registrada
0159 if (mdPbStrRespuesta == txtRespuesta.Text) {
177
Continuacin de la figura 116.
178
Continuacin de la figura 116.
179
Continuacin de la figura 116.
0266 else {
0267 MessageBox.Show("LA RESPUESTA NO ES VLIDA", "ERROR",
0268 MessageBoxButtons.OK, MessageBoxIcon.Warning);
0269 txtRespuesta.Focus();
0270 }
0271 }
0272 else {
0273 MessageBox.Show("LA DIRECCIN DE CORREO ELECTRNICO NO " +
0274 "ES VLIDA", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Warning);
0275 txtEmail.Focus();
0276 }
0277 }
0278 else {
0279 MessageBox.Show("TODOS LOS CAMPOS SON OBLIGATORIOS", "ERROR",
0280 MessageBoxButtons.OK, MessageBoxIcon.Warning);
0281 txtUsuario.Focus();
0282 }
0283 }
0284 catch (Exception pVExExcepcion) {
0285 MessageBox.Show(pVExExcepcion.ToString(), "ERROR", MessageBoxButtons.OK,
0286 MessageBoxIcon.Error);
0287 txtUsuario.Focus();
0288 }
0289 }
0290
0291 //Si se presiona el botn CANCELAR, se limpia el texto ingresado en los controles
0292 private void pcPrClicCancelar(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
0293 txtUsuario.Text = "";
0294 txtEmail.Text = "";
0295 txtRespuesta.Text = "";
0296 lblPregunta.Text = "Pregunta secreta:";
0297 btnAceptar.Enabled = false;
0298 txtRespuesta.Enabled = false;
0299 txtUsuario.Focus();
0300 }
0301
0302 //Al dar clic en el cono de AYUDA
0303 private void pcPrAyudaRecupClave(object pVObjTipoObjeto, EventArgs pVEvtEvento) {
0304 //Llamar a la ventana de ayuda en lnea
0305 frmAyuda vrLfrmAyudaRecupClave = new frmAyuda();
0306 vrLfrmAyudaRecupClave.mdPbStrNomPadre = this.Name;
0307 vrLfrmAyudaRecupClave.mdPbStrNomOpcion = "";
0308 vrLfrmAyudaRecupClave.mdPbStrNomModalidad = "";
0309 vrLfrmAyudaRecupClave.ShowDialog(this);
0310 }
0311 }
0312 }
180
Como se puede apreciar en el cdigo expuesto anteriormente, se aplic la
metodologa EXTILO REGULAR 9002 al escribir cada lnea, modularizando en
subrutinas los procesos para utilizarlos desde diferentes partes de la aplicacin,
variando los valores enviados por parmetro para obtener el comportamiento
esperado.
Los colores, tipo de letra e conos son uniformes en todos los formularios;
se manejan excepciones en los procedimientos y funciones solamente en los
que llaman a otras subrutinas y en los que se comunican con la base de datos.
Las recomendaciones con respecto al uso de sangra tambin fueron aplicadas;
y por supuesto las indicaciones para nombrar a los elementos de la base de
datos y de la aplicacin. Permitiendo as que el cdigo de cualquiera de los
prototipos, pueda modificarse por un analista programador que sepa programar.
Si la persona conoce el lenguaje de programacin utilizado, invertir menos
tiempo en entender el cdigo, que alguien que desconozca el lenguaje.
181
182
CONCLUSIONES
183
184
RECOMENDACIONES
185
186
BIBLIOGRAFA
187
6. CONCHA HURTADO, Nancy Elizabet. Propuesta para implantar CMMI
en una empresa con mltiples unidades desarrolladores de software
[en lnea]. Tesis digitales UNMSM. Disponible en Web: <http://-
sisbib.unmsm.edu.pe/bibvirtualdata/tesis/Basic/concha_hn/cap1.pdf>.
[Consulta: 30 de agosto de 2009].
188
12. Junta de Castilla y Len. Gua de iniciacin al lenguaje JAVA [en lnea].
Universidad de Burgos. Octubre de 1999. Disponible en Web:
<http://pisuerga.inf.ubu.es/lsi/Invest/Java/Tuto/II_2.htm>. [Consulta:
24 de noviembre de 2009].
15. __________. How to: verify that strings are in valid e-mail format [en
lnea]. Microsoft. Disponible en Web: <http://msdn.microsoft.com/
en-us/library/01escwtf.aspx>. [Consulta: 27 de febrero de 2011].
189
18. MUNIVE HERRERA, Elizabeth; TREJO RAMREZ, Ral. A methodology
for self-diagnosis for software quality assurance in small and medium-
sized industries in Latin America [en lnea]. Instituto Tecnolgico y de
Estudios Superiores de Monterrey. 2003. Disponible en Web:
<http://www.ejisdc.org/ojs2/index.php/ejisdc/article/viewFile/94/94>.
[Consulta: 28 de junio de 2009].
19. MYSQL. Data Types [en lnea]. Oracle. Disponible en Web: <http://-
dev.mysql.com/doc/refman/5.0/en/data-types.html>. [Consulta: 28 de
noviembre de 2009].
20. ORACLE. Database concepts. Oracle Data Types [en lnea]. Disponible
en Web: <http://download.oracle.com/docs/cd/B28359_01/server.11-
1/b28318/datatype.htm>. [Consulta: 25 de noviembre de 2009].
21. __________. Database SQL Language Reference. Data Types [en lnea].
Disponible en Web: <http://download.oracle.com/docs/cd/B28359_-
01/server.111/b28286/sql_elements001.htm>. -----------------
[Consulta: 25 de noviembre de 2009].
190
23. PROEXPORT Colombia y Banco Interamericano de Desarrollo Fondo
Multilateral de Inversin (BID-FOMIN). Anlisis del sector software
[en lnea]. Proexport Colombia. 2004. Disponible en Web: <http://-
www.proexport.com.co/VBeContent/library/documents/DocNewsNo8
683DocumentNo7147.PDF>. [Consulta: 02 de junio de 2009].
26. W3C. The global structure of an HTML document [en lnea]. Disponible
en Web: <http://www.w3.org/TR/html4/struct/global.html>. [Consulta:
02 de enero de 2011].
27. W3SCHOOLS. HTML Tag List [en lnea]. Disponible en Web: <http://-
www.w3schools.com/tags/default.asp>. [Consulta: 03 de diciembre
de 2009].
191
29. __________. Capability Maturity Model Integration [en lnea].______
Wikipedia. Disponible en Web: <http://es.wikipedia.org/wiki/CMMI>.
[Consulta: 30 de agosto de 2009].
192
36. __________. Script (informtica) [en lnea]. Disponible en Web:
<http://es.wikipedia.org/wiki/Script_(inform%C3%A1tica)>. [Consulta:
02 de enero de 2011].
193
194
APNDICES
195
196
1. PROTOTIPO # 2: VISUAL BASIC .NET - ORACLE
197
El siguiente cdigo corresponde al procedimiento que crea un nuevo
usuario en tbl_seg_usuario.
198
Figura A-3. Procedimiento pc_modificarusuario
199
Continuacin de la figura A-3.
200
Continuacin de la figura A-4.
0026 EXCEPTION
0027 WHEN OTHERS THEN
0028 pr_nm_resultado := 3;
0029 END;
201
Continuacin de la figura A-5.
0015
0016 IF (vr_l_nm_resultado = 1) THEN
0017 OPEN pr_crs_datos FOR
0018 SELECT * FROM
0019 (SELECT Usuario.nm_id As Id,
0020 Usuario.nvch2_usuario As Usuario,
0021 Usuario.nvch2_nombres As Nombres,
0022 Usuario.nvch2_apellidos As Apellidos,
0023 Usuario.nvch2_email As EMail,
0024 Pregunta.nvch2_pregunta As Pregunta,
0025 Resp.nvch2_respuesta As Respuesta
0026 FROM tbl_seg_usuario Usuario
0027 LEFT JOIN tbl_seg_usuariopregunta Resp
0028 ON (Resp.nm_id = Usuario.nm_id)
0029 LEFT JOIN tbl_seg_pregunta Pregunta
0030 ON (Pregunta.nm_Pregunta = Resp.nm_Pregunta)
0031 WHERE Usuario.nvch2_usuario = TRIM(pv_nvch2_usuario)
0032 AND Usuario.nvch2_email = TRIM(pv_nvch2_email)
0033 ORDER BY DBMS_RANDOM.VALUE)
0034 WHERE ROWNUM = 1;
0035
0036 pr_nm_resultado := 1; --El usuario y el email s son correctos
0037 ELSE
0038 pr_nm_resultado := 0; --Los datos del usuario no son correctos
0039 END IF;
0040 ELSE
0041 --Consultar si el usuario existe
0042 IF pv_nm_opcion = 1 THEN
0043 SELECT COUNT(*)
0044 INTO vr_l_nm_resultado
0045 FROM tbl_seg_usuario
0046 WHERE nvch2_usuario = TRIM(pv_nvch2_usuario)
0047 AND nm_id <> pv_nm_id;
0048
0049 IF (vr_l_nm_resultado = 1) THEN
0050 pr_nm_resultado := 1; --El usuario s existe
0051 ELSE
0052 pr_nm_resultado := 0; --No existe el usuario
0053 END IF;
0054 ELSE
0055 --Consultar si el usuario y la clave son correctos
0056 IF pv_nm_opcion = 2 THEN
0057 SELECT COUNT(*)
0058 INTO vr_l_nm_resultado
0059 FROM tbl_seg_usuario
0060 WHERE nvch2_usuario = TRIM(pv_nvch2_usuario)
0061 AND nvch2_clave = TRIM(pv_nvch2_clave);
0062
0063 IF (vr_l_nm_resultado = 1) THEN
0064 OPEN pr_crs_datos FOR
0065 SELECT Usuario.nm_id As Id,
0066 Usuario.nvch2_usuario As Usuario,
0067 Usuario.nvch2_clave As Clave,
202
Continuacin de la figura A-5.
203
Continuacin de la figura A-5.
0121 ELSE
0122 pr_nm_resultado := 2; --No es una opcin vlida
0123 END IF;
0124 END IF;
0125 END IF;
0126 END IF;
0127 END IF;
0128 EXCEPTION
0129 WHEN OTHERS THEN
0130 pr_nm_resultado := 3;
0131 END;
1.2. Aplicacin
204
Figura A-6. Carpeta del proyecto RecuperarContrasea
205
Figura A-8. Carpeta del proyecto RecuperarContrasea, que contiene las
imgenes utilizadas en los formularios
206
Figura A-10. Carpeta del proyecto RecuperarContrasea, que contiene
los formularios de la aplicacin y la pgina HTML
207
El cdigo que se describe a continuacin, corresponde a las libreras
utilizadas en el prototipo.
0001 /********************************************************************************************************/
0002 /* Archivo: libUtilidades.1.1.js */
0003 /* Descripcin: Librera con utilidades. */
0004 /* Autor: Norma M. Chonay V. */
0005 /* Fecha de creacin: 21/04/2011 */
0006 /* Fecha de ltima modificacin: 21/04/2011 */
0007 /* Autor de ltima modificacin: Norma M. Chonay V. */
0008 /* Versin: 1.1 */
0009 /* Prerrequisitos: Ninguno */
0010 /********************************************************************************************************/
0011
0012 //Indica si la tecla recibida es una letra minscula o mayscula, no incluye vocales tildadas
0013 function fPbBolEsLetra(pRKpTecla)
0014 { if ((pRKpTecla.keyCode >= 65 && pRKpTecla.keyCode <= 90) || pRKpTecla.keyCode == 209 ||
0015 //Letras maysculas
0016 (pRKpTecla.keyCode >= 97 && pRKpTecla.keyCode <= 122) || pRKpTecla.keyCode == 241)
0017 //Letras minsculas
0018 { return true;
0019 }
0020 else
0021 { return false;
0022 }
0023 }
0024 //Indica si la tecla recibida es una vocal tildada minscula o mayscula
0025 function fPbBolEsVocalTildada(pRKpTecla)
0026 { if (pRKpTecla.keyCode == 225 || pRKpTecla.keyCode == 233 || pRKpTecla.keyCode == 237 ||
0027 pRKpTecla.keyCode == 243 || pRKpTecla.keyCode == 250 ||
0028 //Vocales minsculas tildadas
0029 pRKpTecla.keyCode == 193 || pRKpTecla.keyCode == 201 || pRKpTecla.keyCode == 205 ||
0030 pRKpTecla.keyCode == 211 || pRKpTecla.keyCode == 218)
0031 //Vocales maysculas tildadas
0032 { return true;
0033 }
0034 else
0035 { return false;
0036 }
0037 }
0038 //Indica si la tecla recibida es un nmero
0039 function fPbBolEsNumero(pRKpTecla)
0040 { if (pRKpTecla.keyCode >= 48 && pRKpTecla.keyCode <= 57) //nmeros
0041 { return true;
0042 }
0043 else
0044 { return false;
0045 }
208
Continuacin de la figura A-12.
0046 }
0047 //Restringe el ingreso de nmeros, letras y los carcteres vlidos
0048 function pcPbValidarCaracteres(pRKpTecla, pRCtrlEnfoque, pVsIntOpcion)
0049 { //Variable con el mensaje a desplegar
0050 var vrLStrMensaje = "";
0051
0052 switch (pVsIntOpcion)
0053 { case 1: //Carcteres alfanumricos
0054 if ( fPbBolEsLetra(pRKpTecla) || //Letras maysculas y minsculas
0055 fPbBolEsNumero(pRKpTecla) || //nmeros
0056 pRKpTecla.keyCode == 45 || //carcter -
0057 pRKpTecla.keyCode == 95 || //carcter _
0058 pRKpTecla.keyCode == 8) //retroceso (backspace)
0059 { pVsIntOpcion = 0; //Carcter vlido
0060 }
0061 vrLStrMensaje = "SOLAMENTE SE PERMITE EL INGRESO DE LETRAS, NMEROS " +
0062 "Y LOS CARCTERES - _";
0063 break;
0064 case 2: //Carcteres alfabticos
0065 if (fPbBolEsLetra(pRKpTecla) || //Letras maysculas y minsculas
0066 pRKpTecla.keyCode == 32 || //espacio
0067 fPbBolEsVocalTildada(pRKpTecla) || //Vocales minsculas y maysculas tildadas
0068 pRKpTecla.keyCode == 8) //retroceso (backspace)
0069 { pVsIntOpcion = 0; //Carcter vlido
0070 }
0071 vrLStrMensaje = "SOLAMENTE SE PERMITE EL INGRESO DE LETRAS Y " +
0072 "ESPACIOS EN BLANCO";
0073 break;
0074 case 3: //Carcteres para cuenta de correo
0075 if (fPbBolEsLetra(pRKpTecla) || //Letras maysculas y minsculas
0076 fPbBolEsNumero(pRKpTecla) || //nmeros
0077 pRKpTecla.keyCode == 95 || //carcter _
0078 pRKpTecla.keyCode == 46 || //punto
0079 pRKpTecla.keyCode == 64 || //arroba
0080 pRKpTecla.keyCode == 8) //retroceso (backspace)
0081 { pVsIntOpcion = 0; //Carcter vlido
0082 }
0083 vrLStrMensaje = "SOLAMENTE SE PERMITE EL INGRESO DE LETRAS, NMEROS " +
0084 "Y LOS CARCTERES . _ @";
0085 break;
0086 case 4: //Nmeros
0087 if (fPbBolEsNumero(pRKpTecla) || //nmeros
0088 pRKpTecla.keyCode == 8) //retroceso (backspace)
0089 { pVsIntOpcion = 0; //Carcter vlido
0090 }
0091 vrLStrMensaje = "SOLAMENTE SE PERMITE EL INGRESO DE NMEROS";
0092 break;
0093 case 5: //Carcteres alfanumricos y espacio
0094 if (fPbBolEsLetra(pRKpTecla) || //Letras maysculas y minsculas
0095 fPbBolEsNumero(pRKpTecla) || //nmeros
0096 pRKpTecla.keyCode == 45 || //carcter -
0097 pRKpTecla.keyCode == 95 || //carcter _
0098 pRKpTecla.keyCode == 8 || //retroceso (backspace)
209
Continuacin de la figura A-12.
210
Figura A-13. Cdigo de libHerramientas.1.0.vb, cuyas subrutinas son
invocadas desde los formularios
0001 /********************************************************************************************************/
0002 /* Archivo: libHerramientas.1.0.vb */
0003 /* Descripcin: Librera con utilidades. */
0004 /* Autor: Norma M. Chonay V. */
0005 /* Fecha de creacin: 24/04/2011 */
0006 /* Fecha de ltima modificacin: 24/04/2011 */
0007 /* Autor de ltima modificacin: Norma M. Chonay V. */
0008 /* Versin: 1.0 */
0009 /* Prerrequisitos: Ninguno */
0010 /********************************************************************************************************/
0011
0012 Imports Oracle.DataAccess.Client
0013 Imports System.Security.Cryptography
0014 Imports System.Net.Mail
0015 Imports System.Net
0016
0017 Public Class modHerramientas
0018 'Llave para cifrar
0019 Private atPrStrLlave As String = "DESPUS DE LA TORMENTA, SIEMPRE LLEGA LA " + _
0020 "C@1MA"
0021
0022 'Funcin que valida si la cuenta de correo electrnico es vlida
0023 Public Function fPbBolValidarEmail(ByVal pVStrEmail As String) As Boolean
0024 Return Regex.IsMatch(pVStrEmail, _
0025 "^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=" + _
0026 "[0-9a-zA-Z])@))" + _
0027 "(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$")
0028 End Function
0029
0030 'Funcin que devuelve la conexin a la BDD
0031 Public Function fPbOcleConectar() As OracleConnection
0032 Dim vrLOcleConexion As New OracleConnection
0033
0034 vrLOcleConexion.ConnectionString = "Data source=nchonay; User id=usr_seg; " + _
0035 "Password=anionuev0;"
0036 vrLOcleConexion.Open()
0037 Return vrLOcleConexion
0038 End Function
0039
0040 'Funcin para cifrar
0041 Public Function fPbStrCifrar(ByVal pVStrTexto As String) As String
0042 Dim vrLBtLlave As Byte() 'Para almacenar la llave
0043 'Para almacenar el texto a cifrar
0044 Dim vrLBtTexto As Byte() = UTF8Encoding.UTF8.GetBytes(pVStrTexto)
0045 'Para calcular el valor hash MD5 de la llave
0046 Dim vrLMD5Hash As MD5CryptoServiceProvider = New MD5CryptoServiceProvider()
0047 'Para cifrar con el algoritmo triple DES
0048 Dim vrL3DESAlgoritmo As TripleDESCryptoServiceProvider
0049 vrL3DESAlgoritmo = New TripleDESCryptoServiceProvider()
0050
0051 'Almacenar la llave con el valor hash
211
Continuacin de la figura A-13.
212
Continuacin de la figura A-13.
213
Continuacin de la figura A-13.
0158 vrLOcleComando.Parameters.Clear()
0159 vrLOcleComando.Parameters.Add("pr_nm_id", OracleDbType.Int32, _
0160 ParameterDirection.Output)
0161 vrLOcleComando.Parameters.Add("pv_nvch2_usuario", OracleDbType.NVarchar2, _
0162 10, pVStrUsuario, ParameterDirection.Input)
0163 vrLOcleComando.Parameters.Add("pv_nvch2_clave", OracleDbType.NVarchar2, _
0164 1000, pVStrClave, ParameterDirection.Input)
0165 vrLOcleComando.Parameters.Add("pv_nvch2_nombres", OracleDbType.NVarchar2, _
0166 50, pVStrNombres, ParameterDirection.Input)
0167 vrLOcleComando.Parameters.Add("pv_nvch2_apellidos", OracleDbType.NVarchar2, _
0168 50, pVStrApellidos, ParameterDirection.Input)
0169 vrLOcleComando.Parameters.Add("pv_nvch2_email", OracleDbType.NVarchar2, _
0170 50, pVStrEmail, ParameterDirection.Input)
0171 vrLOcleComando.Parameters.Add("pr_nm_resultado", OracleDbType.Int16, _
0172 ParameterDirection.Output)
0173
0174 'Ejecutar la consulta
0175 vrLOcleComando.Connection = pROcleConexion
0176 vrLOcleComando.ExecuteNonQuery()
0177 pRsIntResultado = Convert.ToInt16(vrLOcleComando.Parameters("pr_nm_" + _
0178 "resultado").Value)
0179 pRIntId = Convert.ToInt16(vrLOcleComando.Parameters("pr_nm_id").Value)
0180 Else
0181 pRHdnMensaje.Value = "NO SE PUDO ESTABLECER CONEXIN A LA BASE " + _
0182 "DE DATOS"
0183 End If
0184 Catch pVExExcepcion As Exception
0185 pRsIntResultado = 10
0186 pRHdnMensaje.Value = pVExExcepcion.ToString()
0187 End Try
0188 End Sub
0189
0190 'Procedimiento para eliminar un usuario
0191 Public Sub pcPbEliminarUsuario(ByVal pVIntId As Int32, _
0192 ByRef pROcleConexion As OracleConnection, ByRef pRsIntResultado As Int16, _
0193 ByRef pRHdnMensaje As HiddenField)
0194 'Inicializar el cdigo del mensaje resultado
0195 pRsIntResultado = 10
0196
0197 Try
0198 'Validar si se pudo establecer la conexin con Oracle
0199 If Not (pROcleConexion Is Nothing) Then
0200 Dim vrLOcleComando As OracleCommand = New OracleCommand()
0201
0202 'Indicar el nombre del procedimiento almacenado
0203 vrLOcleComando.CommandType = CommandType.StoredProcedure
0204 vrLOcleComando.CommandText = "pc_eliminarusuario"
0205
0206 'Pasar los parmetros
0207 vrLOcleComando.Parameters.Clear()
0208 vrLOcleComando.Parameters.Add("pv_nm_id", OracleDbType.Int32, pVIntId, _
0209 ParameterDirection.Input)
0210 vrLOcleComando.Parameters.Add("pr_nm_resultado", OracleDbType.Int16, _
214
Continuacin de la figura A-13.
0211 ParameterDirection.Output)
0212
0213 'Ejecutar la consulta
0214 vrLOcleComando.Connection = pROcleConexion
0215 vrLOcleComando.ExecuteNonQuery()
0216 pRsIntResultado = Convert.ToInt16(vrLOcleComando.Parameters("pr_nm_" + _
0217 "resultado").Value)
0218
0219 Else
0220 pRHdnMensaje.Value = "NO SE PUDO ESTABLECER CONEXIN A LA BASE " + _
0221 "DE DATOS"
0222 End If
0223
0224 Catch pVExExcepcion As Exception
0225 pRsIntResultado = 10
0226 pRHdnMensaje.Value = pVExExcepcion.ToString()
0227 End Try
0228 End Sub
0229
0230 'Funcin para validar si el usuario y la contrasea son correctos,
0231 'si el usuario y el email son correctos,
0232 'buscar datos de todos los usuarios, buscar un usuario por ID,
0233 'o bien validar si el usuario ya existe
0234 Public Function fPbTblBuscarUsuario(ByVal pVIntId As Int32, ByVal pVStrUsuario As String, _
0235 ByVal pVStrClave As String, ByVal pVStrEmail As String, ByVal pVsIntOpcion As Int16, _
0236 ByRef pROcleConexion As OracleConnection, ByRef pRsIntResultado As Int16, _
0237 ByRef pRHdnMensaje As HiddenField) As DataTable
0238 'Valor de retorno
0239 Dim rtTblDatos As DataTable = New DataTable()
0240 'Inicializar el cdigo del mensaje resultado
0241 pRsIntResultado = 10
0242
0243 Try
0244 'Validar si se pudo establecer la conexin con Oracle
0245 If Not (pROcleConexion Is Nothing) Then
0246 Dim vrLOcleComando As OracleCommand = New OracleCommand()
0247 Dim vrLOcleAdaptador As OracleDataAdapter
0248
0249 'Indicar el nombre del procedimiento almacenado
0250 vrLOcleComando.CommandType = CommandType.StoredProcedure
0251 vrLOcleComando.CommandText = "pc_buscarusuario"
0252
0253 'Pasar los parmetros
0254 vrLOcleComando.Parameters.Clear()
0255 vrLOcleComando.Parameters.Add("pv_nm_id", OracleDbType.Int32, pVIntId, _
0256 ParameterDirection.Input)
0257 vrLOcleComando.Parameters.Add("pv_nvch2_usuario", OracleDbType.NVarchar2, _
0258 10, pVStrUsuario, ParameterDirection.Input)
0259 vrLOcleComando.Parameters.Add("pv_nvch2_clave", OracleDbType.NVarchar2, _
0260 1000, pVStrClave, ParameterDirection.Input)
0261 vrLOcleComando.Parameters.Add("pv_nvch2_email", OracleDbType.NVarchar2, _
0262 50, pVStrEmail, ParameterDirection.Input)
0263 vrLOcleComando.Parameters.Add("pv_nm_opcion", OracleDbType.Int16, _
215
Continuacin de la figura A-13.
216
Continuacin de la figura A-13.
0317 pRsIntResultado = 3
0318 End If
0319
0320 Catch pVExExcepcion As Exception
0321 pRsIntResultado = 10
0322 pRHdnMensaje.Value = pVExExcepcion.ToString()
0323 End Try
0324 Return rtTblDatos
0325 End Function
0326
0327 'Enviar correo electrnico
0328 Public Function fPbBolEnviarEmail(ByVal pVStrEmail As String, ByVal pVStrUsuario As String, _
0329 ByVal pVStrClave As String, ByVal pVsIntOpcion As Int16, _
0330 ByRef pRHdnMensaje As HiddenField) As Boolean
0331 'Configuracin del correo
0332 Dim vrLAdrsRemitente As MailAddress = New MailAddress("notificacion.sistema.gt" + _
0333 "@gmail.com")
0334 Dim vrLAdrsDestinatario As MailAddress = New MailAddress(pVStrEmail)
0335 Dim vrLMsgMensaje As MailMessage = New MailMessage(vrLAdrsRemitente, _
0336 vrLAdrsDestinatario)
0337 vrLMsgMensaje.Subject = "SISTEMA.GT"
0338 vrLMsgMensaje.IsBodyHtml = True
0339
0340 Select Case pVsIntOpcion
0341 'Mensaje de bienvenida
0342 Case 1
0343 vrLMsgMensaje.Body = "<b>BIENVENIDO</b> al SISTEMA.GT <br><br>" + _
0344 "Su usuario es: " + pVStrUsuario + "<br>" + _
0345 "La contrasea es: " + pVStrClave + "<br><br><br>" + _
0346 "Debe ingresar al sistema para elegir sus preguntas secretas, " + _
0347 "que servirn para recuperar la contrasea al momento de olvidarla."
0348 Case 2
0349 'Mensaje cambio de contrasea
0350 vrLMsgMensaje.Body = "Sus credenciales para ingresar al SISTEMA.GT han " + _
0351 "cambiado. <br><br>" + "Su usuario es: <b>" + pVStrUsuario + "</b><br>" + _
0352 "La contrasea es: <b>" + pVStrClave + "</b>"
0353 Case Else
0354 vrLMsgMensaje.Body = ""
0355 End Select
0356
0357 Dim vrLSmtpCorreoSaliente As SmtpClient = New SmtpClient("smtp.gmail.com")
0358 vrLSmtpCorreoSaliente.Port = 587
0359 vrLSmtpCorreoSaliente.EnableSsl = True
0360 vrLSmtpCorreoSaliente.UseDefaultCredentials = False
0361 vrLSmtpCorreoSaliente.Credentials = New NetworkCredential("notificacion.sistema.gt" + _
0362 "@gmail.com", "notific@c1on")
0363
0364 Try
0365 'Enviar el mensaje
0366 vrLSmtpCorreoSaliente.Send(vrLMsgMensaje)
0367 Catch pVSmtpExExcepcion As SmtpFailedRecipientException
0368 pRHdnMensaje.Value = pVSmtpExExcepcion.Message
0369 Return False
217
Continuacin de la figura A-13.
218
Figura A-14. Cdigo de libFrmAyuda.1.0.js, cuyas subrutinas son
invocadas desde la pgina HTML
0001 /********************************************************************************************************/
0002 /* Archivo: libFrmAyuda.1.0.js */
0003 /* Descripcin: Librera con utilidades para la forma Ayuda. */
0004 /* Autor: Norma M. Chonay V. */
0005 /* Fecha de creacin: 24/04/2011 */
0006 /* Fecha de ltima modificacin: 24/04/2011 */
0007 /* Autor de ltima modificacin: Norma M. Chonay V. */
0008 /* Versin: 1.0 */
0009 /* Prerrequisitos: Ninguno */
0010 /********************************************************************************************************/
0011
0012 //Procedimiento que se ejecuta al cargar la pgina
0013 function pcPbLoad()
0014 { frmAyuda.btnCerrar.focus();
0015
0016 pcPbEscribirDescripcion();
0017 }
0018
0019 //Procedimiento que cierra la pgina
0020 function pcPbCerrar()
0021 { window.close();
0022 }
0023
0024 //Dependiendo de la pgina que lo invoque se muestra la ayuda
0025 function pcPbEscribirDescripcion()
0026 { //obtener la parte query del URL ?NomPadre=pVStrNomPadre
0027 //&NomOpcion=pVStrNomOpcion&NomModalidad=pVStrNomModalidad
0028 var vrLStrQueryURL = window.location.search.substr(1);
0029 var vrLStrNomPadre = '';
0030 var vrLStrNomOpcion = '';
0031 var vrLStrNomModalidad = '';
0032 var vrLVQuery;
0033 var vrLStrOpcion = '';
0034
0035 if (vrLStrQueryURL != '')
0036 { vrLVQuery = vrLStrQueryURL.split('&', 3);
0037 for (var i = 0; i < vrLVQuery.length; i++)
0038 { if (vrLVQuery[i] != '')
0039 { vrLStrOpcion = vrLVQuery[i].split('=', 2);
0040 switch (vrLStrOpcion[0])
0041 { case 'NomPadre':
0042 vrLStrNomPadre = vrLStrOpcion[1];
0043 break;
0044 case 'NomOpcion':
0045 vrLStrNomOpcion = vrLStrOpcion[1];
0046 break;
0047 case 'NomModalidad':
0048 vrLStrNomModalidad = vrLStrOpcion[1];
0049 break;
0050 }
0051 }
219
Continuacin de la figura A-14.
0052 }
0053 }
0054
0055 //Personalizar la ayuda
0056 switch (vrLStrNomPadre)
0057 { case "frmInicio":
0058 document.title = "Ayuda Login";
0059 frmAyuda.txtBxDescripcion.value = "Formulario de ingreso: \r\n" +
0060 "--> Ingrese su usuario y contrasea. No deben contener ms de 10 " +
0061 "carcteres; solamente se aceptan nmeros, letras y los carcteres - " +
0062 "_ \r\n\r\n" +
0063 "--> En la contrasea se hace distincin entre maysculas y minsculas. " +
0064 "\r\n\r\n" +
0065 "--> Los botones tienen acceso directo: Alt + la primera letra de la leyenda del " +
0066 "botn.";
0067 break;
0068 case "frmDatosUsuario":
0069 document.title = "Ayuda Datos Usuario";
0070 switch (vrLStrNomOpcion)
0071 { case "AGREGANDO ...":
0072 frmAyuda.txtBxDescripcion.value = "Agregar usuarios: \r\n" +
0073 "--> El usuario no debe contener ms de 10 carcteres; solamente se " +
0074 "aceptan nmeros, letras y los carcteres - _ \r\n\r\n" +
0075 "--> Para los nombres y apellidos, solamente se aceptan letras y espacios " +
0076 "en blanco. \r\n\r\n" +
0077 "--> Para el E-mail, se aceptan nmeros, letras y los carcteres @ . _ " +
0078 "\r\n\r\n" +
0079 "--> Las credenciales de acceso se envan al correo indicado.\r\n\r\n" +
0080 "--> Los botones tienen acceso directo: Alt + la primera letra de la " +
0081 "leyenda del botn.";
0082 break;
0083 case "EDITANDO ...":
0084 frmAyuda.txtBxDescripcion.value = "Formulario de datos: \r\n" +
0085 "--> El usuario y contrasea, no deben contener ms de 10 carcteres; " +
0086 "solamente se aceptan nmeros, letras y los carcteres - _ \r\n\r\n" +
0087 "--> En la contrasea se hace distincin entre maysculas y minsculas. " +
0088 "\r\n\r\n" +
0089 "--> Para los nombres y apellidos, solamente se aceptan letras y espacios " +
0090 "en blanco. \r\n\r\n" +
0091 "--> Para el E-mail, se aceptan nmeros, letras y los carcteres @ . _ " +
0092 "\r\n\r\n" +
0093 "--> Debe seleccionar al menos una pregunta secreta. \r\n\r\n" +
0094 "--> Cada respuesta no debe contener ms de 100 carcteres; solamente " +
0095 "se aceptan nmeros, letras, espacios en blanco y los carcteres - _ " +
0096 "\r\n\r\n" +
0097 "--> Si no desea modificar la contrasea, deje en blanco los campos " +
0098 "<<Contrasea anterior>>, <<Nueva contrasea>> y <<Confirmar " +
0099 "contrasea>>. \r\n\r\n" +
0100 "--> Los botones tienen acceso directo: Alt + la primera letra de la " +
0101 "leyenda del botn.";
0102 break;
0103 case "ELIMINANDO ...":
0104 frmAyuda.txtBxDescripcion.value = "Eliminar usuarios: \r\n" +
220
Continuacin de la figura A-14.
0105 "--> Primero debe ingresar el ID del usuario, luego presionar el botn " +
0106 "BUSCAR, para visualizar los datos del usuario a eliminar. \r\n\r\n" +
0107 "--> Despus de verificar que el usuario es el que se desea eliminar, " +
0108 "presionar el botn ACEPTAR; se pedir una confirmacin antes de " +
0109 "eliminar el usuario permanentemente. \r\n\r\n" +
0110 "--> Los botones tienen acceso directo: Alt + la primera letra de la " +
0111 "leyenda del botn.";
0112 break;
0113 case "REINICIANDO ...":
0114 frmAyuda.txtBxDescripcion.value = "Reinicio de contraseas de usuarios: \r\n" +
0115 "--> Primero debe ingresar el ID del usuario, luego presionar el botn " +
0116 "BUSCAR, para visualizar los datos del usuario a quien se le " +
0117 "reiniciar la contrasea. \r\n\r\n" +
0118 "--> Despus de verificar que el usuario es el que busca, presionar el " +
0119 "botn ACEPTAR; se pedir una confirmacin antes de cambiar la " +
0120 "contrasea. \r\n\r\n" +
0121 "--> Las credenciales de acceso se envan al correo indicado.\r\n\r\n" +
0122 "--> Los botones tienen acceso directo: Alt + la primera letra de la " +
0123 "leyenda del botn.";
0124 break;
0125 case "":
0126 frmAyuda.txtBxDescripcion.value = "Datos de usuario: \r\n";
0127 //Si es el usuario administrador
0128 if (vrLStrNomModalidad == "ADMIN")
0129 { frmAyuda.txtBxDescripcion.value = frmAyuda.txtBxDescripcion.value +
0130 "--> Para reiniciarle contrasea a un usuario, presione el cono de " +
0131 "CONTRASEA. \r\n\r\n" +
0132 "--> Para consultar datos de usuarios, presione el cono de INFORME. " +
0133 "\r\n\r\n" +
0134 "--> Para eliminar usuarios, presione el cono de ELIMINAR. \r\n\r\n" +
0135 "--> Para agregar usuarios, presione el cono de AGREGAR. \r\n\r\n";
0136 }
0137 frmAyuda.txtBxDescripcion.value = frmAyuda.txtBxDescripcion.value +
0138 "--> Para modificar sus propios datos, presione el cono de EDITAR.";
0139 break;
0140 default:
0141 frmAyuda.txtBxDescripcion.value = "";
0142 break;
0143 }
0144 break;
0145 case "frmRecuperacionClave":
0146 document.title = "Ayuda Recuperacin de Clave";
0147 frmAyuda.txtBxDescripcion.value = "Recuperacin de clave: \r\n" +
0148 "--> El usuario y el E-mail deben coincidir con los registrados en el sistema. " +
0149 "La nueva contrasea se enviar a la direccin de correo electrnica " +
0150 "registrada. \r\n\r\n" +
0151 "--> El usuario no debe contener ms de 10 carcteres; solamente se aceptan " +
0152 "nmeros, letras y los carcteres - _ \r\n\r\n" +
0153 "--> Para el E-mail, se aceptan nmeros, letras y los carcteres @ . _ \r\n\r\n" +
0154 "--> Primero debe validar los datos, y luego se mostrar alguna de las " +
0155 "preguntas secretas que haya registrado, para que indique la respuesta. " +
0156 "\r\n\r\n" +
0157 "--> Los botones tienen acceso directo: Alt + la primera letra de la leyenda " +
221
Continuacin de la figura A-14.
222
Figura A-16. Ayuda en lnea, cuando inicia sesin cualquier usuario que
no sea ADMIN
223
Continuacin de la figura A-17.
0015
0016 <html xmlns="http://www.w3.org/1999/xhtml" >
0017 <head>
0018 <title></title>
0019 <link href="../HojasEstilo/cssGeneral.css" rel="stylesheet" type="text/css" />
0020 <script type ="text/javascript" language="jscript" src="../Librerias/libFrmAyuda.1.0.js">
0021 </script>
0022 </head>
0023 <body onload="pcPbLoad();">
0024 <form id="frmAyuda" action="">
0025 <table style="width:100%">
0026 <tr>
0027 <td rowspan="3" class="clsImagen"></td>
0028 <td align="justify" style="width:75%; height:20%">
0029 <div class="clsTextoAyuda">RECUPERAR CONTRASEA (Metodologa Extilo
0030 Regular 9002)</div>
0031 <br />
0032 <div class="clsTextoAyuda">Versin 1.0</div>
0033 <br />
0034 <div class="clsTextoAyuda">Copyright</div>
0035 <br />
0036 <div class="clsTextoAyuda">Elaborado por Norma M. Chonay V.</div>
0037 <br />
0038 </td>
0039 </tr>
0040 <tr>
0041 <td colspan="2" style="width:75%; height:70%">
0042 <textarea id="txtADescripcion" cols="20" name="txtBxDescripcion" rows="8"
0043 style="width:90%; height:90%; background-color:#F8F8F8" class="clsTextoAyuda">
0044 </textarea></td>
0045 </tr>
0046 <tr>
0047 <td colspan="2" style="width:75%; height:10%" align="right">
0048 <input id="btnCerrar" type="button" value="CERRAR" accesskey="C" class="clsBoton"
0049 onclick="pcPbCerrar();"/>
0050  
0051 </td>
0052 </tr>
0053 </table>
0054 </form>
0055 </body>
0056 </html>
224
Figura A-18. Diseo del formulario de inicio de sesin
225
Figura A-19. Cdigo de frmInicio.aspx
226
Continuacin de la figura A-19.
227
Continuacin de la figura A-19.
0107 </asp:TableCell>
0108 <asp:TableCell Width="5%"></asp:TableCell>
0109 </asp:TableRow>
0110 </asp:Table>
0111 <br />
0112 <br />
0113 </fieldset >
0114 </div>
0115 <asp:HiddenField ID="hdnMsjError" runat="server"/>
0116 <asp:HiddenField ID="hdnId" runat="server"/>
0117 <asp:HiddenField ID="hdnUsuario" runat="server"/>
0118 <asp:HiddenField ID="hdnClave" runat="server"/>
0119 <asp:HiddenField ID="hdnNombres" runat="server"/>
0120 <asp:HiddenField ID="hdnApellidos" runat="server"/>
0121 <asp:HiddenField ID="hdnEmail" runat="server"/>
0122 </form>
0123 </body>
0124 </html>
0001 /********************************************************************************************************/
0002 /* Archivo: frmInicio.aspx.vb */
0003 /* Descripcin: Forma para ingresar credenciales de acceso. */
0004 /* Autor: Norma M. Chonay V. */
0005 /* Fecha de creacin: 21/04/2011 */
0006 /* Fecha de ltima modificacin: 21/04/2011 */
0007 /* Autor de ltima modificacin: Norma M. Chonay V. */
0008 /* Versin: 1.1 */
0009 /* Prerrequisitos: Ninguno */
0010 /********************************************************************************************************/
0011
0012 Imports System.Web.UI.WebControls
0013 Imports Oracle.DataAccess.Client
0014 Imports Oracle.DataAccess.Types
0015
0016 Partial Public Class frmInicio
0017 Inherits System.Web.UI.Page
0018
0019 'Instanciar la librera de utilidades
0020 Public modHerr As New modHerramientas
0021
0022 'Procedimiento Load
0023 Protected Sub pcPrLoad(ByVal pVObjTipoObjeto As Object, _
0024 ByVal pVEvtEvento As System.EventArgs) Handles Me.Load
0025 If IsPostBack Then
228
Continuacin de la figura A-20.
229
Continuacin de la figura A-20.
230
Continuacin de la figura A-20.
0132
0133 'Devuelve el nombre del usuario
0134 Public ReadOnly Property fPbDevolverUsuario() As String
0135 Get
0136 Return hdnUsuario.Value
0137 End Get
0138 End Property
0139
0140 'Devuelve la clave cifrada del usuario
0141 Public ReadOnly Property fPbDevolverClave() As String
0142 Get
0143 Return hdnClave.Value
0144 End Get
0145 End Property
0146
0147 'Devuelve los nombres del usuario
0148 Public ReadOnly Property fPbDevolverNombres() As String
0149 Get
0150 Return hdnNombres.Value
0151 End Get
0152 End Property
0153
0154 'Devuelve los apellidos del usuario
0155 Public ReadOnly Property fPbDevolverApellidos() As String
0156 Get
0157 Return hdnApellidos.Value
0158 End Get
0159 End Property
0160
0161 'Devuelve el E-mail del usuario
0162 Public ReadOnly Property fPbDevolverEmail() As String
0163 Get
0164 Return hdnEmail.Value
0165 End Get
0166 End Property
0167 End Class
Una vez ingresadas las credenciales vlidas, se muestra la pgina con los
datos del usuario que inici sesin, pgina que vara dependiendo si es el
usuario ADMIN o si es otro usuario. Las figuras que siguen, muestran el diseo
de la pgina y el cdigo de frmDatosUsuario.
231
Figura A-21. Opciones de cualquier usuario que no es ADMIN
232
El cdigo de las siguientes figuras implementa las opciones para editar
datos de usuarios, agregar y eliminar usuarios, reiniciarle contrasea a
determinado usuario e invocar al reporte.
233
Continuacin de la figura A-23.
0046 Width="20px">
0047 </asp:Label>
0048 <asp:Label ID="lblEspacio" runat="server" Text="" CssClass="clsEtqOpcion"
0049 Width="360px">
0050 </asp:Label>
0051 <asp:ImageButton ImageUrl="~/Img/imgClave" style="width: 43px; height: 40px;
0052 margin-right: 0px;" ToolTip="Reiniciar clave" id="imgClave" visible="false"
0053 runat="server"/>
0054 <asp:ImageButton ImageUrl="~/Img/imgReporte.gif" style="width: 43px;
0055 height: 40px; margin-right: 0px;" ToolTip="Informe" id="imgInforme"
0056 visible="false" runat="server"/>
0057 <asp:ImageButton ImageUrl="~/Img/imgQuitar.png" style="width: 43px;
0058 height: 40px; margin-right: 0px;" ToolTip="Eliminar usuario" id="imgQuitar"
0059 visible="false" runat="server"/>
0060 <asp:ImageButton ImageUrl="~/Img/imgAgregar.png" style="width: 43px;
0061 height: 40px; margin-right: 0px;" ToolTip="Agregar usuario" id="imgAgregar"
0062 visible="false" runat="server"/>
0063 <asp:ImageButton ImageUrl="~/Img/imgEditar.png" style="width: 43px;
0064 height: 40px; margin-right: 0px;" ToolTip="Editar datos" id="imgEditar"
0065 runat="server" />
0066 <img src="../Img/imgAyuda.gif" style="width: 43px; height: 40px;
0067 margin-right: 0px;" alt="Ayuda" id="imgAyuda"
0068 onclick="pcPrAyudaLogin(document.forms[0].name,
0069 document.all['lblOpcion'].innerText, frmDatosUsuario['hdnUsuario'].value)" />
0070 </legend>
0071 <br />
0072 <asp:Table ID="tblPrincipal" runat="server" style="margin-top: 0px" Width="700px">
0073 <asp:TableRow >
0074 <asp:TableCell Width="15%">
0075 <asp:Label ID="lblId" runat="server" Text="ID:"
0076 CssClass="clsEtiqueta">
0077 </asp:Label>
0078 </asp:TableCell>
0079 <asp:TableCell Width="10%">
0080 <asp:TextBox ID="txtId" runat="server" CssClass="clsTexto" Width="98%"
0081 MaxLength="10" TabIndex="1"
0082 onkeypress="pcPbValidarCaracteres(event,
0083 frmDatosUsuario['btnAceptar'], 4);">
0084 </asp:TextBox>
0085 </asp:TableCell>
0086 <asp:TableCell Width="10%"></asp:TableCell>
0087 <asp:TableCell Width="15%"></asp:TableCell>
0088 <asp:TableCell Width="15%"></asp:TableCell>
0089 <asp:TableCell Width="35%"></asp:TableCell>
0090 </asp:TableRow>
0091 <asp:TableRow >
0092 <asp:TableCell Width="15%">
0093 <asp:Label ID="lblUsuario" runat="server" Text="Usuario:"
0094 CssClass="clsEtiqueta">
0095 </asp:Label>
0096 </asp:TableCell>
0097 <asp:TableCell ColumnSpan="2">
0098 <asp:TextBox ID="txtUsuario" runat="server" CssClass="clsTexto"
234
Continuacin de la figura A-23.
235
Continuacin de la figura A-23.
236
Continuacin de la figura A-23.
0205 </td>
0206 <td colspan="1"></td>
0207 <td colspan="1">
0208 <input id="chkPregunta4" type="checkbox" runat="server"
0209 tabindex="12" onkeypress="pcPbValidarCaracteres(event,
0210 frmDatosUsuario['txtRespuesta4'], 6);"/>
0211 </td>
0212 <td colspan="1">
0213 <div id="divPregunta4" class="clsEtqPregunta"
0214 runat="server">Pregunta 4</div>
0215 </td>
0216 </tr>
0217 <tr>
0218 <td colspan="2">
0219 <input id="txtRespuesta3" type="text" runat="server"
0220 class="clsEtqRespuesta" style="width:95%" maxlength="100"
0221 tabindex="11" onkeypress="pcPbValidarCaracteres(event,
0222 frmDatosUsuario['chkPregunta4'], 5);"/>
0223 </td>
0224 <td colspan="1"></td>
0225 <td colspan="2">
0226 <input id="txtRespuesta4" type="text" runat="server"
0227 class="clsEtqRespuesta" style="width:95%" maxlength="100"
0228 tabindex="13" onkeypress="pcPbValidarCaracteres(event,
0229 frmDatosUsuario['chkPregunta5'], 5);"/>
0230 </td>
0231 </tr>
0232 <tr>
0233 <td colspan="1">
0234 <input id="chkPregunta5" type="checkbox" runat="server"
0235 tabindex="14" onkeypress="pcPbValidarCaracteres(event,
0236 frmDatosUsuario['txtRespuesta5'], 6);"/>
0237 </td>
0238 <td colspan="4">
0239 <div id="divPregunta5" class="clsEtqPregunta"
0240 runat="server">Pregunta 5</div>
0241 </td>
0242 </tr>
0243 <tr>
0244 <td colspan="2">
0245 <input id="txtRespuesta5" type="text" runat="server"
0246 class="clsEtqRespuesta" style="width:95%" maxlength="100"
0247 tabindex="15" onkeypress="pcPbValidarCaracteres(event,
0248 frmDatosUsuario['pwClave'], 5);"/>
0249 </td>
0250 <td colspan="1"></td>
0251 <td colspan="2"></td>
0252 </tr>
0253 </table>
0254 </asp:TableCell>
0255 </asp:TableRow>
237
Continuacin de la figura A-23.
238
Continuacin de la figura A-23.
0001 /********************************************************************************************************/
0002 /* Archivo: frmDatosUsuario.aspx.vb */
0003 /* Descripcin: Forma para consultar datos y modificarlos. */
0004 /* Autor: Norma M. Chonay V. */
0005 /* Fecha de creacin: 26/04/2011 */
0006 /* Fecha de ltima modificacin: 26/04/2011 */
0007 /* Autor de ltima modificacin: Norma M. Chonay V. */
0008 /* Versin: 1.1 */
0009 /* Prerrequisitos: Ninguno */
0010 /********************************************************************************************************/
0011
0012 Imports System.Web.UI.WebControls
0013 Imports Oracle.DataAccess.Client
0014 Imports Oracle.DataAccess.Types
239
Continuacin de la figura A-24.
0015
0016 Partial Public Class frmDatosUsuario
0017 Inherits System.Web.UI.Page
0018
0019 'Instanciar la librera de utilidades
0020 Public modHerr As New modHerramientas
0021
0022 'Procedimiento Load
0023 Protected Sub pcPrLoad(ByVal pVObjTipoObjeto As Object, _
0024 ByVal pVEvtEvento As System.EventArgs) Handles Me.Load
0025 Try
0026 If IsPostBack Then
0027 'Script para mostrar los mensajes
0028 If (Not ClientScript.IsStartupScriptRegistered(Me.GetType(), "alert")) Then
0029 Dim vrLStrScript As New StringBuilder()
0030 vrLStrScript.Append("<script language='javascript' type='text/javascript'>")
0031 vrLStrScript.Append(" if (frmDatosUsuario.hdnMsjError.value != '')")
0032 vrLStrScript.Append(" { alert(frmDatosUsuario.hdnMsjError.value);")
0033 vrLStrScript.Append(" }")
0034 vrLStrScript.Append(" frmDatosUsuario.hdnMsjError.value = '';")
0035 vrLStrScript.Append(" if (frmDatosUsuario['txtId'].disabled == false)")
0036 vrLStrScript.Append(" { frmDatosUsuario['txtId'].focus();")
0037 vrLStrScript.Append(" }")
0038 vrLStrScript.Append(" else")
0039 vrLStrScript.Append(" {")
0040 vrLStrScript.Append(" if (frmDatosUsuario['txtUsuario'].disabled == false)")
0041 vrLStrScript.Append(" { frmDatosUsuario['txtUsuario'].focus();")
0042 vrLStrScript.Append(" }")
0043 vrLStrScript.Append(" else")
0044 vrLStrScript.Append(" { if (frmDatosUsuario['txtNombres'].disabled " + _
0045 "== false)")
0046 vrLStrScript.Append(" { frmDatosUsuario['txtNombres'].focus();")
0047 vrLStrScript.Append(" }")
0048 vrLStrScript.Append(" else")
0049 vrLStrScript.Append(" { if (frmDatosUsuario['btnCancelar'].disabled " + _
0050 "== false)")
0051 vrLStrScript.Append(" { frmDatosUsuario['btnCancelar'].focus();")
0052 vrLStrScript.Append(" }")
0053 vrLStrScript.Append(" }")
0054 vrLStrScript.Append(" }")
0055 vrLStrScript.Append(" }")
0056 vrLStrScript.Append(" if (frmDatosUsuario.hdnRedireccionar.value == '1') " + _
0057 "{frmDatosUsuario.hdnRedireccionar.value = '0'; window.location.href " + _
0058 "= 'http://localhost/RecuperarContrasea/modSeguridad/frmInicio.aspx';}")
0059 vrLStrScript.Append(" </script>")
0060 ClientScript.RegisterStartupScript(Me.GetType(), "alert", vrLStrScript.ToString())
0061 End If
0062 End If
0063
0064 If Not IsPostBack Then
0065 'Obtener los datos del usuario
0066 Dim vrLfrmLogin As frmInicio
0067 vrLfrmLogin = CType(Context.Handler, frmInicio)
240
Continuacin de la figura A-24.
241
Continuacin de la figura A-24.
242
Continuacin de la figura A-24.
0174 pcPrDeshabilitarControles(False)
0175 pcPrDeshabilitarBotones(False)
0176 End Sub
0177
0178 'Limpiar los controles, para ingresar nuevos usuarios
0179 Private Sub pcPrInicializarDatos()
0180 'Limpiar los datos de los controles
0181 txtId.Text = ""
0182 txtUsuario.Text = ""
0183 txtNombres.Text = ""
0184 txtApellidos.Text = ""
0185 txtEmail.Text = ""
0186 pwClave.Value = ""
0187 pwClaveNueva.Value = ""
0188 pwConfClave.Value = ""
0189 End Sub
0190
0191 'Inicializar los datos de los controles
0192 Private Sub pcPrCancelar(ByVal pVBolMostrarDatos As Boolean)
0193 'Indica que no se debe redireccionar a la pgina principal
0194 hdnRedireccionar.Value = "0"
0195
0196 If lblOpcion.Text = "" Then
0197 Response.Redirect("/RecuperarContrasea/modSeguridad/frmInicio.aspx")
0198 Else
0199 lblOpcion.Text = ""
0200
0201 If (pVBolMostrarDatos = True) Then
0202 'Mostrar los datos del usuario
0203 pcPrMostrarDatos()
0204 End If
0205 End If
0206 End Sub
0207
0208 'Se validan y almacenan los datos ingresados en la opcin AGREGAR
0209 Private Sub pcPrGuardar()
0210 Try
0211 'Quitar espacios
0212 txtNombres.Text = txtNombres.Text.ToUpper().Trim()
0213 txtApellidos.Text = txtApellidos.Text.ToUpper().Trim()
0214 txtUsuario.Text = txtUsuario.Text.ToUpper().Trim()
0215 txtEmail.Text = txtEmail.Text.ToUpper().Trim()
0216
0217 'Validar que no estn vacos
0218 If (txtUsuario.Text <> "" And _
0219 txtNombres.Text <> "" And txtApellidos.Text <> "" And _
0220 txtEmail.Text <> "") Then
0221 'Validar la direccin de correo electrnico
0222 If (modHerr.fPbBolValidarEmail(txtEmail.Text) = True) Then
0223 'Generar la clave
0224 Dim vrLsIntResultado As Int16 = 0
0225 Dim vrLvNuevaClave(1) As Object
0226 vrLvNuevaClave = modHerr.fPbVGenerarClave(txtUsuario.Text)
243
Continuacin de la figura A-24.
244
Continuacin de la figura A-24.
245
Continuacin de la figura A-24.
246
Continuacin de la figura A-24.
247
Continuacin de la figura A-24.
248
Continuacin de la figura A-24.
249
Continuacin de la figura A-24.
250
Continuacin de la figura A-24.
251
Continuacin de la figura A-24.
252
Continuacin de la figura A-24.
253
Continuacin de la figura A-24.
254
Continuacin de la figura A-24.
0810
0811 'Al dar clic en la imagen ELIMINAR, se habilitan los controles
0812 Private Sub pcPrClicEliminar(ByVal pVObjTipoObjeto As Object, _
0813 ByVal pVEvtEvento As System.Web.UI.ImageClickEventArgs) Handles imgQuitar.Click
0814 'Indicarle al usuario que primero debe ingresar el ID del usuario a eliminar
0815 pcPrParaBuscarDatosUsuario("ELIMINANDO ...", "INGRESE EL ID DEL USUARIO " + _
0816 "A ELIMINAR")
0817 End Sub
0818
0819 'Al dar clic en la imagen EDITAR, se habilitan los controles
0820 Private Sub pcPrClicEditar(ByVal pVObjTipoObjeto As Object, _
0821 ByVal pVEvtEvento As System.Web.UI.ImageClickEventArgs) Handles imgEditar.Click
0822 'Si se est en alguna opcin
0823 If (lblOpcion.Text <> "") Then
0824 pcPrCancelar(True)
0825 End If
0826
0827 lblOpcion.Text = "EDITANDO ..."
0828
0829 'Habilitar los controles
0830 pcPrDeshabilitarControles(True)
0831 pcPrDeshabilitarBotones(True)
0832 'Si es el usuario administrador
0833 If (hdnUsuario.Value = "ADMIN") Then
0834 txtNombres.Focus()
0835 Else
0836 txtUsuario.Focus()
0837 End If
0838 End Sub
0839
0840 'Al dar clic en la imagen AGREGAR, se habilitan los controles
0841 Private Sub pcPrClicAgregar(ByVal pVObjTipoObjeto As Object, _
0842 ByVal pVEvtEvento As System.Web.UI.ImageClickEventArgs) _
0843 Handles imgAgregar.Click
0844 'Si se est en alguna opcin
0845 If (lblOpcion.Text <> "") Then
0846 pcPrCancelar(False)
0847 End If
0848
0849 lblOpcion.Text = "AGREGANDO ..."
0850
0851 'Habilitar los controles
0852 pcPrDeshabilitarControles(True)
0853 pcPrDeshabilitarBotones(True)
0854 tblClave.Visible = False
0855 tblPreguntas.Visible = False
0856
0857 'Limpiar los controles
0858 pcPrInicializarDatos()
0859 txtUsuario.Focus()
0860 End Sub
0861
0862 'Se validan los datos ingresados
255
Continuacin de la figura A-24.
256
Figura A-25. Opcin EDITAR de cualquier usuario que no es ADMIN
257
Figura A-26. Opcin EDITAR del usuario ADMIN
258
Figura A-27. Opcin AGREGAR del usuario ADMIN
259
Figura A-29. Opcin REINICIAR CONTRASEA del usuario ADMIN
260
Figura A-30. Informe
261
Continuacin de la figura A-31.
262
Continuacin de la figura A-31.
263
Figura A-32. Cdigo de repUsuarios.aspx.vb
0001 /********************************************************************************************************/
0002 /* Archivo: repUsuarios.aspx.vb */
0003 /* Descripcin: Forma para mostrar el reporte. */
0004 /* Autor: Norma M. Chonay V. */
0005 /* Fecha de creacin: 03/05/2011 */
0006 /* Fecha de ltima modificacin: 03/05/2011 */
0007 /* Autor de ltima modificacin: Norma M. Chonay V. */
0008 /* Versin: 1.1 */
0009 /* Prerrequisitos: Ninguno */
0010 /********************************************************************************************************/
0011
0012 Imports System.Web.UI.WebControls
0013 Imports Oracle.DataAccess.Client
0014 Imports Oracle.DataAccess.Types
0015
0016 Partial Public Class frmInforme
0017 Inherits System.Web.UI.Page
0018
0019 'Instanciar la librera de utilidades
0020 Public modHerr As New modHerramientas
0021
0022 'Procedimiento Load
0023 Protected Sub pcPrLoad(ByVal pVObjTipoObjeto As Object, _
0024 ByVal pVEvtEvento As System.EventArgs) Handles Me.Load
0025 Try
0026 If IsPostBack Then
0027 'Script para mostrar los mensajes
0028 If (Not ClientScript.IsStartupScriptRegistered(Me.GetType(), "alert")) Then
0029 Dim vrLStrScript As New StringBuilder()
0030 vrLStrScript.Append("<script language='javascript' type='text/javascript'>")
0031 vrLStrScript.Append(" if (frmInforme.hdnMsjError.value != '') " + _
0032 "{alert(frmInforme.hdnMsjError.value);}")
0033 vrLStrScript.Append(" frmInforme.hdnMsjError.value = '';")
0034 vrLStrScript.Append(" frmInforme['btnCancelar'].focus();")
0035 vrLStrScript.Append(" </script>")
0036 ClientScript.RegisterStartupScript(Me.GetType(), "alert", vrLStrScript.ToString())
0037 End If
0038 End If
0039
0040 If Not IsPostBack Then
0041 'Obtener el ttulo del reporte
0042 Dim vrLfrmDatosUsuario As frmDatosUsuario
0043 vrLfrmDatosUsuario = CType(Context.Handler, frmDatosUsuario)
0044 lblTitulo.Text = vrLfrmDatosUsuario.fPbDevolverTituloReporte
0045 End If
0046
0047 'Mostrar la fecha
0048 lblFecha.Text = DateTime.Now.ToString()
0049
0050 'Conectarse a Oracle
0051 Dim vrLOcleConexion As OracleConnection
0052 vrLOcleConexion = modHerr.fPbOcleConectar()
0053
264
Continuacin de la figura A-32.
265
En el formulario frmInicio, al presionar el botn btnCambiarClave, se llama
a frmRecuperacionClave, pgina que permite recuperar la clave, indicando el
usuario, correo electrnico y la respuesta de alguna pregunta secreta, datos
que aseguran de cierta forma que el usuario solicitante es quien dice ser, como
se muestra en la siguiente figura.
266
Figura A-34. Cdigo de frmRecuperacionClave.aspx
267
Continuacin de la figura A-34.
0054 </asp:TableRow>
0055 <asp:TableRow >
0056 <asp:TableCell Width="25%">
0057 <asp:Label ID="lblEmail" runat="server" Text="E-mail registrado:"
0058 CssClass="clsEtiqueta">
0059 </asp:Label>
0060 </asp:TableCell>
0061 <asp:TableCell ColumnSpan="4">
0062 <asp:TextBox ID="txtEmail" runat="server" CssClass="clsTexto"
0063 Width="97%" MaxLength="50" TabIndex="2"
0064 onkeypress="pcPbValidarCaracteres(event,
0065 frmRecuperacionClave['btnValidar'], 3)"></asp:TextBox>
0066 </asp:TableCell>
0067 <asp:TableCell Width="20%">
0068 <asp:Button ID="btnValidar" runat="server" Text="VALIDAR" AccessKey="V"
0069 CssClass="clsBoton" TabIndex="3"/>
0070 </asp:TableCell>
0071 </asp:TableRow>
0072 <asp:TableRow >
0073 <asp:TableCell ColumnSpan="6">
0074 <asp:Label ID="lblPregunta" runat="server" Text="Pregunta secreta:"
0075 CssClass="clsEtiqueta">
0076 </asp:Label>
0077 </asp:TableCell>
0078 </asp:TableRow>
0079 <asp:TableRow >
0080 <asp:TableCell Width="25%"></asp:TableCell>
0081 <asp:TableCell ColumnSpan="5">
0082 <asp:TextBox ID="txtRespuesta" runat="server" CssClass="clsEtqRespuesta"
0083 Width="95%" MaxLength="100" TabIndex="4"
0084 onkeypress="pcPbValidarCaracteres(event,
0085 frmRecuperacionClave['btnAceptar'], 5)"></asp:TextBox>
0086 </asp:TableCell>
0087 </asp:TableRow>
0088 <asp:TableRow >
0089 <asp:TableCell >
0090 <div style="height:15px"></div>
0091 </asp:TableCell>
0092 </asp:TableRow>
0093 <asp:TableRow >
0094 <asp:TableCell ColumnSpan="6" HorizontalAlign="Center">
0095 <asp:Button ID="btnAceptar" runat="server" Text="ACEPTAR"
0096 AccessKey="A" CssClass="clsBoton" TabIndex="5" Enabled="false"/>
0097
0098 <asp:Button ID="btnCancelar" runat="server" Text="CANCELAR"
0099 AccessKey="C" CssClass="clsBoton" tabIndex="6"/>
0100 </asp:TableCell>
0101 </asp:TableRow>
0102 </asp:Table>
0103 </fieldset>
0104 </div>
0105 <asp:HiddenField ID="hdnMsjError" runat="server"/>
0106 <asp:HiddenField ID="hdnRespuesta" runat="server"/>
268
Continuacin de la figura A-34.
0001 /********************************************************************************************************/
0002 /* Archivo: frmRecuperacionClave.aspx.vb */
0003 /* Descripcin: Forma para cambiar la clave. */
0004 /* Autor: Norma M. Chonay V. */
0005 /* Fecha de creacin: 04/05/2011 */
0006 /* Fecha de ltima modificacin: 04/05/2011 */
0007 /* Autor de ltima modificacin: Norma M. Chonay V. */
0008 /* Versin: 1.1 */
0009 /* Prerrequisitos: Ninguno */
0010 /********************************************************************************************************/
0011
0012 Imports Oracle.DataAccess.Client
0013 Imports Oracle.DataAccess.Types
0014
0015 Partial Public Class frmRecuperacionClave
0016 Inherits System.Web.UI.Page
0017
0018 'Instanciar la librera de utilidades
0019 Public modHerr As New modHerramientas
0020
0021 'Procedimiento Load
0022 Protected Sub pcPrLoad(ByVal pVObjTipoObjeto As Object, _
0023 ByVal pVEvtEvento As System.EventArgs) Handles Me.Load
0024 If IsPostBack Then
0025 'Script para mostrar los mensajes
0026 If (Not ClientScript.IsStartupScriptRegistered(Me.GetType(), "alert")) Then
0027 Dim vrLStrScript As New StringBuilder()
0028 vrLStrScript.Append("<script language='javascript' type='text/javascript'>")
0029 vrLStrScript.Append(" if (frmRecuperacionClave.hdnMsjError.value != '') " + _
0030 "{alert(frmRecuperacionClave.hdnMsjError.value);}")
0031 vrLStrScript.Append(" frmRecuperacionClave.hdnMsjError.value = '';")
0032 vrLStrScript.Append(" frmRecuperacionClave['txtUsuario'].focus();")
0033 vrLStrScript.Append(" if (frmRecuperacionClave.hdnRedireccionar.value == '1') " + _
0034 "{frmRecuperacionClave.hdnRedireccionar.value = '0'; window.location.href " + _
0035 "= 'http://localhost/RecuperarContrasea/modSeguridad/frmInicio.aspx';}")
0036 vrLStrScript.Append(" </script>")
0037 ClientScript.RegisterStartupScript(Me.GetType(), "alert", vrLStrScript.ToString())
0038 End If
0039 End If
269
Continuacin de la figura A-35.
0040 txtUsuario.Focus()
0041 End Sub
0042
0043 '/**********************************************************************************************/
0044 '/**************************** EVENTOS DE LOS CONTROLES *************************/
0045 '/**********************************************************************************************/
0046
0047 'Si se presiona el botn VALIDAR, se validan los datos ingresados y se muestra
0048 'una de las preguntas secretas registradas para el usuario
0049 Private Sub pcPrClicValidar(ByVal pVObjTipoObjeto As Object, _
0050 ByVal pVEvtEvento As System.EventArgs) Handles btnValidar.Click
0051 Try
0052 'Validar que no estn vacos los controles
0053 If (txtUsuario.Text <> "" And txtEmail.Text <> "") Then
0054 'Validar la direccin de correo electrnico
0055 If (modHerr.fPbBolValidarEmail(txtEmail.Text) = True) Then
0056 Dim vrLTblDatos As DataTable = New DataTable()
0057 Dim vrLsIntResultado As Int16 = 0
0058
0059 'Conectarse a Oracle
0060 Dim vrLOcleConexion As OracleConnection
0061 vrLOcleConexion = modHerr.fPbOcleConectar()
0062
0063 'Consultar en la BDD si el usuario y el email coinciden
0064 vrLTblDatos = modHerr.fPbTblBuscarUsuario(-1, _
0065 txtUsuario.Text.ToUpper().Trim(), "", txtEmail.Text.ToUpper().Trim(), 0, _
0066 vrLOcleConexion, vrLsIntResultado, hdnMsjError)
0067
0068 Select Case vrLsIntResultado
0069 Case 0
0070 hdnMsjError.Value = "NO SE PUEDE RECUPERAR LA CLAVE, LA " + _
0071 "INFORMACIN INDICADA NO EST REGISTRADA EN EL SISTEMA"
0072 Case 1
0073 'Validar si la consulta devolvi datos
0074 If (vrLTblDatos.Rows.Count = 1) Then
0075 'Mostrar la pregunta secreta
0076 If (vrLTblDatos.Rows(0)("Pregunta").ToString() <> "") Then
0077 lblPregunta.Text = vrLTblDatos.Rows(0)("Pregunta").ToString()
0078 hdnRespuesta.Value = vrLTblDatos.Rows(0)("Respuesta").ToString()
0079 btnAceptar.Enabled = True
0080 txtRespuesta.Enabled = True
0081 txtRespuesta.Focus()
0082 Else
0083 hdnMsjError.Value = "NO SE PUEDE RECUPERAR LA CLAVE, EL " + _
0084 "USUARIO NO TIENE REGISTRADA NINGUNA PREGUNTA " + _
0085 "SECRETA"
0086 vrLOcleConexion.Close()
0087 End If
0088 Else
0089 hdnMsjError.Value = "LA INFORMACIN INDICADA, NO EST " + _
0090 "REGISTRADA EN EL SISTEMA"
0091 txtUsuario.Focus()
0092 End If
270
Continuacin de la figura A-35.
0093 Case 2
0094 hdnMsjError.Value = "LA OPCIN DE BSQUEDA INDICADA NO ES VLIDA"
0095 vrLOcleConexion.Close()
0096 Case 3
0097 hdnMsjError.Value = "HUBO UN ERROR EN LA BASE DE DATOS"
0098 vrLOcleConexion.Close()
0099 Case Else
0100 'Error que viene de la librera
0101 End Select
0102 vrLOcleConexion.Close()
0103 Else
0104 hdnMsjError.Value = "LA DIRECCIN DE CORREO ELECTRNICO NO ES " + _
0105 "VLIDA"
0106 txtEmail.Focus()
0107 End If
0108 Else
0109 hdnMsjError.Value = "TODOS LOS CAMPOS SON OBLIGATORIOS"
0110 txtUsuario.Focus()
0111 End If
0112 Catch pVExExcepcion As Exception
0113 hdnMsjError.Value = pVExExcepcion.ToString()
0114 txtUsuario.Focus()
0115 End Try
0116 End Sub
0117
0118 'Si se presiona el botn ACEPTAR, si los datos ingresados son vlidos
0119 'se reinicia la contrasea
0120 Private Sub pcPrClicAceptar(ByVal pVObjTipoObjeto As Object, _
0121 ByVal pVEvtEvento As System.EventArgs) Handles btnAceptar.Click
0122 Try
0123 txtRespuesta.Text = txtRespuesta.Text.Trim()
0124 txtUsuario.Text = txtUsuario.Text.ToUpper().Trim()
0125 txtEmail.Text = txtEmail.Text.ToUpper().Trim()
0126
0127 'Validar que no estn vacos
0128 If (txtUsuario.Text <> "" And txtEmail.Text <> "" And txtRespuesta.Text <> "") Then
0129 'Validar la direccin de correo electrnico
0130 If (modHerr.fPbBolValidarEmail(txtEmail.Text) = True) Then
0131 'Validar que la respuesta sea la que est registrada
0132 If (hdnRespuesta.Value = txtRespuesta.Text) Then
0133 Dim vrLTblDatos As DataTable = New DataTable()
0134 Dim vrLsIntResultado As Int16 = 0
0135 Dim vrLvNuevaClave(1) As Object
0136
0137 'Conectarse a Oracle
0138 Dim vrLOcleConexion As OracleConnection
0139 vrLOcleConexion = modHerr.fPbOcleConectar()
0140
0141 'Consultar en la BDD si el usuario y el email coinciden
0142 vrLTblDatos = modHerr.fPbTblBuscarUsuario(-1, txtUsuario.Text, _
0143 "", txtEmail.Text, 0, vrLOcleConexion, _
0144 vrLsIntResultado, hdnMsjError)
0145
271
Continuacin de la figura A-35.
272
Continuacin de la figura A-35.
0199 "CONTRASEA"
0200 End If
0201 Else
0202 hdnMsjError.Value = "LA INFORMACIN INDICADA, NO EST " + _
0203 "REGISTRADA EN EL SISTEMA"
0204 End If
0205 Case 2
0206 hdnMsjError.Value = "LA OPCIN DE BSQUEDA INDICADA NO ES " + _
0207 "VLIDA"
0208 Case 3
0209 hdnMsjError.Value = "HUBO UN ERROR EN LA BASE DE DATOS"
0210 Case Else
0211 'Error que viene de la librera
0212 End Select
0213
0214 vrLOcleConexion.Close()
0215 Else
0216 hdnMsjError.Value = "LA RESPUESTA NO ES VLIDA"
0217 txtRespuesta.Focus()
0218 End If
0219 Else
0220 hdnMsjError.Value = "LA DIRECCIN DE CORREO ELECTRNICO NO " + _
0221 "ES VLIDA"
0222 End If
0223 Else
0224 hdnMsjError.Value = "TODOS LOS CAMPOS SON OBLIGATORIOS"
0225 txtUsuario.Focus()
0226 End If
0227 Catch pVExExcepcion As Exception
0228 hdnMsjError.Value = pVExExcepcion.ToString()
0229 txtUsuario.Focus()
0230 End Try
0231 End Sub
0232
0233 'Si se presiona el botn CANCELAR, se limpia el texto ingresado en los controles
0234 Private Sub pcPrClicCancelar(ByVal pVObjTipoObjeto As Object, _
0235 ByVal pVEvtEvento As System.EventArgs) Handles btnCancelar.Click
0236 'Indica que no se debe redireccionar a la pgina principal
0237 hdnRedireccionar.Value = "0"
0238
0239 txtUsuario.Text = ""
0240 txtEmail.Text = ""
0241 txtRespuesta.Text = ""
0242 lblPregunta.Text = "Pregunta secreta:"
0243 btnAceptar.Enabled = False
0244 txtRespuesta.Enabled = False
0245 txtUsuario.Focus()
0246 End Sub
0247 End Class
273
En el siguiente apartado se muestra la implementacin del servicio web, el
cual es utilizado en frmDatosUsuario, por medio de la funcin nombrada
fPbTblBuscarPreguntas que est definida en libHerramientas.1.0.vb.
274
En el servicio web las credenciales de acceso a la base de datos tampoco
estn cifradas ni ocultas, pero se recomienda que en todo sistema estos datos
estn cifrados o bien almacenados en algn lugar de acceso restringido.
275
Figura A-38. Definicin y datos que retorna el servicio web
_-..TPreguntasSecretas, al ser invocado desde el
__ navegador web Internet Explorer 8.0
276
Figura A-39. Link para invocar al servicio web PreguntasSecretas desde
el navegador web Internet Explorer 8.0
0001 /********************************************************************************************************/
0002 /* Archivo: swPreguntasSecretas.asmx.vb */
0003 /* Descripcin: Servicio web para gestionar las preguntas */
0004 /* secretas. */
0005 /* Autor: Norma M. Chonay V. */
0006 /* Fecha de creacin: 21/04/2011 */
0007 /* Fecha de ltima modificacin: 21/04/2011 */
0008 /* Autor de ltima modificacin: Norma M. Chonay V. */
0009 /* Versin: 1.1 */
0010 /* Prerrequisitos: Ninguno */
0011 /********************************************************************************************************/
0012
0013 Imports Oracle.DataAccess.Client
0014 Imports Oracle.DataAccess.Types
0015
0016 Imports System.Web.Services
0017 Imports System.Web.Services.Protocols
0018 Imports System.ComponentModel
0019
0020 ' Para permitir que se llame a este servicio web desde un script, usando ASP.NET AJAX,
0021 'quite la marca de comentario de la siguiente lnea.
0022 ' <System.Web.Script.Services.ScriptService()> _
0023 <System.Web.Services.WebService(Namespace:="http://SistemaGT.org/")> _
0024 <System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
277
Continuacin de la figura A-40.
0025 <ToolboxItem(False)> _
0026 Public Class swPreguntasSecretas
0027 Inherits System.Web.Services.WebService
0028
0029 '/**********************************************************************************************/
0030 '/************************************** FUNCIONES ****************************************/
0031 '/**********************************************************************************************/
0032 'Funcin que devuelve la conexin a la BDD
0033 Private Function fPrOcleConectar() As OracleConnection
0034 Dim vrLOcleConexion As New OracleConnection
0035
0036 vrLOcleConexion.ConnectionString = "Data source=nchonay; User id=usr_seg; " + _
0037 "Password=anionuev0;"
0038 vrLOcleConexion.Open()
0039 Return vrLOcleConexion
0040 End Function
0041
0042 '/**********************************************************************************************/
0043 '/************************************* SERVICIO WEB *************************************/
0044 '/**********************************************************************************************/
0045 'Funcin para buscar las preguntas
0046 <WebMethod()> _
0047 Public Function wSfPbTblBuscarPreguntas() As DataSet
0048 'Valor de retorno
0049 Dim rtTblsDatos As DataSet = New DataSet()
0050
0051 'Tabla con resultados
0052 Dim vrLTblDatos As DataTable = New DataTable()
0053 Dim vrLColColumna As DataColumn
0054 'Columna para el ID de la pregunta
0055 vrLColColumna = New DataColumn()
0056 vrLColColumna.DataType = System.Type.GetType("System.Int16")
0057 vrLColColumna.ColumnName = "ID"
0058 vrLTblDatos.Columns.Add(vrLColColumna)
0059 'Columna para el TEXTO de la pregunta
0060 vrLColColumna = New DataColumn()
0061 vrLColColumna.DataType = Type.GetType("System.String")
0062 vrLColColumna.ColumnName = "PREGUNTA"
0063 vrLTblDatos.Columns.Add(vrLColColumna)
0064
0065 'Inicializar el cdigo y mensaje de resultado
0066 Dim vrLFilaMensaje As DataRow = vrLTblDatos.NewRow()
0067 vrLFilaMensaje("ID") = 10
0068 vrLFilaMensaje("PREGUNTA") = ""
0069
0070 Try
0071 'Conectarse a Oracle
0072 Dim vrLOcleConexion As OracleConnection
0073 vrLOcleConexion = fPrOcleConectar()
0074
0075 'Validar si se pudo establecer la conexin con Oracle
0076 If Not (vrLOcleConexion Is Nothing) Then
0077 Dim vrLOcleComando As OracleCommand = New OracleCommand()
278
Continuacin de la figura A-40.
279