Rellenar formulario

' filtrar formulario por Team
Private Sub ccTeam_AfterUpdate()
Equipo = Forms![ScoreCard]![ccTeam]
Me.RecordSource = "SELECT DISTINCT [Inbox].[Responsible Employee] FROM Inbox WHERE Inbox.Team = '" & Equipo & "' ;"
Me.Requery
Set db = CurrentDb
Set registro = db.OpenRecordset("Inbox")
Dim pepito
pepito = Forms![ScoreCard]![Responsible]
Set rsa = db.OpenRecordset("SELECT COUNT(*) AS valor FROM Inbox WHERE Inbox.[Responsible Employee] = '" & pepito & "' ;")
Contador = rsa!valor
Me.lblCuentaInbox = Contador
End Sub
Con el pretendo que en un formulario tabular, la primera columna recoja los distintos nombres de una tabla según el filtro del cuadro combinado ccTeam. Esto funciona, no hay problema. La segunda columna tiene que contar el numero de registros que hay en la tabla para cada nombre. Y este es el problema. Contador, me devuelve el valor del primer nombre para todas filas.
Me.lblCuentaInbox devuelve siempre el mismo valor en todas las filas de la segunda columna (claro).
Se te ocurre algo

1 Respuesta

Respuesta
1
Primero de todo y antes de profundizar... te recomiendo que uses la opción, Option Explicit, al comienzo del código y que declares todas las variables. Eso te permitirá encontrar errores mucho más rápidamente y hace el código más legible. Además te recomiendo que intentes evitar los espacios en los nombres de los campos (es mucho mejor ResponsibleEmployee que [Responsible Employee].
Segundo, estás en el típico problema de los formularios continuos. Aunque un campo aparezca duplicado por cada registro, realmente es el mismo. La única manera de conseguir que en cada registro muestre un valor diferente es haciendo un bound a los datos de origen. Es decir, usando una función de la que dependan los datos de origen. Por ejemplo en tu caso, usando la función:
publicFunction CuentaCosas(RE as variant) as long
' A RE le pongo variant porque no me dices si es un número o una cadena de texto, que si no usaría string o long.
   Dim db as database
   Dim rst as recordset
   dim strSQL as string
   set db = currentdb
  strSQL = "SELECT COUNT(*) AS valor FROM Inbox WHERE Inbox.[Responsible Employee] = '" & RE & ";"
   set rst = db.OpenRecordset(strSQL,dbopensnapshot)
   if rst.EOF then
        CuentaCosas = 0
   else
        CuentaCosas = rst!Valor
   end if
   Rst. Close
   Db. Close
end function
Después en el campo usas la función alimentada del Responsable y verás como te salen todas diferentes.
De todas formas lo mejor es usar una consulta que lo haga directamente utilizando totales. Es decir, como fuente del formulario puedes usar:
SELECT [Inbox].[Responsible Employee], COUNT(*) AS Cantidad FROM Inbox WHERE Inbox.Team = '" & Equipo & "' GROUP BY [Responsible Employee];"
Mucho más sencillo y que te da una consulta que te devuelve el dato que quieres
Muchas Gracias por tu ayuda
Respecto de tus consejos, el de Option Explicit lo uso comúnmente (tienes toda la razón), es solo que te he pegado una parte del código. En cuanto a los nombres de campo, pues también la tienes, pero estoy importado datos de hojas de execel y los nombres, son los que son.
En cuanto a la SELECT; pues si, es la mejor opción, pero el formulario tiene más consultas con origen de datos en tablas distintas. (Entiendo que lo que me dices es poner esa select como Origen de registro del formulario, así que no me vale).
Me pongo ahora mismo con la otra solución y si "tira" te cierro la consulta inmediatament.
Muchísimas gracias, nuevamente
Hola de nuevo. Algo estoy haciendo mal, pero no me muestra los valores.
¿Te importa si te mando un pantallazo por mail?
En cualquier caso, si te parece bien, dime si quieres que te cierre esta consulta.
Puedes seguir preguntando por esta línea. Me la sudan los puntos esos.
Preferiría, si me tienes que mandar un pantallazo, que lo colgases en algún sitio y pusieses el link.
Vale, esta claro como el agua. Ademas de crack; sincero, no como otros.
Me acabas de aclarar porque algunos dan tanta importancia a los puntos.. .)
"el que sabe, sabe, y si no que aprenda"
En cuanto a lo del link, lo tengo un poco crudo, me he acordado ya un par de veces de algún familiar de mi ISP, pero da igual. Mi web sigue sin funcionar. www.dualshop.es
Así que como siempre, lo que tendré que hacer es pedir la migración, y seguramente entonces se resuelva el problema.
Ya se que estoy abusando de ti, pero si tienes tiempo y te parece bien, te mando el pantallazo.
Hay por ahí muchas páginas para publicar imágenes como Imageshack...
De acuerdo, aquí tienes el link:
http://img291.imageshack.us/my.php?image=resultadosh3.png
He creado la función que me escribiste y la llamo desde el lblCuentaInbox poniendo la función como: Valor Predeterminado =CuentaCosas([<<RE>>]). (Tampoco tira si lo pongo como Origen del Control).
Los filtros TEAM, GROUP y PL hacen bien su trabajo, y con la SELECT DISTINCT, consigo rellenar la columna Responsible con diferentes valores. Ahora si averiguo como contar cuantos registros tiene cada responsable en la tabla Inbox, y los muestre en el lbl de la columna Inbox, el resto de los valores de las otras columnas los conseguiré variando el código correspondiente.
En cualquier caso, tengo la impresión de que no estoy usando bien la función
Gracias, de nuevo. José Luis
Vamos a ver. El método es el correcto. No lo pongas como valor por defecto, sino como origen del control. Hay que depurarlo a ver donde falla.
Para ello te recomiendo que sigas los siguientes pasos:
1.- Comprobar que la funcion hace lo que toca: para ello quita el private de delante de Function en el código de cuentacosas y ponle Public. Así la podrás llamar desde cualquier parte
Abre la ventana inmediato (menu ver del editor de VB). En ella escribe
? CuentaCosas(2), o el responsible employee que toque. Mira a ver si lo hace bien.
Si lo hace bien, me lo dices. Si no, ponle un breakpoint al comienzo de la función justo en el primer set, la llamas desde la ventana inmediato y ve ejecutándola paso a paso, a ver si ves donde esta el fallo.
2.- Comprobar que el campo está llamando realmente a una función: Si la función no está bien declarada, puede ser que no la encuentre y por eso falle. Ponla en public y asegurate de que la cabecera es:
public function CuentaCosas(RE as variant) as long
¿Y qué es eso de [<<RE>]? ¿Es el nombre correcto?
Desisto. No consigo hacer rular tu función. Así que he cambiado el planteamiento.
Primero calculo los datos, los guardo en una tabla, y después muestro el formulario y a tomar por ..., no puedo perder más tiempo ni hacértelo perder a ti.
En cualquier caso, me guardo la función para implementarla en otra ocasión.
Muchísimas gracias por tu ayuda.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas