Consultar y editar recordset desconectado con Access y PostgreSQL

Tengo un formulario con un subformulario, en el formulario principal hay un cuadro combinado cuyo origen de datos es un recordset desconectado con PostgreSQL en la nube, en este caso utilizo el servidor de Cloud Cluster. Necesito que al seleccionar un registro del cuadro combinado me muestre y permita editar en el subformulario los registros. La conexión la hago con ADO.

¿Alguna idea?

1 Respuesta

Respuesta
1

Martha es muy sencillo, personalmente utilizo una función para hacer la conexión y otra para abrir el recordset, desconectado o conectado.

Supongamos que el cuadro combinado se llama cboBuscar. Al cargar el formulario principal tengo el siguiente evento

Private Sub Form_Load()
   On Error GoTo ErrorHandler
   Dim strSql As String
   Set Me.cboBuscar.Recordset = recorset_desc("SELECT id, benefi_nombre FROM benefi_seguro_vida ORDER BY benefi_nombre ", 1)
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

Asigno el recordset al cuadro combinado con la función recordset_desc()

Ahora en el evento Después de actualizar del cuadro combinado tengo el siguiente código:

Private Sub cboBuscar_AfterUpdate()
   Dim mform As Form
   Set mform = Me.frmSubBeneficiario.Form
   Set mform.Recordset = recorset_desc("SELECT * FROM temporal WHERE id=" & Me.cboBuscar, 2)
End Sub

Nuevamente con la función recordset_desc() asigno el recordset al subformulario, observe que en este caso la función tiene 2 como segundo parámetro, esto indica que el recodset es actualizable.

FUNCIÓN RECORDSET_DESC()

Public Function recorset_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
    ' Elaborado por: EDUARDO PÉREZ FERNÁNDEZ
    ' Fecha: 12/12/2022
    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
    Select Case bloqueo
      Case 1
        rs.CursorType = adOpenForwardOnly
        rs.LockType = adLockReadOnly
      Case 2
        rs.CursorType = adOpenStatic
        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 recorset_desc = rs
  'Quito la referencia a la variable objeto
  Set rs = Nothing
End Function

La función ConexionSQL() permite hacer y validar la conexión con el servidor de Cloud Cluster, asumo que usted utiliza algo similar para la conexión. Utilizo un DSN y una variable pública para almacenar la conexión.

Public CnRemota As New ADODB.Connection

Si quiere ampliar información al respecto puede contactarme en [email protected] 

Martha se me olvidó hacerle una recomendación. Trate en lo posible de NO trabajar con tablas vinculadas, porque cuando el servidor es remoto y abra un cuadro combinado o un formulario va a tener una demora dependiendo del tamaño de las tablas.

Igualmente, no olvide que al no tener tablas vinculadas se requiere más código, pero aumenta la seguridad porque el Front End solo contendrá los formularios, reportes y consultas de paso a través, pero no hay tablas. No podrá utilizar NINGUNA de las funciones de dominio de Access como son, Dlookup(), Dmax(), Dmin() y Dlast(), ni tampoco DAO, en reemplazo de éstas debe utilizar sentencias SQL mediante procedimientos almacenados.

De paso permítame felicitarla porque ha llegado a la parte más avanzada de Access como lo es el acceso remoto a un servidor, estoy seguro de que esto le abre un mundo de posibidades.

¡Gracias!  Eduardo ya lo adapté y es precisamente lo que necesitaba, si lo voy a contactar para una asesoría. Déjeme decirle, usted es uno de los expertos con más conocimiento, personas así  son las que hacen falta en este foro. Había buscado mucho por la web y no encontré un ejemplo práctico, parece que no son muchos los usuarios que utilizan PostgreSQL como back end.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas