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
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
- Compartir respuesta