Usar modulo que calcula dígitos de control en consulta
Tengo un modulo que me permite calcular dígitos o letras de control ( por ejemplo DNI, Cuentas bancarias, ... ) y quiero utilizarlo en una consulta. Por ejemplo tengo una tabla con un campo NUMERODNI ( Numero DNI sin Letra ), quiero obtener una consulta con los Campos "NUMERODNI" y "LETRADNI" ( calculado con el Modulo ) La función se llama "letra_dni"
Pues si tienes la Función Letra_dni, ¿supongo qué el parámetro que le pasas es el numero del dni y te devuelve la letra no?, pues entonces pones en la consulta: Letra_dni(numerodni) y ya lo tendrás.
Perfecto. Ahora tengo un pequeño problema adicional y desde luego más complejo. En el modulo tengo una función que calcula el dígito de control de una cuenta bancaria y se llama "dcbank2", su código es el siguiente: Function dcbank2(serie) Const PESOS = "06030709100508040201" Dim l As Long, i As Integer, s As String For i = 1 To Len(serie) l = l + (Mid(serie, Len(serie) - i + 1, 1) * Mid(PESOS, ((i - 1) * 2) + 1, 2)) Next Select Case 11 - (l Mod 11) Case 11 dcbank2 = 0 Case 10 dcbank2 = 1 Case Else dcbank2 = 11 - (l Mod 11) End Select End Function Como es posible que conozcas, se calcula empleando el modulo 11 y con el siguiente criterio : La suma de los productos obtenidos de multiplicar las cifras de las informaciones a verificar por sus correspondientes pesos (6,3,7,9,10,5,8,4,2,1), se divide por 11. La diferencia entre el resto obtenido de la división y 11 será el dígito de control. Si el dígito de control resultante fuera 10, se aplicara en su lugar el dígito 1, y si fuera 11, el 0. Mi problema es el siguiente : Tengo que calcular otro dígito de control, en este caso sobre un numero de 11 dígitos, en vez de sobre 10 como el de cuenta bancaria, usando el modulo 11, con la siguiente particularidad : Los pesos son : 4,3,2,9,8,6,7,5,4,3 y 2. Cada uno de los dígitos se multiplicaran por su peso correspondiente. La suma de todos los productos se dividirá por 11. Si el resto de esta división es 10, el dígito de control será "0", en caso contrario, será el resto de la misma. Ya que me gusta investigar copiando y pegando, en plan "chapuza" adapté el código anterior y cree una nueva variable dcrefdom Function dcrefdom(serie) Const PESOS = "0403020908070605040302" Dim l As Long, i As Integer, s As String For i = 1 To Len(serie) l = l + (Mid(serie, Len(serie) - i + 1, 1) * Mid(PESOS, ((i - 1) * 2) + 1, 2)) Next Select Case l Mod 11 Case 11 dcrefdom = 0 Case 10 dcrefdom = 1 Case Else dcrefdom = l Mod 11 End Select End Function Debo de tener algo mal ( lo raro sería que estuviese bien ), ya que si hago los cálculos con excel me salen otros dígitos. Bueno, no sé si me estará "pasando" con mi consulta y esta ampliación tal vez sea pedir demasiado. En cualquier caso muchas gracias. marca54
No se donde puede estar el fallo, pero ni merece la pena averiguarlo. Al ser una rutina standard del calculo de control seguro que tienes por internet 1000 ejemplos con código que funcionan a la maravilla. Lo único que se me ocurre es que la corras paso a paso o pongas msgbox con los campos para ver si lo que sale es correcto. En cualquier caso deberías haber finalizado la anterior y preguntar esta nueva.