Mostrando las entradas con la etiqueta access. Mostrar todas las entradas
Mostrando las entradas con la etiqueta access. Mostrar todas las entradas

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!







sábado, 14 de julio de 2012

ROWNUM en MS ACCESS

Buscando cómo obtener en ACCESS el número de registro que estoy obteniendo en una consulta por SQL, no encontré ninguna función que me lo dé. El concepto de ROWNUM es creo solo para ORACLE, pero para MS ACCESS debería de haber algo similar ... no lo encontré.

Pero por SQL lo puedo obtener. Suponiendo que tengo la siguiente tabla:




Y deseamos obtener el Id del empleado, nombre, apellido y dirección, de todos los empleados de USA, pero queremos que vayan numerados.











Para esto utilizamos la siguiente sentencia SQL:


SELECT   a.employeeid,
         a.firstname,
         a.lastname,
         a.address,
         (SELECT   COUNT ( * ) + 1
            FROM   employees b
           WHERE   b.country = 'USA' AND b.employeeid < a.employeeid) as ROWID
  FROM   employees a
 WHERE   a.country = 'USA'



Revisen también esta posibilidad de hacerlo:  ROWNUM en ACCESS


Translate