La función suma del total de un control de formulario continuo

En un formulario continuo que me trae datos de una consulta de referencias cruzadas, no puedo totalizar las columnas con un control en el pie del formulario: (Suma([Ctl01]). Me trae error.

La consulta tiene como encabezados de columnas los meses, y como encabezado de fila los comercios y el total por fila.

Para poder utilizar la consulta cruzada como origen del formulario utilice el siguiente codigo VB

Private Sub Form_Load()

Dim RS As Recordset
Set RS = Me.Recordset

'Controles

Me.Ctl01.ControlSource = RS.Fields(3).Name
Me.Ctl02.ControlSource = RS.Fields(4).Name
Me.Ctl03.ControlSource = RS.Fields(5).Name
Me.Ctl04.ControlSource = RS.Fields(6).Name
Me.Ctl05.ControlSource = RS.Fields(7).Name
Me.Ctl06.ControlSource = RS.Fields(8).Name
Me.Ctl07.ControlSource = RS.Fields(9).Name
Me.Ctl08.ControlSource = RS.Fields(10).Name

'Etiquetas

Me.F1.Caption = Right((RS.Fields(3).Name), 7)
Me.F2.Caption = Right((RS.Fields(4).Name), 7)
Me.f3.Caption = Right((RS.Fields(5).Name), 7)
Me.F4.Caption = Right((RS.Fields(6).Name), 7)
Me.F5.Caption = Right((RS.Fields(7).Name), 7)
Me.F6.Caption = Right((RS.Fields(8).Name), 7)
Me.F7.Caption = Right((RS.Fields(9).Name), 7)
Me.F8.Caption = Right((RS.Fields(10).Name), 7)

End Sub

Necesitaría que por favor me ayuden a encontrar el error.

3 respuestas

Respuesta
2

Me voy a meter en lo que no me compete, pero te aconsejaría que te bajaras la base de datos de ejemplo Neptuno( es de Microsoft). Verás que en Consultas hay una de referencias cruzadas. En su diseño, quítale el criterio de tiempo. Luego haz un formulario, y si en el Pie pones, en un cuadro de texto, lo que tu escribías veras como te funciona. En sus tiempos fue buena

Respuesta
1

Sin mirar apenas, donde pones:

Set RS = Me.Recordset, no le dices nada.

Si lo que quieres es adjudicar un RecordSource a tu Formulario o Subformulario, primero tienes que seleccionar los registros.

Dim StrSQL As String

Dim RS As DAO.Recordset

StrSQL = "SELECT * FROM TuConsulta;"

Set RS = CurrentDB.OpenRecordset(StrSQL)

Me.RecordSource = RS

Etc.

Acuerdate al final de cerrar el Recordset y poner a "" la StrSQL

StrSQL = ""

RS.Close

Set RS = Nothing

Mira si te soluciona el problema. Saludos >> Jacinto

Muchas gracias Jacinto.

No soy bueno en VB. Soy simplemente autodidacta y en realidad se muy poco de VB.

Esto me lo paso una persona conocida y me funciona bien. El formulario me trae los datos correctamente.

El tema es que quiero que al final de cada columna me traiga el total de ella (Los períodos). Si le agrego un control al pie o al encabezado del formulario como en cualquier form. continuo común, no me reconoce el campo que quiero sumar y me trae error. 

Me trae la siguiente leyenda: "El objeto no contiene el objeto de automatización Formularios." Adjunto imagen. 

Si hay otra opción como la que me adjuntaste me gustaría tomarla pero debes ser menos especifico dado que no entiendo demasiado.

Un abrazo

Jorge: Viendo la imagen que me mandas, parece que intentes sumar algo no sumable.

Para hacer una suma en SubFormulario:

Un TextBox en el Pie del mismo que vamos a bautizar con el Nombre de SumTxt01. En el Origen del Control y suponiendo que lo que quieres sumar son los valores del control Txt01, si es que son números.

Repito en Origen del SumTxt01 le pones:

=Suma(Nz(Txt01, 0)) o Sum(Nz(Txt01, 0)) si es la versión Inglesa

Mis saludos >> Jacinto

Respuesta
1

Si lo que quieres es asignar a un recordset el mismo origen de datos del formulario, como creo que es tu intención, tienes una forma más sencilla que la que te comenta Jacinto:

Set RS = Me.RecordsetClone

De todos modos, algo estás haciendo mal, porque un formulario con origen en una consulta de ref. Cruzadas sí te deja hacer sumas de las columnas con la función Suma(), mira este ejemplo: http://www.filebig.net/files/9ZYvn7z7xJ

El campo que pretendo sumar es numérico (Ctl01), son los totales por comercio que trae la consulta. Utilizo un Textbox al pie con la funcion Suma con la diferencia que no utilice NZ, pero me tira error. El ejemplo  que adjuntan es idéntico a lo que tengo yo con la diferencia que el origen del registro de los controles esta vacío por que esta asignado por VB en el código que les adjunte.

Saludos

La solución sencilla es que tanto al formulario como a los controles les asignes directamente el origen, como en el ejemplo.

Si insistes en seguir usando tu método, tendrás que hacer los cálculos en VBA y luego pasárselos al cuadro de texto del pie del formulario. Aquí, sin saber cómo es tu consulta, sólo te puedo orientar de forma teórica. Podrías usar la función DSum(), o un recordset, o crear una consulta de totales sobre la de ref. Cruzadas y buscar ahí los totales, por ejemplo con DLookup().

¡Gracias! 

El problema es que el nombre de los campos de la tabla cruzada es dinámico e inevitablemente debo darle esos nombres a los controles del formulario continuo en función a los campos de la tabla al momento de calcularla.

Igualmente les agradezco infinitamente por su tiempo.

Saludos Jorge.

Perdón, me refería a el origen de los controles no al nombre.

Saludos

Prueba esto:

Crea un consulta sobre tu tabla de referencias cruzadas, pero sólo coge los campos que se puedan sumar, es decir, no cojas el campo que te origina las filas. La conviertes en una suma de totales, y agrupas cada campo por suma, para que te de la suma total de cada columna.

Luego, por VBA, buscas el valor que corresponde a cada columna de tu formulario en esa consulta y se lo pasas a tu cuadro de texto de totales.

Por ejemplo:

Me.txtTotalF1="DLookup("SumadetotalF1","CTotales")

Sin ver tu BD, poco más te puedo orientar.

Funciona OK. Cree una consulta de totales llamada RD-ComprasT donde el Campo1=Periodo y el Campo2=Total Luce asi:

Periodo Total

10/2015 1000

11/2015 5000

Etc. etc...

En VBA coloque lo siguiente:

 Me.T1 = DLookup("Total", "RD-ComprasT") - donde T1 es me control total1

Pero el tema es que para todos los controles (T1;T2;T3...) me da 1000 o sea el primer registro. No se vincular el perido con el del formulario, o sea el criterio de búsqueda de DLookup.

Saludos

 Me.T1 = DLookup("Total", "RD-ComprasT","Periodo='10/2015'") 

y si lo quieres vincular a algún control del formulario:

 Me.T1 = DLookup("Total", "RD-ComprasT","Periodo='" & Me.NombreControl & "'") 

En el primer caso colocando el periodo funciono bien:

Me.T1 = DLookup("Total", "RD-ComprasT", "Periodo = '10/2015'")

Pero en el segundo caso no y es el que necesito. No me queda claro como van las comillas

Me.T2 = DLookup("Total", "RD-ComprasT", "Periodo =" ' &Me.Ctl01&'")

Por su parte Ctl01 es el nombre del control y no se si sirve. Otra opción seria utilizar el Texto de la etiqueta T1 que la asigna el código VB. Sería esto posible?

Saludos

Las comillas las tienes mal, la comilla simple tiene que quedar siempre dentro de las dobles.

Y si quieres pasar como criterio el valor de la etiqueta, has de usar su propiedad Caption.

Me.T2 = DLookup("Total", "RD-ComprasT", "Periodo ='"  & Me.Etiqueta.Caption & "')"

Jacinto:

Me sigue dando error. Si le coloco comillas dobles después del igual o al final de todo como me indicas me tira error de compilación. De la siguiente manera me toma el código pero no me arroja ningún dato.

Me.T1 = DLookup("Total", "RD-ComprasT", "Periodo = ' & Me.F1.Caption & ' ") 

Otra intento seria: encerrando ambas partes entre comillas dobles pero igual que el anterior no me arroja resultado alguno.

Me.T1 = DLookup("Total", "RD-ComprasT", "Periodo" = " ' & Me.F1.Caption & ' ")

Saludos

No soy Jacinto, soy Sveinbjorn, je je

Tienes que fijarte más en los códigos que te pongo, porque no los copias bien:

Me.T1 = DLookup("Total", "RD-ComprasT", "Periodo ='"  & Me.F1.Caption & "')"

Sveinbjorn:

Lo copie y pegue tal cual lo pones vos pero me tira error de compilación. ¿Tal vez sea un tema de version o algo así? Te adjunto el print:

Saludos

Vale, se me coló un error en la sintaxis, disculpa:

Me.T1 = DLookup("Total", "RD-ComprasT", "Periodo ='"  & Me.F1.Caption & "'")

Las últimas comillas dobles van antes del paréntesis, no después.

Ahora si funciona OK Gracias!!!

Quiero aprovechar para hacerles otra consulta con relacion a esto:

la intención de este formulario es hacerlo depender de otro. que sea un subformulario. El inconveniente cuando se trata de tablas cruzadas es que me dice que debo establecer en la consulta la propiedad encabezado de columnas antes de hacerlo depender de otro. Donde se establece esta propiedad???

Saludos.

Eso lo tienes que hacer en el diseño de la consulta. Y con esto doy por finalizada esta pregunta, pues nos estamos desviando del tema original. Si necesitas alguna cosa más, abre una nueva pregunta.

¡Gracias!

Muy agradecido con tu tiempo. Excelente!

No me parece justo, que con todo lo que te ayudé, y encima, te resolví el problema, me valores peor que al otro compañero...

Te pido disculpas. en verdad aprecio inmensamente todo lo que todos han hecho y el tiempo que me dieron, es que no se como valorar las respuestas. por favor explícame como hacerlo

Un abrazo Jorge

http://blog.todoexpertos.com/post/2014/09/10/como-valoro-las-respuestas-a-mis-preguntas 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas