Formularios con condiciones que lanzan informes

Recurro a vosotros para que me echéis una mano que estoy boqueada

Resulta que tengo una tabla con fechas de bajas, altas, próxima revisiones. He creado una consulta que está asociada a un formulario que se llama formulariosvarios

El formulario tiene con dos cuadros combinados a los que les he dado yo los valores: uno escojo el mes y otro donde escojo el año para que me lance un informe donde me diga que personas han estado de baja y cuales han sido de dadas de alta durante el mes y el año que le he indicado

Pues bien... Si pruebo la consulta me pide los parámetros y si le escribo el mes (en letra) y el año no me filtra. Pero si le indico el mes en número (1, 2, 3...) me filtra sin problemas.

Al probarlo con el formulario no me filtra tanto si el cuadro combinado tiene valores de ls meses en número o en letra

Otra duda que tengo es la siguiente:

En el informe necesito que me diga cuantos días ha estado de baja una persona en el mes que yo escoja. Se trata de contabilizar el absentismo laboral de bajas por meses

-Baja 20 de marzo: a fecha 30 de abril llevará 30 días de baja ese mes

- Baja a 15 de abril a fecha 30 de abril llevara 15 días de baja ese mes.

- Baja 2 de abril y alta 5 de abril: se que esa persona ha estado 3 días de baja en el mes de abril

¿Me podéis echar una mano?

1 respuesta

Respuesta
1

En cuanto a la primera parte:

Si pones, en general, Mes(Fecha), el valor que te devuelve será (a día de hoy), 4, porque estamos en Abril y es el mes 4. Por eso si en el criterio pones "abril", no te va a devolver nada, porque 4 <>"Abril" (aunque abril sea el mes 4).

Si quieres usar el nombre de los meses para filtrar, has de usar una función a mayores: NombreMes(), que como supondrás devuelve el nombre del mes que le pasas como parámetro.

Es decir, en tu caso, el campo calculado que usas para filtrar sería:

NombreMes(Mes(Alta)) y ahí si le puedes indicar como parámetro enero, febrero... pero ya no podrás ponerle 4, o 12...

Has de tener en cuenta que el valor del campo ha de coincidir con el valor que devuelve el combinado: si el combinado devuelve el nombre del mes, has de construir el campo para que sea el nombre lo que muestra (o contenga), si el combinado devuelve un número, está bien como lo tienes.

En mi opinión, y para enlazar con la segunda cuestión, lo ideal sería que la consulta la dejes así (trabajando con el número del mes) y el cuadro combinado lo hagas sobre una tabla auxiliar que tenga, por un lado un campo clave con los números de mes (1 a 12) y otro campo con los nombres. El combinado trabajará con el número de mes y mostrará el nombre. Esto tiene una ventaja adicional: puedes mostrar los meses ordenados (enero, febrero...).

En cuanto a cómo contar los días, aunque hay varias opciones, yo construiría una función VBA, que además podrías usar en formularios y consultas, algo así (escribo de cabeza, sin poder probarla):

Public Function fncDiasMesBaja(elMes as Integer, ElAno As Long, FBaja as Variant, FAlta as Variant) As Integer
If IsNull(FBaja) Then  ?Si no hay fecha de baja, es que no está de baja...
   fncDiasMesBaja=0
Else  'Si hay una fecha de baja, hay que ver si está de alta o no
   If IsNull(FAlta) Then  'Si no hay fecha de alta
      If Format(FBaja,"mmyyyy")=elMes & elAno Then  'Si la fecha de baja es del mismo mes seleccionado, se calcula por diferencia
         fncDiasMesBaja=DateSerial(elAno,IIF(elMes=12,1,elMes+1),0)-FBaja  'Si ves que te sale un día de menos, ponle un +1 a esta fórmula
      Else 'Si la fecha de baja es anterior, todo el mes de baja:
         fncDiasMesBaja=DateSerial(elAno,IIF(elMes=12,1,elMes+1),0)-DateSerial(elAno,elMes,1)+1
      End If
   Else 'Si hay fecha de alta
      If Format(FBaja,"mmyyyy")=elMes & elAno Then  'Si la fecha de baja es del mismo mes seleccionado, se calcula por diferencia entre ambas fechas
         fncDiasMesBaja=FAlta-FBaja    'Si ves que te sale un día de menos, ponle un +1 a esta fórmula
      Else
         fncDiasMesBaja=FAlta-DateSerial(elAno,elMes,1)+1
      End If
   End If
End If
End Function

Y la usarías como cualquier otra función de Access, pasándole como argumentos los 4 datos: mes,año,fecha baja y fecha alta

Muchísimas gracias.

La primera parte GENIAL problema solucionado ¡Eres un crack! Algo tan sencillo y me ha vuelto loca.. no hay nada como saber.

La segunda parte me da problemas. La función que me indicas la he asociado a la consulta pero cuando le doy me pide el mes, el año, la fecha de baja y la fecha de alta y me sale este mensaje

Si lo hago con el formulario, escojo un mes y un año en los cuadros combinados también me pide los 4 parámetos y finalmente me sale el mensaje de arriba.

Lo que voy buscando es que si en el formulario que tengo hsolicito el mes de enero y el año 2020 me muestre en el informe aquellos registros que estén de baja o hayan sido dados de altas durante ese mes y me contabilice los días de ese mes

No se si es lo que me has enviado pero es que no soy capaz

Gracias

Te he preparado un ejemplo, y corregido un par de cosillas en la función que te había propuesto, ahora que la he testeado: http://www.filebig.net/files/d4g8wbEfyJ

Un par de comentarios:

1º/ Fíjate en el diseño de la consulta (da igual cual), en los criterios, creo que deberías añadir también como parte del filtro el mes de la fecha de baja para que no te salgan "cosas raras". Haz la prueba con el mes de marzo, por ejemplo, con y sin el tercer criterio (el de Mes(FBaja))

2º/ En la Consulta1 creo un campo calculado con la función. Y aunque ya no lo hice, porque no entraña ninguna dificultad, al hacer el informe sobre esa consulta, ya te da los días de baja.

3º/ En la Consulta2, he "simulado" la que tu tienes, sobre esa consulta creo el informe, y en él le añado un cuadro de texto independiente con su origen de control la función, y verás que de nuevo, calcula los días de baja del mes seleccionado.

4º/ La función la puedes copiar "tal cual" está porque no hace referencia a ningún campo ni tabla ni formulario de la BD, tan solo has de pasarle los 4 argumentos como en el ejemplo (en tu caso usarás los nombres de tus cuadros combinados y campos)

5º/ Y esta no tiene que ver con el ejemplo..., me he fijado en tu pantallazo del diseño de la consulta que para el año de la fecha de alta usas como criterio un cuadro combinado llamado "AñoBaja"...

Cualquier duda sobre la aplicación de la función, me comentas.

Hola

Muchísimas gracias ¡Menuda tareas me has facilitado!. Tu base genial pero cuando lo traspaso a la mía no sé que naries hago que me sigue pidiendo parámetros de todos los campos que forman parte de ela consulta cuando le doy al botón de enviar informe.

Ay no sé... llevo toda la mañana con el tema dándole vueltas y es imposible. He copia mil veces tu consulta, informe y formulario y solo he cambiado los nombre de los campos y... nada...

¿Puede ser que mi consulta coge los datos de dos tablas? Es decir en una tabla tengo los datos personales (nombre y apellidos) y en la otra la baja y alta...

Otra cosa que se me ocurre es que el nombre de las tablas tiene espacios ¿puede ser?

Seguiré dándole vueltas

Un saludo

Que la consulta tome datos de 2 tablas no creo que tenga que ver.

Si los nombres de tablas, campos... tienen espacios, en VBA y en Sqls debes ponerlos entre corchetes.

¡¡¡¡Sveinbjorn!!!! lo acabo de conseguir.... no sé ni como.. bueno si en la consulta no sé porque me pone expr: en los campos y lo he eliminado

Mil gracias... sin tu ayuda no habría podido hacerlo

Un saludo y ánimo que nos queda un día menos de confinamiento

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas