miércoles, 14 de agosto de 2019

Consulta en Microsoft Access que convierte los Números a Letras

Crear nuestras propias funciones en Access nos es de mucha utilidad, nos evita generar código extra en nuestros programas.

Aquí les comparto una función propia para traducir los números a su equivalente en letras.

Supongamos que tenemos una tabla como esta:


Tenemos un campo de tipo CURRENCY por tanto es numérico, y queremos llevar este campo a letras.

Para esto nos vamos a Herramientas de Base de Datos y le datos al icono de Visual Basic, y nos abrirá la ventana de Visual Basic para Aplicaciones



Sobre la ventana de la izquierda, de Proyecto, damos clic derecho para ver el menú y agregamos un nuevo módulo



En la ventana que se abre, verán una sola línea con el texto

Option Compare Database

Esa línea la dejan tal cual aparece y por debajo de ella insertan el siguiente código:

Function CantidadEnLetra(tyCantidad As Currency) As String
Dim lyCantidad As Currency, lyCentavos As Currency, lnDigito As Byte
Dim lnPrimerDigito As Byte, lnSegundoDigito As Byte, lnTercerDigito As Byte
Dim lcBloque As String, lnNumeroBloques As Byte, lnBloqueCero

tyCantidad = Round(tyCantidad, 2)
lyCantidad = Int(tyCantidad)
lyCentavos = (tyCantidad - lyCantidad) * 100

laUnidades = Array("UN", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE", "DIEZ", "ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIESISEIS", "DIESISIETE", "DIESIOCHO", "DIESINUEVE", "VEINTE", "VEINTIUN", "VEINTIDOS", "VEINTITRES", "VEINTICUATRO", "VEINTICINCO", "VEINTISEIS", "VEINTISIETE", "VEINTIOCHO", "VEINTINUEVE")
laDecenas = Array("DIEZ", "VEINTE", "TREINTA", "CUARENTA", "CINCUENTA", "SESENTA", "SETENTA", "OCHENTA", "NOVENTA")
laCentenas = Array("CIENTO", "DOSCIENTOS", "TRESCIENTOS", "CUATROCIENTOS", "QUINIENTOS", "SEISCIENTOS", "SETECIENTOS", "OCHOCIENTOS", "NOVECIENTOS")
lnNumeroBloques = 1

 Do
        lnPrimerDigito = 0
        lnSegundoDigito = 0
        lnTercerDigito = 0
        lcBloque = ""
        lnBloqueCero = 0
        For i = 1 To 3
                lnDigito = lyCantidad Mod 10
                If lnDigito <> 0 Then
                        Select Case i
                        Case 1
                                lcBloque = " " & laUnidades(lnDigito - 1)
                                lnPrimerDigito = lnDigito
                        Case 2
                                If lnDigito <= 2 Then
                                        lcBloque = " " & laUnidades((lnDigito * 10) + lnPrimerDigito - 1)
                                Else
                                        lcBloque = " " & laDecenas(lnDigito - 1) & IIf(lnPrimerDigito <> 0, " Y", Null) & lcBloque
                                End If
                                lnSegundoDigito = lnDigito
                        Case 3
                                lcBloque = " " & IIf(lnDigito = 1 And lnPrimerDigito = 0 And lnSegundoDigito = 0, "CIEN", laCentenas(lnDigito - 1)) & lcBloque
                                lnTercerDigito = lnDigito
                        End Select
                Else
                        lnBloqueCero = lnBloqueCero + 1
                End If
                lyCantidad = Int(lyCantidad / 10)
                If lyCantidad = 0 Then
                        Exit For
                End If
        Next i
        Select Case lnNumeroBloques
        Case 1
                CantidadEnLetra = lcBloque
        Case 2
                CantidadEnLetra = lcBloque & IIf(lnBloqueCero = 3, Null, " MIL") & CantidadEnLetra
        Case 3
                CantidadEnLetra = lcBloque & IIf(lnPrimerDigito = 1 And lnSegundoDigito = 0 And lnTercerDigito = 0, " MILLON", " MILLONES") & CantidadEnLetra
        End Select
        lnNumeroBloques = lnNumeroBloques + 1
 Loop Until lyCantidad = 0

 CantidadEnLetra = " " & CantidadEnLetra & IIf(tyCantidad > 1, " PESOS ", " PESO ") & Format(Str(lyCentavos), "00") & "/100 M.N. "

End Function


Y guardan el módulo


Yo lo estoy guardando con el nombre de NumEnLetra

Ahora, desde la ventana de la base de datos, le damos Crear una nueva Consulta en Diseño de Consulta


Y agregamos la tabla donde están nuestros datos



Una vez añadidos los campos que nos interesa, incluso filtros que deseen, vamos a añadir nuestra función que recién creamos. Para esto utilizaremos el Asistente de Consultas


En la ventana que se abre, expandimos los Elementos de Expresión y buscamos el módulo que creamos


Al darle clic, nos mostrará la función que copiamos, y al darle doble clic, nos copiará la función en la ventana de Expresiones


Si observamos, vemos que nos pide un parámetro, que es el valor numérico que deseamos pasar a Letras. Así que ahora en los elementos de expresión, buscamos la tabla con la que estamos trabajando y agregaremos como parámetro para la función en campo CURRENCY que nos interesa.


Y, teniendo seleccionado el parámetro en la función, le damos doble clic al campo SALARIO y lo va a insertar como parámetro



Y listo, le damos ACEPTAR.


Vemos el campo que insertó, con el alias de Expr1, así que sería buen momento para cambiarlo


Listo!  Ahora solo ejecutamos la consulta



Y tenemos ya los números en Letras


Saludos!







Translate