Access: Consulta referencias cruzadas acumulativa

Tengo una tabla "clientes" con fecha de alta y fecha de baja. He creado una consulta de referencias cruzadas acumulada por año de fecha de alta (encabezado de fila) y por mes de año de fecha de alta (encabezado de columna), y como valor cuenta de referencias. Así obtengo los clientes dados de alta por año y mes.

Ahora me gustaría crear una consulta que me calcule los clientes acumulados por año y mes, es decir, clientes acumulados hasta ese mes.

¿Podeis ayudarme, darme alguna pista?

1 respuesta

Respuesta
1

Yo no usaría una consulta de referencias cruzadas (¡Deberían estar prohibidas! ... xD).

Yo haría una consulta contando Id, agrupando por año y mes, y la numeraría.

Algo así como:

SELECT Count(id) AS Cuenta, Year(FechaAlta) AS Año, Month(FechaAlta) AS Mes, RT_NumerarSQL(Year(FechaAlta)) FROM Clientes GROUP BY Year(FechaAlta), Month(FechaAlta)

La función de numerar la puedes coger de aquí:

Numerar SQL

¡Ojo!, esta escrito al vuelo, no he probado nada ...

He corregido los nombres de campos, nombre de tabla... y he puesto lo siguiente:

SELECT Count(Referencia) AS Cuenta, Year([Fecha Alta]) AS Año, Month([Fecha Alta]) AS Mes, RT_NumerarSQL(Year([Fecha Alta])) AS Expr1
FROM Tabla_Clientes
GROUP BY Year([Fecha Alta]), Month([Fecha Alta]);

Sin embargo, no entiendo lo de RT_NumerarSQL y de hecho me sale un mensaje indicándome que la función "RT_NumerarSQL" no está definida en la expresión.

He mirado el enlace que me has indicado, pero no lo entiendo.

Un par de cosas, que yo me lié un poquito...

Lo primero es que no tienes que utilizar RT_NumerarSQL sino RT_SumarSQL(Count(Referencia)), la rutina está en la misma página...

Lo segundo es que es una función personal, para que te funcione la tienes que copiar en un módulo independiente de tu aplicación.

Lo que hace la segunda funcion (RT_SumaSQL) es una suma acumulada por registro con el valor que le pasamos al ejecutar la función. En nuestro caso es Count(Referencia) es decir las altas que hay en el mes.

Ya lo tengo en marcha, pero el código tiene un error, ya que la variable nSUMA mantiene el valor (al ser Static), y si vuelves a ejecutar la consulta, continua a partir del último valor, en vez de empezar de 0

Me da que no contiene ningún error :-), si miras la función verás que si le pasas el valor nulo inicializa la variable nSUMA a cero, en el link enlazado está explicado como usarlo.

Si, pero el problema es que en este momento tengo 50 clientes creados. Al ejecutar la consulta, calcula el acumulado correctamente, pero si vuelvo a ejecutar la consulta, acumula los valores a partir de 50. La variable nSUMA, empieza con el valor 50, ya que es el último valor que ha tomado.

Veamos, tienes que ejecutar la consulta con el valor nulo para iniciar el valor de la suma continua, dependiendo del entorno dónde estés o bien lanzas la consulta directamente con el valor nulo y después la consulta que te interesa o bien lanzas la consulta de union que haga las dos tareas a la vez, en el link figura un ejemplo de como hacerlo:

     SELECT Id, Importe, RT_SumarSQL(Null) AS Arrastre FROM TFacturas WHERE 1 = 0 
     UNION ALL 
     SELECT Id, Importe, RT_SumarSQL(Importe) AS Arrastre FROM TFacturas

Tendrás que adaptarlo a tu entorno y tabla usada.

Lo he conseguido. Pero quiero darle una vuelta más:Cada cliente tiene fecha de alta, y si deja de ser cliente, se añade la fecha de baja. He conseguido hacer la suma acumulada de altas con la siguiente consulta:

SELECT Count(Tabla_Clientes.Referencia) AS Cuenta, Year([Fecha Alta]) AS Año, Month([Fecha Alta]) AS Mes, RT_SumarSQL_Altas(Null) AS Altas_Acumuladas
FROM Tabla_Clientes Where 1=0
GROUP BY Year([Fecha Alta]), Month([Fecha Alta]);
UNION ALL SELECT Count(Tabla_Clientes.Referencia) AS Cuenta, Year([Fecha Alta]) AS Año, Month([Fecha Alta]) AS Mes, RT_SumarSQL_Altas(Count([Referencia])) AS Altas_Acumuladas
FROM Tabla_Clientes
GROUP BY Year([Fecha Alta]), Month([Fecha Alta]);

Y el siguiente módulo:

Public Function RT_SumarSQL_Altas(nDato_Altas) As Double
'variable que no se pierde entre las distintas llamadas
Static nSUMA_Altas As Double

If IsNull(nDato_Altas) Then 'si nDato es nulo: variable a cero y salida
nSUMA_Altas = 0
Exit Function
End If
nSUMA_Altas = nSUMA_Altas + nDato_Altas
RT_SumarSQL_Altas = nSUMA_Altas

End Function

Y funciona bien.

Ahora he intentado hacer lo mismo para acumular las bajas:

SELECT Count(Tabla_Clientes.Referencia) AS Cuenta, Year([Fecha Baja]) AS Año, Month([Fecha Baja]) AS Mes, RT_SumarSQL_Bajas(Null) AS Bajas_Acumuladas
FROM Tabla_Clientes Where 1=0
GROUP BY Year([Fecha Baja]), Month([Fecha Baja]);
UNION ALL SELECT Count(Tabla_Clientes.Referencia) AS Cuenta, Year([Fecha Baja]) AS Año, Month([Fecha Baja]) AS Mes, RT_SumarSQL_Bajas(Count([Referencia])) AS Bajas_Acumuladas
FROM Tabla_Clientes
GROUP BY Year([Fecha Baja]), Month([Fecha Baja]);

Y el siguiente código:

Public Function RT_SumarSQL_Bajas(nDato_Bajas) As Double
'variable que no se pierde entre las distintas llamadas
Static nSUMA_Bajas As Double

If IsNull(nDato_Bajas) Then 'si nDato es nulo: variable a cero y salida
nSUMA_Bajas = 0
Exit Function
End If
nSUMA_Bajas = nSUMA_Bajas + nDato_Bajas
RT_SumarSQL_Bajas = nSUMA_Bajas

End Function

En este caso, al ejecutar la consulta, inserta una primera fila con valor en el campo "Cuenta" = 54 y mismo valor en "Bajas_Acumuladas" y a partir del siguiente registro lo acumula bien, pero partiendo del valor inicial 54.

¿Ves algún fallo?

Gracias

Ya lo he resuelto. El problema era que el campo "Fecha Baja" sólo tiene valor en los clientes que han sido dados de baja. He hecho la cuenta sobre este campo, en vez de hacerlo sobre el campo referencia y lo he resuelto.

Muchas gracias por todo.

OK, perfecto, ... sólo un apunte:

En la consulta que inicializa el contador no hace falta que pongas los campos reales, basta con que tenga los mismos valores que va a tener la consulta real que nos interesa (sobre todo si tenemos funciones).

Es decir, en vez de:

SELECT Count(Tabla_Clientes.Referencia) AS Cuenta, Year([Fecha Alta]) AS Año, Month([Fecha Alta]) AS Mes, RT_SumarSQL_Altas(Null) AS Altas_Acumuladas
FROM Tabla_Clientes Where 1=0
GROUP BY Year([Fecha Alta]), Month([Fecha Alta])

puedes poner:

SELECT 1 AS Cuenta, 2016 AS Año, 1 AS Mes, RT_SumarSQL_Altas(Null) AS Altas_Acumuladas
FROM Tabla_Clientes Where 1=0

Y tampoco es necesaria la agrupación.

Más difícil todavía!!!!!!!!! ;-)

Todo lo anterior venia a cuento, ya que quiero calcular la media mensual de ventas por punto activo de venta, es decir, ventas/puntos activos acumulados (de ahí que no sólo considero las altas de clientes, sino también las bajas).

Tengo creada una consulta de referencias cruzadas de las ventas, agrupando filas por año y columnas por mes. Si añado los clientes acumulados, me bastaría con hacer la división, pero el problema es que no todos los meses hay ventas ni altas o bajas de clientes. En las ventas los he solucionado poniendo en la consulta de referencias que las columnas sean 1;2;...hasta 12.

Pero al acumular clientes, me acumula los meses que hay altas o bajas, pero los meses que no hay ni altas ni bajas me aparece el valor cero, sin mantener el acumulado, y por tanto, no me calculará la media bien.

¿Alguna idea?

Tabla Nums ...

Es una tabla con un solo campo Num que contiene correlativos del 1 al 10000 (por ejemplo).

Haces una SELECT de la tabla Nums WHERE Num < 13 haciendo LEFT JOIN con tu consulta anterior y voilá .... xD

Ya lo siento, pero necesito más información: ¿Donde está esa tabla, o la tengo que crear?

No entiendo lo de Left Join, ¿que es, como lo puedo hacer?

Gracias

¿Me puedes poner un ejemplo?

Tengo creada esta consulta, ¿Como añado lo que me comentas? Una vez añadido lo que me comentes, calcularé los acumulados tal y como me comentaste.

SELECT Year([Fecha Alta]) AS Año, Month([Fecha Alta]) AS Mes, Count(Tabla_Clientes.[Fecha alta]) AS Altas, Count(Tabla_Clientes.[Fecha baja]) AS Bajas, [Altas]-[Bajas] AS Neto
FROM Tabla_Clientes
GROUP BY Year([Fecha Alta]), Month([Fecha Alta]);

Gracias

La Tabla Nums te la tienes que crear tú, ... aunque una vez que la tengas te será útil para el resto de tus aplicaciones.

Cuando se dice LEFT JOIN se está diciendo que se tomen todos los registros de la tabla situada a la izquierda y aquellos que contengan valores de la tabla situada a la derecha (supongo entonces que estarás haciendo las consultas con el diseñador gráfico de las mismas).

Ya lo he hecho y me va bien, pero la tabla nums la he tenido que crear con dos campos, año y mes. Porque si no, los meses sin valores no me cogía año. Sin embargo, creo que me dará problemas, ya que ahora solo he creado Datos para el 2016, y supongo que en cuanto cree los del 2017, me saldrán los registros futuros sin valores de otros campos. Además, tendré que crear más años y me dará el mismo problema.

Si has hecho eso, es que no has cogido la filosofía de la tabla Nums ... xD.

Si quieres coger año tambien, basta con que en tu consulta pongas otra vez la tabla Nums (la primera por la izquierda) y en las condiciones pongas los años que quieras sacar (2016, 2015 o 2016, ...). No pongas una relación entre ambas tablas Nums, ya que así te hará una relación Cartesiana, es decir por cada registro de la tabla "Años" te pondrá todos los de la tabla "Meses".

Prueba, te darás unos cuantos cabezazos contra la pared (como nos ha pasado a todos) pero el resultado merece la pena.

Como dices, estoy dándome de cabezazos con las paredes y no consigo nada. Según lo que entiendo, tengo que incluir dos veces la tabla nums, una de ellas a modo de meses (criterio <13) y otra a modo de años (por ejemplo: >2015 and <=Año(Fecha()) ), este criterio no se si es correcto, y por último la tabla "Puntos de venta NETOS por mes".

La tabla nums (que hace de mes) la relaciono por la izquierda, y la tabla nums que hace de año la dejo si relacionar.

El problema es que la consulta nu funciona y me da un error por combinaciones externas ambiguas.

Así que estoy atascado. AYUDA por favor.

Esto es lo que tengo hecho:

SELECT Tabla_Numeros.Mes, Tabla_Numeros_1.Mes, [Puntos de venta NETOS por mes].Altas, [Puntos de venta NETOS por mes].Bajas, [Puntos de venta NETOS por mes].Neto
FROM Tabla_Numeros AS Tabla_Numeros_1, Tabla_Numeros LEFT JOIN [Puntos de venta NETOS por mes] ON Tabla_Numeros.Mes = [Puntos de venta NETOS por mes].Mes
WHERE (((Tabla_Numeros.Mes)>2015) AND ((Tabla_Numeros_1.Mes)<13));

Escribí un par de entradas referidas al uso de la Tabla Números, una para un calculo anual y otra bienal. Me da que a ti te será útil la segunda ... :-)

LINK Tabla Números

¡Gracias por todo! Con este ejemplo que me has mandado lo he solucionado. Ya lo tengo en marcha

Al empezar a introducir datos de 2017 se me ha planteado un problema, no me acumula a los valores de 2016. Necesito que que el acumulado sea continuo. ¿Cómo puedo solucionarlo?

gracias

Revisa las fechas de corte en las WHERE's

En where tengo puesto 1=0, el primer registro corresponde al año 2016 mes 1. ¿Cómo puedo poner la cláusula where? Ten en cuenta que un campo es el año y otro el mes.

Gracias

El WHERE 1=0 se pone en la primera consulta para que se ejecute una vez e inicialice las variables de suma.

Tienes que ver dónde haces el corte de años y cambiarlo por el que deseas.

El SQL que tengo puesto es el siguiente:

SELECT [Puntos de Venta-Netos COMPLETO].Año, [Puntos de Venta-Netos COMPLETO].Mes, [Año] & [mes] AS Orden, [Puntos de Venta-Netos COMPLETO].Altas, [Puntos de Venta-Netos COMPLETO].Bajas, [Puntos de Venta-Netos COMPLETO].Netos, RT_SumarSQL_Altas(Null) AS [Netos Acumulados]
FROM [Puntos de Venta-Netos COMPLETO] where 20161=0
UNION ALL SELECT [Puntos de Venta-Netos COMPLETO].Año, [Puntos de Venta-Netos COMPLETO].Mes, [Año] & [mes] AS Orden, [Puntos de Venta-Netos COMPLETO].Altas, [Puntos de Venta-Netos COMPLETO].Bajas, [Puntos de Venta-Netos COMPLETO].Netos, RT_SumarSQL_Altas(Netos) AS [Netos Acumulados]
FROM [Puntos de Venta-Netos COMPLETO]
ORDER BY [Puntos de Venta-Netos COMPLETO].Año, [Puntos de Venta-Netos COMPLETO].Mes ;

Y el resultado que obtengo es:

No consigo solucionarlo, ¿alguna idea?

GRACIAS

Te vuelvo a repetir,

"El WHERE 1=0 se pone en la primera consulta para que se ejecute una vez e inicialice las variables de suma."

La cuestión es que sea una condición false, da igual que pongas 1 = 0, que 20161 = 0 que 'a' = 'b'.

Supongo que la consulta tiene 'más cosas' porque con lo que enseñas no obtendrías ese resultado.

Yo creo que el problema es que no me mantiene el orden de la consulta origen "Puntos de Venta-Netos COMPLETO", su SQL es:

SELECT [Puntos de Venta-Altas COMPLETO].Año, [Puntos de Venta-Altas COMPLETO].Mes, [Puntos de Venta-Altas COMPLETO].Altas, [Puntos de venta-Bajas 1].Bajas, Nz([Altas])-Nz([Bajas]) AS Netos
FROM [Puntos de Venta-Altas COMPLETO] LEFT JOIN [Puntos de venta-Bajas 1] ON ([Puntos de Venta-Altas COMPLETO].Mes = [Puntos de venta-Bajas 1].Mes) AND ([Puntos de Venta-Altas COMPLETO].Año = [Puntos de venta-Bajas 1].Año)
ORDER BY [Puntos de Venta-Altas COMPLETO].Año, [Puntos de Venta-Altas COMPLETO].Mes;

Sin embargo en la SQL de la consulta de acumulados, si no pongo orden de salida de resultados "ORDER BY [Puntos de Venta-Netos COMPLETO].Año, [Puntos de Venta-Netos COMPLETO].Mes", el resultado que obtengo es el siguiente:

SELECT [Puntos de Venta-Netos COMPLETO].Año, [Puntos de Venta-Netos COMPLETO].Mes, [Año] & [mes] AS Orden, [Puntos de Venta-Netos COMPLETO].Altas, [Puntos de Venta-Netos COMPLETO].Bajas, [Puntos de Venta-Netos COMPLETO].Netos, RT_SumarSQL_Altas(Null) AS [Netos Acumulados]
FROM [Puntos de Venta-Netos COMPLETO] where 20161=0
UNION ALL SELECT [Puntos de Venta-Netos COMPLETO].Año, [Puntos de Venta-Netos COMPLETO].Mes, [Año] & [mes] AS Orden, [Puntos de Venta-Netos COMPLETO].Altas, [Puntos de Venta-Netos COMPLETO].Bajas, [Puntos de Venta-Netos COMPLETO].Netos, RT_SumarSQL_Altas([Netos]) AS [Netos Acumulados]
FROM [Puntos de Venta-Netos COMPLETO]

Si te fijas, este es el resultado que obtengo, pero reordenado. Por tanto, creo que el problema es que no coger los datos ordenados de la consulta de partida.

A mi me sobra el campo orden ... directamente ordénala por Año y Mes (la última consulta que ejecutas)

Ya he quitado ese campo, pero sigo igual. Como te comentaba, el problema es que la consulta, al tomar los datos de la consulta original no mantiene el orden dado en esa consulta original, y al tomarlos en otro orden, calcula el acumulado en ese orden.

Si hago la consulta, simple, sin incluir la unión, si que mantiene el orden. El problema es al crear la unión, que es cuando se desordena la resultado.

GRACIAS

Eso es lo que te comentaba, que ordenes en la última consulta, en este caso la unión ...

¿No es eso lo que tengo hecho?

SELECT [Puntos de Venta-Netos COMPLETO].Año, [Puntos de Venta-Netos COMPLETO].Mes, [Puntos de Venta-Netos COMPLETO].Altas, [Puntos de Venta-Netos COMPLETO].Bajas, [Puntos de Venta-Netos COMPLETO].Netos, RT_SumarSQL_Altas(Null) AS [Netos Acumulados]
FROM [Puntos de Venta-Netos COMPLETO] where 20161=0
UNION ALL SELECT [Puntos de Venta-Netos COMPLETO].Año, [Puntos de Venta-Netos COMPLETO].Mes,[Puntos de Venta-Netos COMPLETO].Altas, [Puntos de Venta-Netos COMPLETO].Bajas, [Puntos de Venta-Netos COMPLETO].Netos, RT_SumarSQL_Altas([Netos]) AS [Netos Acumulados]
FROM [Puntos de Venta-Netos COMPLETO]
ORDER BY [Puntos de Venta-Netos COMPLETO].Año, [Puntos de Venta-Netos COMPLETO].Mes;

Si no es esto, no se a que te refieres ni como hacerlo

¿Lo has probado ya?

Si, así lo he puesto pero sigo igual. Yo creo que me ordena la consulta después de hacer el cálculo del acumulado, y por eso no lo calcula bien. Si es así, necesito ordenar la consulta antes de hacer el cálculo del acumulado. Se me desordena al incluir la unión. Si no hago la unión, si que me mantiene el orden.

Yo estoy completamente perdido, ... por cierto, para sacar los años / meses que no tienen valor ¿cómo lo haces? ...

He seguido el consejo que me diste con la Tabla_Nums

Y ¿dónde está? ... No lo veo ... postea todo lo que estás haciendo ...

Voy paso a paso: 

Paso 1: Consulta "Puntos de Venta-Altas 1". Cálculo de altas agrupadas por año y mes

SELECT Year([Fecha alta]) AS Año, Month([Fecha alta]) AS Mes, Count(Tabla_Clientes.Referencia) AS Altas
FROM Tabla_Clientes
WHERE (((Tabla_Clientes.[Punto de venta])=True))
GROUP BY Year([Fecha alta]), Month([Fecha alta])
ORDER BY Year([Fecha alta]) DESC;

Paso 2: Consulta "Combinacion años meses hasta fecha actual"

SELECT Tabla_Numeros.Mes AS Año, Tabla_Numeros_1.Mes AS Mes
FROM Tabla_Numeros, Tabla_Numeros AS Tabla_Numeros_1
WHERE (((Tabla_Numeros.Mes) Between 2016 And Year(Date())) AND ((Tabla_Numeros_1.Mes)<13));

Paso 3: Consulta "Puntos de Venta-Altas COMPLETO" Combino con Tabla_Nums para añadir los meses sin datos

SELECT [Combinacion años y meses hasta fecha actual].Año, [Combinacion años y meses hasta fecha actual].Mes, [Puntos de venta-Altas 1].Altas
FROM [Combinacion años y meses hasta fecha actual] LEFT JOIN [Puntos de venta-Altas 1] ON ([Combinacion años y meses hasta fecha actual].Mes = [Puntos de venta-Altas 1].Mes) AND ([Combinacion años y meses hasta fecha actual].Año = [Puntos de venta-Altas 1].Año);

Paso 4: Consulta "Puntos de Venta-Bajas 1". Cálculo de bajas agrupadas por año y mes

SELECT Year([Fecha baja]) AS Año, Month([Fecha baja]) AS Mes, Count(Tabla_Clientes.Referencia) AS Bajas
FROM Tabla_Clientes
WHERE (((Tabla_Clientes.[Punto de venta])=True))
GROUP BY Year([Fecha baja]), Month([Fecha baja])
ORDER BY Year([Fecha baja]) DESC , Month([Fecha baja]);

Paso 5: Consulta "Puntos de Ventas-Netos COMPLETO"

SELECT [Puntos de Venta-Altas COMPLETO].Año, [Puntos de Venta-Altas COMPLETO].Mes, [Puntos de Venta-Altas COMPLETO].Altas, [Puntos de venta-Bajas 1].Bajas, Nz([Altas])-Nz([Bajas]) AS Netos
FROM [Puntos de Venta-Altas COMPLETO] LEFT JOIN [Puntos de venta-Bajas 1] ON ([Puntos de Venta-Altas COMPLETO].Mes = [Puntos de venta-Bajas 1].Mes) AND ([Puntos de Venta-Altas COMPLETO].Año = [Puntos de venta-Bajas 1].Año)
ORDER BY [Puntos de Venta-Altas COMPLETO].Año, [Puntos de Venta-Altas COMPLETO].Mes;

Y por último la consulta de Union:

SELECT [Puntos de Venta-Netos COMPLETO].Año, [Puntos de Venta-Netos COMPLETO].Mes, [Puntos de Venta-Netos COMPLETO].Altas, [Puntos de Venta-Netos COMPLETO].Bajas, [Puntos de Venta-Netos COMPLETO].Netos, RT_SumarSQL_Altas(Null) AS [Netos Acumulados]
FROM [Puntos de Venta-Netos COMPLETO] where 20161=0
UNION ALL SELECT [Puntos de Venta-Netos COMPLETO].Año, [Puntos de Venta-Netos COMPLETO].Mes,[Puntos de Venta-Netos COMPLETO].Altas, [Puntos de Venta-Netos COMPLETO].Bajas, [Puntos de Venta-Netos COMPLETO].Netos, RT_SumarSQL_Altas([Netos]) AS [Netos Acumulados]
FROM [Puntos de Venta-Netos COMPLETO]
ORDER BY [Puntos de Venta-Netos COMPLETO].Año, [Puntos de Venta-Netos COMPLETO].Mes;

También te pongo el módulo de acumulación:

Public Function RT_SumarSQL_Altas(nDato_Altas) As Double
'variable que no se pierde entre las distintas llamadas
Static nSUMA_Altas As Double

If IsNull(nDato_Altas) Then 'si nDato es nulo: variable a cero y salida
nSUMA_Altas = 0
Exit Function
End If
nSUMA_Altas = nSUMA_Altas + nDato_Altas
RT_SumarSQL_Altas = nSUMA_Altas

End Function

Ya se que es un poco locura... A ver si eres capaz de entenderlo y echarme una mano

Yo lo he hecho en un módulo, no me gusta crearme 18 consultas auxiliares:

Private Sub Comando16_Click()
Dim Ws As String, Xs As String, Ys As String, Zs As String
' Base de Calculo Altas
Xs = "SELECT Year(FechaAlta) AS AñoC, Month(FechaAlta) AS MesC, Count(Cliente) AS Altas " & _
"FROM ClientesJon " & _
"WHERE IsDate(FechaAlta) " & _
"GROUP BY Year(FechaAlta), Month(FechaAlta)"
' Base de Calculo Bajas
Ys = "SELECT Year(FechaBaja) AS AñoC, Month(FechaBaja) AS MesC, Count(Cliente) AS Bajas " & _
"FROM ClientesJon " & _
"WHERE IsDate(FechaBaja) " & _
"GROUP BY Year(FechaBaja), Month(FechaBaja)"
' Tabla con los doce meses de los años que queremos seleccionar
Zs = "SELECT TNumeros.Numero AS Año, TNumeros_Mes.Numero AS Mes " & _
"FROM TNumeros, TNumeros AS TNumeros_Mes " & _
"WHERE TNumeros.Numero Between 2016 And 2017 AND TNumeros_Mes.Numero Between 1 And 12"
' juntando todo
Ws = "SELECT Año, Mes, Altas, Bajas, Nz(Altas,0) - Nz(Bajas,0) AS Neto, RT_SumarSQL(Neto) AS Acumulado " & _
"FROM ((" & Zs & ") AS T1 LEFT JOIN (" & Xs & ") AS T2 ON (T1.Mes = T2.MesC) AND (T1.Año = T2.AñoC)) " & _
"LEFT JOIN (" & Ys & ") AS T3 ON (T1.Mes = T3.MesC) AND (T1.Año = T3.AñoC) " & _
"ORDER BY Año, Mes"
' iniciamos contador suma
RT_SumarSQL (Null)
CurrentDb.Execute "SELECT * INTO TResultadosJon FROM (" & Ws & ")"
End Sub

Pasos que doy:

- Preparo consulta con las Altas

- Preparo consulta con las Bajas

- Preparo consulta con Años/Meses

- Inicializo la suma

- Lanzo la consulta final, que relaciona la consulta de Años/Meses con las Altas, las Bajas, calcula el Neto y el arrastre

¿Te funciona bien? ¿Como lo paso al formulario, con la propiedad Form.RecordSource?

Pues si, ... en vez de ejecutar:

Currentdb.Execute ...

Haces:

Me.Form.RecordSource = Xs

Y p'alante...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas