Variación porcentual entre datos de diferentes periodo

Tengo una consulta en vista de tabla dinámica de access. En dicha consulta tengo algunos campos entre los cuales se encuentran: año, mes, articulo, cantidad, costos totales. Lo que necesito es que haya un campo en la tabla dinámica (ya sea campo calculado ) que me permita calular la variación de la cantidad o de los Costos totales de un mes con respecto al anterior. Es decir, la variación de febrero con respecto a enero me marzo con respecto a febrero y así sucesivamente. En una tabla dinámica de excel esto se hacer relativamente fácil, puesto que la tabla dinámica tiene una opción para campos calculados que es: mostrar como porcentaje de la diferencia con respecto al anterior. Pero en access no he encontrado esta opción. Solo encontré una que sirve para mostrarlo como porcentaje de participación de un total de la fila o de la columna (no se si me explico bien). Ne necesitar alguna aclaración

6 Respuestas

Respuesta
1
La verdad es que las tablas dinámicas en access ha evolucionado mucho, pero sigue sin tener el potencial de las hojas de calculo. Su pongo que la solución la tendrás que generas a través de una consulta previa que incorporarás en la tabla dinámica.
Respuesta
1
He estado investigando y me pasa lo mismo, no encuentro esa opción.. en access 2003.
En access 2007 no lo se, puede que exista pero lo desconozco. Siento no poderte ayudar más
Respuesta
1
Creo que esto mediante consulta no se puede hacer, tendría que hacerse mediante código. Si te interesa podríamos confecionarlo.
Muy buenos días. Claro que me gustaría que lo hiciéramos. La idea es obtener el dato cantidad del mes anterior y unirlo en una consulta con la del mes actual para después calcular la variación. La idea es que en una misma consulta y en una misma linea me quede la cantidad actual y la cantidad del mes anterior. Espero tus sugerencias. Muchas gracias
Creas una tabla (VariacionMes) con los campos Año, Mes, Artículo, CosteMesActual, CosteMesAnterior
Mediante una consulta de anexar datos introducirías en esta tabla los datos de los campos Año, Mes, artículo y CosteMesActual, el campo CosteMesAnterior lo vamos a actualizar mediante el código:
Function Variacion()
Dim db As Database
Dim rs As Recordset
Dim var As Double
Dim vArt As String
Set db = CurrentDb
Set rs = db.OpenRecordset("Select * from VariacionMes order by Articulo,Año,Mes")
Do While Not rs.EOF
vArt = rs!Articulo
Do While Not rs.EOF And vArt = rs!Articulo
var = rs!CosteMesActual
rs.MoveNext
If rs.EOF Then
Exit Do
End If
If vArt <> rs!Articulo Then
var = 0
End If
rs.Edit
rs!CosteMesAnterior = var
rs.Update
Loop
Loop
End Function
Buenas tardes experta. Muchas gracias por su ayuda. Disculpe mi ignorancia pero no se por donde ingreso el código que me diste al campo de la tabla de tal manera que ella se actualice automáticamente cada que la abra o ejecute. ¿El código no presenta ningún problema en el momento en de averiguar el dato del mes anterior de enero de un año con respecto a diciembre del otro? Ne nuevo le reitero mi gratitud por su ayuda.
El código se puede ejecutar de varias maneras, la más inmediata es en la pestaña módulos, abres un módulo nuevo y creas la función (Function- End Function), desde aquí mismo lo puedes ejecutar. Esta función también la puedes llamar desde una macro (EjecutarCódigo) y pones el nombre de la función. También lo podrías hacer desde un formulario insertando un botón, vas a las propiedades del botón (Botón derecho ---->Propiedades) y por ejemplo en el evento Al hacer clic pones procedimiento de evento, pulsas en el cuadradito de la derecha (el de los tres puntitos) y escribes hay el código.
En cuanto a los años, no hay ningún problema, ves que en la sql tienes ordenado por articulo, año, mes por lo tanto si lo ordenas adecuadamente para un artículo primero te lo ordenaría por año y dentro del año por mes. Tienes que tener en cuenta que para ordenar por mes, si el campo lo tienes como texto, tendrías que meter dos dígitos para que la ordenación sea la correcta: 01, 02, 03... Sí no lo pones como numérico y listo: 1, 2, 3...
Muy buenos días experta, te voy a poner un poco más en contexto para que así me puedas ayudar un pocos más (disculpa la molestia). Trabajo para una empresa del sector agroindustrial la idea es realizar una interfaz con un aplicativo de inventarios que se maneja en una finca lechera. El aplicativo de inventarios tiene una tabla DBF denominada movimientos la cual tengo vinculada a access (en esta tabla se encuentra registrada la información fundamental que necesito). Yo realizo una consulta de dicha tabla vinculada de la cual extraigo los campos fecha, articulo, cantidades, unidad, costos. Ya en campos calculados extraigo el numero de la semana de la fecha del movimiento, lo mismo que el mes de la fecha y el año. Como yo tengo los consumos históricos día a día de los movimientos y los nuevos registros se van a actualizar automáticamente a la interfaz (porque la tabla de movimientos esta vinculada), la idea es a través de una consulta de la que ya hice calcular la variación por semanas, mensual y anual entre un rango de fechas que yo ingrese. La idea es dar esta interfaz en administración (la persona que la maneja no sabe nada de access, entonces la idea es darle un aplicativo que no sea si no apretar botones y se ejecute las consultas previamente diseñadas por nosotros). Entonces una de las consultas fundamentales (como ya lo mencione) es las variaciones de los costos. Inicialmente trabaje todo en tablas dinámicas (teniendo la experiencia de que en excel dichas tablas dinámicas me permiten calcular esta variación muy fácilmente, ya que tiene una opción de campo calculado que es mostrar como porcentaje de la diferencia del mes anterior), pero las tablas dinámicas de access no son tan funcionales como las de excel. Investigando me di cuenta que tenia que realizar este calculo manualmente en el diseño de la consulta que después mostraría como vista de tabla dinámica. Para realizar este calculo necesito tener al frente de la cantidad del mes actual la cantidad del mes anterior, lo mismo con las semanas y con los años. Como ya te explique todo (disculpa lo extenso), la idea es que me ayudes a incorporar el código que me diste en la respuesta anterior a la consulta que ya te mencione. No se si fui muy enredado para explicarme, de ser así por favor pídeme la aclaración. Muchas gracias por tu ayuda y de nuevo disculpa la molestia.
Primero: Access no es Excel, Access es una Base de Datos y como tal se debe tratar, no como una hoja de cálculo como Excel.
Un código no se puede incorporar a una consulta, creo que debes pensar en una Base de Datos y olvidarte de una hoja de cálculo, con esto no quiero decir que excel sea malo, al contrario, para muchas cosas es excelente, pero no deja de ser una HOJA DE CALCULO.
Si quieres hacerlo en Access, ten en cuenta que tienes que cambiar la filosofía de excel, trata con tablas cuyos campos actualizas o insertar por medio de código o de consultas (esto último cuando es posible), no es posible insertar un código en una consulta, lo tienes que ejecutar desde fuera (en un módulo, macro, botón...), en el código que te puse, por ejemplo hay un Do While --- Loop, esto es recorrer los registros que has seleccionado en el recordset, esto no se puede hacer en una consulta.
Te explico el código (lo que va precedido por ' son los comentarios:
'Definimos la variables con Dim As: db -->Database (la Base de Datos) rs --->Recordset '(Un recordset es una consulta de selección que lo defines con el lenguaje sql, cualquier 'consulta que realices se hace con sql, cuando la realizas desde la pestaña consulta si 'vas al icono superior izquierdo tienes tres opciones: modo vista, modo diseño y modo 'sql, ahí puedes ver la sql que genera) otra variable que llamo var, la defino como doble 'porque va a servir para la cantidad y otra que llamo vArt que la defino como texto 'porque va a servir para el artículo.
Dim db As Database
Dim rs As Recordset
Dim var As Double
Dim vArt As String
'Activo la Base de Datos en la que voy a trabajar, como es en la que estoy no pongo 'ninguna dirección
Set db = CurrentDb
'Creo es recordset de datos sobre los que voy a trabajar
Set rs = db.OpenRecordset("Select * from VariacionMes order by Articulo,Año,Mes")
'Empiezo el blucle: Mientras Not rs.EOF es decir mientras no sea final de fichero hazme
Do While Not rs.EOF
'Igualo la variable vArt al valor del campo Articulo en el registro en que estamos
vArt = rs!Articulo
'Empiezo otro bucle, este bucle le pongo dos condiciones: la 1ª es que no sea final de 'fichero y la 2ª es que la variable vArt siga siendo igual al valor del campo Articulo
Do While Not rs.EOF And vArt = rs!Articulo
'Igualo la variable var al valor del campo CosteMesActual en este registro
var = rs!CosteMesActual
'Voy al siguiente registro
rs.MoveNext
'Pregunto: Si Rs.EOF es decir si es final de fichero Exit Do ---> Sal del bucle
If rs.EOF Then
Exit Do
End If
'Pregunto Si el artículo de este registro es distinto del anterior, empezamos de nuevo '(var=0)
If vArt <> rs!Articulo Then
var = 0
End If
'Si el articulo es igual al anterior: Editame el recordset, iguala el campo CosteMesAnterior 'a la variable var y Reemplaza el campo CosteMesAnterior con el valor de la variable
rs.Edit
rs!CosteMesAnterior = var
rs.Update
'Loop fin del bucle
Loop
Loop
En fin, hazme saber tus dudas y seguiremos avanzando.
Muy buenas tardes experta, te agradezco inmensamente tu ayuda y por supuesto que tengo muy claro la diferencia entre las funcionalidades de excel y access. ¿Te pregunto si el código que me dizte no puede realizarse en lenguaje Sql para así poderlo ejecutar en una consulta? ¿De ser posible te pregunto si vos sabes de que forma se hace en sql? Muchas gracias por su inmensa ayuda.
Nunca dude de que tuvieses clara la diferencia entre access y excel, lo que te quería decir es que hay que cambiar el "chip" cuando pasas de uno a otro.
Creo que no se puede hacer en sql, por ejemplo el Do While es lenguaje visual.
¿Has ejecutado el código, por ejemplo desde un módulo?
Buenas tardes experto, agradezco mucho su ayuda. Solo tengo otra inquietud. Como hago para abrir desde access una hoja especifica de excel, utilizo un botón para ejecutar una consulta donde abro el archivo de excel, pero quisiera ademas abrirlo en una hoja especifico. El código que actualmente utilizo es el siguiente, espero puedas ayudarme.
Private Sub Comando4_Click()
Dim abrir As Long
On Error GoTo Err_Comando0_Click
    Dim stDocName As String
    DoCmd.SetWarnings (warningsoff)
    stDocName = "VARIACIONSEM"
    DoCmd.RunMacro stDocName
    DoCmd.SetWarnings (warningsOn)
    abrir = Shell("excel.exe C:\CONSULTA_VARIACIONSEM", vbMaximizedFocus)
Exit_Comando0_Click:
    Exit Sub
Err_Comando0_Click:
    MsgBox Err.Description
    Resume Exit_Comando0_Click
End Sub
De antemano agradezco su pronta respuesta
Yo, para ir a un documento o página web utilizo:
Application. FollowHyperlink "D:\<direción>\NombreArchivo.doc"  o .exe etc.
Nunca he intentado ir a una hoja determinada.
Buenas tardes, muchas gracias por tu respuesta seguiré investigando ya que aun no encuentro nada.
Al final no se si te valió el código o no ¿lo utilizaste?
Creo que lo de abrir un excel es otra pregunta, que ya te digo nunca he intentado abrir una hoja determinada, si he importado una hoja, pero nunca la he abierto.
Respuesta
1
Creo que con lo que te respondí en la otra pregunta te sirva para las dos dudas.
De todas formas, si no es así, dímelo
Respuesta
1
Bien, necesitaremos hacer varias cosas para eso.
Necesito saber el nombre de la tabla, en nombre del campo fecha (que sera el pivote), el nombre del campo de costos totales, y el nombre el campo el objeto que genera ese costo.
Muy buenos días experto, disculpa la intensidad, es solo que lo que estoy haciendo es un poco urgente. Tengo una consulta donde tengo los campos mes, año, cantidad, costos totales, la idea es obtener en un campo calculado el dato de la cantidad del mes anterior, es decir que me quede algo así.
Los datos los tengo en una consulta de nombre prueba
Mes año cant costo mesant cantmesant
2 2010 100 3000 1 200
3 2010 150 2000 2 100
4 2010 300 2500 3 150
Todo esto es con el fin de poder calcular la variación porcentual entre la cantidad de un mes con la del mes anterior.
El problema ha sido para obtener el dato del mes anterior. Lo que se me ha ocurrido es utilizar una consulta en la cual obtengo de la consulta prueba, los campos de mes, año, cant, costo.
Luego realizo otra consulta para para unir las dos anteriores (prueba y la nueva). Las relaciono por medio de los campos año y también relaciono el campo mesant (=mes-1) de la consulta prueba con el campo mes de la consulta nueva. La idea es que en esta tercera consulta (en la cual relaciono los campos anteriores), me traigo el campo mes de la tabla prueba, año de la tabla prueba, cant de la tabla prueba, y la cant de la tabla nueva (la idea era que como relacione las tablas por medio de los campos mesant y mes me trajera la cantidad del mes anterior).
No se si me explico bien, de no ser así me pides la aclaración por favor. El hecho es que lo que he realizado no me arroja datos coherentes en el campo que espero me devuelva la cantidad anterior. (Se me ocurre que es porque analizo datos que se encuentra dentro de un rango de fecha de más de un año, entonces hay varios meses 1 o varios meses 2 o varios meses 3). De ser posible me gustaría que me ayudaras a solucionar la inquietud y de ser posible me gustaría también que me diligenciaras en como hacer para restar el mes de enero de un año con respecto al diciembre del mes anterior (esto es porque para calcular el mes anterior, utilizo mes=mes-1, entonces cuando el mes es 1 me va a mostrar el valor 0 y no me realiza la diferencia con respecto al mes 12 del año anterior). Quisiera saber que estoy haciendo mal o simplemente si esto no me va a funcionar y siendo así cual seria la forma optima de hacerlo. Muchas gracias por su ayuda y prestancia.
Bien,
Create una consulta con los campos mes, cant y el campo calculado mesant: [mes]-1 y la guardas (la llamamos Consulta1 por ejemplo)
Creamos otra consulta en diseño y muestras las tablas prueba y la consulta1
Coges mes de la tabla prueba y lo arrastras encima de mesant de la consulta1
Y finalmente muestras:
Mes y cant de la consulta1 y luego mes y cant de la tabla prueba (estos dos últimos serán mesant y cantmesant)
Y ya esta
Respuesta
1
Siento decirte que access no tiene todas las funcionalidades de excel. Yo personalmente he realizado muchos trabajos del tipo que me comentas y lo que hago es que cuando ya tienes la tabla dinámica, los exportas todo a excel y realizas los calculo en excel (es la mejor solución).
Buenos días experto, muchas gracias por su respuesta. Te entiendo y lo pensé hacer, el hecho es que lo que estoy realizando es un aplicativo para una finca cuyos usuarios no son muy dúctiles en excel y access, por eso me toca dárselo todo ya hecho, en estos momentos estoy intentando desarrollar lo que quiero desde el diseño de la consulta, pero estoy teniendo inconvenientes para extraer el dato de la cantidad del mes anterior en la misma linea del dato de la cantidad actual.
Suerte y animo!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas