Autor |
Tema Buscar Opciones del Tema
|
Antonalo
Asiduo
Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
|
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
|
|
emiliove
Administrador
Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 5694
|
Enviado: 11/Febrero/2020 a las 19:08 |
Y que otros valores puede tener
Saludos.
|
|
rokoko
Colaborador
Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 3062
|
Enviado: 11/Febrero/2020 a las 19:10 |
Si te entendido seria algo asi con un DCount creo yo
DCount("*","NombreTabla";"CampoX=1")
|
|
Antonalo
Asiduo
Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
|
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
|
|
rokoko
Colaborador
Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 3062
|
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 ??
|
|
Antonalo
Asiduo
Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
|
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
|
|
rokoko
Colaborador
Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 3062
|
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
|
|
pitxiku
Colaborador
Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
|
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
|
|
Antonalo
Asiduo
Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
|
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
|
|
pitxiku
Colaborador
Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
|
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
|
|
Antonalo
Asiduo
Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
|
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.
|
|
pitxiku
Colaborador
Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1510
|
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.
|
|
Antonalo
Asiduo
Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
|
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
|
|
Antonalo
Asiduo
Unido: 06/Noviembre/2009
Localización: España
Estado: Sin conexión
Puntos: 478
|
Enviado: 15/Abril/2020 a las 15:17 |
Hola amigos, por favor cerradme este hilo, gracias.
|
|