Campos calculados en una tabla de access

Feliz semana santa.

Podéis explicarme si se puede, ¿añadir una función para cada campo en una tabla de access?

OS cuento, estoy intentando hacer un formulario que calcule los valores que debemos cobrar cada trabajador en cada clave de su nómina.

Hay una clave por ejemplo, que se llama antigüedad en la que yo tendría que poner una función que calcule el importe de esa clave, por los años que lleva en la empresa.

Otra por ejemplo qué es clave sueldo, que dependerá de las horas que haga el trabajador. Entonces pensaba poner arriba 3 cuadros de texto en los que incluir días trabajados, horas y años en la empresa, y depende de los valores que ponga el trabajador se le calcule cada clave de la nómina... No sé si me he explicado

Por ejemplo en el campo sueldo podría poner =([importexdiasueldo]x[horas]) 

Alomejor no me he explicado bien, o ahora estoy pensado que igual es mejor hacer cada fórmula con un botón y la función en vba...

1 Respuesta

Respuesta
2

Veamos...

1º/ Directamente en la tabla, en un campo de tipo "calculado", no puedes usar funciones personalizadas (las que creas en VBA), sino que solo admite funciones nativas de Access y no todas ellas, sino un grupo reducido de ellas. Por tanto si eres capaz de crear una expresión con las funciones disponibles que te haga el cálculo que quieres, puedes tener tantos campos calculados como necesites.

Por ejemplo: sí podrías tener un campo calculado "sueldo" con la expresión: =[importexdiasueldo]x[horas] que te multiplique esos dos campos "importexdiasueldo" y "horas", pero no podrías, por ejemplo calcular la antigüedad del trabajador a partir de la fecha de ingreso, porque no puedes usar la función Fecha() ni DifFecha() en un campo calculado de una tabla.

2º/ En un formulario, además de funciones personalizadas, puedes usar todas las funciones incorporadas de Access, asi que ahí sí podrías calcular fácilmente la antigüedad con: =DifFecha("aaaa",[FechaIngreso];Fecha())

Ahora bien, si en el formulario usas expresiones directamente en los cuadros de texto, éstos solo mostrarán el valor en el formulario, no los guardarán en los campos correspondientes de las tabla.

3º/ En mi opinión, la mejor solución, y más "profesional", sería que hagas las fórmulas para los cálculos en VBA (declarándolas como Public Function...), y luego las apliques también por VBA, ya sea por medio de un botón, al actualizar un campo...

Si necesitas alguna aclaración más, no dudes en pedirla, porque mi respuesta en un tanto "teórica".

Un saludo.


Muchas, ya me has aclarado lo que necesitaba. Eso haré, buscaré info para hacerlo todo vía vba. ¿Sabes de algún link que me explique cómo hacer las fórmulas en vba? ¿O algún experto que tengáis ejemplos?

Gracias!

Te recomiendo el manual de Neckkito (http://neckkito.xyz/nck/index.php/manuales/47-curso-vba) sobre todo el capítulo 2. También el curso de Eduardo Olaz (http://www.mvp-access.es/buho/curso.htm), en concreto el capítulo 4. y por último, yo también tengo un curso de Access gratuito aquí (http://nksvaccessolutions.com/academy/), y aunque ponga que la academia está cerrada, el curso sigue estando disponible una vez te registres.

De cualquier forma, crear una función personalizada es muy sencillo, solo tienes que escribirla en un módulo siguiendo este esquema:

Public/Private Function nombreFuncion(argumentos) As TipoSalida

'por aquí irían los cálculos

End Function

El Public/Private se refiere al ámbito de la función, si es private solo será accesible desde el módulo en que la escribas, si es Public, desde todo Access (consultas, formularios, módulos, informes...). Solo has de indicar uno.

NombreFuncion pues es cómo la quieres llamar

Argumentos serían los valores que le pasas a la función

TipoSalida sería el tipo de datos que devuelve: texto, Entero, Doble, Moneda, Fecha...

Por ejemplo, para calcular la antigüedad de un trabajador, podrías hacerlo:

Public Function fncAntiguedad(elTrabajador as Integer) as Integer
  Dim FIngreso as Date
  FIngreso=DLookup("FechaIngreso","TEmpleados","IDEmpleado=" & elTrabajador)
  fncAntiguedad=DateDiff("yyyy",FIngreso,Date)
End Function

En este caso, se le pasa como argumento el ID del trabajador y la función busca en la tabla la fecha de ingreso y calcula su antigüedad por diferencia con la fecha actual, y devuevle un número entero

También podrías hacerlo así:

Public Function fncAntiguedad(laFechaIngreso as Date) as Integer
  fncAntiguedad=DateDiff("yyyy",laFechaIngreso ,Date)
End Function

En este caso, le pasas como argumento directamente la fecha de ingreso y te devuelve la antigüedad que tenga a día de hoy

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas