¿Porqué no me funciona la función "DSuma"?

En un formulario con un subformulario, quiero sumar las horas en un cuadro de texto en el formulario principal, utilizo la función "DSuma": =DSuma(" [tabHorarios]![Horas] ";" [tabHorarios] ";"  [Secundario12].Formulario![IdJornada]  =  [tabHorarios]![IdJornada] ") y me da "#Error".

¿Qué hago mal?.

1 respuesta

Respuesta
1

Tienes el orden de los campos en el criterio al revés, primero va el campo de la tabla y liego el valor del subformulario con el que lo comparas. Prueba así:

=DSuma("[tabHorarios]![Horas]";"[tabHorarios]";"[tabHorarios]![IdJornada]=" & [Secundario12].Formulario![IdJornada])

O mira a ver si lo que explica Neckkito en este ejemplo te resuelve la duda: Suma de subformulario a formulario

Un saludo


Gracias, me funciona. Pero, siempre hay un pero, no entiendo la sintaxis de la condición. Te explico, resulta que ya lo tenía hecho como verás en la imagen, pero resulta que al volver a hacerlo en otro lugar, dejaba de funcionar, y me da muchos problemas.  Aplico el método de ¿qué quiero sumar?, ¿dónde está lo que quiero sumar?, y finalmente la condición, y en el caso de no poner condición tampoco me suma bien.

Como sabrás, la función DSuma tiene tres argumentos:

1º/ El campo que quieres sumar.

2º/ Dónde está ese campo: necesariamente tiene que ser una tabla o una consulta

3º/ El criterio para restringir la suma: que tiene que hacer referencia al contenedor del campo (tabla/consulta). Si lo omites, te sumará el contenido de toda la tabla/consulta del campo elegido.

Dicho esto, a modo "teórico", la aplicación práctica, en al parte del filtro (3º parámetro) siempre es:

en la parte izquierda del signo igual (o del operador que uses), el nombre del campo de la tabla/consulta que contiene el dato por el que filtrar, y en la parte derecha del operador, el valor por el que filtrar. Este valor lo puedes poner directamente [por ejemplo: DSuma("Importe","TablaVentas","IdCliente=5")], o haciendo referencia a otro control de tu formulario (o subformulario) [por ejemplo: DSuma("Importe","TablaVentas","IdCliente=" & [IdCliente])], pero siempre en el orden explicado: primero el campo de la tabla/consulta, luego el operador (=, >, <, LIKE...) y luego el valor o la referencia al control con el valor a filtrar.

Nuevamente gracias lo primero.  Pero, como siempre, un pero, no comprendo la sintaxis de la segunda parte de la condición "&" y sin comillas el resto.  Por otro lado, el problema comenzó cuando quise repetir la fórmula que me funcionaba "=TimeToString(DSuma("[tabHorarios]![Horas]";"[tanHorarios]";"[txtIdJornada]=[tabHorarios]![Horas]")) y me encontre con la bonita sorpresa de "#Error", así que probe con un corta y pega y ¡Oh cáspita!, funcionaba, lo repetí quitando la condición con la intención de que me sumara todo el campo y verificar que el error estaba en la condición y ¡vaya! también "#Error#.  Y a partir de ahí, la cantidad de pruebas y errores pasados, el objetivo es realizar esto pero con un formulario basado en una consulta que me interesa más, pero si no hago bien la función de agregado pues mal, de ahí mi interés en saber  bien la estructura (que creo que la sé), la sintaxis correcta (en cuanto a comillas, espacios, exclamaciones, puntos, etc...), identificación de campos, tablas o demás, ó cualquier  otra idea que sirva para encontrar el fallo que estoy cometiendo para poder hacer la función con confianza de que va a funcionar.

Te paso el enlace a la ayuda de la función DBúsq(), que te explicará lo relativo a la sintaxis (se aplica igual a DSuma):

 https://support.microsoft.com/es-es/kb/208786 

https://support.office.com/es-ES/article/DB%C3%BAsq-funci%C3%B3n-8896CB03-E31F-45D1-86DB-BED10DCA5937 

y la ayuda de la propia función DSuma():

 https://support.office.com/es-es/article/DSuma-funci%C3%B3n-DSum-08f8450e-3bf6-45e2-936f-386056e61a32 

=TimeToString(DSuma("[tabHorarios]![Horas]";"[tabHorarios]";"[txtIdJornada]=[tabHorarios]![Horas]"))

Según la notación usual de los nombres, estás poniendo al revés los campos de la aprte del criterio, como te explicaba antes. Entiendo que txtIdJornada es el nombre de un control del formulario, y qu ele campo en la tabla es Horas. En ese caso, la expresión sería:

=TimeToString(DSuma("[tabHorarios]![Horas]";"[tabHorarios]";"[Horas]=[txtIdJornada]"))

o

=TimeToString(DSuma("[tabHorarios]![Horas]";"[tabHorarios]";"[Horas]=" & [txtIdJornada]))

Siempre agradecido y sin querer pecar de pesado. "Pero"... lo que quiero entender es el porqué del símbolo de concatenación "&" porqué en ese lugar, etc..., y porque el control "[txtIdJornada]" no va entrecomillado, siendo que en otros lugares si tiene que estar entrecomillado.  Es a este tipo de cosas a que me refiero como sintaxis de las cadenas o las expresiones, que reglas o normas rigen la "ortografia" para que Access lo entienda.  Espero haberme explicado mejor.

Está bien que preguntes lo que no entiendes, y para nada pienso que seas pesado. Dicho esto, en el primer enlace considero que te lo explica:

El operador de concatenación es & porque lo establecieron así. Va ahí (en el medio) para encadenar las dos partes, pues en otro lugar no puede encadenar nada...

El control puede ir entrecomillado o no, según la sintaxis que prefieras (las dos que te puse son equivalentes, de nuevo lo tienes explicado en el enlace)

Como regla "general" (que tiene más sentido en código VBA), se podría decir que la parte que va entrecomillada es "fija" y la que va fuera "variable".

Para explicarte todo tendría que redactarte un manual, por lo que te remito a los de un amigo: http://siliconproject.com.ar/neckkito/ y también a la ayuda del propio Access.

¡Gracias!

He seguido un poco los cursos de VBA de Eduardo Olaz, Nikkito y Fermí Vilá, pero no he cogido aún nivel, tengo más ganas que tiempo, y como intento desarrollar una BD para el control horario de los distintos trabajos precarios de mi esposa, pues ahí la frustración.

Muchas gracias de nuevo.  Un abrazo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas