** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - numero de registros en un formulario con filtro
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradonumero de registros en un formulario con filtro

 Responder Responder
Autor
Mensaje
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
Enlace directo a este mensaje Tema: numero de registros en un formulario con filtro
    Enviado: 11/Febrero/2020 a las 18:55
El número de registros de un formulario lo puedo saber mediante

Me.Recordset.RecordCount

Pero me interesa saber el numero de registros de ese formulario cuando el valor de un campo  numérico de ese Recorset es 1. 

Como podría hacerlo?

Gracias


Arriba
emiliove Ver desplegable
Administrador
Administrador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5694
Enlace directo a este mensaje Enviado: 11/Febrero/2020 a las 19:08
Y que otros valores puede tener

Saludos.
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 3062
Enlace directo a este mensaje Enviado: 11/Febrero/2020 a las 19:10
Si te entendido seria algo asi con un DCount creo yo

DCount("*","NombreTabla";"CampoX=1")
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
Enlace directo a este mensaje Enviado: 11/Febrero/2020 a las 19:37
Concretamente el campo solo puede tener 2 valores 1 y 2 pero la cuestión es como saber el número de registros cuando el campo toma un valor determinado.

En cuanto a la respuesta de rokoko, no me sirve mucho ya que el formulario no está basado en una sola tabla sino en tres relacionadas. Luego ese DCount sería incorrecto.

El origen de registros del formulario es bastante largo y hacer un recorset con el origen, aplicar un filtro y luego el Dcount, me parece complicado, quizá haya una forma más facil

Si pudiera sustituir "NombreTabla" por Me.Recordset y luego hacer:

Dcount("*",Me.Recordset, "TipoCarta = 1") pues solucionado pero creo que no funciona.






Editado por Antonalo - 11/Febrero/2020 a las 19:55
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 3062
Enlace directo a este mensaje Enviado: 11/Febrero/2020 a las 19:47
Y esas 3 relacionadas, estan en una consulta como origen de datos del formulario??

Si es asi en el DCount pon la consulta en vez de tabla. O tendras que crearte una consulta que muestre lo mismo que el recordsource si lo tienes en SQl.
O mediante un recordset filtrado por 1 o 2 y mediante RecordCount....

DCount("*","NombreConsulta";"CampoX=1")

Y en que momento quieres aplicar ese filtro de 1 o 2 ??
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
Enlace directo a este mensaje Enviado: 11/Febrero/2020 a las 20:06
Pues no está en una consulta, era por no crear otro objeto pero creo que tendré que hacerlo como dices.

Lo que tengo es un procedimiento que imprime dos informes, uno perteneciente a los registros donde TipoCarta = 1 y otro donde Tipocarta = 2 y lo que pretendo es que cuando el formulario no tenga registros con uno u otro informe, que no los imprima. 

Hasta ahora, solo controlo si el formulario no tiene registros mediante:

If Me.Recordset.RecordCount = 0 Then
   MsgBox "No hay registros para imprimir"
   Exit Sub
End If

Si  Me.Recordset.RecordCount <> o entonces le mando imprimir los informes, pero no quiero que imprima hojas en blanco
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 3062
Enlace directo a este mensaje Enviado: 11/Febrero/2020 a las 20:16
Cuando imprimes de alguna forma tienes que decirle que tipo de carta es. Yo lo haria mediante un cuadro combinado por ejemplo, que selecionando 1 o 2 las imprima. Los datos del informe deberannser filtrados mediante ese cuadro combinado.

Algo asi

If Me.Recordset.RecordCount = 0 Then
   MsgBox "No hay registros para imprimir"
   Exit Sub
End If


If me.cuadrocombinado=1 then
Imprimo
End if

If me.cuadrocombinado=2 then
Imprimo
End if
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
Enlace directo a este mensaje Enviado: 11/Febrero/2020 a las 20:18
Y si usas el evento Al no haber datos del informe? Podrás cancelar el informe antes de que se imprima:

- https://docs.microsoft.com/es-es/office/vba/api/access.report.nodata
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
Enlace directo a este mensaje Enviado: 12/Febrero/2020 a las 10:34
Para que os hagáis una idea, el origen de registros de ambos informes es el mismo que el del formulario desde el cual mando imprimir, con una excepción, el campo TipoCarta que en un informe es 1 y en el otro es 2.

Yo no mando imprimir carta por carta, aunque sería una opción, pero de todas maneras, tendría que averiguar si los informes contienen registros o no. Lo que hago es mandar imprimir primero un informe y luego el otro.

Os voy a pegar el código: Primero les pongo la fecha actual a las cartas, luego las imprimo y luego cambio el valor de imprimida a verdadero.

Private Sub CmdImprimirCartas_Click()

If Me.Recordset.RecordCount = 0 Then
   MsgBox "No hay registros para imprimir"
   Exit Sub
End If
    Dim Rs As Recordset
    Set Rs = Me.RecordsetClone
        Do While Not Rs.EOF
                With Rs
                   .Edit
                   !FechaCarta = Date '
                   .Update
                   .MoveNext
                End With
         Loop
    
     DoCmd.RunCommand acCmdSave
     DoCmd.RunCommand acCmdRefresh

   
     DoCmd.OpenReport "CartasEmbargosMayores", acViewPreview
     DoCmd.SelectObject acReport, "CartasEmbargosMayores", True
     DoCmd.PrintOut
     DoCmd.Close acReport, "CartasEmbargosMayores"
     
     DoCmd.OpenReport "CartasEmbargosMenores", acViewPreview
     DoCmd.SelectObject acReport, "CartasEmbargosMenores", True
     DoCmd.PrintOut
     DoCmd.Close acReport, "CartasEmbargosMenores"
     
     
    Rs.MoveFirst
     Do While Not Rs.EOF
                With Rs
                   .Edit '
                   !Imprimida = True
                   .Update
                   .MoveNext
                End With
         Loop
    Rs.Close
    Set Rs = Nothing
    Me.Requery
End Sub


La solución de pitxitu me convence más. En los informes, en el evento de al no haber datos, he puesto
 cancel = true

Y el informe, si no tiene registros, ni siquiera se abre, pero eso provoca un error 
 en la linea DoCmd.OpenReport, lo cual paraliza el código.

Tendría que encontrar una manera de que si esto pasa al imprimir el primero, que pase al segundo y si es con el segundo, pues exit sub
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
Enlace directo a este mensaje Enviado: 12/Febrero/2020 a las 15:22
Usa un control de errores para omitir el error. Más o menos:


Private Sub CmdImprimirCartas_Click()
    On Error Goto ControlError

    '... Tu código
     DoCmd.OpenReport "CartasEmbargosMayores", acViewPreview
     DoCmd.SelectObject acReport, "CartasEmbargosMayores", True
     DoCmd.PrintOut
     DoCmd.Close acReport, "CartasEmbargosMayores"
     
    '... Más código tuyo

    Exit Sub

ControlError:
    If Err = 2504 Then
        'Se canceló del informe,
        'Limpiamos error y seguimos
        'en la línea siguiente
        Err.Clear
        Resume Next
    Else
        'Otros errores, avisamos
        MsgBox "Error " & Err & ": " & Err.Description
    End If
End Sub


Revisa que número de error es, el 2504 los he puesto de memoria y puedo estar equivocado.

Editado por pitxiku - 12/Febrero/2020 a las 15:23
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
Enlace directo a este mensaje Enviado: 13/Febrero/2020 a las 11:26
Gracias pitxitu, he cambiado el código así:

' primera parte del código, donde pongo la fecha  a las cartas. 

 On Error GoTo ControlError1

   
     DoCmd.OpenReport "CartasEmbargosMayores", acViewPreview
     DoCmd.SelectObject acReport, "CartasEmbargosMayores", True
     DoCmd.PrintOut
     DoCmd.Close acReport, "CartasEmbargosMayores"
     
ControlError1:
   If Err = 2504 Then
        Err.Clear
        Resume Next
    Else
        MsgBox "Error " & Err & ": " & Err.Description
    End If
    
On Error GoTo ControlError2

     DoCmd.OpenReport "CartasEmbargosMenores", acViewPreview
     DoCmd.SelectObject acReport, "CartasEmbargosMenores", True
     DoCmd.PrintOut
     DoCmd.Close acReport, "CartasEmbargosMenores"
     
ControlError2:

   If Err = 2504 Then
        Err.Clear
        Resume Next
    Else
        MsgBox "Error " & Err & ": " & Err.Description
    End If

Ultima parte del código donde marco las cartas como imprimidas.



Creo que tengo que poner el control de errores dos veces porque se puede producir en ambos tipos cartas, y si se produce con el primero, hay que continuar con el segundo.

Lo que no puede ser es en los dos porque partimos de la base de que existen registros.

No puedo probarlo ahora pero creo que esto tiene que funcionar, sin embargo me parece un poco raro tener que repetir dos veces el control de errores.

Al final quizás sea lo mejor crear una consulta y aplicar

Dcount("*", "Consulta", "TipoCarta = " & 1)
Dcount("*", "Consulta", "TipoCarta = " & 2)

y antes de imprimir, poner la condición de que el uno u otro recuento sean mayor que cero

Pero de la misma manera que puedo situarme en un control de un formulario y clicar con el derecho y aplicar un filtro con un valor determinado para ese control, y se seleccionan un número determinado de registros, me gustaría poder preguntarle al formulario cuantos registros tendría si aplicara un determinado filtro. 






   
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
Enlace directo a este mensaje Enviado: 13/Febrero/2020 a las 14:41
En un principio, no necesitas 2 controles de errores; puedes tener uno al final del código, que se lanzará independientemente de qué informe falle.

Pero si tienes 2 controles, puedes saltar y así no tendrás problemas con las líneas de seleccionar informe e imprimirlo (quitas el Resume Next y así pasas al segundo bloque). O incluso puedes lanzar un MsgBox indicando que ese informe no se imprimirá.

Para ello DCont, puedes guardar la consulta que estás usando en el formulario, y podrás usarla en ella formulario y en ella DCont, como te dijo rokoko.
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
Enlace directo a este mensaje Enviado: 13/Febrero/2020 a las 16:15
Gracias pitxitu. Lo he abreviado todo, un solo controlador de errores y paso de mensajes, ya que el error que quiero controlar es el que preveo que se va a producir. 

Private Sub CmdImprimirCartas_Click()

If Me.Recordset.RecordCount = 0 Then
   MsgBox "No hay registros para imprimir"
   Exit Sub
End If
    Dim Rs As Recordset
    Set Rs = Me.RecordsetClone
        Do While Not Rs.EOF
                With Rs
                   .Edit
                   !FechaCarta = Date '
                   .Update
                   .MoveNext
                End With
         Loop
    
     DoCmd.RunCommand acCmdSave
     DoCmd.RunCommand acCmdRefresh

   On Error GoTo ControlError
   
     DoCmd.OpenReport "CartasEmbargosMayores", acViewPreview
     DoCmd.SelectObject acReport, "CartasEmbargosMayores", True
     DoCmd.PrintOut
     DoCmd.Close acReport, "CartasEmbargosMayores"
     

     DoCmd.OpenReport "CartasEmbargosMenores", acViewPreview
     DoCmd.SelectObject acReport, "CartasEmbargosMenores", True
     DoCmd.PrintOut
     DoCmd.Close acReport, "CartasEmbargosMenores"
     
ControlError:
        Err.Clear
        Resume Next
   
     
    Rs.MoveFirst
     Do While Not Rs.EOF
                With Rs
                   .Edit '
                   !Imprimida = True
                   .Update
                   .MoveNext
                End With
         Loop
    Rs.Close
    Set Rs = Nothing
    Me.Requery
End Sub

Como esto no lo voy a usar yo, no quiero que al usuario se le abran mensajes de descripción de errores. Yo creo que así ya me vale. 

muchísimas gracias rokoko, pitxitu.. Podéis cerrar este hilo


Editado por Antonalo - 13/Febrero/2020 a las 16:16
Arriba
Antonalo Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
Enlace directo a este mensaje Enviado: 15/Abril/2020 a las 15:17
Hola amigos, por favor cerradme este hilo, gracias.
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable