jueves, 7 de septiembre de 2017

VBA Access. Crear un recordset en memoria sin vincular a ninguna tabla y poder modificar sus valores.

'De utilidad si necesitamos añadir un campo adicional que una tabla no tiene.
'En este caso el campo sería: Seleccionadas, que representa el numero de unidades seleccionadas de un determinado lote
'Al hacerlo de esta manera, al asignar al formulario el Recordset construido en memoria, podemos modificar los valores sin ningún problema

...
    'Creamos el Recordset en memoria
    Dim rsvM As ADODB.Recordset
    Set rsM = New ADODB.Recordset
    With rsM
        .Fields.Append "ReferenciaArtículo", adVarChar, 20, adFldKeyColumn
        .Fields.Append "Descripción", adVarChar, 250, adFldMayBeNull
        .Fields.Append "Lote", adVarChar, 20, adFldMayBeNull
        .Fields.Append "FechaCaducidad", adDate, , adFldMayBeNull
        .Fields.Append "Unidades", adDecimal, , adFldMayBeNull
        .Fields.Append "Seleccionadas", adDecimal, , adFldMayBeNull
 
        .CursorType = adOpenKeyset
        .CursorLocation = adUseClient
        .LockType = adLockPessimistic
        .Open
    End With

    'Leemos registros de la tabla Lotes en modo solo lectura
    Dim rs New As ADODB.RecordSet
    rs.Open "SELECT * FROM Lotes Where Referencia = 'XXXXXX'", cadenaconexion, adOpenStatic, adLockReadOnly
    Do While Not rs.EOF
        'Añadimos registros al recordset en memoria
        'NOTA: La columna: Seleccionadas, no existe en la tabla Lotes
        With rsM
            .AddNew
            .Fields("ReferenciaArtículo") = rs.Fields("ReferenciaArtículo")
            .Fields("Descripción") = rs.Fields("Descripción")
            .Fields("Lote") = rs.Fields("Lote")
            .Fields("FechaCaducidad") = rs.Fields("FechaCaducidad")
            .Fields("Unidades") = rs.Fields("Unidades")
            .Fields("Seleccionadas") = 0
            .Update
        End With
     
        rs.MoveNext
    Loop

    'Cerramos y liberamos recursos del recordset de la lectura de la tabla
    rs.Close
    Set rs = Nothing

   'Asignamos el recordset en memoria al formulario para poder modificar el valor del campo: Seleccionadas. En el detalle del formulario deberemos tener en diversos textbox los campos del recordset.
  Set Me.Recordset = rsM

...

No hay comentarios:

Publicar un comentario

VBA Access. Redondeo de números decimales con el método medio redondeo. Alternativa a la función Round (bankers round)

 Private Function Redondeo(ByVal Numero As Variant, ByVal Decimales As Integer) As Double     'Aplica método medio redondeo (half round ...