Recuperar y buscar registros con recordset desconectado
¿Cómo se haría para obtener en un formulario la información del registro seleccionado de un cuadro combinado, la base de datos esta alojada en un servidor? Aclaro no existen tablas vinculadas.
1 respuesta
Martha su pregunta corresponde a la forma de trabajar con Access como Front End y un servidor de datos, por ejemplo, SQL Server, Oracle, MySQL, DBMaria y PostgreSQL como Back End. Personalmente utilizo PostgreSQL. Le preparé el siguiente ejemplo.
Nota: Asumo que ya sabe hacer la conexión con el servidor, en este ejemplo utilizo un DSN.
FORMULARIO
El formulario consta de 1 cuadro combinado, 1 cuadro de lista, 5 cuadros de texto para mostrar los datos del empleado, más 4 botones para desplazamiento entre registros.
Ahora, elijo un empleado del cuadro combinado.
Elijo a MARTHA TORRES y obtengo en los 4 campos de texto.
Ahora hago clic sobre el cuadro de lista en el empleado CARLOS MARTINEZ y obtengo.
EVENTOS DEL FORMULARIO
EVENTO AL CARGAR EL FORMULARIO
Private Sub Form_Load() On Error GoTo ErrorHandler Dim strSQL As String strSQL = "SELECT tblempleados.* FROM tblempleados ORDER BY empleado" Set Me.Recordset = recorset_desc(strSQL) Me.Caption = Space(20) Call carga_buscar Call carga_lista Call bloqueo ExitProcedure: Err.Clear Exit Sub ErrorHandler: Select Case Err.Number Case 0 Case Else MsgBox "Error " & Err.Number & " (" & Err.Description & ") en procedimiento " & "Form_Open" & " " & Application.VBE.ActiveCodePane.CodeModule.Name Resume ExitProcedure End Select End Sub
LLamo los eventos carga_buscar; llena la información del cuadro combinado, carga_lista; llena la información del cuadro combinado. por último, el procedimiento bloqueo para bloquear los campos de texto, aunque el recordset NO es editable.
EVENTO CARGA_BUSCAR
Sub carga_buscar() On Error GoTo ErrorHandler Set Me.cboBuscar.Recordset = recorset_desc("SELECT tblempleados.idempleado,tblempleados.empleado FROM tblempleados ORDER BY empleado") Me.Caption = Space(20) ExitProcedure: Err.Clear Exit Sub ErrorHandler: Select Case Err.Number Case 0 Case Else MsgBox "Error " & Err.Number & " (" & Err.Description & ") en procedimiento " & "Form_Open" & " " & Application.VBE.ActiveCodePane.CodeModule.Name Resume ExitProcedure End Select End Sub
EVENTO CARGA_LISTA
Sub carga_lista() On Error GoTo ErrorHandler Set Me.lstEmpleados.Recordset = recorset_desc("Select * from tblempleados") Me.Caption = Space(20) ExitProcedure: Err.Clear Exit Sub ErrorHandler: Select Case Err.Number Case 0 Case Else MsgBox "Error " & Err.Number & " (" & Err.Description & ") en procedimiento " & "Form_Open" & " " & Application.VBE.ActiveCodePane.CodeModule.Name Resume ExitProcedure End Select End Sub
EVENTO BLOQUEO
Sub bloqueo() Dim ctrl As Control For Each ctrl In Me.Controls If ctrl.ControlType = acTextBox Then ctrl.Locked = True End If Next End Sub
Si observa los 3 primeros eventos utilizan la función recordset_desc(), tiene como fin crear el recordset desconectado.
FUNCIÓN RECORSET_DESC()
Public Function recorset_desc(sql As String) As ADODB.Recordset ' Función para obtener un recordset ADO desconectado ' en este caso retorna el select pasado en el parámetro sql ' Sirve como origen de datos para formulario, cuadro combinado y cuadro de lista Dim strSQL As String Dim rs As ADODB.Recordset 'Valido la conexión con el servidor If ConexionSQL = False Then Call MsgBox("Se ha perdido la conexión con el servidor.", vbExclamation, "Atención") Exit Function End If strSQL = sql 'Crear e iniciar el recordset Set rs = New ADODB.Recordset rs.ActiveConnection = CnRemota rs.CursorLocation = adUseClient rs.CursorType = adOpenForwardOnly rs.LockType = adLockReadOnly rs.Open strSQL 'Desconectando Set rs.ActiveConnection = Nothing 'Devolver el recordset Set recorset_desc = rs 'Quito la referencia a la variable objeto Set rs = Nothing End Function
La función recibe como parámetro la consulta SQL, puede ser una tabla o un JOIN. Observe que esta función llama la función ConexionSQL(), permite verificar que este correcta la conexión con el servidor. Como esta función no es de mi autoría no la incluyo. Sobra mencionar que la Connection se define como Pública.
Me cuenta si le interesa el ejemplo, ya tiene mi correo.
Se olvidaron los eventos del cuadro combinado y el cuadro de lista.
Evento Después de actualizar del cuadro combinado. Observe que vuelve a cargar los datos del recordset, pero sigue desconectado.
Private Sub lstEmpleados_Click() Dim strSQL As String strSQL = "SELECT tblempleados.* FROM tblempleados WHERE idempleado=" & Me.lstEmpleados & " ORDER BY empleado" Set Me.Recordset = recorset_desc(strSQL) Me.Comando16.Visible = False Me.Comando18.Visible = False Me.btnSiguiente.Visible = False Me.Comando19.Visible = False Me.Cuadro20.Visible = False Me.AllowAdditions = False End Sub
Evento Al hacer clic del cuadro de lista
Private Sub lstEmpleados_Click() Dim strSQL As String strSQL = "SELECT tblempleados.* FROM tblempleados WHERE idempleado=" & Me.lstEmpleados & " ORDER BY empleado" Set Me.Recordset = recorset_desc(strSQL) Me.Comando16.Visible = False Me.Comando18.Visible = False Me.btnSiguiente.Visible = False Me.Comando19.Visible = False Me.Cuadro20.Visible = False Me.AllowAdditions = False End Sub
Como puede apreciar el código es sencillo, gracias a la función se puede economizar líneas de código. Con esta forma de recuperar la información permite que lo hagan muchos usuarios concurrentes y sin afectar el rendimiento.
Disculpas por el olvido.
- Compartir respuesta