jueves, 1 de noviembre de 2018
ACCESS II: Código del Módulo bas_Usuarios
Option Explicit
'---------------------------------------------------------------------
' Procedure : Get_Contraseña
' Author : Witigo (Angel Campos Muñoz)
' Date : 22/09/2014
' Purpose : Obtiene la contraseña del usuario pasado como argumento.
'---------------------------------------------------------------------
'
Public Function Get_Contraseña(intUsuario As Integer) As String
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String
strSQL = "SELECT dbo_Usuarios.Contraseña " & _
"FROM dbo_Usuarios " & _
"WHERE ID_Usuario = " & intUsuario & ";"
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
Dim strContraseña As String
If rst.RecordCount <> 0 Then
strContraseña = rst!Contraseña
End If
' Devolvemos la contraseña
Get_Contraseña = strContraseña
' Cerramos el recordset
rst.Close
' Borramos los objetos
Set rst = Nothing
Set dbs = Nothing
End Function
'---------------------------------------------------------------------
' Procedure : Comprueba_Usuario
' Author : Witigo (Angel Campos Muñoz)
' Date : 22/09/2014
' Purpose : Controla si se ha seleccionado un usuario del combobox
' cbo_Usuario
'---------------------------------------------------------------------
'
Private Function Comprueba_Usuario() As Boolean
If IsNull(Me.cbo_Usuario.Value) = True Then
' Realizamos mensaje sonoro
Beep
' Mostramos mensaje en la etiqueta
Call MensajeEtiqueta("Debe seleccionar un usuario.")
' Centramos el foco en el textbox
Me.cbo_Usuario.SetFocus
' Devolvemos FALSE por que no hay ningún usuario
' seleccinado en el combobox...
Comprueba_Usuario = False
Else
' Devolvemos TRUE por que SI hay un usuario
' seleccionado en el combobox...
Comprueba_Usuario = True
End If
End Function
'---------------------------------------------------------------------
' Procedure : Comprueba_Contraseña
' Author : Witigo (Angel Campos Muñoz)
' Date : 22/09/2014
' Purpose : Controla si se ha introducido una contraseña en el
' textbox txt_Contraseña
'---------------------------------------------------------------------
'
Private Function Comprueba_Contraseña() As Boolean
Dim strContraseña As String
strContraseña = Nz(Me.txt_Contraseña, "")
If strContraseña = "" Then
' Realizamos mensaje sonoro
Beep
' Mostramos mensaje en la etiqueta
Call MensajeEtiqueta("Introduzca una contraseña.")
' Centramos el foco en el textbox de la contraseña
Me.txt_Contraseña.SetFocus
' Devolvemos FALSE, por que no se ha introducido ninguna
' contraseña en el textbox...
Comprueba_Contraseña = False
Else
' Devolvemos TRUE, por que hay una contraseña introducida,
' sea erronea o no...
Comprueba_Contraseña = True
End If
End Function
ACCESS II: Código del Módulo bas_sesion
'---------------------------------------------------------------------
' Procedure : Log_Sesion
' Author : Witigo (Angel Campos Muñoz)
' Date : 22/09/2014
' Purpose : Inserta un registro en la tabla dbo_logs_sesion con los
' datos de la sesión de usuario
'---------------------------------------------------------------------
'
Public Function Log_Sesion(intUsuario As Integer, _
strResultado As String, _
Optional strContraseña As String = "")
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("dbo_logs_sesion")
With rst
' Agregamos un registro
.AddNew
' Especificamos los campos en los que vamos a insertar
' los datos relativos a la sesión de usuario.
.Fields("Fecha").Value = Now()
.Fields("Terminal").Value = Environ("Computername")
.Fields("ID_Usuario").Value = intUsuario
.Fields("Resultado").Value = strResultado
.Fields("ContraseñaErronea").Value = strContraseña
' Actualizamos el registro
.Update
End With
' Cerramos el recordset
rst.Close
' Borramos los objetos
Set rst = Nothing
Set dbs = Nothing
End Function
ACCESS II: Código del Módulo bas_seguridad_Sesion
Option Explicit
' Variable privada que controla los intentos de login fallidos
Private bytErrLogin As Byte
Public Sub Block_Usuario(intUsuario As Integer)
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String
strSQL = "SELECT dbo_Usuarios.Activo " & _
"FROM dbo_Usuarios " & _
"WHERE ID_Usuario = " & intUsuario & ";"
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
With rst
' Modificamos el registro
.Edit
.Fields("Activo").Value = False
' Actualizamos el registro
.Update
End With
' Cerramos el recordset
rst.Close
' Borramos los objetos
Set rst = Nothing
Set dbs = Nothing
End Sub
'Purpose : Devuelve el número máximo de intentos fallidos de iniciar
' sesión en la aplicación.
'-------------------------------------------------------------------------
'
Public Function Get_ErrMaxLogin() As Byte
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String
strSQL = "SELECT dbo_Opciones.ID_Opcion, " & _
"dbo_Opciones.ErrMaxLogin " & _
"FROM dbo_Opciones " & _
"WHERE (((dbo_Opciones.ID_Opcion) = 1));"
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
With rst
' Devolvemos 0 por que no hay registros
If .RecordCount = 0 Then Get_ErrMaxLogin = 0
' Devolvemos el número máximo de intentos
Get_ErrMaxLogin = !ErrMaxLogin
End With
' Cerramos el recordset
rst.Close
' Borramos los objetos
Set rst = Nothing
Set dbs = Nothing
End Function
'Procedure: Comprueba_Intentos
' Purpose : Comprueba los intentos de inicio de sesión fallidos y actúa
' en consecuencia.
'-------------------------------------------------------------------------
'
Private Sub Comprueba_Intentos(bytErrLogin As Byte, _
intUsuario As Integer)
If bytErrLogin = Get_ErrMaxLogin Then
' Mostramos el mensaje "Se ha superado el número máximo de intentos
' de inicio de sesión"
MsgBox "Se ha superado el número máximo de intentos de " & _
"inicio de sesión." & _
vbCrLf & vbCrLf & _
"Usuario : """ & Me.cbo_Usuario.Column(1) & """." & _
vbCrLf & vbCrLf & _
"El usuario ha sido bloqueado.", _
vbExclamation, "Inicio de sesión"
' Bloqueamos al usuario
Call Block_Usuario(intUsuario)
' Hacemos log del bloqueo del usuario
Call Log_Sesion(intUsuario, "El usuario ha sido bloqueado.")
With Me
' Actualizamos el combobox cbo_Usuario
.cbo_Usuario.Requery
' Borramos la contraseña
.txt_Contraseña = ""
' Ocultamos la etiqueta
.lbl_Mensaje.Visible = False
End With
End If
End Sub
ACCESS II: Código del Formulario Form_Login
Option Explicit
' Variable privada que controla los intentos de login fallidos
Private bytErrLogin As Byte
'Procedure: Comprueba_Intentos
' Purpose : Comprueba los intentos de inicio de sesión fallidos y actúa
' en consecuencia.
'-------------------------------------------------------------------------
'
Private Sub Comprueba_Intentos(bytErrLogin As Byte, _
intUsuario As Integer)
If bytErrLogin = Get_ErrMaxLogin Then
' Mostramos el mensaje "Se ha superado el número máximo de intentos
' de inicio de sesión"
MsgBox "Se ha superado el número máximo de intentos de " & _
"inicio de sesión." & _
vbCrLf & vbCrLf & _
"Usuario : """ & Me.cbo_Usuario.Column(1) & """." & _
vbCrLf & vbCrLf & _
"El usuario ha sido bloqueado.", _
vbExclamation, "Inicio de sesión"
' Bloqueamos al usuario
Call Block_Usuario(intUsuario)
' Hacemos log del bloqueo del usuario
Call Log_Sesion(intUsuario, "El usuario ha sido bloqueado.")
With Me
' Actualizamos el combobox cbo_Usuario
.cbo_Usuario.Requery
' Borramos la contraseña
.txt_Contraseña = ""
' Ocultamos la etiqueta
.lbl_Mensaje.Visible = False
End With
End If
End Sub
Private Sub cmd_Login_Click()
Dim intUsuario As Integer
Dim strContraseña As String
intUsuario = Nz(Me.cbo_Usuario.Value, 0)
' Ocultamos la etiqueta
If Me.lbl_Mensaje.Visible = True Then Me.lbl_Mensaje.Visible = False
' Comprobamos si se ha seleccionado usuario
' Comprobamos si se ha introducido contraseña
' Comprobamos el valor introducido para el usuario y su contraseña
' -------------------------------------------------------
' Aquí podemos insertar el código que queremos que se
' ejecute cuando iniciemos la sesión...
' -------------------------------------------------------
' Mostramos mensaje
MsgBox "Sesión de usuario iniciada", _
vbInformation, _
"Inicio de Sesión"
' Hacemos log del inicio de sesión
Log_Sesion intUsuario, "Inicio de sesión."
' Cerramos el formulario
DoCmd.Close acForm, Me.Name
' Añadimos +1 a los intentos de login erróneos
1
' Centramos el foco en el textbox
' Mostramos mensaje en la etiqueta
Call MensajeEtiqueta("La contraseña introducida es errónea.")
' Hacemos log del inicio de sesión fallido
Call Log_Sesion(intUsuario, "Inicio de sesión erróneo.", strContraseña)
' Comprobamos los intentos de inicio de sesión
End Sub
Private Sub MensajeEtiqueta(strMensaje As String)
Dim lbl As Label
Set lbl = Me.lbl_Mensaje
If Nz(strMensaje, "") <> "" Then
' Mostramos mensaje
With lbl
' Hacemos visible la etiqueta
.Visible = True
' Mostramos el Mensaje de aviso
.Caption = strMensaje
End With
End If
' Borramos el objeto
Set lbl = Nothing
End Sub
Private Sub Cmd_Salir_Click()
' Cerramos el Formulario
DoCmd.Close acForm, Me.Name
End Sub
Private Sub Form_Load()
' Establecemos el valor de la variable que controla los
' errores de login...
bytErrLogin = 0
End Sub
ACCESS II: Login Completo Final
CÓDIGO bas_seguridad_sesión
Option Compare Database
Option Explicit
' Variable privada que controla los intentos de login fallidos
Private bytErrLogin As Byte
Public Sub Block_Usuario(intUsuario As Integer)
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String
strSQL = "SELECT dbo_Usuarios.Activo " & _
"FROM dbo_Usuarios " & _
"WHERE ID_Usuario = " & intUsuario & ";"
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
With rst
' Modificamos el registro
.Edit
.Fields("Activo").Value = False
' Actualizamos el registro
.Update
End With
' Cerramos el recordset
rst.Close
' Borramos los objetos
Set rst = Nothing
Set dbs = Nothing
End Sub
'Purpose : Devuelve el número máximo de intentos fallidos de iniciar
' sesión en la aplicación.
'-------------------------------------------------------------------------
'
Public Function Get_ErrMaxLogin() As Byte
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String
strSQL = "SELECT dbo_Opciones.ID_Opcion, " & _
"dbo_Opciones.ErrMaxLogin " & _
"FROM dbo_Opciones " & _
"WHERE (((dbo_Opciones.ID_Opcion) = 1));"
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
With rst
' Devolvemos 0 por que no hay registros
If .RecordCount = 0 Then Get_ErrMaxLogin = 0
' Devolvemos el número máximo de intentos
Get_ErrMaxLogin = !ErrMaxLogin
End With
' Cerramos el recordset
rst.Close
' Borramos los objetos
Set rst = Nothing
Set dbs = Nothing
End Function
'Procedure: Comprueba_Intentos
' Purpose : Comprueba los intentos de inicio de sesión fallidos y actúa
' en consecuencia.
'-------------------------------------------------------------------------
'
Private Sub Comprueba_Intentos(bytErrLogin As Byte, _
intUsuario As Integer)
If bytErrLogin = Get_ErrMaxLogin Then
' Mostramos el mensaje "Se ha superado el número máximo de intentos
' de inicio de sesión"
MsgBox "Se ha superado el número máximo de intentos de " & _
"inicio de sesión." & _
vbCrLf & vbCrLf & _
"Usuario : """ & Me.cbo_Usuario.Column(1) & """." & _
vbCrLf & vbCrLf & _
"El usuario ha sido bloqueado.", _
vbExclamation, "Inicio de sesión"
' Bloqueamos al usuario
Call Block_Usuario(intUsuario)
' Hacemos log del bloqueo del usuario
Call Log_Sesion(intUsuario, "El usuario ha sido bloqueado.")
With Me
' Actualizamos el combobox cbo_Usuario
.cbo_Usuario.Requery
' Borramos la contraseña
.txt_Contraseña = ""
' Ocultamos la etiqueta
.lbl_Mensaje.Visible = False
End With
End If
End Sub
CÓDIGO bas_sesión
Option Compare Database
'---------------------------------------------------------------------
' Procedure : Log_Sesion
' Author : Witigo (Angel Campos Muñoz)
' Date : 22/09/2014
' Purpose : Inserta un registro en la tabla dbo_logs_sesion con los
' datos de la sesión de usuario
'---------------------------------------------------------------------
'
Public Function Log_Sesion(intUsuario As Integer, _
strResultado As String, _
Optional strContraseña As String = "")
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset("dbo_logs_sesion")
With rst
' Agregamos un registro
.AddNew
' Especificamos los campos en los que vamos a insertar
' los datos relativos a la sesión de usuario.
.Fields("Fecha").Value = Now()
.Fields("Terminal").Value = Environ("Computername")
.Fields("ID_Usuario").Value = intUsuario
.Fields("Resultado").Value = strResultado
.Fields("ContraseñaErronea").Value = strContraseña
' Actualizamos el registro
.Update
End With
' Cerramos el recordset
rst.Close
' Borramos los objetos
Set rst = Nothing
Set dbs = Nothing
End Function
CÓDIGO bas_usuarios
Option Compare Database
Option Explicit
'---------------------------------------------------------------------
' Procedure : Get_Contraseña
' Author : Witigo (Angel Campos Muñoz)
' Date : 22/09/2014
' Purpose : Obtiene la contraseña del usuario pasado como argumento.
'---------------------------------------------------------------------
'
Public Function Get_Contraseña(intUsuario As Integer) As String
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim strSQL As String
strSQL = "SELECT dbo_Usuarios.Contraseña " & _
"FROM dbo_Usuarios " & _
"WHERE ID_Usuario = " & intUsuario & ";"
Set dbs = CurrentDb()
Set rst = dbs.OpenRecordset(strSQL, dbOpenDynaset)
Dim strContraseña As String
If rst.RecordCount <> 0 Then
strContraseña = rst!Contraseña
End If
' Devolvemos la contraseña
Get_Contraseña = strContraseña
' Cerramos el recordset
rst.Close
' Borramos los objetos
Set rst = Nothing
Set dbs = Nothing
End Function
'---------------------------------------------------------------------
' Procedure : Comprueba_Usuario
' Author : Witigo (Angel Campos Muñoz)
' Date : 22/09/2014
' Purpose : Controla si se ha seleccionado un usuario del combobox
' cbo_Usuario
'---------------------------------------------------------------------
'
Private Function Comprueba_Usuario() As Boolean
If IsNull(Me.cbo_Usuario.Value) = True Then
' Realizamos mensaje sonoro
Beep
' Mostramos mensaje en la etiqueta
Call MensajeEtiqueta("Debe seleccionar un usuario.")
' Centramos el foco en el textbox
Me.cbo_Usuario.SetFocus
' Devolvemos FALSE por que no hay ningún usuario
' seleccinado en el combobox...
Comprueba_Usuario = False
Else
' Devolvemos TRUE por que SI hay un usuario
' seleccionado en el combobox...
Comprueba_Usuario = True
End If
End Function
'---------------------------------------------------------------------
' Procedure : Comprueba_Contraseña
' Author : Witigo (Angel Campos Muñoz)
' Date : 22/09/2014
' Purpose : Controla si se ha introducido una contraseña en el
' textbox txt_Contraseña
'---------------------------------------------------------------------
'
Private Function Comprueba_Contraseña() As Boolean
Dim strContraseña As String
strContraseña = Nz(Me.txt_Contraseña, "")
If strContraseña = "" Then
' Realizamos mensaje sonoro
Beep
' Mostramos mensaje en la etiqueta
Call MensajeEtiqueta("Introduzca una contraseña.")
' Centramos el foco en el textbox de la contraseña
Me.txt_Contraseña.SetFocus
' Devolvemos FALSE, por que no se ha introducido ninguna
' contraseña en el textbox...
Comprueba_Contraseña = False
Else
' Devolvemos TRUE, por que hay una contraseña introducida,
' sea erronea o no...
Comprueba_Contraseña = True
End If
End Function
ACCESS II: Introducción Teoría
¿Qué es SQL?
SELECT Last_NameFROM Contacts WHERE First_Name = 'Mary';
Instrucciones SELECT
- Qué tablas contienen los datos.
- Cómo se relacionan los datos de orígenes diferentes.
- Qué campos o cálculos proporcionarán los datos.
- Criterios que los datos deben cumplir para ser incluidos.
- Si se deben ordenar los datos y, en caso de ser así, cómo deben ordenarse.
Cláusulas SQL
Cláusula SQL
|
Función
|
Obligatorio
|
|---|---|---|
SELECT
|
Muestra una lista de los campos que contienen datos de interés.
|
Sí
|
FROM
|
Muestra las tablas que contienen los campos de la cláusula SELECT.
|
Sí
|
WHERE
|
Especifica los criterios de campo que cada registro debe cumplir para poder ser incluido en los resultados.
|
No
|
ORDER BY
|
Especifica la forma de ordenar los resultados.
|
No
|
GROUP BY
|
En una instrucción SQL que contiene funciones de agregado, muestra los campos que no se resumen en la cláusula SELECT.
|
Solo si están estos campos
|
HAVING
|
En una instrucción SQL que contiene funciones de agregado, especifica las condiciones que se aplican a los campos que se resumen en la instrucción SELECT.
|
No
|
Términos de SQL
Término de SQL
|
Elemento de la oración comparable
|
Definición
|
Ejemplo
|
|---|---|---|---|
identificador
|
sustantivo
|
Nombre que se usa para identificar un objeto de la base de datos, como el nombre de un campo.
|
Clientes.[Número de teléfono]
|
operador
|
verbo o adverbio
|
Palabra clave que representa o modifica una acción.
|
AS
|
constante
|
sustantivo
|
Valor que no cambia, como un número o un valor nulo (NULL).
|
42
|
expresión
|
adjetivo
|
Combinación de identificadores, operadores, constantes y funciones que se evalúa como un valor único.
|
> = Productos.[Precio por unidad]
|
ACCESS II: (Creación de un Informe con 2 Condiciones)
CREACIÓN DE UN INFORME, LIGADO A UN FORMULARIO, CON DOS CONDICIONES.
Recupera una Base de Datos, Identifica una Tabla.
1) Crearemos un Formulario Personalizado, basado en una Tabla
a) Diseño del Formulario, Insertamos dos Campos, en este caso (Código del Curso), (Nota Final), le ponemos nombre a las etiquetas.
Activamos la Hoja de Propiedades y le pondremos nombre a los cuadros de texto, Ejemplo (TxtCodCurso), (TxtNotaFinal), Guardar el Formulario.
2)Crear una Consulta Sencilla, Utilizando el asistente, seguir las Instrucciones, pasar todos los campos, Asignar nombre a la consulta, hasta llegar al punto donde dice: modificar el diseño de la consulta. Poner las condiciones a la consulta que son 2, guardar y probar que funcione.
3) Crear un informe, Utilizando el asistente, pasar todos los campos, y probar que funcione
4) Recuperar el formulario y poner un botón de acción que realice todo el proceso, hasta crear el informe.






