Tironemota

Access

Códigos Access
09-08-2022

Productos 09-08-2022

Productos

productos01Tab 09-08-2022

Campo: idProducto
    Tipo de datos: Autonumérico
    Clave principal
Campo: nombreProd
    Tipo de datos: Texto
    Tamaño del campo: 100
Campo: precio
    Tipo de datos: Número
    Tamaño del campo: Doble
    Formato: Estándar
    Lugares decimales: 2
Campo: inventario
    Tipo de datos: Número
    Tamaño del campo: Doble
    Formato: Estándar
    Lugares decimales: 2
Campo: stop
    Tipo de datos: Número
    Tamaño del campo: Doble
    Formato: Estándar
    Lugares decimales: 2

productos02For 09-08-2022

Propiedades del Formulario
    Origen del registro: productos01Tab
    Título: PRODUCTO
    Emergente: Sí
    Modal: Sí
    Centrado automático: Sí
    Selectores de registro: No
    Botones de desplazamiento: No
    Barras de desplazamiento: Ninguna
    Al cerrar: [Procedimiento de evento]
        Private Sub Form_Close()
            DoCmd.Close acForm, "productos05For"
            DoCmd.OpenForm "productos05For"
        End Sub
Propiedades del Detalle
    Campo: idProducto
    Campo: nombreProd
    Campo: precio
    Campo: inventario
    Campo: stop
Propiedades Pie del formulario
    Botón de comando
                            

productos03For 09-08-2022

Propiedades del Formulario
    Origen del registro: SELECT productos01Tab.idProducto, productos01Tab.nombreProd, productos01Tab.precio, productos01Tab.inventario, productos01Tab.stop FROM productos01Tab WHERE (((productos01Tab.idProducto)=[Formularios]![productos05For]![ListaProducto]));
    Título: PRODUCTO
    Selectores de registro: No
    Botones de desplazamiento: No
    Barras de desplazamiento: Ninguna
    Al activar registro: [Procedimiento de evento]
        Private Sub Form_Current()
            'Si el valor del campo stop es igual o menor al campo inventario
            If Me![inventario].Value <= Me![stop].Value Then
                'La propiedad Visible de la etiqueta es igual a True
                StopMinimo.Visible = True
            'Caso contrario
            Else
                'Requerimos que la propiedad visible retorne a False,
                'para que oculte la etiqueta en los productos que el inventario esta bien.
                StopMinimo.Visible = False
            End If
        End Sub    
Propiedades del Detalle
    Campo: idProducto
    Campo: nombreProd
    Campo: precio
    Campo: inventario
    Campo: stop
    Etiqueta
        Nombre: StopMinimo
        Título: Stop Minimo
                            

productos04Con 09-08-2022

SELECT productos01Tab.idProducto, productos01Tab.nombreProd
FROM productos01Tab
WHERE (((productos01Tab.nombreProd) Like "*" & [Formularios]![productos05For]![Buscar] & "*"));
                            

productos05For 09-08-2022

Propiedades del Formulario
    Título: PRODUCTOS
    Emergente: Sí
    Modal: Sí
    Centrado automático: Sí
    Selectores de registro: No
    Botones de desplazamiento: No
    Barras de desplazamiento: Ninguna
Propiedades Detalle
    Cuadro de texto Independiente
        Etiqueta
            Título: Buscar
        Cuadro de texto
            Nombre: Buscar
            Después de actualizar: [Procedimiento de evento]
                Private Sub Buscar_AfterUpdate()
                    Me!ListaProducto.Requery
                End Sub
    Cuadro de lista
        Nombre: ListaProducto
        Origen de la fila: productos04Con
        Columna dependiente: 1
        Número de columnas: 2
        Ancho de columnas: 0cm;6cm
        Al hacer clic: [Procedimiento de evento]
            Private Sub ListaProducto_Click()
                Me!SubFormulario.Requery
            End Sub
    SubFormulario
        Nombre: SubFormulario
        Objeto de origen: productos03For
    Botón de comando
        Nombre: Nuevo
        Título: Nuevo
        Al hacer clic: [Procedimiento de evento]
            Private Sub Nuevo_Click()
                DoCmd.OpenForm "productos02For", acNormal, , , acFormAdd
            End Sub
    Botón de comando
        Nombre: Editar
        Título: Editar
        Al hacer clic: [Procedimiento de evento]
            Private Sub Editar_Click()
            On Error GoTo Err_Editar_Click
                Dim stDocName As String
                Dim stLinkCriteria As String
                If IsNull(Me![ListaProducto]) Then
                    MsgBox "Seleccione un registro de la lista"
                    ListaProducto.SetFocus
                Else
                stDocName = "productos02For"
                stLinkCriteria = "[IdProducto]=" & Me![ListaProducto]
                DoCmd.OpenForm stDocName, , , stLinkCriteria
                End If
            Exit_Editar_Click:
                Exit Sub
            Err_Editar_Click:
                MsgBox Err.Description
                Resume Exit_Editar_Click
            End Sub
    Botón de comando
        Nombre: Eliminar
        Título: Eliminar
        Al hacer clic: [Procedimiento de evento]
            Private Sub Eliminar_Click()
            On Error GoTo Err_Eliminar_Click
                Dim Var As String
                Dim Mensaje As Integer
                Dim stLinkCriteria As String
                If IsNull(Me![ListaProducto]) Then
                    MsgBox "Seleccione un registro de la lista"
                    ListaProducto.SetFocus
                Else
                stLinkCriteria = "[IdProducto]=" & Me![ListaProducto]
                Mensaje = MsgBox("¿Estas seguro de querer eliminar el registro?.", vbYesNo + vbInformation, "Confirmar")
                    If Mensaje = vbYes Then
                        DoCmd.SetWarnings False
                        'borrar un registro tomando el valor de la llave de una Lista
                        Var = "DELETE * FROM productos01Tab WHERE productos01Tab.IdProducto =" & Val(Me.ListaProducto.Column(0))
                        DoCmd.RunSQL Var 'se ejecuta la consulta de eliminación
                        DoCmd.SetWarnings False
                    End If
                End If
                'Para actualizar cierro y abro el formulario
                DoCmd.Close
                DoCmd.OpenForm "productos05For"
            Exit_Eliminar_Click:
                Exit Sub
            Err_Eliminar_Click:
                MsgBox Err.Description
                Resume Exit_Eliminar_Click
            End Sub
    Botón de comando Cerrar formulario
    Botón de comando Cerrar aplicación

Abrir formulario y cerrar anterior 15/09/2022

Private Sub Form_Open(Cancel As Integer)
    DoCmd.Close acForm, "NombreDelFormularioACerrar"
End Sub

Abrir formulario Al hacer doble clic 15/09/2022

Abrir un formulario Al hacer doble clic sobre una lista, que permita ingresar nuevo registro. Puede ser una lista contenida por un Cuadro de lista o Cuadro combinado.

Private Sub NombreDelObjeto(Cancel As Integer)
On Error GoTo Err_NombreDelObjeto_DblClick
    Dim lngTopicID As Long
    If IsNull(Me![NombreDelObjeto]) Then
        Me![NombreDelObjeto].Tex = ""
    Else
        lngTopicID = Me![NombreDelObjeto]
        Me![NombreDelObjeto] = Null
    End If
    DoCmd.OpenForm "NombreDelFormularioQueAbrira", , , , acFormAdd, acDialog, "GotoNew"
    Me![NombreDelObjeto].Requery
    If lngTopicID <> 0 Then Me![NombreDelObjeto] = lngTopicID
Exit_NombreDelObjeto_DblClick:
    Exit Sub
Err_NombreDelObjeto_DblClick:
    MsgBox "ERROR.- Debe activar la lista selecionando un registro cualquiera..."
    Resume Exit_NombreDelObjeto_DblClick
End Sub

Botón nuevo registro 15/09/2022

Abre formulario para insertar nuevo registro

  • Botón de comando
    • Nombre: NuevoRegistro
    • Título: &Nuevo Registro
    • Al hacer clic: [Procedimiento de evento]
Private Sub NuevoRegistro_Click()
    DoCmd.OpenForm "NombreDelFormularioQueAbrira", acNormal, , , acFormAdd, acDialog
End Sub

Al no haber datos en el informe 16/09/2022

  • Al no haber datos: [Procedimiento de evento]
Private Sub Report_NoData(Cancel As Integer)
    MsgBox "No hay datos para este informe. Cancelando el informe..."
    Cancel = -1
End Sub

Buscar según registro y fecha 16/09/2022

[Buscar-registro]

Como ejemplo, requerimos de un formulario, una consulta y un informe

1.- Formulario: buscarPedidoFor

  • Propiedades del formulario:
    • Al abrir: [Procedimiento de evento]
Private Sub Form_Open(Cancel As Integer)
    Me.Caption = Forms!buscarPedidoFor.OpenArgs
End Sub
  • Propiedades Detalle:
    • Cuadro combinado
      • Nombre: Cliente
      • Origen de la fila: SELECT [clientes].[idCliente], [clientes].[empresa] FROM clientes ORDER BY [empresa];
    • Cuadro de texto
      • Nombre: FechaInicio
    • Cuadro de texto
      • Nombre: FechaFinal
    • Botón de comando
      • Nombre: VistaPrevia
      • Título: &Buscar
      • Al hacer clic: [Procedimiento de evento]
Private Sub VistaPrevia_Click()
    'Si los campos están vacíos
    If IsNull([cliente]) And IsNull([FechaInicio]) And IsNull([FechaFinal]) Then
        'Muestro mensaje
        MsgBox "No existen datos, no hay nada que buscar ..."
        'Cierro el formulario
        DoCmd.Close
    'Caso contrario
    Else
    'Si Cliente no es nulo pero FechaInicio es nulo
    If Not IsNull([cliente]) And IsNull([FechaInicio]) Then
        'Muestro mensaje
        MsgBox "Falta la fecha inicio ..."
        'Enfoco el control FechaInicio
        DoCmd.GoToControl "FechaInicio"
    'Caso contrario
    Else
    'Si FechaInicio no es nulo y FechaFinal es nulo
    If Not IsNull([FechaInicio]) And IsNull([FechaFinal]) Then
        'Muestro mensaje
        MsgBox "Falta la fecha final ..."
        'Enfoco el control FechaFinal
        DoCmd.GoToControl "FechaFinal"
    'Caso contrario
    Else
    'Si FechaInicio es nulo y FechaFinal no es nulo
    If IsNull([FechaInicio]) And Not IsNull([FechaFinal]) Then
        'Muestro mensaje
        MsgBox "Falta la fecha inicio ..."
        'Enfoco el control FechaFinal
        DoCmd.GoToControl "FechaInicio"
    'Caso contrario
    Else
    'Si FechaInicio es mayor a FechaFinal
    If [FechaInicio] > [FechaFinal] Then
        'Muestro mensaje
        MsgBox "La fecha final debe ser mayor que la fecha inicio."
    'Caso contrario
    Else
        Me.Visible = False
    End If
    End If
    End If
    End If
    End If
End Sub

2.- Consulta: buscarPedidoCon

Crear consulta en Vista SQL
SELECT pedidos.idPedido, pedidos.idCliente, clientes.empresa, pedidos.fechaDePedido, Sum([valor]*[und]) AS Total
FROM (clientes INNER JOIN pedidos ON clientes.idCliente = pedidos.idCliente) INNER JOIN productosPedido ON pedidos.idPedido = productosPedido.idPedido
GROUP BY pedidos.idPedido, pedidos.idCliente, clientes.empresa, pedidos.fechaDePedido
HAVING (((pedidos.idCliente)=[Formularios]![buscarPedidoFor]![Cliente]) AND ((pedidos.fechaDePedido)>=[Formularios]![buscarPedidoFor]![FechaInicio] AND (pedidos.fechaDePedido)<=[Formularios]![buscarPedidoFor]![FechaFinal]));

3.- Informe: buscarPedidoInf

  • Propiedades del informe:
    • Origen del registro: buscarPedidoCon
    • Al no haber datos: [Procedimiento de evento]
Private Sub Report_NoData(Cancel As Integer)
    MsgBox "No hay datos para este informe. Cancelando el informe..."
    Cancel = -1
End Sub
    • Al abrir: [Procedimiento de evento]
Private Sub Report_Open(Cancel As Integer)
DoCmd.OpenForm "buscarPedidoFor", acNormal, , , , acDialog, "PEDIDOS SEGÚN CLIENTE Y FECHA"
End Sub
    • Al cerrar: [Procedimiento de evento]
Private Sub Report_Close()
    DoCmd.Close acForm, "buscarPedidoFor"
End Sub

Convertir número a letra 16/09/2022

1.- Módulo VBA NumLetra

Function letra(Numero)
Dim Texto
Dim Millones
Dim Miles
Dim Cientos
Dim Decimales
Dim Cadena
Dim CadMillones
Dim CadMiles
Dim CadCientos
Dim caddecimales
Texto = Round(Numero, 2)
Texto = FormatNumber(Texto, 2)
Texto = Right(Space(14) & Texto, 14)
Millones = Mid(Texto, 1, 3)
Miles = Mid(Texto, 5, 3)
Cientos = Mid(Texto, 9, 3)
Decimales = Mid(Texto, 13, 2)
CadMillones = ConvierteCifra(Millones, False)
CadMiles = ConvierteCifra(Miles, False)
CadCientos = ConvierteCifra(Cientos, True)
caddecimales = ConvierteDecimal(Decimales)
If Trim(CadMillones) > "" Then
If Trim(CadMillones) = "Un" Then
Cadena = CadMillones & " Millón"
Else
Cadena = CadMillones & " Millones"
End If
End If    If Trim(CadMiles) > "" Then
If Trim(CadMiles) = "Un" Then
CadMiles = ""
Cadena = Cadena & "" & CadMiles & "Mil"
CadMiles = "Un"
Else
Cadena = Cadena & " " & CadMiles & " Mil"
End If
End If
If Trim(CadMiles) > "001" Then
CadMiles = "Mil"
End If    If Decimales = "00" Then
If Trim(CadMillones & CadMiles & CadCientos & caddecimales) = "Un" Then
Cadena = Cadena & "Uno "
Else
If Miles & Cientos = "000000" Then
Cadena = Cadena & " " & Trim(CadCientos) & " Bolívares"
Else
Cadena = Cadena & " " & Trim(CadCientos) & " Bolívares"
End If
letra = Trim(Cadena)
End If
Else
If Trim(CadMillones & CadMiles & CadCientos & caddecimales) = "Un" Then
Cadena = Cadena & "Uno " & "Con " & Trim(caddecimales)
Else
If Millones & Miles & Cientos & Decimales = "000000" Then
Cadena = Cadena & " " & Trim(CadCientos) & " con " & Trim(Decimales) & "/100 Bolívares"
'Cadena = Cadena & " " & Trim(CadCientos) & " PESOS " & Trim(Decimales) & "/100 M.N."
Else
Cadena = Cadena & " " & Trim(CadCientos) & " con " & Trim(Decimales) & "/100 Bolívares"
'Cadena = Cadena & " " & Trim(CadCientos) & " PESOS " & Trim(Decimales) & "/100 M.N."
End If
letra = Trim(Cadena)
End If
End If    End Function    Function ConvierteCifra(Texto, IsCientos As Boolean)
Dim Centena
Dim Decena
Dim Unidad
Dim txtCentena
Dim txtDecena
Dim txtUnidad
Centena = Mid(Texto, 1, 1)
Decena = Mid(Texto, 2, 1)
Unidad = Mid(Texto, 3, 1)
Select Case Centena
Case "1"
txtCentena = "Cien"
If Decena & Unidad <> "00" Then
txtCentena = "Ciento"
End If
Case "2"
txtCentena = "Doscientos"
Case "3"
txtCentena = "Trescientos"
Case "4"
txtCentena = "Cuatrocientos"
Case "5"
txtCentena = "Quinientos"
Case "6"
txtCentena = "Seiscientos"
Case "7"
txtCentena = "Setecientos"
Case "8"
txtCentena = "Ochocientos"
Case "9"
txtCentena = "Novecientos"
End Select    Select Case Decena
Case "1"
txtDecena = "Diez"
Select Case Unidad
Case "1"
txtDecena = "Once"
Case "2"
txtDecena = "Doce"
Case "3"
txtDecena = "Trece"
Case "4"
txtDecena = "Catorce"
Case "5"
txtDecena = "Quince"
Case "6"
txtDecena = "Dieciseis"
Case "7"
txtDecena = "Diecisiete"
Case "8"
txtDecena = "Dieciocho"
Case "9"
txtDecena = "Diecinueve"
End Select
Case "2"
txtDecena = "Veinte"
If Unidad <> "0" Then
txtDecena = "Veinti"
End If
Case "3"
txtDecena = "Treinta"
If Unidad <> "0" Then
txtDecena = "Treinta y "
End If
Case "4"
txtDecena = "Cuarenta"
If Unidad <> "0" Then
txtDecena = "Cuarenta y "
End If
Case "5"
txtDecena = "Cincuenta"
If Unidad <> "0" Then
txtDecena = "Cincuenta y "
End If
Case "6"
txtDecena = "Sesenta"    If Unidad <> "0" Then
txtDecena = "Sesenta y "
End If
Case "7"
txtDecena = "Setenta"
If Unidad <> "0" Then
txtDecena = "Setenta y "
End If
Case "8"
txtDecena = "Ochenta"
If Unidad <> "0" Then
txtDecena = "Ochenta y "
End If
Case "9"
txtDecena = "Noventa"
If Unidad <> "0" Then
txtDecena = "Noventa y "
End If
End Select    If Decena <> "1" Then
Select Case Unidad
Case "1"
If IsCientos = False Then
txtUnidad = "Un"
Else
txtUnidad = "Uno"
End If
Case "2"
txtUnidad = "Dos"
Case "3"
txtUnidad = "Tres"
Case "4"
txtUnidad = "Cuatro"
Case "5"
txtUnidad = "Cinco"
Case "6"
txtUnidad = "Seis"
Case "7"
txtUnidad = "Siete"
Case "8"
txtUnidad = "Ocho"
Case "9"
txtUnidad = "Nueve"
End Select
End If
ConvierteCifra = txtCentena & " " & txtDecena & txtUnidad
End Function    Function ConvierteDecimal(Texto)
Dim Decenadecimal
Dim Unidaddecimal
Dim txtDecenadecimal
Dim txtUnidaddecimal
Decenadecimal = Mid(Texto, 1, 1)
Unidaddecimal = Mid(Texto, 2, 1)    Select Case Decenadecimal
Case "1"
txtDecenadecimal = "Diez"
Select Case Unidaddecimal
Case "1"
txtDecenadecimal = "Once"
Case "2"
txtDecenadecimal = "Doce"
Case "3"
txtDecenadecimal = "Trece"
Case "4"
txtDecenadecimal = "Catorce"
Case "5"
txtDecenadecimal = "Quince"
Case "6"
txtDecenadecimal = "Dieciseis"
Case "7"
txtDecenadecimal = "Diecisiete"
Case "8"
txtDecenadecimal = "Dieciocho"
Case "9"
txtDecenadecimal = "Diecinueve"
End Select
Case "2"
txtDecenadecimal = "Veinte"
If Unidaddecimal <> "0" Then
txtDecenadecimal = "Veinti"
End If
Case "3"
txtDecenadecimal = "Treinta"
If Unidaddecimal <> "0" Then
txtDecenadecimal = "Treinta y "
End If
Case "4"
txtDecenadecimal = "Cuarenta"
If Unidaddecimal <> "0" Then
txtDecenadecimal = "Cuarenta y "
End If
Case "5"
txtDecenadecimal = "Cincuenta"
If Unidaddecimal <> "0" Then
txtDecenadecimal = "Cincuenta y "
End If
Case "6"
txtDecenadecimal = "Sesenta"    If Unidaddecimal <> "0" Then
txtDecenadecimal = "Sesenta y "
End If
Case "7"
txtDecenadecimal = "Setenta"
If Unidaddecimal <> "0" Then
txtDecenadecimal = "Setenta y "
End If
Case "8"
txtDecenadecimal = "Ochenta"
If Unidaddecimal <> "0" Then
txtDecenadecimal = "Ochenta y "
End If
Case "9"
txtDecenadecimal = "Noventa"
If Unidaddecimal <> "0" Then
txtDecenadecimal = "Noventa y "
End If
End Select    If Decenadecimal <> "1" Then
Select Case Unidaddecimal
Case "1"
txtUnidaddecimal = "Uno"
Case "2"
txtUnidaddecimal = "Dos"
Case "3"
txtUnidaddecimal = "Tres"
Case "4"
txtUnidaddecimal = "Cuatro"
Case "5"
txtUnidaddecimal = "Cinco"
Case "6"
txtUnidaddecimal = "Seis"
Case "7"
txtUnidaddecimal = "Siete"
Case "8"
txtUnidaddecimal = "Ocho"
Case "9"
txtUnidaddecimal = "Nueve"
End Select
End If
If Decenadecimal = 0 And Unidaddecimal = 0 Then
ConvierteDecimal = "00/100"
Else
ConvierteDecimal = txtDecenadecimal & txtUnidaddecimal
End If
End Function

2.- Modo de usar la función

  • Insertamos un cuadro de texto
  • Origen del control: =letra([NombreCampoNumerico])

Ejemplo:

  • CampoNumerico con el valor: 33.678,40
  • Cuadro de texto con la propiedad Origen del control: =letra([CampoNumerico])
  • Resultado: Treinta y Tres Mil Seiscientos Setenta y Ocho con 40/100 Bolívares

Insertar contenido al campo 16/09/2022

Ejemplo: Mostrar precio de venta y costo de la mercancía, y porcentaje de descuento del cliente, al seleccionar el producto.

  • Cuadro Combinado
    • Nombre: Producto
    • Despues de actualizar: [Procedimiento de evento]
Private Sub Producto_AfterUpdate()
On Error GoTo Err_Producto_AfterUpdate
    'Creamos variable
    Dim cadFiltro As String
    'Valor de la variable
    cadFiltro = "idProductoEnTabla=" & Me!Producto
    'Muestro el precio del producto
    Me!PrecioEnFormulario = DLookup("PrecioProductoEnTabla", "ProductosTabla", cadFiltro)
    'Valor de la variable
    cadFiltro = "idClienteEnTabla=" & Me!ClienteEnFormulario
    'Muestro el descuento del cliente
    Me!DescuentoEnFormulario = DLookup("DescuentoClienteEnTabla", "ClientesTabla", cadFiltro)
Salir_Producto_AfterUpdate:
    Exit Sub
Err_Producto_AfterUpdate:
    MsgBox Err.Description
    Resume Salir_Producto_AfterUpdate
End Sub

Maximizar Al activar registro 16/09/2022

  • Formulario
    • Al activar registro: [Procedimiento de evento]
Private Sub Form_Current()
    DoCmd.Maximize
End Sub
  • Informe
    • Al activar registro: [Procedimiento de evento]
Private Sub Report_Current()
    DoCmd.Maximize
End Sub

Mostrar control 16/09/2022

Al recibir el campo el enfoque, si esta vacío muestro el botón

  • Botón de comando
    • Nombre: NombreDelBoton
    • Visible: No
  • Cuadro de texto
    • Nombre: NombreDelCampo
    • Al recibir el enfoque: [Procedimiento de evento]
Private Sub NombreDelCampo_GotFocus()
    'Si está vacío
    If IsNull([NombreDelCampo]) Then
        'Muestro botón
        NombreDelBoton.Visible = True
    End If
End Sub

Mover foco a campo de subformulario vacío 16/09/2022

  • Cuadro de lista o Cuadro combinado:
    • Nombre: ListaDeRegistros
    • Al hacer clic: [Procedimiento de evento]
Private Sub ListaDeRegistros_Click()
    Me![NombreSubFormulario].Requery
    'Si el campo del SubFormulario está vacío
    If IsNull(Forms![NombreFormularioActivo]![NombreSubFormulario].Form![NombreDelCampo]) Then
        'Muestro mensaje
        MsgBox "FALTA VALOR (NombreDelCampo)"
        'Enfoco el SubFormulario
        DoCmd.GoToControl "NombreSubFormulario"
        'Enfoco el campo
        DoCmd.GoToControl "NombreDelCampo"
        Me.Controls("NombreSubFormulario").Form.Controls("NombreDelCampo").SetFocus
    End If
End Sub

No cerrar formulario si hay campo vacío 16/09/2022

  • Botón de comando
    • Nombre: BotonCerrarFormulario
    • Título: Cerrar Formulario
    • Al hacer clic: [Procedimiento de evento]
Private Sub BotonCerrarFormulario_Click()
    'Si no existe ningún campo con valor
    If IsNull([NombreDelCampo1]) And IsNull([NombreDelCampo2]) And IsNull([NombreDelCampo3]) And IsNull([NombreDelCampo4]) Then
        DoCmd.Close
    Else
    'Si existe un campo con valor y el Campo1 está vacío
    If IsNull([NombreDelCampo1]) And (Not IsNull([NombreDelCampo2]) Or Not IsNull([NombreDelCampo3]) Or Not IsNull([NombreDelCampo4])) Then
        'Muestro mensaje
        MsgBox "FALTA NombreDelCampo1"
        'Enfoco el campo Campo1
        DoCmd.GoToControl "NombreDelCampo1"
    Else
    'Si Campo2 está vacío
    If IsNull([NombreDelCampo2]) Then
        'Muestro mensaje
        MsgBox "FALTA NombreDelCampo2"
        'Enfoco el Campo2
        DoCmd.GoToControl "NombreDelCampo2"
    Else
    'Si Campo3 está vacío
    If IsNull([NombreDelCampo3]) Then
        'Muestro mensaje
        MsgBox "FALTA NombreDelCampo3"
        'Enfoco el Campo3
        DoCmd.GoToControl "NombreDelCampo3"
    Else
    'Si Campo4 está vacío
    If IsNull([NombreDelCampo4]) Then
        'Muestro mensaje
        MsgBox "FALTA NombreDelCampo4"
        'Enfoco el Campo4
        DoCmd.GoToControl "NombreDelCampo4"
    Else
        DoCmd.Close
    End If '/Campo4 vacío
    End If '/Campo3 vacío
    End If '/Campo2 vacío
    End If '/Campo1 vacío
    End If '/No existen datos
End Sub

No cerrar formulario si hay campo vacío en subformulario 16/09/2022

  • Botón de comando
    • Nombre: BotonCerrarFormulario
    • Título: Cerrar Formulario
    • Al hacer clic: [Procedimiento de evento]
Private Sub BotonCerrarFormulario_Click()
    'Si no existe ningún campo con valor y contiene un subformulario
    If IsNull([NombreDelCampo1]) And IsNull([NombreDelCampo2]) And IsNull([NombreDelCampo3]) And IsNull([NombreDelCampo4]) And IsNull(Forms![NombreDelFormulario]![NombreDelSubFormulario].Form![NombreDelCampo1DelSubFormulario]) Then
        DoCmd.Close
    Else
    'Si existe un campo con valor y el Campo1 está vacío y contiene un subformulario
    If IsNull([NombreDelCampo1]) And (Not IsNull([NombreDelCampo2]) Or Not IsNull([NombreDelCampo3]) Or Not IsNull([NombreDelCampo4]) Or Not IsNull(Forms![NombreDelFormulario]![NombreDelSubFormulario].Form![NombreDelCampo1DelSubFormulario])) Then
        'Muestro mensaje
        MsgBox "FALTA NombreDelCampo1"
        'Enfoco el campo Campo1
        DoCmd.GoToControl "NombreDelCampo1"
    Else
    'Si Campo2 está vacío
    If IsNull([NombreDelCampo2]) Then
        'Muestro mensaje
        MsgBox "FALTA NombreDelCampo2"
        'Enfoco el Campo2
        DoCmd.GoToControl "NombreDelCampo2"
    Else
    'Si Campo3 está vacío
    If IsNull([NombreDelCampo3]) Then
        'Muestro mensaje
        MsgBox "FALTA NombreDelCampo3"
        'Enfoco el Campo3
        DoCmd.GoToControl "NombreDelCampo3"
    Else
    'Si Campo4 está vacío
    If IsNull([NombreDelCampo4]) Then
        'Muestro mensaje
        MsgBox "FALTA NombreDelCampo4"
        'Enfoco el Campo4
        DoCmd.GoToControl "NombreDelCampo4"
    Else
    'Si campo 1 del SubFormulario está vacío
    If IsNull(Forms![NombreDelFormulario]![NombreDelSubFormulario].Form![NombreDelCampo1DelSubFormulario]) Then
        'Muestro mensaje
        MsgBox "FALTA NombreDelCampo1DelSubFormulario"
        'Enfoco el campo 01 del SubFormulario
        DoCmd.GoToControl "NombreDelSubFormulario"
        Me.Controls("NombreDelSubFormulario").Form.Controls("NombreDelCampo1DelSubFormulario").SetFocus
    Else
    'Si campo 2 del SubFormulario está vacío
    If IsNull(Forms![NombreDelFormulario]![NombreDelSubFormulario].Form![NombreDelCampo2DelSubFormulario]) Then
        'Muestro mensaje
        MsgBox "FALTA NombreDelCampo2DelSubFormulario"
        'Enfoco el campo 02 del SubFormulario
        DoCmd.GoToControl "NombreDelSubFormulario"
        Me.Controls("NombreDelSubFormulario").Form.Controls("NombreDelCampo2DelSubFormulario").SetFocus
    Else
    'Si campo 3 del SubFormulario está vacío
    If IsNull(Forms![NombreDelFormulario]![NombreDelSubFormulario].Form![NombreDelCampo3DelSubFormulario]) Then
        'Muestro mensaje
        MsgBox "FALTA NombreDelCampo3DelSubFormulario"
        'Enfoco el campo 03 del SubFormulario
        DoCmd.GoToControl "NombreDelSubFormulario"
        Me.Controls("NombreDelSubFormulario").Form.Controls("NombreDelCampo3DelSubFormulario").SetFocus
    Else
    'Si campo 4 del SubFormulario está vacío
    If IsNull(Forms![NombreDelFormulario]![NombreDelSubFormulario].Form![NombreDelCampo4DelSubFormulario]) Then
        'Muestro mensaje
        MsgBox "FALTA NombreDelCampo4DelSubFormulario"
        'Enfoco el campo 04 del SubFormulario
        DoCmd.GoToControl "NombreDelSubFormulario"
        Me.Controls("NombreDelSubFormulario").Form.Controls("NombreDelCampo4DelSubFormulario").SetFocus
    Else
        DoCmd.Close
    End If '/campo 04 de SubFormulario vacío
    End If '/campo 03 de SubFormulario vacío
    End If '/campo 02 de SubFormulario vacío
    End If '/campo 01 de SubFormulario vacío
    End If '/Campo4 vacío
    End If '/Campo3 vacío
    End If '/Campo2 vacío
    End If '/Campo1 vacío
    End If '/No existen datos
End Sub

Ocultar control 16/09/2022

Al recibir el campo el enfoque, si esta vacío oculto el botón

  • Botón de comando
    • Nombre: NombreDelBoton
    • Visible: No
  • Cuadro de texto
    • Nombre: NombreDelCampo
    • Al recibir el enfoque: [Procedimiento de evento]
Private Sub NombreDelCampo_GotFocus()
    'Si está vacío
    If IsNull([NombreDelCampo]) Then
        'Oculto botón
        NombreDelBoton.Visible = False
    End If
End Sub

Ocultar o mostrar a recibir el enfoque 16/09/2022

Al recibir el campo el enfoque:

  • Si esta vacío oculto el BotonEditar y muestro BotonIngreso
  • Si no esta vacío oculto el BotonIngreso y muestro BotonEditar

Propiedades de los objetos:

  • Botón de comando
    • Nombre: BotonIngreso
    • Visible: No
  • Botón de comando
    • Nombre: BotonEditar
    • Visible: No
  • Cuadro de texto
    • Nombre: NombreDelCampo
    • Al recibir el enfoque: [Procedimiento de evento]
Private Sub NombreDelCampo_GotFocus()
'Si está vacío
If IsNull([NombreDelCampo]) Then
    'Oculto botón
    BotonEditar.Visible = False
    'Muestro botón
    BotonIngreso.Visible = True
Else
    'Muestro botón
    BotonEditar.Visible = True
    'Oculto botón
    BotonIngreso.Visible = False
End If
End Sub

Valor del campo del SubFormulario es igual a cero 16/09/2022

Mover foco a campo de subformulario

  • Cuadro de lista o Cuadro combinado:
    • Nombre: ListaDeRegistros
    • Al hacer clic: [Procedimiento de evento]
Private Sub ListaDeRegistros_Click()
    Me![NombreSubFormulario].Requery
    'Si valor del campo del SubFormulario es igual a cero
    If (Forms![NombreFormularioActivo]![NombreSubFormulario].Form![NombreDelCampo]) = 0 Then
        'Muestro mensaje
        MsgBox "FALTA VALOR (NombreDelCampo)"
        'Enfoco el SubFormulario
        DoCmd.GoToControl "NombreSubFormulario"
        'Enfoco el campo
        DoCmd.GoToControl "NombreDelCampo"
        Me.Controls("NombreSubFormulario").Form.Controls("NombreDelCampo").SetFocus
    End If
End Sub

Agregar registro a la lista 17/09/2022

Private Sub NombreDelElemento_DblClick(Cancel As Integer)
On Error GoTo Err_NombreDelElemento_DblClick
    Dim lngTopicID As Long
    If IsNull(Me![NombreDelElemento]) Then
        Me![NombreDelElemento].Tex = ""
    Else
        lngTopicID = Me![NombreDelElemento]
        Me![NombreDelElemento] = Null
    End If
    DoCmd.OpenForm "NombreFormularioParaIngresarDato", , , , acFormAdd, acDialog, "GotoNew"
    Me![NombreDelElemento].Requery
    If lngTopicID <> 0 Then Me![NombreDelElemento] = lngTopicID
Exit_NombreDelElemento_DblClick:
    Exit Sub
Err_NombreDelElemento_DblClick:
    MsgBox "Para ingresar un nuevo registro, debe existir por lo menos uno."
    Resume Exit_NombreDelElemento_DblClick
End Sub

Formulario Independiente 18/09/2022

1.- Tabla NombreTabla

Crear Tabla para Formulario Independiente. Nombre de la tabla Ejemplo: NombreTabla

[TabFormIndependiente]

2.- Formulario NombreFormulario

Crear Formulario Independiente

  • Formulario: NombreFormulario
    • Cuadro de texto - Nombre: NombreCuaTexto1
    • Cuadro de texto - Nombre: NombreCuaTexto2
    • Cuadro de texto - Nombre: NombreCuaTexto3
    • Botón de comando
      • Nombre: Enviar
      • Título: &Enviar

Vista Diseño

[Vista-Diseño]

Vista Formulario

[Vista-Formulario]

3.- Enviar datos a la tabla

Enviar datos a la tabla desde formulario independiente.

Al pulsar botón Enviar, la información que hay en los diferentes cuadros de texto, sean guardados en la tabla NombreTabla.

  • Botón de comando
    • Nombre: Enviar
    • Título: &Enviar
    • Al hacer clic: [Procedimiento de evento]
Private Sub Enviar_Click()
    'Declaramos variable
    Dim insertaReg As String
    'Para que la información vaya a la tabla usaremos SQL
    'En la variable almacenamos la instrucción SQL
    insertaReg = "INSERT INTO NombreTabla(NombreCampo1,NombreCampo2,NombreCampo3) VALUES (NombreCuaTexto1.Value,NombreCuaTexto2.Value,NombreCuaTexto3.Value)"
    'Ejecuta la acción al pulsar botón
    DoCmd.RunSQL (insertaReg)
    'Mensaje de que el registro ha sido guardado
    MsgBox "El registro ha sido grabado"
End Sub
[Enviar-datos]

4.- Borrar los registros al pulsar enviar

Una vez que se pulse el botón Enviar, el formulario borrara los registros y el cursor se sitúa en el primer campo.

Private Sub Enviar_Click()
    'Declaramos variable
    Dim insertaReg As String
    'Para que la información vaya a la tabla usaremos SQL
    'En la variable almacenamos la instrucción SQL
    insertaReg = "INSERT INTO NombreTabla(NombreCampo1,NombreCampo2,NombreCampo3) VALUES (NombreCuaTexto1.Value,NombreCuaTexto2.Value,NombreCuaTexto3.Value)"
    'Ejecuta la acción al pulsar botón
    DoCmd.RunSQL (insertaReg)
    'Mensaje de que el registro ha sido guardado
    MsgBox "El registro ha sido grabado"
    'Limpiamos los campos llevándolos a valor nulo
    NombreCuaTexto1.Value = Null
    NombreCuaTexto2.Value = Null
    NombreCuaTexto3.Value = Null
    'Para que el cursor se situé nuevamente en el NombreCuaTexto1
    NombreCuaTexto1.SetFocus
End Sub

5.- Crear campos obligatorios

Justo después de la instrucción SQL y antes de la ejecución de la instrucción, la cual se encarga de enviar la información a la tabla. Insertamos un condicional.

Private Sub Enviar_Click()
    'Declaramos variable
    Dim insertaReg As String
    'Para que la información vaya a la tabla usaremos SQL
    'En la variable almacenamos la instrucción SQL
    insertaReg = "INSERT INTO NombreTabla(NombreCampo1,NombreCampo2,NombreCampo3) VALUES (NombreCuaTexto1.Value,NombreCuaTexto2.Value,NombreCuaTexto3.Value)"
    'Si no están vacío los campos entonces
    If Not IsNull(NombreCuaTexto1) And Not IsNull(NombreCuaTexto2) And Not IsNull(NombreCuaTexto3) Then
        'Si se cumple la condición ejecutamos la instrucción
        'Ejecuta la acción al pulsar botón
        DoCmd.RunSQL (insertaReg)
        'Mensaje de que el registro ha sido guardado
        MsgBox "El registro ha sido grabado"
        'Limpiamos los campos llevándolos a valor nulo
        NombreCuaTexto1.Value = Null
        NombreCuaTexto2.Value = Null
        NombreCuaTexto3.Value = Null
        'Para que el cursor se situé nuevamente en el NombreCuaTexto1
        NombreCuaTexto1.SetFocus
        'El color de fondo de los campos obligatorios será blanco
        NombreCuaTexto1.BackColor = vbWhite
        NombreCuaTexto2.BackColor = vbWhite
        NombreCuaTexto3.BackColor = vbWhite
    'caso contrario, devolvemos el puntero al campo obligatorio que está vacío y coloreamos el fondo de color rojiso.
    Else
        'Si el NombreCuaTexto1 esta vacío entonces
        If IsNull(NombreCuaTexto1) Then
            'Color del fondo
            NombreCuaTexto1.BackColor = RGB(255, 215, 215)
            'Coloca el cursor en el NombreCuaTexto1
            NombreCuaTexto1.SetFocus
        'Pero si el NombreCuaTexto2 está vacío entonces
        ElseIf IsNull(NombreCuaTexto2) Then
            'Color del fondo
            NombreCuaTexto2.BackColor = RGB(255, 215, 215)
            'Coloca el cursor en el NombreCuaTexto2
            NombreCuaTexto2.SetFocus
        'Pero si el NombreCuaTexto3 está vacío entonces
        ElseIf IsNull(NombreCuaTexto3) Then
            'Color del fondo
            NombreCuaTexto3.BackColor = RGB(255, 215, 215)
            'Coloca el cursor en el NombreCuaTexto3
            NombreCuaTexto3.SetFocus
        'Cerramos condicional
        End If
    'Cerramos condicional
    End If
End Sub
[Campos-obligatorios]

6.- Etiquetas indicativas

Uso de etiquetas indicativas de campos obligatorio

[Etiquetas-indicativas]

Insertamos tres etiquetas a un lado de los campos de texto

EtiquetaNombreTítulo
1EtiqCampo1Requerido
2EtiqCampo2Requerido
3EtiqCampo3Requerido
  • Al abrir formulario: [Procedimiento de evento]
Private Sub Form_Open(Cancel As Integer)
    'Ocultamos las etiquetas
    EtiqCampo1.Visible = False
    EtiqCampo2.Visible = False
    EtiqCampo3.Visible = False
End Sub
[Etiquetas-indicativas-ocultas]
  • Botón de comando: Enviar
    • Al hacer clic: [Procedimiento de evento]
Private Sub Enviar_Click()
    'Declaramos variable
    Dim insertaReg As String
    'Para que la información vaya a la tabla usaremos SQL
    'En la variable almacenamos la instrucción SQL
    insertaReg = "INSERT INTO NombreTabla(NombreCampo1,NombreCampo2,NombreCampo3) VALUES (NombreCuaTexto1.Value,NombreCuaTexto2.Value,NombreCuaTexto3.Value)"
    'Si no están vacío los campos entonces
    If Not IsNull(NombreCuaTexto1) And Not IsNull(NombreCuaTexto2) And Not IsNull(NombreCuaTexto3) Then
        'Si se cumple la condición ejecutamos la instrucción
        'Ejecuta la acción al pulsar botón
        DoCmd.RunSQL (insertaReg)
        'Mensaje de que el registro ha sido guardado
        MsgBox "El registro ha sido grabado"
        'Limpiamos los campos llevándolos a valor nulo
        NombreCuaTexto1.Value = Null
        NombreCuaTexto2.Value = Null
        NombreCuaTexto3.Value = Null
        'Para que el cursor se situé nuevamente en el NombreCuaTexto1
        NombreCuaTexto1.SetFocus
        'El color de fondo de los campos obligatorios será blanco
        NombreCuaTexto1.BackColor = vbWhite
        NombreCuaTexto2.BackColor = vbWhite
        NombreCuaTexto3.BackColor = vbWhite
        'Ocultamos las etiquetas
        EtiqCampo1.Visible = False
        EtiqCampo2.Visible = False
        EtiqCampo3.Visible = False
    'caso contrario, devolvemos el puntero al campo obligatorio que está vacío y coloreamos el fondo de color rojiso.
    Else
        'Si el NombreCuaTexto1 esta vacío entonces
        If IsNull(NombreCuaTexto1) Then
            'Color del fondo
            NombreCuaTexto1.BackColor = RGB(255, 215, 215)
            'Coloca el cursor en el NombreCuaTexto1
            NombreCuaTexto1.SetFocus
            'Muestra etiqueta
            EtiqCampo1.Visible = True
        'Pero si el NombreCuaTexto2 está vacío entonces
        ElseIf IsNull(NombreCuaTexto2) Then
            'Color del fondo
            NombreCuaTexto2.BackColor = RGB(255, 215, 215)
            'Coloca el cursor en el NombreCuaTexto2
            NombreCuaTexto2.SetFocus
            'Muestra etiqueta
            EtiqCampo2.Visible = True
        'Pero si el NombreCuaTexto3 está vacío entonces
        ElseIf IsNull(NombreCuaTexto3) Then
            'Color del fondo
            NombreCuaTexto3.BackColor = RGB(255, 215, 215)
            'Coloca el cursor en el NombreCuaTexto3
            NombreCuaTexto3.SetFocus
            'Muestra etiqueta
            EtiqCampo3.Visible = True
        'Cerramos condicional
        End If
    'Cerramos condicional
    End If
End Sub
[Etiquetas-indicativas-ocultas]

7.- Color del campo según estado

A cada uno de los campos obligatorio, Después de actualizar, le diremos que el fondo será de color rojo si pulso el botón enviar y está vacío, si no está vacío será de color verde.

  • Después de actualizar: [Procedimiento de evento]
Private Sub NombreCuaTexto1_AfterUpdate()
    'Si el campo no esta vacio entonce
    If Not IsNull(NombreCuaTexto1) Then
        'El fondo del cuadro de texto sera verde
        NombreCuaTexto1.BackColor = RGB(225, 255, 225)
        'Oculto la etiqueta EtiqCampo1
        EtiqCampo1.Visible = False
    'Caso contrario
    Else
        'El fondo del cuadro de texto será blanco
        NombreCuaTexto1.BackColor = RGB(255, 255, 255)
    'Cerramos el condicional
    End If
End Sub
[Color-del-campo]

8.- Botón Borrar/Limpiar formulario

  • Botón de Comando
    • Nombre: Borrar
    • Título: &Borrar
    • Al hacer clic: [Procedimiento de evento]
Private Sub Borrar_Click()
    'Borramos el contenido de los campos
    NombreCuaTexto1.Value = Null
    NombreCuaTexto2.Value = Null
    NombreCuaTexto3.Value = Null
    'Enviamos el cursor al primer campo
    NombreCuaTexto1.SetFocus
    'Oculto las etiquetas
    EtiqCampo1.Visible = False
    EtiqCampo2.Visible = False
    EtiqCampo3.Visible = False
    'El color de fondo de los campos obligatorios será blanco
    NombreCuaTexto1.BackColor = vbWhite
    NombreCuaTexto2.BackColor = vbWhite
    NombreCuaTexto3.BackColor = vbWhite
End Sub
[Borrar/Limpiar]

Macros 25/11/2022

Las macros permiten automatizar tareas frecuentes y/o repetitivas.

Tipos de macros:

Crear una Macro independiente

Para crear una Macro vamos a la pestaña Crear y pulsamos sobre el botón Crear Macro [Botón-crear-macro]

Se nos abre la ventana de creación de Macros

[Ventana-crear-macro]

Nos encontramos con un desplegable que contiene una lista de las Macros más comunes

[Lista-de-macro]

Para ver todas las Macros incluyendo las Macros de riesgo, pulsamos el botón Mostrar todas las acciones [Mostrar-todas-las-macro]

El botón Catálogo de acciones [Botón-Catálogo-de-acciones], nos abre el Panel de acciones

[Panel-de-acciones]

Para construir una Macro

Desplegamos la Lista de Macros, seleccionamos la Macro AbrirTabla y se nos despliegan los argumentos de esa Macro

[Argumentos-AbrirTabla]
  • El primer argumento es Nombre de la tabla: seleccionamos Formulario
  • El Segundo argumento es Vista: seleccionamos Hoja de datos
  • El tercer argumento es Modo de datos: seleccionamos Solo lectura
[Argumentos-AbrirTabla]
  • Pulsamos botón Guardar [Botón-Guardar] y en Guardar como: ConsultaTablaCliente
[Guardar-como]
  • Nos aparece en la ventana de objetos
[Ventana-Objetos]

Esta es una Macro independiente la cual puede ser usada en varios formularios. Como ejemplo:

  • Botón de comando
    • Nombre: listaClientes
    • Título: Ver lista clientes
    • Al hacer clic: ConsultaTablaCliente

Crear una Macro asociada

Como ejemplo, abrimos nuestro formulario pedidoForm en Vista Diseño e insertamos un Botón de comando.

  • Botón de comando
    • Nombre: VerClientes
    • Titulo: Ver clientes
    • Al hacer clic: Pulsamos el botón de tres puntos [Botón-tres-puntos]

Se nos abre el asistente donde seleccionamos Generador de Macros

[Elegir-generador]

Se nos abre el generador de macros.

[Generador-de-macros]

En la lista de Macros seleccionamos AbrirTabla y el generador nos muestra los argumentos, donde seleccionamos:

  • Nombre de la tabla: clientes
  • Vista: Hoja de datos
  • Modo de datos: solo lectura
[Argumentos]

Pulsamos botón Guardar [Botón-Guardar], guardamos los cambios realizados, la macro se guarda incrustada en el objeto

[Macro-incrustada]

Macros condicionales (Macro con 1 condición)

Como ejemplo utilizaremos el formulario productos, donde aplicaremos un condicional sobre el precio, que nos avise que su valor esta bajo los quinientos bolívares.

  1. Definir si va hacer una macro incrustada o asociada, en este caso será una macro incrustada ya que no tendrá más ninguna utilidad.
  2. Cuando deseo que se ejecute?. Deseo que se ejecute al navegar por el formulario, que me avise cada vez que pase por un registro.
  3. El evento del formulario en este caso es Al activar registro. Pulsamos botón de tres puntos [Botón-tres-puntos].
  4. En el asistente elegimos Generador de macros
[Elegir-generador]
  1. Se nos abre el Generador de macros.
[Generador-de-macros]
  1. En la lista de acciones seleccionamos Si.
[Acción-si]
  1. Pulsamos botón de la barita mágica [Botón-barita-mágica] para invocar el Generador de expresiones.
  2. En el Generador de expresiones, nos aseguramos que en la ventana de Elementos de expresión este seleccionado el formulario productos y en la ventana Categorías de expresión hacemos doble clic sobre el campo precio.
[Generador-de-expresiones]
  1. Completamos la expresión diciendo que precio es menor a 500 y pulsamos el botón Aceptar.
[Valor-expresion]
  1. La condición queda lista
[Condición]
  1. En el desplegable de las acciones, escogemos CuadroDeMensaje.
[Acción-CuadroDeMensaje]
  1. Siendo el argumento Mensaje el único obligatorio, escribimos Ojo! Artículo fuera de rango y en el argumento Título le ponemos un título a la barra del emergente Cuidado….
[Argumentos-del-CuadroDeMensaje]
  1. Guardamos los cambios.

Cuando navegamos por los registros del formulario productos, el mensaje será visible cada vez que encuentre un artículo con el precio menor a los 500, no pudiendo realizar ninguna otra acción mientras el mensaje este abierto.

[CuadroDeMensaje]

Modificar/Visualizar Macro incrustada (Macro con 2 condiciones)

Para modificar o visualizar una macro:

  1. Abrimos el Formulario en Vista Diseño
  2. En la Hoja de propiedades seleccionamos la pestaña Eventos
  3. Ubicamos la macro incrustada en Al activar registro: [Macro incrustada]
  4. Pulsamos el botón de tres punto [Botón-tres-puntos].
[Vista-Diseño]
  1. Se nos abre el Generador de macros.
[Generador-de-macros]
  1. En caso de que la prueba lógica no sea verdad, quiero que haga otra cosa. Pulsamos en la acción de la macro para habilitar las opciones Agregar Sí no y Agregar O si.
[Botones-Agregar]
  1. Pulsamos el elance Agregar Si no.
[Bloque-Si]
  1. En el desplegable del bloque Si no seleccionamos la acción CuadroDeMensaje.
[CuadroDeMensaje]
  1. En el argumento Mensaje escribimos El articulo supera los 500.
[CuadroDeMensaje]
  1. Guardamos los cambios realizados.

Esta acción ocaciona, que el navegar por el formulario sea un poco engorroso, pero vale como ejemplo la acción. Antes presentava un mensaje solo en los artículos con valor menor a 500. Ahora genera un mensaje para los articulos mayores a 500.

Cumple con la condición del primer bloque

[CuadroDeMensaje]

Como no cumple con el primer bloque de la condicion muestra el segundo bloque

[CuadroDeMensaje]

Macro con 3 condiciones

Siguiendo el ejemplo que venimos trabajando, tenemos como primera condición precio menor a 500, y como segunda condición precio es mayor a 500. Pues bien ahora quiero como tercera condición que me avise cuando precio sea mayor a los 1000.

  1. Abrimos el formulario productos en Vista Diseño
  2. Pulsamos el botón tres puntos [Botón-tres-puntos], en la Macro incustada para abrir el Generador de Macros.
[Vista-Diseño]
  1. Pulsamos sobre la primera condición de la macro para que se habilite la opcion Agregar O si.
[Agregar-O-si]
  1. Pulsamos sobre la opcion Agregar O si.
[Agregar-O-si]
  1. Pulsamos la varita magica [Botón-barita-mágica] para abrir el Generador de expreciones y le digo precio > 1000 y pulso Aceptar.
[Generador-de-expresiones]
  1. En el desplegable Agregar nueva acción, seleccionamos CuadroDeMensaje y en el argumento Mensaje escribimos El precio supera los 1000.
[Agregar-nueva-acción]
  1. Guardamos los cambios realizados.

Al navegar por los registros del formulario, el condicional de la macro incrustada nos dará tres mensajes:

  1. Si el valor de precio es menor a 500, muestra el mensaje Ojo! Artículo fuera de rango.
  2. O si el valor de precio es mayor a 1000, muestra el mensaje El precio supera los 1000.
  3. Si no cumple con las condiciones anteriores, muestra el mensaje El articulo supera los 500.
[Supera-los-mil]

Macro Autoexec

Es una Macro que se ejecuta al abrir una base de datos. Por lo general se utilizan para abrir formulario, código VBA, para abrir informes, para abrir tablas, etc. Ver ejemplo Longeo

Longeo

Crear formulario de inicio donde el usuario se va longear y dependiendo del usuario que se haya longeado, haremos que se habrá un formulario diferente.

Como ejemplo tendremos tres usuarios: María, Pedro y Antonio.

Si se longea:

  • María se abrirá el formulario clientes
  • Pedro se abrirá el formulario pedidoFor
  • Antonio se abrirá el formulario productos

1.- Crear formulario de longeo (login)

  • Nombre del formulario: login
  • Etiqueta de Cuadro de texto
    • Título: Usuario:
  • Cuadro de texto
    • Nombre: CampoLogin
  • Botón de comando
    • Nombre: BotonLogin
    • Título: Login
    • Al hacer clic: Pulsamos el botón de los tres puntos [Botón-tres-puntos]

Creamos una Macro incrustada

a) En el asistente elegimos Generador de macros y pulsamos Aceptar.

[Elegir-generador]

b) De la lista Agregar nueva acción seleccionamos .

[Agregar-nueva-acción]

b.1) Pulsamos la barita magica [Botón-barita-mágica] para abrir el Generador de expresiones.

[Condición-Sí]

b.2) En el Generador de expresiones. Escribimos si [CampoLogin] = 'María' y pulsamos Aceptar.

[Generador-de-expresiones]

b.3) Construida la condición , agregamos la acción AbrirFormulario.

[Condición-Sí]

b.4) El valor de los argumentos de la acción AbrirFormulario son:

  • Nombre del formulario: clientes
  • Vista: Formulario
  • Modo de la ventana: Normal
[AbrirFormulario]

c) Pulsamos en Agregar O si, y pulsamos la barita magica [Botón-barita-mágica] Para abrir el Generador de expresiones.

[Condición-O-si]

c.1) En el Generador de expresiones. Escribimos si [CampoLogin] = 'Pedro'. Pulsamos Aceptar.

[Generador-de-expresiones]

c.2) Construida la condición O sí, agregamos la acción AbrirFormulario.

[Condición-O-si]

c.3) El valor de los argumentos de la acción AbrirFormulario son:

  • Nombre del formulario: pedidoFor
  • Vista: Formulario
  • Modo de la ventana: Normal
[AbrirFormulario]

d) Pulsamos en Agregar O si, y pulsamos la barita magica [Botón-barita-mágica] Para abrir el Generador de expresiones

[Condición-O-si]

d.1) En el Generador de expresiones. Escribimos si [CampoLogin] = 'Antonio'. Pulsamos Aceptar.

[Generador-de-expresiones]

d.2) Construida la condición O sí, agregamos la acción AbrirFormulario.

[Condición-O-si]

d.3) El valor de los argumentos de la acción AbrirFormulario son:

  • Nombre del formulario: productos
  • Vista: Formulario
  • Modo de la ventana: Normal
[AbrirFormulario]

e) Guardamos los cambios realizados.

[Al-hacer-clic]

2.- Crear Macro independiente (autoexec)

  • Vamos a la pestaña Crear y pulsamos sobre el botón Crear Macro [Botón-crear-macro].
  • De la lista Agregar nueva acción seleccionamos AbrirFormulario.
  • En los Argumentos:
    • Nombre del formulario: Login
    • Vista: Formulario
    • Modo de la ventana: Normal
  • Hay que guardarla con el nombre: autoexec

Lo que logramos con esta macro, es que cuando abramos nuestra base de datos, se abra el formulario Login

Macro AplicarFiltro

  1. Abrimos nuestro formulario productos Vista diseño
  2. En propiedades del formulario
    • Botones de navegación:
    • Al activar registro: Elimino la [Macro incrustada] que avisa la condición del precio.
  3. Insertamos Encabezado del formulario
    • Etiqueta
      • Título: Productos
    • Etiqueta de cuadro combinado
      • Título: Filtrar:
    • Cuadro combinado
      • Nombre: FiltrarSeccion
      • Origen de la fila: "CONFECCION";"DEPORTES";"FERRETERIA";"JUGUETERIA"
      • Tipo de origen de la fila: Lista de valores
      • Al hacer clic: Pulsamos el botón de los tres puntos [Botón-tres-puntos] y se abre el asistente Elegir generador, seleccionamos Generador de macros y pulsamos Aceptar.
[Elegir-generador]
  1. Procedemos a crear nuestra Macro Filtro
[Generador-de-macros]
    • En Agregar nueva acción, seleccionamos
[Acción-si]
    • La expresión del condicional será [FiltrarSeccion]='CONFECCION'.
[Expresión-del-condicional]
    • Agregamos la acción AplicarFiltro
[AplicarFiltro]
    • Argumentos de AplicarFiltro:
      • Nombre del filtro: Se refiere al nombre de una consulta.
      • Condición WHERE = [productos]![seccion]='CONFECCION'
        [NombreDeLaTabla]![NombreDelCampoAFiltrar]='ValorAFiltrar'
      • Nombre del control: Especificar el nombre del control correspondiente al subformulario o subinforme que se filtrará.
[Condición-WHERE]
    • Pulsamos en Agregar O sí
[Agregar-O-si]
    • La expresión del condicional será [FiltrarSeccion]='DEPORTES'.
[Expresión-del-condicional]
    • Agregamos la acción AplicarFiltro.
[AplicarFiltro]
    • Argumentos de AplicarFiltro:
      • Condición WHERE = [productos]![seccion]='DEPORTES'
[Condición-WHERE]
    • Pulsamos en Agregar O sí
[Agregar-O-si]
    • La expresión del condicional será [FiltrarSeccion]='FERRETERIA'.
[Expresión-del-condicional]
    • Agregamos la acción AplicarFiltro.
[AplicarFiltro]
    • Argumentos de AplicarFiltro:
      • Condición WHERE = [productos]![seccion]='FERRETERIA'
[Condición-WHERE]
    • Pulsamos en Agregar O sí
[Agregar-O-si]
    • La expresión del condicional será [FiltrarSeccion]='JUGUETERIA'.
[Expresión-del-condicional]
    • Agregamos la acción AplicarFiltro.
[AplicarFiltro]
    • Argumentos de AplicarFiltro:
      • Condición WHERE = [productos]![seccion]='JUGUETERIA'
[Condición-WHERE]
    • Guardamos los cambios realizados
[Formulario-productos]

Convertir Macro a Visual Basic

1.- Seleccionamos la Macro a convertir y la abrimos vista Diseño

Macro

2.- En la pestaña Diseño pulsamos Convertir macros a Visual Basic

Botón

3.- Nos muestra el cuadro de dialogo siguiente donde pulsamos Convertir

Convertir

4.- El asistente nos avisa que la conversión ha finalizado y pulsamos Aceptar

Finalizado

5.- Macro convertida.

Visual-Basic

Tipo de datos 29/11/2022

Texto corto

Uso: Para caracteres alfanuméricos, incluido texto, o texto y números, que no se utilicen en cálculos (por ejemplo, un Id. de producto).

Tamaño: Hasta 255 caracteres.

Texto largo

Uso: Para texto con una longitud de más de 255 caracteres o que utilice formato enriquecido. Los ejemplos incluyen notas, descripciones extensas y párrafos con formato de texto, como negrita o cursiva.

Use la propiedad Formato del texto de un campo Texto largo para especificar si el campo es compatible con el texto con formato.

Establezca la propiedad Sólo anexar de un campo Texto largo en para conservar versiones anteriores del valor del campo cuando éste cambie.

Tamaño: Hasta 1 gigabyte de caracteres o 2 gigabytes de almacenamiento (2 bytes por carácter), de lo que es posible mostrar 65.535 caracteres en cualquier control único.

NOTA El tamaño máximo de un archivo de base de datos de Office Access 2007 es 2 gigabytes.

Número

Uso: Para almacenar valores numéricos (enteros o fraccionarios) que se van a utilizar en cálculos, excepto valores monetarios.

NOTA Para los valores monetarios use el tipo de datos Moneda.

Tamaño: 1, 2, 4, 8 o 12 bytes (16 bytes cuando se usa en un Id. de réplica)

Fecha/Hora

Uso: Para almacenar valores de fecha y hora. Observe que cada valor almacenado incluye un componente de fecha y uno de hora.

Tamaño: 8 bytes

Moneda

Uso: Para almacenar valores monetarios (moneda).

Tamaño: 8 bytes

Autonumeración

Uso: Para generar valores exclusivos que se puedan utilizar como clave principal que Access inserta cuando se agrega un registro. Observe que los campos Autonumérico pueden incrementarse secuencialmente, en un incremento concreto o asignado aleatoriamente.

Tamaño: 4 bytes (16 bytes cuando se utiliza en un Id. de réplica).

Sí/No

Uso: Para valores booleanos: Sí/No, Verdadero/Falso o Activado/Desactivado.

Tamaño: 1 bit (0,125 bytes).

Objeto OLE

Uso: Para almacenar objetos OLE de otros programas de Microsoft Windows.

Tamaño: Hasta 1 gigabyte.

Datos adjuntos

Uso: Para almacenar archivos binarios (es decir, archivos que no se pueden leer mediante un editor de texto), como imágenes digitales (fotos y gráficos) o archivos creados mediante otros productos de Microsoft Office.

En un campo Datos adjuntos es posible adjuntar más de un archivo por registro.

Tamaño: Datos adjuntos comprimidos, 2 gigabytes. Datos adjuntos sin comprimir, aproximadamente 700 kb, según la medida en que puedan comprimirse los datos adjuntos.

NOTA El tamaño máximo de un archivo de base de datos de Office Access 2007 es 2 gigabytes.

Hipervínculo

Uso: Para almacenar hipervínculos, que proporcionan acceso con un solo clic a páginas Web mediante una dirección URL (localizador uniforme de recursos) o a archivos mediante un nombre en formato UNC (convención de nomenclatura universal). También se pueden establecer vínculos con objetos de Access almacenados en una base de datos.

Tamaño: Hasta 1 gigabyte de caracteres o 2 gigabytes de almacenamiento (2 bytes por carácter), de lo que es posible mostrar 65.535 caracteres en cualquier control único.

NOTA El tamaño máximo de un archivo de base de datos de Office Access 2007 es 2 gigabytes.

Asistente para búsquedas

Uso: Para iniciar el Asistente para búsquedas a fin de poder crear un campo que utilice un cuadro combinado para buscar un valor en otra tabla, consulta o lista de valores. Observe que en realidad el Asistente para búsquedas no es un tipo de datos.

Tamaño: Si el campo de búsqueda está enlazado a una tabla o consulta, es el tamaño de la columna enlazada.

Si el campo de búsqueda no está enlazado a otra columna (y almacena una lista de valores), es el tamaño del campo Texto utilizado para almacenar la lista.

Login con restricciones 21/10/2023

  1. Tabla: tabUsuarios
    1. Campo: IdUsuario
      1. Tipo de datos: Autonumeración
      2. Clave Principal
    2. Campo: NombreApellido
      1. Tipo de datos: Texto corto
      2. Requerido: Sí
    3. Campo: Usuario
      1. Tipo de datos: Texto corto
      2. Requerido: Sí
    4. Campo: Password
      1. Tipo de datos: Texto corto
      2. Máscara de entrada: Contraseña
      3. Requerido: Sí
  2. Tabla: tabFormularios
    1. Campo: IdFormulario
      1. Tipo de datos: Autonumeración
      2. Clave Principal
    2. Campo: FormularioNombre
      1. Tipo de datos: Texto corto
      2. Requerido: Sí

Agregamos todos los formularios

  1. Tabla: tabPermisos
    1. Campo: IdUsuario
      1. Tipo de datos: Número
      2. Requerido: Sí
    2. Campo: IdFormulario
      1. Tipo de datos: Número
      2. Requerido: Sí

Access nos pregunta si deseamos una clave principal, al cual le decimos que no

  1. Relaciones
  1. Módulo: ModLogin

Option Compare Database
Option Explicit

Public UserLog As String

Public Function searchUser(Usuario As TextBox, Password As TextBox) As Byte
    Dim rst As DAO.Recordset, SQL As String

    On Error GoTo ManipularError
    If IsNull(Usuario) Or IsNull(Password) Then Exit Function
    SQL = "SELECT Count(*) AS Total " _
        & "FROM [tabUsuarios] " _
        & "WHERE [Usuario] = '" & Replace(Usuario, "'", "''") & "' AND [Password] = '" & Replace(Password, "'", "''") & "'"
    Set rst = CurrentDb.OpenRecordset(SQL, dbOpenForwardOnly)
    searchUser = rst!Total
    UserLog = Usuario
    rst.Close: Set rst = Nothing
    Exit Function

ManipularError:
    If Not rst Is Nothing Then rst.Close: Set rst = Nothing
    MsgBox Err.Description, vbCritical, "Atención"
End Function

Public Function searchUserName() As String
    Dim rst As DAO.Recordset, SQL As String

    On Error GoTo ManipularError
    SQL = "SELECT NombreApellido " _
        & "FROM [tabUsuarios] " _
        & "WHERE [Usuario] = '" & UserLog & "'"
        Debug.Print SQL
    Set rst = CurrentDb.OpenRecordset(SQL, dbOpenForwardOnly)
    searchUserName = rst!NombreApellido
    rst.Close: Set rst = Nothing
    Exit Function
    
ManipularError:
    If Not rst Is Nothing Then rst.Close: Set rst = Nothing
    MsgBox Err.Description, vbCritical, "Atención"
End Function

Public Function searchPermission(NameForm As String) As Boolean
    Dim rst As DAO.Recordset, SQL As String
    
    On Error GoTo ManipularError
    SQL = "SELECT Count(*) AS Total " _
        & "FROM (tabFormularios AS F INNER JOIN tabPermisos AS P ON F.IdFormulario = P.IdFormulario) INNER JOIN tabUsuarios AS U ON P.IdUsuario = U.IdUsuario " _
        & "WHERE F.FormularioNombre = '" & NameForm & "' AND U.Usuario = '" & UserLog & "'"
    Set rst = CurrentDb.OpenRecordset(SQL, dbOpenForwardOnly)
    If rst!Total > 0 Then searchPermission = True
    rst.Close: Set rst = Nothing
    Exit Function
    
ManipularError:
    If Not rst Is Nothing Then rst.Close: Set rst = Nothing
    MsgBox Err.Description, vbCritical, "Atención"
End Function

Public Function validateForm(NameForm As String) As Boolean
    If Not CurrentProject.AllForms(NameForm).IsLoaded Then validateForm = True
End Function

  1. Formulario: forLogin
    1. Propiedades Formulario
      1. Título: INICIO DE SESIÓN
      2. Emergente: Si
      3. Modal: Si
      4. Centrado automático: Si
      5. Estilo de los bordes: Diálogo
      6. Selectores de registros: No
      7. Botones de desplazamiento: No
      8. Barras de desplazamiento: Ninguna
    2. Cuadro de texto
      1. Etiqueta > Título: Usuario
      2. Cuadro de texto > Nombre: txtUsuario
    3. Cuadro de texto
      1. Etiqueta > Título: Contraseña
      2. Cuadro de texto > Nombre: txtPassword
    4. Botón de comando
      1. Nombre: btnEntrar
      2. Título: Entrar
      3. Al hacer clic: [Procedimiento de evento]

Private Sub btnEntrar_Click()
    'Llamamos la función serachUser que se encuentra en el módulo ModLogin
    If Not searchUser(txtUsuario, txtPassword) = 1 Then
        MsgBox "Usuario o Contaseña Incorrecto", vbCritical, Me.Caption 'Me.Caption regresa el nombre del formulario
    Else
        Me.Visible = False
        DoCmd.OpenForm "forInicio"
    End If
End Sub

  1. Formulario: forInicio
    1. Propiedades Formulario
      1. Título: INICIO
      2. Emergente: Sí
      3. Modal: Sí
      4. Centrado automático: Sí
      5. Estilo de los bordes: Diálogo
      6. Selectores de registro: No
      7. Botones de desplazamiento: No
      8. Barras de desplazamiento: Ninguna
      9. Al abrir: [Procedimiento de evento]

Private Sub Form_Open(Cancel As Integer)
    'No permite abrir forInicio sin ser validado el Login
    'Función dentro del módulo ModLogin
    Cancel = validateForm("forLogin")
End Sub

      1. Al cerrar: [Procedimiento de evento]

Private Sub Form_Close()
    'Cerramos el formulario forLogin
    'Ya que al logeanos, éste se encuentra oculto
    DoCmd.Close acForm , "forLogin"
End Sub

    1. Botón de comando
      1. Nombre: btnCerrarSesion
      2. Título: Cerrar sesión
      3. Al hacer clic: [Procedimiento de evento]

Private Sub btnCerrarSesion_Click()
    DoCmd.Close acForm, Me.Name
    DoCmd.OpenForm "forLogin"
End Sub

    1. Botón de comando
      1. Nombre: btnUsuarios
      2. Título: Usuarios
    2. Botón de comando
      1. Nombre: btnReportes
      2. Título: Reportes
    3. Botón de comando
      1. Nombre: btnVentas
      2. Título: Ventas
    4. Botón de comando
      1. Nombre: btnInventario
      2. Título: Inventario
    5. Cuadro de texto
      1. Origen del control: =searchUserName()
      2. Estilo de los bordes: Transparente
      3. Activado: No
      4. Bloqueado: Si
  1. Formulario: forUsuarios y forUsuariosSub
    1. Pestaña Crear > Asistente para formularios
      1. Seleccionamos tabla tabUsuarios > Agregamos todos los campos
      1. Seleccionamos la tabla tabPermisos > Agregamos todos los campos
      1. Pulsamos Siguiente > Seleccionamos Formulario con subformulario
      1. Pulsamos Siguiente > Seleccionamos Hoja de datos
      1. Pulsamos Siguiente
      1. Pulsamos Siguiente > El asistente nos pide los títulos del formulario y subformulario
        1. Título formulario: forUsuarios
        2. Título subformulario: forUsuariosSub
        3. Pulsamos Finalizar
      1. Formulario: forUsuarios
        1. Propiedades Formulario
          1. Título: USUARIOS
          2. Emergente: Si
          3. Modal: Si
          4. Centrado automático: Si
          5. Estilo de bores: Diálogo
          6. Selectores de registro: No
          7. Barras de desplazamiento: Ninguna
        2. Propiedades de los cuadro de texto: NombreApellido, Usuario y Password
          1. Barras de desplazamiento: Ninguna
          2. Comportamiento de la tecla entrar: Predeterminado
      2. Formulario: forUsuariosSub
        1. Propiedades Formulario
          1. Vista predeterminada: Formularios continuos
          2. Botones de desplazamiento: No
          3. Barras de desplazamiento: solo vertical
        2. Eliminamos el campo de texto: IdUsuario
        3. Eliminamos la etiqueta del cuadro combinado IdFormulario
        4. Seleccionamos el campo de texto: IdFormulario
          1. Botón derecho del mouse > Cambiar a > Cuadro combinado
            1. Propiedades del campo
              1. Origen de la fila: tabFormularios
              2. Limitar a la lista: Sí
              3. Número de columnas: 2
              4. Ancho de columnas: 0cm;3cm
              5. Ancho: 7cm
              6. Alto: 0,556cm
              7. Superior: 0cm
              8. Izquierda: 0cm
        5. Propiedades Detalle
          1. Alto: 0,556cm
    1. Formulario: forReportes, forVentas, forInventario
      1. Propiedades Formulario
        1. Título: REPORTES y/o VENTAS y/o INVENTARIO
        2. Emergente: Sí
        3. Modal: Sí
        4. Centrado automático: Si
        5. Estilo de los bordes: Diálogo
        6. Selectores de registro: No
        7. Botones de desplazamiento: No
        8. Barras de desplazamiento: Ninguna
    1. Permiso al administrador
      1. Abrimos forUsuarios. Damos permiso al administrador para que tenga acceso a todos los módulos
    1. Configurar todos los formularios para que no se puedan abrir sin habernos longeado antes: forUsuarios, forUsuariosSub, forReportes, forVentas y forInventario
      1. Evento Al abrir: [Procedimiento de evento]

    Private Sub Form_Open(Cancel As Integer)
        'No permite abrir forInicio sin ser validado el Login
        'Función dentro del móduloModLogin
        Cancel = validateForm("forLogin")
    End Sub

    1. Configurar los permisos de acceso a los módulos
      1. Vista Diseño forInicio
        1. Propiedades del botón Usuarios
          1. Al hacer clic: [Procedimiento de evento]

    Private Sub btnUsuarios_Click()
        'Función que evalua si el usuario tiene permiso al módulo
        If searchPermission("forUsuarios") Then
            'Si tiene permiso abre el módulo
            DoCmd.OpenForm "forUsuarios"
        'Caso contrario muestro mensaje
        Else
            MsgBox "Usted no tiene permiso para acceder al módulo", vbCritical, Me.Caption
        End If
    End Sub

        1. Propiedades del botón Reportes
          1. Al hacer clic: [Procedimiento de evento]

    Private Sub btnReportes_Click()
        'Función que evalua si el usuario tiene permiso al módulo
        If searchPermission("forReportes") Then
            'Si tiene permiso abre el módulo
            DoCmd.OpenForm "forReportes"
        'Caso contrario muestro mensaje
        Else
            MsgBox "Usted no tiene permiso para acceder al módulo", vbCritical, Me.Caption
        End If
    End Sub

        1. Propiedades del botón Ventas
          1. Al hacer clic: [Procedimiento de evento]

    Private Sub btnVentas_Click()
        'Función que evalua si el usuario tiene permiso al módulo
        If searchPermission("forVentas") Then
            'Si tiene permiso abre el módulo
            DoCmd.OpenForm "forVentas"
        'Caso contrario muestro mensaje
        Else
            MsgBox "Usted no tiene permiso para acceder al módulo", vbCritical, Me.Caption
        End If
    End Sub

        1. Propiedades del botón Inventario
          1. Al hacer clic: [Procedimiento de evento]

    Private Sub btnInventario_Click()
        'Función que evalua si el usuario tiene permiso al módulo
        If searchPermission("forInventario") Then
            'Si tiene permiso abre el módulo
            DoCmd.OpenForm "forInventario"
        'Caso contrario muestro mensaje
        Else
            MsgBox "Usted no tiene permiso para acceder al módulo", vbCritical, Me.Caption
        End If
    End Sub