Crear una clase para un CRUD con DAO

Me gustaría crear, consultar, actualizar y eliminar registros utilizando un módulo de clase.

¿Alguna idea de cómo lo puedo hacer?

1 respuesta

Respuesta
1

Martha es la primera vez que veo una pregunta de este tipo en este foro. Utilizo 2 módulos de clase.

Copie este código en un nuevo módulo de clase. Asignele el nombre clsCRUD

'Clase para hacer un CRUD con DAO
'Elborado Por:
'               EDUARDO PÉREZ FERNÁNDEZ
'Fecha       :  24/2/2023
Private rs As DAO.Recordset
Public Sub Inicializar(ByVal nombreTabla As String)
    Set rs = CurrentDb.OpenRecordset(nombreTabla, dbOpenDynaset)
End Sub
Public Function AdicionarRegistro(ParamArray datos() As Variant) As Boolean
    Dim i As Long
    If rs Is Nothing Then
        AdicionarRegistro = False
    Else
        rs.AddNew
        For i = LBound(datos) To UBound(datos)
            'Verifico si autoincremental para no tratarlo
            If Not ((rs.fields(i).Attributes And dbAutoIncrField) = dbAutoIncrField) Then
             rs(i).value = datos(i)
            End If
        Next i
        rs.Update
        AdicionarRegistro = True
        MsgBox "Registro adicionado satisfactoriamente", vbInformation, "Adicionando"
    End If
End Function
Public Function EditarRegistro(ByVal criterio As String, ParamArray datos() As Variant) As Boolean
   Dim i As Long
  If rs Is Nothing Then
     EditarRegistro = False
   Else
        rs.FindFirst criterio
        If Not rs.NoMatch Then
            rs.Edit
            For i = LBound(datos) To UBound(datos)
                If rs(i).Type = 4 Then  'Si tipo Autoincremental saltar
                  i = i + 1
                End If
                rs(i).value = datos(i)
            Next i
              rs.Update
            EditarRegistro = True
            MsgBox "Registro Editato satisfactoriamente", vbInformation, "Editando"
        Else
            EditarRegistro = False
            MsgBox "El registro NO se modificó", vbCritical, "Editando"
        End If
    End If
End Function
Public Function RetirarRegistro(ByVal criterio As String) As Boolean
    If rs Is Nothing Then
        RetirarRegistro = False
    Else
        rs.FindFirst criterio
        If Not rs.NoMatch Then
            rs.Delete
            RetirarRegistro = True
            MsgBox "Registro retirado satisfactoriamente", vbInformation, "Eliminando"
        Else
            RetirarRegistro = False
        End If
    End If
End Function
Public Sub Cerrar()
    If Not rs Is Nothing Then
        rs.Close
        Set rs = Nothing
    End If
End Sub

En esta clase están los métodos para adicionar, editar y retirar registros y el método para cerrar el recordset

Para el ejemplo voy a utilizar las siguientes tablas:

Tabla empleados

Tabla Secciones

FORMULARIO PARA ADICIONAR REGISTRO

Veamos el código del formulario:

Código en el nivel General del formulario

Option Compare Database
Option Explicit
Dim gestor As New clsCRUD
Dim clsComboSecc As New clsComboBox

Observe que creo las instancias de las clases clsCRUD y clsComboBox

Código del evento Al cargar

Private Sub Form_Load()
   gestor.Inicializar "tblempleados"
   'Combo secciones
    Set clsComboSecc.ComboBox = Me.cboSeccion
    clsComboSecc.LlenaDatos "tblsecciones", "idseccion", "seccion"
End Sub

Llamo el método Inicializar para indicar a la clase la tabla que vamos a utilizar como recordset. A continuación, lleno el cuadro combinado utilizando la clase clsComboBox.

Código del botón Guardar

Private Sub btnGrabar_Click()
    gestor.AdicionarRegistro 0, Me.cboSeccion, Me.ctlnombre, Me.ctlsueldo
End Sub

Utilizo el método AdicionarRegistro de la clase clsCRUD. Observe como verifico que el campo no sea Autonumérico para evitar error.

Código del botón Adicionar 

Private Sub btnAdicionar_Click()
    Me.cboSeccion = Null
    Me.ctlnombre = Null
    Me.ctlsueldo = Null
End Sub

Código del evento Al desactivar.

Private Sub Form_Deactivate()
  gestor.Cerrar
End Sub

FORMULARIO PARA CONSULTAR, EDITAR Y ELIMINAR 

Código a nivel de modulo del formulario para crear las instancias

Option Compare Database
Option Explicit
Dim gestor As New clsCRUD
Dim clsCombo As New clsComboBox
Dim clsComboSecc As New clsComboBox

Código evento Al cargar

Private Sub Form_Load()
   Gestor. Inicializar "tblempleados"
  'Combo para buscar empleado
    Set clsCombo.ComboBox = Me.cboEmpleado
    clsCombo.LlenaDatos "tblempleados", "idempleado", "empleado"
   'Combo secciones
    Set clsComboSecc.ComboBox = Me.cboSeccion
    clsComboSecc.LlenaDatos "tblsecciones", "idseccion", "seccion"
End Sub

Le dejo el resto del código del formulario

Private Sub btnAdicionar_Click()
    Me.cboSeccion = Null
    Me.ctlnombre = Null
    Me.ctlsueldo = Null
End Sub
Private Sub btnGrabar_Click()
   gestor.EditarRegistro "Idempleado =" & Me.cboEmpleado, "", Me.cboSeccion, Me.ctlnombre, Me.ctlsueldo
End Sub
Private Sub btnRetiar_Click()
  gestor.RetirarRegistro "Idempleado =" & Me.cboEmpleado
  Me.cboSeccion = Null
  Me.ctlnombre = Null
  Me.ctlsueldo = Null
  Me.cboEmpleado.Requery
End Sub
Private Sub cboEmpleado_AfterUpdate()
  Me.cboSeccion = DLookup("idseccion", "tblempleados", "idempleado=" & Me.cboEmpleado)
  Me.ctlnombre = DLookup("empleado", "tblempleados", "idempleado=" & Me.cboEmpleado)
  Me.ctlsueldo = DLookup("sueldo", "tblempleados", "idempleado=" & Me.cboEmpleado)
End Sub
Private Sub ctlsueldo_AfterUpdate()
  Me.btnGrabar.SetFocus
End Sub
Private Sub Form_Deactivate()
  gestor.Cerrar
End Sub

Observe cómo llamo los métodos para editar y retirar registros. 

Como puede ver crear clases nos ahorran tiempo, toda vez, que sirven para cualquier formulario y tabla. Estas clases son para trabajar con DAO, para ADO todo cambia. ADO Lo utilizo bastante para el desarrollo en Access con PostgreSQL. Muchos programadores no lo hacen y por esto no llegarán a ser desarrolladores profesionales de Access. Martha, permítame felicitarla esto indica que se encuentra en un nivel avanzado de conocimientos de VBA.

Le envíe a su correo el ejemplo, los demás usuarios del foro que lo quieran pueden solicitarlo a [email protected] 

Martha modifiqué dejando un solo formulario y adicioné en la tabla tblempleado el campo fecha de nacimiento del empleado

Igualmente, modifiqué el método EditarRegistro para no tocar el campo autonumérico.

Public Function EditarRegistro(ByVal criterio As String, ParamArray datos() As Variant) As Boolean
   Dim i As Long
  If rs Is Nothing Then
     EditarRegistro = False
   Else
        rs.FindFirst criterio
        If Not rs.NoMatch Then
            rs.Edit
            For i = LBound(datos) To UBound(datos)
                If Not ((rs.fields(i).Attributes And dbAutoIncrField) = dbAutoIncrField) Then
                 rs(i).value = datos(i)
                End If
            Next i
            rs.Update
            EditarRegistro = True
            MsgBox "Registro Editato satisfactoriamente", vbInformation, "Editando"
        Else
            EditarRegistro = False
            MsgBox "El registro NO se modificó", vbCritical, "Editando"
        End If
    End If
End Function

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas