Contar registros que cumplan un requisito

A ver si me puedes echar una mano.
Tengo un formulario con los números de pedido. Dentro de él tengo un subformulario con el detalle del pedido (cada uno de los productos solicitados).
En el pié del subformulario tengo campos resumen (nº de artículos, importe total). Necesito incluir un campo nuevo, que me cuente el número de artículos de ese pedido de importe superior a una cantidad que figura en el formulario principal. ¿Cómo puedo hacerlo?
Respuesta
1
Perdona por la tardanza, pero estoy últimamente un poquillo liado.
Este código que te adjunto es un ejemplo que tenia hecho, solo tendrías que amoldarlo a tus campos y las consultas a tus tablas.
'Lo primero es crear un recorset(una consulta) donde almacenaremos el valor de los campos
Set rst = CurrentDb.OpenRecordset("SELECT General.Cod, General.Producto, Count(General.Cod) AS [Asistencia Ok] FROM General where Importe > " & Formularios![MiFormulario]![Importe_Maximo] & ";")  'si el campo esta en el subformulario seria asi Formularios![MiFormulario]![MiSubformulario].Form![Importe_Maximo], el campo importe_Maximo es el campo donde esta el valor de referencia en el formulario.
If rst.RecordCount > 0 Then ' nos aseguramos que haya un registro
Cuenta = rst.Fields(2) ' guardamos el valor de la cuenta de productos
Me.MiCampo.Caption = Cuenta ' asignamos a una etiqueta el valor si fuera un campo de texto cambia el Caption por Value
Else
Me.MiCampo.Caption = "0" 'Si no hay ningun valor mayor lo ponemos a 0
End If
Rst. Close
Muchas gracias por responder, y no hay nada que perdonar, porque con la labor que hacéis los expertos, no podemos exigir que además sea inmediata. Suficiente con que nos solucionáis un montón de dudas.
Este código que me has mandado donde lo tendría que poner, en los eventos del subformulario que tiene los datos ( ¿en qué evento? ) ¿O en donde?
Te recuerdo que los datos que contiene el subformulario son parte de una tabla de pedidos (los que corresponden a un pedido en particular).
Muchas gracias por tu atención.
Deberias poner en el evento on load del subformulario. Así al cargar el subformulario, ejecuta el código. Otra opción seria en el evento Form_Current, del formulario principal, así cada vez que cambias de registro en el principal se actualiza los datos. Quedaria mas o menos asi en el evento Load(al cargar), si no cambia el sub por Private Sub Form_Current() para que se ejecute cuando cambies de registro.
Private Sub Form_Load()
Set rst = CurrentDb.OpenRecordset("SELECT General.Cod, General.Producto, Count(General.Cod) AS [Asistencia Ok] FROM General where Importe > " & Formularios![MiFormulario]![MiSubformulario].Form![Importe_Maximo] & ";")
If rst.RecordCount > 0 Then ' nos aseguramos que haya un registro
Cuenta = rst.Fields(2) ' guardamos el valor de la cuenta de productos
Me.MiCampo.Caption = Cuenta ' asignamos a una etiqueta el valor si fuera un campo de texto cambia el Caption por Value
Else
Me.MiCampo.Caption = "0" 'Si no hay ningun valor mayor lo ponemos a 0
End If
rst.Close
End Sub
Lo único que faltaría seria cambiar la consulta de selección por una consulta adecuada a tu tabla y campos, y cambiar el nombre de MiCampo por el nombre del campo donde quieras que se muestre el resultado.
Buenos días y gracias por contestar.
Hay algo que me falla, me marca     .Caption =
Y me saca un mensaje "Error de compilación: No se encontró el método o el dato miembro"
Gracias por la ayuda
El caption es para etiquetas, perdona. Si lo estas haciendo con un campo de texto, sustituye el caption por Value y listo.
OK, eso ya funciona pero ahora me da "error 424 en tiempo de ejecución: se requiere un objeto.
El código que le tengo puesto es:
Private Sub Form_Load()
Set rst = CurrentDb.OpenRecordset("SELECT DetallesPedido.Pedido, DetallesPedido.[Importe total], Count(DetallesPedido.Pedido) AS CuentaDetalles FROM DetallesPedido WHERE DetallesPedido.[Importe total] >= " & Formularios![Pedidos].ImporteMinimo] & ";")
If rst.RecordCount > 0 Then ' nos aseguramos que haya un registro
    Cuenta = rst.Fields(2) ' guardamos el valor de la cuenta de productos
    Me.ImportesMayores.Value = Cuenta ' asignamos a una etiqueta el valor si fuera un campo de texto cambia el Caption por Value
Else
    Me.ImportesMayores.Value = "0" 'Si no hay ningun valor mayor lo ponemos a 0
End If
rst.Close
End Sub
El formulario principal es "Pedidos" y el subformulario "DetallesPedido". El campo ImportesMayores está en el pie de página de "DetallesPedido, y el valor de referencia "ImporteMinimo" está en "Pedidos"
A ver si me puedes decir donde me estoy equivocando. Muchas gracias.
Private Sub Form_Load()
Set rst = CurrentDb.OpenRecordset("SELECT DetallesPedido.Pedido, DetallesPedido.[Importe total], Count(DetallesPedido.Pedido) AS CuentaDetalles FROM DetallesPedido WHERE DetallesPedido.[Importe total] >= " & Formularios![Pedidos]![DetallesPedido].Form![ImporteMayores] & ";")
If rst.RecordCount > 0 Then ' nos aseguramos que haya un registro
    Cuenta = rst.Fields(3) ' guardamos el valor de la cuenta de productos
    Formularios![Pedidos]![DetallesPedido].Form![ImporteMayores].Value = Cuenta ' asignamos a una etiqueta el valor si fuera un campo de texto cambia el Caption por Value
Else
    Me.ImportesMayores.Value = "0" 'Si no hay ningun valor mayor lo ponemos a 0
End If
rst.Close
End Sub
Prueba con el código modificado, te resalto en negrita lo que he modificado
Buenos días.
Me sigue dando el mismo error 424, y al entrar en Depurar me marca la primera línea, la del - Set rst =
Entiendo que DetallesPedido es la tabla donde se encuentran los artículos de todos los pedidos, pero lo que no me queda claro es como selecciona solo los artículos del pedido que está en el formulario principal.
Por otro lado, la condición que buscamos "ImporteMayores" es un campo que está en el formulario principal, ¿no habría que ponerla como
Formularios![Pedidos]![ImporteMayores]
En lugar de
Formularios![Pedidos]![DetallesPedido]. Form![ImporteMayores]
De todas formas, lo he cambiado y sigue dando el mismo error.
Podemos hacer dos cosas, la primera es te adjunto link de un video que he hecho para veas como generar una sentencia sql desde access para agregarla como recorsert con la condición de que solo muestre los registros con el valor del campo seleccionado al valor que hay en un campo de un formulario cargado, te explico un poco y ademas tienes el video.
Lo primero es abrir el formulario y dejarlo detrás abierto, entonces te vas a la ventana de Base de datos y te vas a las consultas. Creas una nueva consulta en vista de diseño, y agregas la tabla Detalles Pedidos, selecciona los campos que quieres que aparezcan, en un principio si solo quieres contar los registros con que selecciones el campo [importe_maximo] y pedido basta.
Una vez agregados a la consulta, el campo pedido que es el que queremos contar, lo debemos poner como Contar(Pedido) y ahora con el botón derecho abrimos el menu y seleccionamos totales (la primera opción la E de sumatorio.
Una vez seleccionado, en vez de agrupar por el campo que pedido, seleccionamos del desplegable la opción expresión, ahora en el campo [importe total] en vez de agrupar por, seleccionamos Dónde, y en la linea de criterios con el botón derecho seleccionamos generar.
Una vez abierta la ventana, ponemos la operación que queramos, en nuestro caso que sea mayor o igual al campo del formulario que previamente teníamos abierto, escribimos sin las comillas ">=" y pinchamos en el campo del formulario cargado.
Una vez terminado esto, cambiamos a vista sql, y quitamos los saltos de linea que genera access. Copiamos esta instrucción sql y sustituimos en el código vba.
Bueno aquí te dejo el enlace para que lo descargues.
http://www.megaupload.com/?d=GZ4C3U2C
Si no, una segunda opción es que me mandes la BD comprimida (que sino se detecta como virus) a mi correo: [email protected]
Ahora si, he tenido que cambiarle algunas comillas de la instrucción que la vista SQL no pone, pero ya funciona.
Muchas gracias por todo, y si tengo alguna otra duda, ya te preguntaré.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas