Access - Día inicio mes para pivotar en consulta

 
Vista:
sin imagen de perfil
Val: 55
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Día inicio mes para pivotar en consulta

Publicado por Antuan (19 intervenciones) el 19/01/2020 11:51:27
Buenos días a todos,

Estoy haciendo una consulta de referencias cruzadas para separar registros por fecha, el caso es que quiero que le mes empiece por el día 25.

Usando la función Format en el campo fecha tal que así Format(SerieFecha(Año([fecha]);Mes([fecha]);25);"mmm") y luego que pivote en los nombres de los meses, pero sigue separando los valores por los meses a partir del día 1,

También lo he intentando por criterios donde al campo fecha le digo "ENTRE SerieFecha(Año([fecha]);Mes([fecha])-1;26);"mmm") Y SerieFecha(Año([fecha]);Mes([fecha]);25);"mmm")"

pero esto solo me muestra el mes actual donde se cumple el criterio.

He estado mirando formas de pivotar el campo fecha desde sql e intentado hacerlo pero no consigo hacerlo...
la sentencia sería:

"PIVOT Format(DateSerial(Year([fecha]),Month([fecha]),25),"mmm") In ("ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic");

Alguién sabe alguna manera?

Gracias de antemano!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Día inicio mes para pivotar en consulta

Publicado por Anonimo (1819 intervenciones) el 20/01/2020 11:49:43
Para 'agrupar' a capricho hay que crear un conjunto que sea homogéneo, es complicado que Access (o cualquier base de datos normalizada) entienda que los meses y los días son a capricho del programador (aunque se requieran esas condiciones), para las maquinas enero ese enero desde el día uno al treinta y uno y febrero ídem pero solo del uno al veintiocho (y en ocasiones veintinueve) asi también para el resto.

Una formula que podría reorganizar a placer o necesidad

La función DATESERIAL (Año, Mes, Día)

FechaXX: SerieFecha(Año([FECHA])-((Mes([FECHA])-(Día([FECHA])>24)>12));Mes([FECHA])-(Día([FECHA])>24) Mod 12;Día([FECHA]))

Con esa expresión lo que se logra en una 'fecha equivalente' esto es se considera que si el día del mes es superior a 24, a esa fecha se la 'traslada' al siguiente mes (teniendo en cuenta que si el mes es diciembre, el siguiente será enero) y así con el año (no hay mes 13) …

Como es natural el día de ese conjunto carece de sentido y lo adecuado -dado que se pretende agrupar sin mas- lo idóneo seria quedarse con la parte que calcula el 'mes' y utilizarlo para agrupar y mantener la fecha para ordenar (o el 30 de enero pasaría a ser el 30 de febrero y no seria una fecha valida)

En fin, ese es un método mas de los que muestran un camino para alcanzar la solución optima.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 55
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Día inicio mes para pivotar en consulta

Publicado por Antuan (19 intervenciones) el 20/01/2020 14:35:25
Gracias Ánonimo por tu ayuda, la función tal cual la has puesto funciona para dar el formato al mes que necesitaba, eso si, he de reconocer que me pierdo un poco analizandola, entiendo que los guiones no son restas de valores sino separadores distintos a los ";", por otra parte todavía no entiendo la lógica de como la has planteado, pero viendo el resultado voy a darle vueltas.
Estoy más o menos empezando con Access y VBA y hay muchos conceptos en los que me pierdo, tu explicación ha sido bastante reveladora, y te agradezco que lo hayas explicado así,

Un saludo y muchas gracias!!

Caso cerrado!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Día inicio mes para pivotar en consulta

Publicado por Anonimo (1819 intervenciones) el 20/01/2020 19:11:47
La lógica utilizada es simple (una vez que se entiende como funciona Access).

Para Access un True y False los representa matemáticamente (el lenguaje del ordenador) como -1 (= true) y 0 (= false) que según el idioma local se traducirá como: cierto/falso, Si/No …..

Si el día es mayor que 24 responderá con CIERTO, SI, VERDADERO, TRUE … en esencia lo mismo, pero lo 'real' … -1
¿Por qué menos uno? porque es: diferente de cero (que es el valor para false) y no tiene que ser -1, con no ser cero ya es verdadero

(-1 es una licencia del programador, en binario puro es: cero/uno, pero Access utiliza un 'entero largo' para ese dato, siempre quedara ¿es cero? : es falso, ¿no es cero?: es verdadero)

Lógicamente si le sumo a una cifra un -1, en la practica se le resta
Asumiendo las reglas matemáticas:
si le resto una cifra/valor negativo … en la practica le sumo esa cifra/valor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 55
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Día inicio mes para pivotar en consulta

Publicado por Antuan (19 intervenciones) el 20/01/2020 20:19:38
Si , lo de 0 verdadero -1 falso si lo entiendo, lo que no entiendo, y voy a darle vueltas, es como has planteado la función:

para el primer argumento pones el año del campo fecha menos (el mes de la fecha - (el dia de la fecha siendo mayor que 24) siendo mayor que 12)..., luego para el argumento mes otro tanto pero devolviendote el modulo de 12.. en fin, me pierdo.. el resultado es el que busco, pero no acabo de enteder, el planteamiento y es lo que me gustaría saber para poder usarlo por mi mismo con criterio.

Una vez más gracias por la explicación!

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Día inicio mes para pivotar en consulta

Publicado por Anonimo (1819 intervenciones) el 20/01/2020 21:09:50
Las operaciones se hacen desde dentro a afuera (esto es: primero se resuelven los paréntesis y comenzando por el mas profundo)

Analizando esto:
Mes([FECHA])-(Día([FECHA])>24) Mod 12

Fecha uno 15/7/2019, fecha dos 26/8/2019, fecha tres 26/12/2019

Fecha uno calculado:
Mes([FECHA]) ===> 7
(Día([FECHA]) ==> 15
¿Día > 24? ==> Falso (0)
7 - (0) = 7
(La función Mod devuelve el resto de la división)
7 Mod 12 = 7 no se cambia el mes

Fecha dos calculado:
Mes([FECHA]) ===> 8
(Día([FECHA]) ==> 26
¿Día > 24? ==> True (-1)
8 - (-1) = 9
(La función Mod devuelve el resto de la división)
9 Mod 12 = 9 se incremento el mes

Fecha tres calculado:
Mes([FECHA]) ===> 12
(Día([FECHA]) ==> 26
¿Día > 24? ==> True (-1)
12 - (-1) = 13 …. ¿existe un decimo tercer mes en un calendario normalizado? ==> NO
(La función Mod devuelve el resto de la división)
13 Mod 12 = 1 …. de diciembre (mes 12) se trasfiere a enero (mes uno) y -como es lógico- en consecuencia se incrementara el año

(ojala el concepto tiempo se contase a voluntad 'para atrás'...)

Una pista 'estética' (para lograr una presentación acorde a las normas consensuadas)

(en la ventana de inmediato):
?monthname(12)

Solo hay que tener en cuenta que el dato 12 al dividir por 12 devolverá cero y no existe un mes cero .... habría que condicionarlo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 55
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Día inicio mes para pivotar en consulta

Publicado por Antuan (19 intervenciones) el 20/01/2020 21:22:02
Sublime, ahora si ha quedado claro!!

Gente como tu, hacéis falta, gracias por tu tiempo y tu explicación, espero sirva para otros también.

Voy a seguir peleando con otras consultas de access que también me tienen liado...

porcierto, tampoco sabia que se podía escribir en la ventana de inmediato, pensaba que solo era para probar procedimientos o funciones al momento jejeje

Gracias de nuevo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 55
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Día inicio mes para pivotar en consulta

Publicado por Antuan (19 intervenciones) el 21/01/2020 21:32:56
Hola de nuevo Ánonimo,

Me ha surgido un contratiempo con la función,
Como la idea es que esta consulta se útil en el tiempo he añadido el nombre del año a la función format, obteniendo el mes-año de los registros, el problema es que si añado registros en el mes de diciembre que pasen del día 25 los cuenta para el mes siguiente pero también se incrementa el año,

en este caso, para registros del 26-12-2019 pasan a enero de 2021.

He intentado sin éxito editar la función pero no consigo que respete el año, de la misma manera, si dejo de poner el año en el formato los registros de diciembre de 2020 se suman a enero de 2020

Crees que se puede solucionar esto?

Gracias por todo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Día inicio mes para pivotar en consulta

Publicado por Anonimo (1819 intervenciones) el 22/01/2020 15:50:16
Desconozco la necesidad así como el entorno y las aportaciones solo son un punto de vista cara a encontrar la solución optima.

Creo que no tengo clara la necesidad, en principio no veo que aporta el introducir el año en este lio, de hecho la fecha ha de estar siempre presente (es el dato real y en base a ella se tienen que hacer las restricciones, agrupaciones y organizaciones).

Lo único que en teoría se necesita es obtener una 'agrupación mensual' diferente a la normalizada el resto ….

En teoría y basándonos en que UN PERIODO (que no mes) comienza un día concreto del un mes y finaliza el anterior al mismo día anterior del siguiente mes, solo aporta un dato que permite agrupar como unidad a ese conjunto, de hecho NO es un mes es una mezcla de datos que abarca parte de dos 'meses consensuados' y como tal agrupación se le puede asignar un nombre o dejarlo en simple numero o ID.

.- SI se desea filtrar por un periodo determinado (digamos que AÑO) se ha de utilizar el dato FECHA REAL y no el dato calculado que no deja de ser un 'dato inventado'
.- Si se desea agrupar por años (si intervienen varios o mas de uno) se tiene que utilizar también el dato FECHA REAL
.- Finalmente si se desea organizarlos cronológicamente también se ha de utilizar el dato FECHA REAL

Y como es natural en casos como este el dato FECHA REAL puede estar oculto (y todo funciona igual)

En ese entorno artificial consensuado (periodo comienza un mes y finaliza otro), es lo mas normal que entren en juego los doce meses del año y ….. el ultimo mes del año anterior esto es:
.- si se filtra por el año le faltaran datos al mes de enero (están en el mes de diciembre anterior)
.- le sobraran datos (los finales de diciembre del año actual)

Y …. eso solo indica que todo funciona como se ha programado

Sobre la formula …. cualquier formula que sea capaz de diferenciar el dato de referencia (en este caso el día 25) del dato real a analizar es valida y si, sobraría la función MOD si se tiene en cuenta (y corrige) el mes de enero (añadiendo el final del año anterior) y se descartan los datos cuya fecha sobrepase el día 25 del mes de diciembre ¿Qué esos meses no entran en la ecuación? pues: ni sobra ni falta nada

Es mas, la función MOD no es la idónea si no se le ajustan sus desfases, es un método pero hay que adaptarlo al entorno real.

Sinceramente, el supuesto futuro de el problema planteado lo veo resuelto con una función
.- la función recibiría una fecha y devolvería un dato: el mes (grupo, subconjunto …) al que se le asigna
.- el orden y el periodo global tendrán que utilizar como dato la fecha real.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 55
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Día inicio mes para pivotar en consulta

Publicado por Antuan (19 intervenciones) el 24/01/2020 20:16:00
Hola, disculpa que haya tardado en contestarte,

El problema de fondo es que es la primera vez que hago una base de datos y voy un poco a trancas y barrancas viendo un tutorial por aquí o haciendo unas preguntas por allá...

Todavía me cuesta bastante entender la lógica que siguen algunos procesos a la hora de hacer las consultas, y quizá, bueno, quizá no, he planteado mal mi problema...

De todo lo que has dicho me quedo con tu conclusión, voy a hacer un formulario en el que se pongan las fechas y estas que filtren el campo fecha...

Me he ido a lo complicado innecesariamente...

De todas formas agradezco mucho la ayuda que me has prestado y cada una de las explicaciones que has hecho que me han servido de mucho.

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar