ACCESSoTOTAL / Dudas

En este repositorio resolvemos tus dudas sobre los proyectos que estás realizando en Access y VBA
1 stars 1 forks source link

Sumar campo de un cuadro de lista una vez filtrado #15

Open nito1972 opened 1 year ago

nito1972 commented 1 year ago

Descripción del problema: Hola a todos; Me gustaría saber cómo puedo obtener la suma de un campo de un cuadro de lista una vez he hecho el filtrado. Si me podéis recomendar algún ejemplo para ir viendo también se agradece.

Código:

Escribe aquí el código (si procede)
**No he añadido código porqué desconozco la configuración del procedimiento.**

Captura de pantalla: image Aquí puedes colocar las capturas de pantalla que ayuden a entender el problema

Archivos: Si lo deseas, puedes subir tu archivo Saludos y buen día Benito.

lunasoft2001 commented 1 year ago

Debes aprovechar el sql para llenar el cuadro de lista y usarlo para obtener la sume de importes:

Sub buscar1()
    On Error Resume Next

    Dim mySql As String
    Dim fInicio As String
    Dim fFin As String
    Dim strCuenta As String
    Dim strDoc As String
    Dim strNombre As String

    If IsNull(Me.txtFDesde) Then
        fInicio = "1/1/1900"
    Else
        fInicio = Format(Me.txtFDesde, "MM/dd/yyyy")
    End If

    If IsNull(Me.txtFHasta) Then
        fFin = "12/31/2900"
    Else
        fFin = Format(Me.txtFHasta, "MM/dd/yyyy")
    End If

    strCuenta = Me.txtCuenta
    If IsNull(Me.txtDocumento) Or Me.txtDocumento = "" Then
        strDoc = "**"
    Else
        strDoc = Me.txtDocumento
    End If

    strNombre = Me.txtNombre

    mySql = "SELECT csResumen.*"
    mySql = mySql & " FROM csResumen"
    mySql = mySql & " where (((csResumen.Cuenta) Like '*" & strCuenta & "*')"
    mySql = mySql & " And ((csResumen.nombre) Like '*" & strNombre & "*')"
    mySql = mySql & " And ((csResumen.fecha) Between #" & fInicio & "# And #" & fFin & "#)"
    mySql = mySql & " And ((csResumen.documento) Like '" & strDoc & "'))"
    mySql = mySql & " ORDER BY csResumen.fecha;"

    Me.Lista192.RowSource = mySql
    Me.txtImportetotal = calculaImporteLista(mySql)

End Sub

Function calculaImporteLista(mySqlOrigen As String) As Variant
     Dim dbs As DAO.Database
     Dim rst As DAO.Recordset
     Dim mySql As String

        'Definimos las variables

     mySql = "SELECT Sum(XLista.importe) AS SumaDeimporte FROM (" & Left(mySqlOrigen, Len(mySqlOrigen) - 1) & ") As XLista" 'usamos left para quitar el ; final
     Set dbs = CurrentDb
     Set rst = dbs.OpenRecordset(mySql, dbOpenSnapshot)

     calculaImporteLista = rst(0).Value

        'Limpiamos memoria
     If Not rst Is Nothing Then
         rst.Close
         Set rst = Nothing
        End If

     If Not dbs Is Nothing Then
         dbs.Close
         Set dbs = Nothing
     End If

End Function
nito1972 commented 1 year ago

Hola y gracias Juanjo por el desarrollo de la función que has creado. Está genial eres un monstruo 👍 👍 👍 Aprovechando la idea y con tú permiso he creado otra función para contar los registros filtrados, tal que así:

'Me.txtTotalFiltrado = contarRegistros(mySql) <---Esto en el botón filtrar.

`Function contarRegistros(mySqlOrigen As String) As Variant
     Dim dbs As DAO.Database
     Dim rst As DAO.Recordset
     Dim mySql As String

        'Definimos las variables

     mySql = "SELECT Count(XLista.Reg) AS SumaDeimporte FROM (" & Left(mySqlOrigen, Len(mySqlOrigen) - 1) & ") As XLista" 'usamos left para quitar el ; final
     Set dbs = CurrentDb
     Set rst = dbs.OpenRecordset(mySql, dbOpenSnapshot)

     contarRegistros = rst(0).Value

        'Limpiamos memoria
     If Not rst Is Nothing Then
         rst.Close
         Set rst = Nothing
        End If

     If Not dbs Is Nothing Then
         dbs.Close
         Set dbs = Nothing
     End If

End Function

No sé si es correcto del todo pero funciona. Un abrazo Juanjo y muchas gracias por tú tiempo.