Access - Toma de datos para dni/nif/nie

 
Vista:
sin imagen de perfil

Toma de datos para dni/nif/nie

Publicado por jose maria (89 intervenciones) el 07/06/2013 14:58:51
hola, quiero hacer que mediante un cuadro de texto que toma datos alfanumericos como son el dni o nie, se hagan ciertas cosas:
1) si alguno de esos datos es un espacio que me lo diga y no deje avanzar hasta reyenar el cuadro sin espacio
2) que sepa identificar cual es el primer caracter y dependiendo cual sea que coja un valor numerico o haga otra funcion
3) que detecte los numeros sigientes al primer caracter y si no son numeros que me comunique el error
4) que detecte el ultimo caracter y dependiendo que sea haga una operacion.......
gracias
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
Imágen de perfil de Norberto
Val: 1.094
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Toma de datos para dni/nif/nie

Publicado por Norberto (753 intervenciones) el 11/06/2013 14:59:28
Hola.

No explicas mucho. De todas formas te diré que puedes usar el evento Al bajar tecla para detectar las pulsaciones y las propiedades SelStart y SelLength del cuadro de texto para saber en qué posición del mismo se encuentra el cursor y si hay o no caracteres seleccionados. Yo lo combinaría con una buena máscara de entrada. Te ahorrará muchos quebraderos de cabeza.

>A0000000L permite letra o número en la primera posición, letra en la última y dígitos en el resto. Si tecleas una minúscula la pasa a mayúsculas. Combínalo con ver si la primera pulsación es dígito o una de las posibles letras válidas en los NIE (al principio eran X pero me consta que existen con Y, al menos). En el evento antes de actualizar puedes hacer que se haga el cálculo de la letra del DNI/NIF/NIE y comparar con el último caracter a ver si coincide.

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
sin imagen de perfil

Toma de datos para dni/nif/nie

Publicado por jose maria (89 intervenciones) el 12/06/2013 09:21:04
bueno, perdon por mis explicaciones y gracias por tus comentarios, lo que me comentas son cosas que desconozco y no sabria trabajar con ellas, si me puedes explicar mas.....
de todas formas te comento mas:
como digo, tengo un campo de texto que va a recojer el dato de dni o nie con una extension de 9 caracteres maximo.
mirando en google, veo que por ejemplo, los nie empiezan por x,y,z, pues si al iniciar la introduccion de los datos empiezo por algun otro caracter que no sea un numero o esas tres letras que no me deje continuar y me advierta del error, osea, por error si voy a introducir el dni y empiezo dando a la barra espaciadora que lo "chive" y lo corrija.....
por esta misma premisa, segun la informacion de google, si es nie, las letras x,y,z tienen cada una un valor, asi que este campo de texto devera tener la capacidad una vez introducida la informacion de asignar un valor a este primer caracter.....
si fuera un dni devera darse cuenta de los numeros para tramitar ese calculo del digito control y verificar que la ultima letra o caracter es el correcto......bueno, espero que esta vez lo haya explicao mejor
chao y gracias
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
Imágen de perfil de Norberto
Val: 1.094
Oro
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Toma de datos para dni/nif/nie

Publicado por Norberto (753 intervenciones) el 12/06/2013 13:27:09
Hola de nuevo.

Yo empezaría por la máscara de entrada. Abre la tabla en modo de edición y en el campo DNI busca en la parte de abajo la propiedad máscara de entrada y pon >A0000000L. Esto nos quita el 90% del problema ya que directamente Access impedirá que se introduzcan caracteres no válidos (incluidos espacios) en el campo. Si no estás familiarizado con las máscaras de entrada te comento:

El signo > hace que todo lo que se teclee a continuación se pase a mayúsculas.
La A permite letra o número pero no signos de puntuación ni espacios
El 0 permite sólo números, sin espacios ni otros signos.
La L permite sólo letra.

Lo único que nos queda por comprobar es si el primer carácter tecleado es un número o una de las tres (de momento) letras válidas. Y eso lo haremos mediante código.

En el evento Al presionar tecla del cuadro de texto pones:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub DNINIE_KeyPress(KeyAscii As Integer)
    Const CarValidos = "0123456789XYZ"
    Dim Letra As String * 1
 
    'Si estamos en la primera posición y se pulsa una tecla de carácter
    If Me.DNINIE.SelStart = 0 And KeyAscii > 31 Then
        'Si no es uno de los caracteres válidos
        If InStr(1, CarValidos, Chr(KeyAscii)) = 0 Then
            'Anulamos la pulsación
            KeyAscii = 0
            'Aquí se puede poner algún tipo de mensaje
        End If
            'Si es la última posición
    ElseIf Me.DNINIE.SelStart = 8 And KeyAscii > 31 Then
        'Calculamos la letra por medio de una función
        Letra = CálculoLetra(Left(Me.DNINIE.Text, 8))
        'Si la letra no coincide con la que hemos pulsado
        If Letra <> UCase(Chr(KeyAscii)) Then
            'Anulamos la pulsación
            KeyAscii = 0
        End If
    End If
 
End Sub



Debajo de este código defines la función

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Function CálculoLetra(DNI As String) As String
    Dim nDNI As Long
    'Estas son las letras que corresponden a los 23 restos
    Const Letras = "TRWAGMYFPDXBNJZSQVHLCKE"
 
    DNI = Left(DNI, 8) 'Nos quedamos con los primeros 8 caracteres
 
    nDNI = Val(DNI) 'Asignamos el valor numérico
    'Si es 0 es que empieza por letra
    If nDNI = 0 Then
        'Asignamos el valor numérico desde el segundo carácter más
        'el valor de la letra
        nDNI = Val(Mid(DNI, 2)) + (Asc(Left(DNI, 1)) - 88) * 10000000#
    End If
    'Devolvemos la letra correspondiente al resto del valor del DNI
    'al dividirlo entre 23
    CálculoLetra = Mid(Letras, (nDNI Mod 23) + 1, 1)
 
End Function


Y creo que eso es todo.

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
sin imagen de perfil

Toma de datos para dni/nif/nie

Publicado por jose maria (89 intervenciones) el 17/06/2013 11:16:00
perdon por la tardanza......
en primer lugar muchisimas gracias
segundo, funciona, en partes......
el primer tramo cierto que solo me permite introducir una de las tres letras x,y,z, y si se empieza por numero me admite los 8 digitos, luego en el digito de control anula todas las demas letras menos la correspondiente, entonces hasta ahy perfecto....
el fallo ( a miparecer) esta en que despues del primer caracter (osea 2,3,4,5,6,7,8) me permite meter cualquier cosa, letras, espacios......
¿que se puede hacer para corregir esto?
gracias
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

Toma de datos para dni/nif/nie

Publicado por RicardoG (1 intervención) el 19/06/2013 20:44:02
Gracias Norberto, funciona genial en mi base de datos
José María, creo que tu fallo es que no tienes bien definida la máscara de entrada, que tiene que ser >A0000000>L, tal y como te indicaba Norberto en el mensaje anterior
Salu2
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

Toma de datos para dni/nif/nie

Publicado por jose maria (89 intervenciones) el 20/06/2013 10:22:42
bueno, ya vi lo que estaba fallando, yo he puesto la mascara en las propiedades del cuadro de texto que recoje el dato, y no en la tabla donde se vuelca, ahy si que me hace efecto y funciona genial......
gracias
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

Toma de datos para dni/nif/nie

Publicado por Juan J. (1 intervención) el 13/12/2013 13:15:55
No se exactamente donde se introduce este codigo
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