Calculando edad a partir de número de identidad de las personas.

Tengo una Base de datos en Access. Una tabla CLIENTES. En la tabla CLIENTES tengo el campo CARNET IDENTIDAD (es el documento identidad de las personas) Es un número como este: 73012910442. El 73 es el año, 01 es el mes y 29 el díade nacimiento, el resto 10442 es parte del código estatal asignado a cada ciudadano. Tengo un campo donde registro este número largo del carnet de identidad. ¿Qué necesito? En la misma vista del formulario añadir un campo FECHA DE NACIMIENTO que me muestre a partir de este número de carnet de identidad: 29/01/1973 y en otro campo EDAD me muestre 51. Poner el campo no es problema, lo que no se hacer es que esos campos me muestren esa información específica a partir de ese número largo de identidad.

Respuesta
1

Access cuando se utilizan solo dos dígitos para el año, interpreta que los inferiores a 50 pertenecen al siglo 21 y los superiores al siglo 20 (así de sencillo)
Con la función DateSerial se puede componer una fecha, el primer parámetro es el año, el segundo el mes y el tercero el día (tal como aparecen en esa serie).

Para un DNI tal como 73012910442

La fecha de nacimiento se obtiene asi:

FNac = DateSerial(Mid(DNI, 1,2), Mid(DNI, 3,2), Mid(DNI, 5,2))

Obtenida la fecha de nacimiento (FNac), la edad se puede calcular asi:

Edad = Year(Date) - Year(FNac) + ((Month(Date) <= Month(FNac) And Day(Date) < Day(FNac)))

Aplico esto: Fecha de Nacimiento = DateSerial(Mid(CI, 1,2), Mid(CI, 3,2), Mid(CI, 5,2)) y Access me dice que es la expresión que ha especificado tiene una sintaxis no válida. Es posible que haya especificado un operando sin un operador.

Lo transcribo de la ventana de VBA en formato de función, se puede copiar literalmente.

Se la puede llamar (es una función) y en la ventana de VBA (si la función esta seleccionada) pulsando F5 se ejecuta.

Se parte de que el origen de datos (CARNET_IDENTIDAD ) es un dato valido y no tiene espacio/s delante (se pueden eliminar con la función TRIM).

Public Function Decodifica()
Dim CARNET_IDENTIDAD As String
CARNET_IDENTIDAD = "73012910442"
MsgBox "CARNET_IDENTIDAD " & CARNET_IDENTIDAD & vbCrLf & "Fecha de nacimiento: " & DateSerial(Mid(CARNET_IDENTIDAD, 1, 2), Mid(CARNET_IDENTIDAD, 3, 2), Mid(CARNET_IDENTIDAD, 5, 2))
End Function

Desconociendo si el dato de origen es texto o numero, me permito un apunte:

Al convertir un numero a texto (representarlo) suele añadirse un espacio al inicio (que si el numero es negativo lo ocupa el signo)
Este espacio se puede eliminar (la función TRIM o la función LTRIM)
Si existe habrá un desplazamiento, en lugar de '73' tomara ' 7' como año y La función DateSerial reportara un error.
(El mes y día pudieran ser validados aunque sean incoherentes a causa del desplazamiento)

Por favor tienes un correo al que enviarte el archivo y hacerme esto porque no doy con esto.

Lo lamento, pero no estoy de acuerdo en publicar mi correo-e (el SPAM pulula por estos lugares).

En fin, si lo necesitas en el formulario ¿Por qué no lo creas en su origen de datos?, créeme que ganaras en rendimiento.

Suponiendo que el origen de datos del formulario es la tabla CLIENTES es tan sencillo como crear una consulta nueva y tomar de la tabla los campos que necesites´, a esos se añadirán los dos campos calculados (uno para mostrar la fecha, el otro la edad.

En el formulario se utiliza la consulta (o su SQL) en lugar de la tabla y aparecerán los nuevos campos con los valores calculados.

Me basare en que el campo se denomina [CARNET IDENTIDAD] y que el separador de listas es el punto y coma (configuración regional española).

Si la configuración regional es otra, posiblemente su 'separador de listas' sea la coma simple (habrá que modificar los 'punto y coma' por la coma simple en toda la expresión).

'Para obtener la fecha de nacimiento
Nacimiento: SerieFecha(Medio([CARNET IDENTIDAD];1;2);Medio([CARNET IDENTIDAD];3;2);Medio([CARNET IDENTIDAD];5;2))
'Para obtener la edad
Edad: Año(Fecha())-Año(SerieFecha(Medio([CARNET IDENTIDAD];1;2);Medio([CARNET IDENTIDAD];3;2);Medio([CARNET IDENTIDAD];5;2)))+((Mes(Fecha()<=Medio([CARNET IDENTIDAD];3;2)) Y (Día(Fecha())<Medio([CARNET IDENTIDAD];5;2))))

Copia la línea completa y -si fuera necesario cambiar algo-, con un procesador de textos básico y su función reemplazar, se cambia el nombre del campo (o se intercambia el punto y coma por la coma simple).

Espero que esta alternativa se comporte de forma correcta y si este foro no te permite enviar la base, hay otros foros en los que la opción de publicar esta abierta (seria una alternativa).

Nota: el campo (en la tabla utilizada para la emulación) es de tipo numérico, si la original fuera de texto (del 2000 al 2009 comenzarán en cero y el cero no seria admitido) solo hay que verificar que no hay espacios vacíos al inicio (la función TRIM en una consulta de actualización resuelve el 'problema')

1 respuesta más de otro experto

Respuesta
1

Para calcular la fecha de nacimiento y la edad a partir del número del carnet de identidad en Access, puede seguir estos pasos:

1. Crear un Campo para la Fecha de Nacimiento
Abra su tabla CLIENTES en vista de diseño.
Agregue un nuevo campo llamado FECHA_DE_NACIMIENTO y establezca su tipo como Fecha/Hora.
Asegúraese de que los campos ya estén en el formulario donde quiere mostrar la fecha de nacimiento.

2. Crear un Campo para la Edad
Agregueotro campo llamado EDAD en la tabla, pero este será calculado. No necesitas almacenarlo en la tabla, ya que se puede calcular directamente en el formulario o en una consulta.
No es necesario agregarlo en la tabla, lo haremos en el formulario.

3. Calcular la Fecha de Nacimiento
Para calcular la fecha de nacimiento en el formulario, siga estos pasos:

Abra el formulario donde tiene el campo CARNET IDENTIDAD en vista de diseño.
Agregue un nuevo cuadro de texto y establece su nombre como txtFechaNacimiento.

En la propiedad Origen del Control, utilice la siguiente expresión

=DateSerial(2000 + Left([CARNET IDENTIDAD], 2), Mid([CARNET IDENTIDAD], 3, 2), Mid([CARNET IDENTIDAD], 5, 2))

Le explico:

Left([CARNET IDENTIDAD], 2): Extrae los primeros dos caracteres, que representan el año.
2000 +: Esto se usa porque el año 73 (por ejemplo, 73) se interpretaría como 1973. Sin embargo, en el caso de que el año sea del 2000 en adelante, tendría que ajustar esto. En este contexto, el carnet podría corresponder a un rango de años del 1900 al 1999, pero en un caso práctico real, debería adaptar esto según cómo maneje los años.

Si no le sirve pruebe con esta

=DateSerial(IIf(Left([CARNET IDENTIDAD], 2) > Year(Date()) Mod 100, 1900, 2000) + Left([CARNET IDENTIDAD], 2), Mid([CARNET IDENTIDAD], 3, 2), Mid([CARNET IDENTIDAD], 5, 2))

Le explico:

IIf(Left([CARNET IDENTIDAD], 2) > Year(Date()) Mod 100, 1900, 2000): Verifica si el año extraído es mayor que el año actual (en dos dígitos). Si es así, asume que el año es del siglo pasado (1900); de lo contrario, asume que es del siglo actual (2000).
4. Calcular la Edad
Para calcular la edad, puede hacer lo siguiente:

Agregue otro cuadro de texto y establezca su nombre como txtEdad.
En la propiedad Origen del Control, use la siguiente expresión:

=DateDiff("yyyy", [txtFechaNacimiento], Date()) - IIf(Format([txtFechaNacimiento], "mmdd") > Format(Date(), "mmdd"), 1, 0)

He aplicado la expresión que me envió: =DateSerial(2000 + Left([CarneIdentidad], 2), Mid([CarneIdentidad], 3, 2), Mid([CarneIdentidad], 5, 2)) He revisado que los nombres de los campos sean los correctos pero Access me responde: La expresión que ha especificado tiene una sintxis no válida. Omitió un operando o un operados, escribió un carácter o una coma no válidos, o escribió texto sin encerrarlo entre comillas.

Reemplace la , por ;

¿Por...?

Un punto y coma (;) si lo hace desde Propiedades del formulario o en la cuadricula de consulta. Si puede hágame llegar una parte de su base de datos y trato de colaborarle.

Revise su correo.

¡Muchas Gracias! usted siempre espléndido y dedicado. Mis respetos por su conocimientos en la materia y por su buen gesto. Gracias mil.

Con gusto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas