Buscar registro desde cuadro combinado en formulario independiente

Tengo un formulario que no está vinculado a tabla o consulta y el back end está en otra base de datos, utilizo ADO para la conexión y necesito que después de seleccionar un cliente del cuadro combinado se muestre la información del cliente. El cuadro combinado se llena por código con ADO, lo mismo que la información del cliente. Repito no son tablas vinculadas.

2 respuestas

Respuesta
1

Como le responden si trabaja con ADO sin tablas vinculadas, ya sea que la base de datos backend este en Access u otro servidor de datos (en mi caso uso PostgreSQL) se requieren conocimientos avanzados de VBA y ADO.

Personalmente utilizo un módulo de clase para manipular tablas que están en otro pc o carpeta pero que NO están vinculadas. Le dejo solo la introducción de cómo sería la clase.

CÓDIGO DE LA CLASE

Esta clase es para bases de datos en Access. Le presento esta clase porque la mayoría de usuarios no utilizan servidores de datos como MySQL, PostrgreSQL etc.

Private cnn As Object ' Objeto ADODB.Connection
Private rs As Object ' Objeto ADODB.Recordset
Public Function Conectar() As Boolean
On Error GoTo hay_error
    Dim strConexion As String
    strConexion = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & CurrentProject.Path & "\Datos\datos_be.accdb;Persist Security Info=False;"
    Set cnn = CreateObject("ADODB.Connection")
    cnn.ConnectionString = strConexion
    cnn.Open
    Conectar = True
hay_error_exit:
    Exit Function
hay_error:
    MsgBox "Error al conectar a la base de datos: " & Err.Description, vbCritical, "Error...."
    Conectar = False
    Resume hay_error_exit
End Function
Public Function Desconectar() As Boolean
  On Error GoTo hay_error
    If Not (rs Is Nothing) Then rs.Close
    If Not (cnn Is Nothing) Then cnn.Close
    Set rs = Nothing
    Set cnn = Nothing
    Desconectar = True
hay_error_exit:
    Exit Function
hay_error:
     MsgBox "Error al desconectar a la base de datos" & Err.Description, vbCritical, "Error..."
     Desconectar = False
     Resume hay_error_exit
End Function
Public Function recordset_desc(sql As String, Optional bloqueo As Byte) As ADODB.Recordset
    ' Función para obtener un recordset ADO desconectado o conectado
    ' 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
    ' Parámtros:
    ' sql --> Una instruccion SQL
    ' Bloqueo --> 1. Recordset Solo lectura - desconectado
    ' 2. Recordset actualizable no visible para los demás usuarios - conectado
    ' 3. Recordset actualizar por lotes - desconectado
    On Error GoTo hay_error
    Dim strSQL As String
    Dim rs As ADODB.Recordset
    strSQL = sql
 'Crear e iniciar el recordset
    Set rs = New ADODB.Recordset
    rs.ActiveConnection = cnn
    rs.CursorLocation = adUseClient
    Select Case bloqueo
      Case 1
        rs.CursorType = adOpenForwardOnly
        rs.LockType = adLockReadOnly
      Case 2
        rs.CursorType = adOpenStatic
        'rs.CursorType = adOpenKeyset
        rs.LockType = adLockPessimistic
      Case 3
        rs.CursorType = adOpenKeyset
        rs.LockType = adLockBatchOptimistic
    End Select
    rs.Open strSQL
  'Desconectando
  If bloqueo <> 2 Then ' solo lectura recordset desconectado
   Set rs.ActiveConnection = Nothing
  End If
 'Devolver el recordset
  Set recordset_desc = rs
  'Quito la referencia a la variable objeto
  Set rs = Nothing
hay_error_exit:
Exit Function
hay_error:
     MsgBox "Error al obtener recordset" & Err.Description, vbCritical, "Error..."
     Set rs = Nothing
     Resume hay_error_exit
End Function

Con esta clase puede asignar a un formulario un recordset conectado o desconectado. Le dejo el código como sería en un formulario INDEPENDIENTE,  es la forma como se debe trabajar.

Dim miTabla As New clsEPFADO
Dim rs As Object ' Objeto ADODB.Recordset
Dim cnn As ADODB.Connection
Private Sub Form_Load()
 Dim strSQL As String
 Dim sql As String
 Dim sql1 As String
 Dim sql2 As String
 Dim rs As Object
 Dim rs2 As Object
   If CurrentProject.AllForms("frmPrincipal").IsLoaded Then
     Forms!frmPrincipal.Visible = False
   End If
    Set miTabla = New clsEPFADO
    miTabla.Conectar
    sql = "SELECT * FROM tblclientes ORDER BY nombres"
    sql2 = "SELECT idciudad,nombciudad FROM tblciudad ORDER BY nombciudad ASC;"
    Set rs = miTabla.Consultar(sql)
    Set rs2 = miTabla.Consultar(sql2)
    If Not (rs.EOF And rs.BOF) Then
        Set Me.Recordset = rs
        Set Me.cboCiudad.Recordset = rs2
    End If
    'Cuadro combinado
    strSQL = "SELECT tblclientes.idcliente" & vbCrLf
    strSQL = strSQL & "           , [nombres] & "" "" & [apellido1] & "" "" & [apellido2] AS Cliente" & vbCrLf
    strSQL = strSQL & "        FROM tblclientes" & vbCrLf
    strSQL = strSQL & "    ORDER BY [nombres] & "" "" & [apellido1] & "" "" & [apellido2];"
    Set Me.cboCliente.Recordset = miTabla.recordset_desc(strSQL, 1)
End Sub

Observe como se instancia la clase clsEPFADO y como se asignan los recordset con el método recordset_desc() a los cuadros combinado y al formulario. Le dejo esta imagen como tengo el ejemplo.

Observe los botones de navegación, todo se hace gracias a la clase. Martha como tengo su correo le estaré enviando un ejemplo completo.

Adicione al código de la clase este método. De lo contrario para quines copien este código no les va a servir el código del formulario.

Public Function Consultar(ByVal sql As String) As ADODB.Recordset
On Error GoTo hay_error
    Dim rs As New ADODB.Recordset
    rs.Open sql, cnn, adOpenStatic, adLockOptimistic
    Set Consultar = rs
hay_error_exit:
Exit Function
hay_error:
     MsgBox "Error al consultar datos a la base de datos" & Err.Description, vbCritical, "Error..."
     Resume hay_error_exit
End Function

Eduardo, que conocimiento vuelvo y repito usted es todo un experto en Access. Gracias por el ejemplo suministrado, es toda una maravilla, lo he aplicado y me ahorra muchas líneas de código utilizando la clase principalmente al adicionar y actualizar mediante sentencias SQL.

Después lo molesto para adaptar la clase para usarla con FrontEnd en PostgreSQL.

Muchas graicas.

Respuesta

Es un entorno avanzado que en principio supone conocimientos adecuados y que (por lo expuesto) ya se están utilizando.

Actualmente con esa metodología se esta obteniendo el origen de datos para el cuadro combinado, esa misma metodología se puede utilizar para obtener los datos que son necesarios para el formulario por lo que la pregunta (en principio) se auto-responde.

Si hay algún problema concreto que solucionar habrá que conocer que método se esta aplicando, conocidos los datos indispensables se podrá analizar si hay un error o que modificaciones se necesitaran para obtener el resultado deseado.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas